@tanstack/table-core
Version:
Headless UI for building powerful tables & datagrids for TS/JS.
85 lines (77 loc) • 3.64 kB
text/typescript
import { RowModel } from '..'
import { Column, RowData, Table, TableFeature } from '../types'
export interface FacetedColumn<TData extends RowData> {
_getFacetedMinMaxValues?: () => undefined | [number, number]
_getFacetedRowModel?: () => RowModel<TData>
_getFacetedUniqueValues?: () => Map<any, number>
/**
* A function that **computes and returns** a min/max tuple derived from `column.getFacetedRowModel`. Useful for displaying faceted result values.
* > ⚠️ Requires that you pass a valid `getFacetedMinMaxValues` function to `options.getFacetedMinMaxValues`. A default implementation is provided via the exported `getFacetedMinMaxValues` function.
* @link [API Docs](https://tanstack.com/table/v8/docs/api/features/column-faceting#getfacetedminmaxvalues)
* @link [Guide](https://tanstack.com/table/v8/docs/guide/column-faceting)
*/
getFacetedMinMaxValues: () => undefined | [number, number]
/**
* Returns the row model with all other column filters applied, excluding its own filter. Useful for displaying faceted result counts.
* > ⚠️ Requires that you pass a valid `getFacetedRowModel` function to `options.facetedRowModel`. A default implementation is provided via the exported `getFacetedRowModel` function.
* @link [API Docs](https://tanstack.com/table/v8/docs/api/features/column-faceting#getfacetedrowmodel)
* @link [Guide](https://tanstack.com/table/v8/docs/guide/column-faceting)
*/
getFacetedRowModel: () => RowModel<TData>
/**
* A function that **computes and returns** a `Map` of unique values and their occurrences derived from `column.getFacetedRowModel`. Useful for displaying faceted result values.
* > ⚠️ Requires that you pass a valid `getFacetedUniqueValues` function to `options.getFacetedUniqueValues`. A default implementation is provided via the exported `getFacetedUniqueValues` function.
* @link [API Docs](https://tanstack.com/table/v8/docs/api/features/column-faceting#getfaceteduniquevalues)
* @link [Guide](https://tanstack.com/table/v8/docs/guide/column-faceting)
*/
getFacetedUniqueValues: () => Map<any, number>
}
export interface FacetedOptions<TData extends RowData> {
getFacetedMinMaxValues?: (
table: Table<TData>,
columnId: string
) => () => undefined | [number, number]
getFacetedRowModel?: (
table: Table<TData>,
columnId: string
) => () => RowModel<TData>
getFacetedUniqueValues?: (
table: Table<TData>,
columnId: string
) => () => Map<any, number>
}
//
export const ColumnFaceting: TableFeature = {
createColumn: <TData extends RowData>(
column: Column<TData, unknown>,
table: Table<TData>
): void => {
column._getFacetedRowModel =
table.options.getFacetedRowModel &&
table.options.getFacetedRowModel(table, column.id)
column.getFacetedRowModel = () => {
if (!column._getFacetedRowModel) {
return table.getPreFilteredRowModel()
}
return column._getFacetedRowModel()
}
column._getFacetedUniqueValues =
table.options.getFacetedUniqueValues &&
table.options.getFacetedUniqueValues(table, column.id)
column.getFacetedUniqueValues = () => {
if (!column._getFacetedUniqueValues) {
return new Map()
}
return column._getFacetedUniqueValues()
}
column._getFacetedMinMaxValues =
table.options.getFacetedMinMaxValues &&
table.options.getFacetedMinMaxValues(table, column.id)
column.getFacetedMinMaxValues = () => {
if (!column._getFacetedMinMaxValues) {
return undefined
}
return column._getFacetedMinMaxValues()
}
},
}