diff --git a/apps/tauri/src/lib/components/TaskDetailView.svelte b/apps/tauri/src/lib/components/TaskDetailView.svelte index 39c8571..c5e0a32 100644 --- a/apps/tauri/src/lib/components/TaskDetailView.svelte +++ b/apps/tauri/src/lib/components/TaskDetailView.svelte @@ -120,7 +120,12 @@ async function executeDeleteCompletedSubtasks() { confirmDeleteCompleted = false; showSubtaskMenu = false; - for (const s of completedSubtasks) await app.deleteTask(s.id); + // Snapshot — completedSubtasks is reactive and shrinks as we delete. + // Bail on first failure so we don't silently leave a partial delete. + const targets = [...completedSubtasks]; + for (const s of targets) { + if (!(await app.deleteTask(s.id))) return; + } } function handleSubtaskMenuClickOutside(e: MouseEvent) { diff --git a/apps/tauri/src/lib/screens/TasksScreen.svelte b/apps/tauri/src/lib/screens/TasksScreen.svelte index c068cae..362bcdc 100644 --- a/apps/tauri/src/lib/screens/TasksScreen.svelte +++ b/apps/tauri/src/lib/screens/TasksScreen.svelte @@ -100,7 +100,12 @@ async function executeDeleteCompleted() { confirmDeleteCompleted = false; - for (var t of app.completedTasks) await app.deleteTask(t.id); + // Snapshot targets first — deletes mutate app.completedTasks reactively. + // Bail on first failure so we don't silently leave a partial delete. + const targets = [...app.completedTasks]; + for (const t of targets) { + if (!(await app.deleteTask(t.id))) return; + } } function promptDeleteList() {