Fix #416: filter dropdowns #418

Merged
crueber merged 1 commit from fix/issue-416 into main 2026-09-12 21:13:28 +00:00
Owner

Fixes #416 — the issues-list filter bar's Milestone and Labels free-text inputs become dropdowns fed from the repo caches, in the #415 State/Assignee/Labels/Milestone/Refresh positions.

  • Milestone: native single-select (State-field consistency, the implementer's call left open in the issue — decided native) from milestones:{o}/{r}, with All milestones (clear) + No milestone (→ none).
  • Labels: multi-select popover in the LabelPicker idiom (outside-click/Esc + focus restore, onCleanup, w-80 grid rows) mapping to the same comma-separated labels param, with All labels/Clear + bare rows for selected-but-unknown names.
  • Deep links (?milestone=/none, ?labels=a,b, unknown ids) hydrate with raw-value fallbacks via new web/src/lib/issueFilters.js — filters shown, never silently dropped. Pending caches disable (never bare-id flashes). Panel anchors left (mid-grid cell phone safety) under the #278 bound.
  • No backend/SDK/API change; shared SWR caches, no new invalidation; no new deps. Law-12 decision appended to docs/features/02_issues.md.

Tests: 21 new in web/test/unit/issues-filter-dropdowns.test.js (lib mapping + hydration incl. none/unknown/pending + source assertions for a11y/close/phone); #415 order tests untouched and green; vite build green. Full node suite: 847/849 — the 2 fails are pre-existing smoke.test.js live-server checks (also fail on clean main: :8080 answers 401 from an unrelated instance). Live-browser proof open (shared-daemon loopback guard, same as #334).

Fixes #416 — the issues-list filter bar's Milestone and Labels free-text inputs become dropdowns fed from the repo caches, in the #415 State/Assignee/Labels/Milestone/Refresh positions. - Milestone: native single-select (State-field consistency, the implementer's call left open in the issue — decided native) from milestones:{o}/{r}, with All milestones (clear) + No milestone (→ none). - Labels: multi-select popover in the LabelPicker idiom (outside-click/Esc + focus restore, onCleanup, w-80 grid rows) mapping to the same comma-separated labels param, with All labels/Clear + bare rows for selected-but-unknown names. - Deep links (?milestone=<id>/none, ?labels=a,b, unknown ids) hydrate with raw-value fallbacks via new web/src/lib/issueFilters.js — filters shown, never silently dropped. Pending caches disable (never bare-id flashes). Panel anchors left (mid-grid cell phone safety) under the #278 bound. - No backend/SDK/API change; shared SWR caches, no new invalidation; no new deps. Law-12 decision appended to docs/features/02_issues.md. Tests: 21 new in web/test/unit/issues-filter-dropdowns.test.js (lib mapping + hydration incl. none/unknown/pending + source assertions for a11y/close/phone); #415 order tests untouched and green; vite build green. Full node suite: 847/849 — the 2 fails are pre-existing smoke.test.js live-server checks (also fail on clean main: :8080 answers 401 from an unrelated instance). Live-browser proof open (shared-daemon loopback guard, same as #334).
Milestone is a native single-select (State-field consistency) fed from
milestones:{o}/{r} with All-milestones clear + No-milestone (none);
Labels is a LabelPicker-idiom multi-select popover fed from labels:{o}/{r}
mapping to the same comma-separated param. Deep links hydrate with
raw-value fallbacks (never silently dropped); pending caches disable.
Pure param logic in web/src/lib/issueFilters.js, node --test cover.
No backend, SDK, or API change; no new deps.
Sign in to join this conversation.
No description provided.