diff --git a/frontend/src/lib/timeline/EventForm.svelte b/frontend/src/lib/timeline/EventForm.svelte index 3cce8d3e..74231eb1 100644 --- a/frontend/src/lib/timeline/EventForm.svelte +++ b/frontend/src/lib/timeline/EventForm.svelte @@ -82,6 +82,10 @@ let selectedDocuments = $state( const isEdit = $derived(event !== undefined); +// Captured at init — Svelte context is init-only, so reading it lazily inside an +// event handler throws even when is mounted. Gates the delete. +const { confirm } = getConfirmService(); + let titleTouched = $state(false); let submitting = $state(false); let dirty = $state(false); @@ -109,18 +113,6 @@ beforeNavigate(({ cancel }) => { function markDirty() { dirty = true; } - -async function confirmDelete(e: SubmitEvent) { - e.preventDefault(); - const { confirm } = getConfirmService(); - const ok = await confirm({ - title: m.event_editor_delete_confirm_title(), - body: m.event_editor_delete_confirm_body(), - destructive: true, - confirmLabel: m.event_editor_delete() - }); - if (ok) (e.target as HTMLFormElement).requestSubmit(); -}
@@ -309,9 +301,32 @@ async function confirmDelete(e: SubmitEvent) { {#if isEdit} -
+ The confirm gate runs inside the enhance submit phase: enhance ignores an + onsubmit preventDefault(), so awaiting confirm() and calling cancel() is the + only thing that actually stops the destructive POST. --> + { + const ok = await confirm({ + title: m.event_editor_delete_confirm_title(), + body: m.event_editor_delete_confirm_body(), + destructive: true, + confirmLabel: m.event_editor_delete() + }); + if (!ok) { + cancel(); + return; + } + return async ({ update }) => { + // Clear dirtiness so beforeNavigate doesn't prompt "unsaved changes" + // on the post-delete redirect. + dirty = false; + await update(); + }; + }} + class="mt-4" + >