Skip to content

feat(projects): select several roadmap tasks at once (P25) - #185

Merged
romahawk merged 1 commit into
mainfrom
feat/p25-roadmap-multiselect
Oct 21, 2026
Merged

romahawk merged 1 commit into
mainfrom
feat/p25-roadmap-multiselect

Conversation

@romahawk

Copy link
Copy Markdown
Owner

What

A project roadmap gets a Select mode: tick several tasks (Shift-click for a range, or "Select shown"), then Complete, Move to a milestone or Delete them together, each with Undo. Done tasks fold under "Done (n)" in every group, collapsed by default. Also fixes toast Undo being unclickable while a project sheet is open.

Why

CONTROL_PLANE_UI_SPEC P25. A project with many tasks (Job-Search: 23 under "No milestone", most done) could only be changed one task at a time. Roman asked for multi-select on 2026-10-19 and chose "hide done tasks" over a new Archived state.

Changes

  • lib/roadmap.ts: selectTasks: a click toggles, a shift-click adds the shown range (never deselects); 4 tests in lib/roadmap.test.ts.
  • components/modules/project-roadmap.tsx: Select button; in Select mode the row checkbox selects (row menu and Add task hidden); sticky action bar (count, Select shown, Complete, Move to, Delete, stop); Undo toast for each action; TaskGroup folds done tasks under "Done (n)" per milestone and for "No milestone".
  • components/ui/sonner.tsx: toasts get pointer-events-auto. An open Sheet/Dialog sets pointer-events: none on <body>, so Undo could not be clicked.
  • components/ui/sheet.tsx: a click on a toast no longer counts as a click outside the sheet (it would close the project).
  • docs/CONTROL_PLANE_UI_SPEC.md: P25 → open, shape confirmed as written, acceptance criteria.
  • CHANGELOG.md: P25 entry.

No store schema, Firestore rules or route change.

Base and merge order

main. Merge #184 first (docs only, sets P27 done); otherwise main briefly has P27 and P25 both open. No file conflicts between them.

Verification

Gates (on 6a04280):

npm run typecheck → tsc --noEmit, exit 0
npm run lint      → eslint ., exit 0
npm test          → Tests 99 passed (99), 11 files, exit 0
npm run build     → "ƒ (Dynamic) server-rendered on demand", exit 0

Manual checks done (headless Edge, demo mode, scripted through CDP, 1366×768 and 390 px; demo project seeded with 8 tasks, 4 done):

  • "Done (3)" folded on load, no done rows shown; opening it shows the 3 rows.
  • Select: select checkboxes shown; row menus and Add task hidden inside the roadmap.
  • Click, then Shift-click → "3 selected", the three rows in shown order checked.
  • Move to first milestone → all three on it, toast "Moved 3 tasks · · Undo", selection cleared; Undo → back to no milestone.
  • Complete two → both done; Undo → both open.
  • Select shown (6) → Delete → 6 deleted; Undo → 0 deleted.
  • Undo hit-test: before the fix, elementFromPoint hit the sheet and the store did not change; after it, the button is hit and the sheet stays open.
  • Toolbar right edge 1335/1366 and 374/390, no document overflow; Stop selecting restores the complete checkboxes; no page errors.

Not verified:

  • Roman's real data (Job-Search, 23 tasks).
  • Keyboard-only range selection: Shift+Space toggles one row (a range needs the mouse or "Select shown").
  • Light theme; Safari, Firefox; touch devices.
  • Screenshots not attached to this PR (taken locally only).

Screenshots (if UI change)

Not attached (see Not verified).

Checklist

  • npm run typecheck, npm run lint, npm run build pass (output pasted above)
  • Tested on mobile (375px) and desktop (1280px), or listed under "Not verified" (390 px and 1366 px)
  • Offline behavior verified (if touching store or sync): N/A, uses existing store actions only
  • No console.log left in production code
  • CHANGELOG.md updated (for user-facing changes)
  • docs/NEXT_SESSION_START.md reflects this branch (session close): at /session-close

🤖 Generated with Claude Code

Why: a project with many tasks could only be changed one task at a time,
and done tasks filled the roadmap. Roman asked on 2026-10-19 for
multi-select with Complete, Move to milestone and Delete, done tasks folded.

- lib/roadmap.ts: selectTasks (click toggles, shift-click adds the shown range) + 4 tests.
- components/modules/project-roadmap.tsx: Select mode (select checkboxes, row menus and
  Add task hidden), sticky action bar (Select shown, Complete, Move to, Delete, each with
  an Undo toast), TaskGroup folds done tasks under "Done (n)" per group.
- components/ui/sonner.tsx: toasts pointer-events-auto, so Undo works under an open Sheet.
- components/ui/sheet.tsx: a click on a toast does not count as a click outside the sheet.
- Docs: spec P25 open with acceptance criteria; CHANGELOG.

Verified: npm run lint exit 0; npm test (typecheck + vitest) exit 0, 99 tests in
11 files; npm run build via the commit hook. Headless Edge, demo mode, 1366x768
and 390 px: Done (n) folded and opens; Select hides row menus and Add task;
shift-click range of 3; Move to + Undo, Complete + Undo, Select shown + Delete +
Undo all change the store and revert it; Undo clickable with the sheet open and
the sheet stays open; toolbar fits, no horizontal scroll; no page errors.
Not verified: Roman's real data (Job-Search, 23 tasks); keyboard-only range
selection (Shift+Space is a plain toggle); light theme; Safari, Firefox; touch.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@vercel

vercel Bot commented Oct 21, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
magic-kick Ready Ready Preview Oct 21, 2026 11:14am UTC

@romahawk
romahawk merged commit 408494e into main Oct 21, 2026
4 checks passed
@romahawk romahawk mentioned this pull request Oct 21, 2026
6 tasks done
romahawk added a commit that referenced this pull request Oct 21, 2026
Why: P25 merged as #185 after P27's close (#184); the spec still said
`open` and the handoff pointed at P25 as next.

- docs/CONTROL_PLANE_UI_SPEC.md: P25 status -> done (#185), with what was not checked.
- docs/NEXT_SESSION_START.md: header for main 408494e (gates of 2026-10-21, 99 tests);
  next by rank is P19 (own ADR + ANTHROPIC_API_KEY first); new 2026-10-21 section
  (P25 changes incl. the toast Undo fix, branch map, verified, not verified); older
  sections dropped (in git history); page-file cause of the build memory failures
  added to Local dev; keyboard-only P25 ranges added to Roman's decisions.

Verified: main 408494e differs from gated 6a04280 by docs only; on 6a04280 npm run
lint, typecheck, build exit 0 and npm test exit 0 (99 tests), 2026-10-21; hook gates
on this commit.
Not verified: docs only, nothing to check in the app; P25's own gaps are listed in the note.

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

This branch was successfully deployed

1 active deployment
Preview — 6a04280d Deployed Oct 21, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant