feat(person): add a curator "Ereignis für diese Person" link to PersonCard
A curator on a person's page can now seed a timeline event from that person: a gated link to #781's /zeitstrahl/events/new?personId={id}, which prefills the person and returns to /persons/{id} on save. Hidden for a Reader. New i18n key person_add_event in de/en/es. Refs #842 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -128,7 +128,8 @@ const deathText = $derived(formatLifeDate(person.deathDate, person.deathDatePrec
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
<!-- Edit button — full width, outlined -->
|
||||
<!-- Curator actions — full width, outlined. Both links are gated to
|
||||
WRITE_ALL; the gate is UX only (the #781 route guard is the boundary). -->
|
||||
{#if canWrite}
|
||||
<a
|
||||
href="/persons/{person.id}/edit"
|
||||
@@ -142,6 +143,15 @@ const deathText = $derived(formatLifeDate(person.deathDate, person.deathDatePrec
|
||||
/>
|
||||
{m.btn_edit()}
|
||||
</a>
|
||||
<!-- Opens #781's create form pre-seeded with this person; on save it
|
||||
returns to /persons/{id} (originPersonId). #842 REQ-003/010. -->
|
||||
<a
|
||||
data-testid="person-add-event"
|
||||
href="/zeitstrahl/events/new?personId={person.id}"
|
||||
class="mt-2 flex min-h-[44px] w-full items-center justify-center gap-1.5 rounded border border-line px-3 py-2 font-sans text-xs font-bold tracking-widest text-ink-2 uppercase transition-colors hover:border-primary hover:text-ink"
|
||||
>
|
||||
{m.person_add_event()}
|
||||
</a>
|
||||
{/if}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
32
frontend/src/routes/persons/[id]/PersonCard.svelte.spec.ts
Normal file
32
frontend/src/routes/persons/[id]/PersonCard.svelte.spec.ts
Normal file
@@ -0,0 +1,32 @@
|
||||
import { describe, it, expect, afterEach } from 'vitest';
|
||||
import { cleanup, render } from 'vitest-browser-svelte';
|
||||
import PersonCard from './PersonCard.svelte';
|
||||
|
||||
afterEach(() => cleanup());
|
||||
|
||||
const PERSON_ID = '55555555-5555-5555-5555-555555555555';
|
||||
|
||||
const makePerson = (overrides = {}) => ({
|
||||
id: PERSON_ID,
|
||||
firstName: 'Karl',
|
||||
lastName: 'Raddatz',
|
||||
displayName: 'Karl Raddatz',
|
||||
personType: 'PERSON',
|
||||
...overrides
|
||||
});
|
||||
|
||||
describe('PersonCard add-event affordance (#842)', () => {
|
||||
it('shows an add-event link pre-seeded with the person to a curator (REQ-003)', () => {
|
||||
render(PersonCard, { person: makePerson(), canWrite: true });
|
||||
const add = document.querySelector(
|
||||
'[data-testid="person-add-event"]'
|
||||
) as HTMLAnchorElement | null;
|
||||
expect(add).not.toBeNull();
|
||||
expect(add?.getAttribute('href')).toBe(`/zeitstrahl/events/new?personId=${PERSON_ID}`);
|
||||
});
|
||||
|
||||
it('renders no add-event link to a reader (REQ-004)', () => {
|
||||
render(PersonCard, { person: makePerson(), canWrite: false });
|
||||
expect(document.querySelector('[data-testid="person-add-event"]')).toBeNull();
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user