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 },
};
});
});