From a3b08495256f61082349ed8e177f530c808aaf9f Mon Sep 17 00:00:00 2001 From: mARTin Date: Mon, 6 Apr 2026 15:04:18 +0200 Subject: [PATCH] fix: hide completed tasks from priority view immediately MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Priority view is "what to do next" — completed tasks have no place there. Always filter them out; removed the "show completed" toggle button. - Optimistic local hide: when you check a task off inside priority view it disappears immediately (no waiting for API round-trip + parent re-render). A `locallyDone` Set tracks tasks marked complete in the current session. v1.88.1 --- package.json | 2 +- src/components/PriorityView.tsx | 24 +++++++++++++----------- 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/package.json b/package.json index e511a4c..64d7de6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "my-weekly-todo-list", - "version": "1.88.0", + "version": "1.88.1", "description": "A web-based weekly task management application that organizes to-dos and calendar events in a single, intuitive weekly view", "main": "index.js", "scripts": { diff --git a/src/components/PriorityView.tsx b/src/components/PriorityView.tsx index c233d5e..1ddbc5e 100644 --- a/src/components/PriorityView.tsx +++ b/src/components/PriorityView.tsx @@ -120,7 +120,9 @@ export default function PriorityView({ const [filterProject, setFilterProject] = useState(""); const [filterList, setFilterList] = useState(""); const [filterTimespan, setFilterTimespan] = useState("all"); - const [showCompleted, setShowCompleted] = useState(false); + // Optimistic set: tasks marked complete inside this view disappear immediately, + // without waiting for the API round-trip + parent re-render. + const [locallyDone, setLocallyDone] = useState>(new Set()); const [delegateModal, setDelegateModal] = useState(null); const [delegateTo, setDelegateTo] = useState(""); const [delegateNote, setDelegateNote] = useState(""); @@ -133,7 +135,8 @@ export default function PriorityView({ // --- Filter tasks --- const filteredTasks = useMemo(() => { let result = tasks.filter((t) => !t.id.startsWith("virtual-")); - if (!showCompleted) result = result.filter((t) => !t.completed); + // Priority view is "what to do next" — always hide completed tasks. + result = result.filter((t) => !t.completed && !locallyDone.has(t.id)); if (filterProject) result = result.filter((t) => t.projectId === filterProject); if (filterList) { if (filterList === "__scheduled__") { @@ -158,7 +161,7 @@ export default function PriorityView({ }); } return result; - }, [tasks, showCompleted, filterProject, filterList, filterTimespan]); + }, [tasks, locallyDone, filterProject, filterList, filterTimespan]); // --- Eisenhower quadrants --- const eisenhowerQuadrants = useMemo(() => { @@ -219,6 +222,13 @@ export default function PriorityView({ }, [delegateModal, delegateTo, delegateNote, delegateType, onUpdateTask]); const toggleComplete = useCallback(async (task: PriorityTask) => { + if (!task.completed) { + // Optimistically hide immediately so the task doesn't linger + // while the API call + parent re-render cycle completes. + setLocallyDone((prev) => new Set([...prev, task.id])); + } else { + setLocallyDone((prev) => { const n = new Set(prev); n.delete(task.id); return n; }); + } await onUpdateTask(task.id, { completed: !task.completed }); }, [onUpdateTask]); @@ -272,14 +282,6 @@ export default function PriorityView({ {de ? "Filter" : "Filter"} -