mirror of
https://github.com/supabase/supabase.git
synced 2026-10-16 22:59:11 +03:00
## I have read the [CONTRIBUTING.md](https://github.com/supabase/supabase/blob/master/CONTRIBUTING.md) file. YES ## What kind of change does this PR introduce? For the new AI filters we should take a totally different approach. Rather than using the URL as the source of truth, it should rather act as a secondary state store. The first being local state in Snap that gets loaded from the URL. By forcing this clear line we can always make sure the URL is backed up with the right values and ensure state is updated quickly. <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * Toggleable next‑gen filter bar with lifecycle that initializes and syncs filters to the URL. * Centralized filter API in table state for setting, clearing, and sharing filters across components. * **Improvements** * Grid queries are project‑scoped, use placeholder previous data, and reapply optimistic updates on refresh. * Added MS SQL sorting warning and feature‑flag controls for queue/operation behavior. <!-- end of auto-generated comment: release notes by coderabbit.ai --> ## Testing - Make sure the old filters still work as expected - Enable the new Headers, test out new filters approach (count is still broken FYI, will fix that later)
Table Filtering and Sorting Developer notes
Overview
The table filtering and sorting system uses a URL-based state persistence pattern combined with custom hooks that abstract the implementation details from consuming components. This architecture provides several benefits:
- Persistent state: Filters and sorts are stored in URL parameters, enabling bookmarking and sharing
- Separation of concerns: Logic is separated from UI components
- Draft-then-apply pattern: UI components maintain draft state until explicitly applied
Core Hooks
useTableFilter
// Returns: { filters, urlFilters, onApplyFilters }
The useTableFilter hook manages filter state with these responsibilities:
- Retrieves raw filter parameters from URL
- Formats filter parameters into usable Filter[] objects
- Provides a callback to apply new filters
- Persists changes to URL parameters
- Triggers side effects through
saveFiltersAndTriggerSideEffects
Key design aspects:
- No direct snapshot interaction, keeping it focused solely on filter management
- Uses URL parameters as the source of truth
- Forwards filter changes to URL and triggers application-specific side effects
useTableSort
// Returns: { sorts, urlSorts, onApplySorts }
The useTableSort hook manages sort state with these responsibilities:
- Retrieves raw filter parameters from URL
- Formats sort parameters into usable Sort[] objects (needs table name)
- Provides a callback to apply new sorts
- Persists changes to URL parameters
- Triggers side effects through
saveSortsAndTriggerSideEffects
Key design aspects:
- Handles applying table name to sort objects
- Maintains URL parameters as source of truth
- Forwards sort changes to URL and triggers application-specific side effects
Component Implementation
FilterPopoverPrimitive and SortPopoverPrimitive
These components follow a "draft and apply" pattern:
- Local state management: Both components maintain a local state copy of filters/sorts
- Edit operations: Changes like adding, modifying, or deleting are made to the local state
- Apply operations: Only when the user clicks "Apply" are the changes committed via the callback
- Synchronization: Local state is synchronized with props when external changes occur
Data Flow
- URL parameters store the raw filter/sort state
- Hooks read and format these parameters into usable objects
- UI components receive formatted objects and callbacks
- Components maintain draft state for editing
- When "Apply" is clicked, callbacks update URL parameters
- Side effects are triggered via dedicated save hooks
Component Usage
Components using these hooks should follow this pattern:
function TableComponent() {
// Get filter data and callbacks
const { filters, onApplyFilters } = useTableFilter()
// Get sort data and callbacks
const { sorts, onApplySorts } = useTableSort()
return (
<>
<FilterPopoverPrimitive filters={filters} onApplyFilters={onApplyFilters} />
<SortPopoverPrimitive sorts={sorts} onApplySorts={onApplySorts} />
{/* Table rendering with filters and sorts applied */}
</>
)
}
Implementation Notes
- Filter and sort parameters are stored in URL using specific formats
- Conversion utilities (
formatFilterURLParams,formatSortURLParams, etc.) handle translation between URL strings and typed objects - Side effect hooks manage database persistence and related operations