Complete Example
Here is the full working example with all features combined:
import { useState } from 'react'
import { createColumnHelper, useTable, Table, Pagination, GlobalFilter } from '@zvndev/yable-react'
import type { SortingState } from '@zvndev/yable-react'
import '@zvndev/yable-themes'
// Data type
interface Employee {
id: number
name: string
department: string
salary: number
startDate: string
active: boolean
}
// Column helper
const columnHelper = createColumnHelper<Employee>()
// Column definitions
const columns = [
columnHelper.accessor('name', {
header: 'Name',
enableSorting: true,
editable: true,
editConfig: { type: 'text' },
}),
columnHelper.accessor('department', {
header: 'Department',
enableSorting: true,
editable: true,
editConfig: {
type: 'select',
options: [
{ label: 'Engineering', value: 'Engineering' },
{ label: 'Marketing', value: 'Marketing' },
{ label: 'Sales', value: 'Sales' },
],
},
}),
columnHelper.accessor('salary', {
header: 'Salary',
enableSorting: true,
editable: true,
editConfig: { type: 'number' },
cell: ({ getValue }) => `$${getValue().toLocaleString()}`,
}),
columnHelper.accessor('startDate', {
header: 'Start Date',
enableSorting: true,
sortingFn: 'datetime',
}),
columnHelper.accessor('active', {
header: 'Active',
editable: true,
editConfig: { type: 'toggle' },
}),
]
// Initial data
const initialData: Employee[] = [
{ id: 1, name: 'Alice Johnson', department: 'Engineering', salary: 120000, startDate: '2021-03-15', active: true },
{ id: 2, name: 'Bob Smith', department: 'Marketing', salary: 85000, startDate: '2020-07-01', active: true },
{ id: 3, name: 'Charlie Brown', department: 'Engineering', salary: 110000, startDate: '2022-01-10', active: false },
{ id: 4, name: 'Diana Prince', department: 'Sales', salary: 95000, startDate: '2019-11-20', active: true },
{ id: 5, name: 'Eve Williams', department: 'Engineering', salary: 130000, startDate: '2018-05-03', active: true },
{ id: 6, name: 'Frank Miller', department: 'Marketing', salary: 78000, startDate: '2023-02-14', active: true },
{ id: 7, name: 'Grace Lee', department: 'Sales', salary: 92000, startDate: '2021-08-22', active: false },
{ id: 8, name: 'Henry Davis', department: 'Engineering', salary: 115000, startDate: '2020-12-01', active: true },
]
export function EmployeeTable() {
const [data, setData] = useState(initialData)
const [sorting, setSorting] = useState<SortingState>([])
const table = useTable({
data,
columns,
state: { sorting },
onSortingChange: setSorting,
enableCellEditing: true,
onEditCommit: (changes) => {
setData((prev) =>
prev.map((row, i) => {
const rowChanges = changes[String(i)]
return rowChanges ? { ...row, ...rowChanges } : row
})
)
},
initialState: {
pagination: { pageIndex: 0, pageSize: 5 },
},
})
return (
<div>
<GlobalFilter table={table} placeholder="Search employees..." />
<Table table={table} striped stickyHeader>
<Pagination table={table} showPageSize pageSizes={[5, 10, 25]} />
</Table>
</div>
)
}