7beb8e8713
- 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>
58 lines
1.7 KiB
Dart
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';
|
|
}
|
|
}
|