fix(stacks): сохранять стек-крошки при Quick Actions контейнера #24
Reference in New Issue
Block a user
Delete Branch "fix/stack-breadcrumb-quickactions"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
Чинит баг из твоего скрина: в списке контейнеров стека клик по иконке Quick Actions (Logs/Stats/Console/Inspect/Attach) уводил на ГЛОБАЛЬНЫЙ роут
docker.containers.container.*и схлопывал хлебные крошки в «Containers > … > Logs», теряя стек-трейл (который добавил #7).Причина: таблица контейнеров стека переиспользует общую datatable контейнеров, а её колонка Quick Actions хардкодила глобальные ссылки. Стек-скоуп состояния
docker.stacks.stack.container.*уже были (из #7) — Quick Actions на них просто не смотрели.Фикс: прокидываю параметры маршрута стека через RowContext в
ContainerQuickActions; когда рендеримся внутри стека — ссылки ведут наdocker.stacks.stack.container.{logs,stats,inspect,exec,attach}(переиспользуюbuildStackContainerLinkParams/STACK_CONTAINER_STATE_NAMEиз #7). Глобальный список контейнеров и вкладка задач сервиса стек-параметров не передают → их ссылки не меняются.Доводка к #7 (тот уже смержен), поэтому отдельным PR.
How verified
ContainerQuickActions.test.tsx: без стек-контекста все 5 ссылок →docker.containers.container.*c {id,nodeName}; со стек-контекстом →docker.stacks.stack.container.*c параметрами стека + id/nodeName.tsc --noEmit— 0;eslintизменённых — 0;vitest— passed.__module.js; набор параметров для перестроения крошек полный, внешние стеки обработаны).Checklist
The stack container list reuses the shared containers datatable, whose Quick Actions column linked to the global docker.containers.container.* states with only {id,nodeName}. Clicking Logs/Stats/Console/Inspect/Attach from within a stack therefore jumped to the global route and collapsed the breadcrumb to "Containers > <name> > Logs", losing the stack trail that PR #7 added. Thread the current stack route params (via RowContext) down to ContainerQuickActions so, when rendered inside a stack, its links target the stack-scoped docker.stacks.stack.container.* sub-tab states (reusing #7's buildStackContainerLinkParams / STACK_CONTAINER_STATE_NAME helpers). The global containers list and service tasks pass no stack params and keep the global links unchanged. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>Ревью
f379e8057— раунд 1 (полный фан-аут: security/stability/regressions/test-coverage/conventions/simplification/architecture/coherence, отдельный субагент на аспект).Вердикт: PASS. Фикс делает ровно то, что нужно, и не задевает ничего вокруг. Готово к мержу.
Что проверено
getContainerSubTabBreadcrumbs(state, params, …)— то есть трейл выводится и из имени состояния (isStackContainerState→startsWith('docker.stacks.stack.container')), и из route-параметров. Фикс линкует наdocker.stacks.stack.container.{tab}— это реальные дочерние состоянияdocker.stacks.stack, зарегистрированные вapp/docker/__module.js(все пять: logs/inspect/stats/exec/attach). Ключи совпадают на каждом стыке:docker.stacks.stackurl-params (name,stackId,type,regular,external,orphaned,orphanedRunning,tab) →useCurrentStateAndParams().params→ RowContextstackRouteParams→buildStackContainerLinkParams({...stackRouteParams, nodeName}, id)(читает ровно эти ключи, добавляетid/nodeName). Тихого рассинхрона ключей нет — фикс действительно восстанавливает трейл «Stacks › стек › контейнер › таб», а не просто компилируется.ContainerQuickActionsбезstackLinkParamsдаёт БАЙТ-идентичное старое поведение (to="docker.containers.container.<tab>",params={id,nodeName}). Оба не-стековых вызова падают в этот путь: глобальный список контейнеров передаёт только{environment}; вкладка задач сервиса проп не передаёт вовсе.isActive-гейтинг stats/exec/attach не тронут. Второй потребитель того же RowContext (ports.tsx) берёт толькоenvironment— новое опциональное поле его не задевает.docker.stacks.stackдекларирует нужные url-параметры;useRowContext()не роняет — оба потребителя колонки обёрнуты вRowProvider, а путь service-tasks зовёт компонент напрямую (без колонки).ContainerQuickActions.test.tsxгоняет реальный компонент (мок только@@/Link/Authorized), обе ветки non-vacuous (реверт логики роутинга уронил бы ассерты), сверяется с реальнымbuildStackContainerLinkParams, а не с реимплементацией. Тонкая обвязка (колонка/дататейбл) — pass-through, отдельный интеграционный тест был бы gold-plating (риск низкий).useCurrentStateAndParamsидиоматичен, типRecord<string, string|undefined>совпадает с сигнатуройbuildStackContainerLinkParams, абстракцияlinkTo/linkParamsпропорциональна (5 ссылок), дублей нет.Объективные проверки (запущены в окружении ревью, не со слов кодера)
tsc --noEmit -p .(весь проект) — exit 0.eslintпо 5 изменённым файлам — чисто.vitest run ContainerQuickActions.test.tsx— 2 passed.Маркер
reviewed_headобновлён наf379e8057.