---
id: table-mechanics
class: b2
sourced: 2026-07-12
source: "b2b-ux-patterns ch.10"
license: open
---
# Pass: table mechanics

**Inputs:** per index surface — `revisitedWithIntent`, `sharedViewScope` (personal | team), `wideObject`, `heavyDailyUse`, `groupBySegment`, `crossCuttingHealthNumbers`, `gridEditable`, `bulkVerbs`, `rowActions`, `hasStatusField`, `viewerRelationships`, `largeDataset`, `listLength` (paginated | infinite | virtualized), `financialRecordKeeping`, `sharedMutableList`, `exportNeeded`.
**Owns:** `requiredMechanics`, `clarifications`.
**Output artifact:** the parts list every index-family archetype (browse, queue, grid) assembles — saved views, column management, sticky chrome, grouping, in-table editing, bulk and row affordances, scannability, viewer-relative decoration, list-length strategy, real-time behavior, and export — while the archetype decides which parts appear and the success metric.

## The rule

Tables render **f(data, viewer)** — the same rows are decorated differently per viewer — and which row actions exist is a function of object state and role, never a fixed toolbar. The machinery below is shared across browse, queue, and grid; each archetype assembles it differently.

**View state.** A **saved view** is a named, persistent object — filter + sort + columns + grouping + view-type — with an owner, a sharing scope, pinnability, and an optional default flag, for any index a user visits more than once with the same intent; distinguish personal (private workspace) from team (governed shared lens) from day one, because retrofitting governance onto ungoverned shared views is painful. Wide objects need **column management** (show/hide, drag-reorder, resize, freeze) with the identity column frozen left, and **sticky chrome** (pinned header on vertical scroll, pinned totals footer when grouped). Heavy daily users get a **density toggle** (compact/comfortable, wrap-vs-truncate).

**Aggregation lives in the table, not only on analytics pages.** When the natural reading is "by segment" (pipeline by stage, tickets by assignee), use **grouping with per-group and grand-total summary rows**. **Stat cards above the table** are the complement, not a substitute: totals *of the visible segments* belong in the table via grouping; rates, trends, and cross-cutting health numbers belong in stat cards.

**Editing and acting on rows.** In the grid archetype the table is the primary write surface: **inline cell editing** with type-aware editors (dropdown, date picker, user picker, checkbox), Tab/Enter/arrow traversal, optimistic commit; and **range operations** (rectangular select, copy/paste, drag-fill). Per-cell editability is decided by field-level access and the field's declarations — the same column is editable for one viewer, static for another. Bulk work gets **row checkboxes with a floating action bar** carrying the legal batch verbs, and keeps two semantics distinct: **select-visible** (this page) versus **select-all-matching** the filter (offered explicitly, "Select all 1,204 matching") — the first must never masquerade as the second — with **per-row partial-failure** reporting, never a blanket success. Rows carry **hover actions** (2–3 highest-frequency verbs) and an **overflow/context menu** (the full legal set for that row's state).

**Scannability and viewer decoration.** **Conditional formatting and status chips** are the pre-attentive layer — color-coded badges, priority icons, SLA-countdown colors, progress bars — rendering the state machine consistently everywhere the record appears; never encode with color alone, always pair with text or an icon. The index also carries **viewer-relative decoration** joined from the viewer's own relationships: mine, watched, unread/new, assigned-to-me (the default operational lens).

**List length, real-time, and export.** The **list-length strategy** is a deliberate choice that silently dictates selection semantics, exportability, and jump-to-position: pagination (stable, addressable — right for financial/record-keeping lists), infinite scroll (fluid — right for feeds and triage), or virtualization (the grid's default). Whatever the strategy, export-all and select-all operate on the *filtered set*, not the loaded window. Shared lists mutate under the user: never reflow under the cursor — new/changed records arrive behind an **"N new records" pill**, others' edits get a **fading soft highlight**, and scroll position and selection survive updates. **View-aware export** respects active filters, visible columns, and sort, with large exports as background jobs and scheduled recurring delivery — extraction is a security-relevant, audit-logged verb. When a large dataset's list-length strategy is undeclared, selection and export semantics are undecidable: clarify.

```json decision-table
{"pass": "table-mechanics", "rows": [
  {"when": {"revisitedWithIntent": true}, "then": {"requiredMechanics": {"mustInclude": ["saved-views-first-class"]}}, "reason": "revisited-index-earns-saved-views"},
  {"when": {"sharedViewScope": "team"}, "then": {"requiredMechanics": {"mustInclude": ["personal-vs-team-view-scope", "view-sharing-governance"]}}, "reason": "shared-views-are-governed-lenses"},
  {"when": {"wideObject": true}, "then": {"requiredMechanics": {"mustInclude": ["column-management", "frozen-identity-column", "sticky-header-chrome"]}}, "reason": "wide-objects-need-column-control"},
  {"when": {"heavyDailyUse": true}, "then": {"requiredMechanics": {"mustInclude": ["density-toggle"]}}, "reason": "daily-users-trade-whitespace-for-rows"},
  {"when": {"groupBySegment": true}, "then": {"requiredMechanics": {"mustInclude": ["grouping-with-summary-rows"]}}, "reason": "by-segment-reading-groups-in-table"},
  {"when": {"crossCuttingHealthNumbers": true}, "then": {"requiredMechanics": {"mustInclude": ["stat-cards-above-table"]}}, "reason": "rates-and-trends-are-stat-cards"},
  {"when": {"gridEditable": true}, "then": {"requiredMechanics": {"mustInclude": ["inline-cell-edit", "type-aware-editors", "range-operations-fill"]}}, "reason": "grid-is-the-write-surface"},
  {"when": {"bulkVerbs": true}, "then": {"requiredMechanics": {"mustInclude": ["bulk-selection-floating-bar", "select-all-matching-distinct-from-visible", "per-row-partial-failure-report"], "mustNotInclude": ["visible-masquerades-as-all", "blanket-success-report"]}}, "reason": "bulk-keeps-visible-and-all-distinct"},
  {"when": {"rowActions": true}, "then": {"requiredMechanics": {"mustInclude": ["hover-actions", "overflow-context-menu"]}}, "reason": "common-actions-without-a-round-trip"},
  {"when": {"hasStatusField": true}, "then": {"requiredMechanics": {"mustInclude": ["conditional-formatting-status-chips"], "mustNotInclude": ["color-alone-encoding"]}}, "reason": "pre-attentive-never-color-alone"},
  {"when": {"viewerRelationships": true}, "then": {"requiredMechanics": {"mustInclude": ["viewer-relative-decoration", "unread-new-markers"]}}, "reason": "index-renders-f-data-viewer"},
  {"when": {"listLength": "paginated"}, "then": {"requiredMechanics": {"mustInclude": ["addressable-pages", "select-all-on-page"]}}, "reason": "pagination-is-stable-and-addressable"},
  {"when": {"listLength": "virtualized"}, "then": {"requiredMechanics": {"mustInclude": ["windowed-virtualization"]}}, "reason": "virtualization-scrolls-large-sets"},
  {"when": {"financialRecordKeeping": true}, "then": {"requiredMechanics": {"mustInclude": ["addressable-pages"], "mustNotInclude": ["infinite-scroll-for-records"]}}, "reason": "record-keeping-wants-stable-pages"},
  {"when": {"sharedMutableList": true}, "then": {"requiredMechanics": {"mustInclude": ["n-new-records-pill", "others-edit-soft-highlight", "preserve-scroll-and-selection"], "mustNotInclude": ["reflow-under-cursor"]}}, "reason": "never-reflow-a-shared-list-under-the-user"},
  {"when": {"exportNeeded": true}, "then": {"requiredMechanics": {"mustInclude": ["view-aware-export", "export-operates-on-filtered-set", "background-job-large-export", "export-audit-logged"]}}, "reason": "export-is-a-security-relevant-verb"},
  {"when": {"largeDataset": true, "listLength": "__absent__"}, "then": {"clarifications": ["list-length-strategy-unspecified"]}, "reason": "selection-and-export-semantics-need-a-strategy"}
]}
```
