Filter modes
Filter modes let users change how a column's filter is applied — for example matching with Contains, Starts with, Equals, Between, Greater than, or Empty. With enableColumnFilterModes: true (the default) each filter field shows a mode menu offering the modes appropriate to that column's meta.variant.
ID | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|
2261 | 45000134754 | 099 | ||||||||
| Ava | Thompson | Owner | Engineering | active | 22 | $45,000 | Jan 2, 2023 | 0% | ||
| Liam | Nguyen | Admin | Marketing | inactive | 25 | $47,137 | Jan 13, 2023 | 9% | ||
| Noah | Silva | Editor | Design | pending | 28 | $49,274 | Jan 24, 2023 | 18% | ||
| Emma | Carter | Viewer | Sales | active | 31 | $51,411 | Feb 4, 2023 | 27% | ||
| Olivia | Rossi | Owner | Support | inactive | 34 | $53,548 | Feb 15, 2023 | 36% | ||
| William | Walker | Admin | Engineering | pending | 37 | $55,685 | Feb 26, 2023 | 45% | ||
| Sophia | Patel | Editor | Marketing | active | 40 | $57,822 | Mar 9, 2023 | 54% | ||
| James | Muller | Viewer | Design | inactive | 43 | $59,959 | Mar 20, 2023 | 63% | ||
| Isabella | Park | Owner | Sales | pending | 46 | $62,096 | Mar 31, 2023 | 72% | ||
| Lucas | Reyes | Admin | Support | active | 49 | $64,233 | Apr 11, 2023 | 81% | ||
| $4,120,536 |
Setting the initial mode
Set a column's starting mode with meta.filterMode.
import { DataTable, useDataTable } from "@/components/ui/data-table"
const columns = [
{
accessorKey: "title",
header: "Title",
meta: { variant: "text", filterMode: "startsWith" },
},
{
accessorKey: "score",
header: "Score",
meta: { variant: "range", filterMode: "between" },
},
]
const table = useDataTable({ data, columns, getRowId: (row) => row.id })
return <DataTable table={table} />
Toggling the mode menu
enableColumnFilterModes is true by default. Turn it off globally to hide every mode menu, or override it per column with meta.enableColumnFilterModes.
const table = useDataTable({
data,
columns,
getRowId: (row) => row.id,
enableColumnFilterModes: false,
})
const columns = [
// mode menu hidden for this column only
{ accessorKey: "id", header: "ID", meta: { enableColumnFilterModes: false } },
]
Restricting the available modes
Limit a column's mode menu to a specific subset (and order) with meta.columnFilterModeOptions. Only modes valid for the column's variant are kept; include the column's default mode.
const columns = [
{
accessorKey: "title",
header: "Title",
meta: {
variant: "text",
filterMode: "contains",
columnFilterModeOptions: ["contains", "startsWith", "equals"],
},
},
]
Custom mode menu
Replace the built-in radio items with your own using renderColumnFilterModeMenuItems. You get the allowed modes, the currentMode, and an onSelect(mode) to switch.
import { DropdownMenuItem } from "@/components/ui/dropdown-menu"
const table = useDataTable({
data,
columns,
getRowId: (row) => row.id,
renderColumnFilterModeMenuItems: ({ modes, currentMode, onSelect }) =>
modes.map((mode) => (
<DropdownMenuItem
key={mode}
disabled={mode === currentMode}
onClick={() => onSelect(mode)}
>
{mode}
</DropdownMenuItem>
)),
})
The global-search mode menu has the same hook: renderGlobalFilterModeMenuItems — see Global search.
Localizing mode labels
Mode menu labels are localizable via localization.filterModes.