«Назад» на странице отчёта не ходит по вкладкам (#191, AURORA-1851) #192

Merged
aep merged 1 commits from feat/191-report-tabs-history into main 2026-10-27 17:06:54 +03:00
7 changed files with 93 additions and 3 deletions
Showing only changes of commit 8eebedf657 - Show all commits

View File

@ -0,0 +1,2 @@
schema: spec-driven
created: 2026-10-27

View File

@ -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`.

View File

@ -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** одним нажатием открыт список консолидаций ГК

View File

@ -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 Проверка в браузере по сценарию тестировщика: «К отчётности» → «Шахматка» → «ОСВ» → «Шахматка» → «Назад» —
одним нажатием список консолидаций.

View File

@ -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 },
});
});
});

View File

@ -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 },
});

View File

@ -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) => {