Table
A configurable data table backed by an ArcGIS Feature Service layer, with sorting, pagination, per-column renderers (text, badge, status, progress, actions), tone rules, and row actions.
At a glance
| Type key | table-card |
| Default size | 6 × 10 (min 3 × 4) |
| Data source | A Feature Service layer |
| Emits | — |
| Receives | filter (from a Map's map:extent-change) |
| Source | src/widgets/widgets/table-card/ |
Configuration
Table
| Field | Type | Default | Purpose |
|---|---|---|---|
subtitle | string | "Table" | Heading above the table. |
showSubtitle | boolean | true | Show/hide the subtitle bar. |
featureServiceId | string? | — | Feature Service item id. |
featureServiceTitle | string? | — | Display title of the service. |
featureLayerId | number? | — | Sub-layer id within the service. |
featureLayerName | string? | — | Display name of the sub-layer. |
filterClauses | clause[] | [] | Attribute filter applied to the data source. Each clause is field operator operand; clauses join left-to-right with AND/OR into a SQL where. |
maxRecords | number | 250 | Maximum number of features fetched from the service (1–2000). The server may impose a lower limit. |
sortFields | SortField[] | [] | Server-side ordering applied to the query, in precedence order. Each is a field + direction (asc/desc). |
editingEnabled | boolean | false | Allow in-cell editing that writes back to the Feature Service. Only selectable when the layer supports updates. |
editableFields | string[] | [] | Field names that can be edited in the table. A field is editable only if it is in this list and the layer marks it editable. |
columns | TableColumn[] | [] | Column definitions (see below). |
rows | TableRowData[] | [] | Row data: id + a cells key→value map. |
sortable | boolean | true | Master toggle for header-click sorting. |
showCount | boolean | true | Show the row-count badge. |
striped | boolean | false | Zebra-stripe rows. |
paginate | boolean | false | Split rows across pages. |
pageSize | number | 10 | Rows per page when paginating. |
actions | string[] | [] | Enabled row actions from the row-actions registry. |
Columns
Each TableColumn has:
| Field | Type | Default | Purpose |
|---|---|---|---|
key | string | — | Field name in the row cells. |
label | string? | — | Header label (falls back to the FS field alias). |
renderer | "text" | "badge" | "status" | "progress" | "actions" | "text" | Cell render mode. |
visible | boolean | true | Show/hide the column. |
sortable | boolean | true | Allow header-click sort. |
align | "left" | "center" | "right" | "left" | Cell alignment. |
tone | StatusTone? | — | Fallback color for badge/status cells. |
toneRules | ToneRule[] | [] | Value→tone rules (equals/gte/lte; first match wins). |
format | ValueFormat? | — | Optional display formatting for numeric text cells. |
The optional format object is shared with the Indicator
widget — it scales/formats numbers (decimal places, thousands grouping,
standard/compact notation, a unit multiplier, and prefix/suffix) or renders
epoch values as dates (date style and optional time). The prefix/suffix fields
include an insert symbol palette for superscripts (m²), subscripts (CO₂),
degrees, units, fractions, and currency. Formatting applies only to numeric
values in text columns.
Config panel
- Data — pick the Feature Service and sub-layer (a feature Layer or a Table), then edit columns (visibility, renderer, sort, tone, tone rules, and — for text columns — a per-column number/date Format via the hash button) and choose row actions. The selected Feature Service shows a preview card (thumbnail, title, summary, and an open-in-portal link); see Picking an ArcGIS data source. A Filter section under the layer picker limits the table to features matching a SQL expression you build clause by clause (field, operator, and a value or another field), joined with AND/OR. An Inline editing section lets you turn on in-cell editing and pick which fields are editable (see Inline editing below).
- Appearance — toggle the subtitle (and edit its text), sorting, the count badge, striping, and pagination (with a page-size stepper).
Cross-widget actions
The Table receives a filter action carrying a MapExtentPayload. Wire a
Map's map:extent-change to this table to narrow its rows to
the features in the map's current extent.
The Table also emits a table:row-select action. In the config drawer's
Actions section, wire Zoom, Pan, and/or Flash to a
Map or 3D Scene on the same view.
Selecting a row then acts on that map for the row's feature: Zoom frames it
(point features use a fixed padding scale so the map never snaps to its deepest
level), Pan recenters without changing the zoom, and Flash briefly
pulses a highlight on the feature to draw the eye to it. The effects
are independent and can target the same map; Zoom takes precedence over
Pan when both are enabled, while Flash runs alongside either. The flash
draws a solid core on the feature itself with a soft, borderless pulse that
radiates off it — a point flashes from its center, while a polygon or line's
pulse extends outward off its edge. It repeats a few times then clears itself,
respects the OS reduced-motion setting (falling back to a single static
highlight), and a new selection replaces any in-flight flash so highlights never
pile up. When at least one Flash target
is wired, a Flash appearance panel appears with controls for the highlight's
Color, Size (small / medium / large), number of Flashes (1–5), and
Speed (slow / normal / fast — the duration of each pulse, so the total time
is flashes × speed); these travel with the row-select payload so the
connected map renders the pulse exactly as configured. Feature geometry is only
fetched once a row-select action is wired, so unconnected tables pay nothing
extra. The
navigation is purely geometric — the table and map need not share the same
layer; the row's coordinates drive view.goTo, and the flash traces the
feature's true outline (polygon/line) when available, otherwise a point marker
or its bounding box.
Inline editing
When inline editing is enabled, double-clicking an editable cell opens an
inline editor; pressing Enter saves the change and Escape cancels.
Edits are written straight to the live Feature Service via applyEdits, so
there is no draft or sandbox — saved values are immediately persisted.
- Enabling — the Inline editing toggle in the config drawer's Data
section is only available when the chosen layer supports updates
(
supportsUpdate). For read-only layers the toggle is disabled with a tooltip explaining why. - Choosing fields — with editing on, a checklist shows every field with a select-all / clear control. Fields the layer marks read-only appear disabled with a tooltip; only checked, layer-editable fields become editable in the table.
- Per-type editors — the editor matches the field type: a text input for strings, a number input (honoring range-domain min/max) for numbers, a themed date picker for date fields, a true/false dropdown for booleans, and a dropdown of allowed values for coded-value domains.
- Optimistic updates — the new value shows immediately. If the server rejects the edit, the cell reverts to its previous value and is briefly outlined in red with the error in its tooltip.
- Coexists with row select — a single click still selects a row (for wired zoom/pan); a double-click enters edit mode.
Notable behavior
- The live Feature Service schema is the source of truth for columns; config only carries per-column preferences. Added, removed, or renamed fields are reflected automatically.
- Rows are fetched live and re-queried when the wired map extent changes.
- Maximum records caps how many features the query returns (default 250).
- Sort orders the query server-side (
orderByFields) before the rows arrive; this is independent of clickable header sorting, which re-orders the fetched rows in the browser. - The optional attribute Filter is combined with the map-extent filter (both must match).
- Fields with a coded-value domain display the human-readable label (e.g.
"In Process") rather than the stored code (e.g.
IN_PROCESS). The underlying code is still what gets saved when editing. - The
progressrenderer expects numeric values in the 0–100 range. - Per-column
formatapplies only to numeric values intextcolumns; other renderers and non-numeric values are shown unformatted.