Data table
The one table behind the Global Store, Orders, the audit log and every other list in the admin: sort, filter, save a view, select in bulk, and read money in three currencies at a glance.
Built on shadcn Table with TanStack Table. On a phone the same rows become a list, never a squeezed table.
Global Store, table view
Live: sort a column, filter by status, search, change density, tick rows to bring up the bulk bar.
Global Store214
| Actions | |||||||
|---|---|---|---|---|---|---|---|
HS 64033Sherry Flannel | Draft | v1 | £340€390$430 | Today 09:42 | |||
HS 30612Irish Linen | Draft | v1 | £690€795$870 | Yesterday | |||
HS 81045Crystal Springs | Available | v4 | £1,150€1,320$1,450 | 2 Oct | |||
VBC 218.1003Perennial | Available | v2v3 ready | £780€895$985 | 29 Sep | |||
VBC 403.0118Revenge | Available | v3 | £1,390€1,595$1,750 | 24 Sep | |||
VBC 150.2201Ceremony | Available | v2 | £1,480€1,700$1,860 | 18 Sep | |||
HS 92201Moorland Tweed | Retired | v5 | £260€299$330 | 11 Aug | |||
No products match these filtersNothing in the Global Store matches this search and status. | |||||||
TableDataTable (TanStack Table v8)getSortedRowModelgetFilteredRowModelrowSelectionUses.dt.dt-wrap--row--row-th--r-cardSortable header
One click sorts descending, the next ascending. Columns that cannot sort show plain text.
Not sorted
Descending: newest or highest first, the default on date and money
Ascending: A to Z, oldest or lowest first
shadcn Table · TableHeadTanStack column.getToggleSortingHandler()aria-sort.dt-sort--motion-hoverFilter bar
Search first, status chips with counts, then the facets behind Filters.
Search
Entity type filter ignored: it must be at most 100 characters.
Status chip with count
Applied filters
Each applied facet becomes a removable pill. Counts on the status chips always add up to the total.
Filters popover, open. Facets are the Global Store facets: fabric code, collection, price range by currency, colour, composition, weight and blend.
shadcn InputToggleGroupPopoverSelectBadgeTanStack column.setFilterValue().dt-fchip.dt-fpop--motion-pop-inSaved views
A view stores search, status, facets, sort and density under a name. Personal to each staff member.
Changed view
Filters were changed on a saved view: the blue dot appears and the view can be updated, saved as new or reset.
shadcn TabsDropdownMenuTanStack table.getState().dt-view.dt-mod--infoDensity
Two settings only. Compact hides second lines (handle, other currencies); nothing else moves.
| Product | Status | Recommended price | Updated | |
|---|---|---|---|---|
| Available | £1,150€1,320$1,450 | 2 Oct | ||
| Available | £780€895$985 | 29 Sep | ||
| Available | £1,390€1,595$1,750 | 24 Sep |
| Product | Status | Recommended price | Updated | |
|---|---|---|---|---|
| Available | £1,150€1,320$1,450 | 2 Oct | ||
| Available | £780€895$985 | 29 Sep | ||
| Available | £1,390€1,595$1,750 | 24 Sep |
shadcn ToggleGroupdata-density--row--row-compact--motion-sheet-inSticky header, on the audit log
Scroll inside the table: the header stays. Rows open to show before and after.
| Expand | Timestamp | Who | Action | Entity | Request |
|---|---|---|---|---|---|
| 2026-10-11 14:20:07 | staff: Mei | update | master_product / 3f2c9a1e… | req_01JA7Q3K8MZC4W | |
Before{
"handle": "navy-birdseye-two-piece",
"status": "draft",
"version": 3,
"recommended_price": {
"GBP": 1150, "EUR": 1320, "USD": 1450
}
} After{
"handle": "navy-birdseye-two-piece",
"status": "available",
"version": 4,
"recommended_price": {
"GBP": 1150, "EUR": 1320, "USD": 1450
}
} | |||||
| 2026-10-11 14:02:51 | staff: Mei | publish | website_release / v3 | req_01JA7P2D9TQ6XR | |
Before{
"handle": "navy-birdseye-two-piece",
"status": "draft",
"version": 3,
"recommended_price": {
"GBP": 1150, "EUR": 1320, "USD": 1450
}
} After{
"handle": "navy-birdseye-two-piece",
"status": "available",
"version": 4,
"recommended_price": {
"GBP": 1150, "EUR": 1320, "USD": 1450
}
} | |||||
| 2026-10-11 13:47:10 | api_key: mcp-doors | update | offer_price / 8d41c0b2… | req_01JA7N8V1HJ3KD | |
Before{
"handle": "navy-birdseye-two-piece",
"status": "draft",
"version": 3,
"recommended_price": {
"GBP": 1150, "EUR": 1320, "USD": 1450
}
} After{
"handle": "navy-birdseye-two-piece",
"status": "available",
"version": 4,
"recommended_price": {
"GBP": 1150, "EUR": 1320, "USD": 1450
}
} | |||||
| 2026-10-11 12:31:44 | system: cloth-mirror | sync | cloth / HS 81045 | req_01JA7J5R4WB2NE | |
Before{
"handle": "navy-birdseye-two-piece",
"status": "draft",
"version": 3,
"recommended_price": {
"GBP": 1150, "EUR": 1320, "USD": 1450
}
} After{
"handle": "navy-birdseye-two-piece",
"status": "available",
"version": 4,
"recommended_price": {
"GBP": 1150, "EUR": 1320, "USD": 1450
}
} | |||||
| 2026-10-11 11:15:02 | staff: Tom | create | master_product / c97e2f10… | req_01JA7E9K2PM7SV | |
Before{
"handle": "navy-birdseye-two-piece",
"status": "draft",
"version": 3,
"recommended_price": {
"GBP": 1150, "EUR": 1320, "USD": 1450
}
} After{
"handle": "navy-birdseye-two-piece",
"status": "available",
"version": 4,
"recommended_price": {
"GBP": 1150, "EUR": 1320, "USD": 1450
}
} | |||||
| 2026-10-11 10:58:39 | staff: Tom | update | master_product / c97e2f10… | req_01JA7D7Y6CG1QT | |
Before{
"handle": "navy-birdseye-two-piece",
"status": "draft",
"version": 3,
"recommended_price": {
"GBP": 1150, "EUR": 1320, "USD": 1450
}
} After{
"handle": "navy-birdseye-two-piece",
"status": "available",
"version": 4,
"recommended_price": {
"GBP": 1150, "EUR": 1320, "USD": 1450
}
} | |||||
| 2026-10-10 17:40:12 | staff: Priya | update | brand_settings / rj-clothing | req_01JA5B3N8ZF4LA | |
Before{
"handle": "navy-birdseye-two-piece",
"status": "draft",
"version": 3,
"recommended_price": {
"GBP": 1150, "EUR": 1320, "USD": 1450
}
} After{
"handle": "navy-birdseye-two-piece",
"status": "available",
"version": 4,
"recommended_price": {
"GBP": 1150, "EUR": 1320, "USD": 1450
}
} | |||||
| 2026-10-10 16:05:55 | staff: Tom | create | master_product / 41b8e6d3… | req_01JA58Q2XKV9HM | |
Before{
"handle": "navy-birdseye-two-piece",
"status": "draft",
"version": 3,
"recommended_price": {
"GBP": 1150, "EUR": 1320, "USD": 1450
}
} After{
"handle": "navy-birdseye-two-piece",
"status": "available",
"version": 4,
"recommended_price": {
"GBP": 1150, "EUR": 1320, "USD": 1450
}
} | |||||
| 2026-10-10 15:22:30 | api_key: studio-sync | revoke | api_key / key_live_…7c2a | req_01JA56M4TRS8PB | |
Before{
"handle": "navy-birdseye-two-piece",
"status": "draft",
"version": 3,
"recommended_price": {
"GBP": 1150, "EUR": 1320, "USD": 1450
}
} After{
"handle": "navy-birdseye-two-piece",
"status": "available",
"version": 4,
"recommended_price": {
"GBP": 1150, "EUR": 1320, "USD": 1450
}
} | |||||
| 2026-10-10 11:09:48 | staff: Mei | update | master_product / e2a07d94… | req_01JA4R7H5NW3YC | |
Before{
"handle": "navy-birdseye-two-piece",
"status": "draft",
"version": 3,
"recommended_price": {
"GBP": 1150, "EUR": 1320, "USD": 1450
}
} After{
"handle": "navy-birdseye-two-piece",
"status": "available",
"version": 4,
"recommended_price": {
"GBP": 1150, "EUR": 1320, "USD": 1450
}
} | |||||
| 2026-10-09 18:31:16 | system: cloth-mirror | sync | cloth / VBC 218.1003 | req_01JA2F1Q9DL6ZU | |
Before{
"handle": "navy-birdseye-two-piece",
"status": "draft",
"version": 3,
"recommended_price": {
"GBP": 1150, "EUR": 1320, "USD": 1450
}
} After{
"handle": "navy-birdseye-two-piece",
"status": "available",
"version": 4,
"recommended_price": {
"GBP": 1150, "EUR": 1320, "USD": 1450
}
} | |||||
| 2026-10-09 09:12:03 | staff: Priya | publish | website_release / v2 | req_01JA0X4B7GE2MJ | |
Before{
"handle": "navy-birdseye-two-piece",
"status": "draft",
"version": 3,
"recommended_price": {
"GBP": 1150, "EUR": 1320, "USD": 1450
}
} After{
"handle": "navy-birdseye-two-piece",
"status": "available",
"version": 4,
"recommended_price": {
"GBP": 1150, "EUR": 1320, "USD": 1450
}
} | |||||
shadcn TableCollapsibleTanStack getExpandedRowModelth position:sticky.dt-scroll.y.dt-json--font-codeRow and row actions
The whole row is the target for the product name; the actions sit at the right edge.
HS 81045Crystal Springs | Available | v4 | £1,150€1,320$1,450 | 2 Oct |
HS 81045Crystal Springs | Available | v4 | £1,150€1,320$1,450 | 2 Oct |
HS 81045Crystal Springs | Available | v4 | £1,150€1,320$1,450 | 2 Oct |
HS 81045Crystal Springs | Available | v4 | £1,150€1,320$1,450 | 2 Oct |
HS 30612Irish Linen | Draft | v1 | £690€795$870 | Yesterday | Saving… |
VBC 218.1003Perennial | Available | v2v3 ready | £780€895$985 | 29 Sep | |||
Status not saved. Charcoal herringbone jacket has no EUR price, so it cannot be Available. Add the price, then try again. | |||||||
Row actions
Quick edit (pencil) opens the side sheet; the menu holds the rest. Destructive items sit last, under a divider.
shadcn TableRowDropdownMenudata-state=selected.dt-ra.mi--motion-pop-inBulk select and bulk bar
Tick rows, act once. The bar is navy, like every primary action.
Header and row checkbox
Bulk bar
Rises from the bottom of the table when the first row is ticked, and leaves when the selection is cleared. Selection covers the visible page.
Global Store
Set status for many masters
My Products
Section placement
Loading
Action in progress
Variants
Backend not connected
shadcn CheckboxTanStack getToggleAllPageRowsSelectedHandlerrow.getIsSelected().dt-bulk--e-toast--motion-toast-inPagination
Numbered pages with first, last and neighbours. Counts use the same total as the status chips.
Show more
Used where people browse (Global Store gallery, My Products). Pages are for tables people work through.
shadcn PaginationTanStack getPaginationRowModeltable.setPageSize().dt-pager.dt-pgaria-current=pageColumn types
Six cell types, each with its edge cases. Money and numbers align right in tabular figures.
img · next/imageBadgeIntl.NumberFormatdate-fns · timefont-monofont-mono · Badgeshadcn TableCellBadge.dt-ph.dt-money.dt-unv.dt-ver.dt-code--font-code--warningWide table: Orders
Scroll sideways inside the table. The tick box and order number stay put; a soft edge shows content passing under.
Orders
RJ Clothing · 128 in window · 5 awaiting ERP retry
| Customer | Item | Payment | Fulfillment | ERP | Actions | ||||
|---|---|---|---|---|---|---|---|---|---|
| RJ-20418Special | A. Hartley | Navy birdseye two-piece suitHS 81045 · 2 pieces | £1,150 | Paid | In production | In syncMO-88213 | Today 14:20 | ||
| RJ-20417 | No DTC customer record | Charcoal herringbone jacketVBC 218.1003 | £780 | Paid | Awaiting | ERP failed504 · retry 2 of 5 | Today 11:02 | ||
| RJ-20415 | D. Okafor | Navy chalk-stripe three-pieceVBC 403.0118 · 3 pieces | €1,595 | Paid | Shipped | In syncMO-88190 | Yesterday | ||
| RJ-20409 | S. Brennan | Midnight mohair dinner suitVBC 150.2201 · 2 pieces | $1,860 | Paid | In production | In syncMO-88152 | 8 Oct | ||
| RJ-20398Special | R. Lindqvist | Brown glen check waistcoatHS 92201 | £260 | Refunded | — | In syncMO-88077 | 4 Oct | ||
| RJ-20391 | M. Castellano | Mid-grey flannel trousersHS 64033 | €390 | Paid | Shipped | In syncMO-88031 | 2 Oct |
TableScrollAreaTanStack columnPinning: leftUses.dt-scroll.dt-frozen .fz.fz-last--motion-hoverEmpty table
Two kinds: nothing exists yet (offer the first step), or filters hide everything (offer to clear them).
| Product | Status | Version | Recommended price | Updated |
|---|---|---|---|---|
No products yetMaster products you create here become available to every brand you grant them to. | ||||
| Product | Status | Version | Recommended price | Updated |
|---|---|---|---|---|
No products matchNothing matches “flannel” with status Retired. | ||||
| Timestamp | Who | Action | Entity | Request |
|---|---|---|---|---|
No audit rows yetChanges to this brand appear here, newest first, and are kept for a year. | ||||
| Order | Customer | Total | Placed |
|---|---|---|---|
No orders in this brand's windowRJ MTM has no orders in the last 90 days. | |||
shadcn TableRow colSpanEmpty.dt-empty.dt-empLoading skeleton
Never a blank table, never a bare “Loading…”.
First load
Real headers, skeleton cells shaped like the content they stand in for. The pulse is slow and stops under reduced motion.
| Actions | |||||||
|---|---|---|---|---|---|---|---|
Refreshing
Rows stay readable while new prices load.
HS 81045Crystal Springs | Available | v4 | £1,150€1,320$1,450 | 2 Oct | |||
VBC 218.1003Perennial | Available | v2v3 ready | £780€895$985 | 29 Sep |
shadcn Skeletonaria-busy.skel--motion-skeletonprefers-reduced-motionError, partial and not wired
Name the real cause and the next step. A table that was never read must never look empty.
| Product | Status | Version | Recommended price | Updated |
|---|---|---|---|---|
Global Store unavailableThe master product store did not answer within 10 seconds. Nothing was changed. | ||||
The ERP order read did not complete, so no rows are shown. This is not a statement that this brand has no orders.
| Order | Customer | Total | Payment | Placed |
|---|---|---|---|---|
No rows to show until the order read completes. | ||||
DTC commerce did not answer, so customer names are missing for now.
| Order | Customer | Total | Placed |
|---|---|---|---|
| RJ-20418 | Not loaded | £1,150 | Today 14:20 |
| RJ-20417 | Not loaded | £780 | Today 11:02 |
The audit read is not wired on staging. No rows are shown.
| Timestamp | Who | Action | Entity |
|---|---|---|---|
Rows appear here once the audit read is connected. | |||
shadcn Alert.dt-note.bad | .warn | .info.dt-emp.bad--destructive--not-wired