From f4a4f01c28aebcdd83200de8ee70b5069ae5b0e0 Mon Sep 17 00:00:00 2001 From: Andrey Epifancev Date: Wed, 28 Oct 2026 22:15:41 +0400 Subject: [PATCH] =?UTF-8?q?fix(web):=20=D1=83=D0=B2=D0=B5=D0=B4=D0=BE?= =?UTF-8?q?=D0=BC=D0=BB=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=B2=D0=BA=D0=BB=D0=B0?= =?UTF-8?q?=D0=B4=D0=BA=D0=B8=20=D0=BA=D0=BE=D1=80=D1=80=D0=B5=D0=BA=D1=82?= =?UTF-8?q?=D0=B8=D1=80=D0=BE=D0=B2=D0=BE=D0=BA=20=E2=80=94=20=D0=B2=D0=BD?= =?UTF-8?q?=D1=83=D1=82=D1=80=D0=B8=20=D0=B1=D0=BE=D0=BA=D1=81=D0=B0,=20?= =?UTF-8?q?=D0=B2=D0=B8=D0=B4=D0=BD=D1=8B=20=D0=B2=20=D0=BF=D0=BE=D0=BB?= =?UTF-8?q?=D0=BD=D0=BE=D1=8D=D0=BA=D1=80=D0=B0=D0=BD=D0=BD=D0=BE=D0=BC=20?= =?UTF-8?q?=D1=80=D0=B5=D0=B6=D0=B8=D0=BC=D0=B5=20(#206)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit I-1: локальный notification.useNotification с getContainer на бокс вкладки; M-6, M-8: комментарии. Co-Authored-By: Claude Opus 5.5 --- .../CorrectionTable/CorrectionContent.tsx | 24 +++++++++++++------ 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/web/src/widgets/CorrectionTable/CorrectionContent.tsx b/web/src/widgets/CorrectionTable/CorrectionContent.tsx index 135f298..ec11e24 100644 --- a/web/src/widgets/CorrectionTable/CorrectionContent.tsx +++ b/web/src/widgets/CorrectionTable/CorrectionContent.tsx @@ -1,5 +1,6 @@ -// Вкладка «Таблица корректировки»: загрузка, состояния, панель и таблица. Правки (окно, решения по строкам) — в следующих задачах. -import { App, Button, ConfigProvider, Spin } from 'antd'; +// Вкладка «Таблица корректировки»: загрузка, состояния, панель, таблица, решения по строкам, отмена и окно корректировки. +// Данные и фильтры держит она. +import { Button, ConfigProvider, Spin, notification as antdNotification } from 'antd'; import { type ReactNode, useEffect, useMemo, useRef, useState } from 'react'; import { ApiError } from '../../api/client'; import { useVisibleColumns } from '../../components/GenericTable/useVisibleColumns'; @@ -7,7 +8,6 @@ import { allocate, exportCorrectionTable, revokeCorrection } from '../../service import type { VersionCard } from '../../types/consolidations/version_members'; import type { AllocationIn, CorrectionAggregateOut } from '../../types/corrections'; import { saveBlob, xlsxFilename } from '../../utils/download'; -import { useNotificationApi } from '../../utils/useNotification'; import { useNumberDisplay } from '../ConsolidatedOsv/useNumberDisplay'; import { CorrectionEditorModal } from './CorrectionEditorModal'; import { CorrectionTable, type RowActions } from './CorrectionTable'; @@ -33,8 +33,17 @@ type Props = { versionId: string; card?: VersionCard | null }; export function CorrectionContent({ versionId, card = null }: Props) { const { table, loading, error, reload, replace, replaceAggregate } = useCorrectionTable(versionId); - const { notification } = App.useApp(); - const notify = useNotificationApi(); + const boxRef = useRef(null); + // уведомления рисуются внутри бокса вкладки: в полноэкранном режиме виден только полноэкранный элемент, + // глобальные уведомления за ним не видны + const [notification, holder] = antdNotification.useNotification({ getContainer: () => boxRef.current ?? document.body }); + const notify = useMemo( + () => ({ + error: ({ description }: { description: ReactNode }) => + notification.error({ title: 'Ошибка', description, placement: 'bottomRight' }), + }), + [notification], + ); // по умолчанию — «тыс. руб.», 2 знака, как в дизайне const { unit, setUnit, precision, setPrecision, format } = useNumberDisplay({ unit: 'тыс. руб.', precision: 2 }); const [filters, setFilters] = useState(EMPTY_FILTERS); @@ -49,7 +58,6 @@ export function CorrectionContent({ versionId, card = null }: Props) { const [revoking, setRevoking] = useState(null); // ключ агрегата, окно корректировки которого открыто const [editing, setEditing] = useState(null); - const boxRef = useRef(null); // ошибка загрузки — уведомление с текстом сервера и кнопкой «Повторить» useEffect(() => { @@ -124,7 +132,8 @@ export function CorrectionContent({ versionId, card = null }: Props) { return next; }); - // ошибка правки: текст сервера в уведомлении; 409 (версию закрыли, блокировку забрали, корректировку уже изменили) — ещё перечитываем таблицу + // ошибка правки: текст сервера в уведомлении; + // 409 (версию закрыли, блокировку забрали, корректировку уже изменили) — ещё перечитываем таблицу const fail = (e: unknown, fallback: string) => { const out = errorOutcome(e, fallback); notify.error({ description: out.message }); @@ -227,6 +236,7 @@ export function CorrectionContent({ versionId, card = null }: Props) { height: fullscreen ? '100vh' : undefined, overflow: 'hidden', }}> + {holder}