From ccca6dfa136b1c15f0cc5a3890f0805aa1c42b9c Mon Sep 17 00:00:00 2001 From: Andrey Epifancev Date: Fri, 23 Oct 2026 01:15:55 +0400 Subject: [PATCH] =?UTF-8?q?fix(web):=20=C2=AB=D0=98=D0=B7=D0=BC=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D1=82=D1=8C=20=D1=81=D1=82=D0=B0=D1=82=D1=83=D1=81?= =?UTF-8?q?=C2=BB=20=E2=80=94=20=D0=BF=D1=83=D1=82=D1=8C=20/consolidations?= =?UTF-8?q?/=E2=80=A6/status,=20=D0=BC=D0=BE=D0=B4=D0=B0=D0=BB=D0=BA=D0=B0?= =?UTF-8?q?=20=D0=BF=D0=BE=20=D1=81=D0=BF=D0=B5=D0=BA=D0=B5,=20[31-00]=20(?= =?UTF-8?q?AURORA-1589,=20PR=20#166)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 404 был из-за опечатки в пути (/consolidation/ без s). Модалка берёт статус из карточки страницы, а после 200 страница берёт карточку из ответа; в «Новом этапе» ничего не выбрано; ошибки — текст сервера, модалка остаётся открытой. Кнопка в шапке активна при своей блокировке и наличии ручных переходов, подсказка «Возьмите консолидацию в работу». Пояснение под заголовком — текст статуса, а не название. Модалка «Остались неуказанные ИНН» при уходе с «ОСВ» (вкладки шагов пока неактивны). Предупреждение браузера при начатом вводе. Co-Authored-By: Claude Opus 5.5 --- web/src/layouts/ConsolidatedOsvPage.tsx | 47 +++---- web/src/services/api/consolidations.ts | 15 +-- web/src/types/api.ts | 2 +- web/src/widgets/ConsolidatedOsv/OsvTabs.tsx | 118 +++++++++++++--- .../StatusChangeModal/ChangeStatusModal.tsx | 127 +++++++----------- 5 files changed, 175 insertions(+), 134 deletions(-) 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)}> - - - - - - )} +
+ +