Build the Route Optimization route planner UI in groombook/web:
- New /admin/routes page with date picker + groomer selector
(auto-filtered for groomer role via GET /api/staff/me)
- react-leaflet + OpenStreetMap tiles, lazy-loaded so Leaflet ships
as a separate code-split chunk (RouteMap-*.js / .css)
- Map with numbered teardrop divIcon pins + route polyline, auto-fit
bounds; numbered pins avoid the Leaflet default-marker asset issue
- Stop-list panel: per-stop card with time, client name, address,
travel time from previous stop, and tight-schedule conflict flag
- Total travel time + distance summary + route status badge
(draft / optimized / in_progress / completed)
- "Optimize" button wired to POST /api/routes/optimize
- Reads daily route via GET /api/routes/daily?staffId=&date=
- Tests for stop rendering, summary, role auto-filter, optimize call
- Updated UAT_PLAYBOOK.md §5.28 — Route Planner Page
Co-Authored-By: Paperclip <noreply@paperclip.ing>
The extracted repo is no longer a monorepo — pnpm --filter doesn't match
the root package. Add pnpm-workspace.yaml for packages/types, add
@groombook/types as workspace dep, and run commands directly at root.
Co-Authored-By: Paperclip <noreply@paperclip.ing>
Vitest globals require @types/node for process.env in test setup.
Tests pass in CI but typecheck fails without it.
Co-Authored-By: Paperclip <noreply@paperclip.ing>
- Copy apps/web/ with all src, components, pages, portal
- Inline packages/types/ as local packages/types module
- Add tsconfig path aliases for @groombook/types
- Port Dockerfile and CI workflow
- Image name: ghcr.io/groombook/web
Co-Authored-By: Paperclip <noreply@paperclip.ing>