feat(web): Gantt and map components, read-only plan board #78
No reviewers
Labels
No labels
in-progress
in-review
needs-decision
priority: later
priority: next
priority: now
ready-for-agent
seam-request
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
patrick/Polaris!78
Loading…
Reference in a new issue
No description provided.
Delete branch "feature/web-plan-board"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Description
A planner (or viewer) opening the plan board now sees a real Gantt (crews × time) and a MapLibre map for the selected date, built as fully decoupled, reusable components — the Gantt takes plain schedule rows/items, the map takes plain GeoJSON, neither knows about the API or any store. The board's date picker and findings panel load from the plan API; since that API is still stubbed, a new
/plan/dev/fixturespage shows the same two components against a realistic checked-in example plan (two crews, four assignments in different triage states, a couple of validator findings, an unassigned job), so the schedule viewer can be reviewed and demoed today. Clicking an assignment on the Gantt highlights its stop on the map and vice versa. Every label and finding on the board is translated (Dutch and English).This is the read-only viewer only — accepting/rejecting assignments, dragging them between crews, the unassigned-jobs tray, and the version/diff switcher are later tickets building on the same store.
Related Issues
Closes #21. Row T-F (
docs/12-implementation-plan.md). Docs:docs/06-ux.mdP02 (read-only parts).Type of Change
Breaking Changes
None.
Test Plan
Tests green: Vitest covers the DTO → view-model mapping functions (including every triage-status/finding-severity combination) and both new components (including a mocked MapLibre so the map component is unit-testable without a real WebGL context).
npm run build,npm run lint, and the i18n key-parity check are all green. Manually verified/plan/dev/fixturesrenders the fixture plan on both the Gantt and the map.Checklist
docs/updated for any behavioural change (ADR added if a prior decision was reversed)polaris.domainAdditional Context
Two small touches outside this row's own paths, each minimal and explained in the commit body:
/dev/fixturesis mounted at/plan/dev/fixtures(viafeatures/plan/plan.routes.ts, which this row owns) instead of a new top-level entry inapp.routes.ts. That file is sealed, and its paired spec enforces exact parity between top-level routes andcore/nav.ts— a dev-only route has no nav entry by design, so adding it there would have broken that invariant.frontend/src/styles.scssnow importsmaplibre-gl's own stylesheet globally, since a per-componentstyleUrlimport would blow the (intentionally tight)anyComponentStylebudget.(The generated-OpenAPI-client lint exclusion this branch needed too was already added by #77 in the meantime — rebased onto
main, nothing left to touch there.)Known, deliberate scope limits (left for the tickets that need them): assignment/map-stop labels are
Job #<id>rather than a full "service — vehicle" label, since that needs the jobs/vehicles/catalogue DTOs T-A hasn't shipped yet — the mapping functions take an optional formatter so a richer label is a drop-in later. The "week strip" date switcher is a plain date input for now, not a full week view.37d6048e9ftoa58b6c9ed0