A form layout for one record, with Back, Reset, and Save in the bottom bar.
- Create, edit, or show a single database record with inputs bound to its fields.
- Provide the data context that child inputs bind to via Element Id and Field Path.
Needs a Data Source (query name). Edit and detail also need Identifier Name and Identifier Value.
- A customer profile create screen with default field values.
- An edit screen that loads one record by id, validates changes, and saves.
- Nesting forms inside forms — use a Sub Form when several related records must be edited together.
- Choosing edit or detail without an Identifier Value, which leaves the form empty.
- Leaving On Success empty on create forms when the user should navigate away or refresh related data after save.
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.
- Discriminator selecting which configuration variant applies.Choices
edit— Loads one record by identifier and lets the user change and save it.create— Empty form for inserting a new record. Supports default data and post-save actions.detail— Shows one record read-only.
Default: FormTypes.create
- Database view that supplies rows or form data.Default: none
- Primary-key field used to load a single record (edit/detail).Default: none
- Workflow state field on the bound view.Default: none
- Expression resolving the record id (often from URL query).Example
nullDefault: none
- Database view that supplies rows or form data.Default: none
Back button and post-save actions (mainly used on create forms).
- Hides the Back button in the form’s bottom bar.Default: none
- Actions run after a successful save (navigation, notifications, connectors).Default: none
- When true, removes inner padding so fields sit tighter in the layout.Default: none
- Custom expression or rule evaluated before save.Example
trueDefault: none - Optional JSON Schema used for additional field validation.Default: none
Initial field values for create forms.
- Initial field values when creating a new record.Default: none
- Minimum size: 4 × 3 grid cells (width × height).
- Default size when dropped on a page: 12 × 5.
Renders as a semantic form. Focus moves through fields in order; validation messages are associated with their inputs for screen readers.
Other parts of your app can read live values from this element in custom expressions:
elements.myForm.<property>
loadState
object
Async state of the initial load (idle, loading, success, error).
elements.myForm.loadState
saveState
object
Async state of the last save attempt.
elements.myForm.saveState
data
null
The current form values, keyed by field name.
elements.myForm.data.quantity
When Read a field the user is currently editing, before it is saved — for example to show a live total or drive a conditional container.
errors
any
Field-level validation errors after submit or blur.
elements.myForm.errors
originalData
null
Snapshot of data as loaded (before user edits).
elements.myForm.originalData
touched
Record<string | number, boolean>
Map of fields the user has interacted with.
elements.myForm.touched
hasChanges
boolean
True when any field differs from the loaded record.
elements.myForm.hasChanges
When Warn before navigating away, or only enable a Save button once something has actually been edited. True as soon as any field differs from the loaded record.
isValid
boolean
True when all validation rules pass.
elements.myForm.isValid
When Disable a Save or Submit button until every field passes validation, instead of letting the user click and receive an error.
identifier
string | number
Resolved primary-key value for the loaded record.
elements.myForm.identifier
When The primary-key value of the loaded record. Use it to filter a related table or pass a parameter to another page. Empty on a create form, since the record does not exist yet.
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:
| |
Replace myForm 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.
This container accepts nested elements in these slots:
| slot | accepts |
|---|---|
content | any element |
graph TD root["default_form"] root --> content["content slot"]
Drag this element into one of these containers:
| |