From 1f591f3a3f8ac3b69cde43ba14a360337c6556e0 Mon Sep 17 00:00:00 2001 From: Masahiko AMANO Date: Sun, 5 Apr 2026 23:48:21 +0300 Subject: [PATCH] feat(frontend): replace JS confirm() with native dialog component - ConfirmDialog: centered with backdrop blur, cancel + confirm (danger variant) - tags/[id]: delete tag uses ConfirmDialog - categories/[id]: delete category uses ConfirmDialog - files: bulk delete calls POST /files/bulk/delete, removes files from list, text updated to "Move to trash" (soft delete) - mock: add POST /files/bulk/delete handler Co-Authored-By: Claude Sonnet 4.6 --- .../components/common/ConfirmDialog.svelte | 123 ++++++++++++++++++ .../src/routes/categories/[id]/+page.svelte | 19 ++- frontend/src/routes/files/+page.svelte | 25 +++- frontend/src/routes/tags/[id]/+page.svelte | 19 ++- frontend/vite-mock-plugin.ts | 10 ++ 5 files changed, 184 insertions(+), 12 deletions(-) create mode 100644 frontend/src/lib/components/common/ConfirmDialog.svelte 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}

+
+ + +
+
+
+ + \ 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 @@ - @@ -212,6 +213,16 @@ +{#if confirmDelete} + (confirmDelete = false)} + /> +{/if} +