You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
feat(spec): declare editMode?: 'modal' | 'page' on the object document (#11408) (#12208)
Maintainer ruling 2026-08-24 (declare — #10144 declare-or-rule-out family):
objectui's shipped runtime reads objectDef.editMode for record-edit routing
while the spec's strict parse rejected the key with unrecognized_keys. The
object document now declares it beside the other display hints; values
outside the enum fail as a located value error at editMode. Accept-set
widening; consumer-side retirement of ObjectSchemaClientExtensions.editMode
is a release-gated objectui follow-up per the recorded ruling.
Claude-Session: https://claude.ai/code/session_01NDGG54XF5gbTLdQzCtnaVV
Co-authored-by: Claude <noreply@anthropic.com>
Copy file name to clipboardExpand all lines: content/docs/references/data/object.mdx
+1Lines changed: 1 addition & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -136,6 +136,7 @@ const result = ApiMethod.parse(data);
136
136
|**titleFormat**|`string \| { dialect: Enum<'cel' \| 'cron' \| 'template'>; source?: string; ast?: any; meta?: object }`| optional |[DEPRECATED → nameField (ADR-0079)] Render-only title template; the server cannot return or query it, and an explicit nameField now takes precedence. Migrate a single-field title to nameField, a composite to a formula field designated as nameField. |
137
137
|**highlightFields**|`string[]`| optional |[ADR-0085] Ordered most-important fields; first entry wins where only one fits. Drives default columns, cards, previews, detail highlight strip. Renamed from compactLayout. |
138
138
|**stageField**|`string \| false`| optional |[ADR-0085] Lifecycle stage field (linear/ordered), or false to declare the status field non-linear and suppress stage heuristics. Absent = heuristic detection allowed. |
139
+
|**editMode**|`Enum<'modal' \| 'page'>`| optional | Edit-interaction intent for records of this object: 'modal' opens the edit form as a dialog over the current view; 'page' navigates to a dedicated full-page edit route. Absent = the renderer picks its own default (objectui defaults to modal). Cross-renderer intent, not pixel styling (#11408, #10144 family). |
|**searchableFields**|`string[]`| optional | Fields the `$search` query matches against (ADR-0061). Canonical default for the record picker, list quick-search and global search; views may narrow it. When unset, search auto-defaults to the name/title field plus short-text fields. Entries must name a STORED column: a virtual `formula` field is computed on read and materializes no column, so searching it can never match and it is refused (#6674) — mirror the value onto a stored text field and declare that. |
"note": "objectui record-edit routing: app-shell recordFormNavigation branches on editMode !== 'page' and AppContent handleEdit routes modal form vs dedicated /record/:id/edit route. Declared by the #11408 ruling (#10144 declare-or-rule-out family)."
stageField: z.union([z.string(),z.literal(false)]).optional().describe('[ADR-0085] Lifecycle stage field (linear/ordered), or false to declare the status field non-linear and suppress stage heuristics. Absent = heuristic detection allowed.'),
2075
2075
2076
+
/**
2077
+
* Cross-renderer EDIT-INTERACTION intent: whether a record of this object is
2078
+
* edited in a modal dialog over the current view (`'modal'`) or on a
2079
+
* dedicated full-page edit route (`'page'`). Like the other hints in this
2080
+
* block it is an intent about the record, not pixel styling — any renderer
2081
+
* can honour it. Absent = the renderer chooses its own default (objectui's
2082
+
* shipped runtime treats anything but `'page'` as modal:
2083
+
* `recordFormNavigation.ts` branches on `editMode !== 'page'`, and
2084
+
* `AppContent`'s `handleEdit` dispatcher routes on it).
2085
+
*
2086
+
* Declared here by the #11408 maintainer ruling (the measured residue of the
2087
+
* #10144 declare-or-rule-out census): objectui had published the key to
2088
+
* authors (CHANGELOG + live runtime read) while this strict parse rejected
2089
+
* it. objectui's `ObjectSchemaClientExtensions.editMode` mirror retires in a
2090
+
* release-gated follow-up and the spec derivation carries it from then on.
2091
+
*/
2092
+
editMode: z.enum(['modal','page']).optional().describe("Edit-interaction intent for records of this object: 'modal' opens the edit form as a dialog over the current view; 'page' navigates to a dedicated full-page edit route. Absent = the renderer picks its own default (objectui defaults to modal). Cross-renderer intent, not pixel styling (#11408, #10144 family)."),
0 commit comments