From b1f832630420cccec23fb022ef3bf9e6dfd8fe27 Mon Sep 17 00:00:00 2001 From: Denozordec Date: Sun, 4 Oct 2026 23:19:14 +0700 Subject: [PATCH] =?UTF-8?q?fix(ui):=20=D0=B2=D0=BE=D0=B7=D0=B2=D1=80=D0=B0?= =?UTF-8?q?=D1=89=D0=B0=D1=82=D1=8C=20=D1=84=D0=BE=D0=BA=D1=83=D1=81=20?= =?UTF-8?q?=D1=82=D0=B5=D1=80=D0=BC=D0=B8=D0=BD=D0=B0=D0=BB=D0=B0=20=D0=BF?= =?UTF-8?q?=D0=BE=D1=81=D0=BB=D0=B5=20=D0=B2=D0=BA=D0=BB=D1=8E=D1=87=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F=20=D0=BF=D0=BE=D0=BB=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/(main)/terminal/page.tsx | 10 ++++-- docs/ux-ui-performance.md | 6 ++-- docs/ux-ui-plan.md | 4 +-- docs/ux-ui-progress.md | 4 +-- docs/ux-ui-stage-12.md | 9 +++++ .../acceptance/terminal-focus-2026-10-04.json | 34 +++++++++++++++++++ 6 files changed, 57 insertions(+), 10 deletions(-) create mode 100644 docs/ux-ui/acceptance/terminal-focus-2026-10-04.json diff --git a/app/(main)/terminal/page.tsx b/app/(main)/terminal/page.tsx index 34751c31..09f9fded 100644 --- a/app/(main)/terminal/page.tsx +++ b/app/(main)/terminal/page.tsx @@ -179,9 +179,15 @@ function Terminal({server,isLive,backendUrl,canExecute,blockedReason}:{server:Te const [lines,setLines]=useState([{id:0,kind:"info",text:isLive?"REST: каждое выполнение — отдельный запрос; соединение с устройством пока не проверено.":"Демо: команды возвращают синтетические данные."}]) const [input,setInput]=useState(""),[history,setHistory]=useState([]),[histIdx,setHistIdx]=useState(-1),[executing,setExecuting]=useState(false),[error,setError]=useState(null),[completed,setCompleted]=useState(null) const nextId=useRef(1),lock=useRef(false),reader=useRef<{alive:boolean;controller:AbortController|null}>({alive:true,controller:null}) - const inputRef=useRef(null),scrollRef=useRef(null),followOutput=useRef(true) + const inputRef=useRef(null),scrollRef=useRef(null),followOutput=useRef(true),pendingFocus=useRef(false) useEffect(()=>{const state=reader.current;state.alive=true;return()=>{state.alive=false;state.controller?.abort()}},[]) useEffect(()=>{if(followOutput.current)scrollRef.current?.scrollTo({top:scrollRef.current.scrollHeight,behavior:"auto"})},[lines]) + // Focus only after React has committed the re-enabled input. + useEffect(()=>{ + if(executing||!pendingFocus.current)return + pendingFocus.current=false + if(reader.current.alive&&!inputRef.current?.disabled)inputRef.current?.focus() + },[executing,lines]) function append(kind:TermLine["kind"],text:string) { const added=text.split("\n").map(text=>({id:nextId.current++,kind,text})) setLines(previous=>{const merged=[...previous.filter(line=>line.id!==-1),...added];return merged.length>1000||previous.some(line=>line.id===-1)?[{id:-1,kind:"info",text:"Показаны последние 1000 строк; ранний вывод удалён."},...merged.slice(-1000)]:merged}) @@ -205,7 +211,7 @@ function Terminal({server,isLive,backendUrl,canExecute,blockedReason}:{server:Te append("error",message);setError(message) } finally { window.clearTimeout(timer);lock.current=false - if(reader.current.alive){setExecuting(false);reader.current.controller=null;requestAnimationFrame(()=>inputRef.current?.focus())} + if(reader.current.alive){pendingFocus.current=true;setExecuting(false);reader.current.controller=null} } } function handleKey(e:React.KeyboardEvent){ diff --git a/docs/ux-ui-performance.md b/docs/ux-ui-performance.md index cfc1ca28..a2b0f388 100644 --- a/docs/ux-ui-performance.md +++ b/docs/ux-ui-performance.md @@ -15,19 +15,17 @@ ## Оставшиеся специализированные grids -Аудит12.3.36 от2026-10-04: точный поиск `manualPagination: true` в components/data-grids —7 файлов после12.3.57. Это не7 доказанных дефектов: есть фиксированный источник, demo, неподключённый компонент и ограниченные срезы. Файлы ниже сопоставлены с действующими JSX-потребителями; ограничения установлены чтением кода, не нагрузочной приёмкой API. +Актуальная карта после12.3.63 от2026-10-04: точный поиск manualPagination:true в components/data-grids —5 файлов. Это не5 доказанных дефектов: есть фиксированный источник, demo, неподключённый компонент и ограниченный серверный срез. Источники сопоставлены с JSX-потребителями; ограничения установлены чтением кода, не нагрузочной приёмкой API. | Файл | Источник и необходимая проверка | | --- | --- | | [data-collection-scheduler-data-grid.tsx](../components/data-grids/data-collection-scheduler-data-grid.tsx) | 11 фиксированных SCHEDULER_JOB_KEYS (lib/scheduler-settings.ts); UI map этих ключей. Fixture1000 не соответствует источнику. | | [gre-pools-data-grid.tsx](../components/data-grids/gre-pools-data-grid.tsx) | В live displayPools=[]; только mockGrePools в demo. Приоритета live1000 нет. | | [probes-schedule-data-grid.tsx](../components/data-grids/probes-schedule-data-grid.tsx) | Только demo ScheduleTab/INIT_RULES3; live использует ProbesSpeedSchedule. Demo список расширяется пользователем; не доказательство live API. | -| [route-optimizer-comm-recs-data-grid.tsx](../components/data-grids/route-optimizer-comm-recs-data-grid.tsx) | Live commRecs slice(0,24) на HomeCard, не на страницу. Проверить количество HomeCard и честность ограничения рекомендаций. | -| [route-optimizer-wan-matrix-data-grid.tsx](../components/data-grids/route-optimizer-wan-matrix-data-grid.tsx) | Live сочетания WAN×jumpHost на HomeCard; динамические столбцы/много HomeCard требуют собственного профиля. | | [subusers-data-grid.tsx](../components/data-grids/subusers-data-grid.tsx) | Поиск импортов/JSX в app/components не нашёл потребителя: компонент экспортируется, но не подключён. Не доказывает дефект экрана /users. | | [traffic-flows-data-grid.tsx](../components/data-grids/traffic-flows-data-grid.tsx) | FlowAnalyticsPanel/conversationsList: backend traffic-flow-analytics.ts top=min(50,max(10,settings.topN)), slice(0,top). Это top slice, не полный каталог/серверная pagination. Проверить сообщение об ограничении50 и связывание с графиками. | -Очередь: many HomeRouterCard/optimizer матрицы/комбинаторика. OSPF topology/node details/preview приняты локально в12.3.50–53. Scheduler11, traffic cap50 и commRecs24 проверять на реальной границе, не искусственно подставлять1000 в недоступный DTO. Demo и неиспользуемый Subusers отделены от live приёмки. Все новые профили должны сохранять search/sort/refresh/clamp, точный target и права,320px и URL scope. +HomeRouterCard/pages, WAN matrix и полный Community-каталог приняты локально в12.3.55/60/63; скрытый срез24 устранён. CPU7WAN×20 проверен в12.3.61, произвольный большой mixed pool не принят. OSPF topology/details/preview приняты в12.3.50–53. Остаются полные текстовые сводки WAN/JH/Exit, общая context регрессия и внешняя12.5. Demo и Subusers отделены от live приёмки. Принятые после ранней карты: OSPF routes/BFD, WireGuard interfaces/peers/detail, VXLAN/GRE tunnels. Pagination сохраняет полный DTO в памяти и не доказывает серверную производительность. Текущий журнал: [ux-ui-progress.md](ux-ui-progress.md). diff --git a/docs/ux-ui-plan.md b/docs/ux-ui-plan.md index decb80e0..9a7b9baf 100644 --- a/docs/ux-ui-plan.md +++ b/docs/ux-ui-plan.md @@ -1,12 +1,12 @@ # План реализации UX/UI по пятичасовым окнам -Актуальное продолжение 2026-10-04: 12.4.6 main на991f2b3 завершён:1161/1162 passed, один focus race терминала. Следующий12.4.6.1: восстановить фокус после React commit и повторить terminal tests; затем12.4.7 общий context. 12.5 и большие текстовые сводки WAN остаются. +Актуальное продолжение 2026-10-04: 12.4.6.1 focus race исправлен:20 terminal +15 repeats/types/lint/build passed. Следующий12.4.7: полная context матрица221/26 текущего HEAD. Затем12.3.64 компактные текстовые сводки WAN/JH/Exit и дополнительные CPU-профили; внешняя12.5 отдельно. Общий план проекта MikrotikManager. Основан на согласованном плане из задачи; точка продолжения обновлена 2026-10-04. Источник фактического прогресса, проверок и ограничений — [журнал реализации](ux-ui-progress.md). Этот документ задаёт объём и критерии завершения, журнал фиксирует результат. ## Актуальная точка продолжения — 2026-10-04 -Этапы0–11 завершены в описанных локальных границах. Этап12 продолжается: доступность12.1, достоверность12.2.1–12.2.10 и профили12.3.1–12.3.63 записаны в журнале. Последняя общая main регрессия12.4.6 на991f2b3:1161 из1162 passed,1 focus race терминала; требуется профильное исправление и новая context матрица12.4.7. Полный источник данных сохраняется, большие DOM ограничены страницами/окнами. Внешняя12.5 и реальные интеграции не приняты. Подробная история и точные ограничения: docs/ux-ui-stage-12.md. +Этапы0–11 завершены в описанных локальных границах. Этап12 продолжается: доступность12.1, достоверность12.2.1–12.2.10 и профили12.3.1–12.3.63 записаны в журнале. Последняя общая main регрессия12.4.6 на991f2b3:1161 из1162 passed,1 focus race терминала, исправленный в12.4.6.1 с20+15 профильными проверками; требуется новая context матрица12.4.7. Полный источник данных сохраняется, большие DOM ограничены страницами/окнами. Внешняя12.5 и реальные интеграции не приняты. Подробная история и точные ограничения: docs/ux-ui-stage-12.md. Реальные pg_dump/pg_restore, PG rollback и остановка UDP worker требуют внешней приёмки. Датированные продолжения ниже — история; точный следующий шаг также указан в начале [журнала](ux-ui-progress.md). diff --git a/docs/ux-ui-progress.md b/docs/ux-ui-progress.md index 771bd476..e92581cf 100644 --- a/docs/ux-ui-progress.md +++ b/docs/ux-ui-progress.md @@ -1,6 +1,6 @@ # UX/UI: журнал реализации -Актуальное продолжение 2026-10-04: 12.4.6 main на991f2b3 завершён:1161/1162 passed, один focus race терминала. Следующий12.4.6.1: восстановить фокус после React commit и повторить terminal tests; затем12.4.7 общий context. 12.5 и большие текстовые сводки WAN остаются. +Актуальное продолжение 2026-10-04: 12.4.6.1 focus race исправлен:20 terminal +15 repeats/types/lint/build passed. Следующий12.4.7: полная context матрица221/26 текущего HEAD. Затем12.3.64 компактные текстовые сводки WAN/JH/Exit и дополнительные CPU-профили; внешняя12.5 отдельно. Общий план: [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.1–12.2.10 и12.3.1–12.3.63 приняты в описанных локальных границах.12.4.6 main1161/1162 выявил focus race терминала; исправление и общая context матрица впереди.12.5 внешняя приёмка не выполнена. | +| 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.5 впереди. | ## 12.3.49 — большая таблица соседей OSPF (2026-10-04) diff --git a/docs/ux-ui-stage-12.md b/docs/ux-ui-stage-12.md index 76dd678b..a3cb04d2 100644 --- a/docs/ux-ui-stage-12.md +++ b/docs/ux-ui-stage-12.md @@ -715,3 +715,12 @@ WAN1000×JH1:1000→50rows,28019→1419tableDOM,28712→2149pageDOM,2264ms dev-r 2026-10-04, HEAD991f2b3.1162 сценария/190 файлов:1161passed,1unexpected,0skipped/0flaky за55.2min. Edge/1worker/retries0/maxFailures12. Единственный сбой terminal-data: поле не получило focus после успешного повтора BFD error. Вероятная гонка requestAnimationFrame с React commit/re-enable. Общая матрица НЕ объявляется полностью пройденной. Доказательство docs/ux-ui/acceptance/main-delta-2026-10-04.json; trace/error сохранены в tmp перед следующими тестами. Перегенерированные этим прогоном исторические PNG восстановлены по явному списку tmp/ux-main-regenerated-screens.json; собственные новые матричные/Community screenshots сохранены. Все новые большие профили, Firewall/OSPF/optimizer сценарии вошли в этот общий прогон. Статический аудит дополнительно выявил полный join1000WAN в шапке HomeCard и полные site-строки JH/Exit в KPI: число DOM nodes не измеряет высоту текстовых сводок. Следующий12.4.6.1 — фокус после commit и профильный repeat; затем12.4.7 context. Внешняя12.5 отдельно. + + +## 12.4.6.1 — исправление гонки фокуса терминала + +2026-10-04. requestAnimationFrame из finally заменён pendingFocus ref и DOM effect после commit. Поле получает focus только после снятия disabled; unmounted/blocked terminal не перехватывает фокус. Зависимость от lines покрывает быстрый запрос, даже когда executing=true/false попадают в один React batch. Порядок запросов, права, ownership и сохранение команд не менялись. + +20 terminal-data/layout passed; все3 формы отказа повторены5раз:15/15passed,0unexpected/flaky. Evidence docs/ux-ui/acceptance/terminal-focus-2026-10-04.json содержит baseHead и SHA256 проверенного source. ESLint и production build прошли; отдельный non-incremental TypeScript повторён после завершения dev-сервера успешно. Первый параллельный tsc попал на временную перезапись .next/dev/types/routes.d.ts; исходники не имели этой ошибки. Исторические6 terminal PNG восстановлены по точному списку. + +Это профильное закрытие единственного сбоя main12.4.6, не новый полный main прогон на исправленном HEAD. Следующий12.4.7 —221 context/26files (актуальная discovery; прежняя матрица213/25). Внешняя12.5 остаётся. diff --git a/docs/ux-ui/acceptance/terminal-focus-2026-10-04.json b/docs/ux-ui/acceptance/terminal-focus-2026-10-04.json new file mode 100644 index 00000000..737fe7bd --- /dev/null +++ b/docs/ux-ui/acceptance/terminal-focus-2026-10-04.json @@ -0,0 +1,34 @@ +{ + "baseHead": "55df77296ac8589c4298d86aae068883a5a24279", + "sourceFile": "app/(main)/terminal/page.tsx", + "sourceSha256": "5c64a8ea9f028a628bdd90f883b465050806f2ca97e7b35bb4b23009b1e470d9", + "browser": "msedge", + "workers": 1, + "retries": 0, + "runs": [ + { + "source": "tmp/ux-terminal-focus-20261004.json", + "stats": { + "startTime": "2026-10-04T16:13:28.655Z", + "duration": 89927.628, + "expected": 20, + "skipped": 0, + "unexpected": 0, + "flaky": 0 + }, + "errors": [] + }, + { + "source": "tmp/ux-terminal-focus-repeat-20261004.json", + "stats": { + "startTime": "2026-10-04T16:15:28.809Z", + "duration": 43378.041, + "expected": 15, + "skipped": 0, + "unexpected": 0, + "flaky": 0 + }, + "errors": [] + } + ] +}