Dice UI
Components

Data Table

A powerful and flexible data table component for displaying, filtering, sorting, and paginating tabular data.

Installation

Install the components and dependencies:

npx shadcn@latest add "https://diceui.com/r/data-table"

Wrap your application with the NuqsAdapter for query state management:

import { NuqsAdapter } from "nuqs/adapters/next/app";
 
<NuqsAdapter>
  <App />
</NuqsAdapter>

Layout

Import the components and compose them together:

import { DataTable } from "@/components/data-table";
import { DataTableToolbar } from "@/components/data-table-toolbar";
import { DataTableAdvancedToolbar } from "@/components/data-table-advanced-toolbar";
import { DataTableFilterList } from "@/components/data-table-filter-list";
import { DataTableSortList } from "@/components/data-table-sort-list";
import { useDataTable } from "@/hooks/use-data-table";
 
const { table } = useDataTable({
  data,
  columns,
  pageCount,
});
 
// With standard toolbar
<DataTable table={table}>
  <DataTableToolbar table={table}>
    <DataTableSortList table={table} />
  </DataTableToolbar>
</DataTable>
 
// With advanced toolbar
<DataTable table={table}>
  <DataTableAdvancedToolbar table={table}>
    <DataTableFilterList table={table} />
    <DataTableSortList table={table} />
  </DataTableAdvancedToolbar>
</DataTable>

Sort List

The DataTableSortList provides a comprehensive way to sort data by multiple columns simultaneously.

Features

  • Supports multiple column sorting
  • Drag and drop reordering
  • Ascending and descending directions

Installation

npx shadcn@latest add "https://diceui.com/r/data-table-sort-list"

Filter List

The DataTableFilterList provides a comprehensive way to filter data with multiple conditions.

Features

  • Multiple filter conditions with AND/OR logic
  • Drag and drop reordering
  • Dynamic operators per field type

Installation

npx shadcn@latest add "https://diceui.com/r/data-table-filter-list"

Filter Menu

The DataTableFilterMenu provides a command palette-style interface for quickly adding and managing filters.

Features

  • Command palette-style interface
  • Context-aware input fields
  • Compact token display

Installation

npx shadcn@latest add "https://diceui.com/r/data-table-filter-menu"

Action Bar

The DataTableActionBar provides a toolbar for the data table when rows are selected.

Features

  • Floating action bar
  • Customizable actions
  • Row selection tracking

Installation

npx shadcn@latest add "https://diceui.com/r/data-table-action-bar"

Walkthrough

Define columns with appropriate metadata:

import { Text, CalendarIcon, DollarSign } from "lucide-react";
import { DataTableColumnHeader } from "@/components/data-table-column-header";
 
const columns = React.useMemo(() => [
  {
    // Provide an unique id for the column
    // This id will be used as query key for the column filter
    id: "title", 
    accessorKey: "title",
    header: ({ column }) => (
      <DataTableColumnHeader column={column} title="Title" />
    ),
    cell: ({ row }) => <div>{row.getValue("title")}</div>,
    // Define the column meta options for sorting, filtering, and view options
    meta: { 
      label: "Title", 
      placeholder: "Search titles...", 
      variant: "text", 
      icon: Text, 
    }, 
    // By default, the column will not be filtered. Set to `true` to enable filtering.
    enableColumnFilter: true, 
  },
], []);

Initialize the table state using the useDataTable hook:

import { useDataTable } from "@/hooks/use-data-table";
 
function DataTableDemo() {
  const { table } = useDataTable({
    data,
    columns,
    // Pass the total number of pages for the table
    pageCount, 
    initialState: {
      sorting: [{ id: "createdAt", desc: true }],
      pagination: { pageSize: 10 },
    },
    // Unique identifier for rows, can be used for unique row selection
    getRowId: (row) => row.id, 
  });
 
  return (
    // ... render table
  );
}

Pass the table instance to the DataTable, and DataTableToolbar components:

import { DataTable } from "@/components/data-table";
import { DataTableToolbar } from "@/components/data-table-toolbar";
import { DataTableSortList } from "@/components/data-table-sort-list";
 
function DataTableDemo() {
  return (
    <DataTable table={table}>
      <DataTableToolbar table={table}>
        <DataTableSortList table={table} />
      </DataTableToolbar>
    </DataTable>
  );
}

For advanced filtering, use the DataTableAdvancedToolbar component:

import { DataTableAdvancedToolbar } from "@/components/data-table-advanced-toolbar";
import { DataTableFilterList } from "@/components/data-table-filter-list";
import { DataTableFilterMenu } from "@/components/data-table-filter-menu";
 
function DataTableDemo() {
  return (
    <DataTable table={table}>
      <DataTableAdvancedToolbar table={table}>
        <DataTableFilterList table={table} />
        <DataTableSortList table={table} />
      </DataTableAdvancedToolbar>
    </DataTable>
  );
}

Alternatively, swap out DataTableFilterList with DataTableFilterMenu for a command palette-style interface:

import { DataTableAdvancedToolbar } from "@/components/data-table-advanced-toolbar";
import { DataTableFilterList } from "@/components/data-table-filter-list"; 
import { DataTableFilterMenu } from "@/components/data-table-filter-menu"; 
import { DataTableSortList } from "@/components/data-table-sort-list";
 
function DataTableDemo() {
  return (
    <DataTable table={table}>
      <DataTableAdvancedToolbar table={table}>
        <DataTableFilterList table={table} />
        <DataTableFilterMenu table={table} />
        <DataTableSortList table={table} />
      </DataTableAdvancedToolbar>
    </DataTable>
  );
}

Render an action bar on row selection:

import { DataTableActionBar } from "@/components/data-table-action-bar";
import { CustomTableActions } from "@/components/custom-table-actions";
 
function DataTableDemo() {
  return (
    <DataTable 
      table={table}
      actionBar={
        <DataTableActionBar table={table}>
          {/* Add your custom actions here */}
          <CustomTableActions />
        </DataTableActionBar>
      }
    >
      <DataTableToolbar table={table} />
    </DataTable>
  );
}

API Reference

Column Definitions

The column definitions are used to define the columns of the data table.

const columns = React.useMemo<ColumnDef<Project>[]>(() => [
  {
    // Required: Unique identifier for the column
    id: "title", 
    // Required: Key to access the data, `accessorFn` can also be used
    accessorKey: "title", 
    // Optional: Custom header component
    header: ({ column }) => (
      <DataTableColumnHeader column={column} title="Title" />
    ),
    // Optional: Custom cell component
    cell: ({ row }) => <div>{row.getValue("title")}</div>,
    // Optional: Meta options for filtering, sorting, and view options
    meta: {
      label: "Title",
      placeholder: "Search titles...",
      variant: "text",
      icon: Text,
    },
    // By default, the column will not be filtered. Set to `true` to enable filtering.
    enableColumnFilter: true, 
  },
  {
    id: "status",
    // Access nested data using `accessorFn`
    accessorFn: (row) => row.lineItem.status,
    header: "Status",
    meta: {
      label: "Status",
      variant: "select",
      options: [
        { label: "Active", value: "active" },
        { label: "Inactive", value: "inactive" },
      ],
    },
    enableColumnFilter: true,
  },
], []);

Properties

Core configuration options for defining columns.

PropDescription
idRequired: Unique identifier for the column
accessorKeyRequired: Key to access the data from the row
accessorFnOptional: Custom accessor function to access data
headerOptional: Custom header component with column props
cellOptional: Custom cell component with row props
metaOptional: Meta options for accessing column metadata
enableColumnFilterBy default, the column will not be filtered. Set to `true` to enable filtering
enableSortingEnable sorting for this column
enableHidingEnable column visibility toggle

Column Meta

Column meta options for filtering, sorting, and view options.

PropDescription
labelThe display name for the column
placeholderThe placeholder text for filter inputs
variantThe type of filter to use (`text`, `number`, `select`, etc.)
optionsFor select/multi-select filters, an array of options with `label`, `value`, and optional `count` and `icon`
rangeFor range filters, a tuple of `[min, max]` values
unitFor numeric filters, the unit to display (e.g., 'hr', '$')
iconThe react component to use as an icon for the column

Filter Variants

Available filter variants for column meta.

TitleDescription
textText search with contains, equals, etc.
numberNumeric filters with equals, greater than, less than, etc.
rangeRange filters with minimum and maximum values
dateDate filters with equals, before, after, etc.
dateRangeDate range filters with start and end dates
booleanBoolean filters with true/false values
selectSingle-select filters with predefined options
multiSelectMulti-select filters with predefined options

Reference the TanStack Table Column Definitions Guide for detailed column definition guide.

useDataTable

A hook for initializing the data table with state management.

PropTypeDefault
history?
"push" | "replace"
"replace"
debounceMs?
number
300
throttleMs?
number
50
clearOnDefault?
boolean
false
enableAdvancedFilter?
boolean
false
scroll?
boolean
false
shallow?
boolean
true
startTransition?
TransitionStartFunction
-
pageCount
number
-
data
TData[]
-
columns
ColumnDef<TData, any>[]
-
getRowId?
(originalRow: TData, index: number, parent?: Row<TData> | undefined) => string
-
defaultColumn?
Partial<ColumnDef<TData, unknown>>
-
initialState?
InitialTableState
-

DataTable

The main data table component.

PropTypeDefault
table
Table<TData>
-
actionBar?
ReactNode
-

DataTableColumnHeader

Custom header component for columns with sorting.

PropTypeDefault
column
Column<TData, TValue>
-
title
string
-

DataTableToolbar

Standard toolbar with filtering and view options.

PropTypeDefault
table
Table<TData>
-

DataTableAdvancedToolbar

Advanced toolbar with more comprehensive filtering capabilities.

PropTypeDefault
table
Table<TData>
-

DataTableViewOptions

Controls column visibility and display preferences in the data table.

PropTypeDefault
table
Table<TData>
-

DataTableSortList

List of applied sorting with ability to add, remove, and modify sorting.

PropTypeDefault
table
Table<TData>
-
debounceMs?
number
300
throttleMs?
number
50
shallow?
boolean
true

DataTableFilterList

List of applied filters with ability to add, remove, and modify filters.

PropTypeDefault
table
Table<TData>
-
debounceMs?
number
300
throttleMs?
number
50
shallow?
boolean
true

DataTableFilterMenu

Filter menu with ability to add, remove, and modify filters.

PropTypeDefault
table
Table<TData>
-
debounceMs?
number
300
throttleMs?
number
50
shallow?
boolean
true

DataTableActionBar

Floating action bar component for actions for selected rows.

PropTypeDefault
table
Table<TData>
-
visible?
boolean
-
container?
Element | DocumentFragment
document.body

DataTablePagination

Pagination controls for the data table.

PropTypeDefault
table
Table<TData>
-
pageSizeOptions?
number[]
[10, 20, 30, 40, 50]

Accessibility

Keyboard Interactions

KeyDescription
FOpens the filter menu.
Shift + FRemoves the last applied filter.
SOpens the sort menu.
Shift + SRemoves the last applied sort.
BackspaceDeleteRemoves the focused filter/sort item. Removes the last applied filter/sort when menu trigger is focused.

Credits

  • shadcn/ui - For the initial implementation of the data table.