From 0f734e3bf85f6072d4cc838db8233649dc902918 Mon Sep 17 00:00:00 2001 From: Andrey Epifancev Date: Thu, 8 Oct 2026 01:54:37 +0400 Subject: [PATCH] =?UTF-8?q?fix:=20=D0=B2=D0=B5=D1=80=D1=81=D0=B8=D1=8F=20?= =?UTF-8?q?=D0=B2=20URL,=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BA=D0=B8=20=D1=81?= =?UTF-8?q?=D0=BF=D0=B8=D1=81=D0=BA=D0=B0,=20=D0=BF=D0=BE=D0=B4=D0=BF?= =?UTF-8?q?=D0=B8=D1=81=D1=8C=20=D0=BA=D0=B2=D0=B0=D1=80=D1=82=D0=B0=D0=BB?= =?UTF-8?q?=D0=B0,=20=D0=9D=D0=B0=D0=B7=D0=B0=D0=B4=20=D0=BF=D0=BE=20?= =?UTF-8?q?=D0=BF=D1=80=D1=8F=D0=BC=D0=BE=D0=B9=20=D1=81=D1=81=D1=8B=D0=BB?= =?UTF-8?q?=D0=BA=D0=B5,=20=D0=BA=D0=BE=D0=B4=20=D0=BE=D1=88=D0=B8=D0=B1?= =?UTF-8?q?=D0=BA=D0=B8=20=D0=BD=D0=B5=20=D0=B2=20=D0=B7=D0=B0=D0=B3=D0=BE?= =?UTF-8?q?=D0=BB=D0=BE=D0=B2=D0=BA=D0=B5=20(I-1,=20M-3,=20M-4,=20M-6,=20T?= =?UTF-8?q?7.M7,=20T7.M4)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01EAKRDNzXtRrwmWz9z6PZu3 --- src/components/PageTitle.tsx | 5 ++++- src/layouts/ConsolidatedOsvPage.tsx | 3 ++- src/layouts/ConsolidationsList.tsx | 23 ++++++++++++++++++---- src/utils/labels.test.ts | 14 ++++++++++++- src/utils/labels.ts | 2 ++ src/widgets/ConsoleTable/ConsoleTable.tsx | 12 +++++------ src/widgets/DocumentReview/OsvDocument.tsx | 2 +- src/widgets/Sidebar/Sidebar.tsx | 3 ++- 8 files changed, 49 insertions(+), 15 deletions(-) diff --git a/src/components/PageTitle.tsx b/src/components/PageTitle.tsx index 523b860..8ac37c2 100644 --- a/src/components/PageTitle.tsx +++ b/src/components/PageTitle.tsx @@ -16,7 +16,10 @@ export default function PageTitle({ location, header, description, backable = fa
{backable && ( - diff --git a/src/layouts/ConsolidatedOsvPage.tsx b/src/layouts/ConsolidatedOsvPage.tsx index ac31eb4..5e8ed22 100644 --- a/src/layouts/ConsolidatedOsvPage.tsx +++ b/src/layouts/ConsolidatedOsvPage.tsx @@ -8,6 +8,7 @@ import { getVersionCard } from '../services/api/consolidations'; import { exportOsv } from '../services/api/osv'; import type { VersionCard } from '../types/consolidations/version_members'; import { exportFilename, saveBlob } from '../utils/download'; +import { quarterLabel } from '../utils/labels'; import { statusMapping } from '../widgets/ConsoleTable/consts'; import { OsvFilters } from '../widgets/ConsolidatedOsv/OsvFilters'; import { OsvGaps } from '../widgets/ConsolidatedOsv/OsvGaps'; @@ -52,7 +53,7 @@ function OsvContent({ versionId }: { versionId: string }) {
${data.name}>Консолидации`); setDesc(`${data.legal_entities_count} организаций`); - await dispatch(getConsolidationsListThunk(id)); - if (versionParam) dispatch(setSelectedVersion(versionParam)); + await dispatch(getConsolidationsListThunk(id)).unwrap(); } catch (e: unknown) { - message.error(e instanceof ApiError ? e.message : 'Не удалось загрузить группу компаний'); + message.error(errorText(e)); } } getAllInfo(group_id); + }, [dispatch, group_id]); + + // выбор версии следует за ?version= и не перезагружает список + useEffect(() => { + dispatch(setSelectedVersion(versionParam)); + }, [dispatch, versionParam]); + + // уход со страницы сбрасывает выбор (при смене группы ?version= пропадает из URL — выбор сбросит эффект выше) + useEffect(() => { return () => { dispatch(setSelectedVersion(null)); }; - }, [dispatch, group_id, versionParam]); + }, [dispatch]); return (
{ it('тип документа', () => { @@ -10,6 +18,10 @@ describe('labels', () => { expect(documentTypeLabel('DISCLOSURE', null)).toBe('Расшифровка'); expect(documentTypeLabel('OTHER', null)).toBe('Прочее'); }); + it('квартал', () => { + expect(quarterLabel('Q1')).toBe('1 квартал'); + expect(quarterLabel('Q3')).toBe('3 квартал'); + }); it('период', () => { expect(periodLabel(2024, 'Q1', false)).toBe('2024 К1'); expect(periodLabel(2024, 'Q3', true)).toBe('2024 · 9 мес.'); diff --git a/src/utils/labels.ts b/src/utils/labels.ts index 84655d9..da5e553 100644 --- a/src/utils/labels.ts +++ b/src/utils/labels.ts @@ -14,6 +14,8 @@ export function documentTypeLabel(type: DocumentType, account: string | null): s return type === 'OSV' && account ? `ОСВ ${account}` : TYPE_LABELS[type]; } +export const quarterLabel = (q: Quarter): string => `${q.slice(1)} квартал`; + export function periodLabel(year: number | null, quarter: Quarter | null, isCumulative: boolean | null): string { if (year === null || quarter === null) { return 'период не определён'; diff --git a/src/widgets/ConsoleTable/ConsoleTable.tsx b/src/widgets/ConsoleTable/ConsoleTable.tsx index 3ce387b..336ba6f 100644 --- a/src/widgets/ConsoleTable/ConsoleTable.tsx +++ b/src/widgets/ConsoleTable/ConsoleTable.tsx @@ -2,11 +2,10 @@ import { ArrowRightOutlined, DownOutlined, MoreOutlined, RightOutlined } from '@ import { Button, Dropdown, Space, message } from 'antd'; import type { ColumnsType, TableProps } from 'antd/es/table'; import { memo, useCallback, useMemo } from 'react'; -import { useNavigate, useParams } from 'react-router-dom'; +import { useNavigate, useParams, useSearchParams } from 'react-router-dom'; import { ColumnSettings, DataTable, type TableConfig, isGroup, useFilteredRows, useVisibleColumns } from '../../components/GenericTable'; import { useTableFilters } from '../../components/GenericTable/useTableFilters'; -import { setSelectedVersion } from '../../store/slices/consolidations/consolidationsSlice'; -import { useAppDispatch, useAppSelector } from '../../store/store'; +import { useAppSelector } from '../../store/store'; import type { ConsRow } from '../../types/consolidations/consolidations'; import { consConfigBase } from './config'; import { flattenCons } from './flatten'; @@ -45,7 +44,7 @@ const RowActions = memo(function RowActions({ export function ConsoleTableWidget() { const navigate = useNavigate(); const { group_id } = useParams(); - const dispatch = useAppDispatch(); + const [, setSearchParams] = useSearchParams(); const consolidations = useAppSelector((s) => s.consolidations.consolidations); const loading = useAppSelector((s) => s.consolidations.loading); @@ -124,7 +123,7 @@ export function ConsoleTableWidget() { render: (_: unknown, row: ConsRow) => (
@@ -135,7 +134,8 @@ export function ConsoleTableWidget() { ); const onRow: TableProps['onRow'] = (row) => ({ - onClick: () => dispatch(setSelectedVersion(row.id)), + // выбранная версия живёт в URL (?version=): переживает уход на «К отчётности» и «Назад» + onClick: () => setSearchParams({ version: row.id }, { replace: true }), }); return (
diff --git a/src/widgets/DocumentReview/OsvDocument.tsx b/src/widgets/DocumentReview/OsvDocument.tsx index 5fa3ab1..3d79b46 100644 --- a/src/widgets/DocumentReview/OsvDocument.tsx +++ b/src/widgets/DocumentReview/OsvDocument.tsx @@ -88,7 +88,7 @@ export function OsvDocument({ document, onChanged }: { document: DocumentOut; on showIcon closable onClose={() => setProblem(null)} - message={problem.code ? `${problem.message} (${problem.code})` : problem.message} + message={{problem.message}} description={ problem.failures.length > 0 ? (
    diff --git a/src/widgets/Sidebar/Sidebar.tsx b/src/widgets/Sidebar/Sidebar.tsx index 3a9b088..75fdef2 100644 --- a/src/widgets/Sidebar/Sidebar.tsx +++ b/src/widgets/Sidebar/Sidebar.tsx @@ -14,6 +14,7 @@ import { type ReactNode, memo, useState } from 'react'; import { NavLink, useNavigate } from 'react-router-dom'; import { USERS_ADMIN } from '../../auth/permissions'; import { createConsolidation } from '../../services/api/consolidations'; +import { quarterLabel } from '../../utils/labels'; import { NewConsolidationModal } from '../NewConsoleModal/NewConsoleModal'; import styles from './styles.module.css'; @@ -216,7 +217,7 @@ export function Sidebar() { onOk={async (values) => { const card = await createConsolidation(values); setModalOpen(false); - message.success(`Создана консолидация ${values.year} ${values.quarter}`); + message.success(`Создана консолидация ${values.year}, ${quarterLabel(values.quarter)}`); navigate(`/groups/${values.company_group_id}?version=${card.id}`); }} />