Skip to main content
CYPEX Documentation
Support
v2.0.0 Latest stable release View changelog ->
Various Referencegenerated

Table

Display data in a table grid

Technical id
default_table
Default size
12 × 6 cells
Translation keys
createButtonLabel

A data table with search, sorting, filters, optional row selection, foreign-key label resolution, and row/create actions.

When to use

  • Presenting large relational datasets, data logs, or multi-attribute list rows in a structured grid layout.
  • Providing interactive tabular views complete with sorting priorities, row selection states, foreign key display mappings, and dynamic filtering tree builders.
  • Offering full CRUD operational tables with built-in row actions (Edit, Details, Delete) and a dedicated record creation button.
  • Use Table when the page must browse many records from a query/view and users need scanning, sorting, filtering, pagination, or row-level actions.
  • Use Table for list pages, work queues, back-office administration, approval inboxes, catalogs, and search results where each row represents one business record.
  • Use Table when the page consumer may need to define runtime filters from the UI, not only fixed filters defined by the page builder.
  • Use Table when a create flow, details flow, edit flow, or delete flow should stay close to the data list.

What you need

A useful table requires a valid dataSource.viewName, and it becomes much more reliable when the source also exposes a stable identifier field. References are optional but strongly recommended whenever the source contains foreign IDs that should be rendered as readable names. Column behavior is split across the table itself and its header/body child elements: the table owns source/filter/selection/paging/action scaffolding, while each column is defined by paired child elements in the header and body slots.

  • List-shaped data with many rows and a stable identifier column.

  • Queries/views whose fields have meaningful labels and data types, so filterable columns and generated columns are understandable.

  • Datasets that benefit from sort order, pagination, incremental search, and user-defined filtering.

  • Datasets with foreign keys that can be resolved through references into display names.

  • Records that may expose row metadata such as canUpdate, canDelete, or workflow state.

  • A valid source view/query is required before the table can load rows and before most editor dropdowns can offer meaningful options.

  • Prefer a stable identifier column via dataSource.identifierName so row selection, row actions, and navigation can reliably target one record.

  • If the source returns foreign IDs such as airline_id, define references so body columns can resolve readable values such as airline_name.

  • If the table participates in workflow or guarded row actions, ensure the dataset and metadata support permission-aware actions and optional state rendering.

Examples

  • A user list with auto-refresh, company-name references instead of raw IDs, multi-row selection, and row actions.
  • An operations table of flight logs where airline_id resolves to airline_name through a reference view.
  • Reference-heavy datasets where the source query returns IDs but the UI should display human-readable names from referenced views.
  • Selection dialogs where the user must pick one row or multiple rows and another element consumes elements..selected.
  • CRUD index pages that expose a top-level Create button and row-level actions for details, edit, and delete flows.
  • Operational dashboards where a list refreshes on an interval and users need a quick simple filter plus a richer advanced filter.

Avoid

  • Squeezing a primary list into a narrow layout block, which creates severe horizontal scroll friction and truncates toolbar utility controls.
  • Configuring foreign reference tables without mapping identifier IDs to display names (e.g. leaving raw numeric airline_id visible instead of mapping to airline_name).
  • Confusing the designer’s prebuilt ‘Filter by’ rules with the runtime end-user custom filter tool.
  • Do not use Table for a single record detail screen. Use a form or detail-oriented element when the user should focus on one object at a time.
  • Do not use Table if no valid dataSource.viewName is available. Most dependent editor options do not become meaningful until the source view is known.
  • Do not use Table to present a tiny fixed dataset with no filtering, sorting, or actions if a simpler display element communicates the information more clearly.
  • Do not keep foreign-key IDs visible to end users when a readable referenced label is available. Prefer references plus body-column expressions that resolve names.
  • Do not enable row selection unless another part of the page or workflow actually consumes the selected row or rows.
  • Do not hide core identifying columns and also omit references, because users can lose the ability to understand what each row represents.

Use instead

  • Form — Prefer a form when the page focuses on creating, editing, or reviewing one record rather than scanning many rows.
  • Data Display — Prefer data display cards or KPI elements when the page should summarize a few values instead of showing a record grid.
  • List — Prefer a list when each row needs a richer card-style layout rather than a dense multi-column grid.

Pairs well with

  • Table Header Cell — The only element type the header slot accepts. Each header cell is paired with a body element to form one column, and owns that column’s field, label, alignment, width, and sortable flag.
  • Internal Link Button — Common row action used to implement details or edit navigation inside the Actions column.
  • Delete Button — Built-in row delete action commonly hosted in the Actions column and usually guarded by row metadata.
  • Button Group — Hosts row action elements in the table body when the Actions column is enabled.

Editor properties

Configure these in the Application Designer property panel. Group headings mirror the editor where possible. Data Source is where the element gets its rows or field binding (a view/query, a connector operation, or a parent form field). References appear only for view-backed sources and map foreign-key ID columns to readable labels from another view.

Data Source

Defines the backing source query/view and the important row identity/state fields. This is the controlling section: most other table options depend on it.

View NamerequiredTextInside `dataSource`
Database view that supplies rows or form data.
Good to know
  • Choose the business view that represents one row per record.
  • Changing the source after columns exist may require regenerating or revisiting columns, filters, references, and sorting.
Avoid
  • Do not point the table at a source whose fields no longer match existing columns or filters.
Default: none
Identifier NameoptionalTextInside `dataSource`
Primary-key field used to load a single record (edit/detail).
Good to know
  • Treat this as mandatory in practice whenever row actions or row selection matter.
Default: none
State Column NameoptionalTextInside `dataSource`
Optional workflow/state field used when rows carry state semantics. This is the closest schema match to the product wording ‘Workflow Column Name’.
Default: none
References

Maps source fields that store foreign IDs to another query/view and its identifying field, so body expressions can display meaningful referenced values instead of raw IDs.

ReferencesoptionalKey-value mapInside `dataSource`
Reference map keyed by source field name. Each entry points to a target view/query and its identifying field so the table can resolve foreign-key rows.
Good to know
  • Use this when the source contains foreign IDs and the UI should show human-readable values.
  • The reference definition identifies how to fetch the referenced row, but body column expressions decide which referenced field is shown.
Avoid
  • Do not expect the reference config itself to declare the final display field shown in the table body.
Example Reference-driven body expressions often look like: props.references["airline_id"] ? props.references["airline_id"]["airline_id"] : null props.references["airline_id"] ? props.references["airline_id"]["airline_name"] : null
Default: none
Selection

Controls whether rows are selectable, whether one row must always remain selected, and whether selection is single or multiple.

Can Select RowoptionalYes / no
Allows the user to select a single table row.
Good to know
  • Enable only if some downstream behavior consumes the selected row.
Default: none
First Row SelectedoptionalYes / no
Keeps one row selected by default by selecting the first row after load. Only meaningful when row selection is enabled.
Good to know
  • Useful when another panel should always have a current record context.
Avoid
  • Avoid for destructive or sensitive workflows where an implicit initial selection may confuse the user.
Default: none
Can Select Multiple RowsoptionalYes / no
Allows multi-row selection in the table.
Good to know
  • Use when batch operations or multi-pick flows are required.
Avoid
  • Do not enable multi-select if the surrounding workflow only understands one current row.
Default: false
Columns

The visible column list is built from header/body child elements. Use this section to think in terms of column structure, generated columns, edit-column behavior, and per-column visibility.

HiddenoptionalList of Not set (null)
Tracks hidden-state expressions for columns. Use to hide columns without deleting their structure.
Good to know
  • Prefer hiding secondary or technical fields while keeping essential identifiers or labels visible.
Default: none
Default rows per page

Sets the initial page size and the available page-size choices shown to the runtime user.

Default Rows per PageoptionalNumber
Initial page size used when the table loads.
Choices
  • 10
  • 25 — Balanced default for most CRUD lists.
  • 50
  • 100
  • 1000 — Very large page size; use carefully.
Avoid
  • Avoid very large defaults on expensive queries or narrow screens unless there is a strong business reason.
Default: none
Rows per PageoptionalList of Number
Set of page-size options available to the runtime user. Leave unset to offer the platform defaults.
Choices
  • 10
  • 25
  • 50
  • 100
  • 1000
Default: none
Default sort

Defines the initial sort order applied when the table loads, before the runtime user changes sorting interactively.

Default SortoptionalList of Settings group
Ordered list of default sort clauses. Earlier entries have higher priority and later entries act as tie-breakers.
Good to know
  • Use stable, business-meaningful ordering so the first page is predictable.
Avoid
  • Do not rely on implicit database order for important business lists.
Example [{ fieldName: "status", asc: true, hidden: true }, { fieldName: "created_at", asc: false, hidden: true }]
Default: none
Advanced

Controls background refresh polling. Use only when rows should update without a manual refresh.

IntervaloptionalNumber
Automatic refresh interval in seconds. A value of 0 disables polling.
Choices
  • 0 — No automatic refresh.
  • 5
  • 10
  • 20
  • 30
  • 45
  • 60
Avoid
  • Do not poll aggressively for static lists or expensive queries.
Default: none
Simple Filter

Controls the lightweight text search input shown above the table and which fields participate in that search.

Hide Simple FilteroptionalYes / no
Hides the simple search input shown above the table.
Good to know
  • When enabled, simpleFilter is cleared by the editor UI.
Default: none
Simple FilteroptionalList of Settings group
Defines which source fields are searched by the top simple filter input.
Good to know
  • Choose fields users naturally expect to search by, such as names, codes, emails, or identifiers.
  • The simple search is disabled at runtime while an advanced filter is active.
Avoid
  • Do not add too many weakly related fields, or search results become noisy and hard to explain.
Default: none
Full Text SearchoptionalYes / no
Enables full-text search behavior for the table when supported by the source.
Default: none
Filter by

Builder-authored filter logic. This is separate from the runtime user's own filter dialog and supports both visual rule building and expression authoring.

Fixed FilteroptionalCustom expression or combinator + filters
Builder-defined filter tree that applies to the table data. Supports a visual builder and an expression mode.
Good to know
  • Use fixedFilter to encode permanent business constraints or page-context rules.
Example { "combinator": "AND", "filters": [ { "field": "first_name", "operator": "eq", "value": elements.default_autocomplete_input_3798e406.value } ] }
Default: none
Elements FilteroptionalList of Settings group
Visual-builder filter rules that usually depend on page elements or selector-driven values.
Default: none
Elements Filter CombinatoroptionalOne of: AND, OR
Combinator used to join visual-builder rules.
Choices
  • AND
  • OR
Default: none
Allowed filter

Defines which columns the runtime page consumer may use in the table's own filter UI, and which operators are available for each allowed field.

FieldsrequiredList of Settings groupInside `filter`
Allowed fields for the runtime user’s filter dialog, including each field’s label, input type, and operator list.
Good to know
  • Use this to constrain what the page consumer may filter on from the table UI.
  • Operator sets are generated from source field types and can differ by field.
Example Common generated operators by type include text: ["eq", "ilike", "is_null", "is_not_null"], uuid: ["eq", "neq", "in", "is_null", "is_not_null"], boolean: ["is_true", "is_false", "is_null", "is_not_null"], and number/date/time-like fields: ["eq", "lt", "gt", "is_null", "is_not_null"].
Default: []
Create a New Record Button

Controls the top-level Create button shown near the simple filter, including enablement, label, target page, and visual styling.

Create ButtonoptionalSettings group
Configuration for create Button.
Default: {"enabled":false,"linkTo":{"pageId":"","params":{}}}
Connector IDrequiredText
Installed connector that provides external data or actions.
Default: none
InputoptionalKey-value map
Configuration for input.
Default: none
Operation KeyrequiredText
Connector operation invoked by this element or action.
Default: none
SourcerequiredOne of: connector
Configuration for source.
Choices
  • connector
Default: none
Identifier NameoptionalText
Primary-key field used to load a single record (edit/detail).
Good to know
  • Treat this as mandatory in practice whenever row actions or row selection matter.
Default: none
SourceoptionalOne of: view
Configuration for source.
Choices
  • view
Default: none
Identifier NamerequiredText
Primary-key field used to load a single record (edit/detail).
Good to know
  • Treat this as mandatory in practice whenever row actions or row selection matter.
Default: none
View NamerequiredText
Database view that supplies rows or form data.
Good to know
  • Choose the business view that represents one row per record.
  • Changing the source after columns exist may require regenerating or revisiting columns, filters, references, and sorting.
Avoid
  • Do not point the table at a source whose fields no longer match existing columns or filters.
Default: none
InputrequiredSettings group
Configuration for input.
Default: none
LabelrequiredText
Configuration for label.
Default: none
NamerequiredText
Configuration for name.
Default: none
OperatorsrequiredList of Text
Configuration for operators.
Default: none
TyperequiredOne of: text, uuid, number, numberHighPrecision, dateTime, date, time, json, boolean, fallback, geo, interval
Discriminator selecting which configuration variant applies.
Choices
  • text
  • uuid
  • number
  • numberHighPrecision
  • dateTime
  • date
  • time
  • json
  • boolean
  • fallback
  • geo
  • interval
Default: none
CombinatorrequiredOne of: AND, OR
Configuration for combinator.
Choices
  • AND
  • OR
Default: none
FiltersrequiredList of Not set (null)
Configuration for filters.
Default: none
FieldrequiredText
Configuration for field.
Default: none
OperatorrequiredText
Configuration for operator.
Default: none
SelectoroptionalText
Configuration for selector.
Default: none
ValuerequiredStructured JSON
Configuration for value.
Default: none
FieldrequiredText
Configuration for field.
Default: none
OperatorrequiredText
Configuration for operator.
Default: none
SelectoroptionalText
Configuration for selector.
Default: none
ValuerequiredStructured JSON
Configuration for value.
Default: none
AscrequiredYes / no
Configuration for asc.
Default: none
Field NamerequiredText
Configuration for field Name.
Default: none
HiddenrequiredYes / no
Tracks hidden-state expressions for columns. Use to hide columns without deleting their structure.
Good to know
  • Prefer hiding secondary or technical fields while keeping essential identifiers or labels visible.
Default: none
Is ArrayrequiredYes / no
Configuration for is Array.
Default: none
NamerequiredText
Configuration for name.
Default: none
TyperequiredOne of: number, text
Discriminator selecting which configuration variant applies.
Choices
  • number
  • text
Default: none

Inside createButton: (createButton)

ColoroptionalOne of: primary, secondary, success, error, warning, info, default, lighter, disabled, white, black (or not set)
Visual color of the Create button. Can be a literal or an expression.
Choices
  • primary
  • secondary
  • success
  • error
  • warning
  • info
  • default
  • lighter
  • disabled
  • white
  • black
Good to know
  • Prefer primary for the page’s main create action so it reads as the dominant control.
Default: none
DisabledoptionalCustom expression (yes/no)
When true, the control cannot be edited.
Example false
Default: none
EnabledrequiredYes / no or Custom expression (yes/no)
Controls whether the top Create button is available. Can be a boolean or an expression.
Avoid
  • Do not show a Create button that navigates nowhere or opens a page the user cannot complete.
Default: false
IconoptionalText
Configuration for icon.
Default: none
Is IconoptionalYes / no
When false, the button shows label plus icon. When true, the control is rendered as icon-only.
Default: none
Link TorequiredSettings group
In-app navigation target (page and parameters).
Default: {"pageId":"","params":{}}
SizeoptionalOne of: small, medium, large
Size of the Create button.
Choices
  • small
  • medium
  • large
Default: none
VariantoptionalOne of: outlined, contained
Variant of the Create button.
Choices
  • outlined
  • contained
Default: none
Page IDrequiredText
Target page id in the application menu.
Default: none
ParamsrequiredKey-value map
Query parameters passed to the target page.
Default: {}

Sizing

  • Minimum size: 4 × 4 grid cells (width × height).
  • Default size when dropped on a page: 12 × 6.
  • Shrink below the default only for a secondary or embedded table, such as a picker inside a modal. A primary business list needs the full width to avoid truncating columns and the toolbar.

Translatable labels

  • createButtonLabel — Label shown on the table-level Create button next to the simple filter area.

Accessibility

Tables should preserve clear column labels, obvious row focus/selection states, and understandable action labels. Filtering, paging, and create actions should remain operable without relying only on visual cues.

  • Ensure row selection and row actions are reachable by keyboard when enabled.
  • Do not rely on hover-only affordances for important actions.
  • Keep filter and create controls reachable before dense table content.
  • Column labels should remain meaningful because they carry most of the structure for assistive technologies.
  • Icon-only create or row-action buttons need accessible labels that communicate the action clearly.

Values you can read in expressions

Other parts of your app can read live values from this element in custom expressions:

elements.myTable.<property>

loading boolean True while data is loading from the server. elements.myTable.loading

When Disable a button or hide a summary while rows are still arriving, so the page does not act on a half-loaded table.

data Array<object> The rows currently loaded into the table. elements.myTable.data.length

When The rows on the current page only, not the whole result set. Use it to derive a count or feed a chart placed beside the table; for a total across all pages query the view instead.

references null Related records loaded with the main row. elements.myTable.references
params object Query parameters sent with the data request. elements.myTable.params
loadingParams object Query parameters used for the request that is currently loading. elements.myTable.loadingParams
offset number Index of the first row shown on the current page. elements.myTable.offset
limit number Maximum number of rows loaded per page. elements.myTable.limit
order Array<object> Active sort order as a list of columns and directions. elements.myTable.order
orderIndexed Record<string, object> Active sort order keyed by column name. elements.myTable.orderIndexed
error string Error message when the last operation failed. elements.myTable.error
nextFilter object Filter that will be applied to the next data request. elements.myTable.nextFilter
nextPageAvailable boolean True when more rows can be loaded after the current page. elements.myTable.nextPageAvailable
searchInputValue string Current text typed into the search box. elements.myTable.searchInputValue

When Echo what the user typed into the table's search box, for example in a heading that reports what is being filtered.

metadata object Additional server metadata for the current result set. elements.myTable.metadata
selected object Currently selected row(s) in the table. elements.myTable.selected.identifier

When The main way to drive a detail panel from a table. Requires 'Can Select Row' to be switched on — with selection off this value is unavailable. Read `.identifier` for the key and `.row` for the whole record; with multi-select also `.keys` and `.rows`.

To use one of these, open the property you want to drive on the other element, switch it to expression mode in the Expression Editor, and enter:

1
elements.myTable.selected

Replace myTable with this element’s unique id. Select the element in Application Designer and copy the id chip at the top of the right-hand property panel.

Child slots

This container accepts nested elements in these slots:

slotaccepts
headerTable Header Cell
bodyany element

Nesting overview

graph TD
  root["default_table"]
  root --> header["header slot"]
  root --> body["body slot"]

Where you can place it

Drag this element into one of these containers:

Placement notes

  • Grid (content slot) — Most primary list pages place the table directly in a grid and give it the dominant width on the page.
  • Tabs (content slot) — Use inside tabs when the list is one subsection of a broader detail or administration workflow.
  • Modal Dialog (content slot) — Works as a picker inside a modal, but reduce visible columns and keep selection behavior explicit.
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
{
  "config": {
    "dataSource": {
      "source": "connector",
      "connectorId": "my_connector",
      "operationKey": "list_items",
      "identifierName": "identifierName",
      "input": {
        "exampleKey": "@@expression:'value'"
      }
    },
    "filter": {
      "fields": [
        {
          "name": "name",
          "label": "Name",
          "operators": [
            "operators"
          ],
          "input": {
            "type": "text"
          }
        }
      ]
    }
  }
}
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
{
  "config": {
    "dataSource": {
      "source": "connector",
      "connectorId": "my_connector",
      "operationKey": "list_items",
      "identifierName": "identifierName",
      "input": {
        "exampleKey": "@@expression:'value'"
      }
    },
    "filter": {
      "fields": [
        {
          "name": "name",
          "label": "Name",
          "operators": [
            "operators"
          ],
          "input": {
            "type": "text"
          }
        }
      ]
    },
    "fixedFilter": {
      "combinator": "AND",
      "filters": [
        {
          "field": "field",
          "operator": "operator",
          "value": {},
          "selector": "selector"
        }
      ]
    },
    "elementsFilter": [
      {
        "field": "field",
        "operator": "operator",
        "value": {},
        "selector": "selector"
      }
    ],
    "elementsFilterCombinator": "AND",
    "defaultRowsPerPage": 0,
    "rowsPerPage": [
      0
    ],
    "defaultSort": [
      {
        "fieldName": "fieldName",
        "asc": false,
        "hidden": false
      }
    ],
    "simpleFilter": [
      {
        "name": "name",
        "type": "number",
        "isArray": false
      }
    ],
    "hideSimpleFilter": false,
    "fullTextSearch": false,
    "interval": 0,
    "canSelectRow": false,
    "firstRowSelected": false,
    "canSelectMultipleRows": false,
    "hidden": [
      "@@expression:'value'"
    ],
    "createButton": {
      "enabled": false,
      "linkTo": {
        "pageId": "overview",
        "params": {
          "exampleKey": "@@expression:'value'"
        }
      },
      "color": "primary",
      "size": "small",
      "icon": "icon",
      "disabled": "@@expression:true",
      "variant": "outlined",
      "isIcon": false
    }
  },
  "children": {
    "header": [
      {
        "type": "default_table_header_cell",
        "config": {
          "label": "Title"
        }
      }
    ],
    "body": [
      {
        "type": "default_action_button",
        "config": {
          "label": "Open"
        }
      }
    ]
  }
}

Ready-made setups

Primary list page with simple search, advanced filtering, create action, and row-level management actions.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
{
  "config": {
    "dataSource": {
      "viewName": "v_records",
      "identifierName": "id"
    },
    "filter": {
      "fields": []
    },
    "defaultRowsPerPage": 25,
    "rowsPerPage": [
      10,
      25,
      50,
      100,
      1000
    ],
    "simpleFilter": [
      {
        "name": "name",
        "type": "text",
        "isArray": false
      },
      {
        "name": "code",
        "type": "text",
        "isArray": false
      }
    ],
    "createButton": {
      "enabled": true,
      "linkTo": {
        "pageId": "record_create_page",
        "params": {}
      },
      "color": "primary",
      "size": "medium",
      "variant": "contained",
      "isIcon": false
    }
  }
}

List where source rows contain IDs but displayed columns should use referenced names.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
{
  "config": {
    "dataSource": {
      "viewName": "v_flights",
      "identifierName": "flight_id",
      "references": {
        "airline_id": {
          "viewName": "v_airlines",
          "identifierName": "airline_id"
        }
      }
    },
    "filter": {
      "fields": []
    },
    "defaultRowsPerPage": 25
  }
}

Table embedded in a chooser flow where one current row should always be available.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
{
  "config": {
    "dataSource": {
      "viewName": "v_lookup_items",
      "identifierName": "id"
    },
    "filter": {
      "fields": []
    },
    "canSelectRow": true,
    "firstRowSelected": true,
    "canSelectMultipleRows": false,
    "hideSimpleFilter": false
  }
}