Files
MikrotikManager/docs/ux-ui-stage-9.md
T

26 KiB
Raw Blame History

Этап 9: VPN и сетевые операции

Статус: начат 2026-09-28, выполнены блоки 9.1–9.25. Основа — существующие ReUI PRO/base-nova, Frame, ServerTileRail, DataGrid и формы. Правила применения сетевой конфигурации не меняем.

Схема и референсы принятого плана

Область Референс Схема доработки
Устройство и объект List 9 Устройство → список → точный объект
Формы Sheet 8 Контекст → ввод → ожидание → результат / ошибка с сохранением ввода
Таблицы Data Grid Filtering 2 Фильтры → таблица устройства → действие

Референсы сохранены из общего плана; новые registry-компоненты не устанавливались.

[Устройство / URL] → [Объект и состояние данных]
                              ↓
                     [Форма / подтверждение]
                              ↓
                 [Один запрос · ожидание ответа]
                       ↙                ↘
            [Ошибка + повтор]     [Подтверждение API]
            контекст сохранён       ↓ обновить список

Карта работ

Раздел Точки интеграции Следующая проверка
WireGuard app/(main)/wireguard/page.tsx, components/wireguard, shared/api/wireguard.ts; URL server/interface Создание, импорт, пиры, переключение и экспорт: ввод, повтор, ответ и права
IPsec app/(main)/ipsec/page.tsx, components/ipsec, shared/api/ipsec.ts Выбор устройства, инициализация, сертификаты/пользователи и ошибки
GRE app/(main)/gre/page.tsx; /api/gre/tunnels, revisions; URL-контекст Запись/удаление и восстановление, повторные нажатия
VXLAN app/(main)/vxlan/page.tsx; /api/vxlan; URL server/tunnel Загрузка/сбой/повтор, контекст и существующие действия
Firewall app/(main)/firewall/page.tsx; правила, адреса, перемещение и история Достоверность записи, права и контекст устройства
Filters app/(main)/filters/page.tsx; /api/filters/rules, revisions, gre-tunnels, recursive-routes Сохранение/применение, ошибки зависимостей и устройство

Инвентаризация определяет точки следующего аудита; перечисление не означает проверки всех обработчиков.

Блок 9.1 — удаление WireGuard

  • Диалог удаления интерфейса/пира блокирует повтор и закрытие до ответа. Ожидание — role=status, ошибка — role=alert; при ошибке сохраняются объект и диалог для повтора.
  • Успех требует ok=true по контракту backend. HTTP 200 с ok=false не закрывает диалог и не показывает успех.
  • При различии ID строки и RouterOS ID для пира используется rosId. Прежний ID остаётся запасным вариантом при отсутствии rosId.
  • Прошли 13 E2E WireGuard: таблицы, URL/устройство, ошибки загрузки и оба удаления с задержкой, 403, неподтверждённым ответом и успешным повтором. Проверяются сервер и ID в DELETE. Lint, TypeScript и diff-check прошли.
  • Сохранён установленный AlertDialog/Base UI, без изменения темы/registry. Получен ReUI audit checklist; изменены поведение и доступные состояния.

Далее: создание/импорт/добавление пира WireGuard — сохранение формы, повторные операции, различие dry-run и применения. Затем остальные разделы по карте. Реальные RouterOS/JWT и сетевые последствия требуют отдельного окружения. Этап 9 не завершён.

Блок 9.2 — достоверность ответа импорта

Ответ проверяется схемой contracts: режим dryRun соответствует запросу, применение подтверждается applied. Ошибка сохраняет текст и сервер. Один E2E с пятью последовательными ответами (403, dry-run, отсутствие applied, повреждённый ответ, успех), lint и TypeScript прошли. Серверный dry-run не добавлен в UI; предпросмотр остаётся локальным. Далее — создание/пиры, защита повторов и закрытия формы импорта во время запроса. Реальные сетевые операции не проверены.

Блок 9.3 — ожидание импорта (2026-09-29)

Повторная отправка, закрытие и редактирование формы блокируются до ответа. Ошибка остаётся в форме, ожидание объявляется; добавлены доступные имена полей. Все 15 профильных E2E прошли, включая двойное нажатие, Escape/внешний клик, сохранение данных после 500 и повтор. Далее — создание интерфейса/пира и подтверждение их операций. Полный аудит сетевых разделов ещё не выполнен.

Блок 9.4 — создание интерфейса и пира (2026-09-29)

Формы блокируют повтор/закрытие/изменение до ответа и сохраняют ввод при ошибке. Проверяются оба backend-ответа создания интерфейса (DTO либо ok/name) и ok=true создания пира. Поля и переключатели получили доступные имена; повторное открытие пира сбрасывает ввод. Все 18 E2E прошли, три новых повторены после уточнения переключателей; lint и TypeScript прошли. Итог сборки — в журнале. Следующие проверки: переключение интерфейса и экспорт с защитой контекста. Реальный RouterOS/JWT и транзакционность составной операции не подтверждены локальными моками.

Блок 9.5 — переключение интерфейса (2026-09-29)

Повторы блокируются до PATCH и обновления списка; успех требует ok=true. Ожидание и ошибка с именами интерфейса/сервера объявляются через status/alert. Все 19 E2E, lint, TypeScript и diff-check прошли. Следующий блок — экспорт, включая поздние ответы и смену контекста. Реальное изменение RouterOS не проверено.

Блок 9.6 — контекст экспорта (2026-09-29)

Результат, ошибка и завершение запроса привязаны к открытию панели; закрытие/новое открытие/размонтирование инвалидируют прежний ответ. Повтор защищён замком. Схема ответа и запрошенный формат проверяются. Три новых E2E, lint и TypeScript прошли; итог общего набора — в журнале. Далее: точный выбор пира, затем история/восстановление. Реальный экспорт ключей не проверен; сетевой запрос после закрытия не отменяется.

Блок 9.7 — точный пир (2026-09-29)

Явный неизвестный ID не заменяется первым пиром; локальный и серверный экспорт используют общую функцию выбора по id/rosId. В API передаётся RouterOS ID выбранного пира. Прошли 4 E2E экспорта, 2 unit-теста, lint и TypeScript; неизвестный ID проверен на уровне функции. Далее — история и восстановление WireGuard. Реальное устройство не проверено.

Блок 9.8 — подтверждение восстановления (2026-09-29)

Один POST до завершения операции; успех требует ok=true. Новый E2E проверил повторное нажатие, ok=false и успешный повтор. Далее — ConfigHistorySheet: исправить вложение div в p и сохранение подтверждения при ошибке, проверить всех потребителей. Предупреждение HTML воспроизведено; реальная операция RouterOS не проверена.

Блок 9.9 — общий диалог восстановления (2026-09-29)

Исправлена HTML-разметка предупреждения; ошибка сохраняет выбранную ревизию и подтверждение для повтора. Общий замок блокирует повтор и закрытие до завершения Promise. Ошибки всех шести потребителей передаются в диалог; IPsec возвращает Promise. Все 40 профильных E2E прошли, включая 6 новых сценариев истории. Общий компонент и тесты lint-чистые; 7 исходных ошибок и 31 предупреждение в страницах подтверждены сравнением с HEAD и не изменились. Сборка — в журнале. Далее — ошибки/гонки загрузки истории, затем подтверждение восстановления остальных разделов. Реальные устройства не проверены.

Блок 9.10 — загрузка истории WireGuard (2026-09-29)

Ошибка отделена от пустого списка и имеет повтор; ревизии проверяются по схеме и выбранному серверу. Закрытие/размонтирование и новое поколение запроса исключают поздние результат/ошибку/finally. Три новых E2E, lint и TypeScript прошли; итог регрессии в журнале. Остальные страницы пока не подключены к новым loadError/onRetry. Далее — подтверждение восстановления остальных разделов и их состояния истории.

Блок 9.11 — подтверждение восстановления остальных разделов (2026-09-29)

IPsec/GRE/Firewall/Filters/рекурсивные маршруты требуют ok=true до применения ответа в UI; WireGuard уже проверял подтверждение. 6 расширенных сценариев истории прошли (403, ok=false, пустой ответ, успех), как и TypeScript/lint теста/diff-check. Исходные ошибки lint страниц не изменились. Далее — ошибка/повтор/поздние ответы загрузки истории этих пяти разделов. Полная валидация rules/routes и реальная операция RouterOS остаются вне этого блока.

Блок 9.12 — загрузка истории IPsec (2026-09-29)

Ошибка и повтор подключены к общей панели; поздние ответы закрытого/сменившего контекст запроса игнорируются. Проверяется наличие массива revisions, без полной валидации записей. Все 7 E2E истории прошли. Далее — GRE/Firewall/Filters/рекурсивные маршруты и общая схема ревизий. Реальные устройства не проверены.

Блок 9.13 — история всех разделов (2026-09-29)

Ошибка/повтор и защита поздних ответов подключены к GRE/Firewall/Filters/рекурсивным маршрутам. Общая схема проверяет записи, сервер и раздел во всех шести потребителях, включая IPsec. Все 36 E2E истории/WireGuard и TypeScript прошли; исходный lint страниц не изменился, новые общие файлы и тест чистые. Результат build — в журнале. Далее — форма инициализации IPsec (handleInit): подтверждение, сохранение ввода и повторные нажатия. Реальные устройства и payload восстановления rules/routes остаются вне проверки этого блока.

Блок 9.14 — инициализация IPsec (2026-09-29)

Проверяются схема сводки, serverId и initialized=true. Ошибка остаётся в форме с введёнными значениями; замок блокирует повтор, редактирование и закрытие во время запроса. Исправлен ввод IPv4, добавлены доступные имена. Новый E2E и 3 теста таблиц прошли, lint/TypeScript чистые. Далее — создание/редактирование пользователей IPsec. Реальные устройства и транзакционность сетевой операции не проверены; последний build — 9.13.

Блок 9.15 — пользователи IPsec (2026-09-29)

Создание проверяет схему клиента, сервер, имя и метод; редактирование требует ok=true. Форма сохраняет ввод и ошибку, блокирует повторы/закрытие/поля до ответа; добавлены доступные имена, сброс peer при смене сервера и проверка нового PSK. Все 7 E2E, lint и TypeScript прошли. Далее — загрузка/повторный экспорт сертификатов и контекст запросов. Реальные устройства и выпуск сертификатов не проверены; последний build — 9.13.

Блок 9.16 — сертификаты IPsec (2026-09-29)

Экспорт по identity/имени проверяет бандл, пароль и Base64; закрытая панель не принимает поздние ответы. Ошибка сохраняет панель для повтора; прежний архив сохраняет свой пароль при ошибке нового экспорта. Пароль только для чтения, скачивание заблокировано при запросе. Все 6 E2E, lint и TypeScript прошли; build — в журнале. Далее — удаление объектов IPsec. Реальный PKCS#12/RouterOS не проверен, сетевой запрос после закрытия не отменяется.

Блок 9.17 — удаление IPsec (2026-09-29)

Удаление клиента/сервера/peer/сертификата требует ok=true; диалог сохраняется при ошибке, блокирует повтор и закрытие до ответа. Принудительное удаление после 409 перенесено из toast в тот же диалог с общей защитой. Все 4 E2E прошли; lint/TypeScript — в журнале. Далее — редактирование peer IPsec. Реальные сетевые последствия не проверены, последний build — 9.16.

Блок 9.18 — peer IPsec (2026-09-29)

Сохранение требует ok=true; ошибка остаётся в форме вместе с вводом. Поля/переключатели, повторы и закрытие блокируются до ответа. Новый E2E, lint и TypeScript прошли. Далее — создание/изменение/удаление GRE. Загрузка данных IPsec и реальная сетевая приёмка остаются открытыми; последний build — 9.16.

Блок 9.19 — удаление GRE (2026-09-30)

Удаление требует ok=true; диалог сохраняет объект/ошибку, блокирует повторы и закрытие во время запроса. Проверки — в журнале. Далее — создание/изменение и переключение GRE. Реальное устройство не проверено, последний build — 9.16.

Блок 9.20 — переключение GRE (2026-09-30)

PATCH требует ok=true; замок блокирует повтор, ожидание и ошибка содержат имя туннеля. Все 3 E2E прошли, новых замечаний lint нет; TypeScript — в журнале. Далее — создание/редактирование GRE. Реальное устройство не проверено, последний build — 9.16.

Блок 9.21 — формы GRE (2026-09-30)

Создание проверяет ok/name либо поля подтверждённого объекта, PATCH требует ok=true. Ошибка сохраняет ввод, поля/повторы/закрытие заблокированы до ответа. Все 6 E2E прошли, остальные проверки — в журнале. Далее — VXLAN: загрузка, ошибка, повтор и URL-контекст. Полная схема GreTunnel, доступность остальных полей и реальные сетевые операции ещё требуют проверки.

Блок 9.22 — загрузка VXLAN (2026-09-30)

Повреждённый контейнер не превращается в пустой список; KPI до успеха неизвестны, ошибка обновления сохраняет данные. Добавлена защита поколением запроса. Прошли 11 E2E в двух прогонах, lint/TypeScript чистые. Далее — частичные сбои опроса VXLAN на backend и сохранение данных по устройству. Полная схема туннеля, отдельные тесты гонок и реальный RouterOS ещё не проверены; последний build — 9.21.

Блок 9.23 — частичный сбой VXLAN (2026-09-30)

API возвращает failures, одиночный endpoint — 502 при сбое; VTEP не маскируется пустым списком. UI сохраняет последние туннели устройства, показывает неизвестное состояние и повтор. Проверены серверная агрегация и 13 E2E, frontend/backend TypeScript и frontend lint прошли. Далее — схема payload и гонки загрузки VXLAN. Счётчик countVxlanTunnels всё ещё возвращает ноль при ошибке, timestamp и запись VXLAN не реализованы; реальные устройства не проверены.

Блок 9.24 — проверка данных VXLAN (2026-09-30)

Схемы отклоняют повреждённые записи/серверы/failures и дубли пары serverId/id. Все 16 E2E, lint и TypeScript прошли, включая поздний успех/ошибку при смене устройства. Далее — операции Firewall, затем Filters. Счётчик ошибок, timestamp и запись VXLAN остаются открытыми, последний build — 9.21; реальные устройства не проверены.

Блок 9.25 — переключение Firewall (2026-09-30)

PATCH правила требует ok=true, замок предотвращает повтор до обновления таблицы; статус/ошибка содержат контекст правила. Все 7 E2E и TypeScript прошли. Grid/тест lint-чистые, исходные замечания страницы сохранены. Далее — address-list и остальные мутации Firewall, общий замок ещё не распространён на них. Реальные устройства не проверены; последний build — 9.21.

Блок 9.26 — переключение address-list Firewall (2026-09-30)

PATCH требует ok=true, общий замок переключений предотвращает повтор до обновления. Ошибка сохраняет состояние записи и содержит адрес/список. Все 9 E2E и TypeScript прошли, новых замечаний lint нет. Далее — сохранение/удаление и перемещение Firewall; единая блокировка всех мутаций пока не внедрена. Реальные устройства не проверены; последний build — 9.21.

Блок 9.27 — удаление Firewall (2026-09-30)

Правила/address-list удаляются через общий диалог с контекстом устройства. DELETE требует ok=true; ошибка сохраняет диалог, повтор и закрытие блокируются до ответа. Все 13 E2E и TypeScript прошли, новых замечаний lint нет. Далее — формы и перемещение Firewall; остальные мутации и гонки загрузки ещё открыты. Реальные устройства не проверены; последний build — 9.21.

Блок 9.28 — формы Firewall (2026-09-30)

POST/PUT правил и address-list требуют ok=true. Ошибка сохраняет форму/ввод, повтор и закрытие блокируются во время запроса. Все 21 E2E и TypeScript прошли, новых замечаний lint нет. Далее — перемещение Firewall; восстановление истории, перемещение и гонки загрузки ещё требуют общей защиты. Реальные устройства не проверены; последний build — 9.21.

Блок 9.29 — перемещение Firewall (2026-09-30)

POST требует ok=true, ошибка возвращает исходный порядок. Общий mutationLock предотвращает конфликтующие операции до обновления списка. Все 23 E2E и TypeScript прошли, новых замечаний lint нет. Далее — общий замок восстановления истории и схема/гонки загрузки Firewall, затем Filters. Реальные устройства не проверены; последний build — 9.21.

Блок 9.30 — общий замок истории Firewall (2026-09-30)

Восстановление удерживает mutationLock до чтения правил и истории, ошибка освобождает замок. История/ручное обновление недоступны во время записи. Прошли 26 разных E2E в двух прогонах, TypeScript и lint тестов; исходные замечания страницы сохранены. Далее — схема/гонки загрузки Firewall, затем Filters. Реальные устройства не проверены; последний build — 9.21.