feat(time-tracking): wire Hub / Manual Entry / Recent Activity screens into the field app
Deploy to route.crispygoat.com / deploy (push) Successful in 4m38s
Deploy to route.crispygoat.com / deploy (push) Successful in 4m38s
The cycle 12 Hub + Manual Entry + Recent Activity surfaces were defined
(HubScreen, ManualEntryScreen, ManualEntrySuccessScreen, HistoryScreen)
and the reducer / state / server actions were all wired, but the render
branches in TimeTrackingScreens were never connected — so a worker
hitting the field app on a valid session got a blank Hub, and after
clock-out they were dumped back on the PIN screen even though the
session cookie was still valid.
This commit reconnects the four missing screens:
- hub → HubScreen (greeting, live status hero, three big
action tiles: Clock In / Out, Manual Entry, Recent
Activity + a small Sign-out chip)
- manual_entry → ManualEntryScreen (date / clock in / clock out /
lunch / task / reason / notes, client-side
validation, calls submitManualTimeLog)
- manual_entry_success → ManualEntrySuccessScreen (receipt card +
Add another / Back to home)
- history → HistoryScreen (date-grouped last-14-days list
from getRecentTimeLogs)
Main component gains:
- handleHubTap(dest) — small state machine for the hub tiles
- handleSubmitManualLog() — validates the draft, calls the server,
stores ManualEntryResult, navigates to success
- handleAnotherManualLog() / handleHome() — round-trip back into the
manual flow / hub
- loadRecentLogs() — fires on history-screen entry, dispatches the
SET_MANUAL_LOGS_* actions
ClockedOutScreen no longer dumps the worker on the PIN screen:
- 'Back to PIN entry' → 'Back to home' (lands on hub, session stays)
- New 'Sign out' ghost button for the explicit log-out path
Two new translation keys (en + es):
- clocked_out_home_cta: 'Back to home' / 'Volver al inicio'
- clocked_out_sign_out_cta: 'Sign out' / 'Cerrar sesión'
Verification
- npx tsc --noEmit → 0 errors
- npm run build → green
- local 200 on /tuxedo/time-clock (dev server)
This commit is contained in: