From 4f60e2300333c8094259f399050e5fd66f7a9bf9 Mon Sep 17 00:00:00 2001 From: Marc Rejohn Castillano Date: Mon, 28 Sep 2026 21:05:58 +0800 Subject: [PATCH] =?UTF-8?q?fix(approvals):=20show=20=E2=80=94=20instead=20?= =?UTF-8?q?of=200m=C2=B70=20tasks=20for=20pending/disapproved=20sheets?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit approvedSnapshot is only populated at approval time; pending and disapproved sheets had null snapshot so the card always displayed 0m ยท 0 tasks. Now totalSecs/taskCount are passed as nullable params from the parent; the card renders โ€” when no snapshot is available yet. Also accept camelCase 'daySheets' URL param in parseProgrammerTasksTab alongside the existing hyphenated 'day-sheets' spelling. Co-Authored-By: claude-flow --- .../day_sheets/approvals_tab.dart | 17 +++++++++++++---- .../programmer_tasks/programmer_tasks_tabs.dart | 1 + 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/lib/screens/programmer_tasks/day_sheets/approvals_tab.dart b/lib/screens/programmer_tasks/day_sheets/approvals_tab.dart index 185e6ad2..376b6643 100644 --- a/lib/screens/programmer_tasks/day_sheets/approvals_tab.dart +++ b/lib/screens/programmer_tasks/day_sheets/approvals_tab.dart @@ -269,6 +269,8 @@ class _ApprovalsTabState extends ConsumerState { profile: profileById[sheet.programmerId], showCheckbox: _filter == DaySheetStatus.pending, selected: _selected.contains(sheet.id), + totalSecs: sheet.approvedSnapshot?.totalSeconds, + taskCount: sheet.approvedSnapshot?.rows.length, onToggle: _filter == DaySheetStatus.pending ? (v) => setState(() { if (v == true) { @@ -324,6 +326,8 @@ class _SheetApprovalCard extends StatelessWidget { required this.selected, required this.onToggle, required this.onTap, + this.totalSecs, + this.taskCount, }); final ProgrammerDaySheet sheet; @@ -332,11 +336,12 @@ class _SheetApprovalCard extends StatelessWidget { final bool selected; final ValueChanged? onToggle; final VoidCallback onTap; + /// Null when no approved snapshot exists yet (pending/disapproved sheets). + final int? totalSecs; + final int? taskCount; @override Widget build(BuildContext context) { - final totalSecs = sheet.approvedSnapshot?.totalSeconds ?? 0; - final taskCount = sheet.approvedSnapshot?.rows.length ?? 0; final roundNum = sheet.resubmissions + 1; return Card( @@ -369,9 +374,13 @@ class _SheetApprovalCard extends StatelessWidget { runSpacing: 4, children: [ TechChip( - formatDurationHm(Duration(seconds: totalSecs)), + totalSecs != null + ? formatDurationHm(Duration(seconds: totalSecs!)) + : 'โ€”', + ), + TechChip( + taskCount != null ? '$taskCount tasks' : 'โ€”', ), - TechChip('$taskCount tasks'), if (sheet.autoSubmitted) const TechChip('Auto', status: StatusKind.info) else diff --git a/lib/screens/programmer_tasks/programmer_tasks_tabs.dart b/lib/screens/programmer_tasks/programmer_tasks_tabs.dart index 13f6c74a..fb9d8f4b 100644 --- a/lib/screens/programmer_tasks/programmer_tasks_tabs.dart +++ b/lib/screens/programmer_tasks/programmer_tasks_tabs.dart @@ -42,6 +42,7 @@ ProgrammerTasksTab? parseProgrammerTasksTab(String? q) { case 'all': return ProgrammerTasksTab.all; case 'day-sheets': + case 'daySheets': return ProgrammerTasksTab.daySheets; default: return null;