Files
familienarchiv/frontend/src/lib/document
Marcel 6150fc7be5
Some checks failed
CI / Unit & Component Tests (pull_request) Failing after 4m17s
CI / OCR Service Tests (pull_request) Successful in 24s
CI / Backend Unit Tests (pull_request) Successful in 5m23s
CI / fail2ban Regex (pull_request) Successful in 47s
CI / Semgrep Security Scan (pull_request) Successful in 26s
CI / Compose Bucket Idempotency (pull_request) Successful in 1m8s
SDD Gate / RTM Check (pull_request) Successful in 16s
SDD Gate / Contract Validate (pull_request) Successful in 25s
SDD Gate / Constitution Impact (pull_request) Successful in 17s
fix(timeline): track form dirtiness via change callbacks, not an $effect
The round-2 dirty-guard used an $effect that both read and wrote its `dirtyArmed`
$state, so the self-write re-triggered the effect and `dirty` flipped true on
mount — the beforeNavigate confirm then fired on every navigation away from an
untouched form (caught by the round-3 clean-agent review + the Svelte autofixer,
which flags assigning state inside $effect).

Replace it with the component's existing idiomatic pattern: DatePrecisionField,
PersonMultiSelect, and DocumentMultiSelect each gain an optional `onchange`
callback fired on a real user edit, and EventForm passes `markDirty` to all
three. Now date/precision/end-date and picker add/remove mark the form dirty
exactly like title/type/description already did — no effect, no mount-timing
trap. The new props are optional, so the other consumers (WhoWhenSection, the
document forms) are unaffected. Svelte autofixer: clean.

Addresses PR #832 review (round-3 clean-agent concern).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-14 00:55:34 +02:00
..

document (frontend)

UI for the archive's core concept: viewing, uploading, editing, searching, bulk-selecting, and transcribing documents.

What this domain owns

Components: DocumentRow, DocumentThumbnail, DocumentTopBar, DocumentViewer, DocumentMetadataDrawer, DocumentEditLayout, DocumentStatusChip, UploadZone, BulkSelectionBar, BulkDropZone. Utilities: search.ts (search-param helpers), filename.ts (filename formatting), documentStatusLabel.ts (i18n label mapping), validateFile.ts (upload validation), groupDocuments.ts (list grouping). Sub-folders: annotation/, transcription/, viewer/.

What this domain does NOT own

  • Person typeahead — person/PersonTypeahead.svelte (cross-domain import, allowed by ESLint rule)
  • Tag input — tag/TagInput.svelte (cross-domain import, allowed)
  • Shared discussion — shared/discussion/ (comment/mention editor)

Key components

Component Route used in Notes
DocumentRow.svelte / (search results), admin queues Compact document card with thumbnail
DocumentViewer.svelte /documents/[id] PDF/image inline viewer
DocumentEditLayout.svelte /documents/[id]/edit Full edit form with sticky save bar
UploadZone.svelte /documents/new, bulk upload Drag-and-drop file drop area
BulkSelectionBar.svelte /documents bulk mode Multi-select action bar

Cross-domain imports

  • person/PersonTypeahead.svelte — sender / receiver selection
  • tag/TagInput.svelte — tag chip input
  • ocr/OcrProgress.svelte — job status indicator in the document header
  • shared/primitives/BackButton.svelte, shared/discussion/ — shared UI
  • shared/utils/monthBuckets.ts — the density chart's pure month-bucket math (boundaries, gap-fill, year aggregation, axis ticks) now lives in shared/ so the timeline/ domain can reuse it; document/timeline.ts keeps only the /api/documents/density glue (fetchDensity, buildDensityUrl)

Backend counterpart

backend/src/main/java/org/raddatz/familienarchiv/document/README.md