App exports and live connections
App Builder can eject an editable React Component surface or download Svelte, Vue and Solid source. These are one-way exports. Later changes to the original App document do not update the…
App exports and live connections
App Builder can eject an editable React Component surface or download Svelte, Vue and Solid source. These are one-way exports. Later changes to the original App document do not update the downloaded source or the ejected layout.
| Output | Retained content and behavior | Connection requirements |
|---|---|---|
| React Component | Supported layout, pages, conditions and actions become editable JSX. Compiled Grid Views and layouts containing saved Views use the shared runtime with editable document data. | Runs inside Grid with the declared bindings and enabled Component trust policy. Saved Views continue to follow their model source. |
| Ordinary Svelte, Vue or Solid component | Supported layout, pages, conditions, table controls and action definitions become editable framework source. | Supply a connected GridClient as grid; install the target framework. Solid styles are supplied as a source comment for import into the application. |
| Framework archive with compiled or saved Views | Includes the shared Grid View runtime and the captured View definitions. | Use the archive and its documented client/host bindings. An isolated source file is insufficient. |
Downloadable components read live model values; they do not contain the model's current rows, calculations, files, credentials or a copy of the native runtime. Keep the authoritative model available and configure access through the host. Exporting does not grant capabilities or recipient permission. Unsupported elements are refused at export admission rather than silently dropped. The static design-kit preview uses representative sample values and is not a live export or retained-data snapshot.
Changing live connections
Ordinary framework exports rebind scalar and row subscriptions when the grid
prop changes. They release the old subscriptions and discard late callbacks
from that connection. Inputs write to the current client. Unmounting releases
the current subscriptions. The embedding application owns each GridClient
and its transport lifetime; the exported component does not dispose a client
shared with other views.
Changing the connection replaces the data source. It does not copy records, replay pending writes, or transfer an operation into the replacement model. An action started before a switch remains associated with the original connection even if the host switches away and then returns to that same client.
Jobs and connectors
An ordinary framework component with job or connector buttons also accepts an
app host object. The host must provide the matching operation, preserving the
existing model-binding method signatures:
app.runJob(name, payload);
app.callConnector(name, undefined, payload);
The host returns a Promise that resolves when the requested action succeeds and rejects on failure; a synchronous successful return is also supported. The exported button passes the authored JSON object without dropping nested fields or reserved keys. Invalid JSON and non-object payloads refuse export.
While an action is pending, a second click on that button starts no second operation. Missing host operations and rejected actions show a local error and do not write success feedback or navigate. A rejected host action can be retried explicitly; inspect the native outcome if its failure is uncertain.
An authored feedback binding requires the same input revision receipt lane as other write actions. The component checks this capability before launching the job or connector, and waits for a matching committed feedback receipt before navigation. A button without feedback needs its host action hook and any authored navigation capability. Missing write-only feedback values can be materialized through the connected transport once at action ingress; unresolved values stop the action before launch.
If the external action completes but feedback or navigation fails, the button
shows that partial result and Continue without repeating action. In that
mounted component and original connection, continuing retries only the unfinished
feedback or navigation. It never repeats the completed external action. A
connection change refuses continuation and directs the user to review the
original outcome. An authored success route requires the original app host's
route(path) function before the action starts. A void return acknowledges only
dispatch; a returned Promise is awaited and its rejection leaves the partial
result visible. Internal page state changes only after that dispatch/completion
and an owner check. This progress is local to the mounted component; remounting
or reopening does not provide durable job deduplication.
Changing the connection while an operation is pending prevents its completion from writing success feedback or navigating in another connection, including a switch away and back to the same client. Unmounting also prevents those follow-up effects. These controls do not cancel an already accepted native job or connector request. Review its outcome in the original model before starting another operation.
Input and formula actions
Set, increment, decrement, append-row, route-with-write and Submit actions use
the connected client's existing transport rather than the void SDK setters.
Input actions require inputCommitReceipts and commitInputs(writes, { receipt: true }). Each write carries the current expected revision and its
compatible type tag. Success requires exactly the submitted receipt membership
and a ready advanced revision. Assignments require the matching decoded value
and tag; DateInput's explicit reset acknowledges the restored declared default.
A host lacking this capability fails before any input is written.
Submit runs its authored writes in order, followed by feedback and navigation. It preflights every required input/formula capability before starting. This is an ordered sequence, not a transaction: an earlier operation can succeed before a later one fails. The local error shows that partial completion. Missing or invalid receipts report an uncertain save; inspect the model before retrying. The button shows pending/error state and suppresses duplicate submission. Failure retains displayed input values and does not navigate or reset fields. Connection changes and unmount stop subsequent operations and success effects.
Formula actions use transport.setFormula(symbol, source) and require a Promise
for host completion. A void result cannot acknowledge completion and stops the
sequence with an uncertain outcome. This seam supplies no formula revision
receipt or publication receipt. A committed job/connector feedback message
acknowledges that input revision; it does not strengthen the native action or
publication contract.
Editing values and files
Number, text and multiline fields retain a local draft while you type. Blur, Enter or Save commits a valid draft; multiline fields use Ctrl/Command+Enter. Escape or Use current value discards it. Failed saves keep the entered text and show a local error. A newer edit survives completion of an older pending save. Numbers preserve percentage scale and compatible currency/unit/refinement tags; blank or incomplete numbers are never silently written as zero. Authored required, minimum, maximum and step constraints apply before mutation.
Toggle (checkbox/switch), Select, SegmentedControl (radio), Slider and DateInput save a changed choice immediately through the same acknowledged input lane. They show Saving or Saved and keep a failed choice visible. If you change a control while its earlier save is pending, the newest choice stays local; Save commits it after that earlier save finishes. Use current value discards the local choice. Reapply draft explicitly accepts a new connection or revision before another save. Missing receipt support never falls back to a void setter.
Select and radio controls retain the authored option strings. Sliders enforce bounds and step; dates enforce yyyy-mm-dd, required and date bounds before mutation. Compatible boolean, numeric, string and native date tags survive saves. DateInput retains compiler-authored date/datetime metadata, or an observed date tag within its current connection, including after a blank clear. Canonical date/datetime-tagged strings use the existing native Date carrier at InputWrite ingress. Optional clear submits null to restore the declared input default, which can be nonblank. Its receipt acknowledges that restored default. Required dates cannot be cleared. Legacy metadata-free String-backed dates retain String semantics; a previous connection's observed date hint never moves to a new owner. A choice made before the input revision loads must be reapplied after it loads.
A draft captures its connection and revision. If the connection or value
changes, it must be explicitly reapplied to the current model or discarded.
Submit's @current uses the current typed draft, waits for an already pending
field save, and stops when that save fails. Fields still save individually;
the ordinary Form container does not stage an atomic transaction.
Tabs and Accordion
Bound Tabs and Accordion select through the same receipt-backed choice lane. The visible panel follows the acknowledged model selection. While a save is pending, the proposed label appears separately as Pending choice. A newer choice waits for explicit Save selection after the outstanding save finishes. Failure keeps the current panel visible and exposes Save selection, Use current selection and Reapply selection. Connection/revision conflicts require explicit reapply. Scoped row bindings are read-only.
Tabs expose tablist/tab/tabpanel roles, selected state and a single keyboard tab stop. Unmodified Left/Right arrows, Home and End move focus and select an authored tab; modified, composing and already-handled keys do not start a write. Inactive panels are hidden. Unknown or non-text model selections show a local error and no panel; they do not silently choose the first tab. Accordion headers expose expanded state. Collapsing a section writes its authored empty-string closed state, preserving String semantics and its compatible tag. It does not reset the input to its declared default.
Bound Modal, Drawer and Menu open state accepts Boolean model values. Non-Boolean values show an error and remain closed. Toggle, backdrop and close operations require the same matching input receipts; missing support never uses a void setter. Pending Open/Close intent, Save intent, Use current value and Reapply intent remain available when the panel is closed. While open, recovery sits inside the panel, above its backdrop and within its keyboard focus scope. An opposite intent during a pending write waits for explicit Save intent after that write finishes. Connection and revision changes require explicit recovery.
Unscoped writable overlays give focus to their opened panel. Modal and Drawer
expose dialog semantics and contain keyboard Tab movement within the panel;
dismissible: false disables backdrop/Escape dismissal while keeping the close
button. Menu ArrowDown/Up from a closed trigger opens at its first/last control;
inside the panel, unmodified arrows, Home and End move among visible controls.
Text edits keep their own arrows and Escape behavior. Composition, modified and
already-handled keys do not start a panel write. An acknowledged close restores
only a visible invoker from the same connection, while a Menu closed by focus
leaving preserves the destination. Switching owners or unmounting cancels
scheduled focus and removes panel handlers. This selected focus behavior is not
installed for overlays inside scoped repeaters; scoped row bindings are
read-only. Repeated global Boolean bindings retain writes without per-instance
focus ownership. Keyboard behavior and receipts do not provide full visual or
assistive-technology acceptance for arbitrary authored content or UI skins.
File inputs keep the existing 5 MB data URL contract. Read and save failures remain visible. A read that finishes after a connection or input revision change cannot write into the replacement value. Clear file also requires an acknowledged input write. Unmounting fences late read completion; it does not cancel a native write already accepted by the original host. The downloaded component contains no retained attachment bytes.
See the canonical action example and input review example and the broader surface contracts.
Selecting records
Ordinary exported Table and Detail use exact string, number or boolean selection
identities: numeric 1 and string "1" are different keys. Default, #index and
#zeroIndex selection retain each row's original loaded-source position through
search, sorting, row limits and display paging. Index identities still depend on
source order; an authored stable field such as selectValue: "id" is suitable
when records need lasting identity.
Click or Enter/Space on a selectable row starts a receipt-backed selection save. Pending or failed selection stays available for Save selection, Use current selection and explicit Reapply selection after owner/revision conflicts. Table's selected row and Detail follow the connected model value, while the local pending choice is disclosed as awaiting save. A missing scalar row identity is refused. This writes the selection binding; it does not create, edit or delete source records. Table data and local display paging remain limited to loaded rows and the authored row limit.
Page navigation
Svelte, Vue and Solid Nav exports honor Include home and the authored tabs, pills or list appearance. Selected styles are emitted only when those navigation variants are used. Excluding home removes the actual home page even when it is not first in the page list. Active-page indication and routing follow the current live connection.
Native record forms
Native record forms select
recordEditor: true on a native Table in a version-2 App document. The shared
renderer supplies create, edit and delete forms. React, Vue, Svelte and Solid
carriers use the same host-provided appRecords service. Exporting does not grant
native table permissions. A host without that service, read-only context,
ordinary legacy renderer, range, local array or derived view refuses editing.
Sandbox package transports without an explicit native record capability remain
unsupported; there is no scalar setter fallback.
Start with a new empty authored native table and explicitly Enable versioned record editing. Existing governed owners and populated-table migration are refused. Admission selects the existing durable record owner in the same model database; its native IDs, field/rule validation, versions, tombstones and command receipts own writes. Once admitted, schema changes and ordinary table mutation remain subject to that owner's guards. This is not an enterprise workflow approval or a general table migration tool. Geometry and attachment editing require their separate native workflows.
Edit record reads the current native version; Save/Delete submits exactly that expected version under the signed account. Failed validation or a stale version retains the draft. Discard and reopen the latest record before applying again. Successful acknowledgement refreshes the existing paged/sorted query. Forms admit at most 64 columns, with 4096-character editable fields and a 24 KiB command budget checked before dispatch. The selected row may have moved or been deleted; it is never recreated from a stale displayed row.
A lost reply retains the original command and draft. Inspect original record receipt reads that exact command's receipt without resubmitting it. A confirmed receipt completes the form; confirmed absence permits a new explicit save. At most four uncertain commands are retained across view remounts in the current process, isolated by backend/account, model, partition and instance. This is not browser-reload persistence. Reopening a model reads durable native records; the host does not automatically replay previous edits. Each form owns its labels, navigation guard and return focus.