Files
tasq/lib/screens/programmer_tasks/programmer_tasks_tabs.dart
T
redz1029 7beb8e8713 feat(programmer): admin monitor tab + drill-down
- Add isStrictAdminProvider (role == 'admin' only)
- Add programmer_tasks_tabs.dart with ProgrammerTasksTab enum,
  programmerTasksTabsFor, parseProgrammerTasksTab, programmerTasksTabLabel
- Make ProgrammerTasksListScreen role-aware via initialTab param and
  programmerTasksTabsFor; admin sees Monitor/Mine/All tabs
- Add MonitorTab with AppStatusSummaryRow + responsive programmer grid
  (1/2/3 cols) + HelpPanel side/bottom
- Add ProgrammerMonitorCard with state pills (Working/Paused/Idle/On leave/Pass slip)
- Add HelpPanel ConsumerStatefulWidget with day stepper and help-edge rows
- Add ProgrammerDrillDownScreen (/programmer-tasks/programmers/:userId);
  non-admins see lock empty view
- Router: pass tab query param; add programmers/:userId before :id route
- Tests: 7/7 pass; analyze: 0 new issues

Co-Authored-By: claude-flow <ruv@ruv.net>
2026-09-27 22:39:19 +08:00

58 lines
1.7 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 in this slice.
List<ProgrammerTasksTab> programmerTasksTabsFor({required bool isStrictAdmin}) {
if (isStrictAdmin) {
return [
ProgrammerTasksTab.monitor,
ProgrammerTasksTab.mine,
ProgrammerTasksTab.all,
];
}
return [ProgrammerTasksTab.mine, ProgrammerTasksTab.all];
}
/// 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';
}
}