Commit Graph
48 Commits
Author SHA1 Message Date
DenozordecandCursor 0682dd0e2f fix(web): не отправлять Content-Type на DELETE без тела
Docker / build (push) Failing after 21s
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-29 15:32:18 +07:00
DenozordecandCursor 60332db1e4 fix(web): конвертировать тарифы VPS в базовую валюту настроек
Docker / build (push) Failing after 21s
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-29 15:19:22 +07:00
DenozordecandCursor 9a29d88b95 feat(api, web): интеграция RuVDS API v2
Docker / build (push) Failing after 21s
Синк VPS, баланса, платежей и тарифов через Bearer-токен из личного кабинета.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-29 14:10:15 +07:00
DenozordecandCursor 5983c911f2 fix(veesp): IP и характеристики VPS при синке, валюта аккаунта
Docker / build (push) Failing after 21s
Парсинг object-map ответов API (vms/ips), cpus, memory в МБ, IP-массив.
Приоритет валюты аккаунта над baseCurrency хостера; поле в UI для Veesp.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-29 11:50:25 +07:00
DenozordecandCursor 87aa6949b3 fix(userapi): период тарифа Macloud и отображение ставки на списке VPS
Docker / build (push) Failing after 1m45s
Месячные планы Macloud определяются через inferPlanPeriod; в UI показывается суточная или месячная ставка по tariffType, а не месячный эквивалент.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-29 11:21:44 +07:00
DenozordecandCursor 579c00392d feat(api, web): интеграция Veesp client area API
Docker / build (push) Has been cancelled
Добавлен отдельный модуль veesp для синка VPS, баланса, счетов и тарифов через JWT/Basic auth.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-29 10:25:12 +07:00
DenozordecandCursor 031fc3aaa0 fix(userapi): валюта и ставки Macloud/VDSina при синке
Docker / build (push) Has been cancelled
Валюта VPS берётся из baseCurrency хостера, ставки — из тарифных планов с fallback и parsePlanCost. На списке VPS цены в валюте провайдера. Расширен parseTariffPrice для форматов UserAPI. Добавлены фильтры на странице тарифов.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-29 02:48:04 +07:00
DenozordecandCursor 87ab13e9f6 fix(accounts): учитывать baseCurrency хостера при отображении и синке баланса
Docker / build (push) Has been cancelled
API не всегда возвращает валюту (VDSina UserAPI); раньше подставлялся RUB вместо USD из настроек провайдера.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-29 02:18:40 +07:00
DenozordecandCursor f2c4c7a412 feat(api, web): интеграция Macloud и VDSina через унифицированный UserAPI
Docker / build (push) Has been cancelled
Один модуль userapi для идентичного API обоих хостеров: синк VPS, баланса, тарифов и пополнений.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-29 02:02:03 +07:00
DenozordecandCursor 9be50aa03b feat(api, web): интеграция хостера 4VPS.SU — синк VPS, баланса и тарифов
Docker / build (push) Has been cancelled
Добавлен адаптер 4vps, обобщён pipeline синхронизации через ProviderAdapter и обновлён UI для Panel ID и API Key.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-29 01:13:50 +07:00
DenozordecandCursor 05e7bf829e feat(api, web): тест Telegram из формы, подсказки ошибок API и UX настроек
Docker / build (push) Has been cancelled
Тест отправки использует значения формы без предварительного сохранения; пустой токен при сохранении не затирает сохранённый. Добавлены подсказки по частым ошибкам Telegram API и колонка ошибок в журнале уведомлений.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-29 00:54:51 +07:00
DenozordecandCursor 7f91bc3624 feat(api, web): добавить поддержку уведомлений и журнал уведомлений
Docker / build (push) Has been cancelled
Добавлены новые функции для отправки уведомлений через Telegram и webhook, включая настройки для интервалов уведомлений и проверки uptime. Реализован журнал уведомлений для отслеживания статуса отправленных сообщений. Обновлены схемы и интерфейсы для поддержки новых полей и функционала.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-29 00:36:05 +07:00
DenozordecandCursor 2c66d0c0ee fix(dashboard): унифицировать расчёт проблем инвентаря между API и UI
Docker / build (push) Has been cancelled
Счётчик issuesCount и таблица «Проблемы» теперь используют общую логику в @cfdm/shared; добавлены категории «истекает 7 дн» и «низкий баланс».

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-29 00:24:49 +07:00
DenozordecandCursor 31a4798d78 fix(web): привести UI к правилам ReUI — фильтры, badge, токены
Docker / build (push) Has been cancelled
Подключены DateSelector и number-field в VPS-фильтры, semantic StatusBadge, --focus токены и переименование DataGridColumn.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-28 23:37:30 +07:00
DenozordecandCursor f3dbd85523 chore(rules): добавить ReUI workflow для ИИ и обновить правила frontend
Docker / build (push) Has been cancelled
Зафиксированы registry @reui, MCP-ветка, размещение компонентов и матрица выбора shadcn vs ReUI.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-28 22:28:56 +07:00
DenozordecandCursor baa13260c6 feat(web, db): autocomplete проекта VPS, защита полей при синке и стиль Command
Docker / build (push) Has been cancelled
Проект выбирается из справочника; ручные правки автоматически попадают в userOverrides без сброса при сохранении. CommandDialog приведён к эталону shadcn/ReUI.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-28 22:22:21 +07:00
DenozordecandCursor 246ad1738a fix(web): унифицировать таблицу VPS и перенести колонки в popover «Вид»
Docker / build (push) Has been cancelled
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-28 22:07:29 +07:00
DenozordecandCursor 18072fdeea feat(web): добавить ReUI color picker в форму проекта
Docker / build (push) Has been cancelled
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-28 20:04:56 +07:00
DenozordecandCursor f1fbd637a7 feat(web): добавить KPI-карточки на страницы платежей, баланса и продлений
Docker / build (push) Has been cancelled
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-28 19:47:16 +07:00
DenozordecandCursor 5a3241a7d1 feat(vps): визуальный редактор кастомных полей и колонки в таблице
Docker / build (push) Has been cancelled
Заменён JSON-редактор в настройках на UI с drag-reorder, добавлены динамические колонки VPS с picker видимости и типизированные контракты в @cfdm/shared.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-28 19:28:32 +07:00
DenozordecandCursor 2e1ca9f2a7 feat(web): компактные KPI-карточки и унификация фильтров таблиц
Docker / build (push) Has been cancelled
Сделать метрики плотнее и информативнее, вынести общий toolbar фильтров с chips и счётчиком результатов, улучшить читаемость DataGrid через dense и зебру.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-28 18:40:26 +07:00
DenozordecandCursor c80090ed08 feat(accounts): доработать управление аккаунтами хостеров
Docker / build (push) Has been cancelled
Добавить apiLogin из credentials, сводку и health-индикаторы на /accounts, фильтры, раздельную форму логина и пароля, безопасное удаление с 409 и тесты API/repository.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-28 16:53:51 +07:00
DenozordecandCursor 11b67a1cef feat: расширить инвентарь, ops и интеграции по roadmap
Docker / build (push) Has been cancelled
Добавлены bulk-операции VPS, карточка /vps/:id, CRUD проектов, Command Palette,
календарь продлений, webhooks, uptime-проверки, audit log, кастомные поля и адаптеры провайдеров.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-28 15:28:35 +07:00
DenozordecandCursor 0ea92746e4 refactor(web): унифицировать UI по паттернам ReUI на всех 12 страницах
Docker / build (push) Has been cancelled
Ввести CrudListPage, AnalyticsPage, RowActions и domain edit sheets с FormSheetRhf; убрать устаревшие TableCard/DataTableCard.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-28 13:16:00 +07:00
DenozordecandCursor dc0650b61e fix(web): вкладки дашборда по паттерну REUI Tabs
Docker / build (push) Has been cancelled
Line tabs с нижней границей, REUI Badge для счётчиков; исправлен URL registry @reui в components.json.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-28 01:34:51 +07:00
DenozordecandCursor 5d83b1a95d fix(web): фильтры VPS, вкладки дашборда и здоровье инвентаря
Docker / build (push) Has been cancelled
Фильтры стран и городов показывают только значения из БД; отключено автозаполнение поиска. Вкладки дашборда приведены к line tabs по REUI. VPS без проекта больше не считается проблемой.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-28 01:15:57 +07:00
DenozordecandCursor 921feb926f fix(sync): загрузка тарифов при обычной синхронизации аккаунтов
Docker / build (push) Has been cancelled
Обычный синк больше не пропускает тарифы; добавлены кнопки «Синхронизировать все» и «Загрузить тарифы», исправлен dropdown на странице аккаунтов.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-28 00:45:52 +07:00
DenozordecandCursor 1e291b3759 feat(web): доработка UX/UI — дашборд, навигация и data foundation
Docker / build (push) Has been cancelled
Добавлены syncLog в snapshot, API статистики дашборда и маппинг цен тарифов; переработаны shell, главная страница, empty states и новые экраны журнала синка и проектов.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-28 00:27:09 +07:00
DenozordecandCursor 836c8a2936 feat(web): связка страны и города в форме VPS
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-27 02:18:18 +07:00
DenozordecandCursor a954591493 feat(web): ReUI Autocomplete для страны/города и вертикальная раскладка локации
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-27 02:11:45 +07:00
DenozordecandCursor f681f72e8c fix(web): флаги стран, FormDatePicker и плоские таблицы без двойной рамки
SVG-флаги через flagcdn и resolveCountryCode; поле «Оплачено до» — компактный Popover+Calendar на русском; DataGridCard без вложенной обводки.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-27 01:59:50 +07:00
DenozordecandCursor 4c7dfc45d6 feat(web): иконки заголовков и rich cells во всех таблицах
Lucide-иконки в заголовках, двухстрочные ячейки аккаунтов, флаги локации VPS, favicon хостеров.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-27 01:42:45 +07:00
DenozordecandCursor a6f202f659 feat(web): ReUI DataGrid — Column Icons, оболочка и хелперы ячеек
DataGridColumnHeader в columnDefFromDataTable, bordered-контейнер, русская пагинация, хелперы dataGridCellStack/WithIcon/WithFlag.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-27 01:42:39 +07:00
DenozordecandCursor bbb6de29be fix(web): поиск VPS на отдельной строке над фильтрами
Строка поиска вынесена выше кнопки «Фильтр» и чипов активных фильтров для более понятной иерархии тулбара.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-27 01:27:58 +07:00
DenozordecandCursor af9bd44d44 fix(web): кнопка «Фильтр» в тулбаре VPS — явный trigger для ReUI Filters
Без пропа trigger компонент Filters рендерил пустую кнопку, из-за чего фильтры были невидимы на странице.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-27 00:51:20 +07:00
DenozordecandCursor b1315ffe0a feat(web): миграция таблиц на @reui/data-grid (TanStack Table + virtualization + pinning)
- Установлен @reui/data-grid через shadcn CLI: зависимости @tanstack/react-table,
  @tanstack/react-virtual, @dnd-kit/* добавлены в apps/web
- Поправлены type-only импорты во всех файлах data-grid (verbatimModuleSyntax),
  убран unused параметр table в DataGridTableVirtualBody
- Создана shared-обёртка apps/web/src/components/data-grid-card.tsx (замена
  DataTableCard) с типизированными ColumnDef<TData>, сортировкой, пагинацией
  (>25 строк), column pinning, optional virtualization (DataGridScrollArea +
  DataGridTableVirtual), footer-контентом и хелпером columnDefFromDataTable
- Мигрированы все 7 страниц: vps, dashboard, payments, balance, accounts,
  tariffs, providers — DataTableCard/TableCard+Table → DataGridCard
- Virtualization включена для VPS и payments при >200 строк (height 560)
- Column pinning последней колонки (actions) — vps, payments, balance, accounts,
  providers
- Footer rows с итогами: balance (приходы/списания/итого), payments (по валютам)
- build + tsc --noEmit без ошибок

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-27 00:06:59 +07:00
DenozordecandCursor 63da57687d feat(web): фильтры VPS в стиле reui.io + ReUI-компоненты в форме
- Регистр @reui в components.json (URL https://reui.io/r/{style}/{name}.json)
- Установлены @reui/filters, @reui/autocomplete, @reui/number-field,
  @reui/date-selector и shadcn slider через shadcn CLI
- Поправлены TS-импорты в ReUI-исходниках (type-only) и удалены неиспользуемые
  объявления; в packages/ui добавлены react-day-picker и date-fns для calendar
- Новый VpsFiltersToolbar: тулбар с поиском, кнопкой «Фильтр» (ReUI Filters),
  chips с операторами, Popover «Вид» (группировка/компактность/пресеты)
- vps-filters.tsx переписан под массивы значений (мультивыбор) с поддержкой
  операторов is_any_of / contains / gte; applyVpsFilters принимает как state,
  так и Filter[] (stateToActiveFilters)
- В форме VPS vcpu/ramGb/diskGb/monthlyRate/dailyRate — @reui/number-field
  через Controller, paidUntil — @reui/date-selector (одиночная дата)
- AutoCompleteInput: отступы флага size-4 leading-none, CommandList py-1,
  CommandItem gap-2.5, PopoverContent min-w-[220px]
- build + tsc --noEmit без ошибок

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-26 23:53:16 +07:00
DenozordecandCursor b87d7c6fad fix(web): AutoCompleteInput — canonical shadcn Combobox, без браузерных подсказок
- переделан по документации shadcn: Button trigger + Popover + Command
  с CommandInput внутри (вместо нативного Input в триггере)
- CommandInput с autoComplete="off" / autoCorrect="off" / spellCheck=false —
  браузерные подсказки больше не появляются
- поддержан произвольный ввод: пункт «Использовать: <запрос>» при отсутствии
  совпадений

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-26 23:03:20 +07:00
DenozordecandCursor db1d26d324 feat(web): стандартизированный справочник стран и городов в @cfdm/shared/geo
- packages/shared/src/geo: страны ISO 3166-1 alpha-2 + топ-города по странам
- vps.tsx: countryOptions/cityOptions из справочника + существующих VPS,
  города фильтруются по выбранной стране
- auto-complete-input: убран onBlur-хак с setTimeout, фильтрация по
  основному полю, initialFocus=false чтобы popover не закрывался
- vite.config.ts + tsconfig.json: алиас @cfdm/shared/geo

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-26 22:56:54 +07:00
DenozordecandCursor a51b5f3594 feat(web): страна/город в форме и фильтрах VPS — автокомплит + флаг
- Новый компонент AutoCompleteInput (Popover + Command/cmdk):
  ввод с подсказками, поддержка leading-иконки (эмодзи-флаг).
- Страна: в списке вариантов и в самом инпуте показывается
  эмодзи-флаг через getCountryFlagEmoji.
- Город: автокомплит без флага.
- Источник данных — уникальные значения из snapshot.vps
  (server-side API для стран/городов отсутствует).
- Подключено в форме VPS и в фильтрах страницы.
- Добавлены shadcn-компоненты command, popover, input-group;
  зависимость cmdk в packages/ui.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-26 22:39:33 +07:00
DenozordecandCursor 6310ed8e02 fix(web): форма VPS — возвращены поля Страна/Город/Дата-центр
Поля country/city/datacenter были потеряны при миграции формы на shadcn.
Добавлены в zod-схему, EMPTY_FORM, openEdit и в JSX формы (грид из 3
колонок после «Проект»).

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-26 22:36:17 +07:00
DenozordecandCursor 7ef42ee7e8 fix(web): VPS — корректная валюта тарифа и конвертация курсов в таблице
Раньше в колонке тарифа вызывался formatInBaseCurrency с ratesData=null,
поэтому 0.8 EUR отображались как «0,80 ₽» (без конвертации, но в базовой
валюте). Теперь:
- ratesData грузится через ratesQueryOptions (как на dashboard/reports);
- валюта тарифа определяется через effectiveVpsTariffCurrency (приоритет
  baseCurrency провайдера, затем vps.currency);
- форматирование через formatInProviderCurrency — учитывает курсы
  провайдера (usdRate/eurRate) и глобальные курсы, при их отсутствии
  показывает сумму в исходной валюте, а не в базовой.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-26 22:33:44 +07:00
DenozordecandCursor ee5d5b228b fix(web): VPS — дробные значения в полях ставок (step="any")
Ставка/мес и Ставка/день теперь принимают дробные значения (например,
0.8 EUR), а не только целые. Раньше browser-native валидация type=number
со step=1 блокировала сохранение.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-26 22:28:00 +07:00
DenozordecandCursor 525eff0d09 feat(web): фильтры на странице VPS — полный набор + пресеты
Восстановлены фильтры, потерянные при миграции на shadcn:
поиск, хостер/аккаунт, проект (с опцией «Без проекта»), статус,
окружение, тип тарифа, мониторинг/бэкап, страна/город/дата-центр,
минимумы vCPU/RAM/Disk, группировка по проекту, компактная таблица.
Пресеты сохраняются в localStorage. Добавлен shadcn-компонент checkbox.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-26 17:31:45 +07:00
DenozordecandCursor bc0da072ee fix(web): SelectField использует стандартные shadcn Select-компоненты с w-full
- SelectField переписан на переиспользование Select/SelectTrigger/
  SelectValue/SelectContent/SelectItem из @cfdm/ui (вместо дубля стилей)
- triggerClassName по умолчанию w-full — триггер виден в формах
  (для horizontal field в settings передаётся w-32)
- items prop в Select.Root — SelectValue рендерит label выбранного элемента

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-26 15:57:11 +07:00
DenozordecandCursor b2611d951b fix(web): селекты показывают label вместо технического значения; редактирование VPS подтягивает данные
- SelectField: обёртка над base-ui Select с items prop
  (Select.Value рендерит label выбранного элемента, а не raw value)
- все Select в forms (vps/providers/accounts/payments/balance/settings)
  переписаны на SelectField
- FormSheetRhf: useEffect reset(defaultValues) при открытии sheet
  — теперь форма редактирования заполняется текущими данными

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-26 15:54:35 +07:00
DenozordecandCursor 3e57728ddc feat(web): тёмная тема (system/manual) и фикс логотипа в icon-режиме сайдбара
- ThemeProvider (next-themes, attribute=class, defaultTheme=system)
- ModeToggle в header: светлая / тёмная / системная
- suppressHydrationWarning на <html> против FOUC
- логотип в SidebarHeader через SidebarMenuButton size="lg"
  (корректное схлопывание в icon-режиме, aspect-square для иконки)

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-26 15:50:30 +07:00
DenozordecandCursor 6fbd1a9113 refactor(repo): переход на pnpm monorepo с shadcn/ui и Fastify+Drizzle
Frontend:
- apps/web (Vite+TS, TanStack Router/Query, shadcn/ui @cfdm/ui base-nova)
- 10 страниц в routes/_auth/, Recharts через shadcn Chart, lucide-react
- формы на RHF + Zod (FormSheet/FormField)
- удалены Tabler, Chart.js, react-router-dom

Backend (параллельный трек):
- apps/api (Fastify 5 + Drizzle + better-sqlite3)
- packages/db: Drizzle-схема и repositories по сущностям
- packages/shared: Zod-контракты
- роуты с валидацией и единым форматом ошибок { error: { code, message } }
- sync/backup — заглушки 501 (billmanager-адаптеры переносятся отдельно)
- legacy Express оставлен как runtime по умолчанию (RUNTIME=express)

Infra:
- Dockerfile multi-stage под pnpm workspaces
- .dockerignore и docker-compose обновлены под monorepo

Rules:
- удалены нерелевантные правила (rust, cloudflare, server/frontend-conventions)
- project-structure.mdc и AGENTS.md переписаны под monorepo
- frontend-shadcn.mdc, shadcn-ui-production.mdc, sqlite.mdc обновлены

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-26 13:42:05 +07:00