feat(web): merge Grid route into Pipeline as view toggle (UC-2) #263
Labels
No labels
area:agents
area:dashboard
area:database
area:design
area:design-review
area:flows
area:infra
area:meta
area:security
area:sessions
area:webhook
area:workdir
security
type:bug
type:chore
type:meta
type:user-story
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
charles/claude-hooks#263
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
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?
As an operator, I want the Pipeline grid to be a view mode of the Pipeline page rather than its own nav entry, so that I can flip between list and grid without losing my filter state and without an extra tab in the nav.
Acceptance criteria
Route consolidation
/monitorgains aview?: "list" | "grid"search param (defaultlist).validateSearchaccepts either value and drops anything else.<PipelineList>whenview === "list"and<PipelineGrid>whenview === "grid". Both components already accept the samePipelineFilters+IssuePipelineResponseprops; no prop-reshaping required./monitor/gridroute file is deleted. The file-based router resolves its old path via a redirect to/monitor?view=grid&<other-params>preserving every existing search param (repo,milestone,assignee,label,state,risk).PipelineSearchvalidator inmonitor.grid.tsxis removed and the single remaining validator inmonitor.index.tsxis the sole source of truth.Toggle UI
FilterBar(exported frompipeline-list.tsx) — one List, one Grid. Selected state usesbg-accent text-accent-foregroundper token rules; non-selected usesbg-surface text-muted.replace: true) so the back button doesn't stack a history entry per toggle.role="tablist"witharia-selectedon the active item.SSE + cache
["pipeline", ...]query-key invalidation stays the way it is — both views already write through the same key, so no dedup logic is needed.pipeline_stageSSE patching logic is lifted into a shared hook (e.g.usePipelineSSE(queryClient)) so the single route doesn't carry two copies of theonPipelineStagecallback.Nav
components/app-shell.tsxdrops theGridentry from both top-nav and bottom-tab arrays. Nav-label tests updated.Tests
/monitor?view=gridrendersPipelineGrid;/monitor(noview) rendersPipelineList; malformedview=xyzfalls back to list./app/monitor/grid?repo=…&risk=1URL lands on/app/monitor?view=grid&repo=…&risk=1with filters preserved and the grid rendered.pipeline-list.test.tsx+pipeline-grid.test.tsxstay green — component APIs are unchanged.Out of scope
PipelineGridorPipelineListrendering — the merge is routing-only./issues/pipelineserver contract or SSE envelopes.sortstays local component state.References
specs/ui-consolidation.md§ UC-2 (Merge Grid into Pipeline as a view toggle)apps/web/src/routes/monitor.grid.tsx(deleted)apps/web/src/routes/monitor.index.tsx(extended)apps/web/src/components/pipeline-list.tsx(FilterBar extended)apps/web/src/components/app-shell.tsx(nav prune)Dependencies
/app/specs→/app/planner?spec=…redirect helper pattern. Otherwise independent.