Skip to content

Filter Components

Core filter implementation components that accept a table prop directly.

Filter components are the core implementation that accept a table prop directly. They are used internally by the context-aware components in components/ but can also be used standalone when building custom components.

Core search filter implementation.

import { TableSearchFilter } from "@/components/niko-table/filters/table-search-filter"
<TableSearchFilter table={table} placeholder="Search..." />
NameTypeDefaultDescription
tableTable<TData>-TanStack Table instance (required).
placeholderstring"Search..."Input placeholder text.
valuestring-Controlled value.
onChange(value: string) => void-Change handler for controlled mode.
showClearButtonbooleantrueShow clear button when input has value.
classNamestring-Additional CSS classes.

Core pagination implementation.

import { TablePagination } from "@/components/niko-table/filters/table-pagination"
// Basic usage
<TablePagination table={table} />
// With custom page size options
<TablePagination
table={table}
pageSizeOptions={[10, 25, 50, 100]}
/>
// With total count for server-side pagination
<TablePagination
table={table}
totalCount={500}
onPageChange={(pageIndex) => console.log("Page:", pageIndex)}
/>

Same as DataTablePagination but requires table prop. See DataTablePagination section above.

Core filter menu implementation with command palette interface.

import { TableFilterMenu } from "@/components/niko-table/filters/table-filter-menu"
import { useState } from "react"
import type { ExtendedColumnFilter } from "@/components/niko-table/types"
// Controlled mode
const [filters, setFilters] = useState<ExtendedColumnFilter<Product>[]>([])
<TableFilterMenu
table={table}
filters={filters}
onFiltersChange={setFilters}
/>
NameTypeDescription
tableTable<TData>TanStack Table instance (required).
filtersExtendedColumnFilter<TData>[]Controlled filters array.
onFiltersChange(filters: ExtendedColumnFilter<TData>[] | null) => voidCallback when filters change.
classNamestringAdditional CSS classes.

Core faceted filter implementation.

import { TableFacetedFilter } from "@/components/niko-table/filters/table-faceted-filter"
// Basic usage with static options
<TableFacetedFilter
column={table.getColumn("category")}
title="Category"
options={[
{ label: "Electronics", value: "electronics" },
{ label: "Clothing", value: "clothing" },
]}
/>
// With multiple selection
<TableFacetedFilter
column={table.getColumn("brand")}
title="Brand"
options={brandOptions}
multiple
onValueChange={(value) => console.log("Selected:", value)}
/>
NameTypeDescription
columnColumn<TData, TValue>Table column instance (required).
titlestringFilter title.
optionsOption[]Static options array.
multiplebooleanAllow multiple selection.
onValueChange(value: string[] | undefined) => voidCallback when value changes.

Core slider filter implementation for numeric ranges.

import { TableSliderFilter } from "@/components/niko-table/filters/table-slider-filter"
// Basic usage (auto-detects range from data)
<TableSliderFilter
column={table.getColumn("price")}
title="Price"
/>
// With custom range
<TableSliderFilter
column={table.getColumn("rating")}
title="Rating"
min={1}
max={5}
step={0.5}
/>
// With unit and range array
<TableSliderFilter
column={table.getColumn("price")}
title="Price Range"
range={[0, 1000]}
unit="$"
onValueChange={(value) => console.log("Range:", value)}
/>
NameTypeDescription
columnColumn<TData>Table column instance (required).
titlestringFilter title.
range[number, number]Manual range [min, max].
minnumberManual minimum value.
maxnumberManual maximum value.
stepnumberStep increment.
unitstringUnit label (e.g., ”$”, “kg”).
onValueChange(value: [number, number] | undefined) => voidCallback when value changes.

Core date filter implementation.

import { TableDateFilter } from "@/components/niko-table/filters/table-date-filter"
// Single date selection
<TableDateFilter
column={table.getColumn("releaseDate")}
title="Release Date"
/>
// Date range selection
<TableDateFilter
column={table.getColumn("createdAt")}
title="Created Date"
multiple
/>
NameTypeDescription
columnColumn<TData>Table column instance (required).
titlestringFilter title.
multiplebooleanEnable date range selection.

Core sort menu implementation.

import { TableSortMenu } from "@/components/niko-table/filters/table-sort-menu"
// Basic usage
<TableSortMenu table={table} />
// With debounce for performance
<TableSortMenu
table={table}
debounceMs={300}
onSortingChange={(sorting) => console.log("Sorting:", sorting)}
/>
// With throttle instead of debounce
<TableSortMenu
table={table}
throttleMs={200}
shallow
/>
NameTypeDescription
tableTable<TData>TanStack Table instance (required).
debounceMsnumberDebounce delay for sort updates.
throttleMsnumberThrottle delay for sort updates.
shallowbooleanUse shallow comparison for sort state.
classNamestringAdditional CSS classes.
onSortingChange(sorting: ColumnSort[]) => voidCallback when sorting changes.

Core view menu implementation for column visibility.

import { TableViewMenu } from "@/components/niko-table/filters/table-view-menu"
// Basic usage
<TableViewMenu table={table} />
// With visibility change callback
<TableViewMenu
table={table}
onColumnVisibilityChange={(columnId, isVisible) => {
console.log(`Column ${columnId} is now ${isVisible ? "visible" : "hidden"}`)
}}
/>
NameTypeDescription
tableTable<TData>TanStack Table instance (required).
classNamestringAdditional CSS classes.
onColumnVisibilityChange(columnId: string, isVisible: boolean) => voidCallback when visibility changes.

Core inline filter implementation with advanced operators.

import { TableInlineFilter } from "@/components/niko-table/filters/table-inline-filter"
import { useState } from "react"
import type { ExtendedColumnFilter } from "@/components/niko-table/types"
// Controlled mode with filters
const [filters, setFilters] = useState<ExtendedColumnFilter<Product>[]>([])
<TableInlineFilter
table={table}
filters={filters}
onFiltersChange={setFilters}
/>
NameTypeDescription
tableTable<TData>TanStack Table instance (required).
filtersExtendedColumnFilter<TData>[]Controlled filters array.
onFiltersChange(filters: ExtendedColumnFilter<TData>[]) => voidCallback when filters change.
classNamestringAdditional CSS classes.

Core clear filter button implementation.

import { TableClearFilter } from "@/components/niko-table/filters/table-clear-filter"
// Basic usage
<TableClearFilter table={table} />
// With custom styling
<TableClearFilter
table={table}
variant="ghost"
size="sm"
/>
// Custom content
<TableClearFilter table={table}>
Reset All
</TableClearFilter>
// Selective reset (only filters, not sorting)
<TableClearFilter
table={table}
enableResetSorting={false}
/>
NameTypeDefaultDescription
tableTable<TData>-TanStack Table instance (required).
variant"default" | "outline" | "ghost""outline"Button variant.
size"default" | "sm" | "lg""sm"Button size.
showIconbooleantrueShow clear icon.
childrenReact.ReactNode-Button content.
enableResetColumnFiltersbooleantrueEnable resetting column filters.
enableResetGlobalFilterbooleantrueEnable resetting global filter (search).
enableResetSortingbooleantrueEnable resetting sorting.
classNamestring-Additional CSS classes.

Core export button implementation.

import { TableExportButton, exportTableToCSV } from "@/components/niko-table/filters/table-export-button"
// Basic usage
<TableExportButton table={table} />
// With custom filename
<TableExportButton
table={table}
filename="products-export"
/>
// Exclude specific columns
<TableExportButton
table={table}
filename="products"
excludeColumns={["id", "internalNotes"]}
/>
// Export only selected rows
<TableExportButton
table={table}
onlySelected
label="Export Selected"
/>
// With human-readable headers from column.meta.label
<TableExportButton
table={table}
filename="products"
useHeaderLabels
/>
NameTypeDefaultDescription
tableTable<TData>-TanStack Table instance (required).
filenamestring"table"Filename for exported CSV (without extension).
excludeColumns(keyof TData)[]-Columns to exclude from export.
onlySelectedbooleanfalseExport only selected rows.
useHeaderLabelsbooleanfalseUse column.columnDef.meta.label as CSV headers instead of column IDs.
variantButtonVariant"outline"Button variant.
sizeButtonSize"sm"Button size.
labelstring"Export CSV"Button label.
showIconbooleantrueShow download icon.
classNamestring-Additional CSS classes.

Standalone utility function to export a TanStack Table to CSV. Use this when you want full control over when and how the export happens.

import { exportTableToCSV } from "@/components/niko-table/filters/table-export-button"
// Basic export
exportTableToCSV(table, { filename: "users" })
// Export with human-readable headers from column.meta.label
exportTableToCSV(table, { filename: "users", useHeaderLabels: true })
// Export only selected rows, excluding certain columns
exportTableToCSV(table, {
filename: "selected-users",
onlySelected: true,
excludeColumns: ["id", "internalNotes"],
})
NameTypeDefaultDescription
filenamestring"table"Filename for exported CSV (without extension).
excludeColumns(keyof TData)[][]Columns to exclude from export.
onlySelectedbooleanfalseExport only selected rows.
useHeaderLabelsbooleanfalseUse column.columnDef.meta.label as CSV headers instead of column IDs.

Core range filter implementation for numeric inputs.

import { TableRangeFilter } from "@/components/niko-table/filters/table-range-filter"
import type { ExtendedColumnFilter } from "@/components/niko-table/types"
// Basic usage with filter configuration
const filter: ExtendedColumnFilter<Product> = {
filterId: "price-range",
columnId: "price",
operator: "between",
value: [0, 100],
}
<TableRangeFilter
filter={filter}
column={table.getColumn("price")}
inputId="price-min"
onFilterUpdate={(filterId, updates) => {
console.log("Filter updated:", filterId, updates)
}}
/>
NameTypeDescription
filterExtendedColumnFilter<TData>Filter configuration (required).
columnColumn<TData>Table column instance (required).
inputIdstringUnique input ID (required).
onFilterUpdate(filterId: string, updates: Partial<Omit<ExtendedColumnFilter<TData>, "filterId">>) => voidCallback when filter updates.
classNamestringAdditional CSS classes.

These components are the core implementations used by the composable DataTableColumnHeader sub-components. They accept column and/or table props directly and can be used standalone when building custom column headers.

Core column title implementation. Renders a clickable title that toggles sorting.

import { TableColumnTitle } from "@/components/niko-table/filters/table-column-title"
<TableColumnTitle column={column} title="Custom Title" />
NameTypeDescription
columnColumn<TData, TValue>Table column instance (required).
titlestringCustom title (uses column.meta.label if not provided).
classNamestringAdditional CSS classes.

Core column actions container. Renders a dropdown menu trigger with active state indicator.

import { TableColumnActions } from "@/components/niko-table/filters/table-column-actions"
<TableColumnActions isActive={column.getIsSorted() !== false}>
{/* Sort, pin, hide options */}
</TableColumnActions>
NameTypeDefaultDescription
childrenReact.ReactNode-Action option components.
isActivebooleanfalseWhether to show active indicator (dot on trigger).
classNamestring-Additional CSS classes.

TableColumnSortOptions / TableColumnSortMenu

Section titled “TableColumnSortOptions / TableColumnSortMenu”

Core sorting implementations. TableColumnSortOptions renders sort items inside a dropdown menu. TableColumnSortMenu renders a standalone sort button.

import {
TableColumnSortOptions,
TableColumnSortMenu,
} from "@/components/niko-table/filters/table-column-sort"
// Inside a dropdown menu
<TableColumnSortOptions column={column} table={table} />
// Standalone button
<TableColumnSortMenu column={column} table={table} />
NameTypeDescription
columnColumn<TData>Table column instance (required).
tableTable<TData>TanStack Table instance (required).
classNamestringAdditional CSS classes.

TableColumnHideOptions / TableColumnHideMenu

Section titled “TableColumnHideOptions / TableColumnHideMenu”

Core hide column implementations. TableColumnHideOptions renders a hide item inside a dropdown menu. TableColumnHideMenu renders a standalone button.

import {
TableColumnHideOptions,
TableColumnHideMenu,
} from "@/components/niko-table/filters/table-column-hide"
// Inside a dropdown menu
<TableColumnHideOptions column={column} />
// Standalone button
<TableColumnHideMenu column={column} />
NameTypeDescription
columnColumn<TData, TValue>Table column instance (required).
classNamestringAdditional CSS classes.

TableColumnPinOptions / TableColumnPinMenu

Section titled “TableColumnPinOptions / TableColumnPinMenu”

Core column pinning implementations. TableColumnPinOptions renders pin left/right/unpin items inside a dropdown menu. TableColumnPinMenu renders a standalone button.

import {
TableColumnPinOptions,
TableColumnPinMenu,
} from "@/components/niko-table/filters/table-column-pin"
// Inside a dropdown menu
<TableColumnPinOptions column={column} />
// Standalone button
<TableColumnPinMenu column={column} />
NameTypeDescription
columnColumn<TData, TValue>Table column instance (required).
classNamestringAdditional CSS classes.

TableColumnFacetedFilterOptions / TableColumnFacetedFilterMenu

Section titled “TableColumnFacetedFilterOptions / TableColumnFacetedFilterMenu”

Core faceted filter implementations for column headers. TableColumnFacetedFilterOptions renders inside a dropdown. TableColumnFacetedFilterMenu renders a standalone popover.

import {
TableColumnFacetedFilterOptions,
TableColumnFacetedFilterMenu,
} from "@/components/niko-table/filters/table-column-faceted-filter"
// Inside a dropdown menu
<TableColumnFacetedFilterOptions column={column} options={options} />
// Standalone popover
<TableColumnFacetedFilterMenu column={column} table={table} options={options} />
NameTypeDescription
columnColumn<TData>Table column instance (required).
tableTable<TData>TanStack Table instance (Menu only).
optionsOption[]Static options array.
multiplebooleanAllow multiple selection.
classNamestringAdditional CSS classes.

Core trigger button for opening the column filter popover. Renders a filter icon (or filter-clear icon when the column is filtered). Often used with TableColumnFacetedFilterOptions or TableColumnFacetedFilterMenu; accepts standard Button props in addition to column.

import { TableColumnFilterTrigger } from "@/components/niko-table/filters/table-column-faceted-filter"
<TableColumnFilterTrigger column={column} />
NameTypeDefaultDescription
columnColumn<TData, TValue>-TanStack Table column instance (required).
classNamestring-Additional CSS classes.

All other props are passed through to the underlying Button component.

Core slider filter implementation for column headers. Renders a range slider inside a dropdown menu.

import { TableColumnSliderFilterOptions } from "@/components/niko-table/filters/table-column-slider-filter"
<TableColumnSliderFilterOptions column={column} min={0} max={1000} step={10} />
NameTypeDescription
columnColumn<TData>Table column instance (required).
minnumberMinimum value.
maxnumberMaximum value.
stepnumberStep increment.
classNamestringAdditional CSS classes.

Core date filter implementation for column headers. Renders a date picker inside a dropdown menu.

import { TableColumnDateFilterOptions } from "@/components/niko-table/filters/table-column-date-filter"
<TableColumnDateFilterOptions column={column} multiple />
NameTypeDescription
columnColumn<TData>Table column instance (required).
multiplebooleanEnable date range selection.
classNamestringAdditional CSS classes.

Core row DnD provider that wraps the table with DnD context and sensors. Handles arrayMove internally and calls onReorder with the new data array.

import { TableRowDndProvider, TableDraggableRow, TableRowDragHandle } from "@/components/niko-table/filters/table-row-dnd"
<TableRowDndProvider data={data} onReorder={setData}>
{/* table content */}
</TableRowDndProvider>
NameTypeDescription
dataTData[]The current data array (required).
onReorder(data: TData[]) => voidCallback with the reordered data array (required).
childrenReact.ReactNodeTable components to wrap.
modifiersModifier[]DnD modifiers (defaults to vertical axis).

Makes a table row draggable via @dnd-kit/sortable.

NameTypeDescription
childrenReact.ReactNodeRow cell content.
rowIdstringUnique row identifier for sortable (required).
classNamestringAdditional CSS classes.

A grip icon button cell for initiating row drags.

NameTypeDescription
rowIdstringUnique row identifier for sortable (required).
classNamestringAdditional CSS classes.

Core column DnD provider that wraps the table with horizontal DnD context. Handles arrayMove on column order.

import { TableColumnDndProvider, TableDraggableHeader, TableDragAlongCell } from "@/components/niko-table/filters/table-column-dnd"
<TableColumnDndProvider columnOrder={columnOrder} onColumnOrderChange={setColumnOrder}>
{/* table content */}
</TableColumnDndProvider>
NameTypeDescription
columnOrderstring[]Current column order array (required).
onColumnOrderChange(columnOrder: string[]) => voidCallback with the new column order (required).
childrenReact.ReactNodeTable components to wrap.
modifiersModifier[]DnD modifiers (defaults to restrictToHorizontalAxis).

Makes a table header cell draggable for column reordering.

NameTypeDescription
headerHeader<TData, TValue>TanStack Table header instance (required).
childrenReact.ReactNodeHeader content.
classNamestringAdditional CSS classes.
styleCSSPropertiesAdditional styles merged with DnD transforms.

Table cell that follows its column’s drag position.

NameTypeDescription
cellCell<TData, TValue>TanStack Table cell instance (required).
childrenReact.ReactNodeCell content.
classNamestringAdditional CSS classes.
styleCSSPropertiesAdditional styles merged with DnD transforms.