refactor(timeline): drop EventForm's redundant type state
All checks were successful
CI / Unit & Component Tests (pull_request) Successful in 4m13s
CI / OCR Service Tests (pull_request) Successful in 27s
CI / Backend Unit Tests (pull_request) Successful in 5m1s
CI / fail2ban Regex (pull_request) Successful in 47s
CI / Semgrep Security Scan (pull_request) Successful in 22s
CI / Compose Bucket Idempotency (pull_request) Successful in 1m5s
SDD Gate / RTM Check (pull_request) Successful in 15s
SDD Gate / Contract Validate (pull_request) Successful in 24s
SDD Gate / Constitution Impact (pull_request) Successful in 19s
CI / Unit & Component Tests (push) Successful in 4m33s
CI / OCR Service Tests (push) Successful in 27s
CI / Backend Unit Tests (push) Successful in 5m11s
CI / fail2ban Regex (push) Successful in 48s
CI / Semgrep Security Scan (push) Successful in 25s
CI / Compose Bucket Idempotency (push) Successful in 1m12s

The submitted type comes from EventTypeSelect's own hidden input; EventForm's
`type` $state was only read to seed `value=` and the onchange reassignment
had no downstream reader. Inline the seed expression and pass markDirty
directly, removing the second source of truth.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit was merged in pull request #832.
This commit is contained in:
Marcel
2026-06-14 09:13:17 +02:00
parent 23f6bc284d
commit bc02d22270
2 changed files with 19 additions and 5 deletions

View File

@@ -61,7 +61,6 @@ let {
// won't update the form — the two dedicated routes always remount, which is fine. // won't update the form — the two dedicated routes always remount, which is fine.
let title = $state(form?.title ?? event?.title ?? ''); let title = $state(form?.title ?? event?.title ?? '');
let description = $state(form?.description ?? event?.description ?? ''); let description = $state(form?.description ?? event?.description ?? '');
let type = $state<string>(form?.type ?? event?.type ?? 'PERSONAL');
let dateIso = $state(form?.eventDate ?? event?.eventDate ?? ''); let dateIso = $state(form?.eventDate ?? event?.eventDate ?? '');
let precision = $state<DatePrecision>( let precision = $state<DatePrecision>(
(form?.precision as DatePrecision) ?? (event?.precision as DatePrecision) ?? 'DAY' (form?.precision as DatePrecision) ?? (event?.precision as DatePrecision) ?? 'DAY'
@@ -212,10 +211,11 @@ function markDirty() {
<span class="mb-1 block text-sm font-medium text-ink-2" <span class="mb-1 block text-sm font-medium text-ink-2"
>{m.event_editor_type_label()}</span >{m.event_editor_type_label()}</span
> >
<EventTypeSelect value={type} name="type" onchange={(t) => { <EventTypeSelect
type = t; value={form?.type ?? event?.type ?? 'PERSONAL'}
markDirty(); name="type"
}} /> onchange={markDirty}
/>
</div> </div>
<div class="grid grid-cols-1 gap-5 md:grid-cols-2"> <div class="grid grid-cols-1 gap-5 md:grid-cols-2">

View File

@@ -62,6 +62,20 @@ describe('EventForm — date precision RANGE reveal (headline AC, REQ-008/009)',
}); });
}); });
describe('EventForm — type seeding (review #8 refactor fence)', () => {
it('seeds the type selector from the event so the submitted type is correct', async () => {
renderForm({ event: makeEvent({ type: 'HISTORICAL' }) });
const hidden = document.querySelector('input[type="hidden"][name="type"]') as HTMLInputElement;
expect(hidden.value).toBe('HISTORICAL');
});
it('prefers the fail-payload type over the seeded event', async () => {
renderForm({ event: makeEvent({ type: 'PERSONAL' }), form: { type: 'HISTORICAL' } });
const hidden = document.querySelector('input[type="hidden"][name="type"]') as HTMLInputElement;
expect(hidden.value).toBe('HISTORICAL');
});
});
describe('EventForm — picker preselect (REQ-014)', () => { describe('EventForm — picker preselect (REQ-014)', () => {
it('preselects a person when initialPersons is provided', async () => { it('preselects a person when initialPersons is provided', async () => {
renderForm({ initialPersons: [{ id: 'p1', displayName: 'Anna Müller' }] }); renderForm({ initialPersons: [{ id: 'p1', displayName: 'Anna Müller' }] });