fix(ui): сохранять страницу компактной таблицы при опросе
This commit is contained in:
1 parent
160b39186a
commit
ef457b471a
6 files changed
+33
-6
No files matched your search
@@ -2,7 +2,7 @@
|
||||
|
||||
import { dataGridFeatures, type DataGridFeatures } from "@/components/reui/data-grid"
|
||||
|
||||
import { useMemo, type ReactNode } from "react"
|
||||
import { useMemo, useEffect, type ReactNode } from "react"
|
||||
import {
|
||||
type ColumnDef,
|
||||
useTable,
|
||||
@@ -83,6 +83,7 @@ function CompactDataGrid<T extends { id: string }>({
|
||||
const table = useTable({
|
||||
features: dataGridFeatures,
|
||||
manualPagination: false,
|
||||
autoResetPageIndex: false,
|
||||
initialState: { pagination: { pageIndex: 0, pageSize: 50 } },
|
||||
data,
|
||||
columns: columnDefs,
|
||||
@@ -90,6 +91,12 @@ function CompactDataGrid<T extends { id: string }>({
|
||||
...(getExpandedContent ? { getRowCanExpand: () => true } : {}),
|
||||
})
|
||||
|
||||
const {pageIndex,pageSize}=table.state.pagination
|
||||
useEffect(()=>{
|
||||
const last=Math.max(0,Math.ceil(data.length/pageSize)-1)
|
||||
if(pageIndex>last)table.setPageIndex(last)
|
||||
},[data.length,pageSize,pageIndex,table])
|
||||
|
||||
return (
|
||||
<DataGridShell
|
||||
table={table}
|
||||
|
||||
@@ -45,4 +45,4 @@
|
||||
| [wireguard-data-grid.tsx](../components/data-grids/wireguard-data-grid.tsx) | Потребитель API, контекст/детали и fixture1000 |
|
||||
| [wireguard-peers-grid.tsx](../components/data-grids/wireguard-peers-grid.tsx) | Потребитель API, контекст/детали и fixture1000 |
|
||||
|
||||
Всего27 специализированных grids; ни один из этого перечня не принят этим документом на больших данных. Следующая группа — uptime-resources/probes-speed/probes-schedule, затем сетевые/admin grids по профилям. Общий журнал: [ux-ui-progress.md](ux-ui-progress.md).
|
||||
Всего27 специализированных grids; ни один из этого перечня не принят этим документом на больших данных. CompactDataGrid дополнительно проверен на повторном получении100 active probes: страница сохраняется; сокращение100→1 ограничивает индекс. Следующая группа12.3.6 — uptime-resources/probes-speed/probes-schedule, затем сетевые/admin grids по профилям. Общий журнал: [ux-ui-progress.md](ux-ui-progress.md).
|
||||
+3
-3
@@ -1,10 +1,10 @@
|
||||
# План реализации UX/UI по пятичасовым окнам
|
||||
|
||||
Общий план проекта MikrotikManager. Основан на согласованном плане из задачи; точка продолжения обновлена 2026-10-03. Источник фактического прогресса, проверок и ограничений — [журнал реализации](ux-ui-progress.md). Этот документ задаёт объём и критерии завершения, журнал фиксирует результат.
|
||||
Общий план проекта MikrotikManager. Основан на согласованном плане из задачи; точка продолжения обновлена 2026-10-04. Источник фактического прогресса, проверок и ограничений — [журнал реализации](ux-ui-progress.md). Этот документ задаёт объём и критерии завершения, журнал фиксирует результат.
|
||||
|
||||
## Актуальная точка продолжения — 2026-10-03
|
||||
## Актуальная точка продолжения — 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: production build после сохранения страницы CompactDataGrid при повторном опросе, затем uptime ресурсы/speed/schedule и остальные grids;12.4 общая регрессия ещё не завершена. См. 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:1000 uptime resources/speed probes/schedule entries, затем остальные grids;12.4/12.5 ещё не завершены. См. docs/ux-ui-stage-12.md. Внешние ограничения 11Б сохраняются.
|
||||
|
||||
Реальные pg_dump/pg_restore, PG rollback и остановка UDP worker требуют внешней приёмки. Датированные продолжения ниже — история; точный следующий шаг также указан в начале [журнала](ux-ui-progress.md).
|
||||
|
||||
|
||||
@@ -29,13 +29,21 @@
|
||||
| 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 | Итоговая доступность, адаптивность, производительность и регрессия | В работе;12.1/12.2.1–12.2.10 и12.3.1–12.3.5 приняты в описанных локальных границах |
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## 12.3.5 — сохранение страницы CompactDataGrid при опросе (2026-10-04)
|
||||
|
||||
На100 активных пробах воспроизведено: после получения нового DTO страница2 сбрасывалась на1. Общий CompactDataGrid теперь отключает autoResetPageIndex и ограничивает индекс последней существующей страницей только при сокращении набора. Одинаковый каталог с новыми измерениями сохраняет контекст;100→1 не оставляет пустую страницу. Штатные pagination/filter/sort компоненты сохранены.
|
||||
|
||||
Проверки:89 browser dashboard/permissions/large-statistics/statistics/migrated/snapshot прошли, включая воспроизведённый regression и сокращение100→1. Typecheck/ESLint прошли. Повторный frontend production/contracts build после изменения общей основы прошёл:34 страницы; backend/contracts build также прошёл после12.2.10. ReUI validate_usage ok для DataGrid table/recordCount/isLoading/tableLayout/i18n и Frame dense; checklist применён. Предыдущая123 browser приёмка остаётся профильным checkpoint до этого изменения, не общей12.4.
|
||||
|
||||
Далее12.3.6: фиксированные1000 ресурсов uptime/1000 speed probes/1000 schedule entries; измерить DOM, проверить URL/детали, pagination/polling/уменьшение набора и права. Использовать [карту производительности](ux-ui-performance.md) для остальных27 specialized grids; Firewall порядок/drag и traffic server page требуют отдельной проверки. Затем12.4 полный browser/context прогон и итоговая матрица,12.5 реальные PG/RouterOS/интеграции. Этап12 пока не завершён. Все изменения сохраняются локально, push не выполнялся.
|
||||
|
||||
## 12.2.10 — обязательные поля объектов RouterOS (2026-10-04)
|
||||
|
||||
Сборщик Internet path проверяет не только array/string record, но и обязательные поля конкретного источника: route dst-address, DHCP interface, IP address/interface, GRE .id/name/local-address/remote-address. Строковый error record или пустой объект больше не проходят как подтверждённая сущность/пустая маршрутизация/синтетический GRE. Настоящий пустой массив остаётся допустимым; auto local-address0.0.0.0 сохраняется.
|
||||
|
||||
@@ -161,3 +161,11 @@ Frontend production/contracts build на3978976 прошёл:34 страницы
|
||||
Сборщик Internet path проверяет не только array/string record, но и обязательные поля конкретного источника: route dst-address, DHCP interface, IP address/interface, GRE .id/name/local-address/remote-address. Строковый error record или пустой объект больше не проходят как подтверждённая сущность/пустая маршрутизация/синтетический GRE. Настоящий пустой массив остаётся допустимым; auto local-address0.0.0.0 сохраняется.
|
||||
|
||||
Pure/DI профиль дополнен malformed entity/error record/valid empty/valid route/valid GRE; профиль, ESLint и backend/contracts build прошли. Сетевые операции не изменены, живой RouterOS не проверен. Далее завершить12.3.5:89 browser уже прошли после сохранения страницы CompactDataGrid, требуется повторный frontend production build и локальная фиксация этого блока.
|
||||
|
||||
## 12.3.5 — сохранение страницы CompactDataGrid при опросе (2026-10-04)
|
||||
|
||||
На100 активных пробах воспроизведено: после получения нового DTO страница2 сбрасывалась на1. Общий CompactDataGrid теперь отключает autoResetPageIndex и ограничивает индекс последней существующей страницей только при сокращении набора. Одинаковый каталог с новыми измерениями сохраняет контекст;100→1 не оставляет пустую страницу. Штатные pagination/filter/sort компоненты сохранены.
|
||||
|
||||
Проверки:89 browser dashboard/permissions/large-statistics/statistics/migrated/snapshot прошли, включая воспроизведённый regression и сокращение100→1. Typecheck/ESLint прошли. Повторный frontend production/contracts build после изменения общей основы прошёл:34 страницы; backend/contracts build также прошёл после12.2.10. ReUI validate_usage ok для DataGrid table/recordCount/isLoading/tableLayout/i18n и Frame dense; checklist применён. Предыдущая123 browser приёмка остаётся профильным checkpoint до этого изменения, не общей12.4.
|
||||
|
||||
Далее12.3.6: фиксированные1000 ресурсов uptime/1000 speed probes/1000 schedule entries; измерить DOM, проверить URL/детали, pagination/polling/уменьшение набора и права. Использовать [карту производительности](ux-ui-performance.md) для остальных27 specialized grids; Firewall порядок/drag и traffic server page требуют отдельной проверки. Затем12.4 полный browser/context прогон и итоговая матрица,12.5 реальные PG/RouterOS/интеграции. Этап12 пока не завершён. Все изменения сохраняются локально, push не выполнялся.
|
||||
@@ -269,3 +269,7 @@ for(const state of ["unmeasured","measured","failed","unknown"])test("Dashboard
|
||||
test("Dashboard large attention queue mounts rows on demand",async({page},info)=>{
|
||||
test.setTimeout(90000);const start=Date.now();await setup(page,false,1000);await expect(refresh(page)).toBeEnabled();const queue=page.getByRole("region",{name:"Требует внимания",exact:true});const links=queue.locator('a[href^="/servers?server="]');await expect(links).toHaveCount(5);const sample={fixtureRows:1000,readyMs:Date.now()-start,renderedAttentionRows:await links.count(),domNodes:await page.locator("*").count()};console.log(JSON.stringify(sample));await info.attach("large-attention-metrics",{body:JSON.stringify(sample),contentType:"application/json"});const summary=queue.locator("summary").filter({hasText:"Ещё 995"});await summary.focus();await summary.press("Enter");await expect(links).toHaveCount(55);await queue.getByRole("button",{name:"Показать ещё 50",exact:true}).click();await expect(links).toHaveCount(105);await summary.focus();await summary.press("Enter");await expect(links).toHaveCount(5);await summary.press("Enter");await expect(links).toHaveCount(55);await page.setViewportSize({width:320,height:900});expect(await page.evaluate(()=>document.documentElement.scrollWidth<=innerWidth)).toBe(true);await links.first().click();await expect(page).toHaveURL(/servers\?server=1$/);await expect(page.getByRole("status",{name:"Сервер по ссылке"})).toContainText("Узел 1")
|
||||
})
|
||||
|
||||
test("Dashboard active probes retain page after refreshed measurements",async({page})=>{
|
||||
const control=await setup(page);await expect(refresh(page)).toBeEnabled();const at="2026-10-04T00:00:00Z";const probes=Array.from({length:100},(_,i)=>({id:"large-p"+(i+1),srcServerId:"1",name:"Paged probe "+String(i+1).padStart(3,"0"),target:"192.0.2.2",filter:"main",rtt:0,loss:0,status:"up",series:[],enabled:true,showOnDashboard:true,observations:{samples:[{sampledAt:at,rtt:0,loss:0,status:"up"}]}}));control.probesPayload={rangeStartAt:"2026-10-03T23:00:00Z",rangeEndAt:at,probes};await refresh(page).click();await expect(page.locator("tr[data-row-id]")).toHaveCount(50);await page.getByRole("button",{name:"Следующая страница",exact:true}).click();await expect(page.getByText("Paged probe 051",{exact:true})).toBeVisible();await refresh(page).click();await expect(refresh(page)).toBeEnabled();await expect(page.getByText("51–100 из 100",{exact:true})).toBeVisible();await expect(page.getByText("Paged probe 051",{exact:true})).toBeVisible();control.probesPayload={rangeStartAt:"2026-10-03T23:00:00Z",rangeEndAt:at,probes:probes.slice(0,1)};await refresh(page).click();await expect(page.locator("tr[data-row-id]")).toHaveCount(1);await expect(page.getByText("Paged probe 001",{exact:true})).toBeVisible()
|
||||
})
|
||||
Reference in new issue
Block a user