2.5.4 Filter bar — kind · status · assignee · text (URL-driven)
Estimate: 14m · Depends on: 2.5.3, 2.5.9
Wire the [Filter] affordance into a working filter bar over the tree: a Popover (or inline bar) exposing kind (issue-type multi-select), status (the project's workflow statuses), assignee (workspace members + "Unassigned"), and a text quick-filter (identifier + title). Each filter feeds getProjectTree's context-preserving filter (2.5.1) so matches keep their ancestor chain.
Durable shape: state lives in the URL. Filters serialize to query params (e.g. ?kind=bug&status=in_progress&assignee=…&q=…) so a filtered view is shareable / bookmarkable / reload-safe, and the Server Component reads them directly — this is the exact serialization Epic 6's saved filters will persist, so v1's filter URL is the forward-compatible substrate, not a throwaway. A "clear filters" affordance resets to the full tree; an active-filter count shows on the Filter button. Reuse the shared pickers (Combobox / StatusPicker options source / member combobox) — no new picker components.
Acceptance criteria
- Filter by kind / status / assignee / text narrows the tree; a matching descendant keeps its ancestors visible; "Unassigned" is selectable; clear resets.
- Filter state is reflected in the URL query and is reload-/share-safe; the Server Component reads it and re-queries; the Filter button shows an active count.
- Pickers are the shared primitives (no parallel components); options come from the project workflow + workspace members already in context.
- Component test (happy-dom): toggling a filter updates the query + calls back; clear resets. (Tree re-query proven in 2.5.1; end-to-end in 2.5.6.)
Context refs
- Design reference (REQUIRED):
design/work-items/filter.mock.html+design-notes.md— produced by thetype: designsubtask2.5.9(independs_on); match its popover layout, the four filter groups, the active-count badge, and the clear affordance. - 2.5.1
getProjectTreefilter contract; 2.5.3 route (where the bar mounts) components/ui/Combobox/Popover;StatusPickeroption source; the workspace-member combobox used byAssigneePicker;ISSUE_TYPE_METAnext/navigationuseSearchParams/useRouterURL-state pattern; the workflow-settings filter UI for prior art