diff --git a/backend/src/main/java/org/raddatz/familienarchiv/document/DocumentSearchResult.java b/backend/src/main/java/org/raddatz/familienarchiv/document/DocumentSearchResult.java index 25b39184..b04f7fa2 100644 --- a/backend/src/main/java/org/raddatz/familienarchiv/document/DocumentSearchResult.java +++ b/backend/src/main/java/org/raddatz/familienarchiv/document/DocumentSearchResult.java @@ -17,11 +17,19 @@ public record DocumentSearchResult( @Schema(requiredMode = Schema.RequiredMode.REQUIRED) int totalPages ) { + /** + * Single-page convenience factory used by empty-result shortcuts and by tests that + * don't care about paging. Treats the whole list as page 0 of itself. + */ public static DocumentSearchResult of(List items) { int size = items.size(); return new DocumentSearchResult(items, size, 0, size, size == 0 ? 0 : 1); } + /** + * Paged factory used by the service when it has a real Pageable + full match count + * (e.g. from Spring's Page<T> or from an in-memory sort-then-slice). + */ public static DocumentSearchResult paged(List slice, Pageable pageable, long totalElements) { int pageSize = pageable.getPageSize(); int totalPages = pageSize == 0 ? 0 : (int) ((totalElements + pageSize - 1) / pageSize); diff --git a/backend/src/main/java/org/raddatz/familienarchiv/document/DocumentService.java b/backend/src/main/java/org/raddatz/familienarchiv/document/DocumentService.java index 0a290c5b..cfbbf848 100644 --- a/backend/src/main/java/org/raddatz/familienarchiv/document/DocumentService.java +++ b/backend/src/main/java/org/raddatz/familienarchiv/document/DocumentService.java @@ -759,8 +759,8 @@ public class DocumentService { doc.getThumbnailUrl(), doc.getDocumentDate(), doc.getSender(), - doc.getReceivers() != null ? List.copyOf(doc.getReceivers()) : List.of(), - doc.getTags() != null ? List.copyOf(doc.getTags()) : List.of(), + List.copyOf(doc.getReceivers()), + List.copyOf(doc.getTags()), doc.getArchiveBox(), doc.getArchiveFolder(), doc.getLocation(), diff --git a/frontend/src/lib/document/DocumentMultiSelect.svelte b/frontend/src/lib/document/DocumentMultiSelect.svelte index 4d2e42ba..0196544b 100644 --- a/frontend/src/lib/document/DocumentMultiSelect.svelte +++ b/frontend/src/lib/document/DocumentMultiSelect.svelte @@ -46,7 +46,11 @@ function handleInput() { const res = await fetch(`/api/documents/search?q=${encodeURIComponent(searchTerm)}&size=10`); if (res.ok) { const body: { items: DocumentListItem[] } = await res.json(); - const docs = body.items as unknown as Document[]; + const docs = body.items.map((it) => ({ + id: it.id, + title: it.title, + documentDate: it.documentDate + })) as unknown as Document[]; results = docs.filter((d) => !selectedDocuments.some((s) => s.id === d.id)); } } catch { diff --git a/frontend/src/lib/document/DocumentMultiSelect.svelte.spec.ts b/frontend/src/lib/document/DocumentMultiSelect.svelte.spec.ts index 55e75853..6514ab55 100644 --- a/frontend/src/lib/document/DocumentMultiSelect.svelte.spec.ts +++ b/frontend/src/lib/document/DocumentMultiSelect.svelte.spec.ts @@ -10,7 +10,19 @@ const docFactory = (id: string, title: string, date = '1880-01-01') => ({ title, documentDate: date, originalFilename: `${title}.pdf`, - status: 'UPLOADED', + receivers: [], + tags: [], + completionPercentage: 0, + contributors: [], + matchData: { + titleOffsets: [], + senderMatched: false, + matchedReceiverIds: [], + matchedTagIds: [], + snippetOffsets: [], + summaryOffsets: [] + }, + status: 'UPLOADED' as const, metadataComplete: false, scriptType: 'UNKNOWN' as const, createdAt: '2024-01-01T00:00:00',