@object-ui/plugin-detail 17.1.0 → 17.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,398 @@
1
1
  # @object-ui/plugin-detail
2
2
 
3
+ ## 17.3.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 5af2852: The record detail page now shows a read-gated approval panel (#3461). A record in approval used to expose NOTHING about the running approval to anyone but the current pending approver — `useRecordApprovals` was consumed solely to inject the header Approve/Reject buttons, while the pending-approver list, decision progress, and the `sys_approval_action` timeline existed only in the Approval Center's drawer, a `setup`-app surface that business roles can't navigate to (and whose backing object is tenant-wide, so granting read there is over-broad). The submitter couldn't tell whom to nudge; the record's own audit history was no help either, since the engine mirrors business fields as `runAs:'system'` and decisions never enter record history. The new surface is an **Approvals tab** on the record page — a peer of Details/Related (same promotion Attachments got in objectstack#4358), emitted by `buildDefaultTabs` only when the record actually has requests, with a request-count badge and the label localizing through the tab strip's KNOWN_LABEL_DICT (审批). The tab wraps the new `record:approvals` node (`RecordApprovalsPanel`), visible to EVERY viewer who can read the record: current flow/step with the enriched flow-steps strip, server-computed decision progress (quorum tally, per-group 会签 ticks), the waiting-on chips with server-resolved names and group labels (never raw ids), one chronological action timeline merged across all of the record's requests (a multi-level flow opens one request per node), decision comments and attachments, and an inline remind button for the submitter (`viewer.is_submitter`, with an id-match fallback for older backends) that POSTs the existing `/approvals/requests/:id/remind`. The host threads its live `useRecordApprovals` read through the node so the tab and the header decision buttons never disagree; on authored pages the `record:approvals` renderer self-fetches, and an authored page that omits the node gets a bottom-of-page fallback append so the approval story is never lost to a custom layout. Copy reuses the Approval Center's `approvalsInbox.*` keys so the two surfaces can't drift; `useRecordApprovals` now exposes the full `requests` array plus `listApprovalActions` / `remindApprovalRequest`, and its `ApprovalRequestLite` carries the display enrichment (`process_label`, `step_label`, `flow_steps`, `viewer`, `round`) the single-read endpoint already sent.
8
+
9
+ ### Patch Changes
10
+
11
+ - 532cf8b: Deliver the required state to the control in the five renderers outside the object form that still painted it as an asterisk only (objectui#3299 — the same defect #3290/#3298 fixed in `form.tsx`).
12
+
13
+ Each site converges on the reference shape (`EmbeddableForm.tsx`): the control carries `aria-required={required || undefined}` and the asterisk is `aria-hidden="true"`, so assistive tech announces required once, as a state — instead of hearing a bare "asterisk" folded into the accessible name, or nothing at all.
14
+
15
+ - `@object-ui/app-shell` — `ActionParamDialog` (both the boolean row and the default branch, delivered through the real field widgets' `toDomProps` whitelist) and `CreateViewDialog` (display label, machine name, and every type-specific required-field selector).
16
+ - `@object-ui/components` — the custom `ActionParamDialog` (all five typed branches, including the Radix select trigger) and `FieldContainer`, whose existing Slot injection (`id` / `aria-describedby` / `aria-invalid`) now also injects `aria-required`, covering every consumer in one place.
17
+ - `@object-ui/plugin-detail` — `InlineCreateRelated`'s create-tab inputs.
18
+
19
+ Deliberately NOT the native `required` attribute (#3290 ruling): each of these hosts runs its own validation, and native `required` would arm the browser's constraint-validation bubble beside it. The SDUI controls that already use native `required` (`renderers/form/{input,textarea,select,checkbox}.tsx`, `basic/text-input.tsx`) are unchanged — they don't have a second validator, so their channel is already correct.
20
+
21
+ - b71fc92: Localize the last untranslated console-chrome accessible names (objectstack#5430)
22
+
23
+ Four icon-only controls still carried hardcoded English accessible names, so
24
+ under a non-English session they were the only English left in the record
25
+ chrome — and because the controls have no visible label, that literal _is_ the
26
+ control to a screen reader and to the hover tooltip.
27
+
28
+ - `page:header`'s `role="toolbar"` — now `detail.pageHeaderActions` (its `⋯`
29
+ overflow trigger eight lines below was fixed in #5407; the toolbar was missed)
30
+ - `ReactionPicker`'s `role="listbox"` popup — now `detail.emojiPicker`
31
+ - `ReactionPicker`'s per-reaction chip, which built its name by concatenation
32
+ with English pluralization baked in (`reaction${count !== 1 ? 's' : ''}`) —
33
+ now `detail.reactionCount` / `detail.reactionCountOne`
34
+ - `NavigationOverlay`'s drawer close and split-panel close — now `common.close`
35
+ (the key the rest of the console already uses) and `common.closePanel`
36
+
37
+ The pluralized label follows this repo's **two-key** convention
38
+ (`detail.relatedRecords`/`relatedRecordOne`, `lookup.recordCount`/`recordCountOne`)
39
+ rather than an i18next `_one`/`_other` pair: zh/ja/ko have no separate singular
40
+ form, so those packs would legitimately omit the `_one` half and
41
+ `all-locales-key-parity` would read that as a lost key.
42
+
43
+ All five new keys are added to all ten locale packs.
44
+
45
+ - 3889ffb: Console chrome i18n gaps (objectstack#5407).
46
+
47
+ - A dependency-gated lookup now names its controlling field by its **label**
48
+ instead of its raw API name. The sentence was localized but the interpolated
49
+ name was not, so every locale — English included — read `Select crm_account
50
+ first`. The form renderer passes a new `dependsOnLabels` widget prop (the
51
+ lookup-side counterpart of `emptyHint`, which it already resolves to labels
52
+ for the fixed-option widgets); a name the host does not cover still falls
53
+ back to itself.
54
+ - The page-header overflow trigger's `More actions` accessible name now reads
55
+ `detail.moreActions`, the same key `action:menu`'s own overflow trigger uses,
56
+ so the two cannot diverge per locale.
57
+ - The activity-feed reaction button's `Add reaction` accessible name is now a
58
+ bundle key (`detail.addReaction`, added to all ten packs).
59
+ - The "check the highlighted fields" toast joins field names with a per-locale
60
+ separator (`validation.formInvalidJoiner`) instead of a hardcoded `、`
61
+ (U+3001) — right for zh/ja by accident, wrong in English and every Latin
62
+ locale. Latin packs use `, `, CJK `、`, Arabic `، `.
63
+ - The Spanish `validation.required` / `validation.unique` templates gained
64
+ their own masculine head noun (`El campo {{field}} es obligatorio`) so the
65
+ adjective agrees for feminine field labels too — `Cuenta es obligatorio` was
66
+ ungrammatical.
67
+
68
+ - bbbde12: Behavior change — **an authored display `type` can NARROW inline editability, but never WIDEN it** (objectui#3355).
69
+
70
+ Both detail-surface editability gates (`HeaderHighlight`, the `record:highlights` strip; `DetailSection`, the details body) used to resolve ONE effective type with display precedence — `viewFieldType || objectFieldType`. An authored non-computed `type` therefore ERASED the object's `formula` / `summary` / `rollup` / `auto_number` declaration from the gate's view, and a machine-owned column became inline-editable.
71
+
72
+ The gate now reads the two types separately and takes their UNION: a field is non-editable if the authored entry type **or** the object field's type is computed. Renderer/editor selection keeps the old precedence, so nothing about the display changes — only who may write.
73
+
74
+ What flips:
75
+
76
+ - `{ name: 'supply_share', type: 'number' }` authored over an object field declared `rollup` (or `formula` / `summary` / `auto_number`) — a display override written to fix formatting — no longer offers a pencil / double-click editor. This is the shipped configuration behind objectstack-ai/objectstack#5077: a hook-maintained rollup was overwritten by hand from the header strip and stayed corrupted until an unrelated child-row touch re-fired it (downstream yinlianghui/hotcrm-heimao#61).
77
+ - Narrowing is unchanged: an authored `type: 'formula'` still locks a plain object column.
78
+ - Fields with no authored computed type over a plain object column stay editable, and the entry-level `readonly` declaration from objectui#3356 is still honored.
79
+
80
+ The object schema is authoritative about what is machine-computed; a presentation override has no business granting write access. The rule now lives in ONE shared helper, `isComputedFieldType` in `fieldEnrichment.ts` — beside `enrichDetailField`, the module both hosts already share — with the computed-type set moved there too (still re-exported as `TEXTUAL_REF_FALLBACK_TYPES`), so the strip and the body cannot drift apart again.
81
+
82
+ - 5a24ad9: Localize `RecordDetailDrawer`'s drag-resize handle (objectstack#5733)
83
+
84
+ `packages/plugin-detail/src/RecordDetailDrawer.tsx` carried a byte-identical twin
85
+ of the literal objectstack#5506 removed from `NavigationOverlay`: a
86
+ `role="separator"` drag handle on the drawer's left edge with a hardcoded
87
+ `aria-label="Resize drawer"`. #5506's sweep fenced on `packages/components`, so
88
+ this second copy survived it.
89
+
90
+ The handle has no visible label, so that string IS the control as far as a
91
+ screen reader is concerned — a zh/ja/de session got one English announcement in
92
+ an otherwise localized drawer. It is not a dormant branch either: `resizable`
93
+ defaults to `true`, and the drawer is what plugin-kanban / plugin-calendar /
94
+ plugin-gantt open on row, card and event click.
95
+
96
+ It now reads `t('common.resizeDrawer')` — deliberately the SAME key #5506 gave
97
+ the other handle (already present in all ten locale packs) rather than a new
98
+ `detail.resizeDrawer` twin, so one control rendered from two packages cannot end
99
+ up with two translations that drift apart.
100
+
101
+ `common.resizeDrawer` is also added to `DETAIL_DEFAULT_TRANSLATIONS`, the map
102
+ `createSafeTranslation` falls back to when no `I18nProvider` is mounted. Without
103
+ that entry the name would degrade to the raw key for every provider-less host —
104
+ which is the regression the accompanying no-provider test pins.
105
+
106
+ - 23018cc: `record:highlights` now honours a `readonly: true` on an authored field entry, so a header chip for a platform-owned column no longer offers inline edit. `HeaderHighlight`'s editability gate already consulted `field.readonly`, but the renderer rebuilt each entry from a fixed `{name,label,icon,type}` list and dropped `readonly` one layer before that check, so the gate could never fire from authored metadata — a hook-maintained rollup or approval-written grade could be overwritten by hand from the detail-page header strip and stayed wrong until an unrelated write re-fired the computation. `readonly` is now a declared key on `HighlightField` and on the `RecordHighlightsComponentProps.fields[]` entry union, mirroring `DetailViewField.readonly` (objectstack#5077).
107
+ - 58a00f0: Give `InlineCreateRelated`'s card-header close button an accessible name (objectui#3411 — the neighbouring defect found while implementing #3381/PR #3410, in the same file and left outside that PR's scope fence as a different class).
108
+
109
+ The button is icon-only: its sole child was a lucide `X`, with no text, `aria-label`, `aria-labelledby` or `title`. lucide-react excludes childless, a11y-prop-less icons from the accessibility tree (it defaults them to `aria-hidden="true"`), so the button had no name source at all and its computed accessible name was the empty string — a screen reader announced a nameless "button". Unlike the placeholder case in #3381 there was no browser-side fallback to soften it: the name was empty in every implementation. WCAG 4.1.2 / 2.4.6.
110
+
111
+ The fix is `aria-label="Close"` on the button, plus an explicit `aria-hidden="true"` on the icon so the intent is local rather than inherited from the icon library's default. `aria-label` rather than #3381's visually hidden `<label>` because this control has no visible copy for a label to stay in step with — the drift that ruling guarded against cannot arise here — and it matches the shape the repo's other close buttons already use (shadcn's dialog/sheet, `DashboardEditor`).
112
+
113
+ No props, spec or visible-copy change; the component's rendering is otherwise identical.
114
+
115
+ - 53811d1: Associate the label with its control at the two form surfaces where the two were never programmatically connected (objectui#3341 — found while implementing #3299/PR #3340, and deliberately left out of that PR's scope fence as a different class of defect).
116
+
117
+ `aria-required` reaching the control (#3299) only fixes the required _state_; at these two sites the control's accessible _name_ was still wrong, because the label pointed at nothing:
118
+
119
+ - `@object-ui/plugin-detail` — `InlineCreateRelated`'s create-tab fields rendered a `<label>` with no `htmlFor` beside an `<Input>` with no `id`, and the two were siblings rather than wrapper/child. The field label was unreachable for assistive tech, and clicking the label did not focus the input. The ids are namespaced with `React.useId`, because `field.name` alone is unique only within one instance and a detail page mounts one of these per related list.
120
+ - `@object-ui/components` — the custom `ActionParamDialog`'s `select` branch rendered `<Label htmlFor={param.name}>` but never put the matching `id` on its Radix `SelectTrigger`, so the reference dangled. The textarea / number / date / text branches already set `id={param.name}`; select was the only one that did not.
121
+
122
+ `SelectTrigger` renders a `<button role="combobox">`, and `button` is a labelable element, so the plain `htmlFor`/`id` pair is the correct association there — no `aria-labelledby` required. No spec change and no widget-props contract change.
123
+
124
+ - b17ce4c: Give `InlineCreateRelated`'s "Link Existing" search box a real accessible name (objectui#3381 — the neighbouring defect found while implementing #3341/PR #3380, and left out of that PR's scope fence as a different class).
125
+
126
+ The box carried a `placeholder` and nothing else: no `<label>`, no `aria-label`, no `aria-labelledby`. Its accessible name therefore fell through to the placeholder, which is the last resort in HTML-AAM and fails in two ways — the name a browser derives from it is the one thing that disappears the moment the user types, and the fallback is not implemented uniformly (`dom-accessibility-api` has no placeholder step at all, so under test the control computed to the empty string while a browser would have said "Search Contact…").
127
+
128
+ The fix is a visually hidden `<label htmlFor>` pointing at a `React.useId`-namespaced input id — the same shape #3341 left on the create tab, rather than an `aria-label`, so the accessible name stays a real label element instead of a detached string that can drift from the visible copy. The label text and the placeholder are now derived from one expression (the placeholder only adds the ellipsis), and the id uses a hyphenated `link-search` segment so it cannot collide with a create-tab field literally named `search`. The decorative magnifier is explicitly `aria-hidden` — lucide already defaults childless icons to that, but spelling it out keeps the intent local and independent of the icon library's defaults.
129
+
130
+ No props, spec or rendered-copy change: the placeholder string is byte-identical to before.
131
+
132
+ - c7fba27: `field:permission-facet-link` now registers through `withFieldCarrier` — the
133
+ repo's only raw `field:` registration bypassed the single-metadata-carrier seam
134
+ (objectui#3233), so under the SDUI path (`SchemaRenderer` passes `schema`,
135
+ never `field`) the widget read `field === undefined` and silently rendered an
136
+ anonymous facet summary (`field?.name` empty, no facet branch selected). The
137
+ form and inline-edit hosts were unaffected — they pass `field` directly, which
138
+ the carrier forwards unchanged. Fixes objectui#3307.
139
+ - 12bf669: The record discussion panel now says "loading" while it is loading, instead of
140
+ "No comments yet" (objectui#3209).
141
+
142
+ FROM: opening any record page showed the discussion/chatter panel asserting
143
+ `No comments yet` for the whole first leg of the page, then contradicting
144
+ itself when the comments appeared. TO: the panel shows the loading row until
145
+ the feed has actually answered, and only then commits to "this record has no
146
+ comments".
147
+
148
+ objectui#3205 gave `RecordActivityTimeline` the render branch that prefers a
149
+ loading row over the empty copy, and `RecordChatterPanel` already forwarded
150
+ `loading` to it in both positions — but on the chatter chain **nothing
151
+ produced the signal**, so that branch could never fire. `record:activity`
152
+ computes its own flag and was visibly fixed by #3205; chatter was not. The
153
+ four wiring points are one chain and are all closed here, because any one of
154
+ them left open still ships the empty copy to some user:
155
+
156
+ - `RecordDetailView` — the host that OWNS the feed fetch — now derives a
157
+ `feedLoading` flag from its two reads (`sys_comment` + `sys_activity`);
158
+ - `<DiscussionContextProvider loading={feedLoading}>` publishes it (the field
159
+ was already declared on `DiscussionContextValue`, and already read by
160
+ `record:activity`);
161
+ - the auto-appended `<RecordChatterPanel loading={feedLoading}>` — the panel
162
+ authored pages get when they place no discussion slot — receives it
163
+ directly;
164
+ - the `record:chatter` / `record:discussion` renderer forwards
165
+ `loading={discussion?.loading}`, so a hand-placed block is on the same
166
+ chain as the synthesized one.
167
+
168
+ The two reads run in parallel, so the flag closes over **both**: it clears on
169
+ `Promise.allSettled`, and a REJECTED read counts as an answer. A deployment
170
+ without the audit plugin 404s `sys_activity` and an object with
171
+ `enable.feeds: false` 403s `sys_comment`; neither may pin the panel in a
172
+ permanent spinner, which would be a worse bug than the one being fixed. The
173
+ flag is keyed by `object:recordId` rather than being a plain boolean, so the
174
+ first render of a record already reads as loading (no one-frame flash of the
175
+ empty state) and navigating between records cannot show the previous record's
176
+ settled answer.
177
+
178
+ No tolerance was added at the consumer. The timeline still does not guess that
179
+ "no items yet and just mounted" means loading — that guess is wrong the moment
180
+ a record genuinely has no comments, and the signal belongs to whoever owns the
181
+ fetch. Same shape as objectui#3165 / #3205: divergence converges at the
182
+ producer.
183
+
184
+ - Updated dependencies [b71fc92]
185
+ - Updated dependencies [65516ba]
186
+ - Updated dependencies [94c5b7c]
187
+ - Updated dependencies [ca0fa8f]
188
+ - Updated dependencies [3889ffb]
189
+ - Updated dependencies [7e2406a]
190
+ - Updated dependencies [4eeb932]
191
+ - Updated dependencies [5c856ec]
192
+ - Updated dependencies [68b6a28]
193
+ - Updated dependencies [0554e88]
194
+ - Updated dependencies [28b2e65]
195
+ - Updated dependencies [825bbe3]
196
+ - Updated dependencies [6195841]
197
+ - Updated dependencies [5dd0127]
198
+ - Updated dependencies [a415684]
199
+ - Updated dependencies [5af2852]
200
+ - Updated dependencies [a6ec93d]
201
+ - Updated dependencies [c7ed4c3]
202
+ - Updated dependencies [2409e1d]
203
+ - Updated dependencies [789fe3e]
204
+ - @object-ui/i18n@17.3.0
205
+
206
+ ## 17.2.0
207
+
208
+ ### Minor Changes
209
+
210
+ - a889e31: A record's approval band now shows the quorum / per-group tally the server already computes.
211
+
212
+ The showcase's `showcase_committee_quorum` node declares `behavior: 'quorum'` with
213
+ `minApprovals: 2` over three approvers, and even ships a pre-rendered
214
+ `"Committee Sign-off (2 of 3)"` label; `showcase_expense_signoff` declares
215
+ `per_group` (会签) with named manager / finance groups. On the business record
216
+ the approval band rendered none of it — the lock badge, the recall button and
217
+ the approve/reject actions were all correct, but a two-of-three committee step
218
+ looked exactly like a one-approver step. An approver could not see whether their
219
+ own click finalized the node or was one of three, which is the single fact a
220
+ quorum node exists to express (objectstack#4478).
221
+
222
+ Nothing was wrong on the wire, and nothing here papers over the server. The
223
+ framework computes `decision_progress` — `{ behavior, got, need, groups? }`,
224
+ derived from the node's own `node_config_json` snapshot, so the count a client
225
+ shows is the count the engine will enforce. **It attaches that block in
226
+ `getRequest` only**: `listRequests` deliberately skips it, because the
227
+ `sys_approval_action` tally it costs is per row and a list read may return
228
+ hundreds. The record header's `useRecordApprovals` reads
229
+ `GET /approvals/requests?object=…&recordId=…` — the list route — so the
230
+ enrichment was never in the payload it had. The hook now follows up with one
231
+ single read for the ONE pending row and folds the result onto it; a failed or
232
+ mismatched follow-up leaves the row exactly as the list sent it, so a display-only
233
+ enrichment can never take the approval panel down and no tally is ever invented.
234
+
235
+ `InlineEditProvider` carries the block through as `approvalProgress`, and the
236
+ DetailView approval band renders it beside the existing badge: a labelled
237
+ `role="progressbar"` with one tick per required approval for `quorum` /
238
+ `unanimous`, and for `per_group` a chip per group marking which have signed
239
+ (`finance 1/1` ✓, `manager 0/1`). Group names come from the flow author's own
240
+ config, so they need no locale strings; the three new label keys are added to all
241
+ ten packs. `first_response` nodes carry no `decision_progress` and are unchanged —
242
+ one decision is the whole step there, and a "1 of 1" bar would be noise.
243
+
244
+ Scored `minor` rather than `patch`: this is new observable rendering plus a new
245
+ public `approvalProgress` prop / `ApprovalProgress` type on `@object-ui/react`,
246
+ not a behavior correction inside an existing surface.
247
+
248
+ - 4a51e77: Stop declaring 14 symbols across ten packages under names `@objectstack/spec`
249
+ owns (objectui#3161, objectstack#4115 batch 7 — the long tail, one or two
250
+ entries per package). All ten packages leave the ledger, which drops from 17
251
+ collisions across 11 packages to 3 across 1.
252
+
253
+ **Renamed exports** — in every case the spec exports the same name for a
254
+ _different_ thing, so the old name was a mis-description rather than a dialect:
255
+
256
+ | package | was | now | what the spec's same-named export is |
257
+ | :------------------------- | :--------------------------------- | :--------------------------------------------------- | :----------------------------------------------------------------------------------------------------------------------------------------- |
258
+ | `@object-ui/fields` | `FieldWidgetProps` | `FieldWidgetComponentProps` | the DECLARED field-widget plugin props contract (a zod object; `field.type` is the `FieldType` enum, `readonly`/`required` carry defaults) |
259
+ | `@object-ui/layout` | `PageHeaderProps` | `PageHeaderComponentProps` | the authored `page:header` node — a zod schema of `title`, `subtitle`, an icon NAME, `breadcrumb`, `actions: string[]` |
260
+ | `@object-ui/layout` | `Page` | `PageNodeRenderer` | the authored page metadata DOCUMENT (`name`, `label`, `type`, `regions`) |
261
+ | `@object-ui/plugin-detail` | `ObjectFieldLike` | `ObjectDefFieldLike` | the i18n duck type `translateObject` walks (`help`/`description`, plus `[key: string]: any`) |
262
+ | `@object-ui/plugin-grid` | `ColumnSummaryConfig` | `ColumnSummarySetting` | the OBJECT form of `ListColumn.summary` **only** — the local one was the whole union, shorthand included |
263
+ | `@object-ui/plugin-grid` | `isMultiValueField` | `hasMultiValueShape` | the spec's classifier, which requires a def with a `type`; the local one is called with `undefined` |
264
+ | `@object-ui/collaboration` | `RealtimeConfig` | `RealtimeSubscriptionConfig` | the app's realtime DECLARATION (`enabled`, `transport`, `subscriptions[]`) |
265
+ | `@object-ui/plugin-charts` | `ChartConfig` | `ChartContainerConfig` | the authored chart document (`type`, `xAxis`, `series`, `showLegend`, …) |
266
+ | `@object-ui/plugin-form` | `FormSection` / `FormSectionProps` | `FormSectionContainer` / `FormSectionContainerProps` | the authored form-section metadata (`name`, `pane`, `visibleWhen`, `fields`) |
267
+ | `@object-ui/providers` | `Theme` | `ThemePreference` | a whole theme DOCUMENT (`name`, `label`, `colors`, `typography`) |
268
+ | `@object-ui/runner` | `App` (default export) | `RunnerApp` | the authored application metadata type **and** the `App.create()` builder |
269
+ | `@object-ui/sdui-parser` | `ValidationResult` | `ManifestValidationResult` | plugin-manifest validation (`{ valid, errors?, warnings? }`), exported from both `kernel` and `contracts` |
270
+
271
+ `ManifestValidationResult` follows the `<what was validated>Validation<Error|Result>`
272
+ convention registered on objectstack#4115 (`@object-ui/core` took
273
+ `SchemaNodeValidationResult` in batch 4). `PageHeaderComponentProps` deliberately
274
+ reuses the name `@object-ui/app-shell` already chose for its own header props in
275
+ batch 3, so one concept does not acquire two dialect names one package apart.
276
+
277
+ **Now derived from the spec instead of hand-written:**
278
+
279
+ - `@object-ui/fields` — `isFileIdToken` is re-exported from
280
+ `@objectstack/spec/data`. The local copy was character-for-character identical
281
+ to the spec's function while its comment said it "mirrors" it, so every
282
+ behaviour test passed and only reference identity could tell the two apart.
283
+ The regex is a wire decision: widening it server-side while a copy here kept
284
+ the old bound would make every new id read as "not a reference", and the
285
+ widget would submit the legacy inline blob to a backend expecting a reference.
286
+ - `@object-ui/plugin-detail` — `FeedFilterMode` is re-exported from
287
+ `@objectstack/spec/data`, in a file that already imported the sibling
288
+ `FeedItemType` from the spec.
289
+ - `@object-ui/plugin-grid` — the eleven-member aggregation union is now the
290
+ spec's `ColumnSummary` enum, so the total `Record<ColumnSummaryType, string>`
291
+ label map turns a member the spec adds into a compile error instead of a
292
+ blank footer cell. `ColumnSummarySetting` is `NonNullable<ListColumn['summary']>`,
293
+ i.e. whatever forms the spec itself accepts. `hasMultiValueShape` delegates to
294
+ the spec's `isMultiValueField` rather than re-deriving it from
295
+ `MULTI_OPTION_TYPES` / `MULTI_CAPABLE_TYPES`.
296
+ - `@object-ui/providers` — `ThemePreference` is the spec's `ThemeMode` union
297
+ plus the one legacy `'system'` spelling this provider still honours for stored
298
+ preferences, read off the schema's own `_zod` carrier so the package takes no
299
+ zod dependency.
300
+
301
+ `@objectstack/spec` moves from `devDependencies` to `dependencies` in
302
+ `@object-ui/fields` (it re-exports a runtime function) and `@object-ui/providers`
303
+ (its public `.d.ts` now references the spec).
304
+
305
+ Scored `minor`, not `major`, per this repo's fixed-group rule — objectui's major
306
+ tracks `@objectstack`, so breaking changes of our own ship as minor with the
307
+ semantics spelled out above (see AGENTS.md §版本号策略). A `major` here would carry
308
+ all 39 packages of the fixed group to `18.0.0` and off objectstack's 17.x line.
309
+
310
+ - dd06bcd: `record:activity` fetches a feed instead of rendering a permanently empty one (objectui#3165).
311
+
312
+ The block published eleven inputs — `types`, `filterMode`, `showFilterToggle`,
313
+ `limit`, `showCompleted`, `unifiedTimeline`, `showCommentInput`,
314
+ `enableMentions`, `enableReactions`, `enableThreading`,
315
+ `showSubscriptionToggle` — every one of them a filter or an affordance over a
316
+ feed that could not have content on any path. `RecordActivityRenderer` called
317
+ `useRecordContext()`, discarded the result and rendered
318
+ `<RecordActivityTimeline items={[]}>` with the empty array hard-coded; the
319
+ timeline takes `items` as a prop and never fetched; no host supplied any
320
+ (`buildDefaultPageSchema` emits `{ type: 'record:activity' }` with no props at
321
+ all). Declared, published to `sdui.manifest.json`, inert at runtime —
322
+ objectstack#4413's shape, three blocks over.
323
+
324
+ **The feed now has three sources, in precedence order.** `items` on the node
325
+ (the convention `record:history` uses for `entries`); a mounted
326
+ `DiscussionContext`, which the console's record page fills with the merged
327
+ `sys_comment` + `sys_activity` feed and the write handlers; otherwise a
328
+ **self-fetch** of `sys_activity` scoped to the bound record
329
+ (`{ object_name, record_id }`, newest first, `limit` rows per page, "Load more"
330
+ re-reading a wider window). The third path is what makes the block
331
+ drop-anywhere — hand-authored inside a `page:tabs`, with no host feeding it —
332
+ and it mirrors the read `record:history` already had. Rows map to feed items
333
+ exactly as the console's record page maps them, so both surfaces agree about
334
+ what a row is.
335
+
336
+ **The read-side inputs now filter.** `types` is an allow-list over feed item
337
+ types (unrecognised entries ignored; an all-typo list is treated as unset
338
+ rather than emptying the feed). `limit` is a page size and caps the scoped
339
+ read. `showCompleted` (spec default `false`) hides completed activities.
340
+ `unifiedTimeline: false` un-mixes field changes from the comment stream — the
341
+ panel becomes a discussion feed and field changes stay in `record:history`.
342
+ `filterMode` seeds which slice the dropdown opens on and falls back to `all`
343
+ on an unrecognised value instead of leaving a `<Select>` matching nothing.
344
+
345
+ **The write-side switches are wired to the host's handlers.**
346
+ `showCommentInput`, `enableThreading`, `enableReactions` and `enableMentions`
347
+ read `onAddComment` / `onAddReply` / `onToggleReaction` /
348
+ `mentionSuggestions` off `DiscussionContext` — the same standing
349
+ `record:discussion` has. With no host mounted the feed stays read-only and no
350
+ composer is rendered, rather than showing one that silently drops what you
351
+ type.
352
+
353
+ **`showSubscriptionToggle` is recorded as a known gap, not quietly left
354
+ looking configurable.** The bell needs a `RecordSubscription` value and
355
+ somewhere to persist it, and the platform has no record-subscription object to
356
+ read or write one from. Its input description now says `NOT IMPLEMENTED` (that
357
+ text ships to `sdui.manifest.json`, so an author meets it before writing the
358
+ prop), the docs repeat it, and a test pins it inert so the note has to be
359
+ deleted the day a backend for it lands.
360
+
361
+ `apps/console`'s record-reach probe (objectui#3149 layer 3a) asserted the old
362
+ behaviour from its `NO_RECORD_REACH` ledger in both directions; that entry is
363
+ deleted, and the probe now reports `record:activity` as responding to the bound
364
+ record.
365
+
366
+ ### Patch Changes
367
+
368
+ - 6be575c: A fetching activity feed says "loading", not "No activity recorded" (objectui#3205).
369
+
370
+ `RecordActivityTimeline` declared a `loading` prop and destructured it straight
371
+ into `_loading`, so nothing in the component ever read it. For the whole
372
+ duration of a feed fetch the panel therefore rendered the empty state — "No
373
+ activity recorded" — and then contradicted itself when the rows landed. The
374
+ empty copy is a factual claim about the record; it may only be made once the
375
+ fetch that would fill the feed has settled.
376
+
377
+ The timeline now branches on `loading` **before** the empty branch and renders a
378
+ spinner row (`role="status"`, `aria-live="polite"`) while the feed is in flight.
379
+ `collapseWhenEmpty` does not suppress it: that flag is about the empty state
380
+ ("collapse when there are no items"), and mid-fetch it is not yet known whether
381
+ there are items.
382
+
383
+ The guard is `loading && filtered.length === 0`, not `loading` alone — a refresh
384
+ or a "Load more" round-trip keeps the rows already on screen instead of blanking
385
+ them (that button carries its own spinner).
386
+
387
+ No prop or signature changed: the fix is that the declared prop is now read.
388
+ `record:activity` has computed a live `loading` since objectui#3165 (true during
389
+ its self-fetch) and `RecordChatterPanel` already forwarded it in both positions,
390
+ so the whole chain now shows a loading state end to end.
391
+
392
+ - Updated dependencies [a889e31]
393
+ - Updated dependencies [4b470b9]
394
+ - @object-ui/i18n@17.2.0
395
+
3
396
  ## 17.1.0
4
397
 
5
398
  ### Minor Changes
@@ -1 +1 @@
1
- {"version":3,"file":"DetailSection.d.ts","sourceRoot":"","sources":["../src/DetailSection.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAqB/B,OAAO,KAAK,EAAE,iBAAiB,IAAI,qBAAqB,EAAkC,MAAM,kBAAkB,CAAC;AAuBnH;;;;;;;;;;;GAWG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAmBxF;AAED,MAAM,WAAW,oBAAoB;IACnC,oDAAoD;IACpD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,mDAAmD;IACnD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,yFAAyF;IACzF,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,qBAAqB,CAAC;IAC/B,IAAI,CAAC,EAAE,GAAG,CAAC;IACX,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,8DAA8D;IAC9D,YAAY,CAAC,EAAE,GAAG,CAAC;IACnB,kDAAkD;IAClD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,uCAAuC;IACvC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,gEAAgE;IAChE,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC;IACpD;;;;;OAKG;IACH,iBAAiB,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAChD,oEAAoE;IACpE,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,6FAA6F;IAC7F,UAAU,CAAC,EAAE,GAAG,CAAC;IACjB,oEAAoE;IACpE,aAAa,CAAC,EAAE,oBAAoB,CAAC;CACtC;AAED,eAAO,MAAM,aAAa,EAAE,KAAK,CAAC,EAAE,CAAC,kBAAkB,CAibtD,CAAC"}
1
+ {"version":3,"file":"DetailSection.d.ts","sourceRoot":"","sources":["../src/DetailSection.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAqB/B,OAAO,KAAK,EAAE,iBAAiB,IAAI,qBAAqB,EAAkC,MAAM,kBAAkB,CAAC;AAuBnH;;;;;;;;;;;GAWG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAmBxF;AAED,MAAM,WAAW,oBAAoB;IACnC,oDAAoD;IACpD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,mDAAmD;IACnD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,yFAAyF;IACzF,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,qBAAqB,CAAC;IAC/B,IAAI,CAAC,EAAE,GAAG,CAAC;IACX,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,8DAA8D;IAC9D,YAAY,CAAC,EAAE,GAAG,CAAC;IACnB,kDAAkD;IAClD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,uCAAuC;IACvC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,gEAAgE;IAChE,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC;IACpD;;;;;OAKG;IACH,iBAAiB,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAChD,oEAAoE;IACpE,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,6FAA6F;IAC7F,UAAU,CAAC,EAAE,GAAG,CAAC;IACjB,oEAAoE;IACpE,aAAa,CAAC,EAAE,oBAAoB,CAAC;CACtC;AAED,eAAO,MAAM,aAAa,EAAE,KAAK,CAAC,EAAE,CAAC,kBAAkB,CAqbtD,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"DetailView.d.ts","sourceRoot":"","sources":["../src/DetailView.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAyC/B,OAAO,KAAK,EAAE,gBAAgB,EAAE,UAAU,EAA4B,MAAM,kBAAkB,CAAC;AAwF/F,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,gBAAgB,CAAC;IACzB,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB;;;;;OAKG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;;OAIG;IACH,cAAc,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACjC;;;;OAIG;IACH,SAAS,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC5B;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;;OAKG;IACH,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,KAAK,IAAI,CAAC;IACrC;;;;OAIG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;OAEG;IACH,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;CAC5C;AAED,eAAO,MAAM,UAAU,EAAE,KAAK,CAAC,EAAE,CAAC,eAAe,CA6yChD,CAAC"}
1
+ {"version":3,"file":"DetailView.d.ts","sourceRoot":"","sources":["../src/DetailView.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AA0C/B,OAAO,KAAK,EAAE,gBAAgB,EAAE,UAAU,EAA4B,MAAM,kBAAkB,CAAC;AAwF/F,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,gBAAgB,CAAC;IACzB,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB;;;;;OAKG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;;OAIG;IACH,cAAc,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACjC;;;;OAIG;IACH,SAAS,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC5B;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;;OAKG;IACH,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,KAAK,IAAI,CAAC;IACrC;;;;OAIG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;OAEG;IACH,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;CAC5C;AAED,eAAO,MAAM,UAAU,EAAE,KAAK,CAAC,EAAE,CAAC,eAAe,CAs3ChD,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"HeaderHighlight.d.ts","sourceRoot":"","sources":["../src/HeaderHighlight.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAS/B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AASvD,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,cAAc,EAAE,CAAC;IACzB,IAAI,CAAC,EAAE,GAAG,CAAC;IACX,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kDAAkD;IAClD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kDAAkD;IAClD,YAAY,CAAC,EAAE,GAAG,CAAC;IACnB,8EAA8E;IAC9E,UAAU,CAAC,EAAE,GAAG,CAAC;CAClB;AAED,eAAO,MAAM,eAAe,EAAE,KAAK,CAAC,EAAE,CAAC,oBAAoB,CAgN1D,CAAC"}
1
+ {"version":3,"file":"HeaderHighlight.d.ts","sourceRoot":"","sources":["../src/HeaderHighlight.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAS/B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AASvD,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,cAAc,EAAE,CAAC;IACzB,IAAI,CAAC,EAAE,GAAG,CAAC;IACX,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kDAAkD;IAClD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kDAAkD;IAClD,YAAY,CAAC,EAAE,GAAG,CAAC;IACnB,8EAA8E;IAC9E,UAAU,CAAC,EAAE,GAAG,CAAC;CAClB;AAED,eAAO,MAAM,eAAe,EAAE,KAAK,CAAC,EAAE,CAAC,oBAAoB,CAsN1D,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"InlineCreateRelated.d.ts","sourceRoot":"","sources":["../src/InlineCreateRelated.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAgB/B,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,CAAC;IAC/C,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,wBAAwB;IACvC,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,MAAM,EAAE,sBAAsB,EAAE,CAAC;IACjC,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvE,YAAY,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1D,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAAC;IAC7D,eAAe,CAAC,EAAE,mBAAmB,EAAE,CAAC;IACxC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,eAAO,MAAM,mBAAmB,EAAE,KAAK,CAAC,EAAE,CAAC,wBAAwB,CAiPlE,CAAC"}
1
+ {"version":3,"file":"InlineCreateRelated.d.ts","sourceRoot":"","sources":["../src/InlineCreateRelated.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAgB/B,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,CAAC;IAC/C,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,wBAAwB;IACvC,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,MAAM,EAAE,sBAAsB,EAAE,CAAC;IACjC,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvE,YAAY,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1D,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAAC;IAC7D,eAAe,CAAC,EAAE,mBAAmB,EAAE,CAAC;IACxC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,eAAO,MAAM,mBAAmB,EAAE,KAAK,CAAC,EAAE,CAAC,wBAAwB,CAiUlE,CAAC"}
@@ -1,3 +1,4 @@
1
+ import { TEXTUAL_REF_FALLBACK_TYPES } from './fieldEnrichment';
1
2
  /**
2
3
  * ObjectUI
3
4
  * Copyright (c) 2024-present ObjectStack Inc.
@@ -9,12 +10,14 @@ import * as React from 'react';
9
10
  /**
10
11
  * Field types that carry a `reference_to` for relational metadata but are NOT
11
12
  * edited via the lookup picker (they have their own dedicated inputs/renderers).
12
- * Used so the inline-edit branch doesn't hijack them into a record picker.
13
+ * Used below so the inline-edit branch doesn't hijack them into a record picker.
13
14
  *
14
- * Exported because `DetailSection`'s per-field editability gate keys off the
15
- * same set (a computed field is never editable), so the two must not drift.
15
+ * The set itself moved to `fieldEnrichment` (objectui#3355) — the module both
16
+ * hosts' editability gates already share — so this renderer fallback and those
17
+ * gates read the ONE definition of "machine-computed". Re-exported here to keep
18
+ * the package's public name unchanged.
16
19
  */
17
- export declare const TEXTUAL_REF_FALLBACK_TYPES: Set<string>;
20
+ export { TEXTUAL_REF_FALLBACK_TYPES };
18
21
  /**
19
22
  * Extract the id a reference widget expects from a value that may already be
20
23
  * an `$expand`-ed record object (`{ id, name, ... }`), an array of those, or a
@@ -1 +1 @@
1
- {"version":3,"file":"InlineFieldInput.d.ts","sourceRoot":"","sources":["../src/InlineFieldInput.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAkB/B;;;;;;;GAOG;AACH,eAAO,MAAM,0BAA0B,aAA2D,CAAC;AAEnG;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAQvD;AAED,MAAM,WAAW,qBAAqB;IACpC;;;;;;OAMG;IACH,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC3B,iFAAiF;IACjF,KAAK,EAAE,GAAG,CAAC;IACX,oEAAoE;IACpE,QAAQ,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC;IAC/B,4EAA4E;IAC5E,UAAU,CAAC,EAAE,GAAG,CAAC;IACjB,6EAA6E;IAC7E,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,gBAAgB,EAAE,KAAK,CAAC,EAAE,CAAC,qBAAqB,CA+J5D,CAAC"}
1
+ {"version":3,"file":"InlineFieldInput.d.ts","sourceRoot":"","sources":["../src/InlineFieldInput.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAiB/B,OAAO,EAAE,0BAA0B,EAAE,MAAM,mBAAmB,CAAC;AAE/D;;;;;;;;;GASG;AACH,OAAO,EAAE,0BAA0B,EAAE,CAAC;AAEtC;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAQvD;AAED,MAAM,WAAW,qBAAqB;IACpC;;;;;;OAMG;IACH,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC3B,iFAAiF;IACjF,KAAK,EAAE,GAAG,CAAC;IACX,oEAAoE;IACpE,QAAQ,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC;IAC/B,4EAA4E;IAC5E,UAAU,CAAC,EAAE,GAAG,CAAC;IACjB,6EAA6E;IAC7E,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,gBAAgB,EAAE,KAAK,CAAC,EAAE,CAAC,qBAAqB,CA+J5D,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"ReactionPicker.d.ts","sourceRoot":"","sources":["../src/ReactionPicker.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAIjD,MAAM,WAAW,mBAAmB;IAClC,0CAA0C;IAC1C,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,kDAAkD;IAClD,gBAAgB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3D,8BAA8B;IAC9B,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;GAIG;AACH,eAAO,MAAM,cAAc,EAAE,KAAK,CAAC,EAAE,CAAC,mBAAmB,CA2ExD,CAAC"}
1
+ {"version":3,"file":"ReactionPicker.d.ts","sourceRoot":"","sources":["../src/ReactionPicker.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAKjD,MAAM,WAAW,mBAAmB;IAClC,0CAA0C;IAC1C,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,kDAAkD;IAClD,gBAAgB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3D,8BAA8B;IAC9B,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;GAIG;AACH,eAAO,MAAM,cAAc,EAAE,KAAK,CAAC,EAAE,CAAC,mBAAmB,CAwFxD,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import { FeedItem, RecordActivityComponentProps, RecordSubscription } from '@object-ui/types';
2
+ import { FeedFilterMode } from '@objectstack/spec/data';
2
3
  import { Attachment } from './CommentAttachment';
3
4
  /**
4
5
  * ObjectUI
@@ -8,7 +9,21 @@ import { Attachment } from './CommentAttachment';
8
9
  * LICENSE file in the root directory of this source tree.
9
10
  */
10
11
  import * as React from 'react';
11
- export type FeedFilterMode = 'all' | 'comments_only' | 'changes_only' | 'tasks_only';
12
+ /**
13
+ * Which slice of the record feed the timeline shows.
14
+ *
15
+ * Re-exported from `@objectstack/spec/data`, not restated (objectui#3161,
16
+ * objectstack#4115 ledger batch 7). It was a hand copy of the spec's four
17
+ * members under the spec's own name — in a file that already imports
18
+ * `FeedItemType` from the spec vocabulary two lines up, so the correct pattern
19
+ * was sitting next to it. The copy happened to be in sync; the point is that
20
+ * nothing made it stay so. `getFilterOptions` below renders one `<SelectItem>`
21
+ * per member, so a member the spec adds is a filter the user cannot pick and a
22
+ * member it retires is a dead menu entry — neither is reportable while the
23
+ * union is written out here. (`normalizeFilterMode` already reads the spec enum
24
+ * at RUNTIME; the type was the half still on a copy.)
25
+ */
26
+ export type { FeedFilterMode };
12
27
  export interface RecordActivityTimelineProps {
13
28
  /** Feed items to display */
14
29
  items: FeedItem[];
@@ -22,7 +37,9 @@ export interface RecordActivityTimelineProps {
22
37
  hasMore?: boolean;
23
38
  /** Called when user wants to load more items */
24
39
  onLoadMore?: () => void | Promise<void>;
25
- /** Loading state */
40
+ /** Whether the feed is still being fetched. While true and nothing is on
41
+ * screen yet, the timeline shows a loading row instead of the empty state
42
+ * — "still fetching" is not "no activity" (objectui#3205). */
26
43
  loading?: boolean;
27
44
  /** Called when a comment is submitted */
28
45
  onAddComment?: (text: string, attachments?: Attachment[]) => void | Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"RecordActivityTimeline.d.ts","sourceRoot":"","sources":["../src/RecordActivityTimeline.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAqB/B,OAAO,KAAK,EAAE,QAAQ,EAAgB,4BAA4B,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAMjH,OAAO,EAAqB,KAAK,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAGzE,MAAM,MAAM,cAAc,GAAG,KAAK,GAAG,eAAe,GAAG,cAAc,GAAG,YAAY,CAAC;AAErF,MAAM,WAAW,2BAA2B;IAC1C,4BAA4B;IAC5B,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,+DAA+D;IAC/D,MAAM,CAAC,EAAE,4BAA4B,CAAC;IACtC,mCAAmC;IACnC,UAAU,CAAC,EAAE,cAAc,CAAC;IAC5B,sCAAsC;IACtC,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,IAAI,CAAC;IAChD,2CAA2C;IAC3C,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,gDAAgD;IAChD,UAAU,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxC,oBAAoB;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,yCAAyC;IACzC,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,UAAU,EAAE,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClF,uCAAuC;IACvC,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/E,0CAA0C;IAC1C,gBAAgB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACpF,yBAAyB;IACzB,YAAY,CAAC,EAAE,kBAAkB,CAAC;IAClC,4CAA4C;IAC5C,oBAAoB,CAAC,EAAE,CAAC,UAAU,EAAE,OAAO,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrE,4EAA4E;IAC5E,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,uEAAuE;IACvE,kBAAkB,CAAC,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC9E;8CAC0C;IAC1C,mBAAmB,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IACjE,kEAAkE;IAClE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,yEAAyE;IACzE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAkFD;;;;;;;GAOG;AACH,eAAO,MAAM,sBAAsB,EAAE,KAAK,CAAC,EAAE,CAAC,2BAA2B,CAqWxE,CAAC"}
1
+ {"version":3,"file":"RecordActivityTimeline.d.ts","sourceRoot":"","sources":["../src/RecordActivityTimeline.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAqB/B,OAAO,KAAK,EAAE,QAAQ,EAAgB,4BAA4B,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACjH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAM7D,OAAO,EAAqB,KAAK,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAGzE;;;;;;;;;;;;;GAaG;AACH,YAAY,EAAE,cAAc,EAAE,CAAC;AAE/B,MAAM,WAAW,2BAA2B;IAC1C,4BAA4B;IAC5B,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,+DAA+D;IAC/D,MAAM,CAAC,EAAE,4BAA4B,CAAC;IACtC,mCAAmC;IACnC,UAAU,CAAC,EAAE,cAAc,CAAC;IAC5B,sCAAsC;IACtC,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,IAAI,CAAC;IAChD,2CAA2C;IAC3C,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,gDAAgD;IAChD,UAAU,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxC;;mEAE+D;IAC/D,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,yCAAyC;IACzC,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,UAAU,EAAE,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClF,uCAAuC;IACvC,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/E,0CAA0C;IAC1C,gBAAgB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACpF,yBAAyB;IACzB,YAAY,CAAC,EAAE,kBAAkB,CAAC;IAClC,4CAA4C;IAC5C,oBAAoB,CAAC,EAAE,CAAC,UAAU,EAAE,OAAO,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrE,4EAA4E;IAC5E,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,uEAAuE;IACvE,kBAAkB,CAAC,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC9E;8CAC0C;IAC1C,mBAAmB,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IACjE,kEAAkE;IAClE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,yEAAyE;IACzE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAkFD;;;;;;;GAOG;AACH,eAAO,MAAM,sBAAsB,EAAE,KAAK,CAAC,EAAE,CAAC,2BAA2B,CA2XxE,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"RecordDetailDrawer.d.ts","sourceRoot":"","sources":["../src/RecordDetailDrawer.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAO1B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAuBnD,MAAM,WAAW,uBAAuB;IACtC,4CAA4C;IAC5C,IAAI,EAAE,OAAO,CAAC;IACd,oFAAoF;IACpF,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,kEAAkE;IAClE,KAAK,EAAE,MAAM,CAAC;IACd,kCAAkC;IAClC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC5B,mDAAmD;IACnD,UAAU,EAAE,MAAM,CAAC;IACnB,+DAA+D;IAC/D,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC;IAC1B,iEAAiE;IACjE,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB;;;;OAIG;IACH,YAAY,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;KAAE,GAAG,IAAI,CAAC;IACvD;;;;;;;;OAQG;IACH,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,gEAAgE;IAChE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,YAAY,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC3B;;;OAGG;IACH,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtE;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;;;OAKG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAKD,yEAAyE;AACzE,wBAAgB,kBAAkB,CAAC,EACjC,IAAI,EACJ,OAAO,EACP,KAAK,EACL,MAAM,EACN,UAAU,EACV,QAAQ,EACR,UAAU,EACV,YAAY,EACZ,KAA0B,EAC1B,OAAW,EACX,YAAoC,EACpC,WAAW,EACX,QAAQ,EACR,SAAgB,EAChB,YAAY,GACb,EAAE,uBAAuB,qBAkOzB;AAED,eAAe,kBAAkB,CAAC;AAElC;;;;;;;;;;;;;GAaG;AACH,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,CAQjG"}
1
+ {"version":3,"file":"RecordDetailDrawer.d.ts","sourceRoot":"","sources":["../src/RecordDetailDrawer.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAO1B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAuBnD,MAAM,WAAW,uBAAuB;IACtC,4CAA4C;IAC5C,IAAI,EAAE,OAAO,CAAC;IACd,oFAAoF;IACpF,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,kEAAkE;IAClE,KAAK,EAAE,MAAM,CAAC;IACd,kCAAkC;IAClC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC5B,mDAAmD;IACnD,UAAU,EAAE,MAAM,CAAC;IACnB,+DAA+D;IAC/D,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC;IAC1B,iEAAiE;IACjE,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB;;;;OAIG;IACH,YAAY,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;KAAE,GAAG,IAAI,CAAC;IACvD;;;;;;;;OAQG;IACH,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,gEAAgE;IAChE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,YAAY,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC3B;;;OAGG;IACH,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtE;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;;;OAKG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAKD,yEAAyE;AACzE,wBAAgB,kBAAkB,CAAC,EACjC,IAAI,EACJ,OAAO,EACP,KAAK,EACL,MAAM,EACN,UAAU,EACV,QAAQ,EACR,UAAU,EACV,YAAY,EACZ,KAA0B,EAC1B,OAAW,EACX,YAAoC,EACpC,WAAW,EACX,QAAQ,EACR,SAAgB,EAChB,YAAY,GACb,EAAE,uBAAuB,qBAqOzB;AAED,eAAe,kBAAkB,CAAC;AAElC;;;;;;;;;;;;;GAaG;AACH,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,CAQjG"}
@@ -1 +1 @@
1
- {"version":3,"file":"RelatedList.d.ts","sourceRoot":"","sources":["../src/RelatedList.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"RelatedList.d.ts","sourceRoot":"","sources":["../src/RelatedList.tsx"],"names":[],"mappings":"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"}
@@ -5,6 +5,45 @@
5
5
  * This source code is licensed under the MIT license found in the
6
6
  * LICENSE file in the root directory of this source tree.
7
7
  */
8
+ /**
9
+ * Field types the PLATFORM computes — the value is machine-owned and no user
10
+ * write is legitimate. They carry a `reference_to` for relational metadata but
11
+ * have no editor of their own.
12
+ *
13
+ * One set, three readers, so they cannot drift: `InlineFieldInput` renders them
14
+ * as text instead of hijacking them into a record picker, and both editability
15
+ * gates (`DetailSection`, `HeaderHighlight`) treat them as never inline-editable.
16
+ * It lives beside `enrichDetailField` — deciding whether a column is
17
+ * machine-computed is part of resolving a detail field's shape out of the view
18
+ * entry plus the object schema, not the private business of any one component.
19
+ * Re-exported from `InlineFieldInput` under its historical name.
20
+ */
21
+ export declare const TEXTUAL_REF_FALLBACK_TYPES: Set<string>;
22
+ /**
23
+ * Is this field machine-computed, given the type authored on the view entry and
24
+ * the type declared on the object schema?
25
+ *
26
+ * **Narrow-only — the answer is the UNION of the two.** Either type being
27
+ * computed locks the field. An authored `type` is a DISPLAY override: it picks
28
+ * the cell renderer and the editor, and that selection keeps its usual
29
+ * precedence (`viewFieldType || objectFieldType`) everywhere else. It can
30
+ * therefore only ever *narrow* editability, never widen it.
31
+ *
32
+ * Before objectui#3355 both gates resolved a single effective type with that
33
+ * same display precedence, so an authored non-computed type ERASED the object's
34
+ * computed declaration from the gate's view. The app that reported
35
+ * objectstack-ai/objectstack#5077 ships `{ name: 'supply_share', type: 'number' }`
36
+ * — a display override worked around objectstack#5066 — over a hook-maintained
37
+ * ROLLUP, and the header chip became inline-editable: a user overwrote the
38
+ * computed value by hand and it stayed corrupted until an unrelated child-row
39
+ * touch re-fired the rollup (downstream yinlianghui/hotcrm-heimao#61).
40
+ *
41
+ * The object schema is authoritative about what is machine-owned; a
42
+ * presentation override has no business granting write access. Narrowing still
43
+ * works — an authored `type: 'formula'` locks a plain object column, which is
44
+ * how a view declares "this column is computed elsewhere".
45
+ */
46
+ export declare function isComputedFieldType(viewFieldType: unknown, objectFieldType: unknown): boolean;
8
47
  /**
9
48
  * Object-metadata keys carried onto a detail-view field so the read cell and
10
49
  * the inline editor see the SAME resolved field shape the object form does.
@@ -1 +1 @@
1
- {"version":3,"file":"fieldEnrichment.d.ts","sourceRoot":"","sources":["../src/fieldEnrichment.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,4BAA4B,+cA+C/B,CAAC;AAEX;;;;;;;;;;;GAWG;AACH,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC9B,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,SAAS,GAAG,IAAI,GACrD,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAiBrB"}
1
+ {"version":3,"file":"fieldEnrichment.d.ts","sourceRoot":"","sources":["../src/fieldEnrichment.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,0BAA0B,aAKrC,CAAC;AAEH;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,mBAAmB,CACjC,aAAa,EAAE,OAAO,EACtB,eAAe,EAAE,OAAO,GACvB,OAAO,CAKT;AAED;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,4BAA4B,+cA+C/B,CAAC;AAEX;;;;;;;;;;;GAWG;AACH,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC9B,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,SAAS,GAAG,IAAI,GACrD,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAiBrB"}
package/dist/index.d.ts CHANGED
@@ -75,5 +75,5 @@ export type { SubscriptionToggleProps } from './SubscriptionToggle';
75
75
  export type { ReactionPickerProps } from './ReactionPicker';
76
76
  export type { ThreadedRepliesProps } from './ThreadedReplies';
77
77
  export { buildDefaultPageSchema, buildDefaultHeader, buildDefaultActions, buildDefaultHighlights, buildDefaultDetails, buildDefaultTabs, buildDefaultDiscussion, detectStatusField, deriveStages, deriveHighlightFields, deriveFieldGroupDetailSections, resolveDetailSections, resolveTitleField, } from './synth/buildDefaultPageSchema';
78
- export type { ObjectDefLike, ObjectFieldLike, BuildPageOptions, } from './synth/buildDefaultPageSchema';
78
+ export type { ObjectDefLike, ObjectDefFieldLike, BuildPageOptions, } from './synth/buildDefaultPageSchema';
79
79
  //# sourceMappingURL=index.d.ts.map