Table Collection

PreviousNext

A powerful data table component with sorting, filtering, pagination, and row actions

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.

NameEmailRoleStatus
Olivia Martinolivia.martin@email.comGroup FacilitatorActive
Jackson Leejackson.lee@email.comMemberActive
Isabella Nguyenisabella.nguyen@email.comProgramme FacilitatorAway
William Kimwilliam.kim@email.comCoordinatorActive
Sofia Davissofia.davis@email.comMemberInactive

Variants

Striped Variant

Alternating row backgrounds for improved readability.

IDDescriptionDateAmount
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.

IDDescriptionDateAmount
TXN-001Subscription payment2024-01-15
$500.00
TXN-002Plan renewal2024-01-16
$29.00
TXN-003Sponsorship credit2024-01-17
-$150.00
TXN-004Programme enrolment2024-01-18
$89.99
TXN-005Processing fee2024-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.

NameEmailRoleActions
Olivia Martinolivia.martin@email.comGroup Facilitator
Jackson Leejackson.lee@email.comMember
Isabella Nguyenisabella.nguyen@email.comProgramme Facilitator
William Kimwilliam.kim@email.comCoordinator
Sofia Davissofia.davis@email.comMember

All Features Combined

A fully-featured table with sorting, filtering, pagination, row selection, images, badges, and toolbar actions.

ProgrammeCategoryFeeStatusActions
ER
Exodus Recovery Skills
Programme
$1,500.00
Open
V
Vantage
Programme
$1,500.00
Open
R
Resound
Programme
$1,200.00
Limited
0 of 5 row(s) selected.
Page 1 of 2

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

PropTypeDefaultDescription
dataTData[]-Array of data to display (required)
columnsColumnDef<TData>[]-TanStack Table column definitions (required)
variant"default" | "minimal" | "striped""default"Visual style variant
size"default" | "compact""default"Table density
limitnumber-Limit displayed rows
pageSizenumber10Rows per page when pagination enabled
searchPlaceholderstring"Search..."Placeholder text for search input
emptyMessagestring"No results."Message shown when table is empty
enableSortingbooleanfalseEnable column sorting
enableFilteringbooleanfalseEnable global search/filter
enablePaginationbooleanfalseEnable pagination
enableRowSelectionbooleanfalseEnable row selection with checkboxes
onRowClick(row: TData) => void-Callback when row is clicked
showToolbarbooleantrueShow toolbar area
toolbarActionsReactNode-Custom actions in toolbar
classNamestring-Additional CSS classes for table container
classNamesobject-CSS classes for specific parts (wrapper, toolbar, table, pagination)