From 12fcea7560592855d4b4fe8efd05584fddc16255 Mon Sep 17 00:00:00 2001 From: Andrey Epifancev Date: Sun, 18 Oct 2026 14:03:33 +0400 Subject: [PATCH] =?UTF-8?q?fix(statement):=20=D0=B7=D0=B0=D1=89=D0=B8?= =?UTF-8?q?=D1=82=D0=BD=D1=8B=D0=B5=20=D0=B7=D0=BD=D0=B0=D1=87=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F=20=D0=BF=D0=BE=20=D1=83=D0=BC=D0=BE=D0=BB=D1=87?= =?UTF-8?q?=D0=B0=D0=BD=D0=B8=D1=8E=20=D0=B4=D0=BB=D1=8F=20=D1=8F=D0=B4?= =?UTF-8?q?=D1=80=D0=B0=20=D0=B1=D0=B5=D0=B7=20v5.19=20(M-2,=20#43)?= 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_01BJKMLHdxMwSUeYcdkwqX4W --- src/widgets/DocumentReview/ChecksPanel.tsx | 2 +- src/widgets/DocumentReview/OsvDocument.tsx | 2 +- src/widgets/DocumentReview/issuePlaces.ts | 9 +++++---- src/widgets/FilesDrawer/documentRows.test.ts | 7 +++++++ src/widgets/FilesDrawer/documentRows.ts | 3 ++- 5 files changed, 16 insertions(+), 7 deletions(-) diff --git a/src/widgets/DocumentReview/ChecksPanel.tsx b/src/widgets/DocumentReview/ChecksPanel.tsx index 5fff10c..4955519 100644 --- a/src/widgets/DocumentReview/ChecksPanel.tsx +++ b/src/widgets/DocumentReview/ChecksPanel.tsx @@ -22,7 +22,7 @@ const failureList = (list: FailedCheckOut[], onShow?: (key: string) => void) => {list.map((f) => (
{failureText(f)} - {onShow && f.line_ids.length > 0 && ( + {onShow && (f.line_ids ?? []).length > 0 && ( diff --git a/src/widgets/DocumentReview/OsvDocument.tsx b/src/widgets/DocumentReview/OsvDocument.tsx index 573023c..e957432 100644 --- a/src/widgets/DocumentReview/OsvDocument.tsx +++ b/src/widgets/DocumentReview/OsvDocument.tsx @@ -119,7 +119,7 @@ export function OsvDocument({ document, onChanged }: { document: DocumentOut; on const labelSpan = 2 + (table.hasDepartments ? 1 : 0) + (table.hasCounterparties ? 1 : 0); // предупреждения документа (P6-19): все записи issues, без привязки к строкам const issueItems = useMemo( - () => document.issues.map((i) => ({ id: i.id, severity: i.severity, message: i.message, place: '', targetKey: null })), + () => (document.issues ?? []).map((i) => ({ id: i.id, severity: i.severity, message: i.message, place: '', targetKey: null })), [document.issues], ); const canConfirm = document.status === 'RECOGNIZED' || document.status === 'NEEDS_CHECK'; diff --git a/src/widgets/DocumentReview/issuePlaces.ts b/src/widgets/DocumentReview/issuePlaces.ts index 3a126f2..550fbd2 100644 --- a/src/widgets/DocumentReview/issuePlaces.ts +++ b/src/widgets/DocumentReview/issuePlaces.ts @@ -40,19 +40,20 @@ export function issuePlaces( for (const r of rows) if (r.lineId !== null) rowByLineId.set(r.lineId, r); const columnIds = new Set(columns.map((c) => c.id)); for (const issue of issues) { + const lineIds = issue.line_ids ?? []; if (issue.field !== null) { if (fields.includes(issue.field)) push(places.byField, issue.field, issue); else places.document.push(issue); continue; } - const known = issue.line_ids.map((id) => rowByLineId.get(id)).filter((r): r is GridRow => r !== undefined); + const known = lineIds.map((id) => rowByLineId.get(id)).filter((r): r is GridRow => r !== undefined); const columnId = issue.column_id !== null && columnIds.has(issue.column_id) ? issue.column_id : null; - if (issue.line_ids.length > 0 && known.length > 0) { + if (lineIds.length > 0 && known.length > 0) { for (const r of known) { if (columnId !== null) push(places.byCell, cellKey(r.key, columnId), issue); else push(places.byRow, r.key, issue); } - } else if (issue.line_ids.length === 0 && columnId !== null) { + } else if (lineIds.length === 0 && columnId !== null) { push(places.byColumn, columnId, issue); } else { places.document.push(issue); @@ -92,7 +93,7 @@ export function issueListItems(issues: IssueOut[], places: IssuePlaces, rows: Gr const items = issues .filter((issue) => issue.kind === 'warning') .map((issue): IssueListItem => { - const first = issue.line_ids.map((id) => rowByLineId.get(id)).find((r) => r !== undefined); + const first = (issue.line_ids ?? []).map((id) => rowByLineId.get(id)).find((r) => r !== undefined); const column = issue.column_id !== null ? columnById.get(issue.column_id) : undefined; let place: string; let targetKey: string | null = null; diff --git a/src/widgets/FilesDrawer/documentRows.test.ts b/src/widgets/FilesDrawer/documentRows.test.ts index 7037627..88683a7 100644 --- a/src/widgets/FilesDrawer/documentRows.test.ts +++ b/src/widgets/FilesDrawer/documentRows.test.ts @@ -151,6 +151,13 @@ describe('buildDocumentRows: предупреждения', () => { expect(legacy[0].fileWarnings[0]).toMatchObject({ code: 'LEGACY_WARNING', message: 'старое' }); }); + it('ядро без issue_counts (до v5.19) — нули, не падает', () => { + const old = doc() as Partial; + old.issue_counts = undefined; + const rows = buildDocumentRows([file({ documents: [old as DocumentBrief] })]); + expect(rows[0].issueCounts).toEqual({ error: 0, info: 0 }); + }); + it('issue_counts документа переносятся в issueCounts', () => { const rows = buildDocumentRows([file({ documents: [doc({ issue_counts: { error: 1, info: 3 } })] })]); expect(rows[0].issueCounts).toEqual({ error: 1, info: 3 }); diff --git a/src/widgets/FilesDrawer/documentRows.ts b/src/widgets/FilesDrawer/documentRows.ts index fbe68a6..d5873ee 100644 --- a/src/widgets/FilesDrawer/documentRows.ts +++ b/src/widgets/FilesDrawer/documentRows.ts @@ -99,7 +99,8 @@ export function buildDocumentRows(files: FileOut[], labelFor?: (f: FileOut) => s linkable: LINKABLE.has(d.document_type), fileWarnings, mappingWarnings, - issueCounts: d.issue_counts, + // ядро без v5.19 не присылает issue_counts — считаем, что замечаний нет + issueCounts: d.issue_counts ?? { error: 0, info: 0 }, }; }); });