54ce528b02
- day_sheet_snapshot_builder.dart: buildSnapshotForSheet (approved → stored snapshot, else live buildDayRows), groupSheetsByDate (descending keys), approvalCounts (pending/awaiting/approved) - approvals_tab.dart: status filter chips, programmer dropdown, ReportDateFilter.controlled, date-grouped cards with Auto/Early/Round badges, checkbox multi-select, bulk Approve selected (n) flow - day_sheets_tab.dart: Today card (live rows, total, status, Submit day), Needs your attention (disapproved), history with AppStatusSummaryRow All/Pending/Disapproved/Approved filter - programmerTasksTabsFor: admin → [monitor, approvals, mine, all]; programmer → [mine, all, daySheets] - programmer_tasks_list_screen.dart: wire approvals + daySheets cases Tests: 15 passing (day_sheet_tabs_test + programmer_tabs_test) Co-Authored-By: claude-flow <ruv@ruv.net>
66 lines
1.8 KiB
Dart
66 lines
1.8 KiB
Dart
/// Tab enumeration and helpers for the Programmer Tasks list screen.
|
|
///
|
|
/// This-slice tabs (Task 10):
|
|
/// Admin: [monitor, mine, all]
|
|
/// Non-admin: [mine, all]
|
|
///
|
|
/// approvals and daySheets are deferred to later slices.
|
|
enum ProgrammerTasksTab { monitor, approvals, mine, all, daySheets }
|
|
|
|
/// Returns the ordered tab list for the current role.
|
|
///
|
|
/// Admin: [monitor, approvals, mine, all]
|
|
/// Programmer: [mine, all, daySheets]
|
|
List<ProgrammerTasksTab> programmerTasksTabsFor({required bool isStrictAdmin}) {
|
|
if (isStrictAdmin) {
|
|
return [
|
|
ProgrammerTasksTab.monitor,
|
|
ProgrammerTasksTab.approvals,
|
|
ProgrammerTasksTab.mine,
|
|
ProgrammerTasksTab.all,
|
|
];
|
|
}
|
|
return [
|
|
ProgrammerTasksTab.mine,
|
|
ProgrammerTasksTab.all,
|
|
ProgrammerTasksTab.daySheets,
|
|
];
|
|
}
|
|
|
|
/// Parses a URL query-parameter value to a [ProgrammerTasksTab].
|
|
///
|
|
/// Valid values: 'monitor', 'approvals', 'mine', 'all', 'day-sheets'.
|
|
/// Returns null for unrecognised or null input.
|
|
ProgrammerTasksTab? parseProgrammerTasksTab(String? q) {
|
|
switch (q) {
|
|
case 'monitor':
|
|
return ProgrammerTasksTab.monitor;
|
|
case 'approvals':
|
|
return ProgrammerTasksTab.approvals;
|
|
case 'mine':
|
|
return ProgrammerTasksTab.mine;
|
|
case 'all':
|
|
return ProgrammerTasksTab.all;
|
|
case 'day-sheets':
|
|
return ProgrammerTasksTab.daySheets;
|
|
default:
|
|
return null;
|
|
}
|
|
}
|
|
|
|
/// Human-readable tab label for display in [TabBar].
|
|
String programmerTasksTabLabel(ProgrammerTasksTab t) {
|
|
switch (t) {
|
|
case ProgrammerTasksTab.monitor:
|
|
return 'Monitor';
|
|
case ProgrammerTasksTab.approvals:
|
|
return 'Approvals';
|
|
case ProgrammerTasksTab.mine:
|
|
return 'Mine';
|
|
case ProgrammerTasksTab.all:
|
|
return 'All';
|
|
case ProgrammerTasksTab.daySheets:
|
|
return 'Day Sheets';
|
|
}
|
|
}
|