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>
  )
}