diff --git a/frontend/src/lib/timeline/EventPill.svelte b/frontend/src/lib/timeline/EventPill.svelte index b30420b2..55f274f3 100644 --- a/frontend/src/lib/timeline/EventPill.svelte +++ b/frontend/src/lib/timeline/EventPill.svelte @@ -21,6 +21,9 @@ const dateLabel = $derived(timelineDateLabel(entry.eventDate, entry.precision, e const provenance = $derived( entry.derived ? m.timeline_provenance_derived() : m.timeline_provenance_curated() ); +// Provenance always shows; the date is an optional prefix so an undated event +// still reads "abgeleitet"/"kuratiert" (REQ-007). +const subtitle = $derived(dateLabel ? `${dateLabel} · ${provenance}` : provenance); const canEdit = $derived(!entry.derived && entry.eventId != null); @@ -46,9 +49,7 @@ const canEdit = $derived(!entry.derived && entry.eventId != null); >{entry.title} {/if} - {#if dateLabel} - {dateLabel} · {provenance} - {/if} + {subtitle} {#if canEdit} { expect(document.body.textContent).not.toContain('persönlich'); expect(document.body.textContent).not.toContain('SEASON'); }); + + it('still shows the provenance token when the event has no date label (REQ-007)', () => { + // An undated / UNKNOWN-precision event (e.g. in the undated bucket) yields a + // null dateLabel; provenance must not be gated behind the date. + const entry = makeEntry({ + kind: 'EVENT', + derived: true, + derivedType: 'BIRTH', + title: 'Geburt: Hans', + senderName: '', + receiverName: '', + precision: 'UNKNOWN', + eventDate: undefined, + documentId: undefined + }); + expect(timelineDateLabel(entry.eventDate, entry.precision, entry.eventDateEnd)).toBeNull(); + render(EventPill, { entry }); + expect(document.body.textContent).toContain(m.timeline_provenance_derived()); + }); });