chore(docs): подготовить этап серверов и мониторинга

This commit is contained in:
Denozordec committed 2026-09-20 22:11:27 +07:00
1 parent d25afa4b9e
commit b64e6834a9
2 files changed
+73 -1

No files matched your search

+9 -1
View File
@@ -21,7 +21,7 @@
| 4 | Остальные таблицы, удаление старых API, общая регрессия | Завершён 2026-09-20; границы приёмки ниже |
| 5 | Состояния данных, свежесть, частичные сбои, гонки polling | Завершён 2026-09-20 для дашборда; границы проверок ниже |
| 6 | Навигация и дашборд | Завершён 2026-09-20 в границах локальной приёмки; ограничения ниже |
| 7 | Серверы и мониторинг: детали, формы, URL-контекст, права | Не начат |
| 7 | Серверы и мониторинг: детали, формы, URL-контекст, права | Подготовлена схема и инвентаризация; реализация 7.1 ожидает следующего блока |
| 8 | Трафик и статистика | Не начат |
| 9 | VPN, Firewall и Filters | Не начат |
| 10 | Маршрутизация, диагностика, карта и терминал | Не начат |
@@ -469,6 +469,14 @@ Production build успешен: контракты, TypeScript, 34 страни
**Следующий точный шаг — этап 7:** составить схему серверов/мониторинга по Data Grid Filtering 2 и Sheet 8, инвентаризировать права действий и текущие формы. Первый ограниченный блок — URL-контекст поиска/типа/Filters на /servers (с сохранением server), проверка прямого URL/Back/reload и возврата к списку. Затем мобильные строки Ping-проб и формы/права по журналу. Не менять сетевые правила в рамках визуальной унификации.
## Этап 7 — подготовка (2026-09-20)
На старте продолжения использовано 80% пятичасовой квоты (остаток 20%, ниже резерва). Код приложения не менялся: выполнена ограниченная подготовка по текущим файлам. Создан `docs/ux-ui-stage-7.md` с таблицей референсов, схемами ПК/телефона, инвентаризацией форм/прав и разбивкой 7.1–7.5.
Подтверждено: серверы сохраняют в URL только server; поиск/тип/Filters локальные. Ping-пробы используют фиксированную сетку внутри overflow-hidden. В lib/auth.ts уже есть can/hasPermission, а на двух страницах проверки прав действий не подключены; backend-политика разделяет servers/uptime read/write. В плане записан конкретный контракт q/type/filters, ограничения parser и сценарии проверки Back/reload/черновиков/ошибочного URL.
Проверка подготовки — сверка путей, типов, обработчиков и правил backend по исходникам, git diff --check. Тесты приложения повторно не запускались: изменения только документационные. Сохранить локальным коммитом без push. **Следующий шаг: блок 7.1 по ux-ui-stage-7.md — codec URL серверов с unit-тестами, затем подключение к странице и профильные E2E.** Этап 7 не считать реализованным.
## Карта миграции (исходная инвентаризация этапа 0)
Исходная связка на этапе 0: @tanstack/react-table ^8.21.3, @tanstack/react-virtual ^3.14.4, base-nova. По итогам этапа 4 используется @tanstack/react-table 9.2.4 с useTable/dataGridFeatures и дерево FilterQuery вместо старого filters/onChange. Список ниже сохранён как историческая инвентаризация.
+64
View File
@@ -0,0 +1,64 @@
# Этап 7: серверы и мониторинг
Подготовка 2026-09-20 по текущему коду после этапа 6. Реализация ещё не начата. Основа: ReUI PRO, base-nova, Frame; переиспользовать установленные Filters/DataGrid, ServerFilters, PageHeader и Sheet. Не менять vendored-компоненты и правила сетевых операций.
## Инвентаризация
| Область | Подтверждено в коде | Следующая доработка |
| --- | --- | --- |
| Серверы | `app/(main)/servers/page.tsx`: URL читает только `server`; search/typeFilter/advancedFilters — локальный useState | Восстановление фильтров из URL без сброса выбранного сервера |
| Filters | `server-filter-fields.ts`: country/status/type; `apply-filter-query.ts` сохраняет AND/OR, вложенность, negated и черновики | Ограниченный валидируемый codec дерева, без уплощения |
| Формы сервера | Уже есть сохранение формы при ошибке, блокировка повторов, загрузка деталей, разделение результатов опроса и обновления списка | Проверить UX шагов и доступность, сохранить существующие гарантии |
| Мониторинг | `/uptime?probe=...` выбирает проверку; отдельные вкладки и фильтры пока не имеют полного URL-контракта | Отдельный блок URL после серверов; не распространять probe на несвязанные ресурсы/speed |
| Телефон | Ping-пробы: фиксированная сетка из 11 колонок, FramePanel с overflow-hidden | Доступные имя/цель/состояние и действия на 320/390 px без обрезки |
| Права | `lib/auth.ts`: can/hasPermission; страницы servers/uptime не используют их для разрешений действий | UI-доступность по фактической политике backend, с повторной обработкой 403 |
## Референсы и схема
| Блок | Референс | Схема доработки |
| --- | --- | --- |
| Список серверов | [Data Grid Filtering 2](https://reui.io/preview/base/data-grid-filtering-2?ref=mcp) | Контекст → поиск/тип/Filters → результат → детали |
| Детали и формы | [Sheet 8](https://reui.io/preview/base/sheet-8?ref=mcp) | Объект → доступное действие → форма → подтверждённый API-результат |
| Проверки на телефоне | [List 9](https://reui.io/preview/base/list-9?ref=mcp) | Имя и цель → состояние → измерение → действия |
```text
ПК: [Контекст сервера / проверки · снять выбор]
[Поиск] [Тип] [Filters] [Доступные действия]
[Таблица → детали → форма → результат]
URL ↔ фильтры; Back/reload возвращают контекст
Телефон: [Имя проверки Состояние]
[Источник → цель]
[RTT / потери] [Действия]
[Раскрыть дополнительные сведения]
```
Это схема иерархии, а не разрешение переписать таблицы или блоки вручную. Конкретную композицию мобильного списка выбрать из установленных компонентов после проверки текущих действий строки.
## Блок 7.1 — URL серверов
Предлагаемый контракт реализации:
| Параметр | Значение | Правило |
| --- | --- | --- |
| `server` | Точный ID из этапа 6 | Сохранять при изменении фильтров; отсутствие объекта не подменять другим |
| `q` | Строка поиска | Пустое значение удалять; ввод обновлять через replace с задержкой, без записи каждого символа в историю |
| `type` | jump-host / exit-node / home-router | «Все» — отсутствие параметра; дискретный выбор добавляет запись истории |
| `filters` | JSON `{v:1, query: FilterQuery}` | URLSearchParams кодирует значение; сохранить AND/OR и структуру групп |
Сначала реализовать чистый codec в `lib/data-filters/server-url-state.ts` и профильные unit-тесты. Валидировать до передачи в Filters/evaluator: версию, тип узла, уникальные ID, поля из SERVER_FILTER_FIELDS, допустимые для select операторы/значения. Ограничить размер JSON 8 KiB, количество узлов 50, глубину 4. Эти числа — рабочие пределы нового контракта, не существующие ограничения ReUI. Окончательный список операторов сверить с установленной конфигурацией select.
Черновик незавершённого условия оставить локальным; не публиковать частично собранное дерево и не превращать OR в AND. При восстановлении неверного filters/type показать понятное сообщение и действие сброса; до сброса не расширять результат до всех серверов молча. Не помещать в URL пароли, ключи и поля форм.
URL — источник сохранённого состояния. Back/Forward/reload восстанавливают контролы и строки без циклов синхронизации, автозаписи и повторного открытия форм. При быстрых изменениях разных контролов читать актуальные параметры, чтобы поздняя запись поиска не затёрла type/filters/server. Сброс фильтров удаляет q/type/filters, сохраняя server и чужие параметры; «Все серверы» снимает только server.
Приёмка: прямой URL; reload; Back/Forward; смена type после ввода поиска; AND/OR; черновик; повреждённый/слишком большой JSON; неизвестное поле/оператор; сброс с сохранением server; пустой результат; отсутствие POST/PATCH/DELETE от навигации. Прогнать codec unit-тесты, servers.spec.ts, профильные URL E2E, lint/TypeScript и production build. Затем журнал и локальный коммит без push.
## Блоки после 7.1
1. **7.2 — мобильные проверки.** Устранить обрезку Ping-проб, сохранив выбор строк, раскрытие, запуск и меню. Проверить 320/390/1440 px, клавиатуру/Escape, отсутствие скрытых обязательных действий и горизонтального скролла всей страницы.
2. **7.3 — права действий.** Источник политики — `backend/src/lib/permissions.ts`, применение — `backend/src/plugins/auth.ts`. GET `/api/servers*` требует `mm:servers:read`, запись — `mm:servers:write`; GET `/api/uptime*` — `mm:uptime:read`, запись — `mm:uptime:write`. Учитывать наследование write/admin через существующий hasPermission и режим auth disabled. Проверить конкретные маршруты опроса/теста соединения, не считать их чтением только по названию. UI не заменяет backend-проверку: серверный 403 сохраняет форму и сообщает отказ. Не выдавать доступ только по is_admin без подтверждения текущей политики.
3. **7.4 — формы, детали и полный контекст мониторинга.** Восстановление вкладки/фильтров из URL, понятные единицы и подписи, возврат к списку после действия. Не дублировать сохранённые исправления этапа 1; проверить загрузку, отмену, 400/403/500, timeout и повторное нажатие.
4. **7.5 — приёмка этапа.** Сценарий «проблема → сервер/проверка → действие → возврат» с сохранением контекста; профильные E2E, права в HTTP-моках, TypeScript, lint и build. Реальные JWT/RouterOS отдельно в тестовом окружении.
Следующий исполняемый шаг: codec URL серверов и его тесты, затем подключение к ServersPageContent. Полную регрессию всей системы здесь не повторять без изменений общей основы или найденной регрессии.