feat(web): consolidate Gantt into view tab on issue detail (UI-2) #401
No reviewers
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
3 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
charles/claude-hooks!401
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "feat/398-gantt-view-tab"
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?
Merges the Gantt timeline into the issue detail route as
?view=gantt, eliminating the redundant SSE subscription and duplicateonPipelineStagelogic that existed between the two routes.useIssuePipelineSSE(queryClient, repo, issueNum)hook extracts the shared SSE+cache-patch logic?view=graph|ganttsearch param added;graphis the defaultGraph | Timelinetab toggle lives in the nav bar (same route, different?view=)nowticker only runs whenview === "gantt"(effect cleanup on toggle)/monitor/issue/$owner/$repo/$issueNumber/ganttroute becomes abeforeLoadredirect to?view=ganttTest plan
validateSearch:ganttaccepted,graph/invalid/absent → no key in outputbeforeLoadthrows with correctto,params, andsearchCloses #398
ef93b6cb13a78c51852aCI green. Route consolidation, SSE extraction, redirect, and validateSearch are all correct. Two test gaps block approval — both are explicitly in the AC.
test-gap (
monitor.issue.$owner.$repo.$issueNumber.test.tsx): ThesetInterval called exactly once when entering gantt viewtest validates a local re-implementation of the effect (runEffect) rather than the actualuseEffectin the component. A regression in the productionuseEffect(wrong interval, swapped callback, missing dep) would not be caught. The test needs to exercise the real component — use Vitest's fake timers +@testing-library/reactrender, or at minimum spy onsetIntervalbefore mounting the component withview="gantt"and assert it was called.test-gap (
monitor.issue.$owner.$repo.$issueNumber.test.tsx): The AC explicitly requires render tests for:?view=ganttrenders<PipelineGantt>,?view=graphrenders<PipelineGraph>, default is graph, toggle updates URL without unmount. None of these are present — the file only testsvalidateSearchand redirect logic. The conditional render path (linesview === "gantt" ? <PipelineGantt …> : <PipelineGraph …>) has no coverage that would catch a swapped branch or a brokenissueprop.a78c51852a3e0751cac43e0751cac46dd0457ded01ab5b8275e74e765648