From 8eebedf6578641734d23a42eb360d14855bdfc4b Mon Sep 17 00:00:00 2001 From: Andrey Epifancev Date: Tue, 27 Oct 2026 18:04:40 +0400 Subject: [PATCH] =?UTF-8?q?fix(web):=20=D1=81=D0=BC=D0=B5=D0=BD=D0=B0=20?= =?UTF-8?q?=D0=B2=D0=BA=D0=BB=D0=B0=D0=B4=D0=BA=D0=B8=20=D0=BE=D1=82=D1=87?= =?UTF-8?q?=D1=91=D1=82=D0=B0=20=D0=B1=D0=B5=D0=B7=20=D0=BD=D0=BE=D0=B2?= =?UTF-8?q?=D0=BE=D0=B9=20=D0=B7=D0=B0=D0=BF=D0=B8=D1=81=D0=B8=20=D0=B8?= =?UTF-8?q?=D1=81=D1=82=D0=BE=D1=80=D0=B8=D0=B8=20=E2=80=94=20=C2=AB=D0=9D?= =?UTF-8?q?=D0=B0=D0=B7=D0=B0=D0=B4=C2=BB=20=D0=BA=20=D1=81=D0=BF=D0=B8?= =?UTF-8?q?=D1=81=D0=BA=D1=83=20=D0=BA=D0=BE=D0=BD=D1=81=D0=BE=D0=BB=D0=B8?= =?UTF-8?q?=D0=B4=D0=B0=D1=86=D0=B8=D0=B9=20(#191,=20AURORA-1851)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit reportTabNavigation: адрес новой вкладки и replace; OsvTabs переходит через неё (и после модалки [31-00]). Change report-tabs-history: MODIFIED «Вкладки страницы отчёта по версии» (intercompany-matrix-ui). Co-Authored-By: Claude Opus 5.5 --- .../report-tabs-history/.openspec.yaml | 2 ++ .../changes/report-tabs-history/proposal.md | 32 +++++++++++++++++++ .../specs/intercompany-matrix-ui/spec.md | 29 +++++++++++++++++ openspec/changes/report-tabs-history/tasks.md | 8 +++++ web/src/utils/consolidations.test.ts | 10 ++++++ web/src/utils/consolidations.ts | 9 ++++++ web/src/widgets/ConsolidatedOsv/OsvTabs.tsx | 6 ++-- 7 files changed, 93 insertions(+), 3 deletions(-) create mode 100644 openspec/changes/report-tabs-history/.openspec.yaml create mode 100644 openspec/changes/report-tabs-history/proposal.md create mode 100644 openspec/changes/report-tabs-history/specs/intercompany-matrix-ui/spec.md create mode 100644 openspec/changes/report-tabs-history/tasks.md diff --git a/openspec/changes/report-tabs-history/.openspec.yaml b/openspec/changes/report-tabs-history/.openspec.yaml new file mode 100644 index 0000000..97e3642 --- /dev/null +++ b/openspec/changes/report-tabs-history/.openspec.yaml @@ -0,0 +1,2 @@ +schema: spec-driven +created: 2026-10-27 diff --git a/openspec/changes/report-tabs-history/proposal.md b/openspec/changes/report-tabs-history/proposal.md new file mode 100644 index 0000000..f095e54 --- /dev/null +++ b/openspec/changes/report-tabs-history/proposal.md @@ -0,0 +1,32 @@ +## Why + +AURORA-1851: на странице отчёта версии каждое переключение вкладок «ОСВ» / «Шахматка» добавляет запись в историю браузера, +и «Назад» в шапке (`navigate(-1)`) сначала проходит по всем переключениям и только потом возвращает к списку консолидаций. +Та же ошибка, что в переключателе документа (AURORA-1692, PR #171), но в вкладках отчёта. + +## What Changes + +Репозиторий — только arm-core (`web/`), эндпоинты без изменений. + +- Смена вкладки отчёта — заменой текущей записи истории (`navigate(…, { replace: true })`); расчёт адреса и опций + вынесен в `reportTabNavigation` (`web/src/utils/consolidations.ts`) и закреплён тестом. +- Дельта `intercompany-matrix-ui`: MODIFIED «Вкладки страницы отчёта по версии» — поведение истории и сценарий «Назад после + переключения вкладок». + +## Non-goals + +- Вход в отчёт из списка консолидаций («К отчётности») — обычный переход с новой записью, чтобы «Назад» вёл к списку. +- Изменения бэкенда и DBML. + +## Capabilities + +### New Capabilities + +### Modified Capabilities + +- `intercompany-matrix-ui`: MODIFIED «Вкладки страницы отчёта по версии». + +## Impact + +- `web/src/widgets/ConsolidatedOsv/OsvTabs.tsx` — функция `go`; модалка [31-00] переходит через неё же. +- `web/src/utils/consolidations.ts` (+ тест) — `reportTabNavigation`. diff --git a/openspec/changes/report-tabs-history/specs/intercompany-matrix-ui/spec.md b/openspec/changes/report-tabs-history/specs/intercompany-matrix-ui/spec.md new file mode 100644 index 0000000..052920e --- /dev/null +++ b/openspec/changes/report-tabs-history/specs/intercompany-matrix-ui/spec.md @@ -0,0 +1,29 @@ +## MODIFIED Requirements + +### Requirement: Вкладки страницы отчёта по версии +Страница `/groups/:group_id/versions/:version_id/:tab` SHALL показывать шапку версии (ГК, период, статус отчёта) один раз +и под ней ряд вкладок шагов консолидации и содержимое активной вкладки. Активная вкладка определяется сегментом `:tab`: +`osv` — «ОСВ» (сводная ОСВ), `chess` — «Шахматка». Выбор вкладки SHALL менять последний сегмент адреса на ключ вкладки +(навигация, не локальное состояние) заменой текущей записи истории браузера, без новой записи: кнопка «Назад» в шапке и +кнопка «Назад» браузера ведут туда, откуда открыт отчёт, а не по переключениям вкладок (AURORA-1851). Активная вкладка +подсвечена зелёным и выделена жирным. Неизвестный ключ вкладки SHALL +заменяться на `osv` без новой записи в истории браузера. Вкладки «Таблица корректировки», «Гудвилл», «КФО», «КФО Общий», +«Подтверждение КФО клиента» SHALL быть недоступны с подсказкой «Будет в следующих срезах». При смене `version_id` всё +состояние страницы (карточка версии, данные, фильтры) SHALL создаваться заново. + +#### Scenario: Переход на шахматку +- **WHEN** открыта сводная ОСВ версии по адресу `…/versions/{id}/osv` и нажата вкладка «Шахматка» +- **THEN** адрес становится `…/versions/{id}/chess`, шапка версии остаётся, под вкладками показана шахматка + +#### Scenario: Прежний адрес сводной ОСВ +- **WHEN** открыт адрес `…/versions/{id}/osv` +- **THEN** показана сводная ОСВ, вкладка «ОСВ» активна + +#### Scenario: Неизвестная вкладка +- **WHEN** открыт адрес `…/versions/{id}/abc` +- **THEN** адрес заменяется на `…/versions/{id}/osv`, показана сводная ОСВ; кнопка «Назад» браузера не возвращает на `…/abc` + +#### Scenario: Назад после переключения вкладок +- **WHEN** аналитик открыл отчёт версии кнопкой «К отчётности» в списке консолидаций, переключился «Шахматка» → «ОСВ» → + «Шахматка» и нажал «Назад» в шапке +- **THEN** одним нажатием открыт список консолидаций ГК diff --git a/openspec/changes/report-tabs-history/tasks.md b/openspec/changes/report-tabs-history/tasks.md new file mode 100644 index 0000000..b6c3c1d --- /dev/null +++ b/openspec/changes/report-tabs-history/tasks.md @@ -0,0 +1,8 @@ +## 1. Вкладки отчёта (AURORA-1851, RSHB/arm-core#191) + +- [x] 1.1 `web/src/utils/consolidations.ts`: `reportTabNavigation` — адрес новой вкладки и `{ replace: true }`; тест в + `consolidations.test.ts`. +- [x] 1.2 `web/src/widgets/ConsolidatedOsv/OsvTabs.tsx`: `go` переходит через `reportTabNavigation`. +- [x] 1.3 Дельта `intercompany-matrix-ui`: MODIFIED «Вкладки страницы отчёта по версии». +- [x] 1.4 Проверка в браузере по сценарию тестировщика: «К отчётности» → «Шахматка» → «ОСВ» → «Шахматка» → «Назад» — + одним нажатием список консолидаций. diff --git a/web/src/utils/consolidations.test.ts b/web/src/utils/consolidations.test.ts index 2b38b92..5a56c7d 100644 --- a/web/src/utils/consolidations.test.ts +++ b/web/src/utils/consolidations.test.ts @@ -13,6 +13,7 @@ import { manualTransitions, needsUnmappedWarning, parseInWorkOnly, + reportTabNavigation, versionLabel, } from './consolidations'; @@ -133,3 +134,12 @@ describe('модалка [31-00]', () => { expect(needsUnmappedWarning(undefined)).toBe(false); }); }); + +describe('вкладки отчёта (AURORA-1851)', () => { + it('смена вкладки заменяет запись истории: «Назад» ведёт со страницы отчёта, а не по вкладкам', () => { + expect(reportTabNavigation('/groups/g1/versions/v1/osv', 'osv', 'chess')).toEqual({ + to: '/groups/g1/versions/v1/chess', + options: { replace: true }, + }); + }); +}); diff --git a/web/src/utils/consolidations.ts b/web/src/utils/consolidations.ts index caad8c5..77b3854 100644 --- a/web/src/utils/consolidations.ts +++ b/web/src/utils/consolidations.ts @@ -91,3 +91,12 @@ export const MIN_PERIMETER = 2; /** Модалка [31-00] нужна при уходе со вкладки «ОСВ», пока есть несопоставленные строки. */ export const needsUnmappedWarning = (unmappedTotal: number | null | undefined): boolean => (unmappedTotal ?? 0) > 0; + +/** + * Переход на другую вкладку отчёта (`/versions/:version_id/:tab`): сегмент вкладки заменяется, запись истории — тоже, + * чтобы «Назад» вёл со страницы отчёта, а не по переключениям вкладок (AURORA-1851, как переключатель документа в AURORA-1692). + */ +export const reportTabNavigation = (pathname: string, activeKey: string, newKey: string) => ({ + to: pathname.replace(new RegExp(`/${activeKey}/?$`), `/${newKey}`), + options: { replace: true }, +}); diff --git a/web/src/widgets/ConsolidatedOsv/OsvTabs.tsx b/web/src/widgets/ConsolidatedOsv/OsvTabs.tsx index 0558982..5fa4433 100644 --- a/web/src/widgets/ConsolidatedOsv/OsvTabs.tsx +++ b/web/src/widgets/ConsolidatedOsv/OsvTabs.tsx @@ -2,7 +2,7 @@ import { WarningOutlined } from '@ant-design/icons'; import { Button, Modal, Segmented, Tooltip } from 'antd'; import { useState } from 'react'; import { useLocation, useNavigate, useParams } from 'react-router-dom'; -import { needsUnmappedWarning } from '../../utils/consolidations'; +import { needsUnmappedWarning, reportTabNavigation } from '../../utils/consolidations'; const TAB_CONFIG = [ { key: 'osv', label: 'ОСВ' }, @@ -54,8 +54,8 @@ export function OsvTabs({ unmappedTotal = 0 }: Props) { const activeKey = tab || 'osv'; const go = (newKey: string) => { - const newPath = location.pathname.replace(new RegExp(`/${activeKey}/?$`), `/${newKey}`); - navigate(newPath); + const { to, options } = reportTabNavigation(location.pathname, activeKey, newKey); + navigate(to, options); }; const handleTabChange = (value: string | number) => {