Commit Graph
100 Commits
Author SHA1 Message Date
Denozordec 267aa1c230 refactor(web): обновить стили компонента SystemMonitorPopover для улучшения макета
Docker / build (push) Failing after 19s
- Изменены классы в компоненте SystemMonitorPopover, чтобы использовать flexbox для более компактного и организованного отображения содержимого.
- Обновлены стили для улучшения визуального представления и взаимодействия с пользователем.
2026-07-17 20:34:01 +07:00
DenozordecandCursor d52c633d90 feat(web): добавить поддержку быстрого доступа на дашборде и обновить настройки интерфейса
Docker / build (push) Failing after 19s
- Внедрён компонент QuickActionGrid для отображения часто используемых разделов на дашборде, управляемый настройкой showQuickActions.
- Добавлен новый параметр showQuickActions в схему настроек для управления видимостью быстрого доступа.
- Обновлён интерфейс настроек для включения переключателя отображения быстрого доступа.
- Добавлен компонент SystemMonitorPopover в заголовок приложения для мониторинга системы.

Co-authored-by: Cursor <[email protected]>
2026-07-17 20:32:59 +07:00
DenozordecandCursor 9c43b45245 refactor(web): улучшить компоненты KpiStatGrid и KpiStatCardBody для более компактного отображения
Docker / build (push) Failing after 18s
- Обновлены стили и структура компонентов KpiStatGrid и KpiStatCardBody для улучшения визуального представления.
- Изменены классы и добавлены новые стили для более гибкого и компактного макета.
- Обновлена документация для отражения изменений в интерфейсе и описания нового визуального представления KPI.

Co-authored-by: Cursor <[email protected]>
2026-07-17 18:36:47 +07:00
DenozordecandCursor 52665843d6 feat(web): обновить компоненты KpiStatGrid и SectionCards для улучшения интерфейса
Docker / build (push) Failing after 19s
- Добавлен новый тип KpiStatVariant для управления визуальными состояниями карточек KPI.
- Обновлены компоненты SectionCards и KpiStatGrid для поддержки новых свойств, таких как iconClassName и footer с Badge.
- Изменены стили и логика отображения для улучшения визуального представления и взаимодействия с пользователем.
- Обновлена документация для отражения изменений в интерфейсе.

Co-authored-by: Cursor <[email protected]>
2026-07-17 17:14:55 +07:00
DenozordecandCursor 35e5d8430d feat(web): обновить компоненты и добавить новые элементы интерфейса
Docker / build (push) Failing after 22s
- Добавлены новые правила для использования ReUI и обновлены существующие правила.
- Внедрены новые компоненты, такие как Frame, Alert, IconStack и DetailPanel, для улучшения интерфейса.
- Обновлены существующие компоненты, включая DataGridCard и EmptyState, с использованием новых элементов.
- Добавлены новые утилиты для фильтрации данных и управления состоянием.
- Обновлен .gitignore для исключения файлов окружения.

Co-authored-by: Cursor <[email protected]>
2026-07-17 15:30:16 +07:00
DenozordecandCursor a11fbc6efd fix(web): заполнить график расходов на дашборде
Docker / build (push) Failing after 19s
Учитывать списания из журнала баланса и не-пополнения; при отсутствии истории показывать оценку по активным VPS. Год по умолчанию — текущий.

Co-authored-by: Cursor <[email protected]>
2026-06-30 21:25:14 +07:00
DenozordecandCursor 77099b9ab0 feat(web): переработать дашборд по эталону REUI
Docker / build (push) Failing after 19s
Привести layout к эталону: alert с CTA, 6 KPI в ряд, помесячные графики платежей и расходов с фильтром года.

Co-authored-by: Cursor <[email protected]>
2026-06-30 20:57:43 +07:00
DenozordecandCursor 0e9a6a6a21 feat: интеграция с CF Domain Manager
Docker / build (push) Failing after 22s
Синхронизация bindings в vps_domains с привязкой по IP, API приёма с Bearer-токеном, настройки и App Switcher из SQLite, UI доменов на VPS и уведомление CFDM при vps_down.

Co-authored-by: Cursor <[email protected]>
2026-06-30 16:45:16 +07:00
DenozordecandCursor 2b01063279 chore(web): обновить дефолтные URL App Switcher для prod
Docker / build (push) Failing after 19s
VPS Tracker — http://192.168.100.67:3001, CF Domain Manager — http://192.168.100.67:6363.

Co-authored-by: Cursor <[email protected]>
2026-06-30 16:01:40 +07:00
DenozordecandCursor eed73a39f0 fix(web): убрать MenuGroupLabel из App Switcher
Docker / build (push) Failing after 20s
Заголовок меню — обычный div вместо DropdownMenuLabel, чтобы исключить Base UI error #31 в production.

Co-authored-by: Cursor <[email protected]>
2026-06-30 15:45:44 +07:00
DenozordecandCursor eaa5db38bf fix(web): исправить Base UI error #31 в App Switcher
Docker / build (push) Failing after 21s
DropdownMenuLabel перенесён внутрь DropdownMenuGroup; для внешних ссылок добавлен nativeButton={false}.

Co-authored-by: Cursor <[email protected]>
2026-06-30 15:32:22 +07:00
DenozordecandCursor ea9c996838 feat(web): добавить App Switcher для перехода между приложениями
Docker / build (push) Failing after 21s
Dropdown в sidebar с настраиваемым списком ссылок через VITE_APP_SWITCHER и дефолтами для VPS Tracker и CF Domain Manager.

Co-authored-by: Cursor <[email protected]>
2026-06-30 15:11:53 +07:00
DenozordecandCursor 7c777bffc2 fix(web): расширить select размера страницы для значения 100
Docker / build (push) Failing after 20s
Заменить фиксированную ширину w-14 на min-w-18, чтобы трёхзначные значения не обрезались.

Co-authored-by: Cursor <[email protected]>
2026-06-30 13:06:53 +07:00
DenozordecandCursor 5c1c94bc57 fix(web): UX/UI аудит — пагинация, a11y, settings и TruncatedText
Docker / build (push) Failing after 20s
Исправить обрезку Select в пагинации DataGrid, health-mode zero-results, подтверждение импорта бэкапа и унифицировать tooltip на обрезанном тексте.

Co-authored-by: Cursor <[email protected]>
2026-06-30 12:53:16 +07:00
DenozordecandCursor 447d499a8d feat(projects): переработать проекты и отчётность по проектам
Docker / build (push) Failing after 20s
Добавлены карточка проекта, KPI и фильтры на /projects, отчёты с разрезом по проектам, cascade rename и защита удаления на API.

Co-authored-by: Cursor <[email protected]>
2026-06-29 19:21:04 +07:00
DenozordecandCursor 0bcea39868 fix(web): объединить типы пополнения на графике платежей
Docker / build (push) Failing after 19s
topup и provider_balance_topup из разных API — один тип; добавлена легенда с русскими подписями.

Co-authored-by: Cursor <[email protected]>
2026-06-29 18:34:30 +07:00
DenozordecandCursor 46267669ce fix(web): корректная валюта VPS в отчётах по месячным расходам
Docker / build (push) Failing after 23s
Co-authored-by: Cursor <[email protected]>
2026-06-29 18:08:27 +07:00
DenozordecandCursor 5998887148 fix(veesp): читать acc_credit вместо acc_balance при получении баланса
Docker / build (push) Failing after 24s
Co-authored-by: Cursor <[email protected]>
2026-06-29 15:43:54 +07:00
DenozordecandCursor 0682dd0e2f fix(web): не отправлять Content-Type на DELETE без тела
Docker / build (push) Failing after 21s
Co-authored-by: Cursor <[email protected]>
2026-06-29 15:32:18 +07:00
DenozordecandCursor 60332db1e4 fix(web): конвертировать тарифы VPS в базовую валюту настроек
Docker / build (push) Failing after 21s
Co-authored-by: Cursor <[email protected]>
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 <[email protected]>
2026-06-29 14:10:15 +07:00
DenozordecandCursor ce6414c65f fix(veesp): обновление IP, характеристик и валюты при повторном синке
Docker / build (push) Failing after 21s
Перезапись vcpu/ram/disk/ip на update, fetch VM ips, приоритет валюты из balance API.

Co-authored-by: Cursor <[email protected]>
2026-06-29 12:10:47 +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 <[email protected]>
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 <[email protected]>
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 <[email protected]>
2026-06-29 10:25:12 +07:00
DenozordecandCursor b15e10f117 fix(userapi): корректно определять суточные ставки Macloud/VDSina при синке
Docker / build (push) Has been cancelled
Учитываются server-group, full_cost при нулевом cost и неактивные тарифные планы из индекса.

Co-authored-by: Cursor <[email protected]>
2026-06-29 10:04:42 +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 <[email protected]>
2026-06-29 02:48:04 +07:00
DenozordecandCursor 6c5eb04fae fix(userapi): подтягивать стоимость VPS Macloud/VDSina из тарифных планов
Docker / build (push) Has been cancelled
При синке UserAPI цена и период берутся по server-plan.id из индекса тарифов, а не остаются нулевыми.

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

Co-authored-by: Cursor <[email protected]>
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 <[email protected]>
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 <[email protected]>
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 <[email protected]>
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 <[email protected]>
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 <[email protected]>
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 <[email protected]>
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 <[email protected]>
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 <[email protected]>
2026-06-28 22:22:21 +07:00
DenozordecandCursor 246ad1738a fix(web): унифицировать таблицу VPS и перенести колонки в popover «Вид»
Docker / build (push) Has been cancelled
Co-authored-by: Cursor <[email protected]>
2026-06-28 22:07:29 +07:00
DenozordecandCursor 52a8b0db85 feat(api, web): добавить аудит и обновить маршруты
Docker / build (push) Has been cancelled
Добавлены маршруты для аудита в API и интерфейсе, включая возможность обновления и удаления проектов. Реализована интеграция с системой аудита для отслеживания изменений в VPS и проектах. Обновлены компоненты и схемы для поддержки новых полей и функционала.

Co-authored-by: Cursor <[email protected]>
2026-06-28 21:37:32 +07:00
DenozordecandCursor 18072fdeea feat(web): добавить ReUI color picker в форму проекта
Docker / build (push) Has been cancelled
Co-authored-by: Cursor <[email protected]>
2026-06-28 20:04:56 +07:00
DenozordecandCursor f1fbd637a7 feat(web): добавить KPI-карточки на страницы платежей, баланса и продлений
Docker / build (push) Has been cancelled
Co-authored-by: Cursor <[email protected]>
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 <[email protected]>
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 <[email protected]>
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 <[email protected]>
2026-06-28 16:53:51 +07:00
DenozordecandCursor 06f5b27e53 docs: добавить скриншоты интерфейса в README
Docker / build (push) Has been cancelled
Демонстрация основных экранов приложения; IP на скриншоте VPS замаскированы.

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

Co-authored-by: Cursor <[email protected]>
2026-06-28 00:45:52 +07:00
DenozordecandCursor a53192207d chore(cursor): обновить MCP-правила и плагины под стек проекта
Docker / build (push) Has been cancelled
Актуализирован backend-mcp под SQLite/Context7/shadcn; в settings включены shadcn и context7, отключён cloudflare.

Co-authored-by: Cursor <[email protected]>
2026-06-28 00:33:40 +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 <[email protected]>
2026-06-28 00:27:09 +07:00
DenozordecandCursor 9df91bf2cc fix(build): сборка @cfdm/db и @cfdm/shared в dist для production
Docker / build (push) Has been cancelled
Node в Docker не мог импортировать .ts из workspace-пакетов; exports
переключены на dist, добавлен tsc build и сборка в Dockerfile.

Co-authored-by: Cursor <[email protected]>
2026-06-27 23:36:15 +07:00
DenozordecandCursor 0de0538218 feat(api): завершение миграции на Fastify — sync, scheduler, backup
Docker / build (push) Has been cancelled
Портированы BILLmanager sync/test/balance, планировщик и Telegram,
импорт/экспорт бэкапов и migrate API; Docker по умолчанию на fastify.
Добавлен .understand-anything/ в gitignore, исправлен path codegraph в MCP.

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

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

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

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

Co-authored-by: Cursor <[email protected]>
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 <[email protected]>
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 <[email protected]>
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 <[email protected]>
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 <[email protected]>
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 <[email protected]>
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 <[email protected]>
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 <[email protected]>
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 <[email protected]>
2026-06-26 22:28:00 +07:00
DenozordecandCursor e43cdc1b85 fix(ui): позиция выпадающего списка Select — снизу, а не поверх триггера
В SelectContent по умолчанию было alignItemWithTrigger=true (стиль macOS:
поповер перекрывает триггер) и align=center. Заменил на align=start и
alignItemWithTrigger=false — меню появляется под триггером, как в
стандартном shadcn.

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

Co-authored-by: Cursor <[email protected]>
2026-06-26 17:31:45 +07:00
DenozordecandCursor 8b38021200 docker: оптимизация образа — 2 стадии вместо 3, один COPY-слой в runtime
- убран отдельный deps-stage: build + pnpm prune --prod в одном RUN
- удаление src/tsconfig/.vite-temp и лишних файлов в node_modules (md/map/ts/LICENSE/...)
- runtime: alpine + nodejs, один COPY --from=build /app (symlink’и pnpm сохраняются)
- итого: 2 стадии, ~1 COPY-слой в runtime вместо ~17

Co-authored-by: Cursor <[email protected]>
2026-06-26 16:08:34 +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 <[email protected]>
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 <[email protected]>
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 <[email protected]>
2026-06-26 15:50:30 +07:00
DenozordecandCursor 3026f1d1ce fix(docker): копирование apps/api/db.js и routes/ в образ; пути к web/dist и seed
- Dockerfile: добавлены COPY для db.js, routes/, apps/web/public (seed)
- apps/api/index.js: distPath → ../web/dist (раньше ../dist)
- apps/api/db/index.js: DB_PATH/SEED_DIR/dataDir — на 3 уровня вверх
  (apps/api/db/ → корень) и seed из apps/web/public/data

Co-authored-by: Cursor <[email protected]>
2026-06-26 13:51:19 +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 <[email protected]>
2026-06-26 13:42:05 +07:00
Denozordec 8408155be6 feat(accounts): «Хостер / аккаунт» в журнале синхронизации; журнал баланса — только имя аккаунта
Made-with: Cursor
2026-03-23 23:14:39 +07:00
Denozordec 24e1b8f4ef fix(currency): глобальный курс при нулевой сумме (не «курсы не загружены»)
Made-with: Cursor
2026-03-23 23:05:34 +07:00
Denozordec 0b4507e2d2 fix(rates): fallback на прямой fetch если прокси недоступен
Made-with: Cursor
2026-03-23 23:00:52 +07:00
Denozordec 6bf270d715 feat(dashboard): подпись «хостер / аккаунт» в таблице остатков
Made-with: Cursor
2026-03-23 22:53:44 +07:00
Denozordec 92a986c858 fix(rates): серверный прокси /api/rates-proxy и бейдж «Курсы не загружены»
- Добавлен /api/rates-proxy для загрузки курсов без CORS
- Фронтенд загружает курсы через прокси, а не напрямую
- convertWithProviderRate возвращает source=no-rates при отсутствии ratesData
- ConvertedAmount показывает «Курсы не загружены» (жёлтый) вместо ложного «Глобальный курс»

Made-with: Cursor
2026-03-23 21:45:02 +07:00
Denozordec a97ec8c121 refactor(currency): валюта тарифа = валюта хостера, не VPS
- effectiveVpsTariffCurrency всегда берёт provider.baseCurrency
- Убран селектор валюты из формы VPS (подпись из хостера)
- DashboardPage, ResourcesPage, ReportsPage: вместо item.currency — baseCurrency провайдера
- Конвертация по глобальным курсам теперь корректно находит EUR/USD

Made-with: Cursor
2026-03-23 21:32:46 +07:00
Denozordec c161eaf84a fix(currency): глобальные курсы без явного курса хостера и нормализация Valute ЦБ
- parseProviderFxRate: пусто/auto/невалид → конвертация по ссылке из настроек
- normalizeRatesPayload + App: JSON ЦБ с Valute → base+rates как у latest.js
- Подсказка в форме хостера про курсы USD/EUR

Made-with: Cursor
2026-03-23 21:25:01 +07:00
Denozordec a4752d4379 fix(currency): глобальная конвертация и effectiveVpsTariffCurrency для BM
- baseCurrency хостера не подставлять при пустой валюте VPS, если есть API (дефолт RUB)
- Подстановка валюты хостера только для провайдеров без API
- RUR → RUB для курсов ЦБ; проверка курсов через Number.isFinite

Made-with: Cursor
2026-03-23 21:17:19 +07:00
Denozordec f4517f03fc feat(balance): подпись аккаунта «хостер / имя» как в фильтрах VPS
- Вынесен accountSelectLabel в src/lib/account-select-label.js
- Модалка списания, таблица баланса и журнал на BalancePage
- VpsPage переведён на общий модуль

Made-with: Cursor
2026-03-23 21:06:52 +07:00
Denozordec 524cbba5e7 fix(vps): валюта тарифа — effectiveVpsTariffCurrency и поле в форме
- Для хостеров без API USD в VPS трактуется как дефолт формы, берётся baseCurrency хостера
- В форме VPS добавлен выбор валюты тарифа; при смене хостера подставляется его валюта
- Прогноз по проектам и ConvertedAmount для тарифа используют effectiveVpsTariffCurrency

Made-with: Cursor
2026-03-23 21:03:34 +07:00
Denozordec d717719e35 Revert "perf: replace @tabler packages with lucide-react and static CSS (-70 MB node_modules)"
Docker / build (push) Failing after 17s
This reverts commit a1227a13e8.
2026-03-21 02:15:20 +07:00
Denozordec a1227a13e8 perf: replace @tabler packages with lucide-react and static CSS (-70 MB node_modules)
Docker / build (push) Failing after 16s
Made-with: Cursor
2026-03-21 02:11:28 +07:00
Denozordec 5cd11fc454 docker: revert to apk add nodejs (smaller than full node binary)
Docker / build (push) Failing after 17s
Made-with: Cursor
2026-03-21 01:43:47 +07:00
Denozordec 3c950db2ad docker: copy node binary instead of apk add nodejs for smaller image
Docker / build (push) Failing after 16s
Made-with: Cursor
2026-03-21 01:41:51 +07:00
Denozordec 116632aa9e docker: оптимизация образа (alpine+nodejs, очистка node_modules)
Docker / build (push) Failing after 16s
Made-with: Cursor
2026-03-21 01:38:01 +07:00
Denozordec 43c1a0dc81 docker: final stage back to node:22-alpine (fewer base layers than distroless)
Made-with: Cursor
2026-03-21 01:31:09 +07:00
Denozordec 446d70d3dc docker: minimal runtime image — UI in devDeps, distroless final, slim bundle
Docker / build (push) Failing after 16s
Made-with: Cursor
2026-03-21 01:27:26 +07:00
Denozordec dae8bb8066 docker: drop npm cache clean after ci (fixes exit 254 with BuildKit cache mount)
Docker / build (push) Failing after 18s
Made-with: Cursor
2026-03-21 01:19:53 +07:00
Denozordec 87cc899486 docker: fewer final image layers, npm cache mount, trim build context
Docker / build (push) Failing after 18s
Made-with: Cursor
2026-03-21 01:18:37 +07:00
Denozordec 18de957c61 refactor: simplify ProvidersPage by removing unused API connection logic
Docker / build (push) Failing after 18s
Removed unnecessary state variables and connection testing logic from ProvidersPage. Updated the UI to clarify API login and password handling, directing users to the appropriate section for account credentials. This streamlines the component and enhances user experience.
2026-03-21 01:07:36 +07:00
Denozordec ec038242bf feat: consolidate provider API sources with heuristic support
Docker / build (push) Failing after 18s
Updated the database migration logic to consolidate provider API sources from both accounts and heuristic methods for BILLmanager URLs. Replaced direct calls to `consolidateProviderApiFromAccounts` with `consolidateAllProviderApiSources` in relevant routes to ensure comprehensive API data handling.
2026-03-21 01:01:09 +07:00
Denozordec 28d723983e feat: BILLmanager API на уровне хостера, миграция со старых аккаунтов
Docker / build (push) Failing after 18s
Made-with: Cursor
2026-03-21 00:52:49 +07:00
Denozordec 2da1f6a6f0 docs: add docker run equivalent for compose setup
Docker / build (push) Failing after 17s
Made-with: Cursor
2026-03-21 00:29:39 +07:00