DataTable

A full-featured, column-definition driven data table with client-side sorting, row selection with indeterminate header checkbox, and pagination.

Installation

npx @obi/ui add data-table

Preview

Paginator:
Status
Alice ChenEngineerPlatformActive2022-03-14$145,000
Bob RuizDesignerProductAway2021-07-01$130,000
Carol SmithEngineering MgrPlatformActive2020-01-20$165,000
Dave ParkData AnalystAnalyticsActive2023-05-10$120,000
Eve TorresDesignerProductActive2022-11-03$128,000
Showing 15 of 12

Usage

'use client';

import { useState } from 'react';
import DataTable, { type ColumnDef } from '@/src/components/DataTable/DataTable';

interface Person { id: number; name: string; role: string; status: string; }

const COLUMNS: ColumnDef<Person>[] = [
  { key: 'name',   header: 'Name',   sortable: true },
  { key: 'role',   header: 'Role',   sortable: true },
  { key: 'status', header: 'Status', sortable: false },
];

const DATA: Person[] = [
  { id: 1, name: 'Alice Chen',  role: 'Engineer', status: 'Active' },
  { id: 2, name: 'Bob Ruiz',    role: 'Designer', status: 'Away'   },
  { id: 3, name: 'Carol Smith', role: 'Manager',  status: 'Active' },
];

export default function Example() {
  const [selected, setSelected] = useState<Person[]>([]);
  return (
    <DataTable<Person>
      data={DATA}
      columns={COLUMNS}
      keyField="id"
      selectable
      onSelectionChange={setSelected}
      pageSize={5}
    />
  );
}

Props

NameTypeDefaultDescription
dataT[]Array of data objects to display.
columnsColumnDef<T>[]Column definitions controlling headers, keys, sorting, and cell rendering.
keyFieldkeyof T & stringProperty key used as a unique row identifier.
selectablebooleanfalsePrepends a checkbox column for row selection.
onSelectionChange(selected: T[]) => voidundefinedCalled with selected rows whenever selection changes.
pageSizenumber10Rows per page. Set to 0 to show all rows.
emptyMessagestring'No data'Text shown when data is empty.
classNamestring''Additional classes on the root wrapper.