From 97936aa81e4ce4854a8fa2cef65903d23dfe9530 Mon Sep 17 00:00:00 2001 From: Denozordec Date: Sun, 4 Oct 2026 13:03:27 +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=20GRE-=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 --- .../data-grids/gre-tunnels-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-gre-320.png | Bin 0 -> 55744 bytes tests/e2e/large-gre.spec.ts | 31 +++++++++++++ 6 files changed, 83 insertions(+), 11 deletions(-) create mode 100644 docs/ux-ui/screens/large-gre-320.png create mode 100644 tests/e2e/large-gre.spec.ts diff --git a/components/data-grids/gre-tunnels-data-grid.tsx b/components/data-grids/gre-tunnels-data-grid.tsx index e13216c7..d24524b5 100644 --- a/components/data-grids/gre-tunnels-data-grid.tsx +++ b/components/data-grids/gre-tunnels-data-grid.tsx @@ -1,8 +1,8 @@ "use client" -import { dataGridFeatures, type DataGridFeatures } from "@/components/reui/data-grid" +import { DataGridContainer, DataGridScrollArea, DataGridTable, dataGridFeatures, type DataGridFeatures } from "@/components/reui/data-grid" -import { useMemo } from "react" +import { useEffect, useMemo } from "react" import { type ColumnDef, useTable, @@ -129,6 +129,7 @@ function GreTunnelsDataGrid({ () => [ { id: "name", + size: 160, accessorKey: "name", header: ({ column }) => ( @@ -138,7 +139,7 @@ function GreTunnelsDataGrid({ const srv = serverMap.get(t.serverId) return (
-

{t.name}

+

{t.name}

{srv && } {srv?.name ?? t.serverId} @@ -154,6 +155,7 @@ function GreTunnelsDataGrid({ }, { id: "endpoints", + size: 144, header: () => Эндпоинты, enableSorting: false, cell: ({ row }) => { @@ -175,6 +177,7 @@ function GreTunnelsDataGrid({ }, { id: "innerIp", + size: 136, header: () => Внутренний IP, enableSorting: false, cell: ({ row }) => { @@ -190,6 +193,7 @@ function GreTunnelsDataGrid({ }, { id: "pool", + size: 96, accessorKey: "poolId", header: ({ column }) => , cell: ({ row }) => ( @@ -201,6 +205,7 @@ function GreTunnelsDataGrid({ }, { id: "ipsec", + size: 112, header: () => IPsec, enableSorting: false, cell: ({ row }) => , @@ -208,6 +213,7 @@ function GreTunnelsDataGrid({ }, { id: "encryption", + size: 160, header: () => Шифрование, enableSorting: false, cell: ({ row }) => { @@ -236,6 +242,7 @@ function GreTunnelsDataGrid({ }, { id: "mtu", + size: 72, accessorKey: "mtu", header: ({ column }) => , cell: ({ row }) => ( @@ -249,6 +256,7 @@ function GreTunnelsDataGrid({ }, { id: "keepalive", + size: 104, header: () => Keepalive, enableSorting: false, cell: ({ row }) => { @@ -263,6 +271,7 @@ function GreTunnelsDataGrid({ }, { id: "status", + size: 112, accessorKey: "status", header: ({ column }) => , cell: ({ row }) => unknownServerIds?.has(row.original.serverId) ? Неизвестно : , @@ -281,9 +290,10 @@ function GreTunnelsDataGrid({ variant="ghost" size="icon" className={cn( - "size-7 opacity-0 transition-opacity group-hover/row:opacity-100 focus-visible:opacity-100", + "size-11 shrink-0", )} title="Предпросмотр кода RouterOS" + aria-label={`Просмотр кода: ${t.name}`} onClick={(e) => { e.stopPropagation() onCodePreview(t) @@ -299,8 +309,8 @@ function GreTunnelsDataGrid({ 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", + "opacity-100", "data-popup-open:opacity-100", )} aria-label={`Действия: ${t.name}`} @@ -338,7 +348,7 @@ function GreTunnelsDataGrid({

) }, - size: 88, + size: 112, meta: { headerClassName: DATA_GRID_CELL_PAD_LAST, cellClassName: DATA_GRID_CELL_PAD_LAST }, }, ], @@ -347,12 +357,20 @@ function GreTunnelsDataGrid({ 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: "group/row" }} - /> + > + + + + ) } diff --git a/docs/ux-ui-plan.md b/docs/ux-ui-plan.md index 2baad0eb..f989a3aa 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 принят локально: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Б сохраняются. +Этап 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 принят локально:GRE1000/50 DOM/pinning/20+1 browser/build. Следующий блок12.3.36: карта оставшихся специализированных источников и performance рисков; далее 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 3d3bc9bd..b3d89e8b 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 приняты локально; 12.3.34 VXLAN принят; остаются GRE/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 и12.3.35 GRE tunnels приняты; остаются network grids/общая регрессия после delta/внешняя приёмка | + +## 12.3.35 — большой каталог GRE-туннелей (2026-10-04) + +GET /api/gre/tunnels возвращает полный каталог без ограничения строк. ReUI client pagination50 ограничивает DOM; refresh сохраняет страницу, уменьшение/поиск корректирует её, MTU сортируется по всему каталогу. На320px имя закреплено, обе кнопки кода/меню видны без hover и имеют44px; composite identity и существующие permissions/mutation guards сохранены. + +Профиль1000 туннелей/351894 JSON bytes:50 строк/2748 DOM nodes/1609ms ready в dev с HTTP-моками.20 browser (large/links/freshness/toggle/delete/IPsec-GRE tables/layouts) прошли; large повторён1/1 с проверкой disabled edit/delete после503. Поиск записи1000, page20/refresh/global MTU sort, cache/page/unknown,320px/axe/pinning, устаревший export snapshot и1000→1 с точным MTU2399 проверены. TypeScript без incremental/ESLint прошли; production frontend build прошёл. [Снимок320px](ux-ui/screens/large-gre-320.png) просмотрен. + +Осталось15 manualPagination:true специализированных таблиц; GRE pools в live всегда пусты и доступны только как demo, поэтому их пагинация не приоритет для live. Firewall использует DnD исходного порядка; OSPF neighbors дополнительно рисует SVG topology. Следующий блок12.3.36: карта оставшихся источников/ограничений и безопасная последовательность performance доработок. Поиск GRE пока локальный; реальные RouterOS/PG и внешняя12.5 не проверены. Общая main/context регрессия после delta остаётся отдельной. Коммит локальный без push. ## 12.3.34 — большой каталог VXLAN (2026-10-04) diff --git a/docs/ux-ui-stage-12.md b/docs/ux-ui-stage-12.md index 4675f392..97c86a83 100644 --- a/docs/ux-ui-stage-12.md +++ b/docs/ux-ui-stage-12.md @@ -463,3 +463,12 @@ Scope proof ограничен HTTP-моками и read/toggle context сцен Осталось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.35 — большой каталог GRE-туннелей (2026-10-04) + +GET /api/gre/tunnels возвращает полный каталог без ограничения строк. ReUI client pagination50 ограничивает DOM; refresh сохраняет страницу, уменьшение/поиск корректирует её, MTU сортируется по всему каталогу. На320px имя закреплено, обе кнопки кода/меню видны без hover и имеют44px; composite identity и существующие permissions/mutation guards сохранены. + +Профиль1000 туннелей/351894 JSON bytes:50 строк/2748 DOM nodes/1609ms ready в dev с HTTP-моками.20 browser (large/links/freshness/toggle/delete/IPsec-GRE tables/layouts) прошли; large повторён1/1 с проверкой disabled edit/delete после503. Поиск записи1000, page20/refresh/global MTU sort, cache/page/unknown,320px/axe/pinning, устаревший export snapshot и1000→1 с точным MTU2399 проверены. TypeScript без incremental/ESLint прошли; production frontend build прошёл. [Снимок320px](ux-ui/screens/large-gre-320.png) просмотрен. + +Осталось15 manualPagination:true специализированных таблиц; GRE pools в live всегда пусты и доступны только как demo, поэтому их пагинация не приоритет для live. Firewall использует DnD исходного порядка; OSPF neighbors дополнительно рисует SVG topology. Следующий блок12.3.36: карта оставшихся источников/ограничений и безопасная последовательность performance доработок. Поиск GRE пока локальный; реальные RouterOS/PG и внешняя12.5 не проверены. Общая main/context регрессия после delta остаётся отдельной. Коммит локальный без push. + diff --git a/docs/ux-ui/screens/large-gre-320.png b/docs/ux-ui/screens/large-gre-320.png new file mode 100644 index 0000000000000000000000000000000000000000..41103da8abab10c04ad84d927c0ba7c072cddd3d GIT binary patch literal 55744 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 + test.setTimeout(90000) + let tunnels=Array.from({length:1000},(_,i)=>({id:"*"+(i+1),name:"gre-test-"+String(i+1).padStart(4,"0"),serverId:"1",localAddress:"192.0.2.1",remoteAddress:"198.51.100.1",localInnerIp:"10.0.0.1/30",remoteInnerIp:"10.0.0.2/30",poolId:"live",ipsec:null,mtu:1400+i,keepaliveInterval:10,keepaliveRetries:3,dscp:"inherit",clampTcpMss:true,allowFastPath: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/gre/tunnels"){calls++;return r.fulfill(failed?{status:503,json:{error:"Опрос GRE недоступен"}}:{json:greResponseSchema.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("/gre?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("GRE 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("gre-test-0951") + const before=calls;await page.getByRole("button",{name:"Обновить",exact:true}).click();await expect.poll(()=>calls).toBeGreaterThan(before);await expect(rows.first()).toContainText("gre-test-0951") + const search=page.getByPlaceholder("Поиск по имени, IP…");await search.fill("gre-test-1000");await expect(rows).toHaveCount(1);await expect(rows.first()).toContainText("gre-test-1000");await search.fill("");await expect(rows).toHaveCount(50) + await page.getByRole("table").getByRole("button",{name:"MTU",exact:true}).click();await expect(rows.first()).toContainText("gre-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.getByRole("alert").filter({hasText:"Опрос GRE недоступен"})).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("gre-320.png"),animations:"disabled"}) + await action.click();await expect(page.getByRole("menuitem",{name:"Редактировать",exact:true})).toBeDisabled();await expect(page.getByRole("menuitem",{name:"Удалить туннель",exact:true})).toBeDisabled();await page.getByRole("menuitem",{name:"Просмотр кода",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("gre-test-1000") + await action.click();await page.getByRole("menuitem",{name:"Просмотр кода",exact:true}).click();await expect(page.getByRole("dialog")).toContainText("2399");await expect(page.getByRole("dialog")).toContainText("gre-test-1000");expect(writes).toEqual([]) +})