Skip to main content

Data Table

Enterprise data table with search, sorting, selection, and pagination.

Preview ยท Data Table

Codeโ€‹

<div class="table">
<table class="striped">
<thead><tr><th aria-sort="ascending">Tenant</th><th>Plan</th><th>Status</th><th>MRR</th></tr></thead>
<tbody>
<tr><td>Acme Corp</td><td>Enterprise</td><td><span class="badge success">Active</span></td><td>$12,000</td></tr>
<tr><td>Globex Inc</td><td>Pro</td><td><span class="badge warning">Trial</span></td><td>$499</td></tr>
<tr><td>Initech</td><td>Starter</td><td><span class="badge danger">Suspended</span></td><td>โ€”</td></tr>
</tbody>
</table>
</div>

Propsโ€‹

PropTypeDefaultDescription
dataT[]requiredRow data array
columnsColumn<T>[]requiredColumn definitions
rowKeykeyof T'id'Unique row key field
selectablebooleanfalseShow row selection checkboxes
selectedKeysstring[][]Controlled selected row keys
searchablebooleantrueShow search input above table
searchPlaceholderstring'Search...'Search input placeholder
paginatedbooleanfalseEnable client-side pagination
pageSizenumber10Rows per page when paginated
pageIndexnumber0Controlled page index
loadingbooleanfalseShow overlay spinner on the table
emptyMessagestring'No results'Message shown when data is empty
onRowClick / (onRowClick)(row: T) => voidโ€”Fires when a row is clicked
onSelectionChange / (onSelectionChange)(keys: string[]) => voidโ€”Fires when selection changes
onPageChange / (onPageChange)(page: number) => voidโ€”Fires when page changes

TypeScript interfacesโ€‹

interface Column<T> {
key: keyof T | string; // Data key or unique identifier
header: string; // Column heading text
sortable?: boolean; // Enable click-to-sort
width?: string; // Column width e.g. '120px' or '15%'
align?: 'left' | 'center' | 'right'; // Cell text alignment
render?: (row: T) => React.ReactNode; // Custom cell renderer (React)
// Angular: use a template ref via [cellTemplate] input
}

// Example usage
interface Tenant {
id: string;
name: string;
plan: 'starter' | 'pro' | 'enterprise';
status: 'active' | 'trial' | 'suspended';
mrr: number;
}

const columns: Column<Tenant>[] = [
{ key: 'name', header: 'Tenant', sortable: true },
{ key: 'plan', header: 'Plan' },
{ key: 'status', header: 'Status',
render: (row) => <Badge variant={row.status === 'active' ? 'success' : 'warning'}>{row.status}</Badge> },
{ key: 'mrr', header: 'MRR', align: 'right',
render: (row) => `$${row.mrr.toLocaleString()}` },
];
Version history

See the Changelog for version history and breaking changes.