Filters and Sort
Imports
import {
FiltersAndSortService,
createFiltersAndSortService,
SORT_DIRECTIONS,
} from '@codella-software/utils'
import { useFiltersAndSort, useFilters } from '@codella-software/react'
Core service
type UserFilters = {
role: string
search: string
}
const service = new FiltersAndSortService<UserFilters>({
storageKey: 'users',
defaultFilters: { role: '', search: '' },
})
service.setFilters({ role: 'admin' })
service.setSort('name')
service.setPagination(0, 25)
service.setQuery('anna')
Public methods:
getStorageKey()getFullStorageKey()getState()getStateSubject()getDebouncedState(ms?)getCurrentState()getDefaultState()setFilters(filters)removeFilter(filterName)clearFilters()clearStorage()setSort(fieldName)setPagination(page, limit?)setQuery(query)reset()getActions()destroy()
setSort(fieldName) toggles the same field through asc -> desc -> undefined.
State shape
type FilterAndSortState<T> = {
filters: T
sort?: {
fieldName: string
direction: 'asc' | 'desc'
}
pagination: {
page: number
limit: number
}
query: string
}
page is zero-based in the current implementation.
React hook
const filters = useFiltersAndSort<UserFilters>({
config: {
storageKey: 'users',
defaultFilters: { role: '', search: '' },
},
})
filters.setFilter('role', 'admin')
filters.setSort('name')
filters.setPageSize(50)
useFiltersAndSort() returns:
filterssortBysortDirectionpagepageSizequerystatesetFiltersetFiltersclearFilterclearAllFiltershasFilterhasAnyFiltersactiveFilterCountsetSorttoggleSortclearSortisSortedBysetPagesetPageSizesetPaginationnextPageprevPagefirstPageisFirstPageoffsetsetQueryclearQueryresetclearStorageAndResetstorageKeygetService
Shortcut:
const filters = useFilters<UserFilters>('users', {
defaultFilters: { role: '', search: '' },
})