From bc1bab10063a4df541d9c8011ae497e018dfd1ff Mon Sep 17 00:00:00 2001 From: Hermes Date: Sun, 23 Aug 2026 00:42:40 +0000 Subject: [PATCH] fix(admin): drawer stays in sync with grid after mutations --- src/app/admin/page.tsx | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/app/admin/page.tsx b/src/app/admin/page.tsx index 242bb85..a275c7c 100644 --- a/src/app/admin/page.tsx +++ b/src/app/admin/page.tsx @@ -219,6 +219,27 @@ export default function AdminPage() { return employees.filter((emp) => days.some((day) => gridData[emp.id]?.[dateKey(toUnix(day))]?.hasErrors)); }, [employees, days, gridData, showIssuesOnly]); + // Keep the open drawer in sync after any mutation — grid already refreshes via + // loadEntries() -> allEntries -> gridData, but selectedDayEntries is a snapshot + // taken when the drawer opened. This patches it in place so the timeline / + // summary strip / issue list update without closing the drawer. + useEffect(() => { + if (!sheetOpen || !selectedDayEntries) return; + const empId = manualPunchForm.employeeId; + const dateStr = selectedDayEntries.date; + const dayData = gridData[empId]?.[dateStr]; + if (!dayData) return; + const prevIds = selectedDayEntries.entries.map((e) => e.id).join(','); + const nextIds = dayData.entries.map((e) => e.id).join(','); + const prevErr = selectedDayEntries.errors.join('|'); + const nextErr = (dayData.errors || []).join('|'); + if (prevIds !== nextIds || prevErr !== nextErr) { + setSelectedDayEntries((prev) => + prev ? { ...prev, entries: dayData.entries, errors: dayData.errors || [] } : prev, + ); + } + }, [allEntries, gridData, sheetOpen, selectedDayEntries, manualPunchForm.employeeId]); + const openDetailDrawer = (employee: Employee, dateStr: string) => { const dayData = gridData[employee.id]?.[dateStr]; if (!dayData) return;