Milestone sidebar UX: minus-button removal + linked milestone #148

Closed
opened 2026-09-05 18:13:33 +00:00 by crueber · 3 comments
Owner

Milestone sidebar UX: minus-button removal + linked milestone

Follow-up to #119/#132 (user feedback on the shipped + dropdown design).

  1. Once a milestone is set, the + button goes away. In its place: a − button that removes the issue from the milestone directly — no dropdown needed for removal. The + dropdown remains only for the unassigned state (picking a milestone).
  2. The milestone name links to the milestone view page (the milestone-filtered issues list / milestone detail — whichever is the canonical per-milestone view; keep consistent with the milestone page links from #119).

Acceptance criteria

  • Set state: − button removes directly (API-confirmed), + hidden; unset state: + dropdown picks (unchanged).
  • Milestone name is a link to its view page.
  • node --test green; browser check set→remove→set cycle both themes, zero console errors; no new deps.
# Milestone sidebar UX: minus-button removal + linked milestone Follow-up to #119/#132 (user feedback on the shipped + dropdown design). 1. **Once a milestone is set, the + button goes away.** In its place: a **− button that removes the issue from the milestone directly** — no dropdown needed for removal. The + dropdown remains only for the unassigned state (picking a milestone). 2. **The milestone name links to the milestone view page** (the milestone-filtered issues list / milestone detail — whichever is the canonical per-milestone view; keep consistent with the milestone page links from #119). ## Acceptance criteria - [ ] Set state: `−` button removes directly (API-confirmed), + hidden; unset state: + dropdown picks (unchanged). - [ ] Milestone name is a link to its view page. - [ ] `node --test` green; browser check set→remove→set cycle both themes, zero console errors; no new deps.
Author
Owner

Fixed by #149 (branch fix/issue-148): − button + linked title, tests green, browser-verified both themes.

Fixed by #149 (branch fix/issue-148): − button + linked title, tests green, browser-verified both themes.
Author
Owner

PR #149 review (fix/issue-148, 9c9776b) — APPROVED, ready to merge.

Render branches (web/src/pages/Issue.jsx:446-483): set state shows triage-gated − button and hides the + picker via Show when={t().milestone} with picker as fallback — no both/neither state; unset state passes current={null}, identical to old current={t().milestone ?? null} when unset. Non-triage sees neither control, same as before.

Minus path: onClick selectMilestone(null) reuses the proven explicit-null PATCH (milestonePatch returns {milestone:null}, skips no-op), pinned key n=num()/ck=key() + stale-guard reload/invalidate, busy early-return + disabled={getMilestoneBusy()} — #143/#145 discipline intact, no regression.

Title link href /{full}/issues?milestone=<encodeURIComponent(id)> matches Milestones.jsx:99 (#119 shape) exactly, including class/title idiom (title resolves via milestoneTitle, correct since thread carries only the id). Dark+light via shared emerald/dark: classes; − button reuses the picker trigger btn classes. No new deps (A from already-approved @solidjs/router).

Docs (02_issues.md:305,381): entries accurate, reference #148/#143/#145/#119 correctly.

Verify (scratch /tmp/opencode/wt148, main worktree untouched): node --test web/test/unit/*.test.js 317 pass / 0 fail; vite build clean (121 modules, 1.74s). No browser drive (static JSX branch change, covered by reasoning + existing headless suite per instructions).

MERGE RECOMMENDATION: ready to merge.

PR #149 review (fix/issue-148, 9c9776b) — APPROVED, ready to merge. Render branches (web/src/pages/Issue.jsx:446-483): set state shows triage-gated − button and hides the + picker via Show when={t().milestone} with picker as fallback — no both/neither state; unset state passes current={null}, identical to old current={t().milestone ?? null} when unset. Non-triage sees neither control, same as before. Minus path: onClick selectMilestone(null) reuses the proven explicit-null PATCH (milestonePatch returns {milestone:null}, skips no-op), pinned key n=num()/ck=key() + stale-guard reload/invalidate, busy early-return + disabled={getMilestoneBusy()} — #143/#145 discipline intact, no regression. Title link href `/{full}/issues?milestone=<encodeURIComponent(id)>` matches Milestones.jsx:99 (#119 shape) exactly, including class/title idiom (title resolves via milestoneTitle, correct since thread carries only the id). Dark+light via shared emerald/dark: classes; − button reuses the picker trigger btn classes. No new deps (A from already-approved @solidjs/router). Docs (02_issues.md:305,381): entries accurate, reference #148/#143/#145/#119 correctly. Verify (scratch /tmp/opencode/wt148, main worktree untouched): node --test web/test/unit/*.test.js 317 pass / 0 fail; vite build clean (121 modules, 1.74s). No browser drive (static JSX branch change, covered by reasoning + existing headless suite per instructions). MERGE RECOMMENDATION: ready to merge.
Author
Owner

Fixed by PR #149 (review clean; − reuses proven null path; 317/317 node tests), merged. Closing.

Fixed by PR #149 (review clean; − reuses proven null path; 317/317 node tests), merged. Closing.
crueber added this to the v1 milestone 2026-09-10 22:20:48 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
crueber/walhub#148
No description provided.