6.2.3 Save + apply UI on /issues — Save/Save-as with dirty state, the filter dropdown (starred/mine/project/defaults), name chip, star toggle
Estimate: 35m · Depends on: 6.2.1, 6.2.2, 6.1.4
The /issues-side surfaces, per the 6.2.2 design, on the 6.2.1 API.
Build (extending the 6.1.4 builder area): the save dialog (name / description / visibility, duplicate-name + viewer-private-only states) wired to the current builder AST; the applied-filter name chip + dirty indicator — the chip tracks whether the URL AST still equals the saved envelope; Save (owner: overwrite) vs Save as (everyone) per the mirror rule; the filter dropdown — starred → My filters → Project filters → Defaults, server-backed search (debounced, bounded), per-row star toggle, "View all filters" footer; applying an entry loads the resolved AST into the builder + the ?filter=v1: URL (the saved filter IS the URL once applied — reload/share keeps working with no new state channel); rename/edit-details from the chip menu for those permitted. Strings via next-intl.
A11y: dialog focus-trapped; the dropdown groups labelled; star toggles announce state; the dirty indicator is not colour-only; extends the /issues strict sweep.
Acceptance criteria
- Save / dirty / Save-as match the design and the ownership split (non-owner never sees overwrite-Save); duplicate names surface the designed error; a viewer gets no Project visibility option.
- The dropdown renders the four groups in order, searches server-side, stars in-place, and applies entries into builder + URL (round-trip: applying then reloading restores identical state); defaults apply but expose no edit/delete.
- The chip + dirty state track URL↔saved-envelope equality through builder edits, URL navigation, and apply actions.
- Axe-clean; token tiers only; next-intl; integration tests over save / dirty / apply / star wiring; coverage ≥90%.
Context refs
design/work-items/saved-filters.mock.html+ notes (6.2.2) — THE authority- 6.2.1 (API + permission matrix + defaults); 6.1.4 (the builder surface + URL state this extends); 6.1.1 (envelope equality for the dirty check)
- The i18n threading pattern; the 2.5.x URL-param conventions