fix(ui): сделать названия колонок потоков понятнее

This commit is contained in:
Denozordec committed 2026-10-11 18:41:06 +07:00
1 parent 555bd31596
commit 655ea9727f
9 files changed
+240 -21

No files matched your search

@@ -37,14 +37,14 @@ function packetTuple(row: FlowTalkerDto): string {
function FlowDirectionMark({ direction }: { direction: FlowTalkerDto["direction"] }) {
if (direction === "to_client") {
return (
<span className="inline-flex text-muted-foreground" title="Download: интернет → клиент">
<span className="inline-flex text-muted-foreground" title="Получение: Интернет → клиент">
<ArrowDownIcon className="size-3" />
</span>
)
}
if (direction === "from_client") {
return (
<span className="inline-flex text-muted-foreground" title="Upload: клиент → интернет">
<span className="inline-flex text-muted-foreground" title="Отправка: клиент → Интернет">
<ArrowUpIcon className="size-3" />
</span>
)
@@ -82,14 +82,14 @@ function TrafficFlowsDataGrid({
{
id: "server",
accessorKey: "serverName",
header: () => <span className="text-xs font-medium text-muted-foreground">JH</span>,
header: () => <span className="text-xs font-medium text-muted-foreground">Экспортёр</span>,
cell: ({ row }) => <span className="text-sm font-medium">{row.original.serverName}</span>,
meta: { headerClassName: DATA_GRID_CELL_PAD, cellClassName: DATA_GRID_CELL_PAD },
},
{
id: "direction",
accessorFn: (r) => r.direction ?? "",
header: () => <span className="text-xs font-medium text-muted-foreground">Напр.</span>,
header: () => <span className="text-xs font-medium text-muted-foreground">Направление</span>,
cell: ({ row }) => <FlowDirectionMark direction={row.original.direction} />,
meta: { headerClassName: DATA_GRID_CELL_PAD, cellClassName: DATA_GRID_CELL_PAD },
},
@@ -112,7 +112,7 @@ function TrafficFlowsDataGrid({
{
id: "app",
accessorFn: (r) => r.application ?? r.protoName,
header: () => <span className="text-xs font-medium text-muted-foreground">App</span>,
header: () => <span className="text-xs font-medium text-muted-foreground">Приложение</span>,
cell: ({ row }) => (
<span className="flex min-w-0 flex-col gap-0.5 text-xs">
<span>{row.original.application ?? row.original.protoName}</span>
@@ -128,7 +128,7 @@ function TrafficFlowsDataGrid({
{
id: "proto",
accessorKey: "protoName",
header: () => <span className="text-xs font-medium text-muted-foreground">Proto</span>,
header: () => <span className="text-xs font-medium text-muted-foreground">Протокол</span>,
cell: ({ row }) => <span className="text-xs">{row.original.protoName}</span>,
meta: { headerClassName: DATA_GRID_CELL_PAD, cellClassName: DATA_GRID_CELL_PAD },
},
@@ -149,7 +149,7 @@ function TrafficFlowsDataGrid({
{
id: "en",
accessorFn: (r) => r.enName ?? "",
header: () => <span className="text-xs font-medium text-muted-foreground">EN</span>,
header: () => <span className="text-xs font-medium text-muted-foreground">Выходной узел</span>,
cell: ({ row }) => <span className="text-xs">{row.original.enName || "—"}</span>,
meta: { headerClassName: DATA_GRID_CELL_PAD, cellClassName: DATA_GRID_CELL_PAD },
},
@@ -163,7 +163,7 @@ function TrafficFlowsDataGrid({
{
id: "iface",
accessorKey: "inIface",
header: () => <span className="text-xs font-medium text-muted-foreground">Iface</span>,
header: () => <span className="text-xs font-medium text-muted-foreground">Интерфейс</span>,
cell: ({ row }) => <span className="font-mono text-xs text-muted-foreground">{row.original.inIface || "—"}</span>,
meta: { headerClassName: DATA_GRID_CELL_PAD_LAST, cellClassName: cn(DATA_GRID_CELL_PAD_LAST) },
},
+22 -2
View File
@@ -1,6 +1,6 @@
# UX/UI: протокол внешней приёмки 12.5
Актуальное продолжение 2026-10-11: завершён12.5.149 — invalid month400 без current/zero fallback; calendar bounds исправлены для годов1–99/9999 и leap rates.5 SQL intervals в own DB/removed,984 outputs/build/ESLint,6 frontend checks и live400/200+PC/mobile passed. Backend ux-month149/frontend ux-scope148. Далее150 — ясные названия колонок Sessions вместо App/Proto/Iface/JH/EN, без изменения данных/темы.12.5 открыт.
Актуальное продолжение 2026-10-11: завершён12.5.150 — Sessions columns/направления подписаны по-русски, ReUI/Frame/base-nova/data/sort/filter сохранены.2 viewport checks/ESLint/sequential types/frontend build/live PC/mobile passed. Runtime backend ux-month149/frontend ux-sessions150. Блоки142–150 завершены локальными коммитами без push;12.5 открыт. Следующий151 — application GRE IPv6 address lifecycle: catalog/create/update/history restore/delete с family-safe paths и static-address ownership; сначала подтвердить бюджет.
IPsec78: реальный PSK responder established, mode-config198.18.78.10 и online=true подтверждены API; точные собственные объекты удалены. Сертификатный/DN online, late failure и history restore остаются открытыми. [Отчёт](ux-ui/acceptance/ipsec-mode-config-2026-10-09.json), [журнал](ux-ui-progress.md).
@@ -696,7 +696,7 @@ flowchart LR
## 12.5.77 — основной блок IPsec (2026-10-09)
Актуальное продолжение 2026-10-11: завершён12.5.149 — invalid month400 без current/zero fallback; calendar bounds исправлены для годов1–99/9999 и leap rates.5 SQL intervals в own DB/removed,984 outputs/build/ESLint,6 frontend checks и live400/200+PC/mobile passed. Backend ux-month149/frontend ux-scope148. Далее150 — ясные названия колонок Sessions вместо App/Proto/Iface/JH/EN, без изменения данных/темы.12.5 открыт.
Актуальное продолжение 2026-10-11: завершён12.5.150 — Sessions columns/направления подписаны по-русски, ReUI/Frame/base-nova/data/sort/filter сохранены.2 viewport checks/ESLint/sequential types/frontend build/live PC/mobile passed. Runtime backend ux-month149/frontend ux-sessions150. Блоки142–150 завершены локальными коммитами без push;12.5 открыт. Следующий151 — application GRE IPv6 address lifecycle: catalog/create/update/history restore/delete с family-safe paths и static-address ownership; сначала подтвердить бюджет.
Подробный объём, протоколы, схема и ограничения: [12.5.77 в журнале](ux-ui-progress.md).
@@ -1613,3 +1613,23 @@ Calendar bounds больше не используют Date.UTC дляyear1..99
Backend ux-month149 развёрнут, frontend ux-scope148 сохранён, health healthy. Real API6 invalid months400 иcorrect2026-10→200/same month; initial smoke helper Fetch.status method typo исправлен только в harness, сохранён как setup error. [Full SQL/live receipt](ux-ui/acceptance/flow-month-calendar-2026-10-11.json), [PC/mobile smoke](ux-ui/acceptance/traffic-month-calendar-smoke-2026-10-11.json). Device/password changes нет, rollback retained. Это не расширяет UI на future month selection.
Следующий небольшой150 — понятные подписи Sessions columns вместо App/Proto/Iface/JH/EN, сохраняя ReUI grid/Frame/base-nova/data semantics.12.5 открыт.
## 12.5.150 — понятные названия колонок сессий (2026-10-11)
Существующая ReUI Sessions grid получила ясные подписи вместо внутренних сокращений:
| Было | Стало |
| --- | --- |
| JH | Экспортёр |
| EN | Выходной узел |
| App | Приложение |
| Proto | Протокол |
| Iface | Интерфейс |
| Напр. | Направление |
| Download / Upload (tooltip) | Получение / Отправка |
Column IDs, accessors, sorting/filtering, row values, direction meanings, grid layout/Frame/base-nova/vendor не менялись. Экспортёр описывает serverName корректнее, чем JH: данные могут поступать с разных типов устройств. IPv6 bracket/ICMPv6 labels146 сохранены.
Existing viewport1440/320 cases passed: endpoint/tooltip/IPv4/ICMPv6 behaviour иno document overflow. ESLint passed. Первый types check совпал с Next dev записью generated routes.d.ts и прочитал незавершённый файл; после окончания E2E/webserver TypeScript повторён последовательно и passed без изменения source. Production frontend build passed. Frontend ux-sessions150 развёрнут, backend ux-month149/PG healthy; [receipt](ux-ui/acceptance/flow-sessions-column-labels-2026-10-11.json), [readonly PC/mobile smoke](ux-ui/acceptance/traffic-sessions-labels-smoke-2026-10-11.json). Rollback image/env сохранены. Network/password/device/schema changes нет; populated native145 не повторялся для copy-only delta.
Окно завершает coherent группу IPv6/NetFlow142–150. Следующий151 — application GRE IPv6 address lifecycle. Native inner proof109/145 уже есть, но gre-live читает только /ip/address, а entity-snapshots create/restore/delete всегда используют IPv4 resource. Нельзя просто объединить IPv6 catalog без family-safe write/delete paths: одинаковые ROS IDs в разных namespaces и dynamic link-local требуют отдельной обработки. План151: static IPv6 catalog, family-aware paths, create/update/restore/delete+legacy snapshot compatibility, запрет неоднозначной смены primary при multiple addresses, profile/native own tunnel cleanup иUI metadata. Сначала проверить лимит; не выпускать partial family migration.12.5 открыт, public IPv6 WAN/outer и внешние integrations остаются в матрице.
+3 -3
View File
@@ -1,12 +1,12 @@
# План реализации UX/UI по пятичасовым окнам
Актуальное продолжение 2026-10-11: завершён12.5.149 — invalid month400 без current/zero fallback; calendar bounds исправлены для годов1–99/9999 и leap rates.5 SQL intervals в own DB/removed,984 outputs/build/ESLint,6 frontend checks и live400/200+PC/mobile passed. Backend ux-month149/frontend ux-scope148. Далее150 — ясные названия колонок Sessions вместо App/Proto/Iface/JH/EN, без изменения данных/темы.12.5 открыт.
Актуальное продолжение 2026-10-11: завершён12.5.150 — Sessions columns/направления подписаны по-русски, ReUI/Frame/base-nova/data/sort/filter сохранены.2 viewport checks/ESLint/sequential types/frontend build/live PC/mobile passed. Runtime backend ux-month149/frontend ux-sessions150. Блоки142–150 завершены локальными коммитами без push;12.5 открыт. Следующий151 — application GRE IPv6 address lifecycle: catalog/create/update/history restore/delete с family-safe paths и static-address ownership; сначала подтвердить бюджет.
Общий план проекта MikrotikManager. Основан на согласованном плане из задачи; точка продолжения обновлена 2026-10-10. Источник фактического прогресса, проверок и ограничений — [журнал реализации](ux-ui-progress.md). Этот документ задаёт объём и критерии завершения, журнал фиксирует результат.
## Актуальная точка продолжения — 2026-10-10
Актуальное продолжение 2026-10-11: завершён12.5.149 — invalid month400 без current/zero fallback; calendar bounds исправлены для годов1–99/9999 и leap rates.5 SQL intervals в own DB/removed,984 outputs/build/ESLint,6 frontend checks и live400/200+PC/mobile passed. Backend ux-month149/frontend ux-scope148. Далее150 — ясные названия колонок Sessions вместо App/Proto/Iface/JH/EN, без изменения данных/темы.12.5 открыт.
Актуальное продолжение 2026-10-11: завершён12.5.150 — Sessions columns/направления подписаны по-русски, ReUI/Frame/base-nova/data/sort/filter сохранены.2 viewport checks/ESLint/sequential types/frontend build/live PC/mobile passed. Runtime backend ux-month149/frontend ux-sessions150. Блоки142–150 завершены локальными коммитами без push;12.5 открыт. Следующий151 — application GRE IPv6 address lifecycle: catalog/create/update/history restore/delete с family-safe paths и static-address ownership; сначала подтвердить бюджет.
Этапы0–11 завершены в локальных границах журнала. История выполненных внешних блоков и доказательства сохранены в [журнале](ux-ui-stage-12.md) и [протоколе](ux-ui-external-acceptance.md). Реальная Telegram доставка, Portal SSO, multi-instance и оставшиеся профильные сетевые ограничения открыты.
@@ -371,6 +371,6 @@ flowchart LR
## 12.5.77 — основной блок IPsec (2026-10-09)
Актуальное продолжение 2026-10-11: завершён12.5.149 — invalid month400 без current/zero fallback; calendar bounds исправлены для годов1–99/9999 и leap rates.5 SQL intervals в own DB/removed,984 outputs/build/ESLint,6 frontend checks и live400/200+PC/mobile passed. Backend ux-month149/frontend ux-scope148. Далее150 — ясные названия колонок Sessions вместо App/Proto/Iface/JH/EN, без изменения данных/темы.12.5 открыт.
Актуальное продолжение 2026-10-11: завершён12.5.150 — Sessions columns/направления подписаны по-русски, ReUI/Frame/base-nova/data/sort/filter сохранены.2 viewport checks/ESLint/sequential types/frontend build/live PC/mobile passed. Runtime backend ux-month149/frontend ux-sessions150. Блоки142–150 завершены локальными коммитами без push;12.5 открыт. Следующий151 — application GRE IPv6 address lifecycle: catalog/create/update/history restore/delete с family-safe paths и static-address ownership; сначала подтвердить бюджет.
Подробный объём, протоколы, схема и ограничения: [12.5.77 в журнале](ux-ui-progress.md).
+22 -2
View File
@@ -1,6 +1,6 @@
# UX/UI: журнал реализации
Актуальное продолжение 2026-10-11: завершён12.5.149 — invalid month400 без current/zero fallback; calendar bounds исправлены для годов1–99/9999 и leap rates.5 SQL intervals в own DB/removed,984 outputs/build/ESLint,6 frontend checks и live400/200+PC/mobile passed. Backend ux-month149/frontend ux-scope148. Далее150 — ясные названия колонок Sessions вместо App/Proto/Iface/JH/EN, без изменения данных/темы.12.5 открыт.
Актуальное продолжение 2026-10-11: завершён12.5.150 — Sessions columns/направления подписаны по-русски, ReUI/Frame/base-nova/data/sort/filter сохранены.2 viewport checks/ESLint/sequential types/frontend build/live PC/mobile passed. Runtime backend ux-month149/frontend ux-sessions150. Блоки142–150 завершены локальными коммитами без push;12.5 открыт. Следующий151 — application GRE IPv6 address lifecycle: catalog/create/update/history restore/delete с family-safe paths и static-address ownership; сначала подтвердить бюджет.
Общий план: [UX/UI по этапам и пятичасовым окнам](ux-ui-plan.md). План задаёт объём, этот журнал фиксирует выполненные блоки и ограничения. Записи расположены от новых к старым; подробная история этапа12 также сохранена в [ux-ui-stage-12.md](ux-ui-stage-12.md).
@@ -36,7 +36,27 @@
| 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.3.83; внешняя12.5 в работе, выполненные блоки1–149 и ограничения ниже. Runtime backend ux-month149/frontend ux-scope148. |
| 12 | Итоговая доступность, адаптивность, производительность и регрессия | Локальная приёмка завершена в границах12.3.83; внешняя12.5 в работе, выполненные блоки1–150 и ограничения ниже. Runtime backend ux-month149/frontend ux-sessions150. |
## 12.5.150 — понятные названия колонок сессий (2026-10-11)
Существующая ReUI Sessions grid получила ясные подписи вместо внутренних сокращений:
| Было | Стало |
| --- | --- |
| JH | Экспортёр |
| EN | Выходной узел |
| App | Приложение |
| Proto | Протокол |
| Iface | Интерфейс |
| Напр. | Направление |
| Download / Upload (tooltip) | Получение / Отправка |
Column IDs, accessors, sorting/filtering, row values, direction meanings, grid layout/Frame/base-nova/vendor не менялись. Экспортёр описывает serverName корректнее, чем JH: данные могут поступать с разных типов устройств. IPv6 bracket/ICMPv6 labels146 сохранены.
Existing viewport1440/320 cases passed: endpoint/tooltip/IPv4/ICMPv6 behaviour иno document overflow. ESLint passed. Первый types check совпал с Next dev записью generated routes.d.ts и прочитал незавершённый файл; после окончания E2E/webserver TypeScript повторён последовательно и passed без изменения source. Production frontend build passed. Frontend ux-sessions150 развёрнут, backend ux-month149/PG healthy; [receipt](ux-ui/acceptance/flow-sessions-column-labels-2026-10-11.json), [readonly PC/mobile smoke](ux-ui/acceptance/traffic-sessions-labels-smoke-2026-10-11.json). Rollback image/env сохранены. Network/password/device/schema changes нет; populated native145 не повторялся для copy-only delta.
Окно завершает coherent группу IPv6/NetFlow142–150. Следующий151 — application GRE IPv6 address lifecycle. Native inner proof109/145 уже есть, но gre-live читает только /ip/address, а entity-snapshots create/restore/delete всегда используют IPv4 resource. Нельзя просто объединить IPv6 catalog без family-safe write/delete paths: одинаковые ROS IDs в разных namespaces и dynamic link-local требуют отдельной обработки. План151: static IPv6 catalog, family-aware paths, create/update/restore/delete+legacy snapshot compatibility, запрет неоднозначной смены primary при multiple addresses, profile/native own tunnel cleanup иUI metadata. Сначала проверить лимит; не выпускать partial family migration.12.5 открыт, public IPv6 WAN/outer и внешние integrations остаются в матрице.
## 12.5.149 — календарный месяц без тихой подмены и ложных нулей (2026-10-11)
+23 -3
View File
@@ -1,8 +1,8 @@
# Оставшаяся внешняя приёмка — 2026-10-11
Это актуальная матрица после 12.5.149. Исторические записи сохраняют версии и ограничения на момент выполнения; поздние проверки ниже уточняют их. Этап 12.5 открыт. Успех в двух CHR и одном backend не означает приёмку всех конфигураций, интеграций или полной регрессии.
Это актуальная матрица после 12.5.150. Исторические записи сохраняют версии и ограничения на момент выполнения; поздние проверки ниже уточняют их. Этап 12.5 открыт. Успех в двух CHR и одном backend не означает приёмку всех конфигураций, интеграций или полной регрессии.
Стенд: Debian13/Compose, PostgreSQL18.6, два CHR RouterOS7.24.5. Backend `ux-month149`, frontend `ux-scope148`; production lab использует AUTH_REQUIRED=false. Подписанные JWT/RBAC проверялись в изолированных процессах. Все собственные объекты112 удалены, исходные13 коллекций×2 (включая logging/certificates/files/routes) проверены; пароли не менялись.
Стенд: Debian13/Compose, PostgreSQL18.6, два CHR RouterOS7.24.5. Backend `ux-month149`, frontend `ux-sessions150`; production lab использует AUTH_REQUIRED=false. Подписанные JWT/RBAC проверялись в изолированных процессах. Все собственные объекты112 удалены, исходные13 коллекций×2 (включая logging/certificates/files/routes) проверены; пароли не менялись.
| Раздел | Подтверждено | Осталось / условие завершения |
| --- | --- | --- |
@@ -18,7 +18,7 @@
| Recursive routes | Production PUT/change/own history restore88, disabled guards, partial/unknown/applied outcomes, live формы/контекст | Автоматический rollback/retry, durable receipts и несколько экземпляров отсутствуют; PUT не является idempotent noop. Полная произвольная legacy catalog миграция не принята |
| Diagnostics/terminal | Allowlist/native reads, Ping/trace/route/MTU/DNS, actual avg-rtt, disabled guards, JWT/live PC/mobile89; real default memory tail/log limits/API/UI133 | DNS использует backend resolver; MTU — ограниченная оценка, не гарантированный максимум. Stop ожидания не доказывает остановку RouterOS команды; arbitrary CLI и physical disconnect не приняты |
| Portal/интеграции | Локальные и isolated JWT guards; UI/API error states в границах журналов | Настоящий Portal issuer/login/отзыв прав; RIPE SDK two-IP/no-fetch passed140, native IPv6 ULA flow pipeline passed145 (IPv4 transport), public IPv6 WAN/local licensed MaxMind/S3/container/certificate jobs и Gitea delivery требуют отдельных тестовых endpoints/аккаунтов. Не отправлять сообщения и не публиковать релиз без соответствующего поручения |
| Общая приёмка | Локальная12.3.83; UI1244/context221/compiled984 parity139; профильные build/E2E/live проверки последующих блоков | Traffic initial live mock-id gate passed141; IPv6 special ranges/cache passed142; unknown RIPE coordinates passed143; IPv6 synthetic UDP/worker/SQL passed144; native CHR ULA/IPFIX/API/UI passed145; ICMPv6/IPv6 endpoint labels passed146; HTTP DTO validation passed147; scoped flow catalog/serverId guards passed148; strict monthly calendar passed149; Sessions labels150; последующие изменения проверять отдельно; scoped axe не означает полную WCAG сертификацию |
| Общая приёмка | Локальная12.3.83; UI1244/context221/compiled984 parity139; профильные build/E2E/live проверки последующих блоков | Traffic initial live mock-id gate passed141; IPv6 special ranges/cache passed142; unknown RIPE coordinates passed143; IPv6 synthetic UDP/worker/SQL passed144; native CHR ULA/IPFIX/API/UI passed145; ICMPv6/IPv6 endpoint labels passed146; HTTP DTO validation passed147; scoped flow catalog/serverId guards passed148; strict monthly calendar passed149; Sessions labels passed150; application GRE IPv6 lifecycle151; последующие изменения проверять отдельно; scoped axe не означает полную WCAG сертификацию |
Доказательства и точные ограничения: [полная история этапа12](ux-ui-stage-12.md), [внешний протокол](ux-ui-external-acceptance.md), [BGP93](ux-ui/acceptance/bgp-failover-2026-10-10.json), [паспорт стенда](ux-ui-test-server.md). Невыполненные пункты не являются все блокерами данного лабораторного сценария: для выпуска необходимо явно определить требуемые конфигурации и принять их либо согласовать ограничение.
@@ -528,3 +528,23 @@ Calendar bounds больше не используют Date.UTC дляyear1..99
Backend ux-month149 развёрнут, frontend ux-scope148 сохранён, health healthy. Real API6 invalid months400 иcorrect2026-10→200/same month; initial smoke helper Fetch.status method typo исправлен только в harness, сохранён как setup error. [Full SQL/live receipt](ux-ui/acceptance/flow-month-calendar-2026-10-11.json), [PC/mobile smoke](ux-ui/acceptance/traffic-month-calendar-smoke-2026-10-11.json). Device/password changes нет, rollback retained. Это не расширяет UI на future month selection.
Следующий небольшой150 — понятные подписи Sessions columns вместо App/Proto/Iface/JH/EN, сохраняя ReUI grid/Frame/base-nova/data semantics.12.5 открыт.
## 12.5.150 — понятные названия колонок сессий (2026-10-11)
Существующая ReUI Sessions grid получила ясные подписи вместо внутренних сокращений:
| Было | Стало |
| --- | --- |
| JH | Экспортёр |
| EN | Выходной узел |
| App | Приложение |
| Proto | Протокол |
| Iface | Интерфейс |
| Напр. | Направление |
| Download / Upload (tooltip) | Получение / Отправка |
Column IDs, accessors, sorting/filtering, row values, direction meanings, grid layout/Frame/base-nova/vendor не менялись. Экспортёр описывает serverName корректнее, чем JH: данные могут поступать с разных типов устройств. IPv6 bracket/ICMPv6 labels146 сохранены.
Existing viewport1440/320 cases passed: endpoint/tooltip/IPv4/ICMPv6 behaviour иno document overflow. ESLint passed. Первый types check совпал с Next dev записью generated routes.d.ts и прочитал незавершённый файл; после окончания E2E/webserver TypeScript повторён последовательно и passed без изменения source. Production frontend build passed. Frontend ux-sessions150 развёрнут, backend ux-month149/PG healthy; [receipt](ux-ui/acceptance/flow-sessions-column-labels-2026-10-11.json), [readonly PC/mobile smoke](ux-ui/acceptance/traffic-sessions-labels-smoke-2026-10-11.json). Rollback image/env сохранены. Network/password/device/schema changes нет; populated native145 не повторялся для copy-only delta.
Окно завершает coherent группу IPv6/NetFlow142–150. Следующий151 — application GRE IPv6 address lifecycle. Native inner proof109/145 уже есть, но gre-live читает только /ip/address, а entity-snapshots create/restore/delete всегда используют IPv4 resource. Нельзя просто объединить IPv6 catalog без family-safe write/delete paths: одинаковые ROS IDs в разных namespaces и dynamic link-local требуют отдельной обработки. План151: static IPv6 catalog, family-aware paths, create/update/restore/delete+legacy snapshot compatibility, запрет неоднозначной смены primary при multiple addresses, profile/native own tunnel cleanup иUI metadata. Сначала проверить лимит; не выпускать partial family migration.12.5 открыт, public IPv6 WAN/outer и внешние integrations остаются в матрице.
+21 -1
View File
@@ -1,6 +1,6 @@
# Этап 12: итоговая приёмка UX/UI
Актуальное продолжение 2026-10-11: завершён12.5.149 — invalid month400 без current/zero fallback; calendar bounds исправлены для годов1–99/9999 и leap rates.5 SQL intervals в own DB/removed,984 outputs/build/ESLint,6 frontend checks и live400/200+PC/mobile passed. Backend ux-month149/frontend ux-scope148. Далее150 — ясные названия колонок Sessions вместо App/Proto/Iface/JH/EN, без изменения данных/темы.12.5 открыт.
Актуальное продолжение 2026-10-11: завершён12.5.150 — Sessions columns/направления подписаны по-русски, ReUI/Frame/base-nova/data/sort/filter сохранены.2 viewport checks/ESLint/sequential types/frontend build/live PC/mobile passed. Runtime backend ux-month149/frontend ux-sessions150. Блоки142–150 завершены локальными коммитами без push;12.5 открыт. Следующий151 — application GRE IPv6 address lifecycle: catalog/create/update/history restore/delete с family-safe paths и static-address ownership; сначала подтвердить бюджет.
План: [ux-ui-plan.md](ux-ui-plan.md). Фактические результаты: [ux-ui-progress.md](ux-ui-progress.md). Подготовлен после сводных проверок 11Б; завершение каждого блока требует локального коммита без push.
@@ -2918,3 +2918,23 @@ Calendar bounds больше не используют Date.UTC дляyear1..99
Backend ux-month149 развёрнут, frontend ux-scope148 сохранён, health healthy. Real API6 invalid months400 иcorrect2026-10→200/same month; initial smoke helper Fetch.status method typo исправлен только в harness, сохранён как setup error. [Full SQL/live receipt](ux-ui/acceptance/flow-month-calendar-2026-10-11.json), [PC/mobile smoke](ux-ui/acceptance/traffic-month-calendar-smoke-2026-10-11.json). Device/password changes нет, rollback retained. Это не расширяет UI на future month selection.
Следующий небольшой150 — понятные подписи Sessions columns вместо App/Proto/Iface/JH/EN, сохраняя ReUI grid/Frame/base-nova/data semantics.12.5 открыт.
## 12.5.150 — понятные названия колонок сессий (2026-10-11)
Существующая ReUI Sessions grid получила ясные подписи вместо внутренних сокращений:
| Было | Стало |
| --- | --- |
| JH | Экспортёр |
| EN | Выходной узел |
| App | Приложение |
| Proto | Протокол |
| Iface | Интерфейс |
| Напр. | Направление |
| Download / Upload (tooltip) | Получение / Отправка |
Column IDs, accessors, sorting/filtering, row values, direction meanings, grid layout/Frame/base-nova/vendor не менялись. Экспортёр описывает serverName корректнее, чем JH: данные могут поступать с разных типов устройств. IPv6 bracket/ICMPv6 labels146 сохранены.
Existing viewport1440/320 cases passed: endpoint/tooltip/IPv4/ICMPv6 behaviour иno document overflow. ESLint passed. Первый types check совпал с Next dev записью generated routes.d.ts и прочитал незавершённый файл; после окончания E2E/webserver TypeScript повторён последовательно и passed без изменения source. Production frontend build passed. Frontend ux-sessions150 развёрнут, backend ux-month149/PG healthy; [receipt](ux-ui/acceptance/flow-sessions-column-labels-2026-10-11.json), [readonly PC/mobile smoke](ux-ui/acceptance/traffic-sessions-labels-smoke-2026-10-11.json). Rollback image/env сохранены. Network/password/device/schema changes нет; populated native145 не повторялся для copy-only delta.
Окно завершает coherent группу IPv6/NetFlow142–150. Следующий151 — application GRE IPv6 address lifecycle. Native inner proof109/145 уже есть, но gre-live читает только /ip/address, а entity-snapshots create/restore/delete всегда используют IPv4 resource. Нельзя просто объединить IPv6 catalog без family-safe write/delete paths: одинаковые ROS IDs в разных namespaces и dynamic link-local требуют отдельной обработки. План151: static IPv6 catalog, family-aware paths, create/update/restore/delete+legacy snapshot compatibility, запрет неоднозначной смены primary при multiple addresses, profile/native own tunnel cleanup иUI metadata. Сначала проверить лимит; не выпускать partial family migration.12.5 открыт, public IPv6 WAN/outer и внешние integrations остаются в матрице.
+22 -2
View File
@@ -1,6 +1,6 @@
# Тестовый сервер UX/UI — 2026-10-10
Сервер161.104.46.222: завершён12.5.149 — invalid month400 без current/zero fallback; calendar bounds исправлены для годов1–99/9999 и leap rates.5 SQL intervals в own DB/removed,984 outputs/build/ESLint,6 frontend checks и live400/200+PC/mobile passed. Backend ux-month149/frontend ux-scope148. Далее150 — ясные названия колонок Sessions вместо App/Proto/Iface/JH/EN, без изменения данных/темы.12.5 открыт.
Сервер161.104.46.222: завершён12.5.150 — Sessions columns/направления подписаны по-русски, ReUI/Frame/base-nova/data/sort/filter сохранены.2 viewport checks/ESLint/sequential types/frontend build/live PC/mobile passed. Runtime backend ux-month149/frontend ux-sessions150. Блоки142–150 завершены локальными коммитами без push;12.5 открыт. Следующий151 — application GRE IPv6 address lifecycle: catalog/create/update/history restore/delete с family-safe paths и static-address ownership; сначала подтвердить бюджет.
| Параметр | Проверенное состояние |
| --- | --- |
@@ -14,7 +14,7 @@
| PostgreSQL | postgres:18-alpine,18.6;mmapp-test-postgres healthy;SELECT version() passed |
| Данные | Отдельный Compose project mmapp-test,том mmapp-test_mmapp-pgdata и каталог ./data |
| Доступ | PostgreSQL не публикуется;frontend3000/backend8000 привязаны к127.0.0.1 после запуска |
| Образы приложения | mmapp-test/backend:ux-month149 и mmapp-test/frontend:ux-scope148; запущены |
| Образы приложения | mmapp-test/backend:ux-month149 и mmapp-test/frontend:ux-sessions150; запущены |
Compose SHA256:3052bd6ab5d9865f97605cebfb5ff27a4410cd3357b81153a65a87fb7c92582f. OptionalBACKEND_IMAGE_TAG позволяетобновлятьbackendотдельно. Локальный и удалённый файлы совпали. Шаблоны: [Compose](../deploy/docker-compose.test.yml), [env без секретов](../deploy/env.test.example).
@@ -1344,3 +1344,23 @@ Calendar bounds больше не используют Date.UTC дляyear1..99
Backend ux-month149 развёрнут, frontend ux-scope148 сохранён, health healthy. Real API6 invalid months400 иcorrect2026-10→200/same month; initial smoke helper Fetch.status method typo исправлен только в harness, сохранён как setup error. [Full SQL/live receipt](ux-ui/acceptance/flow-month-calendar-2026-10-11.json), [PC/mobile smoke](ux-ui/acceptance/traffic-month-calendar-smoke-2026-10-11.json). Device/password changes нет, rollback retained. Это не расширяет UI на future month selection.
Следующий небольшой150 — понятные подписи Sessions columns вместо App/Proto/Iface/JH/EN, сохраняя ReUI grid/Frame/base-nova/data semantics.12.5 открыт.
## 12.5.150 — понятные названия колонок сессий (2026-10-11)
Существующая ReUI Sessions grid получила ясные подписи вместо внутренних сокращений:
| Было | Стало |
| --- | --- |
| JH | Экспортёр |
| EN | Выходной узел |
| App | Приложение |
| Proto | Протокол |
| Iface | Интерфейс |
| Напр. | Направление |
| Download / Upload (tooltip) | Получение / Отправка |
Column IDs, accessors, sorting/filtering, row values, direction meanings, grid layout/Frame/base-nova/vendor не менялись. Экспортёр описывает serverName корректнее, чем JH: данные могут поступать с разных типов устройств. IPv6 bracket/ICMPv6 labels146 сохранены.
Existing viewport1440/320 cases passed: endpoint/tooltip/IPv4/ICMPv6 behaviour иno document overflow. ESLint passed. Первый types check совпал с Next dev записью generated routes.d.ts и прочитал незавершённый файл; после окончания E2E/webserver TypeScript повторён последовательно и passed без изменения source. Production frontend build passed. Frontend ux-sessions150 развёрнут, backend ux-month149/PG healthy; [receipt](ux-ui/acceptance/flow-sessions-column-labels-2026-10-11.json), [readonly PC/mobile smoke](ux-ui/acceptance/traffic-sessions-labels-smoke-2026-10-11.json). Rollback image/env сохранены. Network/password/device/schema changes нет; populated native145 не повторялся для copy-only delta.
Окно завершает coherent группу IPv6/NetFlow142–150. Следующий151 — application GRE IPv6 address lifecycle. Native inner proof109/145 уже есть, но gre-live читает только /ip/address, а entity-snapshots create/restore/delete всегда используют IPv4 resource. Нельзя просто объединить IPv6 catalog без family-safe write/delete paths: одинаковые ROS IDs в разных namespaces и dynamic link-local требуют отдельной обработки. План151: static IPv6 catalog, family-aware paths, create/update/restore/delete+legacy snapshot compatibility, запрет неоднозначной смены primary при multiple addresses, profile/native own tunnel cleanup иUI metadata. Сначала проверить лимит; не выпускать partial family migration.12.5 открыт, public IPv6 WAN/outer и внешние integrations остаются в матрице.
@@ -0,0 +1,35 @@
{
"date": "2026-10-11",
"block": "12.5.150",
"runtime": {
"backend": "ux-month149",
"frontend": "ux-sessions150"
},
"labels": {
"JH": "Экспортёр",
"EN": "Выходной узел",
"App": "Приложение",
"Proto": "Протокол",
"Iface": "Интерфейс",
"Напр.": "Направление",
"Download": "Получение",
"Upload": "Отправка"
},
"checks": {
"existingIpv6ViewportCasesPassed": 2,
"eslintPassed": true,
"sourceOnlyTypesPassedAfterDevStopped": true,
"frontendProductionBuildPassed": true,
"deployedReadonlyPcMobileSmokePassed": true
},
"initialTypeCheck": {
"failed": true,
"reason": "Concurrent Next dev generation produced incomplete .next/dev/types/routes.d.ts during TypeScript read; sequential rerun after E2E/webserver stop passed without source repair"
},
"bounds": [
"Existing ReUI grid/Frame/base-nova reused; no vendor/theme/layout/data/sort/filter/access changes",
"Protocol/address labels146 retained; source-only type check performed sequentially after transient generated-file race",
"Source/frontend-only delta; backend149 retained, no network objects or credential changes",
"Readonly live smoke uses current lab catalog; full populated native145 screenshots remain historical"
]
}
@@ -0,0 +1,84 @@
{
"date": "2026-10-11",
"block": "12.5.150",
"runtime": {
"backend": "ux-month149",
"frontend": "ux-sessions150"
},
"checks": {
"readOnlyFrontendUnchanged": true,
"backendHealthy": true,
"backendProductionBuildPassed": true
},
"cases": [
{
"width": 1440,
"httpStatus": 200,
"api": [
{
"path": "/api/traffic/users",
"status": 200
},
{
"path": "/api/traffic/bound-interfaces",
"status": 200
},
{
"path": "/api/traffic/servers",
"status": 200
},
{
"path": "/api/traffic/servers/1/live",
"status": 200
},
{
"path": "/api/traffic/servers/1",
"status": 200
},
{
"path": "/api/traffic/servers/1/interfaces",
"status": 200
}
],
"pageErrors": [],
"noOverflow": true
},
{
"width": 320,
"httpStatus": 200,
"api": [
{
"path": "/api/traffic/users",
"status": 200
},
{
"path": "/api/traffic/bound-interfaces",
"status": 200
},
{
"path": "/api/traffic/servers",
"status": 200
},
{
"path": "/api/traffic/servers/1/live",
"status": 200
},
{
"path": "/api/traffic/servers/1/interfaces",
"status": 200
},
{
"path": "/api/traffic/servers/1",
"status": 200
}
],
"pageErrors": [],
"noOverflow": true
}
],
"bounds": [
"Read-only initial loading with real current lab catalog; no full NetFlow ingestion or throughput claim",
"Catalog failure and pending loading checked by controlled E2E; numeric live server details/interfaces/SSE enabled only after confirmed catalog ownership",
"Interface filter remains selected on range changes; backend source switch invalidates prior catalog ownership"
]
}