LearnNewsExamplesServices
Frontmatter
id19791
titleGrid record search: an optional toolbar with visible filter state
stateClosed
labels
epicaigrid
assignees[]
createdAtOct 16, 2026, 11:47 AM
updatedAtOct 16, 2026, 6:15 PM
githubUrlhttps://github.com/neomjs/neo/issues/19791
authorneo-opus-grace
commentsCount2
parentIssuenull
subIssues
19792 Grid record search: the Store-wide search contribution and its counting
19793 Grid headers show when their column is filtered
19794 Grid record search: the optional search toolbar and its summary
subIssuesCompleted3
subIssuesTotal3
contentTrust
projected
quarantined0
signals[]
blockedBy[]
blocking[]
closedAtOct 16, 2026, 6:15 PM
milestonev13.3

Grid record search: an optional toolbar with visible filter state

Closed Backlog/active-chunk-9 epicaigrid
neo-opus-grace
neo-opus-grace commented on Oct 16, 2026, 11:47 AM

Terminal predicate: a grid can opt into a search toolbar whose scoped term search, visible filter state and single reset work on fully loaded local data, and the issues showcase searches its Title and Summary through it.

Problem scope

The per-column value picker shipped in #19643, but a grid still has no record search.

  • No text path. The issues showcase's main content, Title and Summary, carries columnMenu: false. Its text has no filter path, and resetting means clearing each menu in turn.
  • Invisible filter state. On examples/grid/bigData, a picker selection stays active after the header field is cleared, while the header looks unfiltered. The cause is the menu's closed-surface early return.

The operator moved the optional toolbar into v13.3 on 2026-10-16. This needs an epic, not a single ticket, because three surfaces must compose, and each lands as its own PR: the data contract the search writes, the header's active state, and the toolbar with its summary.

Intended solution shape

The converged contract is the body of #19786 (SHA-256 72b90388…). In short:

  • One Store-owned search contribution {ownerRole: 'grid-search', property: null, filterBy} carrying declared fields. An explicit null marks the columnless slot. The owned-key validator resolves the property the Filter actually exposes, so absence keeps the id default.
  • Matching splits the query into whitespace terms, and every term must match at least one searched field. The match is case-insensitive unless toggled. Raw items are read directly, without hydration or renderers. An empty query disables the contribution and keeps its scope.
  • Counting: getFilterValues honours declared fields, so picker counts follow the search.
  • Visible state: a generic Filter.effective read lets headers mark filtered columns, and the toolbar's summary lists what has no header. Clear removes only the grid's own roles.
  • The toolbar is a searchToolbar_ descriptor config on grid.Container, mirroring footerToolbar_, and is null by default.

Signal Ledger

  • Claude: [AUTHOR_SIGNAL by @neo-opus-grace @ DC_kwDODSospM4BIXC3 + body 2026-10-16T09:39Z]
  • GPT: [GRADUATION_APPROVED by @neo-gpt-emmy @ 72b90388e55ebad77ab5819c9ad5036b984551ff7d6e06bdfaa6b0675d8115b9] (DC_kwDODSospM4BIXEa)
  • Quorum per §6.2: two active families signing, and one non-author family approving. Emmy's §5.2 STEP_BACK (DC_kwDODSospM4BIXC3) raised two blockers, both resolved before her signal.

Unresolved Dissent

None.

Unresolved Liveness

None. The Gemini family was active but not polled; the §6.2 floor does not need a third family for this feature class.

Discussion Criteria Mapping

D#19786 item Owner in this epic
Contract 1 (owner key, settings, empty-query disable), 2 (matching, write-time validation), 3 (counting), A2 field list the data-contract leaf
Contract 5, header part (option H) the header active-state leaf
Contract 4 (scope selector), 5 summary part (option I), 6 (toolbar), J (clear by enumeration), showcase witness the toolbar leaf
OQ4 regex, OQ6 tree grids, OQ8 header-filter layout, option D (remote) deferred: no leaf here

Decision Record: NOT_NEEDED. The only seam change is the owner-key validator normalization, which the seam's owner endorsed and the data-contract leaf pins.

Out of scope

Regular expressions (#19786 OQ4: a sampled pre-check cannot bound RegExp.test in the App Worker). Also: remote Stores and TreeStores, which are refused visibly; the header-filter layout (OQ8); the display-policy menu (#19645); and the Table header's click-sort bug (#19790).

Avoided traps

Rejected in #19786:

  • per-view search, which needs a projection layer nothing else pays for;
  • header text filters as the only path;
  • matching rendered cell text, which would mean stateful renderers;
  • a clear-all that also drops application predicates;
  • the id slot, a filter named id that never filters by id;
  • sampled regex admission.

Related: #19786 · #19643 · #19646 · #19788

Origin Session ID: bb2e8968-a6d6-4ef7-a4ed-5ab3157b1ac8 Retrieval Hint: "grid record search toolbar effective filter state grid-search contribution"