diff --git a/web/src/layouts/ConsolidatedOsvPage.tsx b/web/src/layouts/ConsolidatedOsvPage.tsx index 485db65..7aaf552 100644 --- a/web/src/layouts/ConsolidatedOsvPage.tsx +++ b/web/src/layouts/ConsolidatedOsvPage.tsx @@ -1,8 +1,9 @@ import { DownloadOutlined, FilterOutlined } from '@ant-design/icons'; -import { Alert, Button, InputNumber, Select, Space, Tooltip, message } from 'antd'; +import { Alert, Button, Select, Space, Tooltip, message } from 'antd'; import { useEffect, useState } from 'react'; import { 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'; @@ -11,18 +12,18 @@ import { exportOsv } from '../services/api/osv'; import type { ConsolidatedRowOut } 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 { exportFilename, saveBlob } from '../utils/download'; import { quarterShortLabel } from '../utils/labels'; -import { consStatusDescriptionMapping, statusColorMapping, statusMapping } from '../widgets/ConsoleTable/consts'; +import { statusColorMapping } from '../widgets/ConsoleTable/consts'; import { CounterpartyMapModal } from '../widgets/ConsolidatedOsv/CounterpartyMapModal'; import { OsvGaps } from '../widgets/ConsolidatedOsv/OsvGaps'; import { OsvTable } from '../widgets/ConsolidatedOsv/OsvTable'; import { OsvTabs } from '../widgets/ConsolidatedOsv/OsvTabs'; import { mapEntryId } from '../widgets/ConsolidatedOsv/counterpartyMapping'; import { OSV_PAGE_SIZE, useConsolidatedOsv } from '../widgets/ConsolidatedOsv/useConsolidatedOsv'; -import { useCurrentUser } from '../auth/MeContext'; +import { PRECISIONS, UNITS, useNumberDisplay } from '../widgets/ConsolidatedOsv/useNumberDisplay'; import ChangeStatusModal from '../widgets/StatusChangeModal/ChangeStatusModal'; -import { UNITS, useNumberDisplay } from '../widgets/ConsolidatedOsv/useNumberDisplay'; function OsvContent({ versionId }: { versionId: string }) { const [card, setCard] = useState(null); @@ -63,9 +64,12 @@ function OsvContent({ versionId }: { versionId: string }) { const s = osv.summary; const unmapped = s?.unmapped_total ?? 0; const onlyUnmapped = osv.filters.unmapped === true; - const russianStatus = card ? (statusMapping[card.status] ?? card.status) : ''; - const description = card ? (consStatusDescriptionMapping[card.status] ?? russianStatus) : ''; + 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)}` : ''; return ( @@ -91,28 +95,22 @@ function OsvContent({ versionId }: { versionId: string }) { text={russianStatus} {...preset} /> - {card.lock === null || (card.lock && card.lock.locked_by !== currentUser.id) ? ( - - - - ) : ( + {/* активна при своей блокировке и наличии ручных переходов из текущего статуса */} + - )} + ) } /> - +
Знаков после запятой ({ label: i, value: i }))} - labelRender={(v) => (v.value ? statusMapping[v.value as ConsStatus] : v.value)} - optionRender={(v) => (v.value ? statusMapping[v.value as ConsStatus] : v.value)}> - - - - - - )} +
+ +