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>
This commit is contained in:
@@ -0,0 +1,57 @@
|
||||
/// 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';
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user