NowWorkingCard was watching clockTickerProvider but received pre-computed
Duration values from ProgrammerDashboard, which never rebuilt on ticks.
Move ref.watch(clockTickerProvider) to ProgrammerDashboard.build() so
the parent rebuilds every 30 s and passes fresh durations to the card.
Remove the now-unused clockTickerProvider watch (and its import) from
NowWorkingCard.
Co-Authored-By: claude-flow <ruv@ruv.net>
Replace the Mine tab flat list with ProgrammerDashboard — a NowWorkingCard
hero (running task with Pause/Complete, or idle with nextUp Start), a
TODO stub for Task 8 stat tiles/badges, and collapsible TaskSections
(In progress, Paused, Not started always-visible; Completed/Cancelled
start collapsed with Show-all at 10+). groupTasksForDashboard excludes
other assignees and sorts completed/cancelled by terminal date desc.
Co-Authored-By: claude-flow <ruv@ruv.net>
Extract _TaskCard from the list screen into ProgrammerTaskCard, a
shared ConsumerWidget that reads programmerRunStatesProvider so the
paused-task pill and Start/Resume/Complete buttons are consistent
across any surface that embeds it.
Move the _complete body verbatim to completeProgrammerTaskWithConfirm
in programmer_task_actions.dart; the detail screen's _ActionBar now
calls the shared function.
Co-Authored-By: claude-flow <ruv@ruv.net>
Add ProgrammerDaySheet model with DaySheetStatus/DaySheetSnapshot,
computeProgrammerStats with streak, first-pass rate, approved totals,
hasCleanWeek, and tiered badge progress via computeBadges. 10 tests pass.
Co-Authored-By: claude-flow <ruv@ruv.net>
Implements DayActivityData, fetchDayActivityData, computeRunStates,
clockTickerProvider, todayKeyProvider, programmerActivitySignalProvider,
programmerDayDataProvider, and programmerRunStatesProvider in
lib/providers/programmer_day_data_provider.dart.
Includes four passing tests in test/programmer_day_data_test.dart
covering run-state computation and day-scoped activity fetching.
Co-Authored-By: claude-flow <ruv@ruv.net>
- Add Delta JSON happy-path test case to deltaJsonToPlainText tests
- Fix double-row bug: notes-only assignee rows only when userId == assigneeId
- Remove dead code: tautological taskMap.containsKey check in loop
Co-Authored-By: claude-flow <ruv@ruv.net>
- Add workDate field to ProgrammerTaskWorkLog (defaults to Manila day of createdAt)
- Add deltaJsonToPlainText function to quill_field.dart for Delta/plain text conversion
- Implement buildDayRows function to generate day sheet rows with proper sorting
- Implement DaySheetRow serialization and deserialization
- Add comprehensive tests for day rows builder and workDate field
- Verify backward compatibility via existing programmer_task_ledger_test
Co-Authored-By: claude-flow <ruv@ruv.net>
Capture whether segment was running before reassignment, and only reopen
for new assignee if it was. A paused task that gets reassigned should not
start accruing time for the new assignee until explicitly resumed.
Also add test: reassignment while paused does not open segment.
Co-Authored-By: claude-flow <ruv@ruv.net>
Implement daily time tracking and splitting for programmer tasks across
Manila midnights with proper assignee attribution, including support for
pauses, reassignments, and adjustments.
Co-Authored-By: claude-flow <ruv@ruv.net>
Separate feature for the `programmer` role to record dev work by category,
distinct from the IT help-desk `tasks` feature. Modeled on the IT Service
Requests pattern (Brick offline-first model -> Riverpod stream/controller ->
list/detail screens); seed of a future Project Management workflow.
- programmer_tasks + programmer_task_activity_logs (category enum, RLS,
realtime) via supabase migration
- single assignee, self-logged or lead-assigned; assign/reassign logged
- pause-on-switch: starting a task while another runs prompts to pause the
running one, keeping one active task per user for accurate time attribution
- worked-duration math shared with help-desk tasks via a generic core in
task_duration.dart (existing callers unchanged)
- list distinguishes running vs paused with a per-task Resume shortcut
- accessible dialog labels; route /programmer-tasks + nav gated to admin/programmer
- unit/widget tests: controller lifecycle, duration math, pause-switch dialog
Co-Authored-By: claude-flow <ruv@ruv.net>
- Profile Photo card: replace the tall centered avatar+buttons stack with a
compact horizontal row (avatar left, caption + Upload/Camera buttons right),
roughly halving the card height and reclaiming the dead vertical space.
- TasQColumn gains an optional `minWidth`; the adaptive table now sums per-column
minimums instead of a flat 200 px each. User Management sets narrow widths on
its short columns (Role/Offices/Status/Last active) so all six columns fit at
desktop width without the horizontal scroll that was clipping the Status
column. Other tables keep the 200 px default (unchanged).
Verified: flutter analyze lib clean; flutter build web green; visual QA
(Profile, User Management) in dark.
Co-Authored-By: claude-flow <ruv@ruv.net>
Address the remaining concrete items flagged by the dogfood pass.
Section headers (→ AppSectionHeader, azure accent bar + uppercase):
- Attendance: "Today's Schedule", "Pass Slip History", and two "Pending
Approvals" rows (were plain bold text / a manual tertiary accent bar).
User Management:
- Roles now display human-friendly labels (it_staff → "IT Staff", standard →
"Standard", …) in the table cell, mobile tile and edit dropdown, instead of
raw snake_case (Content/terminology consistency).
- _StatusBadge is now semantic via AppStatusColors: Active → success (green),
Locked → danger (red), else neutral — previously everything was teal, so a
Locked account read the same as an Active one.
Verified: flutter analyze lib clean; flutter build web green; visual QA
(Attendance, User Management) in dark.
Co-Authored-By: claude-flow <ruv@ruv.net>
The Profile screen's card section titles used plain bold titleMedium text,
inconsistent with the cyber accent-bar section headers elsewhere. Convert
"Profile Photo", "Face Verification", "Account details", "Password" and
"Offices" to AppSectionHeader so they read the same as the rest of the app.
Verified: flutter analyze lib clean; flutter build web green; visual QA
(Profile) in dark.
Co-Authored-By: claude-flow <ruv@ruv.net>
The IT Service Requests list tile still used the legacy StatusPill (violet
"DRAFT"); make it semantic like the detail header. Extract the ISR status ->
StatusKind mapping into a shared helper so list and detail stay in sync.
- New isr_status_kind.dart (public isrStatusKind); removed the private duplicate
from the detail screen.
- _RequestTile now uses StatusPill.kind(isrStatusKind(status), ...).
(The request cards were already content-dense; no layout change needed.)
Verified: flutter analyze lib clean; flutter build web green.
Co-Authored-By: claude-flow <ruv@ruv.net>
Reduce dead whitespace and align the Reports charts to the cyber card language.
Layout only — charts, data and PDF export untouched.
- report_card_wrapper.dart: flat tonal fill + hairline outline + token radius
(was surfaceContainerLow + hard 16 radius, no border); uppercase telemetry
card title to match section headers.
- status_charts.dart / request_distribution_charts.dart: donut charts now use a
fixed 150px donut with an Expanded legend beside it (was an Expanded donut +
cramped right legend, leaving a large central gap); card height 220 -> 180.
Verified: flutter analyze lib clean; flutter build web green; visual QA (Reports)
in dark.
Co-Authored-By: claude-flow <ruv@ruv.net>
Re-theme TasQ with a refined enterprise "Cyber/IT" identity on Material 3.
Functionality is unchanged — only color/shape tokens and a few state widgets.
Foundation:
- Hand-tuned light + dark ColorSchemes (deep-slate surfaces, azure/teal/violet
accents), tightened 12-16dp shape language, flat hairline-outlined cards.
- New AppStatusColors theme extension (success/warning/danger/info/neutral,
per-brightness) replacing scattered raw Colors.green/orange/red/grey so status
color is consistent and legible in dark mode.
- New TechChip mono primitive; StatusPill.kind; M3Card hairline variants;
tightened AppSurfaces radii.
Per-screen:
- Tokenized status colors + radii across dashboard, tickets, tasks, IT service
requests, attendance, whereabouts, network map, reports charts, auth, and
shared/admin screens. Added _ticketStatusKind/_taskStatusKind/_isrStatusKind
mappers so status carries meaning consistently.
- Fixed white pie-slice borders for dark mode; dropped ad-hoc dialog radius
overrides in favor of the theme default. Categorical palettes (leave-type
icons, team color picker, distribution charts) intentionally preserved.
Verified: flutter analyze lib clean; flutter build web green; visual QA in
light and dark (dashboard, tickets, attendance).
Co-Authored-By: claude-flow <ruv@ruv.net>