import { Button, Space, Tooltip, message } from 'antd'; import { type ReactNode, useEffect, useState } from 'react'; import { useLocation, useNavigate, useParams } from 'react-router-dom'; import { ApiError } from '../api/client'; import { useCurrentUser } from '../auth/MeContext'; import PageTitle from '../components/PageTitle'; import { TableTag } from '../components/TableTag/TableTag'; import { TAG_PRESETS } from '../components/TableTag/presets'; import { getVersionCard } from '../services/api/consolidations'; import type { OsvSummaryOut } from '../types/api'; import type { ConsRussianStatus } from '../types/consolidations/common_types'; import type { VersionCard } from '../types/consolidations/version_members'; import { CONS_STATUS_LABEL, canChangeStatus, consStatusDescription, isLockedBy } from '../utils/consolidations'; import { quarterShortLabel } from '../utils/labels'; import { statusColorMapping } from '../widgets/ConsoleTable/consts'; import { ChessContent } from '../widgets/ConsolidatedChessContent/ConsolidatedChessContent'; import { OsvTabs } from '../widgets/ConsolidatedOsv/OsvTabs'; import { OsvContent } from '../widgets/ConsolidatedOsvContent/ConsolidatedOsvContent'; import ChangeStatusModal from '../widgets/StatusChangeModal/ChangeStatusModal'; function ReportContent() { const [card, setCard] = useState(null); const [statusModalOpen, setModalOpen] = useState(false); // сводка ОСВ (пары без встречных записей) — для модалки при уходе с вкладки «ОСВ» const [osvSummary, setOsvSummary] = useState(null); const currentUser = useCurrentUser(); const { version_id, tab } = useParams<{ tab?: string; version_id: string }>(); const navigation = useNavigate(); const { pathname } = useLocation(); const TAB_COMPONENTS: Record = { osv: , chess: , }; const ActiveTab = TAB_COMPONENTS[tab as string] ?? null; const russianStatus = card ? (CONS_STATUS_LABEL[card.status] ?? card.status) : ''; // под заголовком — пояснение статуса, не его название const description = card ? consStatusDescription(card.status) : ''; const preset = statusColorMapping[russianStatus as ConsRussianStatus] ?? TAG_PRESETS.default; const statusChangeAllowed = card ? canChangeStatus(card.status, card.lock, currentUser.id) : false; const ownLock = card ? isLockedBy(card.lock, currentUser.id) : false; const groupName = card?.company_group.name ?? ''; const period = card ? `${card.year} · ${quarterShortLabel(card.quarter)}` : ''; useEffect(() => { if (version_id) { let actual = true; getVersionCard(version_id) .then((c) => { if (actual) setCard(c); }) .catch((e: unknown) => { if (actual) message.error(e instanceof ApiError ? e.message : 'Не удалось получить версию'); }); return () => { actual = false; }; } }, [version_id]); useEffect(() => { const isValidTab = !tab || tab === 'osv' || tab === 'chess'; if (!isValidTab) { const pathParts = pathname.split('/'); pathParts[pathParts.length - 1] = 'osv'; const newPath = pathParts.join('/'); navigation(newPath, { replace: true }); } }, [tab, navigation, pathname]); return (
Статус отчёта {/* активна при своей блокировке и наличии ручных переходов из текущего статуса */} ) } />
{ActiveTab} {card && setModalOpen(false)} />}
); } export function ConsolidationReportPage() { const { version_id = '' } = useParams<{ version_id: string }>(); // key: при смене версии всё состояние (карточка, фильтры, страница, данные) создаётся заново return ; }