fix: treat NA and CANCELLED as terminal statuses in task list UI

The 'Assigned' tab, overdue count, and card filters were only excluding
COMPLETED tasks. NA and CANCELLED tasks with old due dates were showing
as overdue. Now all three terminal statuses are excluded from active views.
This commit is contained in:
lorentz 2026-04-08 21:19:20 +00:00
parent f81817c0f6
commit 33ec8b2799

View file

@ -532,17 +532,18 @@ export function TasksClient({ initialTasks, currentUserId, isPrivileged, users }
const week2End = new Date(now); week2End.setDate(now.getDate() + 14); week2End.setHours(23,59,59,999)
const week3End = new Date(now); week3End.setDate(now.getDate() + 21); week3End.setHours(23,59,59,999)
const overdue = tasks.filter((t) => new Date(t.dueDate) < now && t.status !== 'COMPLETED')
const dueToday = tasks.filter((t) => { const d = new Date(t.dueDate); return d >= now && d <= week1End && t.status !== 'COMPLETED' })
const due1Week = tasks.filter((t) => { const d = new Date(t.dueDate); return d > week1End && d <= week2End && t.status !== 'COMPLETED' })
const due2Weeks = tasks.filter((t) => { const d = new Date(t.dueDate); return d > week1End && d <= week3End && t.status !== 'COMPLETED' })
const isTerminal = (s: string) => s === 'COMPLETED' || s === 'NA' || s === 'CANCELLED'
const overdue = tasks.filter((t) => new Date(t.dueDate) < now && !isTerminal(t.status))
const dueToday = tasks.filter((t) => { const d = new Date(t.dueDate); return d >= now && d <= week1End && !isTerminal(t.status) })
const due1Week = tasks.filter((t) => { const d = new Date(t.dueDate); return d > week1End && d <= week2End && !isTerminal(t.status) })
const due2Weeks = tasks.filter((t) => { const d = new Date(t.dueDate); return d > week1End && d <= week3End && !isTerminal(t.status) })
const applyCardFilter = (base: Task[]) => {
if (!cardFilter) return base
if (cardFilter === 'overdue') return base.filter((t) => new Date(t.dueDate) < now && t.status !== 'COMPLETED')
if (cardFilter === 'today') return base.filter((t) => { const d = new Date(t.dueDate); return d >= now && d <= week1End && t.status !== 'COMPLETED' })
if (cardFilter === '1week') return base.filter((t) => { const d = new Date(t.dueDate); return d > week1End && d <= week2End && t.status !== 'COMPLETED' })
if (cardFilter === '2weeks') return base.filter((t) => { const d = new Date(t.dueDate); return d > week1End && d <= week3End && t.status !== 'COMPLETED' })
if (cardFilter === 'overdue') return base.filter((t) => new Date(t.dueDate) < now && !isTerminal(t.status))
if (cardFilter === 'today') return base.filter((t) => { const d = new Date(t.dueDate); return d >= now && d <= week1End && !isTerminal(t.status) })
if (cardFilter === '1week') return base.filter((t) => { const d = new Date(t.dueDate); return d > week1End && d <= week2End && !isTerminal(t.status) })
if (cardFilter === '2weeks') return base.filter((t) => { const d = new Date(t.dueDate); return d > week1End && d <= week3End && !isTerminal(t.status) })
if (cardFilter === 'custom' && customFrom && customTo) {
const from = new Date(customFrom); from.setHours(0,0,0,0)
const to = new Date(customTo); to.setHours(23,59,59,999)
@ -552,7 +553,7 @@ export function TasksClient({ initialTasks, currentUserId, isPrivileged, users }
}
const baseVisible =
filter === 'assigned' ? tasks.filter((t) => t.status !== 'COMPLETED') :
filter === 'assigned' ? tasks.filter((t) => !isTerminal(t.status)) :
filter === 'completed' ? tasks.filter((t) => t.status === 'COMPLETED') :
tasks
const visibleTasks = applyCardFilter(baseVisible)