diff --git a/frontend/src/lib/components/common/ConfirmDialog.svelte b/frontend/src/lib/components/common/ConfirmDialog.svelte new file mode 100644 index 0000000..8e9dafd --- /dev/null +++ b/frontend/src/lib/components/common/ConfirmDialog.svelte @@ -0,0 +1,123 @@ + + + + + + {message} + + Cancel + {confirmLabel} + + + + + \ No newline at end of file diff --git a/frontend/src/routes/categories/[id]/+page.svelte b/frontend/src/routes/categories/[id]/+page.svelte index 9301010..93d0a8c 100644 --- a/frontend/src/routes/categories/[id]/+page.svelte +++ b/frontend/src/routes/categories/[id]/+page.svelte @@ -4,6 +4,7 @@ import { api, ApiError } from '$lib/api/client'; import type { Category, Tag, TagOffsetPage } from '$lib/api/types'; import TagBadge from '$lib/components/tag/TagBadge.svelte'; + import ConfirmDialog from '$lib/components/common/ConfirmDialog.svelte'; let categoryId = $derived(page.params.id); @@ -23,6 +24,7 @@ let loadError = $state(''); let saveError = $state(''); let loaded = $state(false); + let confirmDelete = $state(false); const TAGS_LIMIT = 100; @@ -87,9 +89,8 @@ } } - async function deleteCategory() { - if (deleting) return; - if (!confirm(`Delete category "${name}"? Tags in this category will be unassigned.`)) return; + async function doDeleteCategory() { + confirmDelete = false; deleting = true; try { await api.delete(`/categories/${categoryId}`); @@ -171,7 +172,7 @@ {saving ? 'Saving…' : 'Save changes'} - + (confirmDelete = true)} disabled={deleting}> {deleting ? 'Deleting…' : 'Delete'} @@ -212,6 +213,16 @@ +{#if confirmDelete} + (confirmDelete = false)} + /> +{/if} +
{message}