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>
120 lines
3.6 KiB
Dart
120 lines
3.6 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
|
import 'package:flutter_test/flutter_test.dart';
|
|
import 'package:tasq/models/profile.model.dart';
|
|
import 'package:tasq/screens/programmer_tasks/monitor/monitor_model.dart';
|
|
import 'package:tasq/screens/programmer_tasks/monitor/programmer_monitor_card.dart';
|
|
import 'package:tasq/screens/programmer_tasks/programmer_tasks_tabs.dart';
|
|
import 'package:tasq/utils/app_time.dart';
|
|
|
|
Profile _profile({String id = 'u1', String name = 'Alice'}) => Profile(
|
|
id: id,
|
|
role: 'programmer',
|
|
fullName: name,
|
|
);
|
|
|
|
ProgrammerMonitorEntry _entry({
|
|
required MonitorState state,
|
|
String id = 'u1',
|
|
String name = 'Alice',
|
|
}) =>
|
|
ProgrammerMonitorEntry(
|
|
programmer: _profile(id: id, name: name),
|
|
state: state,
|
|
currentTask: null,
|
|
currentTaskToday: Duration.zero,
|
|
todayTotal: Duration.zero,
|
|
inProgress: 0,
|
|
paused: 0,
|
|
notStarted: 0,
|
|
sheetStatus: null,
|
|
helped: [],
|
|
helpedBy: [],
|
|
);
|
|
|
|
Widget _wrapCard(ProgrammerMonitorEntry entry) {
|
|
return ProviderScope(
|
|
child: MaterialApp(
|
|
home: Scaffold(
|
|
body: ProgrammerMonitorCard(
|
|
entry: entry,
|
|
onTap: () {},
|
|
),
|
|
),
|
|
),
|
|
);
|
|
}
|
|
|
|
void main() {
|
|
setUpAll(AppTime.initialize);
|
|
|
|
group('programmerTasksTabsFor', () {
|
|
test('admin gets monitor + approvals + mine + all', () {
|
|
expect(
|
|
programmerTasksTabsFor(isStrictAdmin: true),
|
|
[
|
|
ProgrammerTasksTab.monitor,
|
|
ProgrammerTasksTab.approvals,
|
|
ProgrammerTasksTab.mine,
|
|
ProgrammerTasksTab.all,
|
|
],
|
|
);
|
|
});
|
|
|
|
test('programmer gets mine + all + daySheets', () {
|
|
expect(
|
|
programmerTasksTabsFor(isStrictAdmin: false),
|
|
[
|
|
ProgrammerTasksTab.mine,
|
|
ProgrammerTasksTab.all,
|
|
ProgrammerTasksTab.daySheets,
|
|
],
|
|
);
|
|
});
|
|
});
|
|
|
|
group('parseProgrammerTasksTab', () {
|
|
test('parse tab query', () {
|
|
expect(parseProgrammerTasksTab('day-sheets'), ProgrammerTasksTab.daySheets);
|
|
expect(parseProgrammerTasksTab('x'), isNull);
|
|
expect(parseProgrammerTasksTab(null), isNull);
|
|
expect(parseProgrammerTasksTab('monitor'), ProgrammerTasksTab.monitor);
|
|
expect(parseProgrammerTasksTab('mine'), ProgrammerTasksTab.mine);
|
|
expect(parseProgrammerTasksTab('all'), ProgrammerTasksTab.all);
|
|
expect(parseProgrammerTasksTab('approvals'), ProgrammerTasksTab.approvals);
|
|
});
|
|
});
|
|
|
|
group('monitor card pill labels', () {
|
|
testWidgets('onLeave -> On leave', (tester) async {
|
|
await tester.pumpWidget(_wrapCard(_entry(state: MonitorState.onLeave)));
|
|
await tester.pump();
|
|
expect(find.text('On leave'), findsOneWidget);
|
|
});
|
|
|
|
testWidgets('passSlip -> Pass slip', (tester) async {
|
|
await tester.pumpWidget(_wrapCard(_entry(state: MonitorState.passSlip)));
|
|
await tester.pump();
|
|
expect(find.text('Pass slip'), findsOneWidget);
|
|
});
|
|
|
|
testWidgets('working -> Working', (tester) async {
|
|
await tester.pumpWidget(_wrapCard(_entry(state: MonitorState.working)));
|
|
await tester.pump();
|
|
expect(find.text('Working'), findsOneWidget);
|
|
});
|
|
|
|
testWidgets('paused -> Paused', (tester) async {
|
|
await tester.pumpWidget(_wrapCard(_entry(state: MonitorState.paused)));
|
|
await tester.pump();
|
|
expect(find.text('Paused'), findsOneWidget);
|
|
});
|
|
|
|
testWidgets('idle -> Idle', (tester) async {
|
|
await tester.pumpWidget(_wrapCard(_entry(state: MonitorState.idle)));
|
|
await tester.pump();
|
|
expect(find.text('Idle'), findsOneWidget);
|
|
});
|
|
});
|
|
}
|