From 8e3b7a65ce8cbceabae8c3205f9477052c5e4040 Mon Sep 17 00:00:00 2001 From: Denozordec Date: Sun, 4 Oct 2026 23:43:57 +0700 Subject: [PATCH] =?UTF-8?q?fix(ui):=20=D1=81=D0=BE=D0=BA=D1=80=D0=B0=D1=82?= =?UTF-8?q?=D0=B8=D1=82=D1=8C=20=D1=81=D0=B2=D0=BE=D0=B4=D0=BA=D1=83=20?= =?UTF-8?q?=D0=B1=D0=BE=D0=BB=D1=8C=D1=88=D0=BE=D0=B3=D0=BE=20=D1=81=D0=BF?= =?UTF-8?q?=D0=B8=D1=81=D0=BA=D0=B0=20WAN?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/(main)/route-optimizer/page.tsx | 3 ++- docs/ux-ui-performance.md | 9 +++++++++ docs/ux-ui-plan.md | 2 +- docs/ux-ui-progress.md | 4 ++-- docs/ux-ui-stage-12.md | 9 +++++++++ docs/ux-ui/screens/optimizer-wan-summary-320.png | Bin 0 -> 8266 bytes tests/e2e/large-optimizer-wan-matrix.spec.ts | 11 ++++++++++- 7 files changed, 33 insertions(+), 5 deletions(-) create mode 100644 docs/ux-ui/screens/optimizer-wan-summary-320.png diff --git a/app/(main)/route-optimizer/page.tsx b/app/(main)/route-optimizer/page.tsx index 6fbcc1bc..e0539509 100644 --- a/app/(main)/route-optimizer/page.tsx +++ b/app/(main)/route-optimizer/page.tsx @@ -298,7 +298,8 @@ function HomeRouterCard({ entry, jumpHosts, pinned, applied, applying, onPin, on {home.model}
- {home.wans.map(w => `${w.name} (${w.isp} · ${w.ip})`).join(" · ")} + {home.wans.slice(0,3).map(w => `${w.name} (${w.isp} · ${w.ip})`).join(" · ")} + {home.wans.length>3&&

Ещё {home.wans.length-3} WAN. Все {home.wans.length} аплинков — во вкладке WAN × JH.

}
diff --git a/docs/ux-ui-performance.md b/docs/ux-ui-performance.md index a2b0f388..9f925bf3 100644 --- a/docs/ux-ui-performance.md +++ b/docs/ux-ui-performance.md @@ -154,3 +154,12 @@ WAN1000×JH1:1000→50rows,28019→1419tableDOM,28712→2149pageDOM,2264ms dev-r 1000source→50 rendered/1024tableDOM/1751pageDOM/1851ms dev-ready; раньше24 rendered соответствовали24 в модели,976 правил терялись. Проверены page20 и правило1000/search/unknown indices безExit/no simulation buttons/refresh/clamp1/320px/pinned column/axe.7 main browser,8 pure tests (1200 assignment fixtures и новый1000 ownership/unknown), TypeScript, targeted lint и production build прошли. Снимок docs/ux-ui/screens/optimizer-community-320.png просмотрен. Осталось5manualPagination:true: scheduler11 fixedkeys, live GRE pools пусты/demo ограничен fixtures, probes schedule толькоdemo, subusers не подключён, trafficflows серверныйtop50 принят с честным указанием среза. Не мигрировать искусственно недостижимые live каталоги. Дальше12.4.6/12.4.7 — повтор общей main/context матрицы после delta. Внешняя12.5 не выполнена. + + +## 12.3.64 — компактная текстовая сводка WAN + +2026-10-04. Baseline1000WAN:31783chars/13695px высоты summary на320px, хотя grid уже50rows/1419DOM. В HomeCard теперь preview первых3 WAN с прежними ISP/IP, точный remaining/total и понятная ссылка в copy на существующую вкладку WAN×JH. Для ≤3WAN описание не сокращено. Исходный массив/расчёт/поиск/таблица не срезаются. + +Final1000WAN:134chars/86.5px высоты summary; WAN10:130chars/86.5px. В тест добавлены реальные размеры/длина preview, точные counts и мобильный snapshot.12 profile browser +1 screenshot repeat, full ESLint страницы/test и production build прошли. Полный search WAN1000, последняя страница, refresh/clamp/pinnedWAN/320px/axe сохранены. Снимок docs/ux-ui/screens/optimizer-wan-summary-320.png просмотрен;9 historical optimizer PNG восстановлены по явному списку. + +Общие main/context доказательства относятся к прежним HEAD; этот небольшой текстовый delta проверен профильными сценариями. Исторический context-delta(a558412/36) сохранён отдельно от нового context-final-delta(b1f8326/221), чтобы ссылки12.4.3 не изменили смысл. Следующий12.3.65 — pure CPU7WAN×1000pool с hard timeout; не запускать в UI. KPI captions/native selector и худшая DFS/full-route комбинация не приняты этим блоком. Внешняя12.5 остаётся. diff --git a/docs/ux-ui-plan.md b/docs/ux-ui-plan.md index c2864755..2aa248a4 100644 --- a/docs/ux-ui-plan.md +++ b/docs/ux-ui-plan.md @@ -1,6 +1,6 @@ # План реализации UX/UI по пятичасовым окнам -Актуальное продолжение 2026-10-04: 12.4.7 context221/26 passed наb1f8326; main1161/1162 и focus fix20+15 записаны. Следующий12.3.64: измерить/ограничить текстовую сводку1000WAN; затем дополнительные CPU-профили и внешняя12.5. Недельной квоты1%. +Актуальное продолжение 2026-10-04: 12.3.64 завершён: сводка1000WAN13695→86.5px/134chars, полный каталог сохранён;12+1browser/lint/build passed. Следующий12.3.65: CPU7WAN×1000 probes в child с timeout, без запуска тяжёлого расчёта в UI; затем KPI captions/внешняя12.5. Main1161/1162+focus fix20+15,context221/26 записаны. Общий план проекта MikrotikManager. Основан на согласованном плане из задачи; точка продолжения обновлена 2026-10-04. Источник фактического прогресса, проверок и ограничений — [журнал реализации](ux-ui-progress.md). Этот документ задаёт объём и критерии завершения, журнал фиксирует результат. diff --git a/docs/ux-ui-progress.md b/docs/ux-ui-progress.md index e64a3cc1..9aa79522 100644 --- a/docs/ux-ui-progress.md +++ b/docs/ux-ui-progress.md @@ -1,6 +1,6 @@ # UX/UI: журнал реализации -Актуальное продолжение 2026-10-04: 12.4.7 context221/26 passed наb1f8326; main1161/1162 и focus fix20+15 записаны. Следующий12.3.64: измерить/ограничить текстовую сводку1000WAN; затем дополнительные CPU-профили и внешняя12.5. Недельной квоты1%. +Актуальное продолжение 2026-10-04: 12.3.64 завершён: сводка1000WAN13695→86.5px/134chars, полный каталог сохранён;12+1browser/lint/build passed. Следующий12.3.65: CPU7WAN×1000 probes в child с timeout, без запуска тяжёлого расчёта в UI; затем KPI captions/внешняя12.5. Main1161/1162+focus fix20+15,context221/26 записаны. Общий план: [UX/UI по этапам и пятичасовым окнам](ux-ui-plan.md). План задаёт объём, этот журнал фиксирует выполненные блоки и ограничения. @@ -31,7 +31,7 @@ | 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 и12.3.1–12.3.63 приняты в локальных границах. Общая main1161/1162 выявила focus race, исправленный в12.4.6.1 с20+15 repeats. Общая context221/26 прошла в12.4.7; внешняя12.5 и дополнительные performance границы впереди. | +| 12 | Итоговая доступность, адаптивность, производительность и регрессия | В работе;12.1/12.2 и12.3.1–12.3.64 приняты в локальных границах. Общая main1161/1162 выявила focus race, исправленный в12.4.6.1 с20+15 repeats. Общая context221/26 прошла в12.4.7; внешняя12.5 и дополнительные performance границы впереди. | ## 12.3.49 — большая таблица соседей OSPF (2026-10-04) diff --git a/docs/ux-ui-stage-12.md b/docs/ux-ui-stage-12.md index cae1acc9..63c13f61 100644 --- a/docs/ux-ui-stage-12.md +++ b/docs/ux-ui-stage-12.md @@ -731,3 +731,12 @@ WAN1000×JH1:1000→50rows,28019→1419tableDOM,28712→2149pageDOM,2264ms dev-r 2026-10-04, HEADb1f8326.221/221passed/26files за15.8min,0unexpected/0skipped/0flaky,Edge/1worker/retries0/maxFailures12. Включены Firewall context и все поздние read/write/backend/mode/ABA/checkpoint сценарии. Evidence docs/ux-ui/acceptance/context-final-delta-2026-10-04.json. Terminal context прошёл на исправленном source. Перегенерированных tracked screenshots нет. Main12.4.6 относится к991f2b3:1161/1162; единственный focus race исправлен и проверен20+15 в12.4.6.1. Полный main после этого маленького исправления не повторялся. Внешняя12.5 PG/RouterOS/integrations не выполнена; stage12 не завершён. Следующий12.3.64 — высота сводки1000WAN, затем дополнительные CPU/pool профили. + + +## 12.3.64 — компактная текстовая сводка WAN + +2026-10-04. Baseline1000WAN:31783chars/13695px высоты summary на320px, хотя grid уже50rows/1419DOM. В HomeCard теперь preview первых3 WAN с прежними ISP/IP, точный remaining/total и понятная ссылка в copy на существующую вкладку WAN×JH. Для ≤3WAN описание не сокращено. Исходный массив/расчёт/поиск/таблица не срезаются. + +Final1000WAN:134chars/86.5px высоты summary; WAN10:130chars/86.5px. В тест добавлены реальные размеры/длина preview, точные counts и мобильный snapshot.12 profile browser +1 screenshot repeat, full ESLint страницы/test и production build прошли. Полный search WAN1000, последняя страница, refresh/clamp/pinnedWAN/320px/axe сохранены. Снимок docs/ux-ui/screens/optimizer-wan-summary-320.png просмотрен;9 historical optimizer PNG восстановлены по явному списку. + +Общие main/context доказательства относятся к прежним HEAD; этот небольшой текстовый delta проверен профильными сценариями. Исторический context-delta(a558412/36) сохранён отдельно от нового context-final-delta(b1f8326/221), чтобы ссылки12.4.3 не изменили смысл. Следующий12.3.65 — pure CPU7WAN×1000pool с hard timeout; не запускать в UI. KPI captions/native selector и худшая DFS/full-route комбинация не приняты этим блоком. Внешняя12.5 остаётся. diff --git a/docs/ux-ui/screens/optimizer-wan-summary-320.png b/docs/ux-ui/screens/optimizer-wan-summary-320.png new file mode 100644 index 0000000000000000000000000000000000000000..e83d947d16370bbbf6ca4e1a7f348213483fed86 GIT binary patch literal 8266 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 )M1969?*f#z7O)-rQ12mgo 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 literal 0 HcmV?d00001 diff --git a/tests/e2e/large-optimizer-wan-matrix.spec.ts b/tests/e2e/large-optimizer-wan-matrix.spec.ts index 358cbffe..53f1aed3 100644 --- a/tests/e2e/large-optimizer-wan-matrix.spec.ts +++ b/tests/e2e/large-optimizer-wan-matrix.spec.ts @@ -26,7 +26,16 @@ for (const [wanCount,jhCount] of [[1000,1],[10,100]]) { const started=Date.now(); await page.goto("/route-optimizer?server=1&keep=1") const table=page.getByRole("table").filter({hasText:"WAN-аплинк"}) await expect(table.locator("tr[data-row-id]")).toHaveCount(Math.min(50,wanCount)) - const profile={wanCount,jhCount,bytes:Buffer.byteLength(JSON.stringify(servers)),rows:await table.locator("tr[data-row-id]").count(),columns:await table.getByRole("columnheader").count(),tableNodes:await table.locator("*").count(),pageNodes:await page.locator("*").count(),readyMs:Date.now()-started} + await page.setViewportSize({width:320,height:1000}) + const summary=page.getByText(/^WAN1 \(ISP ·/) + const summaryHeight320=await summary.evaluate(el=>el.getBoundingClientRect().height) + const summaryChars=await summary.evaluate(el=>el.textContent!.length) + await summary.screenshot({path:info.outputPath("wan-summary-320.png"),animations:"disabled"}) + await page.setViewportSize({width:1440,height:1000}) + const profile={summaryHeight320,summaryChars,wanCount,jhCount,bytes:Buffer.byteLength(JSON.stringify(servers)),rows:await table.locator("tr[data-row-id]").count(),columns:await table.getByRole("columnheader").count(),tableNodes:await table.locator("*").count(),pageNodes:await page.locator("*").count(),readyMs:Date.now()-started} + expect(summaryHeight320).toBeLessThan(160) + expect(summaryChars).toBeLessThan(300) + await expect(page.getByText(`Ещё ${wanCount-3} WAN. Все ${wanCount} аплинков — во вкладке WAN × JH.`,{exact:true})).toBeVisible() console.log("WAN matrix",JSON.stringify(profile)); writeFileSync(info.outputPath("matrix-profile.json"),JSON.stringify(profile,null,2)) const root=page.getByRole("region",{name:"Матрица WAN и Jump Host"}) await expect(table.getByRole("columnheader")).toHaveCount(3+Math.min(5,jhCount))