Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
62 changes: 62 additions & 0 deletions .changeset/console-1fb1ced36243.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
---
"@objectstack/console": minor
---

Console (objectui) refreshed to `1fb1ced36243`. Frontend changes in this range:

Derived from the changesets objectui declared over the range — 10 releasing of 11 changesets added across 11 non-merge commits; omitted: 1 release-nothing changeset, 2 commits carrying no changeset (they ship no package code).

- **minor** — The author of a comment on a record page can now edit and delete it from the record feed (objectui#12268). (objectui `7af0ab378`)
- **minor** — **BREAKING** — Both dashboard surfaces draw a widget's legacy `component` envelope the way it is authored: a `metric-card` node draws as before, and any other node draws the retired-format promp… (objectui `e8fc452c3`)
- **minor** — The console's assistant button no longer covers the record page's inline-edit Save or an attachment's Download and Delete, and deleting an attachment asks first (objectui#12248). (objectui `51c661e38`)
- **minor** — **BREAKING** — The exported field metadata types stop declaring the members `@objectstack/spec`'s `FieldSchema` refuses by name and no reader honours, and two type values become the spec's `Fiel… (objectui `10aba37d1`)
- **patch** — A record page's header totals now update when you edit or delete a row in one of its related lists (objectui#12244). Before, a quote's total in the header highlight strip kept its… (objectui `30c2e4e1d`)
- **patch** — fix(plugin-report): a report lays out a select dimension in the field's declared option order (objectui#12243) (objectui `e5c8ea7fe`)
- **patch** — Home's activity card names each row's object by its label in the reader's language (objectui#12238). (objectui `ee5c49171`)
- **patch** — A record activity feed shows a call, meeting or email logged on the record, instead of hiding it as a completed task (objectui#12228). On an object with no authored record page, a… (objectui `0cd322d78`)
- **patch** — A currency field's fixed currency, declared as `currencyConfig`, shows on the record quick-look panel and in related lists (objectui#12242). (objectui `10aba37d1`)
- **patch** — The record form stops reading a field's snake_case `visible_on`. A field's visibility is `visibleWhen`, the key `@objectstack/spec`'s `FieldSchema` declares (objectui#12242). (objectui `10aba37d1`)

⚠️ 2 of these carry a breaking change: 2 by the author's own breaking annotation in the changeset body — objectui declares no `major` inside a launch window (`scripts/check-changeset-no-major.mjs`). Each is marked **BREAKING** in the list above — read them before compiling the release record.

**In this console build, declared nowhere** — objectui merged 2 commits in this range with no `.changeset/*.md`. The code is inside the pin above and ships here, but nothing upstream declared them, so they appear in no objectui CHANGELOG and in no entry above. Listed by subject rather than counted, because a count cannot tell a dependency bump from a form-behaviour change (objectstack#6174); the upstream gate that would prevent this is objectui#3387.

- _(no changeset)_ ci(test): the coverage lane runs eight shards, then both test matrices shard by measured duration (objectui#12208, objectui#12256) (#12263) (objectui `1fb1ced36`)
- _(no changeset)_ ci(type-check): the turbo cache replays unchanged packages, and pull-request and queue runs type-check only what the change affects (objectui#12222) (#12251) (objectui `1ce8db8d9`)

Clause-②: no

<!-- adr-0087: not-required (no-migration-prescription)
This diff moves `.objectui-sha` and the artefacts that travel with it: this console
changeset, the re-recorded `scripts/sdui-manifest.record.json` and the regenerated
`sdui.manifest.json`, the re-recorded `packages/sdui-parser/objectui-lockstep.json` and
the re-measured pin citations in `packages/spec/src`, which carry their own
`@objectstack/spec` patch changeset. It adds, removes or renames no
ObjectStack-authorable key: no Zod schema, no spec declaration and no stored
`sys_metadata` shape moves in it, so `objectstack migrate meta` has nothing here to
rewrite, and this body carries no FROM/TO prescription of its own.
The range carries two declared-breaking objectui changes, each by its author's
breaking annotation and none by a declared `major`, and no commit subject carries `!`.
The digest marked only the first. The second opens its annotation with a warning sign
before the word (a `## ⚠️ BREAKING, priced as minor …` heading), which the digest's
block-opener rule does not recognise, so its entry above was marked by hand.
Each is answered here:
(1) objectui#12254 (`e8fc452c3`): both dashboard surfaces draw a widget's legacy
`component` envelope only for a `metric-card` node, in `@object-ui/plugin-dashboard`.
`@objectstack/spec` already refuses `component` and inline `data` on a dashboard widget
(`QUARANTINED_WIDGET_KEYS`, `ui/dashboard.zod.ts`) and declares no `custom` widget, so
nothing authored here can reach that envelope; the six dashboard files under
`examples/` author no `component` key.
(2) objectui#12242 (`10aba37d1`): `@object-ui/types`' field metadata types turn
`visible_on`, `currency`, `filterable`, `min_date`, `max_date`, `default_zoom`,
`starting_number`, `schema` and `normalize` into `never` tombstones and change the
`auto_number` / `object` type values to `autonumber` / `json`. No package or example in
this repo depends on `@object-ui/types` (two code comments name it). No example field
authors any of those members (the one `schema:` key under `examples/` sits on a
`json_schema` validation rule, not on a field), and no example field declares `type: 'auto_number'`
or `type: 'object'`.
Scope of the claim, stated rather than implied: it is a claim about THIS diff, not a
per-entry re-measurement of the upstream declared-breaking entries.
-->

objectui range: `7578323a544e...1fb1ced36243`
17 changes: 17 additions & 0 deletions .changeset/objectui-pin-citations-1fb1ced36243.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
---
'@objectstack/spec': patch
---

The spec's objectui citations, and the shipped description text that names the `.objectui-sha` pin (the `FormField.span` describe and six migration-entry descriptions), are re-measured against the new console pin, objectui `1fb1ced36243`.

Clause-②: no

Every anchor was mapped through the objectui diff `7578323a544e..1fb1ced36243`: 116 paths over 11 commits. One set of cited files changed on the hop, and every cited line in it held its text:

- The `en` / `zh` / `de` packs (two commits each: objectui#12248, objectui `51c661e38`, and objectui#12268, objectui `7af0ab378`) gained keys below line 1100 only (`en.ts` +9, `zh.ts` +6, `de.ts` +6). Their `calendar.configRequired` strings did not change and held at `en.ts` `:953`, `zh.ts` `:726` and `de.ts` `:706`. The functional-completeness `calendar` row says so.

Every other asserting record cites only files that are byte-identical across the hop (`git diff --quiet`, checked file by file), and each gains a hop sentence that says so. That covers `form.tsx`, `autoLayout.ts` and `field-type-alias.ts`, so `FormField.span: 'full'` still takes the whole row at every multi-column tier, and `ObjectGrid.tsx` and `data-table.tsx`, so the `keyboardNavigation` read still finds 15 hit lines against 3 for the control (no line of the hop's diff names `keyboardNavigation`).

The six migration entries' corpus counts were re-taken with `git grep -o -F`, the method that reproduces every `7578323a544e` number. The corpus is now 8642 tracked files, and every retired name each entry counts still reads 0 (a superset of 99 names: the 13 lifecycle, 31 metrics and 37 tracing exports, and 18 key names the entries retire or count; the unrelated `Span` 519 and `SpanSchema` 57 are unchanged). The lit controls moved with the corpus, for example `objectstack` from 18552 to 18601, `timeout` from 1686 to 1700 and `tenant` from 1404 to 1415.

No key, default, enum member or export moves.
2 changes: 1 addition & 1 deletion .objectui-sha
Original file line number Diff line number Diff line change
@@ -1 +1 @@
7578323a544e31d574804ae931b595e8f9f92c21
1fb1ced36243c325acc801bdde26bd096a15f5f5
4 changes: 2 additions & 2 deletions content/docs/references/ui/view.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -221,7 +221,7 @@ Column footer summary configuration
| **required** | `boolean` | optional | Required override |
| **hidden** | `boolean` | optional | Hidden override |
| **colSpan** | `integer` | optional | Absolute column span (1-4). The renderer clamps it to the form grid's current column count, so the cell starts at a real column boundary at every surface width and never overflows (`colSpan: 4` in a 3-column grid renders as 3); a `colSpan` within the column count renders as authored, and `colSpan: 1` emits no span class at all. |
| **span** | `Enum<'auto' \| 'full'>` | optional (default: `"auto"`) | Relative field width. 'auto' (default — omit it): the renderer sizes the field from its widget type × the current column count — at the pin this repo builds against (`.objectui-sha` = `7578323a544e`), only textarea, markdown, html, richtext and repeater resolve to the full column count (repeater reaches it through the wide `field:grid` widget it maps to). 'full': resolves to the form grid's full column count. How far down the container-query tiers that span is emitted is the renderer's, not this key's: at that same pin the renderer emits one clamped col-span class per multi-column tier (`@md:col-span-2 @2xl:col-span-3` for a 3-column grid), so the field takes the whole row at every multi-column tier, not just the widest. |
| **span** | `Enum<'auto' \| 'full'>` | optional (default: `"auto"`) | Relative field width. 'auto' (default — omit it): the renderer sizes the field from its widget type × the current column count — at the pin this repo builds against (`.objectui-sha` = `1fb1ced36243`), only textarea, markdown, html, richtext and repeater resolve to the full column count (repeater reaches it through the wide `field:grid` widget it maps to). 'full': resolves to the form grid's full column count. How far down the container-query tiers that span is emitted is the renderer's, not this key's: at that same pin the renderer emits one clamped col-span class per multi-column tier (`@md:col-span-2 @2xl:col-span-3` for a 3-column grid), so the field takes the whole row at every multi-column tier, not just the widest. |
| **widget** | `string` | optional | Custom widget/component name (overrides type-based inference) |
| **language** | `string` | optional | Code editor language (for type=code) |
| **keyField** | `{ field?: string; label?: string \| Record<string, string>; placeholder?: string \| Record<string, string>; helpText?: string \| Record<string, string>; … }` | optional | Key column config for record-typed fields |
Expand Down Expand Up @@ -351,7 +351,7 @@ Form-view select option — the object-field option shape minus the per-option `
| **required** | `boolean` | optional | Required override |
| **hidden** | `boolean` | optional | Hidden override |
| **colSpan** | `integer` | optional | Absolute column span (1-4). The renderer clamps it to the form grid's current column count, so the cell starts at a real column boundary at every surface width and never overflows (`colSpan: 4` in a 3-column grid renders as 3); a `colSpan` within the column count renders as authored, and `colSpan: 1` emits no span class at all. |
| **span** | `Enum<'auto' \| 'full'>` | optional (default: `"auto"`) | Relative field width. 'auto' (default — omit it): the renderer sizes the field from its widget type × the current column count — at the pin this repo builds against (`.objectui-sha` = `7578323a544e`), only textarea, markdown, html, richtext and repeater resolve to the full column count (repeater reaches it through the wide `field:grid` widget it maps to). 'full': resolves to the form grid's full column count. How far down the container-query tiers that span is emitted is the renderer's, not this key's: at that same pin the renderer emits one clamped col-span class per multi-column tier (`@md:col-span-2 @2xl:col-span-3` for a 3-column grid), so the field takes the whole row at every multi-column tier, not just the widest. |
| **span** | `Enum<'auto' \| 'full'>` | optional (default: `"auto"`) | Relative field width. 'auto' (default — omit it): the renderer sizes the field from its widget type × the current column count — at the pin this repo builds against (`.objectui-sha` = `1fb1ced36243`), only textarea, markdown, html, richtext and repeater resolve to the full column count (repeater reaches it through the wide `field:grid` widget it maps to). 'full': resolves to the form grid's full column count. How far down the container-query tiers that span is emitted is the renderer's, not this key's: at that same pin the renderer emits one clamped col-span class per multi-column tier (`@md:col-span-2 @2xl:col-span-3` for a 3-column grid), so the field takes the whole row at every multi-column tier, not just the widest. |
| **widget** | `string` | optional | Custom widget/component name (overrides type-based inference) |
| **language** | `string` | optional | Code editor language (for type=code) |
| **keyField** | `{ field?: string; label?: string \| Record<string, string>; placeholder?: string \| Record<string, string>; helpText?: string \| Record<string, string>; … }` | optional | Key column config for record-typed fields |
Expand Down
6 changes: 3 additions & 3 deletions packages/sdui-parser/objectui-lockstep.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@
],
"objectui": {
"repo": "https://github.com/objectstack-ai/objectui.git",
"rev": "7578323a544e31d574804ae931b595e8f9f92c21",
"revDate": "2026-10-12T13:34:53+00:00",
"rev": "1fb1ced36243c325acc801bdde26bd096a15f5f5",
"revDate": "2026-10-12T21:47:03+00:00",
"source": "packages/sdui-parser/src",
"files": [
"packages/sdui-parser/src/body-dialect.ts",
Expand All @@ -21,7 +21,7 @@
"packages/sdui-parser/src/validate.ts"
]
},
"recordedAgainstPin": "7578323a544e31d574804ae931b595e8f9f92c21",
"recordedAgainstPin": "1fb1ced36243c325acc801bdde26bd096a15f5f5",
"grammarRegion": {
"file": "packages/sdui-parser/src/parse.ts",
"delimiter": "/* ---------------------- the JS literal subset (#6614) ---------------------- */",
Expand Down
5 changes: 4 additions & 1 deletion packages/spec/src/data/api-methods-batch-conformance.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,10 @@ const SINGLE_RECORD_WRITE_ONLY: Record<string, string> = {
// `revoked` on ONE key. The multi-select surface this rule protects does not
// exist for API keys, and the shape a future one would take does not need
// `bulk` either — both read off the console build this release pins
// (`.objectui-sha` = `7578323a5`, re-read there 2026-10-12:
// (`.objectui-sha` = `1fb1ced36`, re-read there 2026-10-12:
// every objectui file this record cites is byte-identical across the hop from
// `7578323a5` (`git diff --quiet`), so every anchor held unmoved. At
// `7578323a5`, re-read there 2026-10-12:
// every objectui file this record cites is byte-identical across the hop from
// `9646e2ed2` (`git diff --quiet`), so every anchor held unmoved. At
// `9646e2ed2`, re-read there 2026-10-12:
Expand Down
24 changes: 21 additions & 3 deletions packages/spec/src/kernel/functional-completeness.ts
Original file line number Diff line number Diff line change
Expand Up @@ -298,7 +298,16 @@ export function checkFieldCompleteness(def: unknown): CompletenessFinding[] {
* English sentence. So the loss is total rather than partial — every
* record, on every object — and the author is told at render time as well
* as here. Both reads hold at the pin this repo builds against
* (`.objectui-sha` = `7578323a5`, re-read there 2026-10-12:
* (`.objectui-sha` = `1fb1ced36`, re-read there 2026-10-12:
* on the hop off `7578323a5` `ObjectCalendar.tsx` and `ListView.tsx` are
* byte-identical (`git diff --quiet`), so `getCalendarConfig` `:311`, the
* `if (!calendarConfig)` arm `:1354` with its `tt(…)` lines `:1361-1362` and
* the `case 'calendar'` at `3818` did not move; and the `en` / `zh` / `de`
* packs changed (the same two commits each: objectui#12248, objectui
* `51c661e38`, and objectui#12268, objectui `7af0ab378`, each adding keys
* below line 1100 only: `en.ts` +9, `zh.ts` +6, `de.ts` +6) but not their
* `calendar.configRequired` strings, which held at `en.ts` `:953`, `zh.ts`
* `:726` and `de.ts` `:706`. At `7578323a5`, re-read there 2026-10-12:
* on the hop off `9646e2ed2` `ObjectCalendar.tsx` is byte-identical (`git diff
* --quiet`), so `getCalendarConfig` `:311`, the `if (!calendarConfig)` arm
* `:1354` and its `tt(…)` lines `:1361-1362` did not move; the `en` / `zh` /
Expand Down Expand Up @@ -461,7 +470,10 @@ export function checkFieldCompleteness(def: unknown): CompletenessFinding[] {
* This repo already records the same deletion one door over: the #13817
* check in `../ui/view.zod.ts` names objectui#7029 as its runtime half.
* - `gantt` → NO fallback, and no silence [#19630]. Measured at the pin
* this repo builds against (`.objectui-sha` = `7578323a5`, re-read there 2026-10-12:
* this repo builds against (`.objectui-sha` = `1fb1ced36`, re-read there 2026-10-12:
* every objectui file this record cites is byte-identical across the hop from
* `7578323a5` (`git diff --quiet`), so every anchor held unmoved. At
* `7578323a5`, re-read there 2026-10-12:
* on the hop off `9646e2ed2` `ObjectGantt.tsx` is byte-identical (`git diff
* --quiet`), so `getGanttConfig` `:612` and the `if (!ganttConfig)` arm `:2330`
* did not move, and `ListView.tsx` changed (+34/-79, objectui#12217, objectui
Expand Down Expand Up @@ -580,6 +592,9 @@ export function checkFieldCompleteness(def: unknown): CompletenessFinding[] {
* requires. So the view does not draw a blank chart: it refuses, by name.
* - `timeline` → date axis: NO fallback [#19630]; title: `titleField || 'name'`,
* which still stands. Measured at the same pin (`.objectui-sha` =
* `1fb1ced36`, re-read there 2026-10-12:
* every objectui file this record cites is byte-identical across the hop from
* `7578323a5` (`git diff --quiet`), so every anchor held unmoved. At
* `7578323a5`, re-read there 2026-10-12:
* on the hop off `9646e2ed2` `ObjectTimeline.tsx` is byte-identical (`git diff
* --quiet`), so its start-date chain `:589-591` and its `if (!hasAuthoredItems
Expand Down Expand Up @@ -699,7 +714,10 @@ export function checkFieldCompleteness(def: unknown): CompletenessFinding[] {
* block does render; the warning still fires there, because the block the
* view TYPE names is the one that is missing. Unchanged by this row.
* - `map` → NO fallback, and no silence [#19630]. Measured at the same
* pin (`.objectui-sha` = `7578323a5`, re-read there 2026-10-12:
* pin (`.objectui-sha` = `1fb1ced36`, re-read there 2026-10-12:
* every objectui file this record cites is byte-identical across the hop from
* `7578323a5` (`git diff --quiet`), so every anchor held unmoved. At
* `7578323a5`, re-read there 2026-10-12:
* on the hop off `9646e2ed2` `ObjectMap.tsx` is byte-identical (`git diff
* --quiet`), so `getMapConfig` `:421`, `hasCoordinateBinding` `:527` and the
* refusal arm `:1337` did not move; and `ListView.tsx` changed (+34/-79,
Expand Down
Loading
Loading