From dcc8550482c0756f6d89d6d3729b4417b3b7ed21 Mon Sep 17 00:00:00 2001 From: Denozordec Date: Sun, 4 Oct 2026 12:57:34 +0700 Subject: [PATCH] =?UTF-8?q?fix(ui):=20=D0=BE=D0=B3=D1=80=D0=B0=D0=BD=D0=B8?= =?UTF-8?q?=D1=87=D0=B8=D1=82=D1=8C=20=D0=BE=D1=82=D0=BE=D0=B1=D1=80=D0=B0?= =?UTF-8?q?=D0=B6=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BA=D0=B0=D1=82=D0=B0=D0=BB?= =?UTF-8?q?=D0=BE=D0=B3=D0=B0=20VXLAN-=D1=82=D1=83=D0=BD=D0=BD=D0=B5=D0=BB?= =?UTF-8?q?=D0=B5=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/data-grids/vxlan-data-grid.tsx | 42 ++++++++++++++++------ docs/ux-ui-plan.md | 2 +- docs/ux-ui-progress.md | 10 +++++- docs/ux-ui-stage-12.md | 9 +++++ docs/ux-ui/screens/large-vxlan-320.png | Bin 0 -> 62468 bytes tests/e2e/large-vxlan.spec.ts | 31 ++++++++++++++++ 6 files changed, 82 insertions(+), 12 deletions(-) create mode 100644 docs/ux-ui/screens/large-vxlan-320.png create mode 100644 tests/e2e/large-vxlan.spec.ts diff --git a/components/data-grids/vxlan-data-grid.tsx b/components/data-grids/vxlan-data-grid.tsx index e47cc2e6..0be0c235 100644 --- a/components/data-grids/vxlan-data-grid.tsx +++ b/components/data-grids/vxlan-data-grid.tsx @@ -1,7 +1,7 @@ "use client" -import { useMemo } from "react" -import { dataGridFeatures, type DataGridFeatures } from "@/components/reui/data-grid" +import { useEffect, useMemo } from "react" +import { DataGridContainer, DataGridScrollArea, DataGridTable, dataGridFeatures, type DataGridFeatures } from "@/components/reui/data-grid" import { type ColumnDef, useTable, @@ -47,6 +47,7 @@ function VxlanDataGrid({ tunnels, servers, onExport, failedServerIds = [] }: Vxl () => [ { id: "name", + size: 176, accessorKey: "name", header: ({ column }) => ( @@ -58,12 +59,12 @@ function VxlanDataGrid({ tunnels, servers, onExport, failedServerIds = [] }: Vxl
-

{t.name}

-

VTEP: {t.vtepIp}

+

{t.name}

+

VTEP: {t.vtepIp}

) @@ -76,6 +77,7 @@ function VxlanDataGrid({ tunnels, servers, onExport, failedServerIds = [] }: Vxl }, { id: "server", + size: 128, accessorKey: "serverId", header: ({ column }) => , cell: ({ row }) => { @@ -96,6 +98,7 @@ function VxlanDataGrid({ tunnels, servers, onExport, failedServerIds = [] }: Vxl }, { id: "vni", + size: 80, accessorKey: "vni", header: ({ column }) => , cell: ({ row }) => {row.original.vni}, @@ -107,6 +110,7 @@ function VxlanDataGrid({ tunnels, servers, onExport, failedServerIds = [] }: Vxl }, { id: "dstPort", + size: 104, accessorKey: "dstPort", header: ({ column }) => , cell: ({ row }) => {row.original.dstPort}, @@ -118,6 +122,7 @@ function VxlanDataGrid({ tunnels, servers, onExport, failedServerIds = [] }: Vxl }, { id: "remoteVteps", + size: 160, header: () => ( Remote ), @@ -133,6 +138,7 @@ function VxlanDataGrid({ tunnels, servers, onExport, failedServerIds = [] }: Vxl }, { id: "arpProxy", + size: 104, accessorKey: "arpProxy", header: () => ARP, enableSorting: false, @@ -152,6 +158,7 @@ function VxlanDataGrid({ tunnels, servers, onExport, failedServerIds = [] }: Vxl }, { id: "macLearning", + size: 128, accessorKey: "macLearning", header: () => MAC, enableSorting: false, @@ -171,6 +178,7 @@ function VxlanDataGrid({ tunnels, servers, onExport, failedServerIds = [] }: Vxl }, { id: "status", + size: 104, accessorKey: "status", header: ({ column }) => , cell: ({ row }) => ( @@ -208,8 +216,8 @@ function VxlanDataGrid({ tunnels, servers, onExport, failedServerIds = [] }: Vxl variant="outline" size="icon" className={cn( - "size-8 shrink-0 border-border/60 bg-background/80 text-muted-foreground shadow-none", - "opacity-0 transition-opacity group-hover/row:opacity-100 focus-visible:opacity-100", + "size-11 shrink-0 border-border/60 bg-background/80 text-muted-foreground shadow-none", + "transition-colors", "data-popup-open:opacity-100", )} aria-label={`Действия: ${tunnel.name}`} @@ -229,7 +237,7 @@ function VxlanDataGrid({ tunnels, servers, onExport, failedServerIds = [] }: Vxl ) }, enableSorting: false, - size: 56, + size: 72, meta: { headerClassName: DATA_GRID_CELL_PAD_LAST, cellClassName: DATA_GRID_CELL_PAD_LAST, @@ -241,12 +249,20 @@ function VxlanDataGrid({ tunnels, servers, onExport, failedServerIds = [] }: Vxl const table = useTable({ features: dataGridFeatures, - manualPagination: true, + manualPagination: false, + autoResetPageIndex: false, + initialState: { pagination: { pageIndex: 0, pageSize: 50 }, columnPinning: { start: ["name"], end: [] } }, data: tunnels, columns, getRowId: (row) => JSON.stringify([row.serverId, row.id]), }) + const { pageIndex, pageSize } = table.state.pagination + useEffect(() => { + const lastPage = Math.max(0, Math.ceil(tunnels.length / pageSize) - 1) + if (pageIndex > lastPage) table.setPageIndex(lastPage) + }, [tunnels.length, pageIndex, pageSize, table]) + if (tunnels.length === 0) { return ( 50 || pageSize !== 50} + tableLayout={{ dense: true, columnsPinnable: true }} tableClassNames={{ headerRow: "border-b border-border", bodyRow: cn("group/row", "[&[data-disabled=true]]:opacity-50"), }} - /> + > + + + + ) } diff --git a/docs/ux-ui-plan.md b/docs/ux-ui-plan.md index a1a3e8d5..2baad0eb 100644 --- a/docs/ux-ui-plan.md +++ b/docs/ux-ui-plan.md @@ -4,7 +4,7 @@ ## Актуальная точка продолжения — 2026-10-04 -Этап 11Б завершён в границах локальной приёмки (11Б.7); внешний выпуск не проверен. 12.1 принят локально: доступность оболочки/клавиатура/health в описанных сценариях. 12.2.1 принят локально: strict BGP catalog/partial/nullable counters. 12.2.2 принят локально: strict traffic DTO и агрегация без выдуманных точек. 12.2.3 принят локально: observations для server traffic от backend до dashboard. 12.2.4 принят локально: strict servers/probes и unknown server status. 12.2.5 принят локально: реальные ping samples/unknown/ось RTT/Recharts. 12.2.6 принят локально: strict GRE/WireGuard/VXLAN и device failures. 12.2.7 принят локально: strict Internet path snapshot/fallback. 12.2.8 принят локально: подтверждение полного backend сбора. 12.2.9 принят локально: метрики участков и наблюдаемый WAN без эвристической подмены. 12.3.1 принят локально:1000 серверов/штатная пагинация. 12.3.2 принят локально: пагинация CompactDataGrid/1000 строк статистики. 12.3.3 принят локально: порционный DOM очереди проблем. 12.3.4 принят локально: большой BGP каталог/страница при обновлении. Production build и123 профильных browser приняты локально на3978976. 12.2.10 принят локально: обязательные RouterOS поля. 12.3.5 принят локально: страница CompactDataGrid сохраняется при опросе,89 browser и повторный production build прошли. 12.3.6 сохранён: baseline1000 speed probes (ограничение DOM пока не выполнено). 12.3.7 принят локально:50 строк speed-проб/сохранение страницы/глобальная сортировка/1000→1; каталог1001 устройства остаётся в DOM. 12.3.8 принят локально:50 строк ресурсов, URL/поиск/сохранение страницы/1000→1; исправлена pagination оболочки с children, production build и8 больших browser прошли. 12.3.9 принят локально:порционное раскрытие1000 предупреждений ресурсов/клавиатура/axe; исходная ошибка ESLint speedDraft подтверждена. 12.3.10 принят локально:недоступные интерфейсы очищаются в обработчиках,54 browser/полный ESLint/production build прошли. 12.3.11 принят локально:ServerTileRail50 устройств/URL/поиск/клавиатура/две площадки/mobile Sheet/axe обе темы;47 browser и production build прошли. 12.3.12 принят локально:BGP ручная страница при выбранной URL сессии/refresh/reload,16 browser/build прошли. 12.4.1 записан:main1091 сценарий/1088 passed/3 устаревших fixtures; оба исправленных файла6 passed. 12.4.2 принят локально:context205/24 файла и unit28 прошли. 12.3.13 принят локально:wide pivot51×16/ScrollArea/axe/24+2 browser/builds. 12.3.14 принят локально:history200/50 DOM/54+1 browser/build. 12.3.15 принят локально:live расписание1000/page20 error cache/15 browser. 12.3.16 принят локально:certificates1000/50 DOM/refresh деталей/19+3 browser/build. 12.3.17 принят локально:pinning идентификатора/видимость значений/29 browser/build. 12.3.18 принят локально:users1000/поиск всего списка/детали и ошибка refresh/32 browser/build. 12.3.19 принят локально:backups1000/все мобильные действия/возврат focus/39+4 browser/build. 12.3.20 принят локально:независимые speed GET/cache/freshness/58+4 browser/build. 12.3.21 принят локально:strict history DTO/null rates от DB до UI/60+5 browser/unit4/builds. 12.4.3 принят локально:users/backups delta context36 на a558412. 12.3.22 принят локально:shared speed-probes DTO/context8/60+6+47 browser/unit5/builds. 12.3.23 принят локально:strict write DTO/atomic replacement/confirmed scheduler warning/65 browser/HTTP DI JWT/builds. 12.3.24 принят локально:OSPF routes1000/50 DOM/page20/cache/320px/22+1 browser/build. 12.3.25 принят локально:BFD1000/50 DOM/cache/320px/12 browser/build. 12.4.4 принят локально:context213/25 файлов и unit36 прошли на5b2a291. 12.4.5 принят локально:main1110/171 прошли на21859be. 12.3.26 принят локально:strict atomic Ping write/подтверждение каталога и сохранения/история удаления/62 browser/context11/DI6/builds. 12.3.27 принят локально:WireGuard zero/missing counters/UI/backend mapper/29 browser/unit/builds. 12.3.28 принят локально:WireGuard interfaces1000/50 DOM/pinning/actions/cache/29+1 browser/build. 12.3.29 принят локально:WG peers1000/50 DOM/pinning/точный delete target/29+3 browser/build. 12.3.30 принят локально:WG detail1000/50 DOM/320px/клавиатура/31+1 browser/build. 12.3.31 принят локально:WG handshake без ложного online/unknown/7+1 browser/build. 12.3.32 принят локально:WG URL search/tab/status/reload/история/34+4 browser/unit/build. 12.3.33 принят локально:WG strict read/cache/freshness/unknown/40+7 browser/context8/build. Следующий блок12.3.34: большой каталог VXLAN; далее network grids и полная main/context регрессия.12.5 отдельно. См. docs/ux-ui-stage-12.md. Внешние ограничения 11Б сохраняются. +Этап 11Б завершён в границах локальной приёмки (11Б.7); внешний выпуск не проверен. 12.1 принят локально: доступность оболочки/клавиатура/health в описанных сценариях. 12.2.1 принят локально: strict BGP catalog/partial/nullable counters. 12.2.2 принят локально: strict traffic DTO и агрегация без выдуманных точек. 12.2.3 принят локально: observations для server traffic от backend до dashboard. 12.2.4 принят локально: strict servers/probes и unknown server status. 12.2.5 принят локально: реальные ping samples/unknown/ось RTT/Recharts. 12.2.6 принят локально: strict GRE/WireGuard/VXLAN и device failures. 12.2.7 принят локально: strict Internet path snapshot/fallback. 12.2.8 принят локально: подтверждение полного backend сбора. 12.2.9 принят локально: метрики участков и наблюдаемый WAN без эвристической подмены. 12.3.1 принят локально:1000 серверов/штатная пагинация. 12.3.2 принят локально: пагинация CompactDataGrid/1000 строк статистики. 12.3.3 принят локально: порционный DOM очереди проблем. 12.3.4 принят локально: большой BGP каталог/страница при обновлении. Production build и123 профильных browser приняты локально на3978976. 12.2.10 принят локально: обязательные RouterOS поля. 12.3.5 принят локально: страница CompactDataGrid сохраняется при опросе,89 browser и повторный production build прошли. 12.3.6 сохранён: baseline1000 speed probes (ограничение DOM пока не выполнено). 12.3.7 принят локально:50 строк speed-проб/сохранение страницы/глобальная сортировка/1000→1; каталог1001 устройства остаётся в DOM. 12.3.8 принят локально:50 строк ресурсов, URL/поиск/сохранение страницы/1000→1; исправлена pagination оболочки с children, production build и8 больших browser прошли. 12.3.9 принят локально:порционное раскрытие1000 предупреждений ресурсов/клавиатура/axe; исходная ошибка ESLint speedDraft подтверждена. 12.3.10 принят локально:недоступные интерфейсы очищаются в обработчиках,54 browser/полный ESLint/production build прошли. 12.3.11 принят локально:ServerTileRail50 устройств/URL/поиск/клавиатура/две площадки/mobile Sheet/axe обе темы;47 browser и production build прошли. 12.3.12 принят локально:BGP ручная страница при выбранной URL сессии/refresh/reload,16 browser/build прошли. 12.4.1 записан:main1091 сценарий/1088 passed/3 устаревших fixtures; оба исправленных файла6 passed. 12.4.2 принят локально:context205/24 файла и unit28 прошли. 12.3.13 принят локально:wide pivot51×16/ScrollArea/axe/24+2 browser/builds. 12.3.14 принят локально:history200/50 DOM/54+1 browser/build. 12.3.15 принят локально:live расписание1000/page20 error cache/15 browser. 12.3.16 принят локально:certificates1000/50 DOM/refresh деталей/19+3 browser/build. 12.3.17 принят локально:pinning идентификатора/видимость значений/29 browser/build. 12.3.18 принят локально:users1000/поиск всего списка/детали и ошибка refresh/32 browser/build. 12.3.19 принят локально:backups1000/все мобильные действия/возврат focus/39+4 browser/build. 12.3.20 принят локально:независимые speed GET/cache/freshness/58+4 browser/build. 12.3.21 принят локально:strict history DTO/null rates от DB до UI/60+5 browser/unit4/builds. 12.4.3 принят локально:users/backups delta context36 на a558412. 12.3.22 принят локально:shared speed-probes DTO/context8/60+6+47 browser/unit5/builds. 12.3.23 принят локально:strict write DTO/atomic replacement/confirmed scheduler warning/65 browser/HTTP DI JWT/builds. 12.3.24 принят локально:OSPF routes1000/50 DOM/page20/cache/320px/22+1 browser/build. 12.3.25 принят локально:BFD1000/50 DOM/cache/320px/12 browser/build. 12.4.4 принят локально:context213/25 файлов и unit36 прошли на5b2a291. 12.4.5 принят локально:main1110/171 прошли на21859be. 12.3.26 принят локально:strict atomic Ping write/подтверждение каталога и сохранения/история удаления/62 browser/context11/DI6/builds. 12.3.27 принят локально:WireGuard zero/missing counters/UI/backend mapper/29 browser/unit/builds. 12.3.28 принят локально:WireGuard interfaces1000/50 DOM/pinning/actions/cache/29+1 browser/build. 12.3.29 принят локально:WG peers1000/50 DOM/pinning/точный delete target/29+3 browser/build. 12.3.30 принят локально:WG detail1000/50 DOM/320px/клавиатура/31+1 browser/build. 12.3.31 принят локально:WG handshake без ложного online/unknown/7+1 browser/build. 12.3.32 принят локально:WG URL search/tab/status/reload/история/34+4 browser/unit/build. 12.3.33 принят локально:WG strict read/cache/freshness/unknown/40+7 browser/context8/build. 12.3.34 принят локально:VXLAN1000/50 DOM/pinning/export/22 browser/build. Следующий блок12.3.35: большой каталог GRE tunnels; далее network grids и полная main/context регрессия.12.5 отдельно. См. docs/ux-ui-stage-12.md. Внешние ограничения 11Б сохраняются. Реальные pg_dump/pg_restore, PG rollback и остановка UDP worker требуют внешней приёмки. Датированные продолжения ниже — история; точный следующий шаг также указан в начале [журнала](ux-ui-progress.md). diff --git a/docs/ux-ui-progress.md b/docs/ux-ui-progress.md index d2bf96aa..3d3bc9bd 100644 --- a/docs/ux-ui-progress.md +++ b/docs/ux-ui-progress.md @@ -29,7 +29,15 @@ | 10 | Маршрутизация, диагностика, карта и терминал | Завершён в границах локальной приёмки 2026-10-01; блоки 10.1–10.71, внешние ограничения в 10.71 | | 11А | Пользователи, контейнеры, сертификаты и резервные копии | Завершён в границах локальной приёмки 2026-10-01; 11А.1–11А.33, внешние ограничения в 11А.33 | | 11Б | Оповещения, сбор данных, интеграции, релизы и настройки | Завершён в границах локальной приёмки 2026-10-03; ограничения и evidence в11Б.7 | -| 12 | Итоговая доступность, адаптивность, производительность и регрессия | В работе;12.1/12.2.1–12.2.10 и12.3.1–12.3.5 и12.3.7–12.3.12 приняты в описанных локальных границах;12.4.1 main регрессия и профильный повтор записаны;12.4.2 context205 и unit28 прошли;12.3.13–12.3.25 приняты локально в описанных границах;12.4.4 context213 и12.4.5 main1110 прошли, 12.3.26–12.3.33 приняты локально; остаются VXLAN/network grids/общая регрессия после delta/внешняя приёмка | +| 12 | Итоговая доступность, адаптивность, производительность и регрессия | В работе;12.1/12.2.1–12.2.10 и12.3.1–12.3.5 и12.3.7–12.3.12 приняты в описанных локальных границах;12.4.1 main регрессия и профильный повтор записаны;12.4.2 context205 и unit28 прошли;12.3.13–12.3.25 приняты локально в описанных границах;12.4.4 context213 и12.4.5 main1110 прошли, 12.3.26–12.3.33 приняты локально; 12.3.34 VXLAN принят; остаются GRE/network grids/общая регрессия после delta/внешняя приёмка | + +## 12.3.34 — большой каталог VXLAN (2026-10-04) + +Полный /vxlan API не ограничен страницей. Таблица использует client pagination50, global sort, сохранение страницы при refresh и clamp после поиска/сокращения. ReUI ScrollArea/start pinning сохраняют имя/VTEP на320px; длинные значения переносятся, меню экспорта видно без hover и имеет44px цель. Composite server/tunnel ID и неизменяемый export snapshot сохранены. + +Профиль1000 туннелей/227787 JSON bytes:50 строк/2137 DOM nodes/1249ms ready в локальном dev с HTTP-моками. Проверены page20/refresh, поиск записи1000/глобальный VNI sort,503/cache/unknown/page,320px/закрепление имени/axe, экспорт устаревшего snapshot и1000→1 с точным VNI1000.22 browser (large/table/links/freshness/GRE-VXLAN layouts) прошли. TypeScript без incremental/ESLint и production frontend build прошли. [Снимок320px](ux-ui/screens/large-vxlan-320.png) просмотрен. + +Осталось16 manualPagination:true specialized grids, включая bounded/demo источники. VXLAN поиск пока локальный; server/tunnel URL контекст сохранён. Следующий блок12.3.35: GRE tunnels1000/50 DOM/search/sort/refresh/действия/320px. OSPF neighbors сопровождаются большим SVG графом, поэтому ограничение одной таблицы не докажет производительность всего экрана; отдельный аудит topology остаётся. Общая main/context после delta и внешняя12.5 отдельно. Коммит локальный без push. ## 12.3.33 — достоверное чтение и контекст WireGuard (2026-10-04) diff --git a/docs/ux-ui-stage-12.md b/docs/ux-ui-stage-12.md index 7554d13a..4675f392 100644 --- a/docs/ux-ui-stage-12.md +++ b/docs/ux-ui-stage-12.md @@ -454,3 +454,12 @@ Mounted/revision guards исключают позднее чтение/ошиб Scope proof ограничен HTTP-моками и read/toggle context сценариями; реальный RouterOS/PG не проверены. Backend fallback running/disabled/type и остальные source-context операции требуют дальнейшего аудита, strict frontend не доказывает достоверность отсутствующих raw RouterOS flags. Следующий блок12.3.34: VXLAN1000/50 DOM/refresh/search/sort/export/320px; затем остальные17 specialized grids и общая main/context приёмка. Внешняя12.5 отдельно. Коммит локальный без push. + +## 12.3.34 — большой каталог VXLAN (2026-10-04) + +Полный /vxlan API не ограничен страницей. Таблица использует client pagination50, global sort, сохранение страницы при refresh и clamp после поиска/сокращения. ReUI ScrollArea/start pinning сохраняют имя/VTEP на320px; длинные значения переносятся, меню экспорта видно без hover и имеет44px цель. Composite server/tunnel ID и неизменяемый export snapshot сохранены. + +Профиль1000 туннелей/227787 JSON bytes:50 строк/2137 DOM nodes/1249ms ready в локальном dev с HTTP-моками. Проверены page20/refresh, поиск записи1000/глобальный VNI sort,503/cache/unknown/page,320px/закрепление имени/axe, экспорт устаревшего snapshot и1000→1 с точным VNI1000.22 browser (large/table/links/freshness/GRE-VXLAN layouts) прошли. TypeScript без incremental/ESLint и production frontend build прошли. [Снимок320px](ux-ui/screens/large-vxlan-320.png) просмотрен. + +Осталось16 manualPagination:true specialized grids, включая bounded/demo источники. VXLAN поиск пока локальный; server/tunnel URL контекст сохранён. Следующий блок12.3.35: GRE tunnels1000/50 DOM/search/sort/refresh/действия/320px. OSPF neighbors сопровождаются большим SVG графом, поэтому ограничение одной таблицы не докажет производительность всего экрана; отдельный аудит topology остаётся. Общая main/context после delta и внешняя12.5 отдельно. Коммит локальный без push. + diff --git a/docs/ux-ui/screens/large-vxlan-320.png b/docs/ux-ui/screens/large-vxlan-320.png new file mode 100644 index 0000000000000000000000000000000000000000..f7954416be9fd40b51c42fae45585563d431202f GIT binary patch literal 62468 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 @?3ewq%|t6q)a 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%0AZbB)Ji(1ntZ6>)$G3h*{8K2J_F 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 literal 0 HcmV?d00001 diff --git a/tests/e2e/large-vxlan.spec.ts b/tests/e2e/large-vxlan.spec.ts new file mode 100644 index 00000000..7e06c66a --- /dev/null +++ b/tests/e2e/large-vxlan.spec.ts @@ -0,0 +1,31 @@ +import { test, expect } from "@playwright/test" +import { vxlanResponseSchema } from "../../lib/vxlan-response" +import axe from "axe-core" +test("VXLAN1000: page/refresh/full search/sort/cache/export/320px",async({page},info)=>{ + test.setTimeout(90000) + let tunnels=Array.from({length:1000},(_,i)=>({id:"*"+(i+1),name:"vx-test-"+String(i+1).padStart(4,"0"),serverId:"1",vni:i+1,port:0,dstPort:8472,vtepIp:"192.0.2.1",remoteVteps:["198.51.100.1"],l2mtu:1500,arpProxy:false,macLearning:true,comment:"",enabled:true,status:"up"})) + let failed=false,calls=0;const writes:string[]=[] + await page.route("**/health",r=>r.fulfill({json:{ok:true}})) + await page.route("**/api/**",r=>{const p=new URL(r.request().url()).pathname;if(r.request().method()!=="GET")writes.push(p);if(p==="/api/vxlan"){calls++;return r.fulfill(failed?{status:503,json:{error:"Опрос VXLAN недоступен"}}:{json:vxlanResponseSchema.parse({tunnels})})}return r.fulfill({json:p==="/api/auth/config"?{required:false}:p==="/api/servers"?[{id:1,name:"Роутер",host:"192.0.2.1",country:"RU",enabled:true,status:null}]:{}})}) + const started=Date.now();await page.goto("/vxlan?server=1&keep=1") + const rows=page.locator("tr[data-row-id]");await expect(rows).toHaveCount(50) + const profile={count:tunnels.length,jsonBytes:Buffer.byteLength(JSON.stringify(tunnels)),rows:await rows.count(),nodes:await page.locator("*").count(),readyMs:Date.now()-started};console.log("VXLAN profile",JSON.stringify(profile));await info.attach("profile",{body:JSON.stringify(profile),contentType:"application/json"}) + const next=page.getByRole("button",{name:"Следующая страница",exact:true}) + for(let i=0;i<19;i++)await next.click() + await expect(next).toBeDisabled();await expect(rows.first()).toContainText("vx-test-0951") + const before=calls;await page.getByRole("button",{name:"Обновить",exact:true}).click();await expect.poll(()=>calls).toBeGreaterThan(before);await expect(rows.first()).toContainText("vx-test-0951") + const search=page.getByPlaceholder("Поиск по имени, VNI, серверу…");await search.fill("vx-test-1000");await expect(rows).toHaveCount(1);await expect(rows.first()).toContainText("vx-test-1000");await search.fill("");await expect(rows).toHaveCount(50) + await page.getByRole("table").getByRole("button",{name:"VNI",exact:true}).click();await expect(rows.first()).toContainText("vx-test-1000") + await next.click();const previous=await rows.first().getAttribute("data-row-id") + failed=true;await page.getByRole("button",{name:"Обновить",exact:true}).click();await expect(page.getByText("Ошибка загрузки: Опрос VXLAN недоступен",{exact:true})).toBeVisible();await expect(rows).toHaveCount(50);await expect(rows.first()).toHaveAttribute("data-row-id",previous!);await expect(rows.first()).toContainText("Неизвестно") + await page.setViewportSize({width:320,height:1000}) + const action=rows.first().getByRole("button",{name:/Действия:/}),scroll=page.locator('[data-slot="data-grid"] [data-slot="scroll-area-viewport"]') + await action.scrollIntoViewIfNeeded();await scroll.evaluate(el=>{el.scrollLeft=el.scrollWidth});await expect(action).toBeInViewport() + expect(await rows.first().getByRole("cell").first().evaluate(el=>{const a=el.getBoundingClientRect(),v=el.closest('[data-slot="scroll-area-viewport"]')!.getBoundingClientRect();return a.left>=v.left-1&&a.right<=v.right+1})).toBe(true) + await expect.poll(()=>page.evaluate(()=>document.documentElement.scrollWidth)).toBeLessThanOrEqual(320) + await page.addScriptTag({content:axe.source});expect((await page.evaluate(async()=>(window as unknown as {axe:typeof axe}).axe.run(document.querySelector('[data-slot="data-grid"]')!,{runOnly:{type:"tag",values:["wcag2a","wcag2aa","wcag21a","wcag21aa"]}}))).violations).toEqual([]) + await page.addStyleTag({content:"nextjs-portal{display:none!important}"});await page.screenshot({path:info.outputPath("vxlan-320.png"),animations:"disabled"}) + await action.click();await page.getByRole("menuitem",{name:"Экспорт .rsc",exact:true}).click();await expect(page.getByRole("dialog")).toContainText("актуальность не подтверждена");await page.keyboard.press("Escape") + failed=false;tunnels=[tunnels[999]];await page.getByRole("button",{name:"Обновить",exact:true}).click();await expect(rows).toHaveCount(1);await expect(rows.first()).toContainText("vx-test-1000") + await action.click();await page.getByRole("menuitem",{name:"Экспорт .rsc",exact:true}).click();await expect(page.getByRole("dialog")).toContainText("vni=1000");await expect(page.getByRole("dialog")).toContainText("vx-test-1000");expect(writes).toEqual([]) +})