From 4d7541caca2e958bc858c5031210ec843354b713 Mon Sep 17 00:00:00 2001 From: NPS Agent Date: Mon, 11 May 2026 14:24:21 +0930 Subject: [PATCH] implemented a marked as complete button --- app.jsx | 13 ++++++++++++- dashy.db | Bin 61440 -> 61440 bytes screens.jsx | 21 +++++++++++++++++---- 3 files changed, 29 insertions(+), 5 deletions(-) diff --git a/app.jsx b/app.jsx index 3cdcf45..fb81282 100644 --- a/app.jsx +++ b/app.jsx @@ -134,6 +134,17 @@ function App() { } catch(e) {} }; + const completeTask = async (taskId) => { + try { + await api.updateTask(taskId, { status: 'closed' }); + await api.addAudit({ actor: meId, action: 'task_completed', summary: 'Marked task as completed', target: taskId }); + setOpenTaskId(null); + } catch(e) { + console.error(e); + alert("Failed to complete task: " + e.message); + } + }; + const dismissHU = (id) => setHeadsUp(h => h.filter(x => x.id !== id)); const openTaskFromAnywhere = (id) => { setOpenTaskId(id); setShowLogs(false); }; @@ -191,7 +202,7 @@ function App() { setAdding(null)} onSubmit={addTask} defaultAssignee={adding} me={me} /> {mappedOpenTask && ( - setOpenTaskId(null)} onMove={moveTask} onPriority={setPriority} /> + setOpenTaskId(null)} onMove={moveTask} onPriority={setPriority} onComplete={() => completeTask(mappedOpenTask.id)} /> )} {showLogs && ( setShowLogs(false)} wide> diff --git a/dashy.db b/dashy.db index 5f017eb1a7d933ff514536ed99b44389f6c06133..729c86f0df2da63795aa0cd68cf3792fc2711d9e 100644 GIT binary patch delta 979 zcmb7?KWx)L6vh)dwcEzIBdVe(P1-mS3>}KjKL3kVB%%&1peBR?kRY{vZi$*Ys4)$d zQl;z+MA=}gm=F>aPi%+*W|kr`bpR$d#KHhLu@ls=gxkJ*`hI%vd+*?cIyj*orNb-T z%xZY$X#MFL#nJg5Q^J7x%{*ty^e_4y?a=w7?x(3viDPm&v2-D>R~20nu}F9U3Gyt`rLYAO*GGWWBLjvn#bt+v}}nmlr%=axk1}5m`hCkNG-C zLz2F?)37HT58uf6%$ye(uZsdEW8;akhU7_+9WP3!Y7n)6OiL-JNBzpGA}NFzr~4Hp zO;9Ff_tCgKKSD~PDiGe#Pa#FkWAcUnV!BtazhX2F6hrVQ{0_gtFK`1$Y~78Y;ptvw_d|rugi77+W%j|jDK_4?mz+zaQa#ja(`LQVv`Ft|D;=dMHokf* zk(~2N$E};3Um6CE6pr_fL(mX9j|R^@yuVL{``GBU7@JEhB?s2Mwh&O=7wvNM58fjf Af(L@<%Mx%`hOZ=H7If5p$2N-V_6p-N992BvMT}P5{6$Ae-{?Ghx z_@DCU@~z^(#`lc>IKKnmSAIkOIKG{H*ZKYVmH2D;S@>sdwo72aN4E9sJN$e^-hqyDju5p!dKH+rdSj3YDw8fBZa&Xy2o9>M%labZzO z(a815G?KPgo00MkU AL;wH) diff --git a/screens.jsx b/screens.jsx index cb2f530..db26f90 100644 --- a/screens.jsx +++ b/screens.jsx @@ -163,7 +163,7 @@ function HeadsUp({ items, onDismiss, onOpenTask }) { function OverviewScreen({ tasks, onOpen, onAddFor, density, onMoveTask }) { const byUser = Object.fromEntries(USERS.map(u => [u.id, []])); - tasks.forEach(t => { if (byUser[t.assignee]) byUser[t.assignee].push(t); }); + tasks.forEach(t => { if (byUser[t.assignee] && t.status !== 'closed') byUser[t.assignee].push(t); }); const [draggingTask, setDraggingTask] = React.useState(null); const [dragOverCol, setDragOverCol] = React.useState(null); return ( @@ -244,13 +244,14 @@ function UserScreen({ user, tasks, onOpen, onAddFor, density }) { const mine = tasks.filter(t => t.assignee === user.id); const open = mine.filter(t => t.status === 'open'); const flagged = mine.filter(t => t.status === 'unsuccessful' || t.status === 'billing'); + const closed = mine.filter(t => t.status === 'closed'); return (

{user.name}

-

{user.role} · {mine.length} tasks

+

{user.role} · {open.length + flagged.length} open tasks

+ + {closed.length > 0 && ( +
+
+ {closed.map(t => )} +
+
+ )}
); } @@ -398,7 +407,7 @@ function Modal({ children, onClose, title, eyebrow, wide = false }) { ); } -function TaskDetail({ task, allAudit = [], onClose, onMove, onPriority }) { +function TaskDetail({ task, allAudit = [], onClose, onMove, onPriority, onComplete }) { if (!task) return null; const assignee = findUser(task.assignee); const author = findUser(task.addedBy); @@ -415,7 +424,7 @@ function TaskDetail({ task, allAudit = [], onClose, onMove, onPriority }) { Auto-marked Unsuccessful. Two missed bookings detected by the scheduler. Decide on next step or revert.
- +
)} @@ -478,6 +487,10 @@ function TaskDetail({ task, allAudit = [], onClose, onMove, onPriority }) {