← Admin Panel

Lists — search, filters, pagination

admin panel · workzone
The panel's table screens (users, audit, API keys, ACL) share the search box, facet filters, and pagination. The behavior is shared; each screen defines only its own (what is searched, which facets) and links here.
2 Query assembly search, filters, page → one call
Facets: OR within · AND across
Values within one facet combine with OR, different facets with AND (rows at the intersection). The number of active facets shows as a counter on the control.
Search ∩ filters — one request
q and the active facets go in one call, combined with AND, not two requests. Only the latest is in flight: new input cancels the stale one (race protection).
Page and sort — in the same request
The page number, its size, and the sort travel in the same call as q and the facets. Any change to the query — new text, facet, or sort — resets to page 1: otherwise you could be left on a page the new result set no longer has.
State — in the page URL
Search, facets, page, and sort — in the URL query parameters: refresh and a shared link preserve the selection. The URL is the single carrier of this state.
3 Result and states what the user sees in response
A single set for the whole screen
The result (search ∩ filters) is one set: the table, the counter, pagination, and export v2 all derive from it. Export downloads the same as what is shown; there is no download that bypasses the controls.
Loading — skeleton, then previous rows
A cold start of the list — skeleton rows in the table's shape; a page, facet, or sort change — previous rows stay (keep-previous), no flash to empty. The shared vocabulary of loading states and the selection rule are in Shared UI.
Empty · clear · error
No matches — “nothing found” with a prompt to reset. Clear via the cross or Esc; a reset returns the full list. A failed request — an inline error with retry in the data area; on a full failure — a system stub.