Skip to content

Commit 202a8c0

Browse files
committed
Merge origin/main (6158e4c, the @objectstack 17.6.0 trunk) into claude/issue-11542-modal-form-group-sections
Claude-Session: https://claude.ai/code/session_01FjqrwXPfSMkSfkKYDSRkN2 Co-authored-by: Claude <noreply@anthropic.com>
2 parents e7e7413 + 6158e4c commit 202a8c0

83 files changed

Lines changed: 2090 additions & 505 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎.changeset/11068-grid-declared-keys.md‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,3 +40,9 @@ now authors only keys the grid reads.
4040
**Unchanged.** An `object-view`'s `table` slot still withholds `description` and `emptyState`.
4141
Write them on the `object-grid` node itself. `keyboardNavigation` is still declared and still
4242
not read.
43+
44+
**Correction, 2026-10-03 (objectui#11227).** The Zod twin's `emptyState` is no longer three
45+
optional strings. It is the spec's `EmptyStateSchema` by reference, which `@objectstack/spec`
46+
17.6.0 declares on its `object-grid` row: `title` and `message` are `string | I18nLabel` (a
47+
plain string or an inline locale map, which the grid resolves against the display locale), and
48+
an unknown member is still refused by name (`.changeset/11227-object-grid-17-6-keys.md`).
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
---
2+
---
3+
4+
Test-only change in `@object-ui/console`; no published behaviour changes. Under objectui#11438 ruling A″, row 1 of the `@objectstack/spec` 17.6.0 bump, `object-grid.keyboardNavigation`, is booked as owed to objectui#11068 in `registry-inputs-spec-parity.test.ts`, with an expiry (2026-11-02, or when objectui#11068's build lands). The entry joins the file's objectui#11111 ledger, whose `unpublishedKeys` cap rises by exactly this one entry. The GA-block split row admits this one id by name and refuses every other exemption on the four GA blocks as before. The file sits under `apps/console/src/__tests__/`, which nothing outside `__tests__/` imports, so neither the console bundle nor `plugin.*` carries it.
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
---
2+
'@object-ui/core': minor
3+
---
4+
5+
`ValueDataSource` executes the empty pair `is_empty` / `is_not_empty` and the `$empty` operator, and `convertFiltersToAST` lowers `$empty` (objectui#11094).
6+
7+
`@objectstack/spec` 17.6.0 admits `$empty` to `FILTER_OPERATORS` (objectstack#20446). It also stops folding `is_empty` / `isempty` onto `is_null`, and `is_not_empty` / `isnotempty` onto `is_not_null`, and lowers them to `$empty: true` / `$empty: false` instead (objectstack#20570). `ValueDataSource` canonicalises AST operators through the spec's `canonicalAstOperator` and had arms only for the null pair. So on 17.6.0 a stored `is_empty` or `is_not_empty` rule on a `provider: 'value'` source reached the refusal arm: it selected no row and logged one refusal per `find()`.
8+
9+
**After.** `is_empty` and `$empty: true` select a row whose value is null, absent, `''` or `[]`. `is_not_empty` and `$empty: false` select exactly the other rows. The answer is the spec's own `isEmptyFilterValue`, called without a field declaration, because this adapter holds none. That is the by-value reading the spec gives a face with no declarations, the same call `@objectstack/formula`'s matcher makes. A `$empty` flag that is not `true` or `false` is refused like every other refusal in this adapter: the row is excluded and the reason is logged once.
10+
11+
**What moves for a stored rule.** On 17.5.0 the empty pair was a null test here. A row whose value is `''` or `[]` is now selected by `is_empty` and no longer by `is_not_empty`. Rows holding a value, null or no key answer as before.
12+
13+
`convertFiltersToAST` lowers `{ f: { $empty: true } }` to `['f', 'is_empty', true]` and `$empty: false` to `['f', 'is_not_empty', true]`, the inverse of the spec's `parseFilterAST`. A flag that is not a boolean throws a `FilterOperatorError` (`code: 'INVALID_FILTER'`, `httpStatus: 400`). Before this, the operator reached the unknown-operator throw. The unknown-operator message now lists `$empty` among the supported operators. `@object-ui/data-objectstack`'s `find()` lowers an object `$filter` through this function, so an object filter carrying `$empty` reaches the wire there instead of throwing.
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
---
2+
'@object-ui/plugin-grid': minor
3+
'@object-ui/plugin-list': patch
4+
'@object-ui/types': minor
5+
---
6+
7+
An `object-grid` publishes `description` and `emptyState` now that `@objectstack/spec` 17.6.0
8+
declares them on its `object-grid` row, and `emptyState.title` / `.message` take an inline
9+
locale map on both the grid and the list view (objectui#11227).
10+
11+
**`@object-ui/plugin-grid` (feature and fix).**
12+
13+
- `description` and `emptyState` are in the grid's declared inputs, so the designer panel, the
14+
component manifest and the generated `sdui-intrinsics.d.ts` offer them, and the SDUI parser
15+
no longer reports an authored `emptyState` as `unknown-prop`. `description` declares both
16+
arms of the `I18nLabel` union, so a locale map on it is not a `type-mismatch`.
17+
- `emptyState.title` and `emptyState.message` are resolved against the display locale, as
18+
`label` and `description` are. Before, a locale map on either reached the empty-state
19+
component as an object, and the grid failed to render. A map with no usable entry keeps
20+
that member's default: the table's "No results found" heading, and no message line.
21+
- `keyboardNavigation`, the row's third 17.6.0 key, is not published. The spec marks it
22+
`[EXPERIMENTAL — not enforced]`, and nothing in the grid reads it yet.
23+
24+
**`@object-ui/plugin-list` (fix).** A list view's authored `emptyState.title` and
25+
`emptyState.message` are resolved against the display locale. Before, a locale map on either
26+
was treated as absent, and the empty state drew the default copy in every locale. A plain
27+
string is drawn as before.
28+
29+
**`@object-ui/types` (breaking for a reader of the text members, hence `minor`).**
30+
31+
- `ObjectGridSchema.emptyState` is the spec's `EmptyState`, and the Zod twin takes the spec's
32+
`EmptyStateSchema` by reference. `title` and `message` are `string | I18nLabel`, `icon` stays
33+
a string, and an unknown member is still refused by name. A locale map on `title` or
34+
`message` now parses, and a value that is neither a string nor a map is refused at that
35+
member.
36+
- `NamedListView.emptyState` is `ListViewSchema['emptyState']`, the same spec type.
37+
- TypeScript code that reads `emptyState.title` or `.message` as a `string` no longer
38+
type-checks. Resolve the value first, for example with `resolveI18nLabel` from
39+
`@objectstack/spec/ui`.
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
---
2+
'@object-ui/types': patch
3+
---
4+
5+
Raise `@object-ui/types`' declared `@objectstack/spec` floor from `^17.5.0` to
6+
`^17.6.0` (objectui#11227). The package's published types now read
7+
`EmptyState` from `@objectstack/spec/ui`, because the `object-grid`
8+
`emptyState` member is typed by reference to the protocol's own shape, and its
9+
published zod mirror reads `EmptyStateSchema` from the same subpath. Neither
10+
export exists in `@objectstack/spec` 17.5.0, which the old range admitted; both
11+
ship from 17.6.0. A consumer resolution landing on 17.5.0 therefore got types
12+
and a mirror that name exports their declared spec dependency does not have.
13+
14+
Nothing moves at runtime in this repository: the lockfile already resolves
15+
`@objectstack/spec` 17.6.0 for this specifier, so only the declared range was
16+
stale. For a consumer, the range now refuses `@objectstack/spec` 17.5.0. The
17+
instrument that re-derives this floor is `pnpm check:spec-floors`, read over a
18+
full workspace build.

‎.changeset/11276-object-grid-properties-bag.md‎

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,3 +29,10 @@ Nothing changes at render time: `SchemaRenderer` hoists every `properties` key o
2929
**What did not move.** The TypeScript `ObjectGridSchema` and its zod mirror `ObjectGridSchema` stay published and unchanged in shape. They are the node as `ObjectGrid` reads it after the hoist, and as code composes it, and the `object-view` `table` slot is still built from the mirror.
3030

3131
**Correction, 2026-10-02 (objectui#6152, round 6).** The list above of keys "the row declares and the flat mirror does not" is no longer true for ten of them: the flat `ObjectGridSchema` mirror now declares `rowHeight`, `grouping`, `aggregations`, `conditionalFormatting`, `rowColor`, `bulkActionDefs`, `navigation`, `singleClickEdit`, `reorderableColumns` and `operations`, each typed as its TypeScript twin types it (`.changeset/6152-objectgrid-round6-mirrored.md`). `resizableColumns` is still the row's alone. The bag is unchanged: the spec row still judges these keys inside `properties`.
32+
33+
**Correction, 2026-10-03 (objectui#11227).** At `@objectstack/spec` 17.6.0 the row declares
34+
`description`, `emptyState` and `keyboardNavigation`, so the sentence above saying it does not
35+
declare `emptyState` or `keyboardNavigation` no longer holds. All three parse in the bag, and
36+
each written flat on the node is refused by name toward its bag member, like the row's other
37+
members. `emptyState` is authorable in a document, and so is `description`, which no longer
38+
stays on the node beside the bag (`.changeset/11227-object-grid-17-6-keys.md`).

‎.changeset/11276-plugin-grid-properties-bag-docs.md‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,8 @@
55
docs(plugin-grid): authored `object-grid` examples write their props in the `properties` bag (objectui#11276)
66

77
The README's authored `object-grid` examples now write `{ "type": "object-grid", "properties": { … } }`, the spelling `@objectstack/spec`'s `ComponentPropsMap['object-grid']` row declares and `objectui validate` now requires, each bag checked with `satisfies ObjectGridProps` (the spec's row type). `emptyState` is described as what it is today: a key `ObjectGrid` reads that the spec's row does not declare, so not authorable in a document. The examples that mount `ObjectGrid` directly keep the flat `schema` prop: a component mounted without `SchemaRenderer` receives the node as it reads it, and nothing hoists a bag there. Under `src/`, a new render pin holds that the bag and a stored flat node draw the same grid, and the CRUD-guide render pin reads the guide's bag. No runtime change.
8+
9+
**Correction, 2026-10-03 (objectui#11227).** The README no longer describes `emptyState` as
10+
not authorable: `@objectstack/spec` 17.6.0 declares it, with `description`, on the `object-grid`
11+
row, so both are written in the `properties` bag, and the README's example shows them there
12+
(`.changeset/11227-object-grid-17-6-keys.md`).
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
---
2+
---
3+
4+
Test-only change in `@object-ui/types` and `@object-ui/plugin-dashboard`; no published behaviour changes. Under objectui#11438 ruling A″, the spec's dimensionless measure-arity check is booked as owed to objectui#11334, with an expiry, in three tests. In `spec-object-refinements-7715.test.ts` it goes on the census's `DashboardWidgetSchema (complex.zod.ts)` row. In the two objectui#8894 measure-door tests, it is a bounded ledger of the seven types objectui's door does not refuse yet, and a cap row requires that set to equal the ledger. All three files sit under `__tests__/`, which each package's `tsconfig.json` excludes from the published `dist`.
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
---
2+
---
3+
4+
Test-only change in `@object-ui/core`; no published behaviour changes. Under objectui#11438 ruling A″, row 5 of the `@objectstack/spec` 17.6.0 bump, `ActionSchema.outcomeMessages`, is booked as owed to objectui#11344 in `actionKeys.pin.test.ts`, with an expiry (2026-11-02, or when objectui#11344's slice lands, whichever is first). The file's spec-inventory row now requires its `missing` set to equal that one-entry ledger exactly, and a new row asserts today's difference: the spec declares the key, and neither `SPEC_ACTION_KEYS` nor `KNOWN_ACTION_KEYS` knows it. The file sits under `packages/core/src/actions/__tests__/`, which the package's `tsconfig.json` excludes from the build program, so the published `dist` does not carry it.
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
---
2+
'@object-ui/components': patch
3+
'@object-ui/i18n': patch
4+
'@object-ui/console': patch
5+
---
6+
7+
objectui now resolves `@objectstack/*` 17.6.0 (objectui#11438). One declared range moves: `@object-ui/types` raises its `@objectstack/spec` floor to `^17.6.0` in objectui#11227's own changeset, because its published types read `EmptyState` / `EmptyStateSchema`, which 17.5.0 does not export. Every other `@objectstack/*` range already admits 17.6.0 and stays as it was, and `check:spec-floors` names no other floor that has to rise. Everything below is a contract move 17.6.0 made, and it already reaches any consumer that resolves `@objectstack/spec ^17.6`.
8+
9+
- `@object-ui/components`: the `page:header` registration no longer publishes a `breadcrumb` input. 17.6.0 retires the key (objectstack#20758) and refuses it by name; the renderer has ignored it since objectui#11166.
10+
- `@object-ui/i18n`: a served translation document is recognised as a spec payload when it carries only the `picklists` group, which 17.6.0's `GetTranslationsResponseSchema` adds. Such a bundle used to be returned untransformed, so nothing read it. The group is now namespaced under `app` like every other group.
11+
- `@object-ui/console`: the bundle inlines the 17.6.0 packages, so its client-side validation answers as a 17.6.0 server does. The first screen is smaller: 17.6.0's spec root no longer carries the migration chain, so the eager closure is 250,096 gzipped bytes lighter (measured against a `main` build), and the bundle budget comes down by that amount.

0 commit comments

Comments
 (0)