Datatable Example
Translate in French
1 - 50 / 500
0 selected
First name | lastName | Age | Visits | Status | Description | Profile Progress | ||
|---|---|---|---|---|---|---|---|---|
| Anastacio | Wintheiser | 40 | 898 | complicated | 48 | |||
| Dameon | Little | 2 | 575 | relationship | 79 | |||
| Jennings | Howe | 0 | 549 | relationship | 13 | |||
| Candelario | Marks | 36 | 642 | relationship | 95 | |||
| Elvira | Price-Hirthe | 19 | 936 | complicated | 95 | |||
| Bruce | Bartoletti | 17 | 599 | complicated | 33 | |||
| Harley | Nitzsche | 36 | 214 | single | 57 | |||
| Sandrine | Blick | 20 | 981 | relationship | 42 | |||
| Lucinda | Bruen | 27 | 918 | complicated | 88 | |||
| Mario | Koepp | 19 | 382 | single | 81 | |||
| Brendan | O'Kon | 14 | 947 | relationship | 90 | |||
| Jackeline | D'Amore | 18 | 941 | single | 80 | |||
| Helga | Lang | 26 | 372 | single | 76 | |||
| Caroline | Dare | 4 | 217 | complicated | 96 | |||
| Beverly | Funk | 39 | 493 | single | 32 | |||
| Myah | Veum-Witting | 26 | 418 | complicated | 33 | |||
| Willis | Thompson | 22 | 199 | single | 55 | |||
| Phil | Doyle | 1 | 99 | complicated | 88 | |||
| Tito | Nolan | 15 | 57 | complicated | 3 | |||
| Vicki | Dickens | 4 | 411 | relationship | 90 | |||
| Mamie | Stiedemann | 26 | 812 | single | 100 | |||
| Lauren | Bayer | 34 | 740 | complicated | 34 | |||
| Fermin | Beatty | 35 | 383 | single | 70 | |||
| Candice | Hilll | 20 | 904 | relationship | 32 | |||
| Roberto | Wehner | 19 | 645 | relationship | 99 | |||
| Kaitlin | Dicki | 27 | 374 | complicated | 67 | |||
| Gunner | Yundt | 37 | 988 | single | 76 | |||
| Anahi | Huels | 13 | 317 | single | 84 | |||
| Amelia | Gutkowski | 39 | 47 | single | 32 | |||
| Theo | Dooley | 5 | 553 | complicated | 17 | |||
| Assunta | Leuschke | 1 | 820 | relationship | 8 | |||
| Cloyd | Pollich | 10 | 746 | complicated | 64 | |||
| Grayson | Kunde | 14 | 206 | complicated | 60 | |||
| Eileen | Ankunding | 15 | 309 | relationship | 97 | |||
| Dewey | Nicolas | 27 | 565 | relationship | 20 | |||
| Felix | Block | 6 | 547 | relationship | 97 | |||
| Tasha | Pfeffer | 3 | 593 | complicated | 2 | |||
| Vida | Cartwright | 2 | 9 | single | 83 | |||
| Freda | Bechtelar | 2 | 481 | complicated | 70 | |||
| Angie | Haag | 12 | 256 | single | 65 | |||
| Cedric | O'Reilly | 30 | 341 | single | 9 | |||
| Noel | Koss | 7 | 958 | relationship | 45 | |||
| Nathanial | Upton | 19 | 258 | complicated | 33 | |||
| Theresa | Langosh | 17 | 788 | relationship | 73 | |||
| Britney | Trantow | 2 | 79 | relationship | 35 | |||
| Whitney | Aufderhar | 25 | 761 | relationship | 50 | |||
| Maida | Bashirian | 35 | 818 | relationship | 9 | |||
| Wilson | Steuber | 39 | 353 | complicated | 6 | |||
| Lulu | Larson | 8 | 272 | relationship | 18 | |||
| Gilbert | Predovic | 1 | 481 | relationship | 89 |
Selected
{
"selectAll": false,
"selectedIds": [],
"excludedIds": []
}How to use this separator
Props
| Name | Type | Default | Description |
|---|---|---|---|
| data | MyCustomType[] | - | The data displayed in the tab. |
| columns | <ColumnDef<MyCustomType>[]> | - | The name of the colomns, how to get it, actions on column... |
| isLoading | boolean | - | Displays a skeleton on rows while loading. |
| tableOptions | {onRowSelectionChange, getSortedRowModel, getPaginationRowModel, onPaginationChange, enableRowSelection, onColumnOrderChange } | - | Change the default rendered element for the one passed as a child, merging their props and behavior. |
| tableState | {columnVisibility, columnOrder: string[], columnPinning:{left: string[], right: string[] }, rowPinning{bottom: string[], top: string[] }, columnFilters: {id: string, value: unknown }[], globalFilter: any, sorting: {desc: boolean, id: string }[], expanded:?, grouping: string[], columnSizing:?, columnSizingInfo: { columnSizingStart: [string, number][], deltaOffset: null | number,deltaPercentage: null | number,isResizingColumn: false | string, startOffset: null | number, startSize: null | number } } | - | Change the default rendered element for the one passed as a child, merging their props and behavior. |
| onClickRow | (row: Row<TData>) => void | - | Action function triggered when the user clicks on a row. |
| onResetTable | () => void | - | Reset localStorage used for preferences (order table, number of rows...). |
| toolbar | ReactNode | - | Put anything in this toolbar : button, text, select... |
| selection | { createSelectionColumn?: boolean, totalSelectableCount?: number,selectionState?: {state, onSelectionChange}, handlers?: {isRowSelected?,toggleRow?,toggleSelectAll?,getSelectionCount?,clearSelection?,isAllSelected?,isSomeSelected?},selectionHeader?: {custom?: (props: {selectionState: SelectionState}) => ReactNode, actions?: (props: {selectionState: SelectionState}) => ReactNode} } | - | Activate and changes the default display or behavior of the table selection |
Playground
Import from @filigran/ui :
Import {Separator} from '@filigran/ui'
Everything possible for declaring columns :
const columns = useMemo<ColumnDef<Person>[]>( () => [ { id: 'select', size: 20, header: ({table}) => ( <Checkbox className="flex" checked={ table.getIsAllPageRowsSelected() || (table.getIsSomePageRowsSelected() && 'indeterminate') } onCheckedChange={(value) => table.toggleAllPageRowsSelected(!!value) } aria-label="Select all" /> ), cell: ({row}) => ( <Checkbox className="flex" checked={row.getIsSelected()} onClick={(e) => e.stopPropagation()} onCheckedChange={(value) => { row.toggleSelected(!!value) }} aria-label="Select row" /> ), enableSorting: false, enableHiding: false, enableResizing: false }, { id: 'firstName', accessorKey: 'firstName', enableHiding: true, enableSorting: false, cell: (info) => ( <HighlightSearchTerm text={info.getValue() as string} /> ), header: 'First name' }, { accessorFn: (row) => row.lastName, id: 'lastName', enableHiding: false, cell: (info) => ( <HighlightSearchTerm text={info.getValue() as string} /> ), header: (header) => ( <DataTableOptionsHeader column={header.column} title={'Last name'} menuItems={ <> <DropdownMenuItem onClick={() => console.log(header.column)}> Log column </DropdownMenuItem> <DropdownMenuItem onClick={() => console.log(header.column)}> Log column 2 </DropdownMenuItem> </> } /> ) }, { id: 'age', accessorKey: 'age', header: 'Age' }], [])
<DataTable data={data} columns={columns} isLoading={loading} i18nKey={isCheckedI18n ? frenchI18nKey : {}} tableOptions={{ onRowSelectionChange: setRowSelection, getSortedRowModel: getSortedRowModel(), getPaginationRowModel: getPaginationRowModel(), onPaginationChange: setPagination, enableRowSelection: (row) => row.original.age > 18, //only enable row selection for adults onColumnOrderChange: setColumnOrder }} tableState={{ rowSelection, pagination, columnOrder, columnPinning: { left: ['select'] } //Force left column on the left, can not be pinned. }} selection={{ createDefaultSelectionColumn: true, totalSelectableCount: totalSelectable, defaultSelectionHeaderActions: ({ selectionState }) => ( <> <Button variant="ghost-destructive" size="icon" className="border" onClick={() => console.log(selectionState)}> <Trash className="size-4" /> </Button> </> ), }} onClickRow={(row) => console.log(row)} // Action on click />