No way to add a milestone to an issue. #119

Closed
opened 2026-09-05 04:56:45 +00:00 by crueber · 3 comments
Owner

When there are milestones for a repo, there doesn't appear to be a way to add one. I recommend using the same + as the labels have, and the drop down should contain the milestones. Then appear there. And in the milestone page it should show which issues are connected and how many there are.

When there are milestones for a repo, there doesn't appear to be a way to add one. I recommend using the same + as the labels have, and the drop down should contain the milestones. Then appear there. And in the milestone page it should show which issues are connected and how many there are.
Author
Owner

Fixed by #128 — milestone picker in the issue sidebar (+ dropdown with No-milestone clear) + per-milestone linked issues on the milestones page. Includes a backend fix: PATCH {"milestone": null} now actually clears (it silently no-op'd before). Not merging; needs review.

Fixed by https://git.packden.us/crueber/walhub/pulls/128 — milestone picker in the issue sidebar (+ dropdown with No-milestone clear) + per-milestone linked issues on the milestones page. Includes a backend fix: PATCH {"milestone": null} now actually clears (it silently no-op'd before). Not merging; needs review.
Author
Owner

PR #128 review (fix/issue-119, commit 1a03832 + review fixup 8e1ff56): APPROVED — ready to merge.

Backend null-decode fix (internal/issues/http.go:473-504): correct. RawMessage stays nil when absent (no-op preserved) and holds 'null' on clear; non-string/non-null 400s; unknown id 400s via service. Verified by code + regression test (set/absent-no-op/clear/400-number/400-unknown-id, all passing).
Sibling-key audit (service.go IssuePatch): no other PATCH key needs the same pass. title/state (string: null collapses to no-op instead of 400) and labels/assignees ([]string: null collapses to no-op) share the encoding shape but have no documented null-vs-absent distinction — milestone is the only key where null means 'clear' (02 §7). Null-title-as-no-op is fail-open-tolerant (ignores invalid input, mutates nothing); out of scope for this PR.
Picker (MilestonePicker.jsx): mirrors LabelPicker idiom — menuitemradio rows (correct single-select vs checkbox), checkmark, 'No milestone' clear row, page-owned cache via props (never fetches), triage gating in Issue.jsx:382, Esc+refocus/outside-click/native buttons, busy-disable. Title display uses milestoneTitle with bare-id fallback (matches 02 §3.1 label self-heal stance). Milestone page uses server-side milestone= filter per row + title links to /issues?milestone= (Issues.jsx already reads that param) — no client world-filter.
Tests: go test -race ./internal/issues/... ok; coverage 96.2% (>=95%); go vet clean; gofmt clean; node --test web/test/unit/*.test.js 270/270 pass (incl. new milestones.test.js). No new non-stdlib imports (encoding/json already imported).
Review fixup pushed (8e1ff56): added absent-key no-op lock-in to TestPatchIssueMilestoneHTTP (http_test.go) — the PR asserted clear but never that absent leaves the milestone untouched. Re-tested green.
Docs (02_issues.md §7 + Wave B notes): accurate, minimal, correct section.
Note: no browser drive (per instructions); headless node tests + reasoning only.

PR #128 review (fix/issue-119, commit 1a03832 + review fixup 8e1ff56): APPROVED — ready to merge. Backend null-decode fix (internal/issues/http.go:473-504): correct. RawMessage stays nil when absent (no-op preserved) and holds 'null' on clear; non-string/non-null 400s; unknown id 400s via service. Verified by code + regression test (set/absent-no-op/clear/400-number/400-unknown-id, all passing). Sibling-key audit (service.go IssuePatch): no other PATCH key needs the same pass. title/state (*string: null collapses to no-op instead of 400) and labels/assignees (*[]string: null collapses to no-op) share the encoding shape but have no documented null-vs-absent distinction — milestone is the only key where null means 'clear' (02 §7). Null-title-as-no-op is fail-open-tolerant (ignores invalid input, mutates nothing); out of scope for this PR. Picker (MilestonePicker.jsx): mirrors LabelPicker idiom — menuitemradio rows (correct single-select vs checkbox), checkmark, 'No milestone' clear row, page-owned cache via props (never fetches), triage gating in Issue.jsx:382, Esc+refocus/outside-click/native buttons, busy-disable. Title display uses milestoneTitle with bare-id fallback (matches 02 §3.1 label self-heal stance). Milestone page uses server-side milestone= filter per row + title links to /issues?milestone= (Issues.jsx already reads that param) — no client world-filter. Tests: go test -race ./internal/issues/... ok; coverage 96.2% (>=95%); go vet clean; gofmt clean; node --test web/test/unit/*.test.js 270/270 pass (incl. new milestones.test.js). No new non-stdlib imports (encoding/json already imported). Review fixup pushed (8e1ff56): added absent-key no-op lock-in to TestPatchIssueMilestoneHTTP (http_test.go) — the PR asserted clear but never that absent leaves the milestone untouched. Re-tested green. Docs (02_issues.md §7 + Wave B notes): accurate, minimal, correct section. Note: no browser drive (per instructions); headless node tests + reasoning only.
Author
Owner

Fixed by PR #128 incl. review absent-key lock-in test (null-milestone backend bug fixed; 96.2% + 270/270), merged. Closing.

Fixed by PR #128 incl. review absent-key lock-in test (null-milestone backend bug fixed; 96.2% + 270/270), merged. Closing.
crueber added this to the v1 milestone 2026-09-10 22:20:46 +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#119
No description provided.