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 00000000..e83d947d Binary files /dev/null and b/docs/ux-ui/screens/optimizer-wan-summary-320.png differ 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))