Files
tasq/lib/screens/programmer_tasks/programmer_tasks_tabs.dart
T
redz1029 54ce528b02 feat(programmer): day sheets + approvals tabs
- 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>
2026-09-28 14:43:52 +08:00

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';
}
}