MotirBuilding in public
MOTIR · moooon
onMotir
You’re viewing a public project. Anyone can view it — no account needed. Sign in to submit, upvote, or comment on requests.View-only — you can’t edit work items
MOTIR-331

6.1.4 Filter-builder UI on /issues — built-in fields (rows, combinator, live-apply URL state, facet upgrade, applied summary)

Done
Description

Estimate: 35m · Depends on: 6.1.1, 6.1.3

The builder surface for the built-in fields, per the 6.1.3 design, on the 6.1.1 AST/codec/registry.

Build (extending the 2.5.3 IssueListToolbar + 2.5.4 IssueFilterBar area): the Advanced entry + panel; condition rows driven BY THE REGISTRY (field picker lists the registry's built-in entries; choosing a field populates its operator set; the operator selects the value-editor kind — the UI renders the registry, it never hard-codes field lists); the combinator control; add/remove/clear + the row cap; live-apply with pending-row exclusion (the designed rule) writing the ?filter=v1: param (composing with ?view/?sort/?page, Suspense-keyed like the shipped params); the facet upgrade ("Edit in Advanced" → lossless rows) + the superseded-facet state; the applied toolbar summary + count; zero-results; the invalid-param recovery state. Both views consume the compiled filter through their existing reads (no view-specific query code here). Strings via next-intl.

A11y: rows are labelled groups; every picker keyboard-complete (the Combobox bar); the combinator reads as a sentence for SR users; the applied count announced; extends the /issues strict sweep.

Acceptance criteria

  • The builder matches the design panel-for-panel for every built-in editor kind; rows render from the registry (a registry addition appears with zero UI changes — asserted with a test-only registry entry).
  • Live-apply + pending exclusion + URL round-trip (reload/share restores state; composes with view/sort/page); the facet upgrade is lossless; the superseded state appears exactly when the AST exceeds facet expressiveness.
  • Both views show identical match sets (spot E2E); count + zero-results + invalid-param states work.
  • Axe-clean; token tiers only; next-intl; integration tests over the row/registry wiring + URL codec round-trip in the browser; coverage ≥90%.

Context refs

  • design/work-items/filter-builder.mock.html + notes (6.1.3) — THE authority
  • 6.1.1 (AST/codec/registry — the UI contract); IssueListToolbar/IssueFilterBar (2.5.3/2.5.4 — the surface this extends)
  • The URL-driven param conventions (2.5.8 ?view, 2.5.12 ?page)
  • The i18n threading pattern