- Button
- Date Picker
- Field
- Fields
- Input Group
- File Uploader
- Signature Pad
- Text Area
- Container
- Section Header
- Separator
- Spacer
- Action Row
- Breadcrumb
- Tabs
- Tabs Container
- Card
- Image
- Text
- Title
- Video Player
- Card Collection
- Data Grid
- List Collection
- Table Collection
- Bar Chart
- Big Number
- Line Chart
- Radial Chart
- Hint
- Progress
- Spinner
- Skeleton
- Toast
- Sheet
- Dialog
- Real-world patterns
- Primitives
A comprehensive Table Collection component built on TanStack Table and shadcn/ui that provides sorting, filtering, pagination, row selection, and customizable row actions.
Basic Usage
The simplest form displays a table with default styling and no interactive features.
| Name | Role | Status | |
|---|---|---|---|
| Olivia Martin | olivia.martin@email.com | Group Facilitator | Active |
| Jackson Lee | jackson.lee@email.com | Member | Active |
| Isabella Nguyen | isabella.nguyen@email.com | Programme Facilitator | Away |
| William Kim | william.kim@email.com | Coordinator | Active |
| Sofia Davis | sofia.davis@email.com | Member | Inactive |
Variants
Striped Variant
Alternating row backgrounds for improved readability.
| ID | Description | Date | Amount |
|---|---|---|---|
TXN-001 | Subscription payment | Jan 15, 2024 | $500.00 |
TXN-002 | Plan renewal | Jan 16, 2024 | $29.00 |
TXN-003 | Sponsorship credit | Jan 17, 2024 | -$150.00 |
TXN-004 | Programme enrolment | Jan 18, 2024 | $89.99 |
TXN-005 | Processing fee | Jan 19, 2024 | $12.00 |
Minimal Variant
Clean design with only horizontal dividers.
| ID | Description | Date | Amount |
|---|---|---|---|
| TXN-001 | Subscription payment | 2024-01-15 | $500.00 |
| TXN-002 | Plan renewal | 2024-01-16 | $29.00 |
| TXN-003 | Sponsorship credit | 2024-01-17 | -$150.00 |
| TXN-004 | Programme enrolment | 2024-01-18 | $89.99 |
| TXN-005 | Processing fee | 2024-01-19 | $12.00 |
Sorting
Enable column sorting with enableSorting and use helper functions for sortable columns.
| Status | |||
|---|---|---|---|
Olivia Martin | olivia.martin@email.com | Group Facilitator | Active |
Jackson Lee | jackson.lee@email.com | Member | Active |
Isabella Nguyen | isabella.nguyen@email.com | Programme Facilitator | Away |
William Kim | william.kim@email.com | Coordinator | Active |
Sofia Davis | sofia.davis@email.com | Member | Inactive |
Row Actions
Add a dropdown menu to each row with custom actions.
| Name | Role | Actions | |
|---|---|---|---|
| Olivia Martin | olivia.martin@email.com | Group Facilitator | |
| Jackson Lee | jackson.lee@email.com | Member | |
| Isabella Nguyen | isabella.nguyen@email.com | Programme Facilitator | |
| William Kim | william.kim@email.com | Coordinator | |
| Sofia Davis | sofia.davis@email.com | Member |
All Features Combined
A fully-featured table with sorting, filtering, pagination, row selection, images, badges, and toolbar actions.
| Programme | Category | Fee | Status | Actions | ||
|---|---|---|---|---|---|---|
ER | Exodus Recovery Skills | Programme | $1,500.00 | Open | ||
V | Vantage | Programme | $1,500.00 | Open | ||
R | Resound | Programme | $1,200.00 | Limited |
Column Helpers
The component includes helper functions for common column patterns.
createSelectColumn()
Creates a checkbox column for row selection.
import { createSelectColumn } from "@pex/ui-web/data/table-helpers";
const columns = [
createSelectColumn(),
// ... other columns
];createSortableColumn(accessorKey, label)
Creates a sortable column with header button and sort indicators.
import { createSortableColumn } from "@pex/ui-web/data/table-helpers";
const columns = [
createSortableColumn("name", "Name"),
createSortableColumn("email", "Email"),
];createImageColumn(accessorKey, label, nameAccessorKey?)
Creates a column displaying avatars or images with fallback initials.
import { createImageColumn } from "@pex/ui-web/data/table-helpers";
const columns = [
createImageColumn("avatar", "User", "name"),
// Creates avatar with initials from name field
];createActionsColumn(renderActions)
Creates a column with a dropdown menu for row actions.
import { createActionsColumn } from "@pex/ui-web/data/table-helpers";
import { DropdownMenuItem } from "@pex/ui-web/primitives/dropdown-menu";
const columns = [
createActionsColumn((row) => (
<>
<DropdownMenuItem onClick={() => edit(row.original)}>
Edit
</DropdownMenuItem>
<DropdownMenuItem onClick={() => remove(row.original)}>
Delete
</DropdownMenuItem>
</>
)),
];createBadgeColumn(accessorKey, label, getBadgeVariant?)
Creates a column displaying badges with dynamic variants.
import { createBadgeColumn } from "@pex/ui-web/data/table-helpers";
const columns = [
createBadgeColumn("status", "Status", (value) => {
if (value === "Active") return "default";
if (value === "Pending") return "secondary";
if (value === "Inactive") return "destructive";
return "outline";
}),
];createDateColumn(accessorKey, label, formatOptions?)
Creates a column with formatted dates.
import { createDateColumn } from "@pex/ui-web/data/table-helpers";
const columns = [
createDateColumn("createdAt", "Created"),
// Uses default format: Jan 15, 2024
createDateColumn("updatedAt", "Updated", {
year: "numeric",
month: "long",
day: "numeric",
}),
// Custom format: January 15, 2024
];createCurrencyColumn(accessorKey, label, currency?)
Creates a column displaying currency values.
import { createCurrencyColumn } from "@pex/ui-web/data/table-helpers";
const columns = [
createCurrencyColumn("price", "Price"),
// Displays as $299.99
createCurrencyColumn("cost", "Cost", "EUR"),
// Displays as €299.99
];createNumberColumn(accessorKey, label, formatOptions?)
Creates a column with formatted numbers.
import { createNumberColumn } from "@pex/ui-web/data/table-helpers";
const columns = [
createNumberColumn("quantity", "Qty"),
// Right-aligned numbers
createNumberColumn("percentage", "Rate", {
style: "percent",
minimumFractionDigits: 2,
}),
// Displays as 45.67%
];Props Reference
TableCollection
| Prop | Type | Default | Description |
|---|---|---|---|
data | TData[] | - | Array of data to display (required) |
columns | ColumnDef<TData>[] | - | TanStack Table column definitions (required) |
variant | "default" | "minimal" | "striped" | "default" | Visual style variant |
size | "default" | "compact" | "default" | Table density |
limit | number | - | Limit displayed rows |
pageSize | number | 10 | Rows per page when pagination enabled |
searchPlaceholder | string | "Search..." | Placeholder text for search input |
emptyMessage | string | "No results." | Message shown when table is empty |
enableSorting | boolean | false | Enable column sorting |
enableFiltering | boolean | false | Enable global search/filter |
enablePagination | boolean | false | Enable pagination |
enableRowSelection | boolean | false | Enable row selection with checkboxes |
onRowClick | (row: TData) => void | - | Callback when row is clicked |
showToolbar | boolean | true | Show toolbar area |
toolbarActions | ReactNode | - | Custom actions in toolbar |
className | string | - | Additional CSS classes for table container |
classNames | object | - | CSS classes for specific parts (wrapper, toolbar, table, pagination) |
On This Page
Basic UsageVariantsStriped VariantMinimal VariantSortingRow ActionsAll Features CombinedColumn HelperscreateSelectColumn()createSortableColumn(accessorKey, label)createImageColumn(accessorKey, label, nameAccessorKey?)createActionsColumn(renderActions)createBadgeColumn(accessorKey, label, getBadgeVariant?)createDateColumn(accessorKey, label, formatOptions?)createCurrencyColumn(accessorKey, label, currency?)createNumberColumn(accessorKey, label, formatOptions?)Props ReferenceTableCollection