fix(bulk-edit): align BulkEditEntry shape with backend DocumentBatchSummary
Production bug — the backend serialises the document UUID as `id`, but BulkEditEntry typed it as `documentId`. The runtime cast in /documents/ bulk-edit/+page.svelte was a TypeScript lie: every `entry.documentId` became undefined, the SvelteMap collapsed all selections under the undefined key, and the PATCH fired with `documentIds: []` (which the controller correctly rejected with 400). Field semantics ACs could therefore never fire end-to-end. Renamed `BulkEditEntry.documentId` → `id`. The FileEntry built from each summary still carries both `id` (local map key) and `documentId` (PATCH payload) so the save handler is unchanged. Reported by Elicit (B1) on PR #331. Refs #225 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -20,8 +20,13 @@ import type { components } from '$lib/generated/api';
|
|||||||
|
|
||||||
type Person = components['schemas']['Person'];
|
type Person = components['schemas']['Person'];
|
||||||
|
|
||||||
|
// Mirrors the backend `DocumentBatchSummary` JSON shape one-to-one — the route
|
||||||
|
// passes the parsed `/api/documents/batch-metadata` response straight in, so
|
||||||
|
// the field names must match what the backend actually serializes (id, not
|
||||||
|
// documentId). The FileEntry built from each summary still uses both `id` and
|
||||||
|
// `documentId` so the save handler can drive the PATCH payload by UUID.
|
||||||
export type BulkEditEntry = {
|
export type BulkEditEntry = {
|
||||||
documentId: string;
|
id: string;
|
||||||
title: string;
|
title: string;
|
||||||
pdfUrl: string;
|
pdfUrl: string;
|
||||||
};
|
};
|
||||||
@@ -71,15 +76,14 @@ let archiveFolder = $state('');
|
|||||||
// has already been resolved into `initialEditEntries`.
|
// has already been resolved into `initialEditEntries`.
|
||||||
if (mode === 'edit') {
|
if (mode === 'edit') {
|
||||||
for (const entry of untrack(() => initialEditEntries)) {
|
for (const entry of untrack(() => initialEditEntries)) {
|
||||||
const id = entry.documentId; // reuse documentId as the local FileEntry key
|
files.set(entry.id, {
|
||||||
files.set(id, {
|
id: entry.id,
|
||||||
id,
|
documentId: entry.id,
|
||||||
documentId: entry.documentId,
|
|
||||||
title: entry.title,
|
title: entry.title,
|
||||||
status: 'idle',
|
status: 'idle',
|
||||||
previewUrl: entry.pdfUrl
|
previewUrl: entry.pdfUrl
|
||||||
});
|
});
|
||||||
if (!activeId) activeId = id;
|
if (!activeId) activeId = entry.id;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -317,7 +317,7 @@ describe('BulkDocumentEditLayout', () => {
|
|||||||
|
|
||||||
describe('BulkDocumentEditLayout — mode="edit"', () => {
|
describe('BulkDocumentEditLayout — mode="edit"', () => {
|
||||||
const editEntry = (i: number) => ({
|
const editEntry = (i: number) => ({
|
||||||
documentId: `doc-${i}`,
|
id: `doc-${i}`,
|
||||||
title: `Brief ${i}`,
|
title: `Brief ${i}`,
|
||||||
pdfUrl: `/api/documents/doc-${i}/file`
|
pdfUrl: `/api/documents/doc-${i}/file`
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user