From 7265709b1c796cb9d067f312ab66e32f78d2022f Mon Sep 17 00:00:00 2001 From: Denozordec Date: Sun, 4 Oct 2026 17:53:24 +0700 Subject: [PATCH] =?UTF-8?q?chore(ui):=20=D0=B7=D0=B0=D1=84=D0=B8=D0=BA?= =?UTF-8?q?=D1=81=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D1=82=D1=8C=20=D0=BF=D1=80?= =?UTF-8?q?=D0=BE=D1=84=D0=B8=D0=BB=D1=8C=20=D1=82=D1=8B=D1=81=D1=8F=D1=87?= =?UTF-8?q?=D0=B8=20=D0=BA=D0=B0=D1=80=D1=82=D0=BE=D1=87=D0=B5=D0=BA=20?= =?UTF-8?q?=D0=BE=D0=BF=D1=82=D0=B8=D0=BC=D0=B8=D0=B7=D0=B0=D1=82=D0=BE?= =?UTF-8?q?=D1=80=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/ux-ui-performance.md | 2 ++ docs/ux-ui-plan.md | 2 +- docs/ux-ui-progress.md | 2 +- docs/ux-ui-stage-12.md | 7 ++++++ .../optimizer-homes-baseline-2026-10-04.json | 7 ++++++ .../screens/optimizer-homes-baseline-320.png | Bin 0 -> 59568 bytes tests/e2e/large-optimizer-homes.spec.ts | 22 ++++++++++++++++++ 7 files changed, 40 insertions(+), 2 deletions(-) create mode 100644 docs/ux-ui/acceptance/optimizer-homes-baseline-2026-10-04.json create mode 100644 docs/ux-ui/screens/optimizer-homes-baseline-320.png create mode 100644 tests/e2e/large-optimizer-homes.spec.ts diff --git a/docs/ux-ui-performance.md b/docs/ux-ui-performance.md index e3174c4f..f2866ff5 100644 --- a/docs/ux-ui-performance.md +++ b/docs/ux-ui-performance.md @@ -101,3 +101,5 @@ Statistics pivot в backend/src/services/statistics-aggregate.ts огранич 12.3.52: OSPF parallel1000 between2 nodes →8 raw edges per page/1 visual line, полный источник/state/cost сохранён.9+1 browser/type/lint/build; screenshot1440 принят. Далее optimizer preview. 12.3.53: OSPF preview1000 interfaces/245293 bytes →50 rows/924 region nodes/1610 page DOM.47+16 main/8 context/type/lint/build. Полный POST/receipt1000 при search1, sort/cache/clamp/320px приняты.8 manualPagination:true; далее many HomeRouterCard/матрицы. + +12.3.54:1000 HomeRouterCard/179347 bytes →40668 page DOM/11496ms dev ready.1 browser/test lint, baseline без WAN не означает принятую производительность. Далее bounded cards12.3.55. diff --git a/docs/ux-ui-plan.md b/docs/ux-ui-plan.md index b0145d7b..0ae08db8 100644 --- a/docs/ux-ui-plan.md +++ b/docs/ux-ui-plan.md @@ -1,6 +1,6 @@ # План реализации UX/UI по пятичасовым окнам -Актуальное продолжение 2026-10-04: 12.3.53 принят локально: OSPF preview оптимизатора1000→50 строк, полный поиск/sort/apply/refresh/cache/clamp/320px.47+16 main/8 context/type/lint/build. Далее12.3.54 — профиль множества HomeRouterCard; затем ограничение карточек/матриц и общая регрессия.8 specialized manualPagination:true остаются; внешняя12.5 отдельно. +Актуальное продолжение 2026-10-04: 12.3.54 сохранён — baseline1000 HomeRouterCard/40668 DOM/11496ms dev ready;1 browser/test lint. Это не приёмка. Далее12.3.55 — ограничить карточки с полным поиском/URL/refresh/clamp; затем матрицы/общая регрессия. Внешняя12.5 отдельно. Общий план проекта MikrotikManager. Основан на согласованном плане из задачи; точка продолжения обновлена 2026-10-04. Источник фактического прогресса, проверок и ограничений — [журнал реализации](ux-ui-progress.md). Этот документ задаёт объём и критерии завершения, журнал фиксирует результат. diff --git a/docs/ux-ui-progress.md b/docs/ux-ui-progress.md index c0a47c13..9cb83bea 100644 --- a/docs/ux-ui-progress.md +++ b/docs/ux-ui-progress.md @@ -1,6 +1,6 @@ # UX/UI: журнал реализации -Актуальное продолжение 2026-10-04: 12.3.53 принят локально: OSPF preview оптимизатора1000→50 строк, полный поиск/sort/apply/refresh/cache/clamp/320px.47+16 main/8 context/type/lint/build. Далее12.3.54 — профиль множества HomeRouterCard; затем ограничение карточек/матриц и общая регрессия.8 specialized manualPagination:true остаются; внешняя12.5 отдельно. +Актуальное продолжение 2026-10-04: 12.3.54 сохранён — baseline1000 HomeRouterCard/40668 DOM/11496ms dev ready;1 browser/test lint. Это не приёмка. Далее12.3.55 — ограничить карточки с полным поиском/URL/refresh/clamp; затем матрицы/общая регрессия. Внешняя12.5 отдельно. Общий план: [UX/UI по этапам и пятичасовым окнам](ux-ui-plan.md). План задаёт объём, этот журнал фиксирует выполненные блоки и ограничения. diff --git a/docs/ux-ui-stage-12.md b/docs/ux-ui-stage-12.md index e6e0b779..bb3d4314 100644 --- a/docs/ux-ui-stage-12.md +++ b/docs/ux-ui-stage-12.md @@ -630,3 +630,10 @@ TopologyGraph группирует видимые edges по неориенти 47/47 профильных main,16/16 final preview/large/new context-search и8/8 backend/mode context прошли.1000 interfaces/245293 JSON bytes →50 rows/924 preview region DOM/1610 page DOM. Search ether1000→1 row/receipt1000 applied; Cost sort full array, page2/refresh/cache503/disabled apply/shrink1000→1/server+keep,320px/pinning/axe, смена server очищает no-match query. TypeScript без incremental/полный ESLint grid/page/двух тестов/production build прошли. [Профиль](ux-ui/acceptance/optimizer-ospf-preview-2026-10-04.json), [320px](ux-ui/screens/optimizer-ospf-preview-320.png) сохранены и просмотрены. API fixture receipt исправлен по существующему контракту currentCost=from; контракт не ослаблен. Это проверка HTTP live-ветки с подменёнными ответами, не реальное применение RouterOS. Полный массив остаётся в памяти. Осталось8 manualPagination:true specialized grids. Следующий12.3.54 — исходный профиль1000 HomeRouterCard с полным servers DTO; затем bounded cards/full-route/wan-matrix, честность24 commRecs. Общая main/context после delta и внешняя12.5 отдельно. Локальный коммит без push. + + +## 12.3.54 — исходный профиль домашних устройств оптимизатора (2026-10-04) + +Полный optimizerServersSchema1000 home-router/179347 bytes, без подтверждённых WAN/probes/filters.1/1 browser и ESLint теста прошли.1000 HomeRouterCard/40668 page DOM/11496ms dev ready; document320px не шире viewport. [Профиль](ux-ui/acceptance/optimizer-homes-baseline-2026-10-04.json), [исходный320px](ux-ui/screens/optimizer-homes-baseline-320.png) сохранены. Это baseline, не приёмка производительности; dev latency не production benchmark. Нет WAN — это валидная live ветка, не подмена неизвестных данных нулями. Продуктовый код не менялся, build повторно не нужен. + +Следующий12.3.55: ограниченный DOM HomeRouterCard/поиск полного каталога/URL/refresh/clamp/320px. Расчёт полного массива остаётся отдельным CPU риском; раскрытые full-routes и WAN dynamic columns требуют других профилей. Общая регрессия и внешняя12.5 отдельно. Локальный коммит без push. diff --git a/docs/ux-ui/acceptance/optimizer-homes-baseline-2026-10-04.json b/docs/ux-ui/acceptance/optimizer-homes-baseline-2026-10-04.json new file mode 100644 index 00000000..33df0eae --- /dev/null +++ b/docs/ux-ui/acceptance/optimizer-homes-baseline-2026-10-04.json @@ -0,0 +1,7 @@ +{ + "servers": 1000, + "bytes": 179347, + "homeCards": 1000, + "pageNodes": 40668, + "readyMs": 11496 +} \ No newline at end of file diff --git a/docs/ux-ui/screens/optimizer-homes-baseline-320.png b/docs/ux-ui/screens/optimizer-homes-baseline-320.png new file mode 100644 index 0000000000000000000000000000000000000000..f31214cd47eb5725881cf9e5887221fb4a3e4739 GIT binary patch literal 59568 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 n0C;{r3c*C6#{jf{fgAaz3xw literal 0 HcmV?d00001 diff --git a/tests/e2e/large-optimizer-homes.spec.ts b/tests/e2e/large-optimizer-homes.spec.ts new file mode 100644 index 00000000..5bc02fbf --- /dev/null +++ b/tests/e2e/large-optimizer-homes.spec.ts @@ -0,0 +1,22 @@ +import { test, expect } from "@playwright/test" +import { writeFileSync } from "node:fs" +import { optimizerServersSchema } from "../../lib/route-optimizer-response" + +test("Оптимизатор1000 домашних устройств: профиль полного экрана", async ({ page }, info) => { + test.setTimeout(90000) + const servers = optimizerServersSchema.parse(Array.from({ length: 1000 }, (_, i) => ({ id: i+1, name: `Домашний роутер ${i+1}`, host: `10.${Math.floor(i/256)}.${i%256}.1`, type: "home-router", country: "RU", site: "MSK", enabled: true, status: null }))) + await page.route("**/health", r => r.fulfill({ json: { ok: true } })) + await page.route("**/api/**", r => { + const path = new URL(r.request().url()).pathname + return r.fulfill({ json: path === "/api/auth/config" ? { required: false } : path === "/api/servers" ? servers : path === "/api/filters/rules" ? { rulesets: [] } : path === "/api/uptime/speed-probes" ? { probes: [] } : path === "/api/ospf/catalog" ? { interfaces: [], instances: [], neighbors: [], bfdSessions: [], routes: [], failures: [] } : path.endsWith("/ospf/optimize/preview") ? { serverId: 1, serverName: servers[0].name, pingWeight: 60, interfacesTotal: 0, changedCount: 0, unchangedCount: 0, interfaces: [], changes: [] } : {} }) + }) + const start = Date.now(); await page.goto("/route-optimizer?server=1&keep=1") + const cards = page.getByRole("button", { name: "WAN × JH (0×0)", exact: true }) + await expect(cards).toHaveCount(1000) + const profile = { servers: servers.length, bytes: Buffer.byteLength(JSON.stringify(servers)), homeCards: await cards.count(), pageNodes: await page.locator("*").count(), readyMs: Date.now()-start } + console.log("Optimizer homes", JSON.stringify(profile)); writeFileSync(info.outputPath("optimizer-homes-profile.json"), JSON.stringify(profile, null, 2)) + await page.addStyleTag({ content: "nextjs-portal{display:none!important}" }) + await page.setViewportSize({ width: 320, height: 1000 }) + expect(await page.evaluate(() => document.documentElement.scrollWidth)).toBeLessThanOrEqual(320) + await page.screenshot({ path: info.outputPath("optimizer-homes-baseline-320.png"), animations: "disabled" }) +})