diff --git a/frontend/src/lib/timeline/EventPill.svelte b/frontend/src/lib/timeline/EventPill.svelte index 9b125cb7..b30420b2 100644 --- a/frontend/src/lib/timeline/EventPill.svelte +++ b/frontend/src/lib/timeline/EventPill.svelte @@ -16,6 +16,11 @@ let { entry }: { entry: TimelineEntryDTO } = $props(); const config = $derived(getAccentConfig(entry)); const dateLabel = $derived(timelineDateLabel(entry.eventDate, entry.precision, entry.eventDateEnd)); +// Provenance reads off entry.derived (not the accent): a derived life-event is +// "abgeleitet", a curated PERSONAL event is "kuratiert" (REQ-007). +const provenance = $derived( + entry.derived ? m.timeline_provenance_derived() : m.timeline_provenance_curated() +); const canEdit = $derived(!entry.derived && entry.eventId != null); @@ -42,7 +47,7 @@ const canEdit = $derived(!entry.derived && entry.eventId != null); > {/if} {#if dateLabel} - {dateLabel} + {dateLabel} · {provenance} {/if} {#if canEdit} diff --git a/frontend/src/lib/timeline/EventPill.svelte.spec.ts b/frontend/src/lib/timeline/EventPill.svelte.spec.ts index 945ea65f..b254185a 100644 --- a/frontend/src/lib/timeline/EventPill.svelte.spec.ts +++ b/frontend/src/lib/timeline/EventPill.svelte.spec.ts @@ -1,6 +1,8 @@ import { describe, it, expect, afterEach } from 'vitest'; import { cleanup, render } from 'vitest-browser-svelte'; +import * as m from '$lib/paraglide/messages.js'; import EventPill from './EventPill.svelte'; +import { timelineDateLabel } from './dateLabel'; import { makeEntry } from './test-factories'; afterEach(() => cleanup()); @@ -87,4 +89,35 @@ describe('EventPill', () => { render(EventPill, { entry: derived('MARRIAGE', 'Heirat') }); expect(document.querySelector('[data-testid="event-edit"]')).toBeNull(); }); + + it('appends the "abgeleitet" provenance token to a derived pill subtitle (REQ-007)', () => { + const entry = derived('BIRTH', 'Geburt: Hans'); + const date = timelineDateLabel(entry.eventDate, entry.precision, entry.eventDateEnd); + render(EventPill, { entry }); + expect(document.body.textContent).toContain(`${date} · ${m.timeline_provenance_derived()}`); + }); + + it('appends the "kuratiert" provenance token to a curated PERSONAL pill subtitle (REQ-007)', () => { + const entry = makeEntry({ + kind: 'EVENT', + derived: false, + type: 'PERSONAL', + eventId: EVENT_ID, + title: 'Auswanderung', + senderName: '', + receiverName: '', + precision: 'YEAR', + eventDate: '1924-01-01', + documentId: undefined + }); + const date = timelineDateLabel(entry.eventDate, entry.precision, entry.eventDateEnd); + render(EventPill, { entry }); + expect(document.body.textContent).toContain(`${date} · ${m.timeline_provenance_curated()}`); + }); + + it('never shows the spec-sheet-only "persönlich"/"SEASON" tokens (REQ-007)', () => { + render(EventPill, { entry: derived('BIRTH', 'Geburt: Hans') }); + expect(document.body.textContent).not.toContain('persönlich'); + expect(document.body.textContent).not.toContain('SEASON'); + }); });