Dashboard Tables
Purpose
Plan the dashboard's data tables: where pagination/sorting/filtering execute (server vs client), how columns and row actions are structured, when virtualization is needed, and how table state stays shareable. Tables are the dashboard's workhorse — decided once, reused everywhere.
When to Use
- When the dashboard lists entities (users, orders, content, jobs) beyond trivial size.
- When an existing dashboard's tables are slow, inconsistent, or client-filtering large sets.
- Not for report visualizations (
dashboard-reporting) or the bulk-action semantics themselves (dashboard-bulk-operations).
Inputs
- Entity inventory: row counts (now and projected), fields, needed filters/sorts.
- API pagination/filter capabilities (
web-api-integration, web-server-state).
- Design-system table primitives (
web-design-system); permission scopes (dashboard-permissions).
Discovery Questions
- Realistic row counts per table — hundreds (client-side viable) or unbounded (server-side mandatory)?
- Which filters/sorts do admins actually need, and does the API support them server-side?
- Which tables feed bulk operations (row selection semantics) or exports?
- Do any views need dense/virtualized rendering (thousands of visible rows)?
Responsibilities
- Decide execution side per table: server-side pagination/sorting/filtering for unbounded data; client-side only for small, fully-loaded sets — and record the cutoff assumption.
- Define the table architecture: column definitions (accessor, header, cell, sortable?, width), row actions, empty/loading/error states, density.
- Plan URL-carried table state (page, sort, filters) so views are shareable and survive refresh (
web-routing, web-state-management).
- Plan row selection semantics for bulk operations: page-scope vs all-matching-filter scope, selection count surfacing (
dashboard-bulk-operations).
- Plan virtualization where row counts demand it; plan export hooks where required (permissioned,
dashboard-permissions).
- Evaluate the table library (headless TanStack Table is the usual candidate; design-system-native tables for simple cases) with justification.
- Keep tables accessible: real table semantics or correct ARIA grid roles, keyboard operability (
web-accessibility).
Required Workflow
- Inventory tables with sizes, filters, sorts, and bulk/export needs.
- Decide server vs client execution per table; confirm API support.
- Define the shared table architecture + URL-state conventions.
- Evaluate the library; plan virtualization/selection/export where needed.
- Record the plan; hand action semantics to
dashboard-bulk-operations.
Decision Rules
- Unbounded or growing data → server-side pagination/filtering, no exceptions "for now."
- One shared table foundation across the dashboard; per-page bespoke tables are a review flag.
- Selection across pages must be explicit ("all 1,204 matching" vs "these 25") — never ambiguous.
- Virtualize when rendering cost hurts, not preemptively everywhere.
Rules
- Server responses are the source of truth for counts/pages; the client doesn't infer totals.
- Table queries flow through
web-server-state conventions (keys include filter/sort/page).
- Exports respect the same permissions and filters as the visible table.
Anti-Patterns
- Fetching all rows and filtering client-side because the dev dataset was small.
- Table state in memory only — refresh loses the admin's filter setup.
- "Select all" silently meaning only the current page during a bulk delete.
- A different table implementation per dashboard page.
Validation Checklist
Definition of Done
A recorded table plan — per-table execution decisions, one shared architecture, URL-state and selection conventions, and a justified library choice — that every dashboard list view implements consistently.
Related Skills
dashboard-bulk-operations, dashboard-reporting, web-server-state, web-routing, web-design-system, web-accessibility, dashboard-permissions, web-performance.
Related Knowledge
../../../knowledge/ (entity model, data volumes).
Related References
../../../references/web/dashboard/ (table specs — when populated).
Context Loading Guidance
- Requires: entity/table inventory with sizes, API capabilities.
- Does not require: report/chart detail, customer-app features.
- May load:
dashboard-bulk-operations for selection→action flow; web-performance for virtualization thresholds.
- Stop when: the table plan is recorded.
Token Efficiency Guidance
One row per table: entity → size → execution side → filters/sorts → selection/export. Define the shared architecture once, not per table.
1---2name: dashboard-tables3description: Use to plan dashboard data tables — server-side vs client-side pagination/sorting/filtering by data size, column architecture, virtualization for large sets, row selection for bulk operations, URL-carried table state, and library evaluation (e.g., TanStack Table).4---56# Dashboard Tables78## Purpose910Plan the dashboard's data tables: where pagination/sorting/filtering execute (server vs client), how columns and row actions are structured, when virtualization is needed, and how table state stays shareable. Tables are the dashboard's workhorse — decided once, reused everywhere.1112## When to Use1314- When the dashboard lists entities (users, orders, content, jobs) beyond trivial size.15- When an existing dashboard's tables are slow, inconsistent, or client-filtering large sets.16- **Not** for report visualizations (`dashboard-reporting`) or the bulk-action semantics themselves (`dashboard-bulk-operations`).1718## Inputs1920- Entity inventory: row counts (now and projected), fields, needed filters/sorts.21- API pagination/filter capabilities (`web-api-integration`, `web-server-state`).22- Design-system table primitives (`web-design-system`); permission scopes (`dashboard-permissions`).2324## Discovery Questions2526- Realistic row counts per table — hundreds (client-side viable) or unbounded (server-side mandatory)?27- Which filters/sorts do admins actually need, and does the API support them server-side?28- Which tables feed bulk operations (row selection semantics) or exports?29- Do any views need dense/virtualized rendering (thousands of visible rows)?3031## Responsibilities3233- Decide **execution side per table**: server-side pagination/sorting/filtering for unbounded data; client-side only for small, fully-loaded sets — and record the cutoff assumption.34- Define the **table architecture**: column definitions (accessor, header, cell, sortable?, width), row actions, empty/loading/error states, density.35- Plan **URL-carried table state** (page, sort, filters) so views are shareable and survive refresh (`web-routing`, `web-state-management`).36- Plan **row selection** semantics for bulk operations: page-scope vs all-matching-filter scope, selection count surfacing (`dashboard-bulk-operations`).37- Plan **virtualization** where row counts demand it; plan **export** hooks where required (permissioned, `dashboard-permissions`).38- **Evaluate the table library** (headless TanStack Table is the usual candidate; design-system-native tables for simple cases) with justification.39- Keep tables accessible: real table semantics or correct ARIA grid roles, keyboard operability (`web-accessibility`).4041## Required Workflow42431. Inventory tables with sizes, filters, sorts, and bulk/export needs.442. Decide server vs client execution per table; confirm API support.453. Define the shared table architecture + URL-state conventions.464. Evaluate the library; plan virtualization/selection/export where needed.475. Record the plan; hand action semantics to `dashboard-bulk-operations`.4849## Decision Rules5051- Unbounded or growing data → server-side pagination/filtering, no exceptions "for now."52- One shared table foundation across the dashboard; per-page bespoke tables are a review flag.53- Selection across pages must be explicit ("all 1,204 matching" vs "these 25") — never ambiguous.54- Virtualize when rendering cost hurts, not preemptively everywhere.5556## Rules5758- Server responses are the source of truth for counts/pages; the client doesn't infer totals.59- Table queries flow through `web-server-state` conventions (keys include filter/sort/page).60- Exports respect the same permissions and filters as the visible table.6162## Anti-Patterns6364- Fetching all rows and filtering client-side because the dev dataset was small.65- Table state in memory only — refresh loses the admin's filter setup.66- "Select all" silently meaning only the current page during a bulk delete.67- A different table implementation per dashboard page.6869## Validation Checklist7071- [ ] Tables inventoried with realistic sizes; execution side decided per table.72- [ ] Shared column/row-action architecture defined with empty/loading/error states.73- [ ] Table state URL-carried per conventions.74- [ ] Selection semantics defined where bulk operations exist.75- [ ] Library evaluated with justification; virtualization planned where needed.76- [ ] Accessibility expectations stated for the table foundation.7778## Definition of Done7980A recorded table plan — per-table execution decisions, one shared architecture, URL-state and selection conventions, and a justified library choice — that every dashboard list view implements consistently.8182## Related Skills8384`dashboard-bulk-operations`, `dashboard-reporting`, `web-server-state`, `web-routing`, `web-design-system`, `web-accessibility`, `dashboard-permissions`, `web-performance`.8586## Related Knowledge8788`../../../knowledge/` (entity model, data volumes).8990## Related References9192`../../../references/web/dashboard/` (table specs — when populated).9394## Context Loading Guidance9596- **Requires:** entity/table inventory with sizes, API capabilities.97- **Does not require:** report/chart detail, customer-app features.98- **May load:** `dashboard-bulk-operations` for selection→action flow; `web-performance` for virtualization thresholds.99- **Stop when:** the table plan is recorded.100101## Token Efficiency Guidance102103One row per table: entity → size → execution side → filters/sorts → selection/export. Define the shared architecture once, not per table.