fix(web): смена вкладки отчёта без новой записи истории — «Назад» к списку консолидаций (#191, AURORA-1851)
reportTabNavigation: адрес новой вкладки и replace; OsvTabs переходит через неё (и после модалки [31-00]). Change report-tabs-history: MODIFIED «Вкладки страницы отчёта по версии» (intercompany-matrix-ui). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
parent
66fac5811e
commit
8eebedf657
2
openspec/changes/report-tabs-history/.openspec.yaml
Normal file
2
openspec/changes/report-tabs-history/.openspec.yaml
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
schema: spec-driven
|
||||||
|
created: 2026-10-27
|
||||||
32
openspec/changes/report-tabs-history/proposal.md
Normal file
32
openspec/changes/report-tabs-history/proposal.md
Normal 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`.
|
||||||
@ -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** одним нажатием открыт список консолидаций ГК
|
||||||
8
openspec/changes/report-tabs-history/tasks.md
Normal file
8
openspec/changes/report-tabs-history/tasks.md
Normal 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 Проверка в браузере по сценарию тестировщика: «К отчётности» → «Шахматка» → «ОСВ» → «Шахматка» → «Назад» —
|
||||||
|
одним нажатием список консолидаций.
|
||||||
@ -13,6 +13,7 @@ import {
|
|||||||
manualTransitions,
|
manualTransitions,
|
||||||
needsUnmappedWarning,
|
needsUnmappedWarning,
|
||||||
parseInWorkOnly,
|
parseInWorkOnly,
|
||||||
|
reportTabNavigation,
|
||||||
versionLabel,
|
versionLabel,
|
||||||
} from './consolidations';
|
} from './consolidations';
|
||||||
|
|
||||||
@ -133,3 +134,12 @@ describe('модалка [31-00]', () => {
|
|||||||
expect(needsUnmappedWarning(undefined)).toBe(false);
|
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 },
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|||||||
@ -91,3 +91,12 @@ export const MIN_PERIMETER = 2;
|
|||||||
|
|
||||||
/** Модалка [31-00] нужна при уходе со вкладки «ОСВ», пока есть несопоставленные строки. */
|
/** Модалка [31-00] нужна при уходе со вкладки «ОСВ», пока есть несопоставленные строки. */
|
||||||
export const needsUnmappedWarning = (unmappedTotal: number | null | undefined): boolean => (unmappedTotal ?? 0) > 0;
|
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 },
|
||||||
|
});
|
||||||
|
|||||||
@ -2,7 +2,7 @@ import { WarningOutlined } from '@ant-design/icons';
|
|||||||
import { Button, Modal, Segmented, Tooltip } from 'antd';
|
import { Button, Modal, Segmented, Tooltip } from 'antd';
|
||||||
import { useState } from 'react';
|
import { useState } from 'react';
|
||||||
import { useLocation, useNavigate, useParams } from 'react-router-dom';
|
import { useLocation, useNavigate, useParams } from 'react-router-dom';
|
||||||
import { needsUnmappedWarning } from '../../utils/consolidations';
|
import { needsUnmappedWarning, reportTabNavigation } from '../../utils/consolidations';
|
||||||
|
|
||||||
const TAB_CONFIG = [
|
const TAB_CONFIG = [
|
||||||
{ key: 'osv', label: 'ОСВ' },
|
{ key: 'osv', label: 'ОСВ' },
|
||||||
@ -54,8 +54,8 @@ export function OsvTabs({ unmappedTotal = 0 }: Props) {
|
|||||||
const activeKey = tab || 'osv';
|
const activeKey = tab || 'osv';
|
||||||
|
|
||||||
const go = (newKey: string) => {
|
const go = (newKey: string) => {
|
||||||
const newPath = location.pathname.replace(new RegExp(`/${activeKey}/?$`), `/${newKey}`);
|
const { to, options } = reportTabNavigation(location.pathname, activeKey, newKey);
|
||||||
navigate(newPath);
|
navigate(to, options);
|
||||||
};
|
};
|
||||||
|
|
||||||
const handleTabChange = (value: string | number) => {
|
const handleTabChange = (value: string | number) => {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user