From 0b0385df95f905ac90ab097c0376944efb34b52a Mon Sep 17 00:00:00 2001 From: SylvainP1 <5533467-SylvainP1@users.noreply.replit.com> Date: Tue, 14 Apr 2026 08:48:24 +0000 Subject: [PATCH] Fix error when deleting time entries from the timesheet Update the timesheet detail page to correctly handle the deletion of time entries by ensuring that entries with zero hours are included in the save operation when they have been modified. Replit-Commit-Author: Agent Replit-Commit-Session-Id: 55837015-10e9-4be9-b857-7f5e6be73772 Replit-Commit-Checkpoint-Type: full_checkpoint Replit-Commit-Event-Id: 5d5b4df6-50de-4be5-a63e-d635e929441e Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/1cc377db-7ea0-49f2-97ce-c3e87e0228cc/55837015-10e9-4be9-b857-7f5e6be73772/9KCnXCa Replit-Helium-Checkpoint-Created: true --- .../cra-app/src/pages/timesheet-detail.tsx | 11 ++++++++--- attached_assets/image_1776156391873.png | Bin 0 -> 21304 bytes 2 files changed, 8 insertions(+), 3 deletions(-) create mode 100644 attached_assets/image_1776156391873.png diff --git a/artifacts/cra-app/src/pages/timesheet-detail.tsx b/artifacts/cra-app/src/pages/timesheet-detail.tsx index 192f2ae..956b0cc 100644 --- a/artifacts/cra-app/src/pages/timesheet-detail.tsx +++ b/artifacts/cra-app/src/pages/timesheet-detail.tsx @@ -58,10 +58,10 @@ export default function TimesheetDetailPage() { const deleteLine = useDeleteTimesheetLine(); const upsertEntries = useUpsertTimeEntries(); - // Local state for optimistic updates const [localEntries, setLocalEntries] = useState>({}); const [isAddingLine, setIsAddingLine] = useState(false); const [hasUnsavedChanges, setHasUnsavedChanges] = useState(false); + const dirtyKeysRef = useRef>(new Set()); const { data: projects } = useListProjects({ query: { queryKey: getListProjectsQueryKey() } }); @@ -78,6 +78,7 @@ export default function TimesheetDetailPage() { }); setLocalEntries(initial); setHasUnsavedChanges(false); + dirtyKeysRef.current.clear(); } }, [timesheet]); @@ -114,10 +115,11 @@ export default function TimesheetDetailPage() { const entries = localEntriesRef.current; const entriesToSave: LocalEntry[] = []; + const dirty = dirtyKeysRef.current; Object.entries(entries).forEach(([key, hours]) => { const lineIdStr = key.split("-")[0]; const fullDate = key.substring(lineIdStr.length + 1); - if (hours > 0) { + if (hours > 0 || dirty.has(key)) { entriesToSave.push({ timesheetLineId: parseInt(lineIdStr), date: fullDate, @@ -134,6 +136,7 @@ export default function TimesheetDetailPage() { onSuccess: () => { setSaveStatus("saved"); setHasUnsavedChanges(false); + dirtyKeysRef.current.clear(); queryClient.invalidateQueries({ queryKey: getGetTimesheetQueryKey(timesheetId) }); setTimeout(() => setSaveStatus("idle"), 2000); }, @@ -148,6 +151,7 @@ export default function TimesheetDetailPage() { const key = `${lineId}-${dateStr}`; setLocalEntries(prev => ({ ...prev, [key]: hours })); setHasUnsavedChanges(true); + dirtyKeysRef.current.add(key); if (saveTimerRef.current) clearTimeout(saveTimerRef.current); saveTimerRef.current = setTimeout(() => doSave(), 800); @@ -181,11 +185,12 @@ export default function TimesheetDetailPage() { if (hasUnsavedChanges) { const entries = localEntriesRef.current; + const dirty = dirtyKeysRef.current; const entriesToSave: LocalEntry[] = []; Object.entries(entries).forEach(([key, hours]) => { const lineIdStr = key.split("-")[0]; const fullDate = key.substring(lineIdStr.length + 1); - if (hours > 0) { + if (hours > 0 || dirty.has(key)) { entriesToSave.push({ timesheetLineId: parseInt(lineIdStr), date: fullDate, hours }); } }); diff --git a/attached_assets/image_1776156391873.png b/attached_assets/image_1776156391873.png new file mode 100644 index 0000000000000000000000000000000000000000..7d5b294d2767a859712d208052cf0dc9197db8ec GIT binary patch literal 21304 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