From 5f13d66cd6ba534da4e9dbb2b1c20424fae2df48 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 5 Oct 2026 06:29:06 +0000 Subject: [PATCH] chore: release packages --- .changeset/11002-storage-usage-flag.md | 11 - .changeset/11092-flow-label-reader.md | 19 -- .changeset/11095-kpi-tile-invalidation-pin.md | 6 - .changeset/11170-node-slot-keys.md | 22 -- .changeset/11266-subforms-columns-mirror.md | 26 --- .changeset/11336-served-embedded-listviews.md | 11 - .changeset/11340-book-tree-prefilter.md | 15 -- .../11345-inline-grid-columns-spec-rule.md | 9 - .changeset/11383-record-chrome-image.md | 5 - .../11396-master-detail-details-entry.md | 4 - .changeset/11546-readonly-canvas-select.md | 17 -- .changeset/11564-flex-bag-children-list.md | 20 -- .../11569-line-items-child-object-optional.md | 22 -- .../11573-any-component-emit-headroom.md | 32 --- .changeset/11577-textarea-read-breaks.md | 9 - .changeset/11581-one-view-builder.md | 21 -- .changeset/11583-refused-writes-said.md | 36 ---- .changeset/11588-summary-hints-field-only.md | 24 --- .changeset/11591-org-flows-copy.md | 10 - .../11598-dashboard-slot-entry-reads.md | 17 -- .changeset/11601-ref-dataset-widget.md | 25 --- .changeset/11605-i18n-view-no-object.md | 12 -- ...11605-plugin-charts-objectname-optional.md | 24 --- ...05-plugin-dashboard-objectname-optional.md | 27 --- .../11605-plugin-form-objectname-optional.md | 31 --- .../11605-plugin-grid-objectname-optional.md | 21 -- ...11605-plugin-kanban-objectname-optional.md | 24 --- .../11605-plugin-list-objectname-optional.md | 24 --- .changeset/11605-react-requires-object.md | 24 --- .changeset/11608-partialschema-retire.md | 23 --- .changeset/11610-grid-keys-camelcase.md | 33 --- ...in-detail-related-list-columns-optional.md | 23 --- .../11615-simple-inline-section-entry.md | 23 --- .changeset/11625-density-inside-config.md | 13 -- .changeset/11628-external-envelope.md | 11 - .changeset/11631-lookup-cascade-clear.md | 13 -- .changeset/8347-baseschema-closed-face.md | 18 -- QUICK_REFERENCE.md | 2 +- apps/console/CHANGELOG.md | 32 +++ apps/console/package.json | 2 +- packages/app-shell/CHANGELOG.md | 190 ++++++++++++++++++ packages/app-shell/package.json | 2 +- packages/auth/CHANGELOG.md | 2 + packages/auth/package.json | 2 +- packages/cli/CHANGELOG.md | 37 ++++ packages/cli/package.json | 2 +- packages/collaboration/CHANGELOG.md | 19 ++ packages/collaboration/package.json | 2 +- packages/components/CHANGELOG.md | 51 +++++ packages/components/package.json | 2 +- packages/core/CHANGELOG.md | 32 +++ packages/core/package.json | 2 +- packages/create-plugin/CHANGELOG.md | 2 + packages/create-plugin/package.json | 2 +- packages/data-objectstack/CHANGELOG.md | 16 ++ packages/data-objectstack/package.json | 2 +- packages/fields/CHANGELOG.md | 58 ++++++ packages/fields/package.json | 2 +- packages/i18n/CHANGELOG.md | 54 +++++ packages/i18n/package.json | 2 +- packages/layout/CHANGELOG.md | 21 ++ packages/layout/package.json | 2 +- packages/mobile/CHANGELOG.md | 15 ++ packages/mobile/package.json | 2 +- packages/permissions/CHANGELOG.md | 15 ++ packages/permissions/package.json | 2 +- packages/plugin-ai/CHANGELOG.md | 23 +++ packages/plugin-ai/package.json | 2 +- packages/plugin-calendar/CHANGELOG.md | 30 +++ packages/plugin-calendar/package.json | 2 +- packages/plugin-charts/CHANGELOG.md | 48 +++++ packages/plugin-charts/package.json | 2 +- packages/plugin-chatbot/CHANGELOG.md | 25 +++ packages/plugin-chatbot/package.json | 2 +- packages/plugin-dashboard/CHANGELOG.md | 64 ++++++ packages/plugin-dashboard/package.json | 2 +- packages/plugin-designer/CHANGELOG.md | 45 +++++ packages/plugin-designer/package.json | 2 +- packages/plugin-detail/CHANGELOG.md | 54 +++++ packages/plugin-detail/package.json | 2 +- packages/plugin-editor/CHANGELOG.md | 19 ++ packages/plugin-editor/package.json | 2 +- packages/plugin-form/CHANGELOG.md | 98 +++++++++ packages/plugin-form/package.json | 2 +- packages/plugin-gantt/CHANGELOG.md | 30 +++ packages/plugin-gantt/package.json | 2 +- packages/plugin-grid/CHANGELOG.md | 71 +++++++ packages/plugin-grid/package.json | 2 +- packages/plugin-kanban/CHANGELOG.md | 65 ++++++ packages/plugin-kanban/package.json | 2 +- packages/plugin-list/CHANGELOG.md | 51 +++++ packages/plugin-list/package.json | 2 +- packages/plugin-map/CHANGELOG.md | 22 ++ packages/plugin-map/package.json | 2 +- packages/plugin-markdown/CHANGELOG.md | 19 ++ packages/plugin-markdown/package.json | 2 +- packages/plugin-report/CHANGELOG.md | 26 +++ packages/plugin-report/package.json | 2 +- packages/plugin-timeline/CHANGELOG.md | 42 ++++ packages/plugin-timeline/package.json | 2 +- packages/plugin-tree/CHANGELOG.md | 29 +++ packages/plugin-tree/package.json | 2 +- packages/plugin-view/CHANGELOG.md | 33 +++ packages/plugin-view/package.json | 2 +- packages/providers/CHANGELOG.md | 15 ++ packages/providers/package.json | 2 +- packages/react-runtime/CHANGELOG.md | 2 + packages/react-runtime/package.json | 2 +- packages/react/CHANGELOG.md | 44 ++++ packages/react/package.json | 2 +- packages/runner/CHANGELOG.md | 25 +++ packages/runner/package.json | 2 +- packages/sdui-parser/CHANGELOG.md | 19 ++ packages/sdui-parser/package.json | 2 +- packages/types/CHANGELOG.md | 176 ++++++++++++++++ packages/types/package.json | 2 +- packages/vscode-extension/CHANGELOG.md | 16 ++ packages/vscode-extension/package.json | 2 +- 118 files changed, 1676 insertions(+), 746 deletions(-) delete mode 100644 .changeset/11002-storage-usage-flag.md delete mode 100644 .changeset/11092-flow-label-reader.md delete mode 100644 .changeset/11095-kpi-tile-invalidation-pin.md delete mode 100644 .changeset/11170-node-slot-keys.md delete mode 100644 .changeset/11266-subforms-columns-mirror.md delete mode 100644 .changeset/11336-served-embedded-listviews.md delete mode 100644 .changeset/11340-book-tree-prefilter.md delete mode 100644 .changeset/11345-inline-grid-columns-spec-rule.md delete mode 100644 .changeset/11383-record-chrome-image.md delete mode 100644 .changeset/11396-master-detail-details-entry.md delete mode 100644 .changeset/11546-readonly-canvas-select.md delete mode 100644 .changeset/11564-flex-bag-children-list.md delete mode 100644 .changeset/11569-line-items-child-object-optional.md delete mode 100644 .changeset/11573-any-component-emit-headroom.md delete mode 100644 .changeset/11577-textarea-read-breaks.md delete mode 100644 .changeset/11581-one-view-builder.md delete mode 100644 .changeset/11583-refused-writes-said.md delete mode 100644 .changeset/11588-summary-hints-field-only.md delete mode 100644 .changeset/11591-org-flows-copy.md delete mode 100644 .changeset/11598-dashboard-slot-entry-reads.md delete mode 100644 .changeset/11601-ref-dataset-widget.md delete mode 100644 .changeset/11605-i18n-view-no-object.md delete mode 100644 .changeset/11605-plugin-charts-objectname-optional.md delete mode 100644 .changeset/11605-plugin-dashboard-objectname-optional.md delete mode 100644 .changeset/11605-plugin-form-objectname-optional.md delete mode 100644 .changeset/11605-plugin-grid-objectname-optional.md delete mode 100644 .changeset/11605-plugin-kanban-objectname-optional.md delete mode 100644 .changeset/11605-plugin-list-objectname-optional.md delete mode 100644 .changeset/11605-react-requires-object.md delete mode 100644 .changeset/11608-partialschema-retire.md delete mode 100644 .changeset/11610-grid-keys-camelcase.md delete mode 100644 .changeset/11613-plugin-detail-related-list-columns-optional.md delete mode 100644 .changeset/11615-simple-inline-section-entry.md delete mode 100644 .changeset/11625-density-inside-config.md delete mode 100644 .changeset/11628-external-envelope.md delete mode 100644 .changeset/11631-lookup-cascade-clear.md delete mode 100644 .changeset/8347-baseschema-closed-face.md diff --git a/.changeset/11002-storage-usage-flag.md b/.changeset/11002-storage-usage-flag.md deleted file mode 100644 index 530ee875ea..0000000000 --- a/.changeset/11002-storage-usage-flag.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -'@object-ui/app-shell': minor ---- - -The console asks `GET /api/v1/usage/storage` only when the runtime serves it (objectui#11002). On a self-hosted or open-source runtime, an environment admin's console used to request that cloud-only endpoint on every shell mount and log a 404 each time. Now neither the storage-capacity banner nor the read-rate report asks unless the runtime config's `features.storageUsage` is `true`. The cloud distribution sends that key exactly when it mounts the endpoint (cloud#2481), and every other runtime sends no key. - -**Clause-②: yes (widening)** — the exported `RuntimeFeatures` type gains one optional member, `storageUsage?: boolean`, so `AppShellRuntimeConfig.features` and the value `getRuntimeConfig()` returns carry it too. It is `false` by default and after any runtime-config payload whose `features.storageUsage` is not the literal `true` (absent, `false`, `'true'` and `1` all read as `false`). It is `true` only when the payload sends `true`. As with the other feature keys, a payload with no `features` object leaves the current value. Nothing else on the package entry changes: no export is added or removed, and no existing member changes type. - -**Behaviour change.** `ConsoleShell`'s two banners request the endpoint only when the viewer is the environment admin, as before, and `features.storageUsage` is on. Both read the same flag and still share one request. A cloud runtime older than the one that serves the key (cloud#2517) sends no key, so its admins see neither banner until that runtime is upgraded. - -Not published: the accessor the banners read, `isStorageUsageServed()`. Like its siblings `isMarketplaceEnabled()` and `isAiStudioEnabled()`, it ships inside `dist/` but is not exported from the package entry. `useStorageUsageReading` and `useReadRateReading` are unchanged and keep their `enabled = true` default. diff --git a/.changeset/11092-flow-label-reader.md b/.changeset/11092-flow-label-reader.md deleted file mode 100644 index d41aa3d33c..0000000000 --- a/.changeset/11092-flow-label-reader.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -'@object-ui/app-shell': minor -'@object-ui/console': patch ---- - -The screen-flow runner names the flow by its label, in the user's language (objectui#11092, the objectui half of objectstack#20318). - -Since `@objectstack/spec` 17.6.0 every answer that evaluated a flow carries the flow's authored label as `AutomationResult.flowLabel` (objectstack#20633). `FlowRunner` now resolves the flow's display name in this order: the active language's `flows.FLOW.label` from the app's translation bundle, then the served `flowLabel`, then the flow's API name. The bundle is the one the runner already reads for screen headings and field copy, and the lookup is the spec's own `translateFlow`. - -Where it shows: - -- **The runner header.** A line above the screen's heading names the flow. The heading is still the step's own title (or the `flowRunner.title` fallback), and it is still the dialog's accessible name. -- **The completion toast.** `Flow "{{flow}}" completed` names the flow by the resolved label instead of its API name. A flow's own `successMessage` still takes precedence. The message key and its translations are unchanged. - -All three places that open the runner pass the label through: a flow action on a list or toolbar, a flow action on a record page, and the developer Flow Runs page's Test Run panel. A resume answer that pauses on a further screen carries the label forward. - -Against a server older than objectstack#20633 no label is served, so the header line and the toast show the flow's API name, unless the app's bundle translates `flows.FLOW.label` for the active language. - -**Clause-②: yes (widening).** The exported `ScreenFlowState` type gains one optional member, `flowLabel`, typed by the contract as `Pick` of `AutomationResult`'s `flowLabel` (an optional string). `FlowRunnerProps.state` accepts it through that type. No prop, export or i18n key is added or removed, and no existing member changes type. diff --git a/.changeset/11095-kpi-tile-invalidation-pin.md b/.changeset/11095-kpi-tile-invalidation-pin.md deleted file mode 100644 index ea0853a999..0000000000 --- a/.changeset/11095-kpi-tile-invalidation-pin.md +++ /dev/null @@ -1,6 +0,0 @@ ---- ---- - -No package released: tests and one doc comment, no behaviour change. `@object-ui/plugin-dashboard` gains a pin that a dataset-bound KPI tile (a `metric` widget with no dimensions) re-reads on the data-invalidation bus once its query's answer names the dataset's base object. The answer names it on every dataset query since objectstack-ai/objectstack#20644, which `@objectstack/spec` 17.6.0 declares as `AnalyticsResult.object`. The widget already subscribed on that key, so no executable code changed (objectui#11095). - -`@object-ui/app-shell`'s `refreshDashboardData` doc comment stops describing that gap as current. The comment is not inert text: `tsc` keeps it in the emitted `dist/views/DashboardView.js`, which is published. It sits above a non-exported function, so it is in no `.d.ts`. It changes no export, type or behaviour, so it releases nothing and ships with the next release of the group. diff --git a/.changeset/11170-node-slot-keys.md b/.changeset/11170-node-slot-keys.md deleted file mode 100644 index 7b858f2bd1..0000000000 --- a/.changeset/11170-node-slot-keys.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -"@object-ui/types": minor -"@object-ui/cli": minor -"@object-ui/core": minor -"@object-ui/sdui-parser": minor -"@object-ui/components": minor ---- - -**Clause-②: yes (narrowing)** - -One declaration of the per-type NODE SLOTS — the keys other than `children` through which a renderer hands authored nodes back to `SchemaRenderer` — and three readers that walk it instead of stopping at `children` (objectui#11170, the follow-up PR #11126's Acceptance notes filed). - -New on `@object-ui/types`, beside `BaseSchema.children`: `NODE_SLOT_DECLARATIONS` (one row per renderer, under every registry spelling that resolves to it), `nodeSlotsFor(type)`, `nodeSlotPathSegments(path)` and `nodeSlotValues(node, path)`, with the types `NodeSlotDeclaration`, `NodeSlotRow`, `NodeSlotSegment` and `NodeSlotValue`. A position is spelled as a key path — `trigger`, `items[].content`, `regions[].components`, `items[]`, `report.sections[].content` — and the value at its end is one node or a list of nodes. The `page:*` rows are `@objectstack/spec`'s `pageComponentSlotPositions()` placed on the type whose renderer reads each position, pinned against that export in both directions; every other row is objectui's own, pinned against the live renderer. `body` stays retired as the generic child-list key (objectui#6771): it appears only on the four `page:*` types whose renderer still paints it for stored documents, marked `retired`. - -Accept sets that narrow, each reader FROM → TO: - -- `@object-ui/cli` — `objectui check`'s unevaluated-expression refusal (`findUnbindableTextExpressions`). FROM: the document root and every node its `children` hold. TO: those, and every node under a slot its type declares — so a `${…}` on `title` / `label` / `value` / `description` of a node under a dialog's `content`, a tab item's `content`, a page's `regions[].components`, a carousel item, a detail view's `tabs[].content` is now refused with the slot path (`items → 0 → content → value`). The false-refusal rows of PR #11126's ablation 2 stay green: a form's `fields[]`, a grid's `columns[]` and `{ "type": "multiple" }` are not slots. Measured over this repository's own JSON corpus and docs fences: no new finding. -- `@object-ui/core` — `validateSchema`. FROM: `validateChildren` recursed through `children` only. TO: it also recurses through the declared slots, so an invalid node under one (a retired `crud` spelling under `dialog.content`, an `INVALID_SCHEMA` member) is reported with its own path, spelled as `schema.items[0].content`. Measured over the same corpus: no new finding. -- `@object-ui/sdui-parser` — `validateTree`. FROM: the walk descended `children` alone, and a manifest entry carried no slot. TO: `ManifestComponent` gains `slots?: readonly string[]`, `manifestFromConfigs` gains `opts.slotsFor` (hand it `nodeSlotsFor`) and projects each entry's non-retired positions, and `validateTree` descends them — an unknown component, an unknown or mis-typed prop or an illegal enum under a slot now draws its diagnostic. A manifest built without the option serialises byte-identically and keeps the `children`-only reach. The `RETIRED_CHILD_LIST_KEY` refusals are unchanged. -- `@object-ui/components` — the `kind:'html'` page's compile manifest (`getJsxManifest`) is built with `slotsFor`, so an html-tier page whose slot-held node fails validation now fails to compile the way one under `children` does. Narrowing: a page that compiled with an unknown tag under a `dialog`'s `content` no longer does. - -Docs: `content/docs/utilities/cli.mdx`'s "Component nodes only" rule, the gate's own docblock, `validateChildren`'s comment and the parser's header now say the walk follows `children` and the declared slots; the declaration's header is where the slot list is explained. diff --git a/.changeset/11266-subforms-columns-mirror.md b/.changeset/11266-subforms-columns-mirror.md deleted file mode 100644 index 0b64d2d845..0000000000 --- a/.changeset/11266-subforms-columns-mirror.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -'@object-ui/types': minor ---- - -A form view's `subforms[].columns` entry is judged by `@objectstack/spec`'s `InlineGridColumnSchema` now, by reference, so `objectui validate` and `os validate` give one verdict on a column (objectui#11266). - -BREAKING (`@object-ui/types`): the accept set of the tolerant face narrows. (The bump is `minor` by this repo's release model: objectui's major follows the `@objectstack` family major, and its own breaking changes ship as `minor` with the breaking semantics stated here.) - -`@objectstack/spec` 17.6.0 holds `FormViewSchema.subforms[].columns` to its closed inline grid column schema (objectstack-ai/objectstack#20927). The `object-form` mirror still read `z.array(z.any())` there, so `objectui validate` accepted columns that `os validate` refuses. - -What each face does now: - -- **zod (`@object-ui/types/zod`).** NARROWS on the tolerant face (`safeValidateSchema`, which `objectui validate` runs) and on the strict authoring face, wherever `subforms` is read: the object-view `form` slot and the `object-form` mirror. A column with an undeclared key is refused at the column, with one `unrecognized_keys` issue naming the key. A column that declares `type: 'currency'` and carries `scale` is refused at that `scale`, in the spec's own words. A bare field-name string is refused at the column with `invalid_type`. Each verdict is the spec schema's, because the column is handed to it. -- **TypeScript.** A `subforms[].columns` entry on `ObjectFormSchema` (and so on `ObjectViewSchema['form']`) is `InlineGridColumn` from `@objectstack/spec/data`, by reference, where it was `any`. A string column no longer compiles, and neither does an object literal with an undeclared column key. - -**Migration.** - -- FROM `columns: ['product', 'quantity']` → TO `columns: [{ name: 'product' }, { name: 'quantity' }]` -- FROM a column carrying a key `InlineGridColumn` does not declare → TO the same column without that key. A column that declares no `type` takes its label, type and the rest from the child object's field. -- FROM `{ name: 'amount', type: 'currency', scale: 2 }` → TO `{ name: 'amount', type: 'currency' }`. A currency amount's decimal places come from its currency's minor unit, not from the column. - -Not refused here: a `scale` on a column that declares no `type` (`{ name: 'amount', scale: 2 }`) when its child field is a currency. Seeing that takes the child object's fields, which are not in the document the validator judges. `defineStack` refuses it at publish, and the master-detail form reports it at render. - -The parse output is the spec schema's too: a column `readonlyWhen` or `requiredWhen` written as a string comes back from `safeValidateSchema` as the spec's `{ dialect: 'cel', source }` envelope. The document you pass in is not changed. - -**Clause-②: yes (narrowing)**: a `subforms[].columns` entry that is not a valid `InlineGridColumn` used to parse with its value kept, and is now refused at the column. diff --git a/.changeset/11336-served-embedded-listviews.md b/.changeset/11336-served-embedded-listviews.md deleted file mode 100644 index a20bdf1956..0000000000 --- a/.changeset/11336-served-embedded-listviews.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -'@object-ui/app-shell': patch ---- - -An object page's view tab, and the breadcrumb that names the open view, draw the label of a view the object document embeds as the server served it (objectui#11336). - -Since `@objectstack/spec` 17.6.0 (objectstack#21072) the server translates the `listViews` an object document embeds, from `objects.OBJECT._views.KEY` and with a published edit kept over the packaged catalog, as it already did for `/meta/view` documents. The console still ran its own catalog over those labels a second time, so a published edit to such a view drew as the packaged string. A view counts as served now when its key is in the served `/meta/object` document's own `listViews`, read before the console merges view documents into it, as well as when a `/meta/view` document carries its name. Its label is drawn as given. A view only the console derives, such as a stack container's expansion, is still named by the client catalog. - -Against a server older than that release, a view the object document embeds arrives untranslated and is now drawn as authored. - -**Clause-②: no.** Nothing on the package entry changes. The predicate (`isServedView`) and its hook (`useServedViewItems`) are not exported from `@object-ui/app-shell`. diff --git a/.changeset/11340-book-tree-prefilter.md b/.changeset/11340-book-tree-prefilter.md deleted file mode 100644 index 5697452e6a..0000000000 --- a/.changeset/11340-book-tree-prefilter.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -'@object-ui/console': patch ---- - -The docs portal's book sidebar now shows what the book resolver answers, with nothing narrowing the docs in front of it (objectui#11340, ADR-0046 §6.4). The resolver decides book membership. Since objectstack#20980 (`@objectstack/spec` 17.6.0), the framework's `resolveBookTree` keeps a doc in a book's synthetic Uncategorized group only when the doc belongs to one of the book's packages: the book's own, or a group's `package`. The console's port of that resolver now scopes its Uncategorized group the same way. The console's pre-filter, which dropped other packages' docs before resolving, is gone. - -What a reader sees: - -- **Unchanged: another package's ungrouped doc** stays out of a book's Uncategorized group, and the book's own ungrouped docs stay in it. -- **Unchanged: a group's `package` (corner 1).** That package's unplaced docs are listed under the book's Uncategorized group, as the resolver answers. The portal already listed them, because the pre-filter kept every package the book draws from. -- **Changed: a doc of another package pinned by a group's `pages` (corner 2)** is still listed where the pin places it, and now under its own label. Before, the pre-filter had dropped the doc, so the entry showed the doc's bare name. -- **Changed: a book with no package of its own whose group names a `package`.** The groups that name no package now match docs from every package by `include`, as the resolver answers. Before, they matched only the docs of the packages the groups name. -- **Changed: a doc of another package whose `group` names a `pages` group with no `...`.** It is no longer listed under the book's Uncategorized group. That group collects no doc by its key, and the resolver keeps another package's unplaced doc out of Uncategorized. - -The book cards' doc counts and the book a doc opens in follow the same answer. Nothing else changes: no export, prop, type member or i18n key is added or removed. diff --git a/.changeset/11345-inline-grid-columns-spec-rule.md b/.changeset/11345-inline-grid-columns-spec-rule.md deleted file mode 100644 index 36fe4feb37..0000000000 --- a/.changeset/11345-inline-grid-columns-spec-rule.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -'@object-ui/plugin-form': patch ---- - -`deriveColumns`, the default columns of a master-detail inline grid whose author listed none, now takes which columns it draws, their order and which of them are `defaultHidden` from `@objectstack/spec`'s `deriveInlineGridColumns`, and its visible budget from the spec's `DEFAULT_MAX_INLINE_GRID_COLUMNS` (objectui#11345). The rule is the spec's now, so objectstack's `field-no-consumers` lint credits exactly the columns this grid draws. - -The output does not change. The signature is the same, and each column's label, cell type, options, lookup target, conditional rules and computed expression are still built from the child field here, including a plain text column for a field whose definition is falsy. The module-level `DEFAULT_MAX_INLINE_COLUMNS` constant, which the package entry never exported, is removed. - -`@object-ui/plugin-form` raises its `@objectstack/spec` floor from `^17.0.0` to `^17.6.0`, because its published entry now imports `deriveInlineGridColumns` and `DEFAULT_MAX_INLINE_GRID_COLUMNS`, which the spec first exports in 17.6.0. diff --git a/.changeset/11383-record-chrome-image.md b/.changeset/11383-record-chrome-image.md deleted file mode 100644 index ece815f8e0..0000000000 --- a/.changeset/11383-record-chrome-image.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@object-ui/components': minor ---- - -The record page header draws the record's picture beside its title, from the field the object names in its object-level `imageField` (`@objectstack/spec` 17.6.0, objectstack#21182) (objectui#11383). The picture is the served row's value of that `image` or `avatar` field: the expanded `{ url }`, a bare file id (drawn from the stable download path), a URL string, or the first drawable entry of a list. An object that declares no `imageField`, an empty value, or a field the reader may not see draws nothing, with no initials or placeholder; `recordChrome: false` keeps the bare header. The declaration is the only channel: no `page:header` prop is read and no field is read by a conventional name such as `logo` or `avatar`. diff --git a/.changeset/11396-master-detail-details-entry.md b/.changeset/11396-master-detail-details-entry.md deleted file mode 100644 index 6b6b4ef2d1..0000000000 --- a/.changeset/11396-master-detail-details-entry.md +++ /dev/null @@ -1,4 +0,0 @@ ---- ---- - -No release. `@object-ui/plugin-form`'s exported `MasterDetailDetailConfig` is now derived from `@objectstack/spec`'s `details` entry by reference (`ComponentPropsMap['object-master-detail-form'].details[]`, a closed shape since 17.6.0) instead of restating it by hand, minus the one member the renderer does not read (`sortField`: retired here by objectui#11070, and on objectstack `main` by objectstack-ai/objectstack#21589, unreleased after 17.6.0; the subtraction holds on both spec shapes). Member for member the type is the same as before — the same keys, the same member types, `columns` the same inline grid column — so what a caller may write does not move. The `object-master-detail-form` registration declares `of: 'object'` and a description for `details`; tests and the console's parity prose follow (objectui#11396). diff --git a/.changeset/11546-readonly-canvas-select.md b/.changeset/11546-readonly-canvas-select.md deleted file mode 100644 index a5c0199732..0000000000 --- a/.changeset/11546-readonly-canvas-select.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -'@object-ui/app-shell': patch ---- - -On a read-only package, a click on a flow canvas node in Studio Automations selects the node and opens its inspector read-only again (objectui#11546). - -On a read-only canvas the node's press stopped short of claiming the event, so it reached the -canvas background. The background cleared the selection and took the pointer, and the browser -then fired the click at the canvas instead of the node, so the inspector rail kept its empty -state and a packaged flow's node configuration could not be read. - -A press on a node in the designer now belongs to the node on a read-only canvas too. The click -selects the node and the inspector opens with every input disabled, as objectui#11124 set out. -Only the drag is withheld: a press-and-drag on a read-only node moves nothing and writes nothing. -The editable designer drags and selects as before, and the Delete key still deletes only on an -editable canvas. Outside design mode, where a node click selects nothing, a press on a node still -pans the canvas. diff --git a/.changeset/11564-flex-bag-children-list.md b/.changeset/11564-flex-bag-children-list.md deleted file mode 100644 index a509c73404..0000000000 --- a/.changeset/11564-flex-bag-children-list.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -'@object-ui/types': minor ---- - -`FlexBlockNode`, the TypeScript type of an authored `flex` node, types its bag's child list as nodes: `properties.children` is `SchemaNode | SchemaNode[]`, where it was `unknown[] | SchemaNode` (objectui#11564). - -**Clause-②: yes (narrowing)**, TypeScript authoring face only, shipped as `minor` per this repository's version policy. The list is the form a `flex` node is authored in (`{ type: 'flex', properties: { children: [ … ] } }`), and until now each entry was `unknown`, while a single child was already judged as a node. Each list entry is now judged as a node too, against its own `type`: - -- an entry whose `type` no declaration names, or an object with no `type`, no longer compiles; -- an entry that is itself a list no longer compiles; -- a misspelled key on a node type without an index signature (the spec-derived nodes, such as `element:text`, and a closed `CustomNodeRegistry` entry) no longer compiles. Node types that extend `BaseSchema` keep its index signature until objectui#8347 removes it, so a misspelled key on one of them still compiles, in the list exactly as in a single child; -- a primitive entry (a string, a number, `null`) still compiles, as in every node slot. - -The type is the flat `FlexSchema` mirror's own `children` member, by reference, which is also the member `FlexLayoutProps` declares. Every other member of `FlexBlockNode` and of its bag is still read off the `FlexBlockSchema` arm. - -What does NOT move: every zod face and every runtime path. `FlexBlockSchema` keeps `z.array(z.unknown())` for the list, because `@objectstack/spec`'s page walk already judges each entry there, once, at its real path, on the tolerant and the strict face (objectui#11223). The one entry kind where the faces now differ is a nested list, which the walk passes through unvisited and the TypeScript face refuses; `@object-ui/types`' mirror-parity ledger records the divergence. - -**Migration.** Give each list entry its declared node type (or `DeclaredNode`), declare a custom type in `CustomNodeRegistry`, and flatten a nested list into the one list. - -⚠️ **Dated note, 2026-10-04 — `BaseSchema` loses its index signature — objectui#8347.** At this change, "Node types that extend `BaseSchema` keep its index signature until objectui#8347 removes it, so a misspelled key on one of them still compiles" held. Later in this same release objectui#8347 removed that signature, so a misspelled key on a node type that extends `BaseSchema` no longer compiles either, in the list exactly as in a single child. `.changeset/8347-baseschema-closed-face.md` states what ships. The rest of this entry is kept as the reading of this change. diff --git a/.changeset/11569-line-items-child-object-optional.md b/.changeset/11569-line-items-child-object-optional.md deleted file mode 100644 index a56ee25ec7..0000000000 --- a/.changeset/11569-line-items-child-object-optional.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -'@object-ui/plugin-form': minor ---- - -The `record:line_items` registration no longer declares `childObject` required, -so the page compile accepts a node whose `dataSource` binding names the child -object (objectui#11569). - -`@objectstack/spec`'s `record:line_items` row leaves `childObject` optional, -because the node's `dataSource` binding can supply it, and the renderer agrees: -`dataSource.object` lands on `childObject` before the panel reads the node. The -registration still declared `required: true`, and the page compile reads the -registration, so a bound node with no `childObject` of its own was refused with -`missing-required-prop` and the save failed. - -**Clause-②: yes (widening)** — a `record:line_items` node that names its child object -through `dataSource.object` and sets no `childObject` now compiles and saves. A -node that names its child object in neither place also compiles now: the panel -shows its configuration hint naming `childObject` and loads nothing, as it did -before when such a node reached it. `relationshipField` and `columns` are still -required. The published `childObject` input now carries a description that says -the binding can supply it. diff --git a/.changeset/11573-any-component-emit-headroom.md b/.changeset/11573-any-component-emit-headroom.md deleted file mode 100644 index 3c34851bbe..0000000000 --- a/.changeset/11573-any-component-emit-headroom.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -'@object-ui/types': patch ---- - -fix(types): `AnyComponentSchema`'s declaration prints every category union by name, so `@object-ui/types` no longer sits at the edge of TypeScript's serialization ceiling (objectui#11573) - -`tsc` prints an inferred type in full wherever a declaration uses it, and past -its serialization ceiling it refuses with TS7056 ("The inferred type of this -node exceeds the maximum length the compiler will serialize"). `@object-ui/types` -then emits no declarations, and every consumer of `@object-ui/types/zod` fails -with TS7016. `AnyComponentSchema` listed every category union inline, so its -declaration printed the sum of all of them: measured with TypeScript's own -counter, it read under one percent short of the ceiling against -`@objectstack/spec` built from objectstack `main`, and the Spec Main Shape Gate -had already gone red on it once. - -Each of the sixteen category unions `AnyComponentSchema` lists now has a named -type in its own module — an interface that extends the union's inferred type -and adds no member (`LayoutZodType`, `PublicBlockComponentZodType` and their -siblings) — and `AnyComponentSchema`'s declaration prints a reference to each -instead of its body. - -What changes for a consumer is the printed `.d.ts` TEXT of existing exports, -and nothing else: `AnyComponentSchema` and the sixteen unions are the same -values, and every type read through `z.input` / `z.output` is unchanged. The -new names are exported from their own modules, which is what lets the -declaration reference them; they are not added to the `@object-ui/types/zod` -entry, so nothing new is importable. - -`packages/types/src/__tests__/any-component-emit-headroom-11573.test.ts` reads -the declaration's size with the compiler's own counter, fails when it crosses a -tenth of the ceiling below it, and lists every member as named or inline. diff --git a/.changeset/11577-textarea-read-breaks.md b/.changeset/11577-textarea-read-breaks.md deleted file mode 100644 index a8a182c385..0000000000 --- a/.changeset/11577-textarea-read-breaks.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -'@object-ui/plugin-detail': patch ---- - -fix(plugin-detail): `record:details` read mode shows a `textarea` value with its line breaks (objectui#11577) - -A multi-line `textarea` value, such as a note with a blank line in it, read as one line on the record page: the details body drew every `textarea` value with the grid's one-line cell, which folds line breaks into spaces and cuts a long value off with an ellipsis. The record form's read-only field and, since objectui#11562, the inline editor already kept the breaks. - -The details body now draws a `textarea` value with the fields package's own read display, the read-only branch of `TextAreaField`, which is the display the record form uses. Line breaks, blank lines and a trailing newline show as stored. A single-line value reads as the same line; a long one now wraps at the column width instead of ending in an ellipsis. Other field types, plain text included, render exactly as before, and grid cells keep their one-line display. diff --git a/.changeset/11581-one-view-builder.md b/.changeset/11581-one-view-builder.md deleted file mode 100644 index b6af894c4a..0000000000 --- a/.changeset/11581-one-view-builder.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -'@object-ui/app-shell': patch ---- - -"Save as view" now saves a Kanban view the platform accepts, and both Create View doors save the same view from the same dialog choices (objectui#11581). - -The Create View dialog persists a new view through two doors: "Save as view" on the object data -page, and Create View on the object page (the view tab bar's add button, and the view-config -panel's create mode). The two assembled the saved view separately, and only the object page's -door copied the view's columns into the type blocks that carry a field list of their own. So: - -- a Kanban saved through "Save as view" had no `kanban.columns`, which `@objectstack/spec` - requires ("Fields to show on cards"), and the platform's view write door refused it; -- a Gallery saved through "Save as view" had no `gallery.visibleFields`, so its cards showed - nothing under the title, while the same choices on the object page showed the view's columns. - -Both doors now build the view through one builder. Each door still supplies its own columns (the -data page's current columns, or the object's default business columns), and "Save as view" still -folds the page's URL conditions into the view's `filter`. The builder writes those columns into -`kanban.columns`, and into `gallery.visibleFields` when the gallery declares none. A view created -on the object page is saved exactly as before. diff --git a/.changeset/11583-refused-writes-said.md b/.changeset/11583-refused-writes-said.md deleted file mode 100644 index 642bd69e61..0000000000 --- a/.changeset/11583-refused-writes-said.md +++ /dev/null @@ -1,36 +0,0 @@ ---- -'@object-ui/app-shell': patch -'@object-ui/i18n': patch ---- - -A refused save, pin, reorder, view setting, report save, publish or discard in the console is now said to the user, and the view-config panel no longer reports a refused save as saved (objectui#11583). - -objectui#11578 made the two Create View doors say a refused save. The console's other metadata -writes on the object page, the report page and the draft bar still caught a refusal with a -console line and nothing else, so a permission refusal or a spec refusal looked like a saved -change: - -- the view-config panel's Save on an existing view; -- pinning or unpinning a view, and reordering views in "Manage views"; -- a toolbar setting on a list view (density, sort, columns, hidden fields), when the server - refuses it (the console's own permission check already said its refusal, and still does); -- the report editor's Save; -- Publish and Discard draft on the draft bar of those two editors. - -Each now raises the refusal through the console's error toast, with the save door's own -message: the field-anchored issues of a validation refusal, one per line, or the refusal's text. -The draft bar's toasts lead with "Publish failed" or "Discard failed", two new strings in all -ten language packs; the others lead with "Failed to save". Set as default, which already raised -an untranslated "Failed to set default view" with no reason, now does the same. - -The report editor waits for its save. It closes once the report is saved; a refused save leaves -it open with the edit in place, so Save can be pressed again (it used to close at once, and -reopening it showed the stored report). Save is disabled, and the editor read-only, while the -save is in flight. - -The view-config panel waits for the save before it reports the edit as saved. A refused save -leaves the panel dirty, so Save stays enabled for a retry, and the "unpublished changes" -indicator is not raised for a draft that was never written. Save is disabled while the save is -in flight. `ViewConfigPanel`'s `onSave` accepts any return, as it did when it was typed `void`: -the panel awaits it, and `false` (returned, or resolved by a promise) or a rejection means the -save was refused; anything else, nothing included, is read as saved. diff --git a/.changeset/11588-summary-hints-field-only.md b/.changeset/11588-summary-hints-field-only.md deleted file mode 100644 index 41caf8086e..0000000000 --- a/.changeset/11588-summary-hints-field-only.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -'@object-ui/plugin-grid': patch ---- - -The `object-grid` summary footer reads `currency`, `defaultCurrency`, -`precision` and `scale` from the object field only. A column that carries one -of these keys no longer changes the footer (objectui#11588). - -`ListColumnSchema` (`@objectstack/spec/ui`) is a strict object, and it declares -none of the four keys. A view that authors one on a column is refused at publish -with `unrecognized_keys`. `useColumnSummary` read them anyway, and the column's -value won over the field's, so a column `currency` re-coded the total and a -column `scale` re-sized it. That read is retired rather than declared upstream, -and the footer now takes these hints the way it already took `currencyConfig` -and `max`, and the way the list cell above it reads them. The census behind the -ruling found no view that writes one of these keys on a grid column. - -**Behaviour change.** A grid handed a column that carries `currency`, -`defaultCurrency`, `precision` or `scale` (which validation refuses) now formats -its footer from the object field's definition, falling back to the tenant -currency as before. A column's declared `type` still decides the footer's unit, -and a grid whose columns carry none of the four keys is unchanged. The exported -`useColumnSummary` signature does not change. Its `fieldMetadata` argument is -where these hints go. diff --git a/.changeset/11591-org-flows-copy.md b/.changeset/11591-org-flows-copy.md deleted file mode 100644 index cacd51d0b6..0000000000 --- a/.changeset/11591-org-flows-copy.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -'@object-ui/app-shell': patch -'@object-ui/i18n': patch ---- - -Studio's "Organization flows" page no longer says its drafts publish atomically, and a deep link to a flow that is not on the page no longer says no metadata designers are registered (objectui#11591). - -On the package-less page (`/studio/~org/automations`), the pending-changes sheet read "Publishing releases the 1 pending draft of this package atomically." That page has no package, and its Publish promotes each draft by itself: a draft that fails stays pending while the others go live. The sheet now says so there, through a new `preview.changes.confirmNoteSeparate` plural family in all ten language packs. A package's sheet keeps its sentence unchanged. `DraftChangesPanel` picks the sentence from its `packageId` prop: with a package, the atomic sentence; without one, the per-draft sentence. - -On the Automations pillar, the canvas chip read the designer registry for the open flow's type. With no flow open (a deep link naming a flow the list does not hold, or an empty list), it found none and showed "No metadata designers are registered in this session…" beside the right message, on a page whose flow designer is registered. The chip now reads the registry for the pillar's own type, `flow`, as the configuration panel beside it already did. The notice still shows when no designer is registered, whether or not a flow is open. diff --git a/.changeset/11598-dashboard-slot-entry-reads.md b/.changeset/11598-dashboard-slot-entry-reads.md deleted file mode 100644 index ca09124af2..0000000000 --- a/.changeset/11598-dashboard-slot-entry-reads.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -'@object-ui/plugin-dashboard': patch -'@object-ui/plugin-designer': patch -'@object-ui/types': patch ---- - -The dashboard surfaces read every `widgets[]` entry without leaning on `BaseSchema`'s index signature: a widget key is read on the widget arm alone, and the `chart` node is built as a private hand-off type (objectui#11598). - -**N1, the `chart` producers.** `DashboardRenderer` and `DashboardGridLayout` build a `chart` node for a series widget bound to inline rows, and compose two render keys onto it: the dashboard palette (`colors`) and `isAnimationActive: false`, the deterministic first paint inside the grid (#2756). `ChartSchema` declares neither key, on either face, and the chart renderer reads both. Each producer now checks its literal against a hand-off type private to this package, `ChartSchema` plus those two keys, and hands the node on with no cast; the type is not exported, and the keys stay off `@object-ui/types`, because the strict authoring face refuses both on an authored `chart` node. Nothing drawn changes. - -**N2, widget keys on the slot entry.** An entry of `widgets[]` is a widget or a component node placed in the slot (a `metric-card`), and only the widget declares the widget keys (`dataset`, `options`, `chartConfig`, `filter`, `component`, `colorVariant`, `values`, `dimensions`, …). Every read of one now narrows the entry to the widget first, on `DashboardRenderer`, `DashboardGridLayout`, `DashboardWithConfig` and `DashboardEditor`. What changes is confined to a `metric-card` entry that carries a widget key, which `@object-ui/types/zod`'s strict face refuses and only the tolerant face accepts: - -- a `metric-card` carrying `dataset` draws its card; it used to draw the dataset tile in the card's place, on both dashboard surfaces; -- a `metric-card` carrying `options` draws its own keys; `options` used to be spread over them, so `options.value` replaced `value`; -- a `metric-card` carrying a `component` draws its card; the envelope's node used to be drawn instead. - -A document the strict face accepts draws exactly as before. `@object-ui/types`' docblocks on `DASHBOARD_COMPONENT_WIDGET_TYPES` and the Zod widget vocabulary, which described the dataset tile in the card's place and the `options` spread as live, were corrected to match; no type in it changes. In `DashboardEditor`, a `metric-card` entry is no longer offered the Color Variant select: the card declares no `colorVariant`, `MetricCard` draws nothing from it, and a pick stored a key publish refuses. A widget is offered it as before. diff --git a/.changeset/11601-ref-dataset-widget.md b/.changeset/11601-ref-dataset-widget.md deleted file mode 100644 index 94ad2ff040..0000000000 --- a/.changeset/11601-ref-dataset-widget.md +++ /dev/null @@ -1,25 +0,0 @@ ---- -'@object-ui/app-shell': minor ---- - -A Studio form field that declares the `ref:dataset` widget now renders a dataset picker instead of the JSON editor fallback (objectui#11601). - -The metadata forms had no renderer for `ref:dataset`, so a field declaring it fell back to a raw -JSON box with a "falling back to JSON" note. The new widget offers the analytics dataset catalog, -showing each dataset's label beside its name and its description after it, and writes the dataset -name. It works for a field in a form section and for a column of a repeater row, in both the grid -and the card layouts. A stored dataset the catalog does not list stays visible and is marked -"(not found)". While the catalog is loading the field shows the stored name, and if the catalog -fails to load the field shows the load-failure notice beside a text box that stays editable. A -form whose host does not supply a catalog shows a plain text input for the dataset name. - -The report inspector now supplies its dataset catalog to the report's form. A joined report's -block row picks up the dataset picker once the spec's "Joined blocks" row declares `ref:dataset` -(objectstack#21714). Until objectui is built against a spec that carries that declaration, a -block's `dataset` is still entered as free text. - -The dataset option list that the report and dashboard-widget inspectors already show is unchanged. - -`SchemaForm`'s `widgetContext` prop gains one optional member, `datasets`, the catalog the new widget -reads. It is additive: a host that passes no `datasets` renders exactly as before, except that a -`ref:dataset` field now shows the text input instead of the JSON fallback. diff --git a/.changeset/11605-i18n-view-no-object.md b/.changeset/11605-i18n-view-no-object.md deleted file mode 100644 index ea28b0f885..0000000000 --- a/.changeset/11605-i18n-view-no-object.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -'@object-ui/i18n': minor ---- - -All ten locale packs gain `view.noObject`, the hint an object-bound block shows -when its node names its object in neither place (objectui#11605). - -**Clause-②: yes (widening)** — a new key, `view.noObject`, in every pack. English -reads "No object named: set {{property}} or dataSource.object.", the wording of -`element.number.noObject` with the property as a hole; each translation is that -key's own translation with the same hole. `{{property}}` is the block's object -key, interpolated and never translated. No existing key changes. diff --git a/.changeset/11605-plugin-charts-objectname-optional.md b/.changeset/11605-plugin-charts-objectname-optional.md deleted file mode 100644 index 77eb3c0afa..0000000000 --- a/.changeset/11605-plugin-charts-objectname-optional.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -'@object-ui/plugin-charts': minor ---- - -The `object-chart` and `view:chart` registrations no longer declare `objectName` -required, so the page compile accepts a node whose `dataSource` binding names the -object, and a chart that names its object in neither place shows a hint instead -of an empty frame (objectui#11605). - -`object-chart` has no spec row. The binding doc says a node bound by -`dataSource.object` needs no `objectName` of its own, and the renderer agrees: -`dataSource.object` lands on `objectName` before the chart reads the node. The -registrations still declared `required: true`, and the page compile reads them, -so a bound chart with no `objectName` of its own was refused with -`missing-required-prop` and the save failed. - -**Clause-②: yes (widening)** — an `object-chart` (or `view:chart`) node that -names its object through `dataSource.object` and sets no `objectName` now -compiles and saves. A node that names its object in neither place also compiles -now, and the chart shows "No object named: set objectName or dataSource.object." -where it used to draw an empty frame with no message. A chart with inline -`data`, a `dataset` or a `bind` path shows no hint and renders as before. The -published `objectName` inputs now carry a description that says the binding can -supply them. diff --git a/.changeset/11605-plugin-dashboard-objectname-optional.md b/.changeset/11605-plugin-dashboard-objectname-optional.md deleted file mode 100644 index 99b04d4df2..0000000000 --- a/.changeset/11605-plugin-dashboard-objectname-optional.md +++ /dev/null @@ -1,27 +0,0 @@ ---- -'@object-ui/plugin-dashboard': minor ---- - -The `object-metric` and `object-pivot` registrations no longer declare -`objectName` required, so the page compile accepts a node whose `dataSource` -binding names the object, and a node that names its object in neither place -shows a hint instead of a value or an empty table (objectui#11605). - -`@objectstack/spec`'s `object-metric` row leaves `objectName` optional, because -the node's `dataSource` binding can supply it; `object-pivot` has no spec row, -and the binding doc says a bound node needs no `objectName` of its own. Both -renderers agree: `dataSource.object` lands on `objectName` before the block -reads the node. The registrations still declared `required: true`, and the page -compile reads them, so a bound node with no `objectName` of its own was refused -with `missing-required-prop` and the save failed. - -**Clause-②: yes (widening)** — an `object-metric` or `object-pivot` node that -names its object through `dataSource.object` and sets no `objectName` now -compiles and saves. A node that names its object in neither place also compiles -now, and shows "No object named: set objectName or dataSource.object." where the -metric used to draw a bare dash and the pivot an empty state saying its query -returned no records. A metric with an authored `fallbackValue`, and a pivot with -inline `data` or a `bind` path, show no hint and render as before. -`object-data-table` is unchanged: it reads no binding, so its `objectName` stays -required. The published `objectName` inputs now carry a description that says -the binding can supply them. diff --git a/.changeset/11605-plugin-form-objectname-optional.md b/.changeset/11605-plugin-form-objectname-optional.md deleted file mode 100644 index 1ae0ac887f..0000000000 --- a/.changeset/11605-plugin-form-objectname-optional.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -'@object-ui/plugin-form': minor ---- - -The `object-form`, `view:form`, `embeddable-form` and -`object-master-detail-form` registrations no longer declare `objectName` -required, so the page compile accepts a node whose `dataSource` binding names the -object, and a form that names its object in neither place shows a hint instead of -a form with no fields (objectui#11605). - -`@objectstack/spec`'s `object-form` and `object-master-detail-form` rows leave -`objectName` optional, because the node's `dataSource` binding can supply it; -`embeddable-form` has no spec row, and the binding doc says a bound node needs no -`objectName` of its own. Each renderer agrees: `dataSource.object` lands on -`objectName` before the form reads the node. The registrations still declared -`required: true`, and the page compile reads them, so a bound form with no -`objectName` of its own was refused with `missing-required-prop` and the save -failed. - -**Clause-②: yes (widening)** — an `object-form`, `view:form`, `embeddable-form` -or `object-master-detail-form` node that names its object through -`dataSource.object` and sets no `objectName` now compiles and saves. A node that -names its object in neither place also compiles now, and shows "No object named: -set objectName or dataSource.object." where it used to draw a field-less card, a -public form that could not submit, or an empty parent form. An `object-form` -or `view:form` whose fields are declared inline shows no hint and renders as -before: non-empty `customFields`, or `sections` whose every field is an inline -field, the target-less collector the `tabbed`, `wizard`, `split`, `drawer` and -`modal` variants render. `formId` on `embeddable-form` and `details` on -`object-master-detail-form` are still required. The published `objectName` -inputs now carry a description that says the binding can supply them. diff --git a/.changeset/11605-plugin-grid-objectname-optional.md b/.changeset/11605-plugin-grid-objectname-optional.md deleted file mode 100644 index 2286715b68..0000000000 --- a/.changeset/11605-plugin-grid-objectname-optional.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -'@object-ui/plugin-grid': minor ---- - -The `object-grid` and `view:grid` registrations no longer declare `objectName` -required, so the page compile accepts a node whose `dataSource` binding names the -object (objectui#11605). - -`@objectstack/spec`'s `object-grid` row leaves `objectName` optional, because the -node's `dataSource` binding can supply it, and the renderer agrees: -`dataSource.object` lands on `objectName` before the grid reads the node. The -registration still declared `required: true`, and the page compile reads the -registration, so a bound node with no `objectName` of its own was refused with -`missing-required-prop` and the save failed. - -**Clause-②: yes (widening)** — an `object-grid` (or `view:grid`) node that names -its object through `dataSource.object` and sets no `objectName` now compiles and -saves. A node that names its object in neither place also compiles now; the grid -answers it at runtime with its own "Object name required for data fetching" -error, as it did before when such a node reached it. The published `objectName` -input now carries a description that says the binding can supply it. diff --git a/.changeset/11605-plugin-kanban-objectname-optional.md b/.changeset/11605-plugin-kanban-objectname-optional.md deleted file mode 100644 index 16c4ae3fd2..0000000000 --- a/.changeset/11605-plugin-kanban-objectname-optional.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -'@object-ui/plugin-kanban': minor ---- - -The `object-kanban` registration no longer declares `objectName` required, so -the page compile accepts a board whose `dataSource` binding names the object, and -a board that names its object in neither place shows a hint instead of an empty -board (objectui#11605). - -`@objectstack/spec`'s `object-kanban` row leaves `objectName` optional, because -the node's `dataSource` binding can supply it, and the renderer agrees: -`dataSource.object` lands on `objectName` before the board reads the node. The -registration still declared `required: true`, and the page compile reads the -registration, so a bound board with no `objectName` of its own was refused with -`missing-required-prop` and the save failed. - -**Clause-②: yes (widening)** — an `object-kanban` node that names its object -through `dataSource.object` and sets no `objectName` now compiles and saves. A -node that names its object in neither place also compiles now, and the board -shows "No object named: set objectName or dataSource.object." where it used to -draw an empty board reading "No cards". A board with rows from inline `data` -(an empty array included), a `bind` path or a parent view shows no hint and -renders as before. The published `objectName` input now carries a description -that says the binding can supply it. diff --git a/.changeset/11605-plugin-list-objectname-optional.md b/.changeset/11605-plugin-list-objectname-optional.md deleted file mode 100644 index 6834e706dd..0000000000 --- a/.changeset/11605-plugin-list-objectname-optional.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -'@object-ui/plugin-list': minor ---- - -The `list-view` and `view:list` registrations no longer declare `objectName` -required, so the page compile accepts a node whose `dataSource` binding names the -object, and a list that names its object in neither place shows a hint instead of -an empty list (objectui#11605). - -`list-view` has no spec row. The binding doc says a node bound by -`dataSource.object` needs no `objectName` of its own, and the schema validator -counts the binding as a `list-view` record source. The renderer agrees: -`dataSource.object` lands on `objectName` before the list reads the node. The -registrations still declared `required: true`, and the page compile reads them, -so a bound list with no `objectName` of its own was refused with -`missing-required-prop` and the save failed. - -**Clause-②: yes (widening)** — a `list-view` (or `view:list`) node that names its -object through `dataSource.object` and sets no `objectName` now compiles and -saves. A node that names its object in neither place also compiles now, and the -list shows "No object named: set objectName or dataSource.object." where it used -to draw the "Nothing here yet" empty state. A list with inline `data` shows no -hint and renders as before. The published `objectName` input now carries a -description that says the binding can supply it. diff --git a/.changeset/11605-react-requires-object.md b/.changeset/11605-react-requires-object.md deleted file mode 100644 index 1ab4b16b6a..0000000000 --- a/.changeset/11605-react-requires-object.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -'@object-ui/react': minor ---- - -`ElementDataSourceGate` takes a `requiresObject` prop: when a placement opts in -and its node names its object in neither place, the gate renders a short "no -object named" hint instead of the block (objectui#11605). - -The object-bound registrations stopped declaring their object key required, -because the `dataSource` binding can supply it and the page compile has no "this -key or that binding" form. So the page compile accepts a node that names no -object at all, and the runtime's answer is the only signal left for it. Several -blocks answered such a node with an empty list, board, form, chart, dash or pivot, -which reads as an empty query. - -**Clause-②: yes (widening)** — `ElementDataSourceGateProps` gains the optional -`requiresObject` boolean. With it set, the gate reads the mapping's object key -(`objectName` unless the mapping names another) on the node after the binding -lands, so a node bound by `dataSource.object` renders as before; a node that names -no object gets the hint, "No object named: set objectName or dataSource.object." -(`data-testid` `{testId}-no-object`), and the block is not mounted. Without the -prop, or with a mapping whose `object` is `false`, nothing changes. The hint is -drawn after the view states, so a binding that is still resolving or failed to -resolve keeps its own panel. diff --git a/.changeset/11608-partialschema-retire.md b/.changeset/11608-partialschema-retire.md deleted file mode 100644 index 8454b6c333..0000000000 --- a/.changeset/11608-partialschema-retire.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -'@object-ui/types': minor ---- - -**BREAKING — `PartialSchema` is RETIRED from `@object-ui/types`** (objectui#11608, enforce-or-remove). The utility type leaves the `.` entry, the one entry that published it, with no replacement alias. - -**Clause-②: yes (narrowing)**, shipped as `minor` per this repository's version policy: one name leaves the published surface, and the break is stated here. - -- **Why.** The alias had no reader: no producer, doc or skill in this repository, and none in the sibling repositories the census could read. While `BaseSchema` carried an index signature it declared `type` alone, whatever `T` was (objectui#6397). objectui#8347 removed that signature, which made the alias work as written and brought its published-export question due. A published capability with no reader is retired, not kept for its sunk cost. -- **objectui#8347's note.** That release note says `PartialSchema` works as written once `BaseSchema` lost its index signature. This removal supersedes it. - -**FROM** `import type { PartialSchema } from '@object-ui/types'`, annotating a value as `PartialSchema`. -**TO** the node type's own declared members: annotate a whole node with its node type (`ButtonSchema`, `InputSchema`, …). For a partial value, write `Partial & { type: T['type'] }` inline. It keeps every member `T` declares, with `type` required and the rest optional, and a misspelled key is still refused. - -```ts -// before -import type { ButtonSchema, PartialSchema } from '@object-ui/types'; -const patch: PartialSchema = { type: 'button', label: 'Save' }; - -// after: the import above is a compile error naming the symbol -import type { ButtonSchema } from '@object-ui/types'; -const patch: Partial & { type: ButtonSchema['type'] } = { type: 'button', label: 'Save' }; -``` diff --git a/.changeset/11610-grid-keys-camelcase.md b/.changeset/11610-grid-keys-camelcase.md deleted file mode 100644 index b190a6e41b..0000000000 --- a/.changeset/11610-grid-keys-camelcase.md +++ /dev/null @@ -1,33 +0,0 @@ ---- -'@object-ui/types': minor -'@object-ui/fields': minor ---- - -The `grid` field's eight field-level keys are camelCase now, and their snake_case spellings are retired and refused by name on every face (objectui#11610). - -BREAKING (`@object-ui/types`, `@object-ui/fields`): a `grid` field's metadata, and a `form` `fields[]` entry of `type: 'grid'`, must spell these keys in camelCase. (The bump is `minor` by this repo's release model: objectui's major follows the `@objectstack` family major, and its own breaking changes ship as `minor` with the breaking semantics stated here.) - -- FROM `min_rows` → TO `minRows` -- FROM `max_rows` → TO `maxRows` -- FROM `allow_add` → TO `allowAdd` -- FROM `allow_delete` → TO `allowDelete` -- FROM `allow_reorder` → TO `allowReorder` -- FROM `total_field` → TO `totalField` -- FROM `add_label` → TO `addLabel` -- FROM `sort_field` → TO `sortField` - -Why: `@objectstack/spec`'s runtime form field declares config keys in camelCase only, so it could not declare these keys as they were written (objectstack-ai/objectstack#21704, fork 2, ruled B). There is no alias window and no dual read: no reader reads the snake_case spellings any more, and no stored producer outside this repository's own fixtures, which move with this change, was found to write them. - -**Migration.** Rename each key; its value stays the same. `totalField` keeps its meaning: the CHILD column summed into the grid's footer, which is the value a spec `amountField` carries. It is not the parent field the spec's own `totalField` names on a master-detail subform. - -What each face does with a snake_case key now: - -- **TypeScript.** `GridFieldMetadata` and `FormField` declare each as a `never` member, so an authored value no longer compiles. The camelCase members carry the value types the snake_case members had, and `FormField` still takes each one by reference to `GridFieldMetadata`. -- **zod (`@object-ui/types/zod`).** NARROWS on the tolerant face (`safeValidateSchema`, which `objectui validate` runs) and on the strict authoring face: a form field entry carrying a snake_case key used to parse with the value kept, and is now refused with one `invalid_type` issue at that key. The message leads with ``Did you mean `min_rows` → `minRows`?`` (each key names its own replacement). WIDENS on both faces: the camelCase keys parse, judged by the same value types. -- **The `grid` widget (`@object-ui/fields`).** `GridField` reads the camelCase keys only. A field whose metadata still carries a snake_case key is drawn as an inline alert naming each retired key beside its replacement (`role="alert"`, `data-testid="grid-field-retired-keys"`) instead of the grid, and the same text goes to `console.error` once. Nothing is thrown, so the rest of the form still draws, and the rows are not changed. - -New export from `@object-ui/types`: `GRID_FIELD_RETIRED_KEYS`, the snake_case to camelCase map that the zod refusals and the widget both read, with its key type `GridFieldRetiredKey`. - -`@object-ui/plugin-form`'s master-detail and line-items adapters now hand the grid the camelCase keys, typed against `GridFieldMetadata` instead of cast through `any`. What they draw does not change. - -**Clause-②: yes (narrowing)**: the camelCase spellings widen each face, and the snake_case spellings narrow it. diff --git a/.changeset/11613-plugin-detail-related-list-columns-optional.md b/.changeset/11613-plugin-detail-related-list-columns-optional.md deleted file mode 100644 index cd4865ee0a..0000000000 --- a/.changeset/11613-plugin-detail-related-list-columns-optional.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -'@object-ui/plugin-detail': minor ---- - -The `record:related_list` registration no longer declares `columns` required, so -the page compile accepts a related list that lists no columns of its own -(objectui#11613). - -`@objectstack/spec`'s `record:related_list` row leaves `columns` optional, and the -renderer agrees: a `dataSource` binding that names a view lands that view's -columns on the node, and with neither the list derives its columns from the -related object (its `highlightFields`, otherwise its listable fields). The -registration still declared `required: true`, and the page compile reads the -registration, so a node with no `columns` was refused with -`missing-required-prop` and the save failed. - -**Clause-②: yes (widening)** — a `record:related_list` node that sets no `columns` -now compiles and saves, whether a `dataSource` binding names a view (the list -draws the view's columns) or not (the list draws columns derived from the related -object, as it already did when such a node reached it). Authored `columns` still -win over both. `objectName` and `relationshipField` are still required, as the -spec row requires them. The published `columns` input now carries a description -that says where the columns come from when it is absent. diff --git a/.changeset/11615-simple-inline-section-entry.md b/.changeset/11615-simple-inline-section-entry.md deleted file mode 100644 index e9a4be6164..0000000000 --- a/.changeset/11615-simple-inline-section-entry.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -'@object-ui/plugin-form': minor -'@object-ui/types': minor ---- - -The default (`simple`) `object-form` draws a self-describing inline section entry, as the `tabbed`, `wizard`, `split`, `drawer` and `modal` forms already did (objectui#11615). Before, the default form resolved every section entry against its parent field pool and skipped an inline `{ name, … }` entry whose name the pool did not hold. The same section drew that entry on every other form type and drew nothing for it on `simple`, apart from a console warning when the object declared the name. - -**Clause-②: yes (widening, with one break for TypeScript readers).** Authored input is only widened: nothing either package accepted before is refused now. Code that READS `ObjectFormSection.fields` can break at compile time, described under "Breaking for TypeScript readers" below. - -- `@object-ui/types`: `ObjectFormSection.fields` is `(string | SpecFormFieldInput | FormField)[]`. The new arm is the form view's `{ field, … }` entry, and it is `@objectstack/spec`'s `FormFieldInput` by reference, not a copy. The form already drew that entry. Before, a TypeScript author could not annotate it, because `FormField` requires `name` and types `field` as an object. The zod mirror is unchanged: a section's `fields` entry is still `z.any()` there. -- `@object-ui/plugin-form`, layout types: the section `fields` of the five layout configs is `NonNullable`, by reference. Those configs are `FormSectionConfig` (tabbed), `WizardStepConfig`, `SplitFormSectionConfig`, `DrawerFormSectionConfig` and `ModalFormSectionConfig`, reached through the exported `TabbedFormSchema`, `WizardFormSchema`, `SplitFormSchema`, `DrawerFormSchema` and `ModalFormSchema`. Each of these layouts already drew the `{ field }` entry. Before, their types refused it, and `ObjectForm` passing an authored section to them would no longer compile once the section type named the entry. -- `@object-ui/plugin-form`, section drawing: on `simple`, an entry that names itself is drawn as it stands, whatever the field pool holds. Such an entry is an object whose `field` is not a string and whose `name` is a string. This is the existing `isInlineFieldDef` predicate that the submit-target rule already reads. It does not require `type`: the spec's inline arm makes `type` optional, and the other five forms draw a typeless entry as the default input. -- `@object-ui/plugin-form`, inline collector: a `simple` form with no data source and no `submitHandler`, whose sections list only inline entries, is now a self-contained collector, as on the other five forms. It opens on `initialValues` / `initialData`, and its `onSuccess` receives the collected values. Before, that form drew no fields and refused the submit. Its submit carve-out now reads the shared `hasInlineFieldSource`. - -**Breaking for TypeScript readers of `ObjectFormSection.fields`** (still `minor`: objectui's major follows the `@objectstack` family major, so its own breaks ship as `minor` and are stated here). A consumer that narrowed an entry with `typeof entry === 'string' ? entry : entry.name` compiled while every object entry was typed as an inline `FormField`. It no longer compiles: `Property 'name' does not exist on type 'FormFieldInput | FormField'`. The read was already wrong at runtime for a `{ field }` entry, where it gave `undefined`. Remedy: name an entry by its arm. The string is the name itself, the `{ field }` entry names its field by `field`, and the inline entry names it by `name`. `@object-ui/plugin-form` now exports `sectionEntryName(entry)`, which applies exactly that rule and returns `undefined` for an entry that names nothing. It sits beside `resolveSectionGroupReferences`, whose result it reads. The repo's own reader, an app-shell test over that resolver's result, is respelled this way. - -**What stays refused or warned.** - -- A field name and a `{ field }` entry still resolve against the pool on `simple`. A name the pool does not hold is still dropped, and still warned about once when the object declares it, because top-level `fields` and `sections` still intersect (objectui#9884). -- An inline entry with no `name` is malformed and is still not drawn on `simple`. -- A form with no data source and no `submitHandler` still refuses its submit with `DataSource is required for form submission (inline mode not configured)` unless every section entry is inline. One name or `{ field }` entry among inline ones is enough to refuse, on all six forms. - -**Behaviour change for an existing schema.** On `simple`, an inline entry whose name the object declares but top-level `fields` leaves out used to be dropped with the intersection warning. It is now drawn as its own definition, with no warning, as on the other five forms. With a data source, its value is still written only if the object declares the field. As on every form, a key the object does not declare is stripped from the write. diff --git a/.changeset/11625-density-inside-config.md b/.changeset/11625-density-inside-config.md deleted file mode 100644 index 0a7884c763..0000000000 --- a/.changeset/11625-density-inside-config.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -'@object-ui/app-shell': patch ---- - -A grid toolbar change on a served view is stored where the save door keeps it, so it survives a reload (objectui#11625). This covers density, a column-header sort and the hide-fields toggle, on a packaged view such as the showcase's `showcase_task.default` and on a view a user created. - -The console saves a toolbar change on a served view by sending the whole stored row, the ViewItem envelope `{ name, object, viewKind, config }`, back to `PUT /api/v1/meta/view/NAME`. It wrote the changed key beside `config` instead of inside it. The door judges a body that has a `config` by the spec's `viewItem` member and drops undeclared top-level keys, as ADR-0005 appendix (c) designs it. So it answered `200`, stored no change, and the view reverted on reload. - -The changed key now goes into `config` when it is a key `ListViewSchema` declares: `rowHeight`, `sort`, `hiddenFields` or `inlineEdit`. Every other key stays on the envelope, where the row keeps it: `columnState`, `isDefault`, `isPinned`, `sortOrder` and `visibility`. A row without a `config` is still written flat. So is the personalization overlay (the row with `_isOverride`), whose flat body the door already keeps. - -Still open: the console builds each save from the view as it was when the page loaded. A second toolbar change to the same view in the same session therefore overwrites the first one. For example, changing density and then sorting keeps only the sort after a reload. This was true before this fix, on every kind of row. - -**Clause-②: no.** Nothing on the package entry changes. `buildPersistedViewBody` is exported from `ObjectView.tsx` but not from `@object-ui/app-shell`. diff --git a/.changeset/11628-external-envelope.md b/.changeset/11628-external-envelope.md deleted file mode 100644 index 82d7d8e2d2..0000000000 --- a/.changeset/11628-external-envelope.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -'@object-ui/app-shell': patch ---- - -The External Datasource panel in Setup and Studio reads the `{ success, data }` envelope its routes answer (objectui#11628). On a federated datasource such as the showcase's `showcase_external`, the Tables tab listed no remote tables. "Refresh catalog" showed no snapshot time, and "Run validation" replaced the panel with a render error (`Cannot read properties of undefined (reading 'length')`). Because the list was empty, the import dialog could not be opened. The client read `tables`, `draft`, `catalog` and the validation verdict from the top of the body, but the server puts each one under `data`. The panel now lists the remote tables, shows the snapshot time after a refresh, renders the validation rows, and opens the import dialog on the generated draft. - -Refusals on these routes now reach the user. Every refusal used to read `[object Object]`, because the client turned the ADR-0112 `{ error: { code, message } }` object into a string. That covered a missing capability, an unknown remote table, an unreachable datasource, and a capability refusal from "Import as Object". The panel now shows the server's message and code. The "federation is not enabled on this server" hint now appears when the server answers `503 SERVICE_UNAVAILABLE`. Before, it never did, because the client compared against a code the server no longer sends. - -A successful response that is not the `{ success: true, data }` envelope is now an error that names the route. Before, the panel showed it as an empty list. - -**Clause-②: no.** Nothing is added to or removed from the package entry. The changed module is not exported from it. diff --git a/.changeset/11631-lookup-cascade-clear.md b/.changeset/11631-lookup-cascade-clear.md deleted file mode 100644 index ddeab673df..0000000000 --- a/.changeset/11631-lookup-cascade-clear.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -'@object-ui/components': patch ---- - -A lookup whose `dependsOn` names a parent field drops its selection when that parent changes or is cleared (objectui#11631). - -Before, the picker re-scoped its candidate list to the new parent but kept the record already chosen. An invoice whose Account was switched from Northwind to Contoso saved Contoso beside a Northwind contact. The server checks only that a reference exists, so it accepted the pair. Now the form clears the dependent lookup as soon as any parent that scopes it takes a different value. It writes `null`, or `[]` for a multi-value lookup, so an edit clears the stored value instead of leaving it unchanged. A cleared lookup that scopes another lookup clears that one too. - -What does not clear it: opening an existing record, whether its values are present when the form mounts or arrive after; switching a mounted drawer to another record; a `resetOnSubmit` or Cancel reset; a change to any other field. A lookup that holds nothing is not written to. Which parents count is read from the same field-level `dependsOn` array the picker scopes its query by, so a `dependsOn` the picker ignores clears nothing either. - -The rule covers every form the `form` renderer draws, including the object form and its drawer, modal, split, tabbed and wizard variants. The console's form-view page (`/forms/:name`, `/f/:slug`) has its own renderer and is not changed here. - -**Clause-②: no.** Nothing on the package entry changes. No export, prop, type member or i18n key is added, and `CASCADE_OPTION_WIDGET_TYPES` is unchanged. diff --git a/.changeset/8347-baseschema-closed-face.md b/.changeset/8347-baseschema-closed-face.md deleted file mode 100644 index 79bb52a605..0000000000 --- a/.changeset/8347-baseschema-closed-face.md +++ /dev/null @@ -1,18 +0,0 @@ ---- -'@object-ui/types': minor -'@object-ui/plugin-kanban': patch -'@object-ui/plugin-timeline': minor ---- - -**`BaseSchema` no longer declares `[key: string]: any`** (objectui#8347, executing the objectui#7927 ruling: the TypeScript face is a contract). Every node type extends `BaseSchema`, so a node literal annotated with its node type now refuses a key that no declaration names, a misspelled key included, where it used to type it `any`. The correct spelling compiles as before. - -**Clause-②: yes (narrowing)**, shipped as `minor` per this repository's version policy. The removal narrows the TypeScript authoring face of every node type; the `visibleWhen` change below widens both faces to the envelope the spec's own parse writes. - -- **What does not move.** The zod faces keep their accept sets for every key but `visibleWhen`: the tolerant mirror is still `.passthrough()`, so `safeValidateSchema` keeps an undeclared key, and the derived strict face refuses it as before. `ComponentRendererProps`, the renderer props type, keeps its own index signature. Nothing a renderer draws changes. -- **The bound.** TypeScript runs its excess-property check only on a fresh object literal. A value that reached its annotation through a variable of a wider type is not re-checked. -- **`PartialSchema` works as written.** With the signature gone, `keyof T` is the literal member union again, so the alias keeps `T`'s declared members, optional, with `type` required. While the signature stood it declared `type` alone (objectui#6397). -- **`BaseSchema.visibleWhen` is the spec's `EvaluatedExpressionInput`**, by reference: a predicate string, or the `{ dialect, source }` envelope. The zod twin takes `EvaluatedExpressionInputSchema`'s verdict without its transform, so a string parses to itself. A dialect-less envelope, an unknown dialect and a blank predicate are refused, as the spec refuses them. Both faces read `string` before, which refused the envelope a spec parse writes into this key. -- **`@object-ui/plugin-kanban`.** `ObjectKanban` reads the `sort` the element data-source gate writes through a read type private to the package. `ObjectKanbanSchema` still declares no `sort` (objectui#8174). Nothing drawn changes. -- **`@object-ui/plugin-timeline`.** `TimelineRenderSchema`, the `schema` prop type of the exported `TimelineRenderer`, gains one optional member: the `onItemClick` slot `ObjectTimeline` composes. That is a one-member optional widening of an exported prop type. `TimelineSchema`, the authoring face, still declares no `onItemClick`. Nothing drawn changes. - -**Migration.** Where a literal stops compiling, the key is misspelled (fix it) or not declared on that node type (declare it on the type that reads it, by reference to the `@objectstack/spec` row, or remove it). Do not cast past the error. `props`, the legacy alias of `properties`, is not declared on the TypeScript face; the renderer still reads it, so write `properties`. diff --git a/QUICK_REFERENCE.md b/QUICK_REFERENCE.md index f03ff44a53..9d413049a8 100644 --- a/QUICK_REFERENCE.md +++ b/QUICK_REFERENCE.md @@ -124,7 +124,7 @@ release path runs the sync itself: `changeset:version` bumps every manifest and this block in the same commit, so a release can no longer leave the block a version behind (objectui#5394 — that had happened once per release, three times). -- **Version:** 17.7.0 (the version every `@object-ui/*` manifest carries — they are one +- **Version:** 17.8.0 (the version every `@object-ui/*` manifest carries — they are one `fixed` group in `.changeset/config.json`, so a release moves all of them together) - **Spec:** `@objectstack/spec` ^17.0.0 (declared by the root `package.json` and by `apps/console/package.json`) diff --git a/apps/console/CHANGELOG.md b/apps/console/CHANGELOG.md index e67d45921b..a88c7cf41b 100644 --- a/apps/console/CHANGELOG.md +++ b/apps/console/CHANGELOG.md @@ -1,5 +1,37 @@ # @object-ui/console +## 17.8.0 + +### Patch Changes + +- 39a3e91: The screen-flow runner names the flow by its label, in the user's language (objectui#11092, the objectui half of objectstack#20318). + + Since `@objectstack/spec` 17.6.0 every answer that evaluated a flow carries the flow's authored label as `AutomationResult.flowLabel` (objectstack#20633). `FlowRunner` now resolves the flow's display name in this order: the active language's `flows.FLOW.label` from the app's translation bundle, then the served `flowLabel`, then the flow's API name. The bundle is the one the runner already reads for screen headings and field copy, and the lookup is the spec's own `translateFlow`. + + Where it shows: + + - **The runner header.** A line above the screen's heading names the flow. The heading is still the step's own title (or the `flowRunner.title` fallback), and it is still the dialog's accessible name. + - **The completion toast.** `Flow "{{flow}}" completed` names the flow by the resolved label instead of its API name. A flow's own `successMessage` still takes precedence. The message key and its translations are unchanged. + + All three places that open the runner pass the label through: a flow action on a list or toolbar, a flow action on a record page, and the developer Flow Runs page's Test Run panel. A resume answer that pauses on a further screen carries the label forward. + + Against a server older than objectstack#20633 no label is served, so the header line and the toast show the flow's API name, unless the app's bundle translates `flows.FLOW.label` for the active language. + + **Clause-②: yes (widening).** The exported `ScreenFlowState` type gains one optional member, `flowLabel`, typed by the contract as `Pick` of `AutomationResult`'s `flowLabel` (an optional string). `FlowRunnerProps.state` accepts it through that type. No prop, export or i18n key is added or removed, and no existing member changes type. +- 7c9a6b1: The docs portal's book sidebar now shows what the book resolver answers, with nothing narrowing the docs in front of it (objectui#11340, ADR-0046 §6.4). The resolver decides book membership. Since objectstack#20980 (`@objectstack/spec` 17.6.0), the framework's `resolveBookTree` keeps a doc in a book's synthetic Uncategorized group only when the doc belongs to one of the book's packages: the book's own, or a group's `package`. The console's port of that resolver now scopes its Uncategorized group the same way. The console's pre-filter, which dropped other packages' docs before resolving, is gone. + + What a reader sees: + + - **Unchanged: another package's ungrouped doc** stays out of a book's Uncategorized group, and the book's own ungrouped docs stay in it. + - **Unchanged: a group's `package` (corner 1).** That package's unplaced docs are listed under the book's Uncategorized group, as the resolver answers. The portal already listed them, because the pre-filter kept every package the book draws from. + - **Changed: a doc of another package pinned by a group's `pages` (corner 2)** is still listed where the pin places it, and now under its own label. Before, the pre-filter had dropped the doc, so the entry showed the doc's bare name. + - **Changed: a book with no package of its own whose group names a `package`.** The groups that name no package now match docs from every package by `include`, as the resolver answers. Before, they matched only the docs of the packages the groups name. + - **Changed: a doc of another package whose `group` names a `pages` group with no `...`.** It is no longer listed under the book's Uncategorized group. That group collects no doc by its key, and the resolver keeps another package's unplaced doc out of Uncategorized. + + The book cards' doc counts and the book a doc opens in follow the same answer. Nothing else changes: no export, prop, type member or i18n key is added or removed. +- Updated dependencies [c4c506b] + - @object-ui/sdui-parser@17.8.0 + ## 17.7.0 ### Minor Changes diff --git a/apps/console/package.json b/apps/console/package.json index 23993d7e9c..48448edbd0 100644 --- a/apps/console/package.json +++ b/apps/console/package.json @@ -1,6 +1,6 @@ { "name": "@object-ui/console", - "version": "17.7.0", + "version": "17.8.0", "description": "ObjectStack Console — opinionated, fork-ready runtime console built on @object-ui/app-shell with the full plugin set wired up. Ships as a Hono UI plugin serving a pre-built SPA.", "license": "MIT", "type": "module", diff --git a/packages/app-shell/CHANGELOG.md b/packages/app-shell/CHANGELOG.md index eefeecd314..9a6bd4e1cb 100644 --- a/packages/app-shell/CHANGELOG.md +++ b/packages/app-shell/CHANGELOG.md @@ -1,5 +1,195 @@ # @object-ui/app-shell — Changelog +## 17.8.0 + +### Minor Changes + +- d2e8599: The console asks `GET /api/v1/usage/storage` only when the runtime serves it (objectui#11002). On a self-hosted or open-source runtime, an environment admin's console used to request that cloud-only endpoint on every shell mount and log a 404 each time. Now neither the storage-capacity banner nor the read-rate report asks unless the runtime config's `features.storageUsage` is `true`. The cloud distribution sends that key exactly when it mounts the endpoint (cloud#2481), and every other runtime sends no key. + + **Clause-②: yes (widening)** — the exported `RuntimeFeatures` type gains one optional member, `storageUsage?: boolean`, so `AppShellRuntimeConfig.features` and the value `getRuntimeConfig()` returns carry it too. It is `false` by default and after any runtime-config payload whose `features.storageUsage` is not the literal `true` (absent, `false`, `'true'` and `1` all read as `false`). It is `true` only when the payload sends `true`. As with the other feature keys, a payload with no `features` object leaves the current value. Nothing else on the package entry changes: no export is added or removed, and no existing member changes type. + + **Behaviour change.** `ConsoleShell`'s two banners request the endpoint only when the viewer is the environment admin, as before, and `features.storageUsage` is on. Both read the same flag and still share one request. A cloud runtime older than the one that serves the key (cloud#2517) sends no key, so its admins see neither banner until that runtime is upgraded. + + Not published: the accessor the banners read, `isStorageUsageServed()`. Like its siblings `isMarketplaceEnabled()` and `isAiStudioEnabled()`, it ships inside `dist/` but is not exported from the package entry. `useStorageUsageReading` and `useReadRateReading` are unchanged and keep their `enabled = true` default. +- 39a3e91: The screen-flow runner names the flow by its label, in the user's language (objectui#11092, the objectui half of objectstack#20318). + + Since `@objectstack/spec` 17.6.0 every answer that evaluated a flow carries the flow's authored label as `AutomationResult.flowLabel` (objectstack#20633). `FlowRunner` now resolves the flow's display name in this order: the active language's `flows.FLOW.label` from the app's translation bundle, then the served `flowLabel`, then the flow's API name. The bundle is the one the runner already reads for screen headings and field copy, and the lookup is the spec's own `translateFlow`. + + Where it shows: + + - **The runner header.** A line above the screen's heading names the flow. The heading is still the step's own title (or the `flowRunner.title` fallback), and it is still the dialog's accessible name. + - **The completion toast.** `Flow "{{flow}}" completed` names the flow by the resolved label instead of its API name. A flow's own `successMessage` still takes precedence. The message key and its translations are unchanged. + + All three places that open the runner pass the label through: a flow action on a list or toolbar, a flow action on a record page, and the developer Flow Runs page's Test Run panel. A resume answer that pauses on a further screen carries the label forward. + + Against a server older than objectstack#20633 no label is served, so the header line and the toast show the flow's API name, unless the app's bundle translates `flows.FLOW.label` for the active language. + + **Clause-②: yes (widening).** The exported `ScreenFlowState` type gains one optional member, `flowLabel`, typed by the contract as `Pick` of `AutomationResult`'s `flowLabel` (an optional string). `FlowRunnerProps.state` accepts it through that type. No prop, export or i18n key is added or removed, and no existing member changes type. +- b508ac5: A Studio form field that declares the `ref:dataset` widget now renders a dataset picker instead of the JSON editor fallback (objectui#11601). + + The metadata forms had no renderer for `ref:dataset`, so a field declaring it fell back to a raw + JSON box with a "falling back to JSON" note. The new widget offers the analytics dataset catalog, + showing each dataset's label beside its name and its description after it, and writes the dataset + name. It works for a field in a form section and for a column of a repeater row, in both the grid + and the card layouts. A stored dataset the catalog does not list stays visible and is marked + "(not found)". While the catalog is loading the field shows the stored name, and if the catalog + fails to load the field shows the load-failure notice beside a text box that stays editable. A + form whose host does not supply a catalog shows a plain text input for the dataset name. + + The report inspector now supplies its dataset catalog to the report's form. A joined report's + block row picks up the dataset picker once the spec's "Joined blocks" row declares `ref:dataset` + (objectstack#21714). Until objectui is built against a spec that carries that declaration, a + block's `dataset` is still entered as free text. + + The dataset option list that the report and dashboard-widget inspectors already show is unchanged. + + `SchemaForm`'s `widgetContext` prop gains one optional member, `datasets`, the catalog the new widget + reads. It is additive: a host that passes no `datasets` renders exactly as before, except that a + `ref:dataset` field now shows the text input instead of the JSON fallback. + +### Patch Changes + +- 6e9090c: An object page's view tab, and the breadcrumb that names the open view, draw the label of a view the object document embeds as the server served it (objectui#11336). + + Since `@objectstack/spec` 17.6.0 (objectstack#21072) the server translates the `listViews` an object document embeds, from `objects.OBJECT._views.KEY` and with a published edit kept over the packaged catalog, as it already did for `/meta/view` documents. The console still ran its own catalog over those labels a second time, so a published edit to such a view drew as the packaged string. A view counts as served now when its key is in the served `/meta/object` document's own `listViews`, read before the console merges view documents into it, as well as when a `/meta/view` document carries its name. Its label is drawn as given. A view only the console derives, such as a stack container's expansion, is still named by the client catalog. + + Against a server older than that release, a view the object document embeds arrives untranslated and is now drawn as authored. + + **Clause-②: no.** Nothing on the package entry changes. The predicate (`isServedView`) and its hook (`useServedViewItems`) are not exported from `@object-ui/app-shell`. +- 278d244: On a read-only package, a click on a flow canvas node in Studio Automations selects the node and opens its inspector read-only again (objectui#11546). + + On a read-only canvas the node's press stopped short of claiming the event, so it reached the + canvas background. The background cleared the selection and took the pointer, and the browser + then fired the click at the canvas instead of the node, so the inspector rail kept its empty + state and a packaged flow's node configuration could not be read. + + A press on a node in the designer now belongs to the node on a read-only canvas too. The click + selects the node and the inspector opens with every input disabled, as objectui#11124 set out. + Only the drag is withheld: a press-and-drag on a read-only node moves nothing and writes nothing. + The editable designer drags and selects as before, and the Delete key still deletes only on an + editable canvas. Outside design mode, where a node click selects nothing, a press on a node still + pans the canvas. +- b65aa5e: "Save as view" now saves a Kanban view the platform accepts, and both Create View doors save the same view from the same dialog choices (objectui#11581). + + The Create View dialog persists a new view through two doors: "Save as view" on the object data + page, and Create View on the object page (the view tab bar's add button, and the view-config + panel's create mode). The two assembled the saved view separately, and only the object page's + door copied the view's columns into the type blocks that carry a field list of their own. So: + + - a Kanban saved through "Save as view" had no `kanban.columns`, which `@objectstack/spec` + requires ("Fields to show on cards"), and the platform's view write door refused it; + - a Gallery saved through "Save as view" had no `gallery.visibleFields`, so its cards showed + nothing under the title, while the same choices on the object page showed the view's columns. + + Both doors now build the view through one builder. Each door still supplies its own columns (the + data page's current columns, or the object's default business columns), and "Save as view" still + folds the page's URL conditions into the view's `filter`. The builder writes those columns into + `kanban.columns`, and into `gallery.visibleFields` when the gallery declares none. A view created + on the object page is saved exactly as before. +- e8c0b96: A refused save, pin, reorder, view setting, report save, publish or discard in the console is now said to the user, and the view-config panel no longer reports a refused save as saved (objectui#11583). + + objectui#11578 made the two Create View doors say a refused save. The console's other metadata + writes on the object page, the report page and the draft bar still caught a refusal with a + console line and nothing else, so a permission refusal or a spec refusal looked like a saved + change: + + - the view-config panel's Save on an existing view; + - pinning or unpinning a view, and reordering views in "Manage views"; + - a toolbar setting on a list view (density, sort, columns, hidden fields), when the server + refuses it (the console's own permission check already said its refusal, and still does); + - the report editor's Save; + - Publish and Discard draft on the draft bar of those two editors. + + Each now raises the refusal through the console's error toast, with the save door's own + message: the field-anchored issues of a validation refusal, one per line, or the refusal's text. + The draft bar's toasts lead with "Publish failed" or "Discard failed", two new strings in all + ten language packs; the others lead with "Failed to save". Set as default, which already raised + an untranslated "Failed to set default view" with no reason, now does the same. + + The report editor waits for its save. It closes once the report is saved; a refused save leaves + it open with the edit in place, so Save can be pressed again (it used to close at once, and + reopening it showed the stored report). Save is disabled, and the editor read-only, while the + save is in flight. + + The view-config panel waits for the save before it reports the edit as saved. A refused save + leaves the panel dirty, so Save stays enabled for a retry, and the "unpublished changes" + indicator is not raised for a draft that was never written. Save is disabled while the save is + in flight. `ViewConfigPanel`'s `onSave` accepts any return, as it did when it was typed `void`: + the panel awaits it, and `false` (returned, or resolved by a promise) or a rejection means the + save was refused; anything else, nothing included, is read as saved. +- b92329c: Studio's "Organization flows" page no longer says its drafts publish atomically, and a deep link to a flow that is not on the page no longer says no metadata designers are registered (objectui#11591). + + On the package-less page (`/studio/~org/automations`), the pending-changes sheet read "Publishing releases the 1 pending draft of this package atomically." That page has no package, and its Publish promotes each draft by itself: a draft that fails stays pending while the others go live. The sheet now says so there, through a new `preview.changes.confirmNoteSeparate` plural family in all ten language packs. A package's sheet keeps its sentence unchanged. `DraftChangesPanel` picks the sentence from its `packageId` prop: with a package, the atomic sentence; without one, the per-draft sentence. + + On the Automations pillar, the canvas chip read the designer registry for the open flow's type. With no flow open (a deep link naming a flow the list does not hold, or an empty list), it found none and showed "No metadata designers are registered in this session…" beside the right message, on a page whose flow designer is registered. The chip now reads the registry for the pillar's own type, `flow`, as the configuration panel beside it already did. The notice still shows when no designer is registered, whether or not a flow is open. +- 59917c4: A grid toolbar change on a served view is stored where the save door keeps it, so it survives a reload (objectui#11625). This covers density, a column-header sort and the hide-fields toggle, on a packaged view such as the showcase's `showcase_task.default` and on a view a user created. + + The console saves a toolbar change on a served view by sending the whole stored row, the ViewItem envelope `{ name, object, viewKind, config }`, back to `PUT /api/v1/meta/view/NAME`. It wrote the changed key beside `config` instead of inside it. The door judges a body that has a `config` by the spec's `viewItem` member and drops undeclared top-level keys, as ADR-0005 appendix (c) designs it. So it answered `200`, stored no change, and the view reverted on reload. + + The changed key now goes into `config` when it is a key `ListViewSchema` declares: `rowHeight`, `sort`, `hiddenFields` or `inlineEdit`. Every other key stays on the envelope, where the row keeps it: `columnState`, `isDefault`, `isPinned`, `sortOrder` and `visibility`. A row without a `config` is still written flat. So is the personalization overlay (the row with `_isOverride`), whose flat body the door already keeps. + + Still open: the console builds each save from the view as it was when the page loaded. A second toolbar change to the same view in the same session therefore overwrites the first one. For example, changing density and then sorting keeps only the sort after a reload. This was true before this fix, on every kind of row. + + **Clause-②: no.** Nothing on the package entry changes. `buildPersistedViewBody` is exported from `ObjectView.tsx` but not from `@object-ui/app-shell`. +- 0abd4f9: The External Datasource panel in Setup and Studio reads the `{ success, data }` envelope its routes answer (objectui#11628). On a federated datasource such as the showcase's `showcase_external`, the Tables tab listed no remote tables. "Refresh catalog" showed no snapshot time, and "Run validation" replaced the panel with a render error (`Cannot read properties of undefined (reading 'length')`). Because the list was empty, the import dialog could not be opened. The client read `tables`, `draft`, `catalog` and the validation verdict from the top of the body, but the server puts each one under `data`. The panel now lists the remote tables, shows the snapshot time after a refresh, renders the validation rows, and opens the import dialog on the generated draft. + + Refusals on these routes now reach the user. Every refusal used to read `[object Object]`, because the client turned the ADR-0112 `{ error: { code, message } }` object into a string. That covered a missing capability, an unknown remote table, an unreachable datasource, and a capability refusal from "Import as Object". The panel now shows the server's message and code. The "federation is not enabled on this server" hint now appears when the server answers `503 SERVICE_UNAVAILABLE`. Before, it never did, because the client compared against a code the server no longer sends. + + A successful response that is not the `{ success: true, data }` envelope is now an error that names the route. Before, the panel showed it as an empty list. + + **Clause-②: no.** Nothing is added to or removed from the package entry. The changed module is not exported from it. +- Updated dependencies [c4c506b] +- Updated dependencies [9db9ff3] +- Updated dependencies [15f6702] +- Updated dependencies [c096f03] +- Updated dependencies [b10c68e] +- Updated dependencies [902ebab] +- Updated dependencies [bdc9049] +- Updated dependencies [b61c116] +- Updated dependencies [e8c0b96] +- Updated dependencies [d768c31] +- Updated dependencies [b92329c] +- Updated dependencies [2e818d0] +- Updated dependencies [fd060f0] +- Updated dependencies [fd060f0] +- Updated dependencies [fd060f0] +- Updated dependencies [fd060f0] +- Updated dependencies [fd060f0] +- Updated dependencies [fd060f0] +- Updated dependencies [fd060f0] +- Updated dependencies [fd060f0] +- Updated dependencies [8b14aec] +- Updated dependencies [2abec3a] +- Updated dependencies [4c127cd] +- Updated dependencies [9dfaca6] +- Updated dependencies [c000398] +- Updated dependencies [b403bb3] + - @object-ui/types@17.8.0 + - @object-ui/core@17.8.0 + - @object-ui/components@17.8.0 + - @object-ui/plugin-form@17.8.0 + - @object-ui/plugin-detail@17.8.0 + - @object-ui/i18n@17.8.0 + - @object-ui/plugin-grid@17.8.0 + - @object-ui/plugin-dashboard@17.8.0 + - @object-ui/plugin-designer@17.8.0 + - @object-ui/plugin-charts@17.8.0 + - @object-ui/plugin-kanban@17.8.0 + - @object-ui/plugin-list@17.8.0 + - @object-ui/react@17.8.0 + - @object-ui/fields@17.8.0 + - @object-ui/collaboration@17.8.0 + - @object-ui/data-objectstack@17.8.0 + - @object-ui/layout@17.8.0 + - @object-ui/permissions@17.8.0 + - @object-ui/plugin-calendar@17.8.0 + - @object-ui/plugin-chatbot@17.8.0 + - @object-ui/plugin-editor@17.8.0 + - @object-ui/plugin-report@17.8.0 + - @object-ui/plugin-view@17.8.0 + - @object-ui/providers@17.8.0 + - @object-ui/auth@17.8.0 + ## 17.7.0 ### Minor Changes diff --git a/packages/app-shell/package.json b/packages/app-shell/package.json index 3207be147e..023ab0d164 100644 --- a/packages/app-shell/package.json +++ b/packages/app-shell/package.json @@ -1,6 +1,6 @@ { "name": "@object-ui/app-shell", - "version": "17.7.0", + "version": "17.8.0", "type": "module", "sideEffects": [ "./dist/index.js", diff --git a/packages/auth/CHANGELOG.md b/packages/auth/CHANGELOG.md index 97dc753c40..446e261973 100644 --- a/packages/auth/CHANGELOG.md +++ b/packages/auth/CHANGELOG.md @@ -1,5 +1,7 @@ # @object-ui/auth +## 17.8.0 + ## 17.7.0 ### Minor Changes diff --git a/packages/auth/package.json b/packages/auth/package.json index 0e3334fd14..9a21940870 100644 --- a/packages/auth/package.json +++ b/packages/auth/package.json @@ -1,6 +1,6 @@ { "name": "@object-ui/auth", - "version": "17.7.0", + "version": "17.8.0", "type": "module", "license": "MIT", "description": "Authentication system for Object UI with AuthProvider, useAuth hook, AuthGuard, and form components.", diff --git a/packages/cli/CHANGELOG.md b/packages/cli/CHANGELOG.md index 8d8b4cf0ce..5b80b8570b 100644 --- a/packages/cli/CHANGELOG.md +++ b/packages/cli/CHANGELOG.md @@ -1,5 +1,42 @@ # @object-ui/cli +## 17.8.0 + +### Minor Changes + +- c4c506b: **Clause-②: yes (narrowing)** + + One declaration of the per-type NODE SLOTS — the keys other than `children` through which a renderer hands authored nodes back to `SchemaRenderer` — and three readers that walk it instead of stopping at `children` (objectui#11170, the follow-up PR #11126's Acceptance notes filed). + + New on `@object-ui/types`, beside `BaseSchema.children`: `NODE_SLOT_DECLARATIONS` (one row per renderer, under every registry spelling that resolves to it), `nodeSlotsFor(type)`, `nodeSlotPathSegments(path)` and `nodeSlotValues(node, path)`, with the types `NodeSlotDeclaration`, `NodeSlotRow`, `NodeSlotSegment` and `NodeSlotValue`. A position is spelled as a key path — `trigger`, `items[].content`, `regions[].components`, `items[]`, `report.sections[].content` — and the value at its end is one node or a list of nodes. The `page:*` rows are `@objectstack/spec`'s `pageComponentSlotPositions()` placed on the type whose renderer reads each position, pinned against that export in both directions; every other row is objectui's own, pinned against the live renderer. `body` stays retired as the generic child-list key (objectui#6771): it appears only on the four `page:*` types whose renderer still paints it for stored documents, marked `retired`. + + Accept sets that narrow, each reader FROM → TO: + + - `@object-ui/cli` — `objectui check`'s unevaluated-expression refusal (`findUnbindableTextExpressions`). FROM: the document root and every node its `children` hold. TO: those, and every node under a slot its type declares — so a `${…}` on `title` / `label` / `value` / `description` of a node under a dialog's `content`, a tab item's `content`, a page's `regions[].components`, a carousel item, a detail view's `tabs[].content` is now refused with the slot path (`items → 0 → content → value`). The false-refusal rows of PR #11126's ablation 2 stay green: a form's `fields[]`, a grid's `columns[]` and `{ "type": "multiple" }` are not slots. Measured over this repository's own JSON corpus and docs fences: no new finding. + - `@object-ui/core` — `validateSchema`. FROM: `validateChildren` recursed through `children` only. TO: it also recurses through the declared slots, so an invalid node under one (a retired `crud` spelling under `dialog.content`, an `INVALID_SCHEMA` member) is reported with its own path, spelled as `schema.items[0].content`. Measured over the same corpus: no new finding. + - `@object-ui/sdui-parser` — `validateTree`. FROM: the walk descended `children` alone, and a manifest entry carried no slot. TO: `ManifestComponent` gains `slots?: readonly string[]`, `manifestFromConfigs` gains `opts.slotsFor` (hand it `nodeSlotsFor`) and projects each entry's non-retired positions, and `validateTree` descends them — an unknown component, an unknown or mis-typed prop or an illegal enum under a slot now draws its diagnostic. A manifest built without the option serialises byte-identically and keeps the `children`-only reach. The `RETIRED_CHILD_LIST_KEY` refusals are unchanged. + - `@object-ui/components` — the `kind:'html'` page's compile manifest (`getJsxManifest`) is built with `slotsFor`, so an html-tier page whose slot-held node fails validation now fails to compile the way one under `children` does. Narrowing: a page that compiled with an unknown tag under a `dialog`'s `content` no longer does. + + Docs: `content/docs/utilities/cli.mdx`'s "Component nodes only" rule, the gate's own docblock, `validateChildren`'s comment and the parser's header now say the walk follows `children` and the declared slots; the declaration's header is where the slot list is explained. + +### Patch Changes + +- Updated dependencies [c4c506b] +- Updated dependencies [9db9ff3] +- Updated dependencies [c096f03] +- Updated dependencies [b10c68e] +- Updated dependencies [bdc9049] +- Updated dependencies [2e818d0] +- Updated dependencies [fd060f0] +- Updated dependencies [8b14aec] +- Updated dependencies [2abec3a] +- Updated dependencies [9dfaca6] +- Updated dependencies [c000398] +- Updated dependencies [b403bb3] + - @object-ui/types@17.8.0 + - @object-ui/components@17.8.0 + - @object-ui/react@17.8.0 + ## 17.7.0 ### Minor Changes diff --git a/packages/cli/package.json b/packages/cli/package.json index 134f0af87f..d2a84c9603 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@object-ui/cli", - "version": "17.7.0", + "version": "17.8.0", "description": "Standalone CLI for Object UI — scaffold, develop, build and validate JSON/YAML schema-driven applications.", "type": "module", "homepage": "https://www.objectui.org/docs/utilities/cli", diff --git a/packages/collaboration/CHANGELOG.md b/packages/collaboration/CHANGELOG.md index 913ae07566..fb451b38a1 100644 --- a/packages/collaboration/CHANGELOG.md +++ b/packages/collaboration/CHANGELOG.md @@ -1,5 +1,24 @@ # @object-ui/collaboration +## 17.8.0 + +### Patch Changes + +- Updated dependencies [c4c506b] +- Updated dependencies [9db9ff3] +- Updated dependencies [b10c68e] +- Updated dependencies [bdc9049] +- Updated dependencies [e8c0b96] +- Updated dependencies [b92329c] +- Updated dependencies [2e818d0] +- Updated dependencies [fd060f0] +- Updated dependencies [8b14aec] +- Updated dependencies [2abec3a] +- Updated dependencies [9dfaca6] +- Updated dependencies [b403bb3] + - @object-ui/types@17.8.0 + - @object-ui/i18n@17.8.0 + ## 17.7.0 ### Patch Changes diff --git a/packages/collaboration/package.json b/packages/collaboration/package.json index 7dd34aea1e..0f4eeb5527 100644 --- a/packages/collaboration/package.json +++ b/packages/collaboration/package.json @@ -1,6 +1,6 @@ { "name": "@object-ui/collaboration", - "version": "17.7.0", + "version": "17.8.0", "type": "module", "license": "MIT", "description": "Real-time collaboration for Object UI with presence tracking, live cursors, conflict resolution, and comment threads.", diff --git a/packages/components/CHANGELOG.md b/packages/components/CHANGELOG.md index cef1430bea..c8930fb440 100644 --- a/packages/components/CHANGELOG.md +++ b/packages/components/CHANGELOG.md @@ -1,5 +1,56 @@ # @object-ui/components +## 17.8.0 + +### Minor Changes + +- c4c506b: **Clause-②: yes (narrowing)** + + One declaration of the per-type NODE SLOTS — the keys other than `children` through which a renderer hands authored nodes back to `SchemaRenderer` — and three readers that walk it instead of stopping at `children` (objectui#11170, the follow-up PR #11126's Acceptance notes filed). + + New on `@object-ui/types`, beside `BaseSchema.children`: `NODE_SLOT_DECLARATIONS` (one row per renderer, under every registry spelling that resolves to it), `nodeSlotsFor(type)`, `nodeSlotPathSegments(path)` and `nodeSlotValues(node, path)`, with the types `NodeSlotDeclaration`, `NodeSlotRow`, `NodeSlotSegment` and `NodeSlotValue`. A position is spelled as a key path — `trigger`, `items[].content`, `regions[].components`, `items[]`, `report.sections[].content` — and the value at its end is one node or a list of nodes. The `page:*` rows are `@objectstack/spec`'s `pageComponentSlotPositions()` placed on the type whose renderer reads each position, pinned against that export in both directions; every other row is objectui's own, pinned against the live renderer. `body` stays retired as the generic child-list key (objectui#6771): it appears only on the four `page:*` types whose renderer still paints it for stored documents, marked `retired`. + + Accept sets that narrow, each reader FROM → TO: + + - `@object-ui/cli` — `objectui check`'s unevaluated-expression refusal (`findUnbindableTextExpressions`). FROM: the document root and every node its `children` hold. TO: those, and every node under a slot its type declares — so a `${…}` on `title` / `label` / `value` / `description` of a node under a dialog's `content`, a tab item's `content`, a page's `regions[].components`, a carousel item, a detail view's `tabs[].content` is now refused with the slot path (`items → 0 → content → value`). The false-refusal rows of PR #11126's ablation 2 stay green: a form's `fields[]`, a grid's `columns[]` and `{ "type": "multiple" }` are not slots. Measured over this repository's own JSON corpus and docs fences: no new finding. + - `@object-ui/core` — `validateSchema`. FROM: `validateChildren` recursed through `children` only. TO: it also recurses through the declared slots, so an invalid node under one (a retired `crud` spelling under `dialog.content`, an `INVALID_SCHEMA` member) is reported with its own path, spelled as `schema.items[0].content`. Measured over the same corpus: no new finding. + - `@object-ui/sdui-parser` — `validateTree`. FROM: the walk descended `children` alone, and a manifest entry carried no slot. TO: `ManifestComponent` gains `slots?: readonly string[]`, `manifestFromConfigs` gains `opts.slotsFor` (hand it `nodeSlotsFor`) and projects each entry's non-retired positions, and `validateTree` descends them — an unknown component, an unknown or mis-typed prop or an illegal enum under a slot now draws its diagnostic. A manifest built without the option serialises byte-identically and keeps the `children`-only reach. The `RETIRED_CHILD_LIST_KEY` refusals are unchanged. + - `@object-ui/components` — the `kind:'html'` page's compile manifest (`getJsxManifest`) is built with `slotsFor`, so an html-tier page whose slot-held node fails validation now fails to compile the way one under `children` does. Narrowing: a page that compiled with an unknown tag under a `dialog`'s `content` no longer does. + + Docs: `content/docs/utilities/cli.mdx`'s "Component nodes only" rule, the gate's own docblock, `validateChildren`'s comment and the parser's header now say the walk follows `children` and the declared slots; the declaration's header is where the slot list is explained. +- c096f03: The record page header draws the record's picture beside its title, from the field the object names in its object-level `imageField` (`@objectstack/spec` 17.6.0, objectstack#21182) (objectui#11383). The picture is the served row's value of that `image` or `avatar` field: the expanded `{ url }`, a bare file id (drawn from the stable download path), a URL string, or the first drawable entry of a list. An object that declares no `imageField`, an empty value, or a field the reader may not see draws nothing, with no initials or placeholder; `recordChrome: false` keeps the bare header. The declaration is the only channel: no `page:header` prop is read and no field is read by a conventional name such as `logo` or `avatar`. + +### Patch Changes + +- c000398: A lookup whose `dependsOn` names a parent field drops its selection when that parent changes or is cleared (objectui#11631). + + Before, the picker re-scoped its candidate list to the new parent but kept the record already chosen. An invoice whose Account was switched from Northwind to Contoso saved Contoso beside a Northwind contact. The server checks only that a reference exists, so it accepted the pair. Now the form clears the dependent lookup as soon as any parent that scopes it takes a different value. It writes `null`, or `[]` for a multi-value lookup, so an edit clears the stored value instead of leaving it unchanged. A cleared lookup that scopes another lookup clears that one too. + + What does not clear it: opening an existing record, whether its values are present when the form mounts or arrive after; switching a mounted drawer to another record; a `resetOnSubmit` or Cancel reset; a change to any other field. A lookup that holds nothing is not written to. Which parents count is read from the same field-level `dependsOn` array the picker scopes its query by, so a `dependsOn` the picker ignores clears nothing either. + + The rule covers every form the `form` renderer draws, including the object form and its drawer, modal, split, tabbed and wizard variants. The console's form-view page (`/forms/:name`, `/f/:slug`) has its own renderer and is not changed here. + + **Clause-②: no.** Nothing on the package entry changes. No export, prop, type member or i18n key is added, and `CASCADE_OPTION_WIDGET_TYPES` is unchanged. +- Updated dependencies [c4c506b] +- Updated dependencies [9db9ff3] +- Updated dependencies [b10c68e] +- Updated dependencies [bdc9049] +- Updated dependencies [e8c0b96] +- Updated dependencies [b92329c] +- Updated dependencies [2e818d0] +- Updated dependencies [fd060f0] +- Updated dependencies [fd060f0] +- Updated dependencies [8b14aec] +- Updated dependencies [2abec3a] +- Updated dependencies [9dfaca6] +- Updated dependencies [b403bb3] + - @object-ui/types@17.8.0 + - @object-ui/core@17.8.0 + - @object-ui/sdui-parser@17.8.0 + - @object-ui/i18n@17.8.0 + - @object-ui/react@17.8.0 + - @object-ui/react-runtime@17.8.0 + ## 17.7.0 ### Minor Changes diff --git a/packages/components/package.json b/packages/components/package.json index dc74759a05..f532e928c3 100644 --- a/packages/components/package.json +++ b/packages/components/package.json @@ -1,6 +1,6 @@ { "name": "@object-ui/components", - "version": "17.7.0", + "version": "17.8.0", "type": "module", "license": "MIT", "description": "Standard UI component library for Object UI, built with Shadcn UI + Tailwind CSS", diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index 24bb3b8456..9f7fe71838 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -1,5 +1,37 @@ # @object-ui/core +## 17.8.0 + +### Minor Changes + +- c4c506b: **Clause-②: yes (narrowing)** + + One declaration of the per-type NODE SLOTS — the keys other than `children` through which a renderer hands authored nodes back to `SchemaRenderer` — and three readers that walk it instead of stopping at `children` (objectui#11170, the follow-up PR #11126's Acceptance notes filed). + + New on `@object-ui/types`, beside `BaseSchema.children`: `NODE_SLOT_DECLARATIONS` (one row per renderer, under every registry spelling that resolves to it), `nodeSlotsFor(type)`, `nodeSlotPathSegments(path)` and `nodeSlotValues(node, path)`, with the types `NodeSlotDeclaration`, `NodeSlotRow`, `NodeSlotSegment` and `NodeSlotValue`. A position is spelled as a key path — `trigger`, `items[].content`, `regions[].components`, `items[]`, `report.sections[].content` — and the value at its end is one node or a list of nodes. The `page:*` rows are `@objectstack/spec`'s `pageComponentSlotPositions()` placed on the type whose renderer reads each position, pinned against that export in both directions; every other row is objectui's own, pinned against the live renderer. `body` stays retired as the generic child-list key (objectui#6771): it appears only on the four `page:*` types whose renderer still paints it for stored documents, marked `retired`. + + Accept sets that narrow, each reader FROM → TO: + + - `@object-ui/cli` — `objectui check`'s unevaluated-expression refusal (`findUnbindableTextExpressions`). FROM: the document root and every node its `children` hold. TO: those, and every node under a slot its type declares — so a `${…}` on `title` / `label` / `value` / `description` of a node under a dialog's `content`, a tab item's `content`, a page's `regions[].components`, a carousel item, a detail view's `tabs[].content` is now refused with the slot path (`items → 0 → content → value`). The false-refusal rows of PR #11126's ablation 2 stay green: a form's `fields[]`, a grid's `columns[]` and `{ "type": "multiple" }` are not slots. Measured over this repository's own JSON corpus and docs fences: no new finding. + - `@object-ui/core` — `validateSchema`. FROM: `validateChildren` recursed through `children` only. TO: it also recurses through the declared slots, so an invalid node under one (a retired `crud` spelling under `dialog.content`, an `INVALID_SCHEMA` member) is reported with its own path, spelled as `schema.items[0].content`. Measured over the same corpus: no new finding. + - `@object-ui/sdui-parser` — `validateTree`. FROM: the walk descended `children` alone, and a manifest entry carried no slot. TO: `ManifestComponent` gains `slots?: readonly string[]`, `manifestFromConfigs` gains `opts.slotsFor` (hand it `nodeSlotsFor`) and projects each entry's non-retired positions, and `validateTree` descends them — an unknown component, an unknown or mis-typed prop or an illegal enum under a slot now draws its diagnostic. A manifest built without the option serialises byte-identically and keeps the `children`-only reach. The `RETIRED_CHILD_LIST_KEY` refusals are unchanged. + - `@object-ui/components` — the `kind:'html'` page's compile manifest (`getJsxManifest`) is built with `slotsFor`, so an html-tier page whose slot-held node fails validation now fails to compile the way one under `children` does. Narrowing: a page that compiled with an unknown tag under a `dialog`'s `content` no longer does. + + Docs: `content/docs/utilities/cli.mdx`'s "Component nodes only" rule, the gate's own docblock, `validateChildren`'s comment and the parser's header now say the walk follows `children` and the declared slots; the declaration's header is where the slot list is explained. + +### Patch Changes + +- Updated dependencies [c4c506b] +- Updated dependencies [9db9ff3] +- Updated dependencies [b10c68e] +- Updated dependencies [bdc9049] +- Updated dependencies [2e818d0] +- Updated dependencies [8b14aec] +- Updated dependencies [2abec3a] +- Updated dependencies [9dfaca6] +- Updated dependencies [b403bb3] + - @object-ui/types@17.8.0 + ## 17.7.0 ### Minor Changes diff --git a/packages/core/package.json b/packages/core/package.json index b5ef850b45..fcd0f9af9c 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@object-ui/core", - "version": "17.7.0", + "version": "17.8.0", "type": "module", "sideEffects": false, "license": "MIT", diff --git a/packages/create-plugin/CHANGELOG.md b/packages/create-plugin/CHANGELOG.md index 1126ac0aa3..9bca720ade 100644 --- a/packages/create-plugin/CHANGELOG.md +++ b/packages/create-plugin/CHANGELOG.md @@ -1,5 +1,7 @@ # @object-ui/create-plugin +## 17.8.0 + ## 17.7.0 ### Minor Changes diff --git a/packages/create-plugin/package.json b/packages/create-plugin/package.json index 948a029bb3..cb5e6542b0 100644 --- a/packages/create-plugin/package.json +++ b/packages/create-plugin/package.json @@ -1,6 +1,6 @@ { "name": "@object-ui/create-plugin", - "version": "17.7.0", + "version": "17.8.0", "description": "CLI tool to scaffold ObjectUI plugins", "type": "module", "license": "MIT", diff --git a/packages/data-objectstack/CHANGELOG.md b/packages/data-objectstack/CHANGELOG.md index d5228ddeba..2df2069b31 100644 --- a/packages/data-objectstack/CHANGELOG.md +++ b/packages/data-objectstack/CHANGELOG.md @@ -1,5 +1,21 @@ # @object-ui/data-objectstack +## 17.8.0 + +### Patch Changes + +- Updated dependencies [c4c506b] +- Updated dependencies [9db9ff3] +- Updated dependencies [b10c68e] +- Updated dependencies [bdc9049] +- Updated dependencies [2e818d0] +- Updated dependencies [8b14aec] +- Updated dependencies [2abec3a] +- Updated dependencies [9dfaca6] +- Updated dependencies [b403bb3] + - @object-ui/types@17.8.0 + - @object-ui/core@17.8.0 + ## 17.7.0 ### Minor Changes diff --git a/packages/data-objectstack/package.json b/packages/data-objectstack/package.json index d2cada9bf9..d7d512a064 100644 --- a/packages/data-objectstack/package.json +++ b/packages/data-objectstack/package.json @@ -1,6 +1,6 @@ { "name": "@object-ui/data-objectstack", - "version": "17.7.0", + "version": "17.8.0", "description": "ObjectStack Data Adapter for Object UI", "license": "MIT", "type": "module", diff --git a/packages/fields/CHANGELOG.md b/packages/fields/CHANGELOG.md index 83dbb3f355..7000712dc9 100644 --- a/packages/fields/CHANGELOG.md +++ b/packages/fields/CHANGELOG.md @@ -1,5 +1,63 @@ # @object-ui/fields +## 17.8.0 + +### Minor Changes + +- 2abec3a: The `grid` field's eight field-level keys are camelCase now, and their snake_case spellings are retired and refused by name on every face (objectui#11610). + + BREAKING (`@object-ui/types`, `@object-ui/fields`): a `grid` field's metadata, and a `form` `fields[]` entry of `type: 'grid'`, must spell these keys in camelCase. (The bump is `minor` by this repo's release model: objectui's major follows the `@objectstack` family major, and its own breaking changes ship as `minor` with the breaking semantics stated here.) + + - FROM `min_rows` → TO `minRows` + - FROM `max_rows` → TO `maxRows` + - FROM `allow_add` → TO `allowAdd` + - FROM `allow_delete` → TO `allowDelete` + - FROM `allow_reorder` → TO `allowReorder` + - FROM `total_field` → TO `totalField` + - FROM `add_label` → TO `addLabel` + - FROM `sort_field` → TO `sortField` + + Why: `@objectstack/spec`'s runtime form field declares config keys in camelCase only, so it could not declare these keys as they were written (objectstack-ai/objectstack#21704, fork 2, ruled B). There is no alias window and no dual read: no reader reads the snake_case spellings any more, and no stored producer outside this repository's own fixtures, which move with this change, was found to write them. + + **Migration.** Rename each key; its value stays the same. `totalField` keeps its meaning: the CHILD column summed into the grid's footer, which is the value a spec `amountField` carries. It is not the parent field the spec's own `totalField` names on a master-detail subform. + + What each face does with a snake_case key now: + + - **TypeScript.** `GridFieldMetadata` and `FormField` declare each as a `never` member, so an authored value no longer compiles. The camelCase members carry the value types the snake_case members had, and `FormField` still takes each one by reference to `GridFieldMetadata`. + - **zod (`@object-ui/types/zod`).** NARROWS on the tolerant face (`safeValidateSchema`, which `objectui validate` runs) and on the strict authoring face: a form field entry carrying a snake_case key used to parse with the value kept, and is now refused with one `invalid_type` issue at that key. The message leads with ``Did you mean `min_rows` → `minRows`?`` (each key names its own replacement). WIDENS on both faces: the camelCase keys parse, judged by the same value types. + - **The `grid` widget (`@object-ui/fields`).** `GridField` reads the camelCase keys only. A field whose metadata still carries a snake_case key is drawn as an inline alert naming each retired key beside its replacement (`role="alert"`, `data-testid="grid-field-retired-keys"`) instead of the grid, and the same text goes to `console.error` once. Nothing is thrown, so the rest of the form still draws, and the rows are not changed. + + New export from `@object-ui/types`: `GRID_FIELD_RETIRED_KEYS`, the snake_case to camelCase map that the zod refusals and the widget both read, with its key type `GridFieldRetiredKey`. + + `@object-ui/plugin-form`'s master-detail and line-items adapters now hand the grid the camelCase keys, typed against `GridFieldMetadata` instead of cast through `any`. What they draw does not change. + + **Clause-②: yes (narrowing)**: the camelCase spellings widen each face, and the snake_case spellings narrow it. + +### Patch Changes + +- Updated dependencies [c4c506b] +- Updated dependencies [9db9ff3] +- Updated dependencies [c096f03] +- Updated dependencies [b10c68e] +- Updated dependencies [bdc9049] +- Updated dependencies [e8c0b96] +- Updated dependencies [b92329c] +- Updated dependencies [2e818d0] +- Updated dependencies [fd060f0] +- Updated dependencies [fd060f0] +- Updated dependencies [8b14aec] +- Updated dependencies [2abec3a] +- Updated dependencies [9dfaca6] +- Updated dependencies [c000398] +- Updated dependencies [b403bb3] + - @object-ui/types@17.8.0 + - @object-ui/core@17.8.0 + - @object-ui/components@17.8.0 + - @object-ui/i18n@17.8.0 + - @object-ui/react@17.8.0 + - @object-ui/permissions@17.8.0 + - @object-ui/providers@17.8.0 + ## 17.7.0 ### Minor Changes diff --git a/packages/fields/package.json b/packages/fields/package.json index 34ca223f2d..32f01c0da7 100644 --- a/packages/fields/package.json +++ b/packages/fields/package.json @@ -1,6 +1,6 @@ { "name": "@object-ui/fields", - "version": "17.7.0", + "version": "17.8.0", "description": "Field renderers and registry for Object UI", "license": "MIT", "type": "module", diff --git a/packages/i18n/CHANGELOG.md b/packages/i18n/CHANGELOG.md index eb65aa5369..cfbd8e33be 100644 --- a/packages/i18n/CHANGELOG.md +++ b/packages/i18n/CHANGELOG.md @@ -1,5 +1,59 @@ # @object-ui/i18n +## 17.8.0 + +### Minor Changes + +- fd060f0: All ten locale packs gain `view.noObject`, the hint an object-bound block shows + when its node names its object in neither place (objectui#11605). + + **Clause-②: yes (widening)** — a new key, `view.noObject`, in every pack. English + reads "No object named: set {{property}} or dataSource.object.", the wording of + `element.number.noObject` with the property as a hole; each translation is that + key's own translation with the same hole. `{{property}}` is the block's object + key, interpolated and never translated. No existing key changes. + +### Patch Changes + +- e8c0b96: A refused save, pin, reorder, view setting, report save, publish or discard in the console is now said to the user, and the view-config panel no longer reports a refused save as saved (objectui#11583). + + objectui#11578 made the two Create View doors say a refused save. The console's other metadata + writes on the object page, the report page and the draft bar still caught a refusal with a + console line and nothing else, so a permission refusal or a spec refusal looked like a saved + change: + + - the view-config panel's Save on an existing view; + - pinning or unpinning a view, and reordering views in "Manage views"; + - a toolbar setting on a list view (density, sort, columns, hidden fields), when the server + refuses it (the console's own permission check already said its refusal, and still does); + - the report editor's Save; + - Publish and Discard draft on the draft bar of those two editors. + + Each now raises the refusal through the console's error toast, with the save door's own + message: the field-anchored issues of a validation refusal, one per line, or the refusal's text. + The draft bar's toasts lead with "Publish failed" or "Discard failed", two new strings in all + ten language packs; the others lead with "Failed to save". Set as default, which already raised + an untranslated "Failed to set default view" with no reason, now does the same. + + The report editor waits for its save. It closes once the report is saved; a refused save leaves + it open with the edit in place, so Save can be pressed again (it used to close at once, and + reopening it showed the stored report). Save is disabled, and the editor read-only, while the + save is in flight. + + The view-config panel waits for the save before it reports the edit as saved. A refused save + leaves the panel dirty, so Save stays enabled for a retry, and the "unpublished changes" + indicator is not raised for a draft that was never written. Save is disabled while the save is + in flight. `ViewConfigPanel`'s `onSave` accepts any return, as it did when it was typed `void`: + the panel awaits it, and `false` (returned, or resolved by a promise) or a rejection means the + save was refused; anything else, nothing included, is read as saved. +- b92329c: Studio's "Organization flows" page no longer says its drafts publish atomically, and a deep link to a flow that is not on the page no longer says no metadata designers are registered (objectui#11591). + + On the package-less page (`/studio/~org/automations`), the pending-changes sheet read "Publishing releases the 1 pending draft of this package atomically." That page has no package, and its Publish promotes each draft by itself: a draft that fails stays pending while the others go live. The sheet now says so there, through a new `preview.changes.confirmNoteSeparate` plural family in all ten language packs. A package's sheet keeps its sentence unchanged. `DraftChangesPanel` picks the sentence from its `packageId` prop: with a package, the atomic sentence; without one, the per-draft sentence. + + On the Automations pillar, the canvas chip read the designer registry for the open flow's type. With no flow open (a deep link naming a flow the list does not hold, or an empty list), it found none and showed "No metadata designers are registered in this session…" beside the right message, on a page whose flow designer is registered. The chip now reads the registry for the pillar's own type, `flow`, as the configuration panel beside it already did. The notice still shows when no designer is registered, whether or not a flow is open. +- Updated dependencies [c4c506b] + - @object-ui/core@17.8.0 + ## 17.7.0 ### Minor Changes diff --git a/packages/i18n/package.json b/packages/i18n/package.json index 9d84ba21f6..0ddbdb5d9b 100644 --- a/packages/i18n/package.json +++ b/packages/i18n/package.json @@ -1,6 +1,6 @@ { "name": "@object-ui/i18n", - "version": "17.7.0", + "version": "17.8.0", "type": "module", "sideEffects": false, "license": "MIT", diff --git a/packages/layout/CHANGELOG.md b/packages/layout/CHANGELOG.md index fed224f099..e81adce633 100644 --- a/packages/layout/CHANGELOG.md +++ b/packages/layout/CHANGELOG.md @@ -1,5 +1,26 @@ # @object-ui/layout +## 17.8.0 + +### Patch Changes + +- Updated dependencies [c4c506b] +- Updated dependencies [9db9ff3] +- Updated dependencies [c096f03] +- Updated dependencies [b10c68e] +- Updated dependencies [bdc9049] +- Updated dependencies [2e818d0] +- Updated dependencies [fd060f0] +- Updated dependencies [8b14aec] +- Updated dependencies [2abec3a] +- Updated dependencies [9dfaca6] +- Updated dependencies [c000398] +- Updated dependencies [b403bb3] + - @object-ui/types@17.8.0 + - @object-ui/core@17.8.0 + - @object-ui/components@17.8.0 + - @object-ui/react@17.8.0 + ## 17.7.0 ### Minor Changes diff --git a/packages/layout/package.json b/packages/layout/package.json index e8bc83fbcf..b4bcb6f9d5 100644 --- a/packages/layout/package.json +++ b/packages/layout/package.json @@ -1,6 +1,6 @@ { "name": "@object-ui/layout", - "version": "17.7.0", + "version": "17.8.0", "type": "module", "sideEffects": [ "./dist/index.js", diff --git a/packages/mobile/CHANGELOG.md b/packages/mobile/CHANGELOG.md index 58b97827ee..a9f8e0b925 100644 --- a/packages/mobile/CHANGELOG.md +++ b/packages/mobile/CHANGELOG.md @@ -1,5 +1,20 @@ # @object-ui/mobile +## 17.8.0 + +### Patch Changes + +- Updated dependencies [c4c506b] +- Updated dependencies [9db9ff3] +- Updated dependencies [b10c68e] +- Updated dependencies [bdc9049] +- Updated dependencies [2e818d0] +- Updated dependencies [8b14aec] +- Updated dependencies [2abec3a] +- Updated dependencies [9dfaca6] +- Updated dependencies [b403bb3] + - @object-ui/types@17.8.0 + ## 17.7.0 ### Minor Changes diff --git a/packages/mobile/package.json b/packages/mobile/package.json index 385f592a03..7fb8f08775 100644 --- a/packages/mobile/package.json +++ b/packages/mobile/package.json @@ -1,6 +1,6 @@ { "name": "@object-ui/mobile", - "version": "17.7.0", + "version": "17.8.0", "type": "module", "license": "MIT", "description": "Mobile optimization for Object UI with responsive components, PWA support, and touch gesture handling.", diff --git a/packages/permissions/CHANGELOG.md b/packages/permissions/CHANGELOG.md index 5f7bdd6b77..d3d947caee 100644 --- a/packages/permissions/CHANGELOG.md +++ b/packages/permissions/CHANGELOG.md @@ -1,5 +1,20 @@ # @object-ui/permissions +## 17.8.0 + +### Patch Changes + +- Updated dependencies [c4c506b] +- Updated dependencies [9db9ff3] +- Updated dependencies [b10c68e] +- Updated dependencies [bdc9049] +- Updated dependencies [2e818d0] +- Updated dependencies [8b14aec] +- Updated dependencies [2abec3a] +- Updated dependencies [9dfaca6] +- Updated dependencies [b403bb3] + - @object-ui/types@17.8.0 + ## 17.7.0 ### Minor Changes diff --git a/packages/permissions/package.json b/packages/permissions/package.json index 77887fb437..2a00383682 100644 --- a/packages/permissions/package.json +++ b/packages/permissions/package.json @@ -1,6 +1,6 @@ { "name": "@object-ui/permissions", - "version": "17.7.0", + "version": "17.8.0", "type": "module", "license": "MIT", "description": "RBAC permission system for Object UI with object/field/row-level access control, permission guards, and hooks.", diff --git a/packages/plugin-ai/CHANGELOG.md b/packages/plugin-ai/CHANGELOG.md index 6503ea5c50..205a411704 100644 --- a/packages/plugin-ai/CHANGELOG.md +++ b/packages/plugin-ai/CHANGELOG.md @@ -1,5 +1,28 @@ # @object-ui/plugin-ai +## 17.8.0 + +### Patch Changes + +- Updated dependencies [c4c506b] +- Updated dependencies [9db9ff3] +- Updated dependencies [c096f03] +- Updated dependencies [b10c68e] +- Updated dependencies [bdc9049] +- Updated dependencies [e8c0b96] +- Updated dependencies [b92329c] +- Updated dependencies [2e818d0] +- Updated dependencies [fd060f0] +- Updated dependencies [8b14aec] +- Updated dependencies [2abec3a] +- Updated dependencies [9dfaca6] +- Updated dependencies [c000398] +- Updated dependencies [b403bb3] + - @object-ui/types@17.8.0 + - @object-ui/core@17.8.0 + - @object-ui/components@17.8.0 + - @object-ui/i18n@17.8.0 + ## 17.7.0 ### Minor Changes diff --git a/packages/plugin-ai/package.json b/packages/plugin-ai/package.json index c2f2a95955..418919fa09 100644 --- a/packages/plugin-ai/package.json +++ b/packages/plugin-ai/package.json @@ -1,6 +1,6 @@ { "name": "@object-ui/plugin-ai", - "version": "17.7.0", + "version": "17.8.0", "type": "module", "main": "dist/index.umd.cjs", "module": "dist/index.js", diff --git a/packages/plugin-calendar/CHANGELOG.md b/packages/plugin-calendar/CHANGELOG.md index 0ad9129c20..a97b0f8908 100644 --- a/packages/plugin-calendar/CHANGELOG.md +++ b/packages/plugin-calendar/CHANGELOG.md @@ -1,5 +1,35 @@ # @object-ui/plugin-calendar +## 17.8.0 + +### Patch Changes + +- Updated dependencies [c4c506b] +- Updated dependencies [9db9ff3] +- Updated dependencies [c096f03] +- Updated dependencies [b10c68e] +- Updated dependencies [bdc9049] +- Updated dependencies [b61c116] +- Updated dependencies [e8c0b96] +- Updated dependencies [b92329c] +- Updated dependencies [2e818d0] +- Updated dependencies [fd060f0] +- Updated dependencies [fd060f0] +- Updated dependencies [8b14aec] +- Updated dependencies [2abec3a] +- Updated dependencies [4c127cd] +- Updated dependencies [9dfaca6] +- Updated dependencies [c000398] +- Updated dependencies [b403bb3] + - @object-ui/types@17.8.0 + - @object-ui/core@17.8.0 + - @object-ui/components@17.8.0 + - @object-ui/plugin-detail@17.8.0 + - @object-ui/i18n@17.8.0 + - @object-ui/react@17.8.0 + - @object-ui/mobile@17.8.0 + - @object-ui/permissions@17.8.0 + ## 17.7.0 ### Minor Changes diff --git a/packages/plugin-calendar/package.json b/packages/plugin-calendar/package.json index 9cbed61f35..453c0bab82 100644 --- a/packages/plugin-calendar/package.json +++ b/packages/plugin-calendar/package.json @@ -1,6 +1,6 @@ { "name": "@object-ui/plugin-calendar", - "version": "17.7.0", + "version": "17.8.0", "type": "module", "license": "MIT", "description": "Calendar view plugins for Object UI - includes both ObjectQL-integrated and standalone calendar components", diff --git a/packages/plugin-charts/CHANGELOG.md b/packages/plugin-charts/CHANGELOG.md index 0120581dae..79f882b108 100644 --- a/packages/plugin-charts/CHANGELOG.md +++ b/packages/plugin-charts/CHANGELOG.md @@ -1,5 +1,53 @@ # @object-ui/plugin-charts +## 17.8.0 + +### Minor Changes + +- fd060f0: The `object-chart` and `view:chart` registrations no longer declare `objectName` + required, so the page compile accepts a node whose `dataSource` binding names the + object, and a chart that names its object in neither place shows a hint instead + of an empty frame (objectui#11605). + + `object-chart` has no spec row. The binding doc says a node bound by + `dataSource.object` needs no `objectName` of its own, and the renderer agrees: + `dataSource.object` lands on `objectName` before the chart reads the node. The + registrations still declared `required: true`, and the page compile reads them, + so a bound chart with no `objectName` of its own was refused with + `missing-required-prop` and the save failed. + + **Clause-②: yes (widening)** — an `object-chart` (or `view:chart`) node that + names its object through `dataSource.object` and sets no `objectName` now + compiles and saves. A node that names its object in neither place also compiles + now, and the chart shows "No object named: set objectName or dataSource.object." + where it used to draw an empty frame with no message. A chart with inline + `data`, a `dataset` or a `bind` path shows no hint and renders as before. The + published `objectName` inputs now carry a description that says the binding can + supply them. + +### Patch Changes + +- Updated dependencies [c4c506b] +- Updated dependencies [9db9ff3] +- Updated dependencies [c096f03] +- Updated dependencies [b10c68e] +- Updated dependencies [bdc9049] +- Updated dependencies [e8c0b96] +- Updated dependencies [b92329c] +- Updated dependencies [2e818d0] +- Updated dependencies [fd060f0] +- Updated dependencies [fd060f0] +- Updated dependencies [8b14aec] +- Updated dependencies [2abec3a] +- Updated dependencies [9dfaca6] +- Updated dependencies [c000398] +- Updated dependencies [b403bb3] + - @object-ui/types@17.8.0 + - @object-ui/core@17.8.0 + - @object-ui/components@17.8.0 + - @object-ui/i18n@17.8.0 + - @object-ui/react@17.8.0 + ## 17.7.0 ### Minor Changes diff --git a/packages/plugin-charts/package.json b/packages/plugin-charts/package.json index 1a801f7f43..5876e607f8 100644 --- a/packages/plugin-charts/package.json +++ b/packages/plugin-charts/package.json @@ -1,6 +1,6 @@ { "name": "@object-ui/plugin-charts", - "version": "17.7.0", + "version": "17.8.0", "type": "module", "license": "MIT", "description": "Chart components plugin for Object UI, powered by Recharts", diff --git a/packages/plugin-chatbot/CHANGELOG.md b/packages/plugin-chatbot/CHANGELOG.md index 36139605fa..c9527a661f 100644 --- a/packages/plugin-chatbot/CHANGELOG.md +++ b/packages/plugin-chatbot/CHANGELOG.md @@ -1,5 +1,30 @@ # @object-ui/plugin-chatbot +## 17.8.0 + +### Patch Changes + +- Updated dependencies [c4c506b] +- Updated dependencies [9db9ff3] +- Updated dependencies [c096f03] +- Updated dependencies [b10c68e] +- Updated dependencies [bdc9049] +- Updated dependencies [e8c0b96] +- Updated dependencies [b92329c] +- Updated dependencies [2e818d0] +- Updated dependencies [fd060f0] +- Updated dependencies [fd060f0] +- Updated dependencies [8b14aec] +- Updated dependencies [2abec3a] +- Updated dependencies [9dfaca6] +- Updated dependencies [c000398] +- Updated dependencies [b403bb3] + - @object-ui/types@17.8.0 + - @object-ui/core@17.8.0 + - @object-ui/components@17.8.0 + - @object-ui/i18n@17.8.0 + - @object-ui/react@17.8.0 + ## 17.7.0 ### Minor Changes diff --git a/packages/plugin-chatbot/package.json b/packages/plugin-chatbot/package.json index cb77b7aa67..46041fe143 100644 --- a/packages/plugin-chatbot/package.json +++ b/packages/plugin-chatbot/package.json @@ -1,6 +1,6 @@ { "name": "@object-ui/plugin-chatbot", - "version": "17.7.0", + "version": "17.8.0", "type": "module", "license": "MIT", "description": "Chatbot interface plugin for Object UI", diff --git a/packages/plugin-dashboard/CHANGELOG.md b/packages/plugin-dashboard/CHANGELOG.md index ea685c6875..f93ed621ce 100644 --- a/packages/plugin-dashboard/CHANGELOG.md +++ b/packages/plugin-dashboard/CHANGELOG.md @@ -1,5 +1,69 @@ # @object-ui/plugin-dashboard +## 17.8.0 + +### Minor Changes + +- fd060f0: The `object-metric` and `object-pivot` registrations no longer declare + `objectName` required, so the page compile accepts a node whose `dataSource` + binding names the object, and a node that names its object in neither place + shows a hint instead of a value or an empty table (objectui#11605). + + `@objectstack/spec`'s `object-metric` row leaves `objectName` optional, because + the node's `dataSource` binding can supply it; `object-pivot` has no spec row, + and the binding doc says a bound node needs no `objectName` of its own. Both + renderers agree: `dataSource.object` lands on `objectName` before the block + reads the node. The registrations still declared `required: true`, and the page + compile reads them, so a bound node with no `objectName` of its own was refused + with `missing-required-prop` and the save failed. + + **Clause-②: yes (widening)** — an `object-metric` or `object-pivot` node that + names its object through `dataSource.object` and sets no `objectName` now + compiles and saves. A node that names its object in neither place also compiles + now, and shows "No object named: set objectName or dataSource.object." where the + metric used to draw a bare dash and the pivot an empty state saying its query + returned no records. A metric with an authored `fallbackValue`, and a pivot with + inline `data` or a `bind` path, show no hint and render as before. + `object-data-table` is unchanged: it reads no binding, so its `objectName` stays + required. The published `objectName` inputs now carry a description that says + the binding can supply them. + +### Patch Changes + +- 2e818d0: The dashboard surfaces read every `widgets[]` entry without leaning on `BaseSchema`'s index signature: a widget key is read on the widget arm alone, and the `chart` node is built as a private hand-off type (objectui#11598). + + **N1, the `chart` producers.** `DashboardRenderer` and `DashboardGridLayout` build a `chart` node for a series widget bound to inline rows, and compose two render keys onto it: the dashboard palette (`colors`) and `isAnimationActive: false`, the deterministic first paint inside the grid (#2756). `ChartSchema` declares neither key, on either face, and the chart renderer reads both. Each producer now checks its literal against a hand-off type private to this package, `ChartSchema` plus those two keys, and hands the node on with no cast; the type is not exported, and the keys stay off `@object-ui/types`, because the strict authoring face refuses both on an authored `chart` node. Nothing drawn changes. + + **N2, widget keys on the slot entry.** An entry of `widgets[]` is a widget or a component node placed in the slot (a `metric-card`), and only the widget declares the widget keys (`dataset`, `options`, `chartConfig`, `filter`, `component`, `colorVariant`, `values`, `dimensions`, …). Every read of one now narrows the entry to the widget first, on `DashboardRenderer`, `DashboardGridLayout`, `DashboardWithConfig` and `DashboardEditor`. What changes is confined to a `metric-card` entry that carries a widget key, which `@object-ui/types/zod`'s strict face refuses and only the tolerant face accepts: + + - a `metric-card` carrying `dataset` draws its card; it used to draw the dataset tile in the card's place, on both dashboard surfaces; + - a `metric-card` carrying `options` draws its own keys; `options` used to be spread over them, so `options.value` replaced `value`; + - a `metric-card` carrying a `component` draws its card; the envelope's node used to be drawn instead. + + A document the strict face accepts draws exactly as before. `@object-ui/types`' docblocks on `DASHBOARD_COMPONENT_WIDGET_TYPES` and the Zod widget vocabulary, which described the dataset tile in the card's place and the `options` spread as live, were corrected to match; no type in it changes. In `DashboardEditor`, a `metric-card` entry is no longer offered the Color Variant select: the card declares no `colorVariant`, `MetricCard` draws nothing from it, and a pick stored a key publish refuses. A widget is offered it as before. +- Updated dependencies [c4c506b] +- Updated dependencies [9db9ff3] +- Updated dependencies [c096f03] +- Updated dependencies [b10c68e] +- Updated dependencies [bdc9049] +- Updated dependencies [e8c0b96] +- Updated dependencies [b92329c] +- Updated dependencies [2e818d0] +- Updated dependencies [fd060f0] +- Updated dependencies [fd060f0] +- Updated dependencies [8b14aec] +- Updated dependencies [2abec3a] +- Updated dependencies [9dfaca6] +- Updated dependencies [c000398] +- Updated dependencies [b403bb3] + - @object-ui/types@17.8.0 + - @object-ui/core@17.8.0 + - @object-ui/components@17.8.0 + - @object-ui/i18n@17.8.0 + - @object-ui/react@17.8.0 + - @object-ui/fields@17.8.0 + - @object-ui/permissions@17.8.0 + ## 17.7.0 ### Minor Changes diff --git a/packages/plugin-dashboard/package.json b/packages/plugin-dashboard/package.json index 9253a87ae7..23ba914724 100644 --- a/packages/plugin-dashboard/package.json +++ b/packages/plugin-dashboard/package.json @@ -1,6 +1,6 @@ { "name": "@object-ui/plugin-dashboard", - "version": "17.7.0", + "version": "17.8.0", "type": "module", "license": "MIT", "description": "Dashboard plugin for Object UI", diff --git a/packages/plugin-designer/CHANGELOG.md b/packages/plugin-designer/CHANGELOG.md index 3006f116ea..931d23ad6b 100644 --- a/packages/plugin-designer/CHANGELOG.md +++ b/packages/plugin-designer/CHANGELOG.md @@ -1,5 +1,50 @@ # @object-ui/plugin-designer +## 17.8.0 + +### Patch Changes + +- 2e818d0: The dashboard surfaces read every `widgets[]` entry without leaning on `BaseSchema`'s index signature: a widget key is read on the widget arm alone, and the `chart` node is built as a private hand-off type (objectui#11598). + + **N1, the `chart` producers.** `DashboardRenderer` and `DashboardGridLayout` build a `chart` node for a series widget bound to inline rows, and compose two render keys onto it: the dashboard palette (`colors`) and `isAnimationActive: false`, the deterministic first paint inside the grid (#2756). `ChartSchema` declares neither key, on either face, and the chart renderer reads both. Each producer now checks its literal against a hand-off type private to this package, `ChartSchema` plus those two keys, and hands the node on with no cast; the type is not exported, and the keys stay off `@object-ui/types`, because the strict authoring face refuses both on an authored `chart` node. Nothing drawn changes. + + **N2, widget keys on the slot entry.** An entry of `widgets[]` is a widget or a component node placed in the slot (a `metric-card`), and only the widget declares the widget keys (`dataset`, `options`, `chartConfig`, `filter`, `component`, `colorVariant`, `values`, `dimensions`, …). Every read of one now narrows the entry to the widget first, on `DashboardRenderer`, `DashboardGridLayout`, `DashboardWithConfig` and `DashboardEditor`. What changes is confined to a `metric-card` entry that carries a widget key, which `@object-ui/types/zod`'s strict face refuses and only the tolerant face accepts: + + - a `metric-card` carrying `dataset` draws its card; it used to draw the dataset tile in the card's place, on both dashboard surfaces; + - a `metric-card` carrying `options` draws its own keys; `options` used to be spread over them, so `options.value` replaced `value`; + - a `metric-card` carrying a `component` draws its card; the envelope's node used to be drawn instead. + + A document the strict face accepts draws exactly as before. `@object-ui/types`' docblocks on `DASHBOARD_COMPONENT_WIDGET_TYPES` and the Zod widget vocabulary, which described the dataset tile in the card's place and the `options` spread as live, were corrected to match; no type in it changes. In `DashboardEditor`, a `metric-card` entry is no longer offered the Color Variant select: the card declares no `colorVariant`, `MetricCard` draws nothing from it, and a pick stored a key publish refuses. A widget is offered it as before. +- Updated dependencies [c4c506b] +- Updated dependencies [9db9ff3] +- Updated dependencies [15f6702] +- Updated dependencies [c096f03] +- Updated dependencies [b10c68e] +- Updated dependencies [902ebab] +- Updated dependencies [bdc9049] +- Updated dependencies [e8c0b96] +- Updated dependencies [d768c31] +- Updated dependencies [b92329c] +- Updated dependencies [2e818d0] +- Updated dependencies [fd060f0] +- Updated dependencies [fd060f0] +- Updated dependencies [fd060f0] +- Updated dependencies [fd060f0] +- Updated dependencies [8b14aec] +- Updated dependencies [2abec3a] +- Updated dependencies [9dfaca6] +- Updated dependencies [c000398] +- Updated dependencies [b403bb3] + - @object-ui/types@17.8.0 + - @object-ui/core@17.8.0 + - @object-ui/components@17.8.0 + - @object-ui/plugin-form@17.8.0 + - @object-ui/i18n@17.8.0 + - @object-ui/plugin-grid@17.8.0 + - @object-ui/react@17.8.0 + - @object-ui/data-objectstack@17.8.0 + - @object-ui/layout@17.8.0 + ## 17.7.0 ### Minor Changes diff --git a/packages/plugin-designer/package.json b/packages/plugin-designer/package.json index ad87664c5a..0e96a24ec6 100644 --- a/packages/plugin-designer/package.json +++ b/packages/plugin-designer/package.json @@ -1,6 +1,6 @@ { "name": "@object-ui/plugin-designer", - "version": "17.7.0", + "version": "17.8.0", "type": "module", "license": "MIT", "description": "Visual designer plugin for Object UI with page, data model, process, and report designers plus collaborative editing.", diff --git a/packages/plugin-detail/CHANGELOG.md b/packages/plugin-detail/CHANGELOG.md index ff821c364d..41fa506cca 100644 --- a/packages/plugin-detail/CHANGELOG.md +++ b/packages/plugin-detail/CHANGELOG.md @@ -1,5 +1,59 @@ # @object-ui/plugin-detail +## 17.8.0 + +### Minor Changes + +- 4c127cd: The `record:related_list` registration no longer declares `columns` required, so + the page compile accepts a related list that lists no columns of its own + (objectui#11613). + + `@objectstack/spec`'s `record:related_list` row leaves `columns` optional, and the + renderer agrees: a `dataSource` binding that names a view lands that view's + columns on the node, and with neither the list derives its columns from the + related object (its `highlightFields`, otherwise its listable fields). The + registration still declared `required: true`, and the page compile reads the + registration, so a node with no `columns` was refused with + `missing-required-prop` and the save failed. + + **Clause-②: yes (widening)** — a `record:related_list` node that sets no `columns` + now compiles and saves, whether a `dataSource` binding names a view (the list + draws the view's columns) or not (the list draws columns derived from the related + object, as it already did when such a node reached it). Authored `columns` still + win over both. `objectName` and `relationshipField` are still required, as the + spec row requires them. The published `columns` input now carries a description + that says where the columns come from when it is absent. + +### Patch Changes + +- b61c116: fix(plugin-detail): `record:details` read mode shows a `textarea` value with its line breaks (objectui#11577) + + A multi-line `textarea` value, such as a note with a blank line in it, read as one line on the record page: the details body drew every `textarea` value with the grid's one-line cell, which folds line breaks into spaces and cuts a long value off with an ellipsis. The record form's read-only field and, since objectui#11562, the inline editor already kept the breaks. + + The details body now draws a `textarea` value with the fields package's own read display, the read-only branch of `TextAreaField`, which is the display the record form uses. Line breaks, blank lines and a trailing newline show as stored. A single-line value reads as the same line; a long one now wraps at the column width instead of ending in an ellipsis. Other field types, plain text included, render exactly as before, and grid cells keep their one-line display. +- Updated dependencies [c4c506b] +- Updated dependencies [9db9ff3] +- Updated dependencies [c096f03] +- Updated dependencies [b10c68e] +- Updated dependencies [bdc9049] +- Updated dependencies [e8c0b96] +- Updated dependencies [b92329c] +- Updated dependencies [2e818d0] +- Updated dependencies [fd060f0] +- Updated dependencies [fd060f0] +- Updated dependencies [8b14aec] +- Updated dependencies [2abec3a] +- Updated dependencies [9dfaca6] +- Updated dependencies [c000398] +- Updated dependencies [b403bb3] + - @object-ui/types@17.8.0 + - @object-ui/core@17.8.0 + - @object-ui/components@17.8.0 + - @object-ui/i18n@17.8.0 + - @object-ui/react@17.8.0 + - @object-ui/fields@17.8.0 + - @object-ui/permissions@17.8.0 + ## 17.7.0 ### Minor Changes diff --git a/packages/plugin-detail/package.json b/packages/plugin-detail/package.json index f7874d4906..2089f69ba1 100644 --- a/packages/plugin-detail/package.json +++ b/packages/plugin-detail/package.json @@ -1,6 +1,6 @@ { "name": "@object-ui/plugin-detail", - "version": "17.7.0", + "version": "17.8.0", "type": "module", "license": "MIT", "description": "DetailView plugin for Object UI - comprehensive detail page with sections, tabs, and related lists", diff --git a/packages/plugin-editor/CHANGELOG.md b/packages/plugin-editor/CHANGELOG.md index dcca107951..453455d88e 100644 --- a/packages/plugin-editor/CHANGELOG.md +++ b/packages/plugin-editor/CHANGELOG.md @@ -1,5 +1,24 @@ # @object-ui/plugin-editor +## 17.8.0 + +### Patch Changes + +- Updated dependencies [c4c506b] +- Updated dependencies [9db9ff3] +- Updated dependencies [c096f03] +- Updated dependencies [b10c68e] +- Updated dependencies [bdc9049] +- Updated dependencies [2e818d0] +- Updated dependencies [8b14aec] +- Updated dependencies [2abec3a] +- Updated dependencies [9dfaca6] +- Updated dependencies [c000398] +- Updated dependencies [b403bb3] + - @object-ui/types@17.8.0 + - @object-ui/core@17.8.0 + - @object-ui/components@17.8.0 + ## 17.7.0 ### Minor Changes diff --git a/packages/plugin-editor/package.json b/packages/plugin-editor/package.json index ad36b43a9c..066f06be76 100644 --- a/packages/plugin-editor/package.json +++ b/packages/plugin-editor/package.json @@ -1,6 +1,6 @@ { "name": "@object-ui/plugin-editor", - "version": "17.7.0", + "version": "17.8.0", "type": "module", "license": "MIT", "description": "Rich text editor plugin for Object UI, powered by Monaco Editor", diff --git a/packages/plugin-form/CHANGELOG.md b/packages/plugin-form/CHANGELOG.md index 814000a950..a117244ff8 100644 --- a/packages/plugin-form/CHANGELOG.md +++ b/packages/plugin-form/CHANGELOG.md @@ -1,5 +1,103 @@ # @object-ui/plugin-form +## 17.8.0 + +### Minor Changes + +- 902ebab: The `record:line_items` registration no longer declares `childObject` required, + so the page compile accepts a node whose `dataSource` binding names the child + object (objectui#11569). + + `@objectstack/spec`'s `record:line_items` row leaves `childObject` optional, + because the node's `dataSource` binding can supply it, and the renderer agrees: + `dataSource.object` lands on `childObject` before the panel reads the node. The + registration still declared `required: true`, and the page compile reads the + registration, so a bound node with no `childObject` of its own was refused with + `missing-required-prop` and the save failed. + + **Clause-②: yes (widening)** — a `record:line_items` node that names its child object + through `dataSource.object` and sets no `childObject` now compiles and saves. A + node that names its child object in neither place also compiles now: the panel + shows its configuration hint naming `childObject` and loads nothing, as it did + before when such a node reached it. `relationshipField` and `columns` are still + required. The published `childObject` input now carries a description that says + the binding can supply it. +- fd060f0: The `object-form`, `view:form`, `embeddable-form` and + `object-master-detail-form` registrations no longer declare `objectName` + required, so the page compile accepts a node whose `dataSource` binding names the + object, and a form that names its object in neither place shows a hint instead of + a form with no fields (objectui#11605). + + `@objectstack/spec`'s `object-form` and `object-master-detail-form` rows leave + `objectName` optional, because the node's `dataSource` binding can supply it; + `embeddable-form` has no spec row, and the binding doc says a bound node needs no + `objectName` of its own. Each renderer agrees: `dataSource.object` lands on + `objectName` before the form reads the node. The registrations still declared + `required: true`, and the page compile reads them, so a bound form with no + `objectName` of its own was refused with `missing-required-prop` and the save + failed. + + **Clause-②: yes (widening)** — an `object-form`, `view:form`, `embeddable-form` + or `object-master-detail-form` node that names its object through + `dataSource.object` and sets no `objectName` now compiles and saves. A node that + names its object in neither place also compiles now, and shows "No object named: + set objectName or dataSource.object." where it used to draw a field-less card, a + public form that could not submit, or an empty parent form. An `object-form` + or `view:form` whose fields are declared inline shows no hint and renders as + before: non-empty `customFields`, or `sections` whose every field is an inline + field, the target-less collector the `tabbed`, `wizard`, `split`, `drawer` and + `modal` variants render. `formId` on `embeddable-form` and `details` on + `object-master-detail-form` are still required. The published `objectName` + inputs now carry a description that says the binding can supply them. +- 9dfaca6: The default (`simple`) `object-form` draws a self-describing inline section entry, as the `tabbed`, `wizard`, `split`, `drawer` and `modal` forms already did (objectui#11615). Before, the default form resolved every section entry against its parent field pool and skipped an inline `{ name, … }` entry whose name the pool did not hold. The same section drew that entry on every other form type and drew nothing for it on `simple`, apart from a console warning when the object declared the name. + + **Clause-②: yes (widening, with one break for TypeScript readers).** Authored input is only widened: nothing either package accepted before is refused now. Code that READS `ObjectFormSection.fields` can break at compile time, described under "Breaking for TypeScript readers" below. + + - `@object-ui/types`: `ObjectFormSection.fields` is `(string | SpecFormFieldInput | FormField)[]`. The new arm is the form view's `{ field, … }` entry, and it is `@objectstack/spec`'s `FormFieldInput` by reference, not a copy. The form already drew that entry. Before, a TypeScript author could not annotate it, because `FormField` requires `name` and types `field` as an object. The zod mirror is unchanged: a section's `fields` entry is still `z.any()` there. + - `@object-ui/plugin-form`, layout types: the section `fields` of the five layout configs is `NonNullable`, by reference. Those configs are `FormSectionConfig` (tabbed), `WizardStepConfig`, `SplitFormSectionConfig`, `DrawerFormSectionConfig` and `ModalFormSectionConfig`, reached through the exported `TabbedFormSchema`, `WizardFormSchema`, `SplitFormSchema`, `DrawerFormSchema` and `ModalFormSchema`. Each of these layouts already drew the `{ field }` entry. Before, their types refused it, and `ObjectForm` passing an authored section to them would no longer compile once the section type named the entry. + - `@object-ui/plugin-form`, section drawing: on `simple`, an entry that names itself is drawn as it stands, whatever the field pool holds. Such an entry is an object whose `field` is not a string and whose `name` is a string. This is the existing `isInlineFieldDef` predicate that the submit-target rule already reads. It does not require `type`: the spec's inline arm makes `type` optional, and the other five forms draw a typeless entry as the default input. + - `@object-ui/plugin-form`, inline collector: a `simple` form with no data source and no `submitHandler`, whose sections list only inline entries, is now a self-contained collector, as on the other five forms. It opens on `initialValues` / `initialData`, and its `onSuccess` receives the collected values. Before, that form drew no fields and refused the submit. Its submit carve-out now reads the shared `hasInlineFieldSource`. + + **Breaking for TypeScript readers of `ObjectFormSection.fields`** (still `minor`: objectui's major follows the `@objectstack` family major, so its own breaks ship as `minor` and are stated here). A consumer that narrowed an entry with `typeof entry === 'string' ? entry : entry.name` compiled while every object entry was typed as an inline `FormField`. It no longer compiles: `Property 'name' does not exist on type 'FormFieldInput | FormField'`. The read was already wrong at runtime for a `{ field }` entry, where it gave `undefined`. Remedy: name an entry by its arm. The string is the name itself, the `{ field }` entry names its field by `field`, and the inline entry names it by `name`. `@object-ui/plugin-form` now exports `sectionEntryName(entry)`, which applies exactly that rule and returns `undefined` for an entry that names nothing. It sits beside `resolveSectionGroupReferences`, whose result it reads. The repo's own reader, an app-shell test over that resolver's result, is respelled this way. + + **What stays refused or warned.** + + - A field name and a `{ field }` entry still resolve against the pool on `simple`. A name the pool does not hold is still dropped, and still warned about once when the object declares it, because top-level `fields` and `sections` still intersect (objectui#9884). + - An inline entry with no `name` is malformed and is still not drawn on `simple`. + - A form with no data source and no `submitHandler` still refuses its submit with `DataSource is required for form submission (inline mode not configured)` unless every section entry is inline. One name or `{ field }` entry among inline ones is enough to refuse, on all six forms. + + **Behaviour change for an existing schema.** On `simple`, an inline entry whose name the object declares but top-level `fields` leaves out used to be dropped with the intersection warning. It is now drawn as its own definition, with no warning, as on the other five forms. With a data source, its value is still written only if the object declares the field. As on every form, a key the object does not declare is stripped from the write. + +### Patch Changes + +- 15f6702: `deriveColumns`, the default columns of a master-detail inline grid whose author listed none, now takes which columns it draws, their order and which of them are `defaultHidden` from `@objectstack/spec`'s `deriveInlineGridColumns`, and its visible budget from the spec's `DEFAULT_MAX_INLINE_GRID_COLUMNS` (objectui#11345). The rule is the spec's now, so objectstack's `field-no-consumers` lint credits exactly the columns this grid draws. + + The output does not change. The signature is the same, and each column's label, cell type, options, lookup target, conditional rules and computed expression are still built from the child field here, including a plain text column for a field whose definition is falsy. The module-level `DEFAULT_MAX_INLINE_COLUMNS` constant, which the package entry never exported, is removed. + + `@object-ui/plugin-form` raises its `@objectstack/spec` floor from `^17.0.0` to `^17.6.0`, because its published entry now imports `deriveInlineGridColumns` and `DEFAULT_MAX_INLINE_GRID_COLUMNS`, which the spec first exports in 17.6.0. +- Updated dependencies [c4c506b] +- Updated dependencies [9db9ff3] +- Updated dependencies [c096f03] +- Updated dependencies [b10c68e] +- Updated dependencies [bdc9049] +- Updated dependencies [e8c0b96] +- Updated dependencies [b92329c] +- Updated dependencies [2e818d0] +- Updated dependencies [fd060f0] +- Updated dependencies [fd060f0] +- Updated dependencies [8b14aec] +- Updated dependencies [2abec3a] +- Updated dependencies [9dfaca6] +- Updated dependencies [c000398] +- Updated dependencies [b403bb3] + - @object-ui/types@17.8.0 + - @object-ui/core@17.8.0 + - @object-ui/components@17.8.0 + - @object-ui/i18n@17.8.0 + - @object-ui/react@17.8.0 + - @object-ui/fields@17.8.0 + - @object-ui/permissions@17.8.0 + ## 17.7.0 ### Minor Changes diff --git a/packages/plugin-form/package.json b/packages/plugin-form/package.json index e6457f44ac..e8a8bb9b1a 100644 --- a/packages/plugin-form/package.json +++ b/packages/plugin-form/package.json @@ -1,6 +1,6 @@ { "name": "@object-ui/plugin-form", - "version": "17.7.0", + "version": "17.8.0", "type": "module", "license": "MIT", "description": "Form plugin for Object UI", diff --git a/packages/plugin-gantt/CHANGELOG.md b/packages/plugin-gantt/CHANGELOG.md index fe41a0bb93..4c02a0e97f 100644 --- a/packages/plugin-gantt/CHANGELOG.md +++ b/packages/plugin-gantt/CHANGELOG.md @@ -1,5 +1,35 @@ # @object-ui/plugin-gantt +## 17.8.0 + +### Patch Changes + +- Updated dependencies [c4c506b] +- Updated dependencies [9db9ff3] +- Updated dependencies [c096f03] +- Updated dependencies [b10c68e] +- Updated dependencies [bdc9049] +- Updated dependencies [b61c116] +- Updated dependencies [e8c0b96] +- Updated dependencies [b92329c] +- Updated dependencies [2e818d0] +- Updated dependencies [fd060f0] +- Updated dependencies [fd060f0] +- Updated dependencies [8b14aec] +- Updated dependencies [2abec3a] +- Updated dependencies [4c127cd] +- Updated dependencies [9dfaca6] +- Updated dependencies [c000398] +- Updated dependencies [b403bb3] + - @object-ui/types@17.8.0 + - @object-ui/core@17.8.0 + - @object-ui/components@17.8.0 + - @object-ui/plugin-detail@17.8.0 + - @object-ui/i18n@17.8.0 + - @object-ui/react@17.8.0 + - @object-ui/fields@17.8.0 + - @object-ui/permissions@17.8.0 + ## 17.7.0 ### Minor Changes diff --git a/packages/plugin-gantt/package.json b/packages/plugin-gantt/package.json index 5f0c0cdf4c..138d99a04c 100644 --- a/packages/plugin-gantt/package.json +++ b/packages/plugin-gantt/package.json @@ -1,6 +1,6 @@ { "name": "@object-ui/plugin-gantt", - "version": "17.7.0", + "version": "17.8.0", "type": "module", "license": "MIT", "description": "Gantt chart plugin for Object UI", diff --git a/packages/plugin-grid/CHANGELOG.md b/packages/plugin-grid/CHANGELOG.md index a131dfbb1c..e40be7691c 100644 --- a/packages/plugin-grid/CHANGELOG.md +++ b/packages/plugin-grid/CHANGELOG.md @@ -1,5 +1,76 @@ # @object-ui/plugin-grid +## 17.8.0 + +### Minor Changes + +- fd060f0: The `object-grid` and `view:grid` registrations no longer declare `objectName` + required, so the page compile accepts a node whose `dataSource` binding names the + object (objectui#11605). + + `@objectstack/spec`'s `object-grid` row leaves `objectName` optional, because the + node's `dataSource` binding can supply it, and the renderer agrees: + `dataSource.object` lands on `objectName` before the grid reads the node. The + registration still declared `required: true`, and the page compile reads the + registration, so a bound node with no `objectName` of its own was refused with + `missing-required-prop` and the save failed. + + **Clause-②: yes (widening)** — an `object-grid` (or `view:grid`) node that names + its object through `dataSource.object` and sets no `objectName` now compiles and + saves. A node that names its object in neither place also compiles now; the grid + answers it at runtime with its own "Object name required for data fetching" + error, as it did before when such a node reached it. The published `objectName` + input now carries a description that says the binding can supply it. + +### Patch Changes + +- d768c31: The `object-grid` summary footer reads `currency`, `defaultCurrency`, + `precision` and `scale` from the object field only. A column that carries one + of these keys no longer changes the footer (objectui#11588). + + `ListColumnSchema` (`@objectstack/spec/ui`) is a strict object, and it declares + none of the four keys. A view that authors one on a column is refused at publish + with `unrecognized_keys`. `useColumnSummary` read them anyway, and the column's + value won over the field's, so a column `currency` re-coded the total and a + column `scale` re-sized it. That read is retired rather than declared upstream, + and the footer now takes these hints the way it already took `currencyConfig` + and `max`, and the way the list cell above it reads them. The census behind the + ruling found no view that writes one of these keys on a grid column. + + **Behaviour change.** A grid handed a column that carries `currency`, + `defaultCurrency`, `precision` or `scale` (which validation refuses) now formats + its footer from the object field's definition, falling back to the tenant + currency as before. A column's declared `type` still decides the footer's unit, + and a grid whose columns carry none of the four keys is unchanged. The exported + `useColumnSummary` signature does not change. Its `fieldMetadata` argument is + where these hints go. +- Updated dependencies [c4c506b] +- Updated dependencies [9db9ff3] +- Updated dependencies [c096f03] +- Updated dependencies [b10c68e] +- Updated dependencies [bdc9049] +- Updated dependencies [b61c116] +- Updated dependencies [e8c0b96] +- Updated dependencies [b92329c] +- Updated dependencies [2e818d0] +- Updated dependencies [fd060f0] +- Updated dependencies [fd060f0] +- Updated dependencies [8b14aec] +- Updated dependencies [2abec3a] +- Updated dependencies [4c127cd] +- Updated dependencies [9dfaca6] +- Updated dependencies [c000398] +- Updated dependencies [b403bb3] + - @object-ui/types@17.8.0 + - @object-ui/core@17.8.0 + - @object-ui/components@17.8.0 + - @object-ui/plugin-detail@17.8.0 + - @object-ui/i18n@17.8.0 + - @object-ui/react@17.8.0 + - @object-ui/fields@17.8.0 + - @object-ui/mobile@17.8.0 + - @object-ui/permissions@17.8.0 + ## 17.7.0 ### Minor Changes diff --git a/packages/plugin-grid/package.json b/packages/plugin-grid/package.json index 96551955a3..76cba8828b 100644 --- a/packages/plugin-grid/package.json +++ b/packages/plugin-grid/package.json @@ -1,6 +1,6 @@ { "name": "@object-ui/plugin-grid", - "version": "17.7.0", + "version": "17.8.0", "type": "module", "license": "MIT", "description": "Grid plugin for Object UI", diff --git a/packages/plugin-kanban/CHANGELOG.md b/packages/plugin-kanban/CHANGELOG.md index fc2a15ca23..7193fbd2d2 100644 --- a/packages/plugin-kanban/CHANGELOG.md +++ b/packages/plugin-kanban/CHANGELOG.md @@ -1,5 +1,70 @@ # @object-ui/plugin-kanban +## 17.8.0 + +### Minor Changes + +- fd060f0: The `object-kanban` registration no longer declares `objectName` required, so + the page compile accepts a board whose `dataSource` binding names the object, and + a board that names its object in neither place shows a hint instead of an empty + board (objectui#11605). + + `@objectstack/spec`'s `object-kanban` row leaves `objectName` optional, because + the node's `dataSource` binding can supply it, and the renderer agrees: + `dataSource.object` lands on `objectName` before the board reads the node. The + registration still declared `required: true`, and the page compile reads the + registration, so a bound board with no `objectName` of its own was refused with + `missing-required-prop` and the save failed. + + **Clause-②: yes (widening)** — an `object-kanban` node that names its object + through `dataSource.object` and sets no `objectName` now compiles and saves. A + node that names its object in neither place also compiles now, and the board + shows "No object named: set objectName or dataSource.object." where it used to + draw an empty board reading "No cards". A board with rows from inline `data` + (an empty array included), a `bind` path or a parent view shows no hint and + renders as before. The published `objectName` input now carries a description + that says the binding can supply it. + +### Patch Changes + +- b403bb3: **`BaseSchema` no longer declares `[key: string]: any`** (objectui#8347, executing the objectui#7927 ruling: the TypeScript face is a contract). Every node type extends `BaseSchema`, so a node literal annotated with its node type now refuses a key that no declaration names, a misspelled key included, where it used to type it `any`. The correct spelling compiles as before. + + **Clause-②: yes (narrowing)**, shipped as `minor` per this repository's version policy. The removal narrows the TypeScript authoring face of every node type; the `visibleWhen` change below widens both faces to the envelope the spec's own parse writes. + + - **What does not move.** The zod faces keep their accept sets for every key but `visibleWhen`: the tolerant mirror is still `.passthrough()`, so `safeValidateSchema` keeps an undeclared key, and the derived strict face refuses it as before. `ComponentRendererProps`, the renderer props type, keeps its own index signature. Nothing a renderer draws changes. + - **The bound.** TypeScript runs its excess-property check only on a fresh object literal. A value that reached its annotation through a variable of a wider type is not re-checked. + - **`PartialSchema` works as written.** With the signature gone, `keyof T` is the literal member union again, so the alias keeps `T`'s declared members, optional, with `type` required. While the signature stood it declared `type` alone (objectui#6397). + - **`BaseSchema.visibleWhen` is the spec's `EvaluatedExpressionInput`**, by reference: a predicate string, or the `{ dialect, source }` envelope. The zod twin takes `EvaluatedExpressionInputSchema`'s verdict without its transform, so a string parses to itself. A dialect-less envelope, an unknown dialect and a blank predicate are refused, as the spec refuses them. Both faces read `string` before, which refused the envelope a spec parse writes into this key. + - **`@object-ui/plugin-kanban`.** `ObjectKanban` reads the `sort` the element data-source gate writes through a read type private to the package. `ObjectKanbanSchema` still declares no `sort` (objectui#8174). Nothing drawn changes. + - **`@object-ui/plugin-timeline`.** `TimelineRenderSchema`, the `schema` prop type of the exported `TimelineRenderer`, gains one optional member: the `onItemClick` slot `ObjectTimeline` composes. That is a one-member optional widening of an exported prop type. `TimelineSchema`, the authoring face, still declares no `onItemClick`. Nothing drawn changes. + + **Migration.** Where a literal stops compiling, the key is misspelled (fix it) or not declared on that node type (declare it on the type that reads it, by reference to the `@objectstack/spec` row, or remove it). Do not cast past the error. `props`, the legacy alias of `properties`, is not declared on the TypeScript face; the renderer still reads it, so write `properties`. +- Updated dependencies [c4c506b] +- Updated dependencies [9db9ff3] +- Updated dependencies [c096f03] +- Updated dependencies [b10c68e] +- Updated dependencies [bdc9049] +- Updated dependencies [b61c116] +- Updated dependencies [e8c0b96] +- Updated dependencies [b92329c] +- Updated dependencies [2e818d0] +- Updated dependencies [fd060f0] +- Updated dependencies [fd060f0] +- Updated dependencies [8b14aec] +- Updated dependencies [2abec3a] +- Updated dependencies [4c127cd] +- Updated dependencies [9dfaca6] +- Updated dependencies [c000398] +- Updated dependencies [b403bb3] + - @object-ui/types@17.8.0 + - @object-ui/core@17.8.0 + - @object-ui/components@17.8.0 + - @object-ui/plugin-detail@17.8.0 + - @object-ui/i18n@17.8.0 + - @object-ui/react@17.8.0 + - @object-ui/fields@17.8.0 + - @object-ui/permissions@17.8.0 + ## 17.7.0 ### Minor Changes diff --git a/packages/plugin-kanban/package.json b/packages/plugin-kanban/package.json index 3a00729d5c..73c7985f12 100644 --- a/packages/plugin-kanban/package.json +++ b/packages/plugin-kanban/package.json @@ -1,6 +1,6 @@ { "name": "@object-ui/plugin-kanban", - "version": "17.7.0", + "version": "17.8.0", "type": "module", "license": "MIT", "description": "Kanban board plugin for Object UI, powered by dnd-kit", diff --git a/packages/plugin-list/CHANGELOG.md b/packages/plugin-list/CHANGELOG.md index a687dd31b4..52e68d27d7 100644 --- a/packages/plugin-list/CHANGELOG.md +++ b/packages/plugin-list/CHANGELOG.md @@ -1,5 +1,56 @@ # @object-ui/plugin-list +## 17.8.0 + +### Minor Changes + +- fd060f0: The `list-view` and `view:list` registrations no longer declare `objectName` + required, so the page compile accepts a node whose `dataSource` binding names the + object, and a list that names its object in neither place shows a hint instead of + an empty list (objectui#11605). + + `list-view` has no spec row. The binding doc says a node bound by + `dataSource.object` needs no `objectName` of its own, and the schema validator + counts the binding as a `list-view` record source. The renderer agrees: + `dataSource.object` lands on `objectName` before the list reads the node. The + registrations still declared `required: true`, and the page compile reads them, + so a bound list with no `objectName` of its own was refused with + `missing-required-prop` and the save failed. + + **Clause-②: yes (widening)** — a `list-view` (or `view:list`) node that names its + object through `dataSource.object` and sets no `objectName` now compiles and + saves. A node that names its object in neither place also compiles now, and the + list shows "No object named: set objectName or dataSource.object." where it used + to draw the "Nothing here yet" empty state. A list with inline `data` shows no + hint and renders as before. The published `objectName` input now carries a + description that says the binding can supply it. + +### Patch Changes + +- Updated dependencies [c4c506b] +- Updated dependencies [9db9ff3] +- Updated dependencies [c096f03] +- Updated dependencies [b10c68e] +- Updated dependencies [bdc9049] +- Updated dependencies [e8c0b96] +- Updated dependencies [b92329c] +- Updated dependencies [2e818d0] +- Updated dependencies [fd060f0] +- Updated dependencies [fd060f0] +- Updated dependencies [8b14aec] +- Updated dependencies [2abec3a] +- Updated dependencies [9dfaca6] +- Updated dependencies [c000398] +- Updated dependencies [b403bb3] + - @object-ui/types@17.8.0 + - @object-ui/core@17.8.0 + - @object-ui/components@17.8.0 + - @object-ui/i18n@17.8.0 + - @object-ui/react@17.8.0 + - @object-ui/fields@17.8.0 + - @object-ui/mobile@17.8.0 + - @object-ui/permissions@17.8.0 + ## 17.7.0 ### Minor Changes diff --git a/packages/plugin-list/package.json b/packages/plugin-list/package.json index c6aaee257a..6dec07a2fc 100644 --- a/packages/plugin-list/package.json +++ b/packages/plugin-list/package.json @@ -1,6 +1,6 @@ { "name": "@object-ui/plugin-list", - "version": "17.7.0", + "version": "17.8.0", "type": "module", "license": "MIT", "description": "ListView plugin for Object UI - unified view component with view type switching", diff --git a/packages/plugin-map/CHANGELOG.md b/packages/plugin-map/CHANGELOG.md index 4a1ff9558b..c9a3e62174 100644 --- a/packages/plugin-map/CHANGELOG.md +++ b/packages/plugin-map/CHANGELOG.md @@ -1,5 +1,27 @@ # @object-ui/plugin-map +## 17.8.0 + +### Patch Changes + +- Updated dependencies [c4c506b] +- Updated dependencies [9db9ff3] +- Updated dependencies [c096f03] +- Updated dependencies [b10c68e] +- Updated dependencies [bdc9049] +- Updated dependencies [2e818d0] +- Updated dependencies [fd060f0] +- Updated dependencies [8b14aec] +- Updated dependencies [2abec3a] +- Updated dependencies [9dfaca6] +- Updated dependencies [c000398] +- Updated dependencies [b403bb3] + - @object-ui/types@17.8.0 + - @object-ui/core@17.8.0 + - @object-ui/components@17.8.0 + - @object-ui/react@17.8.0 + - @object-ui/permissions@17.8.0 + ## 17.7.0 ### Minor Changes diff --git a/packages/plugin-map/package.json b/packages/plugin-map/package.json index 4652af6995..198f315ce5 100644 --- a/packages/plugin-map/package.json +++ b/packages/plugin-map/package.json @@ -1,6 +1,6 @@ { "name": "@object-ui/plugin-map", - "version": "17.7.0", + "version": "17.8.0", "type": "module", "license": "MIT", "description": "Map visualization plugin for Object UI", diff --git a/packages/plugin-markdown/CHANGELOG.md b/packages/plugin-markdown/CHANGELOG.md index 129ef631a8..f9c91f39ee 100644 --- a/packages/plugin-markdown/CHANGELOG.md +++ b/packages/plugin-markdown/CHANGELOG.md @@ -1,5 +1,24 @@ # @object-ui/plugin-markdown +## 17.8.0 + +### Patch Changes + +- Updated dependencies [c4c506b] +- Updated dependencies [9db9ff3] +- Updated dependencies [c096f03] +- Updated dependencies [b10c68e] +- Updated dependencies [bdc9049] +- Updated dependencies [2e818d0] +- Updated dependencies [8b14aec] +- Updated dependencies [2abec3a] +- Updated dependencies [9dfaca6] +- Updated dependencies [c000398] +- Updated dependencies [b403bb3] + - @object-ui/types@17.8.0 + - @object-ui/core@17.8.0 + - @object-ui/components@17.8.0 + ## 17.7.0 ### Minor Changes diff --git a/packages/plugin-markdown/package.json b/packages/plugin-markdown/package.json index aa8faab51d..ef0d2c81e2 100644 --- a/packages/plugin-markdown/package.json +++ b/packages/plugin-markdown/package.json @@ -1,6 +1,6 @@ { "name": "@object-ui/plugin-markdown", - "version": "17.7.0", + "version": "17.8.0", "type": "module", "license": "MIT", "description": "Markdown rendering plugin for Object UI, powered by react-markdown", diff --git a/packages/plugin-report/CHANGELOG.md b/packages/plugin-report/CHANGELOG.md index 65eb754307..c003e272db 100644 --- a/packages/plugin-report/CHANGELOG.md +++ b/packages/plugin-report/CHANGELOG.md @@ -1,5 +1,31 @@ # @object-ui/plugin-report +## 17.8.0 + +### Patch Changes + +- Updated dependencies [c4c506b] +- Updated dependencies [9db9ff3] +- Updated dependencies [c096f03] +- Updated dependencies [b10c68e] +- Updated dependencies [bdc9049] +- Updated dependencies [e8c0b96] +- Updated dependencies [b92329c] +- Updated dependencies [2e818d0] +- Updated dependencies [fd060f0] +- Updated dependencies [fd060f0] +- Updated dependencies [8b14aec] +- Updated dependencies [2abec3a] +- Updated dependencies [9dfaca6] +- Updated dependencies [c000398] +- Updated dependencies [b403bb3] + - @object-ui/types@17.8.0 + - @object-ui/core@17.8.0 + - @object-ui/components@17.8.0 + - @object-ui/i18n@17.8.0 + - @object-ui/react@17.8.0 + - @object-ui/fields@17.8.0 + ## 17.7.0 ### Minor Changes diff --git a/packages/plugin-report/package.json b/packages/plugin-report/package.json index 435efe7978..d825bd079c 100644 --- a/packages/plugin-report/package.json +++ b/packages/plugin-report/package.json @@ -1,6 +1,6 @@ { "name": "@object-ui/plugin-report", - "version": "17.7.0", + "version": "17.8.0", "type": "module", "main": "dist/index.umd.cjs", "module": "dist/index.js", diff --git a/packages/plugin-timeline/CHANGELOG.md b/packages/plugin-timeline/CHANGELOG.md index 6525c9c202..986b9df317 100644 --- a/packages/plugin-timeline/CHANGELOG.md +++ b/packages/plugin-timeline/CHANGELOG.md @@ -1,5 +1,47 @@ # @object-ui/plugin-timeline +## 17.8.0 + +### Minor Changes + +- b403bb3: **`BaseSchema` no longer declares `[key: string]: any`** (objectui#8347, executing the objectui#7927 ruling: the TypeScript face is a contract). Every node type extends `BaseSchema`, so a node literal annotated with its node type now refuses a key that no declaration names, a misspelled key included, where it used to type it `any`. The correct spelling compiles as before. + + **Clause-②: yes (narrowing)**, shipped as `minor` per this repository's version policy. The removal narrows the TypeScript authoring face of every node type; the `visibleWhen` change below widens both faces to the envelope the spec's own parse writes. + + - **What does not move.** The zod faces keep their accept sets for every key but `visibleWhen`: the tolerant mirror is still `.passthrough()`, so `safeValidateSchema` keeps an undeclared key, and the derived strict face refuses it as before. `ComponentRendererProps`, the renderer props type, keeps its own index signature. Nothing a renderer draws changes. + - **The bound.** TypeScript runs its excess-property check only on a fresh object literal. A value that reached its annotation through a variable of a wider type is not re-checked. + - **`PartialSchema` works as written.** With the signature gone, `keyof T` is the literal member union again, so the alias keeps `T`'s declared members, optional, with `type` required. While the signature stood it declared `type` alone (objectui#6397). + - **`BaseSchema.visibleWhen` is the spec's `EvaluatedExpressionInput`**, by reference: a predicate string, or the `{ dialect, source }` envelope. The zod twin takes `EvaluatedExpressionInputSchema`'s verdict without its transform, so a string parses to itself. A dialect-less envelope, an unknown dialect and a blank predicate are refused, as the spec refuses them. Both faces read `string` before, which refused the envelope a spec parse writes into this key. + - **`@object-ui/plugin-kanban`.** `ObjectKanban` reads the `sort` the element data-source gate writes through a read type private to the package. `ObjectKanbanSchema` still declares no `sort` (objectui#8174). Nothing drawn changes. + - **`@object-ui/plugin-timeline`.** `TimelineRenderSchema`, the `schema` prop type of the exported `TimelineRenderer`, gains one optional member: the `onItemClick` slot `ObjectTimeline` composes. That is a one-member optional widening of an exported prop type. `TimelineSchema`, the authoring face, still declares no `onItemClick`. Nothing drawn changes. + + **Migration.** Where a literal stops compiling, the key is misspelled (fix it) or not declared on that node type (declare it on the type that reads it, by reference to the `@objectstack/spec` row, or remove it). Do not cast past the error. `props`, the legacy alias of `properties`, is not declared on the TypeScript face; the renderer still reads it, so write `properties`. + +### Patch Changes + +- Updated dependencies [c4c506b] +- Updated dependencies [9db9ff3] +- Updated dependencies [c096f03] +- Updated dependencies [b10c68e] +- Updated dependencies [bdc9049] +- Updated dependencies [e8c0b96] +- Updated dependencies [b92329c] +- Updated dependencies [2e818d0] +- Updated dependencies [fd060f0] +- Updated dependencies [fd060f0] +- Updated dependencies [8b14aec] +- Updated dependencies [2abec3a] +- Updated dependencies [9dfaca6] +- Updated dependencies [c000398] +- Updated dependencies [b403bb3] + - @object-ui/types@17.8.0 + - @object-ui/core@17.8.0 + - @object-ui/components@17.8.0 + - @object-ui/i18n@17.8.0 + - @object-ui/react@17.8.0 + - @object-ui/mobile@17.8.0 + - @object-ui/permissions@17.8.0 + ## 17.7.0 ### Minor Changes diff --git a/packages/plugin-timeline/package.json b/packages/plugin-timeline/package.json index b9c93ac7b7..13b679ab0f 100644 --- a/packages/plugin-timeline/package.json +++ b/packages/plugin-timeline/package.json @@ -1,6 +1,6 @@ { "name": "@object-ui/plugin-timeline", - "version": "17.7.0", + "version": "17.8.0", "type": "module", "license": "MIT", "description": "Timeline component plugin for Object UI", diff --git a/packages/plugin-tree/CHANGELOG.md b/packages/plugin-tree/CHANGELOG.md index 15da22d871..6740236bef 100644 --- a/packages/plugin-tree/CHANGELOG.md +++ b/packages/plugin-tree/CHANGELOG.md @@ -1,5 +1,34 @@ # @object-ui/plugin-tree +## 17.8.0 + +### Patch Changes + +- Updated dependencies [c4c506b] +- Updated dependencies [9db9ff3] +- Updated dependencies [c096f03] +- Updated dependencies [b10c68e] +- Updated dependencies [bdc9049] +- Updated dependencies [b61c116] +- Updated dependencies [e8c0b96] +- Updated dependencies [b92329c] +- Updated dependencies [2e818d0] +- Updated dependencies [fd060f0] +- Updated dependencies [fd060f0] +- Updated dependencies [8b14aec] +- Updated dependencies [2abec3a] +- Updated dependencies [4c127cd] +- Updated dependencies [9dfaca6] +- Updated dependencies [c000398] +- Updated dependencies [b403bb3] + - @object-ui/types@17.8.0 + - @object-ui/core@17.8.0 + - @object-ui/components@17.8.0 + - @object-ui/plugin-detail@17.8.0 + - @object-ui/i18n@17.8.0 + - @object-ui/react@17.8.0 + - @object-ui/permissions@17.8.0 + ## 17.7.0 ### Minor Changes diff --git a/packages/plugin-tree/package.json b/packages/plugin-tree/package.json index a76c018f98..a170ae5e9b 100644 --- a/packages/plugin-tree/package.json +++ b/packages/plugin-tree/package.json @@ -1,6 +1,6 @@ { "name": "@object-ui/plugin-tree", - "version": "17.7.0", + "version": "17.8.0", "type": "module", "license": "MIT", "description": "Tree / tree-grid visualization plugin for Object UI", diff --git a/packages/plugin-view/CHANGELOG.md b/packages/plugin-view/CHANGELOG.md index ea2ef8b5b9..a88ffe545b 100644 --- a/packages/plugin-view/CHANGELOG.md +++ b/packages/plugin-view/CHANGELOG.md @@ -1,5 +1,38 @@ # @object-ui/plugin-view +## 17.8.0 + +### Patch Changes + +- Updated dependencies [c4c506b] +- Updated dependencies [9db9ff3] +- Updated dependencies [15f6702] +- Updated dependencies [c096f03] +- Updated dependencies [b10c68e] +- Updated dependencies [902ebab] +- Updated dependencies [bdc9049] +- Updated dependencies [e8c0b96] +- Updated dependencies [d768c31] +- Updated dependencies [b92329c] +- Updated dependencies [2e818d0] +- Updated dependencies [fd060f0] +- Updated dependencies [fd060f0] +- Updated dependencies [fd060f0] +- Updated dependencies [fd060f0] +- Updated dependencies [8b14aec] +- Updated dependencies [2abec3a] +- Updated dependencies [9dfaca6] +- Updated dependencies [c000398] +- Updated dependencies [b403bb3] + - @object-ui/types@17.8.0 + - @object-ui/core@17.8.0 + - @object-ui/components@17.8.0 + - @object-ui/plugin-form@17.8.0 + - @object-ui/i18n@17.8.0 + - @object-ui/plugin-grid@17.8.0 + - @object-ui/react@17.8.0 + - @object-ui/permissions@17.8.0 + ## 17.7.0 ### Minor Changes diff --git a/packages/plugin-view/package.json b/packages/plugin-view/package.json index 39b56bced5..d797d4ce9a 100644 --- a/packages/plugin-view/package.json +++ b/packages/plugin-view/package.json @@ -1,6 +1,6 @@ { "name": "@object-ui/plugin-view", - "version": "17.7.0", + "version": "17.8.0", "type": "module", "license": "MIT", "description": "Object View plugin for Object UI", diff --git a/packages/providers/CHANGELOG.md b/packages/providers/CHANGELOG.md index 3a5d71c641..11ad40745e 100644 --- a/packages/providers/CHANGELOG.md +++ b/packages/providers/CHANGELOG.md @@ -1,5 +1,20 @@ # @object-ui/providers — Changelog +## 17.8.0 + +### Patch Changes + +- Updated dependencies [c4c506b] +- Updated dependencies [9db9ff3] +- Updated dependencies [b10c68e] +- Updated dependencies [bdc9049] +- Updated dependencies [2e818d0] +- Updated dependencies [8b14aec] +- Updated dependencies [2abec3a] +- Updated dependencies [9dfaca6] +- Updated dependencies [b403bb3] + - @object-ui/types@17.8.0 + ## 17.7.0 ### Minor Changes diff --git a/packages/providers/package.json b/packages/providers/package.json index 685d681d26..c375b6315a 100644 --- a/packages/providers/package.json +++ b/packages/providers/package.json @@ -1,6 +1,6 @@ { "name": "@object-ui/providers", - "version": "17.7.0", + "version": "17.8.0", "type": "module", "license": "MIT", "description": "Reusable context providers for ObjectUI applications", diff --git a/packages/react-runtime/CHANGELOG.md b/packages/react-runtime/CHANGELOG.md index c092a21a84..ade1ccd89f 100644 --- a/packages/react-runtime/CHANGELOG.md +++ b/packages/react-runtime/CHANGELOG.md @@ -1,5 +1,7 @@ # @object-ui/react-runtime +## 17.8.0 + ## 17.7.0 ### Patch Changes diff --git a/packages/react-runtime/package.json b/packages/react-runtime/package.json index ab3d5410e2..46a16df515 100644 --- a/packages/react-runtime/package.json +++ b/packages/react-runtime/package.json @@ -1,6 +1,6 @@ { "name": "@object-ui/react-runtime", - "version": "17.7.0", + "version": "17.8.0", "type": "module", "sideEffects": false, "license": "MIT", diff --git a/packages/react/CHANGELOG.md b/packages/react/CHANGELOG.md index 06c7e7c67f..44d04f4ed0 100644 --- a/packages/react/CHANGELOG.md +++ b/packages/react/CHANGELOG.md @@ -1,5 +1,49 @@ # @object-ui/react +## 17.8.0 + +### Minor Changes + +- fd060f0: `ElementDataSourceGate` takes a `requiresObject` prop: when a placement opts in + and its node names its object in neither place, the gate renders a short "no + object named" hint instead of the block (objectui#11605). + + The object-bound registrations stopped declaring their object key required, + because the `dataSource` binding can supply it and the page compile has no "this + key or that binding" form. So the page compile accepts a node that names no + object at all, and the runtime's answer is the only signal left for it. Several + blocks answered such a node with an empty list, board, form, chart, dash or pivot, + which reads as an empty query. + + **Clause-②: yes (widening)** — `ElementDataSourceGateProps` gains the optional + `requiresObject` boolean. With it set, the gate reads the mapping's object key + (`objectName` unless the mapping names another) on the node after the binding + lands, so a node bound by `dataSource.object` renders as before; a node that names + no object gets the hint, "No object named: set objectName or dataSource.object." + (`data-testid` `{testId}-no-object`), and the block is not mounted. Without the + prop, or with a mapping whose `object` is `false`, nothing changes. The hint is + drawn after the view states, so a binding that is still resolving or failed to + resolve keeps its own panel. + +### Patch Changes + +- Updated dependencies [c4c506b] +- Updated dependencies [9db9ff3] +- Updated dependencies [b10c68e] +- Updated dependencies [bdc9049] +- Updated dependencies [e8c0b96] +- Updated dependencies [b92329c] +- Updated dependencies [2e818d0] +- Updated dependencies [fd060f0] +- Updated dependencies [8b14aec] +- Updated dependencies [2abec3a] +- Updated dependencies [9dfaca6] +- Updated dependencies [b403bb3] + - @object-ui/types@17.8.0 + - @object-ui/core@17.8.0 + - @object-ui/i18n@17.8.0 + - @object-ui/data-objectstack@17.8.0 + ## 17.7.0 ### Minor Changes diff --git a/packages/react/package.json b/packages/react/package.json index f8a750ce3d..96e737099c 100644 --- a/packages/react/package.json +++ b/packages/react/package.json @@ -1,6 +1,6 @@ { "name": "@object-ui/react", - "version": "17.7.0", + "version": "17.8.0", "type": "module", "license": "MIT", "description": "React bindings and SchemaRenderer component for Object UI", diff --git a/packages/runner/CHANGELOG.md b/packages/runner/CHANGELOG.md index d9bfc8b658..bc162367e2 100644 --- a/packages/runner/CHANGELOG.md +++ b/packages/runner/CHANGELOG.md @@ -1,5 +1,30 @@ # @object-ui/runner +## 17.8.0 + +### Patch Changes + +- Updated dependencies [c4c506b] +- Updated dependencies [9db9ff3] +- Updated dependencies [c096f03] +- Updated dependencies [b10c68e] +- Updated dependencies [bdc9049] +- Updated dependencies [2e818d0] +- Updated dependencies [fd060f0] +- Updated dependencies [fd060f0] +- Updated dependencies [fd060f0] +- Updated dependencies [8b14aec] +- Updated dependencies [2abec3a] +- Updated dependencies [9dfaca6] +- Updated dependencies [c000398] +- Updated dependencies [b403bb3] + - @object-ui/types@17.8.0 + - @object-ui/core@17.8.0 + - @object-ui/components@17.8.0 + - @object-ui/plugin-charts@17.8.0 + - @object-ui/plugin-kanban@17.8.0 + - @object-ui/react@17.8.0 + ## 17.7.0 ### Minor Changes diff --git a/packages/runner/package.json b/packages/runner/package.json index 499319fe81..eee0e35e34 100644 --- a/packages/runner/package.json +++ b/packages/runner/package.json @@ -1,7 +1,7 @@ { "name": "@object-ui/runner", "private": false, - "version": "17.7.0", + "version": "17.8.0", "description": "Universal Object UI Application Runner", "type": "module", "homepage": "https://www.objectui.org/docs/utilities/runner", diff --git a/packages/sdui-parser/CHANGELOG.md b/packages/sdui-parser/CHANGELOG.md index 9083e265bc..30706c2e55 100644 --- a/packages/sdui-parser/CHANGELOG.md +++ b/packages/sdui-parser/CHANGELOG.md @@ -1,5 +1,24 @@ # @object-ui/sdui-parser +## 17.8.0 + +### Minor Changes + +- c4c506b: **Clause-②: yes (narrowing)** + + One declaration of the per-type NODE SLOTS — the keys other than `children` through which a renderer hands authored nodes back to `SchemaRenderer` — and three readers that walk it instead of stopping at `children` (objectui#11170, the follow-up PR #11126's Acceptance notes filed). + + New on `@object-ui/types`, beside `BaseSchema.children`: `NODE_SLOT_DECLARATIONS` (one row per renderer, under every registry spelling that resolves to it), `nodeSlotsFor(type)`, `nodeSlotPathSegments(path)` and `nodeSlotValues(node, path)`, with the types `NodeSlotDeclaration`, `NodeSlotRow`, `NodeSlotSegment` and `NodeSlotValue`. A position is spelled as a key path — `trigger`, `items[].content`, `regions[].components`, `items[]`, `report.sections[].content` — and the value at its end is one node or a list of nodes. The `page:*` rows are `@objectstack/spec`'s `pageComponentSlotPositions()` placed on the type whose renderer reads each position, pinned against that export in both directions; every other row is objectui's own, pinned against the live renderer. `body` stays retired as the generic child-list key (objectui#6771): it appears only on the four `page:*` types whose renderer still paints it for stored documents, marked `retired`. + + Accept sets that narrow, each reader FROM → TO: + + - `@object-ui/cli` — `objectui check`'s unevaluated-expression refusal (`findUnbindableTextExpressions`). FROM: the document root and every node its `children` hold. TO: those, and every node under a slot its type declares — so a `${…}` on `title` / `label` / `value` / `description` of a node under a dialog's `content`, a tab item's `content`, a page's `regions[].components`, a carousel item, a detail view's `tabs[].content` is now refused with the slot path (`items → 0 → content → value`). The false-refusal rows of PR #11126's ablation 2 stay green: a form's `fields[]`, a grid's `columns[]` and `{ "type": "multiple" }` are not slots. Measured over this repository's own JSON corpus and docs fences: no new finding. + - `@object-ui/core` — `validateSchema`. FROM: `validateChildren` recursed through `children` only. TO: it also recurses through the declared slots, so an invalid node under one (a retired `crud` spelling under `dialog.content`, an `INVALID_SCHEMA` member) is reported with its own path, spelled as `schema.items[0].content`. Measured over the same corpus: no new finding. + - `@object-ui/sdui-parser` — `validateTree`. FROM: the walk descended `children` alone, and a manifest entry carried no slot. TO: `ManifestComponent` gains `slots?: readonly string[]`, `manifestFromConfigs` gains `opts.slotsFor` (hand it `nodeSlotsFor`) and projects each entry's non-retired positions, and `validateTree` descends them — an unknown component, an unknown or mis-typed prop or an illegal enum under a slot now draws its diagnostic. A manifest built without the option serialises byte-identically and keeps the `children`-only reach. The `RETIRED_CHILD_LIST_KEY` refusals are unchanged. + - `@object-ui/components` — the `kind:'html'` page's compile manifest (`getJsxManifest`) is built with `slotsFor`, so an html-tier page whose slot-held node fails validation now fails to compile the way one under `children` does. Narrowing: a page that compiled with an unknown tag under a `dialog`'s `content` no longer does. + + Docs: `content/docs/utilities/cli.mdx`'s "Component nodes only" rule, the gate's own docblock, `validateChildren`'s comment and the parser's header now say the walk follows `children` and the declared slots; the declaration's header is where the slot list is explained. + ## 17.7.0 ### Minor Changes diff --git a/packages/sdui-parser/package.json b/packages/sdui-parser/package.json index d27994f72b..24100b1603 100644 --- a/packages/sdui-parser/package.json +++ b/packages/sdui-parser/package.json @@ -1,6 +1,6 @@ { "name": "@object-ui/sdui-parser", - "version": "17.7.0", + "version": "17.8.0", "type": "module", "sideEffects": false, "license": "MIT", diff --git a/packages/types/CHANGELOG.md b/packages/types/CHANGELOG.md index 0210125283..41d4b34706 100644 --- a/packages/types/CHANGELOG.md +++ b/packages/types/CHANGELOG.md @@ -1,5 +1,181 @@ # @object-ui/types +## 17.8.0 + +### Minor Changes + +- c4c506b: **Clause-②: yes (narrowing)** + + One declaration of the per-type NODE SLOTS — the keys other than `children` through which a renderer hands authored nodes back to `SchemaRenderer` — and three readers that walk it instead of stopping at `children` (objectui#11170, the follow-up PR #11126's Acceptance notes filed). + + New on `@object-ui/types`, beside `BaseSchema.children`: `NODE_SLOT_DECLARATIONS` (one row per renderer, under every registry spelling that resolves to it), `nodeSlotsFor(type)`, `nodeSlotPathSegments(path)` and `nodeSlotValues(node, path)`, with the types `NodeSlotDeclaration`, `NodeSlotRow`, `NodeSlotSegment` and `NodeSlotValue`. A position is spelled as a key path — `trigger`, `items[].content`, `regions[].components`, `items[]`, `report.sections[].content` — and the value at its end is one node or a list of nodes. The `page:*` rows are `@objectstack/spec`'s `pageComponentSlotPositions()` placed on the type whose renderer reads each position, pinned against that export in both directions; every other row is objectui's own, pinned against the live renderer. `body` stays retired as the generic child-list key (objectui#6771): it appears only on the four `page:*` types whose renderer still paints it for stored documents, marked `retired`. + + Accept sets that narrow, each reader FROM → TO: + + - `@object-ui/cli` — `objectui check`'s unevaluated-expression refusal (`findUnbindableTextExpressions`). FROM: the document root and every node its `children` hold. TO: those, and every node under a slot its type declares — so a `${…}` on `title` / `label` / `value` / `description` of a node under a dialog's `content`, a tab item's `content`, a page's `regions[].components`, a carousel item, a detail view's `tabs[].content` is now refused with the slot path (`items → 0 → content → value`). The false-refusal rows of PR #11126's ablation 2 stay green: a form's `fields[]`, a grid's `columns[]` and `{ "type": "multiple" }` are not slots. Measured over this repository's own JSON corpus and docs fences: no new finding. + - `@object-ui/core` — `validateSchema`. FROM: `validateChildren` recursed through `children` only. TO: it also recurses through the declared slots, so an invalid node under one (a retired `crud` spelling under `dialog.content`, an `INVALID_SCHEMA` member) is reported with its own path, spelled as `schema.items[0].content`. Measured over the same corpus: no new finding. + - `@object-ui/sdui-parser` — `validateTree`. FROM: the walk descended `children` alone, and a manifest entry carried no slot. TO: `ManifestComponent` gains `slots?: readonly string[]`, `manifestFromConfigs` gains `opts.slotsFor` (hand it `nodeSlotsFor`) and projects each entry's non-retired positions, and `validateTree` descends them — an unknown component, an unknown or mis-typed prop or an illegal enum under a slot now draws its diagnostic. A manifest built without the option serialises byte-identically and keeps the `children`-only reach. The `RETIRED_CHILD_LIST_KEY` refusals are unchanged. + - `@object-ui/components` — the `kind:'html'` page's compile manifest (`getJsxManifest`) is built with `slotsFor`, so an html-tier page whose slot-held node fails validation now fails to compile the way one under `children` does. Narrowing: a page that compiled with an unknown tag under a `dialog`'s `content` no longer does. + + Docs: `content/docs/utilities/cli.mdx`'s "Component nodes only" rule, the gate's own docblock, `validateChildren`'s comment and the parser's header now say the walk follows `children` and the declared slots; the declaration's header is where the slot list is explained. +- 9db9ff3: A form view's `subforms[].columns` entry is judged by `@objectstack/spec`'s `InlineGridColumnSchema` now, by reference, so `objectui validate` and `os validate` give one verdict on a column (objectui#11266). + + BREAKING (`@object-ui/types`): the accept set of the tolerant face narrows. (The bump is `minor` by this repo's release model: objectui's major follows the `@objectstack` family major, and its own breaking changes ship as `minor` with the breaking semantics stated here.) + + `@objectstack/spec` 17.6.0 holds `FormViewSchema.subforms[].columns` to its closed inline grid column schema (objectstack-ai/objectstack#20927). The `object-form` mirror still read `z.array(z.any())` there, so `objectui validate` accepted columns that `os validate` refuses. + + What each face does now: + + - **zod (`@object-ui/types/zod`).** NARROWS on the tolerant face (`safeValidateSchema`, which `objectui validate` runs) and on the strict authoring face, wherever `subforms` is read: the object-view `form` slot and the `object-form` mirror. A column with an undeclared key is refused at the column, with one `unrecognized_keys` issue naming the key. A column that declares `type: 'currency'` and carries `scale` is refused at that `scale`, in the spec's own words. A bare field-name string is refused at the column with `invalid_type`. Each verdict is the spec schema's, because the column is handed to it. + - **TypeScript.** A `subforms[].columns` entry on `ObjectFormSchema` (and so on `ObjectViewSchema['form']`) is `InlineGridColumn` from `@objectstack/spec/data`, by reference, where it was `any`. A string column no longer compiles, and neither does an object literal with an undeclared column key. + + **Migration.** + + - FROM `columns: ['product', 'quantity']` → TO `columns: [{ name: 'product' }, { name: 'quantity' }]` + - FROM a column carrying a key `InlineGridColumn` does not declare → TO the same column without that key. A column that declares no `type` takes its label, type and the rest from the child object's field. + - FROM `{ name: 'amount', type: 'currency', scale: 2 }` → TO `{ name: 'amount', type: 'currency' }`. A currency amount's decimal places come from its currency's minor unit, not from the column. + + Not refused here: a `scale` on a column that declares no `type` (`{ name: 'amount', scale: 2 }`) when its child field is a currency. Seeing that takes the child object's fields, which are not in the document the validator judges. `defineStack` refuses it at publish, and the master-detail form reports it at render. + + The parse output is the spec schema's too: a column `readonlyWhen` or `requiredWhen` written as a string comes back from `safeValidateSchema` as the spec's `{ dialect: 'cel', source }` envelope. The document you pass in is not changed. + + **Clause-②: yes (narrowing)**: a `subforms[].columns` entry that is not a valid `InlineGridColumn` used to parse with its value kept, and is now refused at the column. +- b10c68e: `FlexBlockNode`, the TypeScript type of an authored `flex` node, types its bag's child list as nodes: `properties.children` is `SchemaNode | SchemaNode[]`, where it was `unknown[] | SchemaNode` (objectui#11564). + + **Clause-②: yes (narrowing)**, TypeScript authoring face only, shipped as `minor` per this repository's version policy. The list is the form a `flex` node is authored in (`{ type: 'flex', properties: { children: [ … ] } }`), and until now each entry was `unknown`, while a single child was already judged as a node. Each list entry is now judged as a node too, against its own `type`: + + - an entry whose `type` no declaration names, or an object with no `type`, no longer compiles; + - an entry that is itself a list no longer compiles; + - a misspelled key on a node type without an index signature (the spec-derived nodes, such as `element:text`, and a closed `CustomNodeRegistry` entry) no longer compiles. Node types that extend `BaseSchema` keep its index signature until objectui#8347 removes it, so a misspelled key on one of them still compiles, in the list exactly as in a single child; + - a primitive entry (a string, a number, `null`) still compiles, as in every node slot. + + The type is the flat `FlexSchema` mirror's own `children` member, by reference, which is also the member `FlexLayoutProps` declares. Every other member of `FlexBlockNode` and of its bag is still read off the `FlexBlockSchema` arm. + + What does NOT move: every zod face and every runtime path. `FlexBlockSchema` keeps `z.array(z.unknown())` for the list, because `@objectstack/spec`'s page walk already judges each entry there, once, at its real path, on the tolerant and the strict face (objectui#11223). The one entry kind where the faces now differ is a nested list, which the walk passes through unvisited and the TypeScript face refuses; `@object-ui/types`' mirror-parity ledger records the divergence. + + **Migration.** Give each list entry its declared node type (or `DeclaredNode`), declare a custom type in `CustomNodeRegistry`, and flatten a nested list into the one list. + + ⚠️ **Dated note, 2026-10-04 — `BaseSchema` loses its index signature — objectui#8347.** At this change, "Node types that extend `BaseSchema` keep its index signature until objectui#8347 removes it, so a misspelled key on one of them still compiles" held. Later in this same release objectui#8347 removed that signature, so a misspelled key on a node type that extends `BaseSchema` no longer compiles either, in the list exactly as in a single child. `.changeset/8347-baseschema-closed-face.md` states what ships. The rest of this entry is kept as the reading of this change. +- 8b14aec: **BREAKING — `PartialSchema` is RETIRED from `@object-ui/types`** (objectui#11608, enforce-or-remove). The utility type leaves the `.` entry, the one entry that published it, with no replacement alias. + + **Clause-②: yes (narrowing)**, shipped as `minor` per this repository's version policy: one name leaves the published surface, and the break is stated here. + + - **Why.** The alias had no reader: no producer, doc or skill in this repository, and none in the sibling repositories the census could read. While `BaseSchema` carried an index signature it declared `type` alone, whatever `T` was (objectui#6397). objectui#8347 removed that signature, which made the alias work as written and brought its published-export question due. A published capability with no reader is retired, not kept for its sunk cost. + - **objectui#8347's note.** That release note says `PartialSchema` works as written once `BaseSchema` lost its index signature. This removal supersedes it. + + **FROM** `import type { PartialSchema } from '@object-ui/types'`, annotating a value as `PartialSchema`. + **TO** the node type's own declared members: annotate a whole node with its node type (`ButtonSchema`, `InputSchema`, …). For a partial value, write `Partial & { type: T['type'] }` inline. It keeps every member `T` declares, with `type` required and the rest optional, and a misspelled key is still refused. + + ```ts + // before + import type { ButtonSchema, PartialSchema } from '@object-ui/types'; + const patch: PartialSchema = { type: 'button', label: 'Save' }; + + // after: the import above is a compile error naming the symbol + import type { ButtonSchema } from '@object-ui/types'; + const patch: Partial & { type: ButtonSchema['type'] } = { type: 'button', label: 'Save' }; + ``` +- 2abec3a: The `grid` field's eight field-level keys are camelCase now, and their snake_case spellings are retired and refused by name on every face (objectui#11610). + + BREAKING (`@object-ui/types`, `@object-ui/fields`): a `grid` field's metadata, and a `form` `fields[]` entry of `type: 'grid'`, must spell these keys in camelCase. (The bump is `minor` by this repo's release model: objectui's major follows the `@objectstack` family major, and its own breaking changes ship as `minor` with the breaking semantics stated here.) + + - FROM `min_rows` → TO `minRows` + - FROM `max_rows` → TO `maxRows` + - FROM `allow_add` → TO `allowAdd` + - FROM `allow_delete` → TO `allowDelete` + - FROM `allow_reorder` → TO `allowReorder` + - FROM `total_field` → TO `totalField` + - FROM `add_label` → TO `addLabel` + - FROM `sort_field` → TO `sortField` + + Why: `@objectstack/spec`'s runtime form field declares config keys in camelCase only, so it could not declare these keys as they were written (objectstack-ai/objectstack#21704, fork 2, ruled B). There is no alias window and no dual read: no reader reads the snake_case spellings any more, and no stored producer outside this repository's own fixtures, which move with this change, was found to write them. + + **Migration.** Rename each key; its value stays the same. `totalField` keeps its meaning: the CHILD column summed into the grid's footer, which is the value a spec `amountField` carries. It is not the parent field the spec's own `totalField` names on a master-detail subform. + + What each face does with a snake_case key now: + + - **TypeScript.** `GridFieldMetadata` and `FormField` declare each as a `never` member, so an authored value no longer compiles. The camelCase members carry the value types the snake_case members had, and `FormField` still takes each one by reference to `GridFieldMetadata`. + - **zod (`@object-ui/types/zod`).** NARROWS on the tolerant face (`safeValidateSchema`, which `objectui validate` runs) and on the strict authoring face: a form field entry carrying a snake_case key used to parse with the value kept, and is now refused with one `invalid_type` issue at that key. The message leads with ``Did you mean `min_rows` → `minRows`?`` (each key names its own replacement). WIDENS on both faces: the camelCase keys parse, judged by the same value types. + - **The `grid` widget (`@object-ui/fields`).** `GridField` reads the camelCase keys only. A field whose metadata still carries a snake_case key is drawn as an inline alert naming each retired key beside its replacement (`role="alert"`, `data-testid="grid-field-retired-keys"`) instead of the grid, and the same text goes to `console.error` once. Nothing is thrown, so the rest of the form still draws, and the rows are not changed. + + New export from `@object-ui/types`: `GRID_FIELD_RETIRED_KEYS`, the snake_case to camelCase map that the zod refusals and the widget both read, with its key type `GridFieldRetiredKey`. + + `@object-ui/plugin-form`'s master-detail and line-items adapters now hand the grid the camelCase keys, typed against `GridFieldMetadata` instead of cast through `any`. What they draw does not change. + + **Clause-②: yes (narrowing)**: the camelCase spellings widen each face, and the snake_case spellings narrow it. +- 9dfaca6: The default (`simple`) `object-form` draws a self-describing inline section entry, as the `tabbed`, `wizard`, `split`, `drawer` and `modal` forms already did (objectui#11615). Before, the default form resolved every section entry against its parent field pool and skipped an inline `{ name, … }` entry whose name the pool did not hold. The same section drew that entry on every other form type and drew nothing for it on `simple`, apart from a console warning when the object declared the name. + + **Clause-②: yes (widening, with one break for TypeScript readers).** Authored input is only widened: nothing either package accepted before is refused now. Code that READS `ObjectFormSection.fields` can break at compile time, described under "Breaking for TypeScript readers" below. + + - `@object-ui/types`: `ObjectFormSection.fields` is `(string | SpecFormFieldInput | FormField)[]`. The new arm is the form view's `{ field, … }` entry, and it is `@objectstack/spec`'s `FormFieldInput` by reference, not a copy. The form already drew that entry. Before, a TypeScript author could not annotate it, because `FormField` requires `name` and types `field` as an object. The zod mirror is unchanged: a section's `fields` entry is still `z.any()` there. + - `@object-ui/plugin-form`, layout types: the section `fields` of the five layout configs is `NonNullable`, by reference. Those configs are `FormSectionConfig` (tabbed), `WizardStepConfig`, `SplitFormSectionConfig`, `DrawerFormSectionConfig` and `ModalFormSectionConfig`, reached through the exported `TabbedFormSchema`, `WizardFormSchema`, `SplitFormSchema`, `DrawerFormSchema` and `ModalFormSchema`. Each of these layouts already drew the `{ field }` entry. Before, their types refused it, and `ObjectForm` passing an authored section to them would no longer compile once the section type named the entry. + - `@object-ui/plugin-form`, section drawing: on `simple`, an entry that names itself is drawn as it stands, whatever the field pool holds. Such an entry is an object whose `field` is not a string and whose `name` is a string. This is the existing `isInlineFieldDef` predicate that the submit-target rule already reads. It does not require `type`: the spec's inline arm makes `type` optional, and the other five forms draw a typeless entry as the default input. + - `@object-ui/plugin-form`, inline collector: a `simple` form with no data source and no `submitHandler`, whose sections list only inline entries, is now a self-contained collector, as on the other five forms. It opens on `initialValues` / `initialData`, and its `onSuccess` receives the collected values. Before, that form drew no fields and refused the submit. Its submit carve-out now reads the shared `hasInlineFieldSource`. + + **Breaking for TypeScript readers of `ObjectFormSection.fields`** (still `minor`: objectui's major follows the `@objectstack` family major, so its own breaks ship as `minor` and are stated here). A consumer that narrowed an entry with `typeof entry === 'string' ? entry : entry.name` compiled while every object entry was typed as an inline `FormField`. It no longer compiles: `Property 'name' does not exist on type 'FormFieldInput | FormField'`. The read was already wrong at runtime for a `{ field }` entry, where it gave `undefined`. Remedy: name an entry by its arm. The string is the name itself, the `{ field }` entry names its field by `field`, and the inline entry names it by `name`. `@object-ui/plugin-form` now exports `sectionEntryName(entry)`, which applies exactly that rule and returns `undefined` for an entry that names nothing. It sits beside `resolveSectionGroupReferences`, whose result it reads. The repo's own reader, an app-shell test over that resolver's result, is respelled this way. + + **What stays refused or warned.** + + - A field name and a `{ field }` entry still resolve against the pool on `simple`. A name the pool does not hold is still dropped, and still warned about once when the object declares it, because top-level `fields` and `sections` still intersect (objectui#9884). + - An inline entry with no `name` is malformed and is still not drawn on `simple`. + - A form with no data source and no `submitHandler` still refuses its submit with `DataSource is required for form submission (inline mode not configured)` unless every section entry is inline. One name or `{ field }` entry among inline ones is enough to refuse, on all six forms. + + **Behaviour change for an existing schema.** On `simple`, an inline entry whose name the object declares but top-level `fields` leaves out used to be dropped with the intersection warning. It is now drawn as its own definition, with no warning, as on the other five forms. With a data source, its value is still written only if the object declares the field. As on every form, a key the object does not declare is stripped from the write. +- b403bb3: **`BaseSchema` no longer declares `[key: string]: any`** (objectui#8347, executing the objectui#7927 ruling: the TypeScript face is a contract). Every node type extends `BaseSchema`, so a node literal annotated with its node type now refuses a key that no declaration names, a misspelled key included, where it used to type it `any`. The correct spelling compiles as before. + + **Clause-②: yes (narrowing)**, shipped as `minor` per this repository's version policy. The removal narrows the TypeScript authoring face of every node type; the `visibleWhen` change below widens both faces to the envelope the spec's own parse writes. + + - **What does not move.** The zod faces keep their accept sets for every key but `visibleWhen`: the tolerant mirror is still `.passthrough()`, so `safeValidateSchema` keeps an undeclared key, and the derived strict face refuses it as before. `ComponentRendererProps`, the renderer props type, keeps its own index signature. Nothing a renderer draws changes. + - **The bound.** TypeScript runs its excess-property check only on a fresh object literal. A value that reached its annotation through a variable of a wider type is not re-checked. + - **`PartialSchema` works as written.** With the signature gone, `keyof T` is the literal member union again, so the alias keeps `T`'s declared members, optional, with `type` required. While the signature stood it declared `type` alone (objectui#6397). + - **`BaseSchema.visibleWhen` is the spec's `EvaluatedExpressionInput`**, by reference: a predicate string, or the `{ dialect, source }` envelope. The zod twin takes `EvaluatedExpressionInputSchema`'s verdict without its transform, so a string parses to itself. A dialect-less envelope, an unknown dialect and a blank predicate are refused, as the spec refuses them. Both faces read `string` before, which refused the envelope a spec parse writes into this key. + - **`@object-ui/plugin-kanban`.** `ObjectKanban` reads the `sort` the element data-source gate writes through a read type private to the package. `ObjectKanbanSchema` still declares no `sort` (objectui#8174). Nothing drawn changes. + - **`@object-ui/plugin-timeline`.** `TimelineRenderSchema`, the `schema` prop type of the exported `TimelineRenderer`, gains one optional member: the `onItemClick` slot `ObjectTimeline` composes. That is a one-member optional widening of an exported prop type. `TimelineSchema`, the authoring face, still declares no `onItemClick`. Nothing drawn changes. + + **Migration.** Where a literal stops compiling, the key is misspelled (fix it) or not declared on that node type (declare it on the type that reads it, by reference to the `@objectstack/spec` row, or remove it). Do not cast past the error. `props`, the legacy alias of `properties`, is not declared on the TypeScript face; the renderer still reads it, so write `properties`. + +### Patch Changes + +- bdc9049: fix(types): `AnyComponentSchema`'s declaration prints every category union by name, so `@object-ui/types` no longer sits at the edge of TypeScript's serialization ceiling (objectui#11573) + + `tsc` prints an inferred type in full wherever a declaration uses it, and past + its serialization ceiling it refuses with TS7056 ("The inferred type of this + node exceeds the maximum length the compiler will serialize"). `@object-ui/types` + then emits no declarations, and every consumer of `@object-ui/types/zod` fails + with TS7016. `AnyComponentSchema` listed every category union inline, so its + declaration printed the sum of all of them: measured with TypeScript's own + counter, it read under one percent short of the ceiling against + `@objectstack/spec` built from objectstack `main`, and the Spec Main Shape Gate + had already gone red on it once. + + Each of the sixteen category unions `AnyComponentSchema` lists now has a named + type in its own module — an interface that extends the union's inferred type + and adds no member (`LayoutZodType`, `PublicBlockComponentZodType` and their + siblings) — and `AnyComponentSchema`'s declaration prints a reference to each + instead of its body. + + What changes for a consumer is the printed `.d.ts` TEXT of existing exports, + and nothing else: `AnyComponentSchema` and the sixteen unions are the same + values, and every type read through `z.input` / `z.output` is unchanged. The + new names are exported from their own modules, which is what lets the + declaration reference them; they are not added to the `@object-ui/types/zod` + entry, so nothing new is importable. + + `packages/types/src/__tests__/any-component-emit-headroom-11573.test.ts` reads + the declaration's size with the compiler's own counter, fails when it crosses a + tenth of the ceiling below it, and lists every member as named or inline. +- 2e818d0: The dashboard surfaces read every `widgets[]` entry without leaning on `BaseSchema`'s index signature: a widget key is read on the widget arm alone, and the `chart` node is built as a private hand-off type (objectui#11598). + + **N1, the `chart` producers.** `DashboardRenderer` and `DashboardGridLayout` build a `chart` node for a series widget bound to inline rows, and compose two render keys onto it: the dashboard palette (`colors`) and `isAnimationActive: false`, the deterministic first paint inside the grid (#2756). `ChartSchema` declares neither key, on either face, and the chart renderer reads both. Each producer now checks its literal against a hand-off type private to this package, `ChartSchema` plus those two keys, and hands the node on with no cast; the type is not exported, and the keys stay off `@object-ui/types`, because the strict authoring face refuses both on an authored `chart` node. Nothing drawn changes. + + **N2, widget keys on the slot entry.** An entry of `widgets[]` is a widget or a component node placed in the slot (a `metric-card`), and only the widget declares the widget keys (`dataset`, `options`, `chartConfig`, `filter`, `component`, `colorVariant`, `values`, `dimensions`, …). Every read of one now narrows the entry to the widget first, on `DashboardRenderer`, `DashboardGridLayout`, `DashboardWithConfig` and `DashboardEditor`. What changes is confined to a `metric-card` entry that carries a widget key, which `@object-ui/types/zod`'s strict face refuses and only the tolerant face accepts: + + - a `metric-card` carrying `dataset` draws its card; it used to draw the dataset tile in the card's place, on both dashboard surfaces; + - a `metric-card` carrying `options` draws its own keys; `options` used to be spread over them, so `options.value` replaced `value`; + - a `metric-card` carrying a `component` draws its card; the envelope's node used to be drawn instead. + + A document the strict face accepts draws exactly as before. `@object-ui/types`' docblocks on `DASHBOARD_COMPONENT_WIDGET_TYPES` and the Zod widget vocabulary, which described the dataset tile in the card's place and the `options` spread as live, were corrected to match; no type in it changes. In `DashboardEditor`, a `metric-card` entry is no longer offered the Color Variant select: the card declares no `colorVariant`, `MetricCard` draws nothing from it, and a pick stored a key publish refuses. A widget is offered it as before. + ## 17.7.0 ### Minor Changes diff --git a/packages/types/package.json b/packages/types/package.json index ea9735bd5d..123425efcd 100644 --- a/packages/types/package.json +++ b/packages/types/package.json @@ -1,6 +1,6 @@ { "name": "@object-ui/types", - "version": "17.7.0", + "version": "17.8.0", "description": "Pure TypeScript type definitions for Object UI - The Protocol Layer", "type": "module", "sideEffects": false, diff --git a/packages/vscode-extension/CHANGELOG.md b/packages/vscode-extension/CHANGELOG.md index be62e66671..78b63ceece 100644 --- a/packages/vscode-extension/CHANGELOG.md +++ b/packages/vscode-extension/CHANGELOG.md @@ -1,5 +1,21 @@ # Changelog +## 17.8.0 + +### Patch Changes + +- Updated dependencies [c4c506b] +- Updated dependencies [9db9ff3] +- Updated dependencies [b10c68e] +- Updated dependencies [bdc9049] +- Updated dependencies [2e818d0] +- Updated dependencies [8b14aec] +- Updated dependencies [2abec3a] +- Updated dependencies [9dfaca6] +- Updated dependencies [b403bb3] + - @object-ui/types@17.8.0 + - @object-ui/core@17.8.0 + ## 17.7.0 ### Minor Changes diff --git a/packages/vscode-extension/package.json b/packages/vscode-extension/package.json index 4ac68e7a43..dbcd9dfada 100644 --- a/packages/vscode-extension/package.json +++ b/packages/vscode-extension/package.json @@ -2,7 +2,7 @@ "name": "object-ui", "displayName": "Object UI", "description": "VSCode extension for Object UI - Schema-driven UI development with IntelliSense, validation, and live preview", - "version": "17.7.0", + "version": "17.8.0", "publisher": "objectui", "private": true, "icon": "icon.svg",