Problem
The current filter system (Filter Panel) generates SQL WHERE clauses and re-queries the server. There is no way to quickly filter the already-loaded result set by selecting specific values in a column.
When browsing a table with hundreds of rows, I often want to narrow down to rows where a column matches one of a few values I can see. Today this requires: open Filter Panel, pick the column, type the value, apply, wait for re-query. For exploring loaded data, this is too many steps.
Proposed behavior
Each column header shows a small filter/funnel icon (similar to Excel, Google Sheets, or DataGrip). Clicking it opens a popover:
- Search box at the top for filtering the value list
- A list of all distinct values in that column (from the currently loaded rows), with a count of occurrences
- Checkboxes to select/deselect values
- "Select All" / "Deselect All" toggle
- Apply button
When applied, the data grid hides rows that don't match the checked values. This is a client-side filter on loaded data, not a new SQL query. Multiple columns can have active filters simultaneously (intersected).
The column header should visually indicate when a filter is active (e.g., highlight the funnel icon, show a badge).
Use cases
- Browsing a users table, quickly show only rows where
status = 'active'
- Exploring query results, isolate rows matching specific enum values without modifying the query
- Data exploration: see distinct value distribution per column at a glance (the count column in the popover)
Scope
- Client-side only: operates on already-loaded rows, no additional queries
- Non-destructive: original data stays intact, filtering only hides rows from view
- Clear filter: either uncheck values or click a "clear" button to restore all rows
Existing architecture notes
The data grid currently flows through displayRow(at:) which resolves via sortedIDs. A client-side filter could insert between the sort step and the display step, maintaining a filteredIDs index that displayRow consults. The existing FilterCoordinator handles the SQL-based filter panel and is separate from this feature.
Problem
The current filter system (Filter Panel) generates SQL WHERE clauses and re-queries the server. There is no way to quickly filter the already-loaded result set by selecting specific values in a column.
When browsing a table with hundreds of rows, I often want to narrow down to rows where a column matches one of a few values I can see. Today this requires: open Filter Panel, pick the column, type the value, apply, wait for re-query. For exploring loaded data, this is too many steps.
Proposed behavior
Each column header shows a small filter/funnel icon (similar to Excel, Google Sheets, or DataGrip). Clicking it opens a popover:
When applied, the data grid hides rows that don't match the checked values. This is a client-side filter on loaded data, not a new SQL query. Multiple columns can have active filters simultaneously (intersected).
The column header should visually indicate when a filter is active (e.g., highlight the funnel icon, show a badge).
Use cases
status = 'active'Scope
Existing architecture notes
The data grid currently flows through
displayRow(at:)which resolves viasortedIDs. A client-side filter could insert between the sort step and the display step, maintaining afilteredIDsindex thatdisplayRowconsults. The existingFilterCoordinatorhandles the SQL-based filter panel and is separate from this feature.