fix(ui): пояснить область скоростных снимков WAN
This commit is contained in:
1 parent
4ba7f82ccf
commit
1904c86657
7 files changed
+17
-5
No files matched your search
@@ -731,7 +731,7 @@ function RouteOptimizerContent({requestedServer,onSelectServer}:{requestedServer
|
||||
</div>
|
||||
|
||||
<p role="status" className="text-xs text-muted-foreground">Community — расчёт модели. Применение Community к устройству недоступно.</p>
|
||||
<details className="text-xs text-muted-foreground"><summary className="cursor-pointer rounded-sm focus-visible:ring-2 focus-visible:ring-ring">Как читать расчёт</summary><p className="mt-2">Индекс в баллах оценивает модель; базовая цепочка строится из топологии. Ping и скорость могут включать оценки по задержке серверов и лимитам WAN. ECMP, RPF и VRF служат локальному просмотру. OSPF применяется отдельным действием ниже.</p></details>
|
||||
<details className="text-xs text-muted-foreground"><summary className="cursor-pointer rounded-sm focus-visible:ring-2 focus-visible:ring-ring">Как читать расчёт</summary><p className="mt-2">Индекс в баллах оценивает модель; базовая цепочка строится из топологии. Ping и скорость могут включать оценки по задержке серверов и лимитам WAN. Скорость пробы относится к паре устройств; сопоставление с WAN расчётное. Исходный интерфейс используется для Ping после теста, а путь теста скорости выбирает маршрутизация устройства. ECMP, RPF и VRF служат локальному просмотру. OSPF применяется отдельным действием ниже.</p></details>
|
||||
|
||||
<KpiStatGrid gridClassName="grid-cols-1 @3xl:grid-cols-2 @6xl:grid-cols-4"
|
||||
aria-label="Сводка оптимизатора"
|
||||
|
||||
@@ -114,7 +114,7 @@ function RouteOptimizerWanMatrixDataGrid({
|
||||
return (
|
||||
<div className="text-right">
|
||||
<p className="font-mono text-xs">↓{wan.maxDl}</p>
|
||||
<p className="font-mono text-[10px] text-muted-foreground">↑{wan.maxUl} Мбит</p>
|
||||
<p className="font-mono text-[10px] text-muted-foreground">↑{wan.maxUl} Мбит/с</p>
|
||||
</div>
|
||||
)
|
||||
},
|
||||
@@ -168,7 +168,7 @@ function RouteOptimizerWanMatrixDataGrid({
|
||||
{leg.observed ? (leg.observed.pingMs ?? "—") : leg.pingMs} мс
|
||||
</span>
|
||||
<span className="text-[10px] text-muted-foreground font-mono">
|
||||
↓{leg.observed ? (leg.observed.dlMbps ?? "—") : leg.dlMbps} ↑{leg.observed ? (leg.observed.ulMbps ?? "—") : leg.ulMbps}
|
||||
↓{leg.observed ? (leg.observed.dlMbps ?? "—") : leg.dlMbps} ↑{leg.observed ? (leg.observed.ulMbps ?? "—") : leg.ulMbps} Мбит/с
|
||||
</span>
|
||||
{leg.observed && <span className="text-[10px] text-muted-foreground">
|
||||
{leg.observed.probeId ? <>Снимок пробы · Ping: {leg.observed.pingAt ? <time dateTime={leg.observed.pingAt}>{new Date(leg.observed.pingAt).toLocaleString("ru-RU")}</time> : "дата неизвестна"}. Скорость: дата неизвестна.</> : "Измерения отсутствуют"}
|
||||
@@ -231,6 +231,7 @@ function RouteOptimizerWanMatrixDataGrid({
|
||||
<Button variant="outline" size="sm" aria-label="Следующие Jump Host" disabled={hostPage === lastHostPage} onClick={() => setJhPage(hostPage + 1)}>Далее</Button>
|
||||
</>}
|
||||
</div>
|
||||
{legs.some(leg=>leg.observed?.probeId) && <p className="px-5 pb-3 text-xs text-muted-foreground">Скорость — снимок пары устройств. Сопоставление с WAN расчётное. ↓ к Home, ↑ от Home.</p>}
|
||||
<DataGridShell
|
||||
table={table}
|
||||
recordCount={filteredWans.length}
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
# План реализации UX/UI по пятичасовым окнам
|
||||
|
||||
Актуальное продолжение 2026-10-07: 12.3.71 завершён: RX→DL/TX→UL для client near Home, reverse Exit/JH развернут,model WAN limits корректны;15pure+51main+6observed/type/lint/build. Следующий12.3.72: явно показать device-pair speed scope и модельное сопоставление WAN; backend73nullable parser/74terminal confirmation/75OSPF direction остаются. Команды/права не менять,12.5 отдельно.
|
||||
Актуальное продолжение 2026-10-07: 12.3.72 scope/units завершён: device-pair speed/WAN model/Ping interface пояснены,10browser/type/lint/build. Следующий12.3.73: nullable bandwidth parser/average selector и строгий nullable POST consumer; затем74terminal confirmation,75OSPF RX/TX mapping,76mobile pinned-column readable geometry. Команды/права не менять,12.5 отдельно.
|
||||
|
||||
Общий план проекта MikrotikManager. Основан на согласованном плане из задачи; точка продолжения обновлена 2026-10-04. Источник фактического прогресса, проверок и ограничений — [журнал реализации](ux-ui-progress.md). Этот документ задаёт объём и критерии завершения, журнал фиксирует результат.
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# UX/UI: журнал реализации
|
||||
|
||||
Актуальное продолжение 2026-10-07: 12.3.71 завершён: RX→DL/TX→UL для client near Home, reverse Exit/JH развернут,model WAN limits корректны;15pure+51main+6observed/type/lint/build. Следующий12.3.72: явно показать device-pair speed scope и модельное сопоставление WAN; backend73nullable parser/74terminal confirmation/75OSPF direction остаются. Команды/права не менять,12.5 отдельно.
|
||||
Актуальное продолжение 2026-10-07: 12.3.72 scope/units завершён: device-pair speed/WAN model/Ping interface пояснены,10browser/type/lint/build. Следующий12.3.73: nullable bandwidth parser/average selector и строгий nullable POST consumer; затем74terminal confirmation,75OSPF RX/TX mapping,76mobile pinned-column readable geometry. Команды/права не менять,12.5 отдельно.
|
||||
|
||||
Общий план: [UX/UI по этапам и пятичасовым окнам](ux-ui-plan.md). План задаёт объём, этот журнал фиксирует выполненные блоки и ограничения.
|
||||
|
||||
|
||||
@@ -799,3 +799,12 @@ CPU final:1000routes13.3ms;100000(10×100×100)49.7ms;100000(100×10×100)44.0ms
|
||||
15pure tests passed:1230 assignment oracle fixtures, source ownership/ties/noWAN, новые asymmetric limits и forward/reverse/zero/null.51main browser и6 observed повторных (включая2новых direction/asymmetric сценария) прошли; TypeScript до dev, targeted lint и production build успешны. Старое ожидание ↓TX исправлено на ↑TX, а не ослаблено. Historical9 optimizer PNG восстановлены. Полная main/context матрица последнего общего прогона относится к прежним HEAD; этот delta проверен профильными сценариями.
|
||||
|
||||
Наблюдения по-прежнему не доказывают конкретный WAN bandwidth-test: следующее72scope labels. Backend producer missing→0/terminal status и OSPF metrics/route builder TX→DL требуют73–75. OSPF traffic fallback уже используетRX→DL, измеренная дата speed-probe намеренноnull и не требует изменения. Real12.5 отдельно.
|
||||
|
||||
|
||||
## 12.3.72 — область скоростного снимка и единицы
|
||||
|
||||
2026-10-07. Матрица с probe snapshot явно объясняет:скорость — пара устройств, привязка WAN расчётная, DL кHome/UL отHome. В existing «Как читать расчёт» добавлена роль srcInterface для Ping после теста и выбор пути скорости маршрутизацией устройства. Скорости и model limits подписаны Мбит/с. Новых RouterOS параметров, routing rules, методов или API операций нет.
|
||||
|
||||
10browser (observed forward/reverse/null/zero,20/1000probes,1000WAN/100JH) прошли; TypeScript до dev, targeted lint и production build успешны. При noProbe измерения остаются неизвестными. Scope note находится один раз над таблицей, без повторения длинного предупреждения в каждой ячейке.
|
||||
|
||||
Остаются73missing→0/nullable consumer,74native terminal status,75OSPF direction. Чтение frontend consumer подтвердило ещё Math.round(null)→0 и доверие POST без runtime DTO; фиксировать73 вместе с producer. Границы мобильного pinnedWAN и соседней metric cell требуют отдельного76geometry теста, а не только проверки первого столбца. Внешняя12.5 отдельно.
|
||||
@@ -30,6 +30,7 @@ for(const poolCount of [20,1000])test(`Оптимизатор7WAN: ранжир
|
||||
const started=Date.now();await page.goto("/route-optimizer?server=1&keep=1")
|
||||
const table=page.getByRole("table").filter({hasText:"WAN-аплинк"}),rows=table.locator("tr[data-row-id]")
|
||||
await expect(rows).toHaveCount(7)
|
||||
await expect(page.getByRole("region",{name:"Матрица WAN и Jump Host"})).toContainText("Скорость — снимок пары устройств")
|
||||
for(let i=0;i<7;i++)await expect(rows.nth(i).locator("time")).toHaveAttribute("datetime",probes.probes[poolCount-7+i].lastPingAt!)
|
||||
const profile={poolCount,wanCount:7,probeBytes:Buffer.byteLength(JSON.stringify(probes)),rendered:await rows.count(),tableNodes:await table.locator("*").count(),readyMs:Date.now()-started}
|
||||
console.log("Optimizer probes",JSON.stringify(profile));writeFileSync(info.outputPath("probes-profile.json"),JSON.stringify(profile,null,2))
|
||||
|
||||
@@ -9,6 +9,7 @@ for(const hasProbe of [true,false])test("Оптимизатор: исходны
|
||||
await expect(matrix).toContainText(hasProbe?"0 мс":"— мс")
|
||||
await expect(matrix).toContainText(hasProbe?"↓— ↑150.25":"↓— ↑—")
|
||||
await expect(matrix).toContainText(hasProbe?"Скорость: дата неизвестна":"Измерения отсутствуют")
|
||||
if(hasProbe)await expect(page.getByRole("region",{name:"Матрица WAN и Jump Host"})).toContainText("Сопоставление с WAN расчётное")
|
||||
if(hasProbe)await expect(matrix.locator("time")).toHaveAttribute("datetime","2020-01-01T00:00:00Z")
|
||||
await page.getByRole("button",{name:"Маршруты (1)",exact:true}).click()
|
||||
await expect(page.getByRole("table").filter({hasText:"# Маршрут"})).toContainText("Ping модели")
|
||||
|
||||
Reference in new issue
Block a user