Data Table
Organizes information into rows and columns for easy readability. It accommodates various data types, including text, numbers, codes, call-to-action and links, enabling efficient presentation and comparison.
Name | Age | Position | Status | Action |
---|---|---|---|---|
John Doe | 25 | Software Engineer | Success | |
Jane Doe | 30 | Product Manager | Success | |
Alice | 22 | Designer | Success | |
Bob 'With A Very Long Middle Name' Smith | 35 | Software Engineer | Success | |
Charlie | 28 | Data Scientist | Success |
Usage
Examples
Data & Columns
DataTable
component is primarily defined by 2 important props: data
and columns
.
data
accepts array of objects, where each object represents a row in the table.columns
accepts array ofColumnDef
, where each object represents a column in the table.
Name | Age | Position | Status | Action |
---|---|---|---|---|
John Doe | 25 | Software Engineer | Success | |
Jane Doe | 30 | Product Manager | Success | |
Alice | 22 | Designer | Success | |
Bob 'With A Very Long Middle Name' Smith | 35 | Software Engineer | Success | |
Charlie | 28 | Data Scientist | Success |
Note
DataTable
uses TanStack/table, a very
capable headless table library, under the hood. To find out more about the
ColumnDef and the APIs available, please refer to the
documentation
here.
Expanding Columns
You can expand the size of the cells in a column by setting the expandable
property to true
in the meta
object of the column definition.
To demonstrate this, we have set the expandable
property to true
for the Name
and Position
columns. You can click on the expand icon to view the full content of the cell.
Name | Age | Position | Status | Action |
---|---|---|---|---|
John Doe | 25 | Software Engineer | Success | |
Jane Doe | 30 | Product Manager | Success | |
Alice | 22 | Designer | Success | |
Bob 'With A Very Long Middle Name' Smith | 35 | Software Engineer | Success | |
Charlie | 28 | Data Scientist | Success |
Tooltip on Column Headers
You can add a tooltip to the column headers by setting the tooltip
property in the meta
object of the column definition.
To demonstrate this, we have set the tooltip
property to Age
and Position
column. Hover over the column header to view the tooltip.
Name | Age | Position | Status | Action |
---|---|---|---|---|
John Doe | 25 | Software Engineer | Success | |
Jane Doe | 30 | Product Manager | Success | |
Alice | 22 | Designer | Success | |
Bob 'With A Very Long Middle Name' Smith | 35 | Software Engineer | Success | |
Charlie | 28 | Data Scientist | Success |
Sorting
You can sort the data in the table by setting the sortable
property to true
in the meta
object of the column definition.
To demonstrate this, we have set the sortable
property to the Position
column. Click the sort icon to toggle the sorts available.
Name | Age | Position | Status | Action |
---|---|---|---|---|
John Doe | 25 | Software Engineer | Success | |
Jane Doe | 30 | Product Manager | Success | |
Alice | 22 | Designer | Success | |
Bob 'With A Very Long Middle Name' Smith | 35 | Software Engineer | Success | |
Charlie | 28 | Data Scientist | Success |
Skeleton Loading
You can enable loading
prop to trigger skeleton loading state for the table.
Name | Age | Position | Status | Action |
---|---|---|---|---|
Empty Table
Passing an empty array to the data
prop will render an empty state for the table.
Name | Age | Position | Status | Action |
---|---|---|---|---|
No data available |
Row Selection
Enable selection mode by passing a selection
prop to the DataTable
component. The selection
prop accepts an object with the following properties:
mode
: The type of selection. Can be eithercheckbox
orradio
.onSelectionChange
: A callback function that is triggered when the selection changes.rowId
: The unique identifier for each row in the table.
Checkbox
Name | Age | Position | Status | Action | |
---|---|---|---|---|---|
John Doe | 25 | Software Engineer | Success | ||
Jane Doe | 30 | Product Manager | Success | ||
Alice | 22 | Designer | Success | ||
Bob 'With A Very Long Middle Name' Smith | 35 | Software Engineer | Success | ||
Charlie | 28 | Data Scientist | Success |
Radio
Name | Age | Position | Status | Action | |
---|---|---|---|---|---|
John Doe | 25 | Software Engineer | Success | ||
Jane Doe | 30 | Product Manager | Success | ||
Alice | 22 | Designer | Success | ||
Bob 'With A Very Long Middle Name' Smith | 35 | Software Engineer | Success | ||
Charlie | 28 | Data Scientist | Success |
Grouped Header
You can group columns together by setting the columns
property to an array of ColumnGroupDef
objects. Each ColumnGroupDef
object represents a group of columns in the table.
Here is an example of a table with grouped columns:
Employee | Application | |||
---|---|---|---|---|
Name | Age | Position | Status | Action |
John Doe | 25 | Software Engineer | Success | |
Jane Doe | 30 | Product Manager | Success | |
Alice | 22 | Designer | Success | |
Bob 'With A Very Long Middle Name' Smith | 35 | Software Engineer | Success | |
Charlie | 28 | Data Scientist | Success |
Fixed/Sticky Header
By default, the header of the table is sticky, but it never materialised as the tables in previous examples do not have a fixed height.
To demonstrate the sticky header, lets set a fixed height for the table. Simply pass the className
prop to the DataTable
component with a max-h-[300px]
class.
Employee | Application | |||
---|---|---|---|---|
Name | Age | Position | Status | Action |
John Doe | 25 | Software Engineer | Success | |
Jane Doe | 30 | Product Manager | Success | |
Alice | 22 | Designer | Success | |
Bob 'With A Very Long Middle Name' Smith | 35 | Software Engineer | Success | |
Charlie | 28 | Data Scientist | Success |
Nested Rows
DataTable
is also capable of nesting rows. To enable this feature, the following requirements must be met:
data
: Contain a nested array object with a key that matches theid_by
property in thenest
object. (eg.children
)columns
: Column responsible for expanding & collapsing should passCell.Expand
in thecell
property.nest
: An object prop that contains the following properties:id_by
: The key that matches the nested array object in thedata
property.
Name | Age | Position | Status | Action |
---|---|---|---|---|
John Doe | 25 | Software Engineer | Success | |
Jane Doe | 30 | Product Manager | Success | |
Alice | 22 | Designer | Success | |
Bob | 35 | Software Engineer | Success | |
Charlie | 28 | Data Scientist | Success |
Pinned Columns
You can pin columns to the left or right of the table by setting the pin
property. The pin
property accepts an object with the following properties:
left
: An array of column IDs to pin to the left.right
: An array of column IDs to pin to the right.
Name | Age | Position | Status | Action |
---|---|---|---|---|
John Doe | 25 | Software Engineer | Success | |
Jane Doe | 30 | Product Manager | Success | |
Alice | 22 | Designer | Success | |
Bob 'With A Very Long Middle Name' Smith | 35 | Software Engineer | Success | |
Charlie | 28 | Data Scientist | Success |
Table Footer
You can add footer per column by setting the footer
in ColumnDef object of the column definition. Here is an example of a table with footer:
Name | Age | Position | Status | Action |
---|---|---|---|---|
John Doe | 25 | Software Engineer | Success | |
Jane Doe | 30 | Product Manager | Success | |
Alice | 22 | Designer | Success | |
Bob 'With A Very Long Middle Name' Smith | 35 | Software Engineer | Success | |
Charlie | 28 | Data Scientist | Success | |
No. of Employees: 5 |
Props
DataTable
Prop | Type | Default |
---|---|---|
columns | ColumnDef | - |
data | Array<T = {}> | - |
nest | { id_by: string } | - |
pin | { left: Array<string>, right: Array<string> } | - |
DataTable ColumnDef
Prop | Type | Default |
---|---|---|
id | string | - |
accessorKey | string | - |
accessorFn | (row) => any | - |
header | string | (context) => ReactNode | - |
footer | string | (context) => ReactNode | - |
size | number | - |
cell | (context) => ReactNode | - |
meta.expandable | boolean | - |
meta.sortable | boolean | - |
meta.tooltip | ReactNode | - |