Skip to main content

DataTable

Feature-rich data table with sorting, per-column filtering, global search, and pagination. Built on TanStack Table.

NameDepartmentRoleSalaryStatus
Alice JohnsonEngineeringSenior Developer$120,000

Active

Bob SmithDesignLead Designer$105,000

Active

Carol WhiteEngineeringJunior Developer$75,000

On Leave

Dave BrownMarketingMarketing Manager$95,000

Active

Eve DavisEngineeringDevOps Engineer$110,000

Active

Frank MillerSalesSales Representative$70,000

Inactive

Grace LeeDesignUX Researcher$90,000

Active

Henry WilsonEngineeringSenior Developer$125,000

Active

Ivy ChenMarketingContent Writer$65,000

Active

Jack TaylorSalesAccount Manager$85,000

On Leave

<DataTable
data={employees}
columns={[
{ accessorKey: 'name', header: 'Name', enableSorting: true },
{ accessorKey: 'department', header: 'Department', enableSorting: true },
{ accessorKey: 'role', header: 'Role', enableSorting: true },
{ accessorKey: 'salary', header: 'Salary', kind: 'number', enableSorting: true, cell: (value) => `$${Number(value).toLocaleString()}` },
{ accessorKey: 'status', header: 'Status', enableSorting: true, cell: (value) => <Tag dense color={statusColor(value)}>{String(value)}</Tag> },
]}
border
/>

Column Configuration

Each column accepts:

PropTypeDefaultDescription
accessorKeystringrequiredKey from the data object
headerstringrequiredColumn header label
enableSortingbooleanfalseAllow sorting on this column
enableFilteringbooleanfalseShow column filter
filterType'text' | 'select''text'Filter input type
filterOptionsstring[]-Options for select filter
cell(value, row) => ReactNode-Custom cell renderer

Props

EnableSearch

Use enableSearch to add a global search input above the table.

NameDepartmentRole
Alice JohnsonEngineeringSenior Developer
Bob SmithDesignLead Designer
Carol WhiteEngineeringJunior Developer
Dave BrownMarketingMarketing Manager
Eve DavisEngineeringDevOps Engineer
<DataTable
data={data}
columns={columns}
enableSearch
/>

EnableFiltering

Enable per-column filters with enableFiltering. Use filterType: 'select' with filterOptions for dropdown filters.

NameDepartmentStatus
Alice JohnsonEngineering

Active

Bob SmithDesign

Active

Carol WhiteEngineering

On Leave

Dave BrownMarketing

Active

Eve DavisEngineering

Active

<DataTable
data={data}
columns={[
{ accessorKey: 'name', header: 'Name', enableFiltering: true },
{ accessorKey: 'department', header: 'Department',
enableFiltering: true, filterType: 'select',
filterOptions: ['Engineering', 'Design', 'Marketing', 'Sales'] },
{ accessorKey: 'status', header: 'Status',
enableFiltering: true, filterType: 'select',
filterOptions: ['Active', 'On Leave', 'Inactive'] },
]}
/>

PageSizeOptions

Pagination is built-in. Customize initial page size and available options.

NameDepartmentRole
Alice JohnsonEngineeringSenior Developer
Bob SmithDesignLead Designer
Carol WhiteEngineeringJunior Developer
Dave BrownMarketingMarketing Manager
Eve DavisEngineeringDevOps Engineer
<DataTable
data={data}
columns={columns}
pageSize={5}
pageSizeOptions={[5, 10, 25]}
/>

Table Variants

Supports the same style variants as Table: striped, dense, border, hasHover.

NameDepartmentRole
Alice JohnsonEngineeringSenior Developer
Bob SmithDesignLead Designer
Carol WhiteEngineeringJunior Developer
Dave BrownMarketingMarketing Manager
Eve DavisEngineeringDevOps Engineer
<DataTable data={data} columns={columns} dense striped border />

Accessibility

  • Sortable headers have aria-sort attribute
  • Sort icons are decorative (aria-hidden)
  • Filter inputs have hidden labels for screen readers
  • Pagination uses role="navigation" with aria-label
  • Page buttons have descriptive aria-label attributes
  • Empty state is announced within the table