Releases: objectstack-ai/objectui
Release list
@object-ui/types@16.1.0
Minor Changes
-
94d4876: feat(dashboard): Studio authors the ADR-0021 dataset shape only (framework#3251)
Finishes the dashboard analytics migration on the authoring side so the
framework can enableDashboardWidgetSchema.strict(). Both Studio surfaces now
emit only the semantic-layer shape (dataset+dimensions+values); no
surface authors the removed pre-ADR-0021 inline query.FROM → TO (authoring)
- charts:
object+categoryField+valueField+aggregate
→dataset+dimensions+values - pivots:
object+rowField+columnField+valueField+aggregation
→dataset+dimensions+values(last dimension spreads across columns)
Changes
@object-ui/types—DashboardWidgetSchemagainsdataset/dimensions/
values; the inline analytics keys (object,categoryField,
categoryGranularity,valueField,aggregate,measures) are marked
@deprecated(retained only so the renderer can still read legacy/static
metadata during the transition).@object-ui/plugin-dashboard—WidgetConfigPanelis rewritten as a dataset
picker (chart AND pivot). Breaking prop change: the unused
availableObjects/availableFieldsprops are replaced by a new
datasets?: WidgetDatasetCatalogEntry[](+datasetsLoading?) catalog prop,
also forwarded byDashboardWithConfig. Hosts resolve the catalog (e.g. via
the metadata client'slist('dataset')); without it the panel falls back to
free-text authoring. New exports:WidgetDatasetCatalogEntryand
sanitizeDraftForType.@object-ui/app-shell— the metadata-adminDashboardWidgetInspectordrops
the legacy inline fields (object / value field / category field / aggregate);
the dataset section is now the primary (and only) analytics binding, and the
filter-binding field picker sources options from the bound dataset's
dimensions. The "Add widget" catalog dropslist/custom— neither is a
member of@objectstack/specChartTypeSchema, so a widget authored with
them could never publish.
Not changed:
DashboardRendererkeeps its legacy/static read branches and
theObjectPivotTable/PivotTableblocks (still public SDUI blocks and the
backward-compat path for stored/static widgets) — only the dashboard authoring
flow stops emitting the legacy keys. Retiring those renderer branches is a
follow-up gated on migrating stored dashboards. - charts:
-
31b77d4: Add the explicit
engine-ownedlifecycle bucket (tracks framework ADR-0103 addendum / #3343). The framework split the overloadedmanagedBy: 'system'bucket by promoting the engine-owned case to its own enum value; this mirrors it in the UI type + runtime + badge.@object-ui/types—ManagedByBucketunion andMANAGED_BY_BUCKETSgain'engine-owned'(canonical order:platform, config, system, engine-owned, append-only, better-auth). The union stays closed, so every consumer that missed the new value is a compile error.@object-ui/core—resolveCrudAffordancesgains theengine-owneddefault row (identical all-locked matrix assystem/append-only), soisObjectInlineEditable/ the grid + form gates treat it as read-only automatically.@object-ui/app-shell— theManagedByBadgerendersengine-ownedwith the same read-only "System-managed" copy as a lockedsystemobject (reuses the existingmanagedByBadge.systemi18n key — zero translation churn; the distinction is at the schema level, not the user-facing string), andresolveManagedByEmptyStatereuses thesystemengine-owned empty state.
Behaviour-preserving:
engine-ownedresolves to the same locked affordancessystemdid by default, so nothing about how a locked object renders changes — the value just makes the schema self-documenting. New unit coverage for the bucket inresolveCrudAffordances/isObjectInlineEditable/MANAGED_BY_BUCKETS/ the empty-state helper. -
62b9ab5: feat(data): unify master-detail saves behind
DataSource.batchTransaction, isolate the non-atomic fallback in the adapter (#2679)Master-detail saves (
MasterDetailForm,LineItemsPanel) now always persist
throughdataSource.batchTransaction(operations)— one ordered cross-object
operation list, with{ $ref: <op index> }linking a child to a parent created
in the same batch. The form no longer contains any client-side orchestration or
best-effort compensation-delete; that atomicity anti-pattern is gone from the UI
layer (framework #1604 / framework ADR-0034 item 4).@object-ui/types—batchTransaction?is now a first-class (optional)
method on theDataSourcecontract, typed viaBatchTransactionOperation/
BatchRef. Replaces the previous(dataSource as any).batchTransaction
method-sniffing.@object-ui/core— newemulateBatchTransaction(dataSource, operations)
(sequential writes,$refresolution, best-effort reverse-order compensation)
andrunBatchTransaction(dataSource, operations)(prefers the adapter's method,
emulates otherwise).ApiDataSource/ValueDataSourceimplement
batchTransactionvia the emulation.@object-ui/data-objectstack—ObjectStackAdapter.batchTransactionuses
the server's atomicPOST /api/v1/batch, prefers the typed
client.data.batchTransactionSDK method when the installed client exposes it,
and degrades to the client-side emulation ONLY when the endpoint is missing
(404/405) or the runtime can't do transactions (501). Real errors (400/401/403/
409/500) still surface. This is the isolated, tested home of the non-atomic
fallback.@object-ui/plugin-form— removedapplyDetail/createMany/
ApplyDetailResultfrommasterDetailTx.ts;MasterDetailFormand
LineItemsPanelbuild ops and callrunBatchTransaction.LineItemsPanel
saves are now atomic on a capable backend, with the rollup folded into the same
batch.
No behavior change on a current ObjectStack backend (it has
/api/v1/batch);
older/limited backends keep a working — now clearly non-atomic — save path. -
199fa83: feat(dashboard): retire the pre-ADR-0021 inline-analytics renderer branches (framework#3320)
Follow-up to the dashboard analytics migration (framework#3251 / objectui#2703).
Authoring already emits only the semantic-layer shape (dataset+dimensions+
values); this removes the renderer's now-unauthored legacy read-branches.- types: drop the
@deprecatedinline-analytics keys (object,
categoryField,categoryGranularity,valueField,aggregate,measures)
fromDashboardWidgetSchema. They were retained in #2703 only so the renderer
could read legacy/static metadata during the transition. - plugin-dashboard:
DashboardRendererno longer emits the object-bound
metric / chart / pivot / table / list branches from the top-levelobject+
analytics keys. It keeps the renderer-internal static paths (options.data/
widget.dataarray and theprovider: 'object'async config) and
widget.component. The dashboard renderer no longer emitsobject-pivot/
pivotat all — dataset pivots render throughDatasetWidget(grouped table /
cross-tab); theObjectPivotTable/PivotTablecomponents stay as public
SDUI blocks for other surfaces.DashboardGridLayoutgets the same treatment. - graceful fallback: a widget that still carries the retired inline shape in
stored metadata (top-levelobject, nodataset, no inlineoptions.data)
now renders a visible error placeholder prompting a rebind to a dataset, rather
than a blank chart/grid. - plugin-designer:
DashboardEditordrops its inline object / value-field /
aggregate fields (analytics binding is authored via the dataset picker in
app-shell'sDashboardWidgetInspector/ plugin-dashboard'sWidgetConfigPanel).
- types: drop the
Patch Changes
-
7cf4051: chore(deps): align every
@objectstack/*dependency to^16.0.0-rc.0Bumps
@objectstack/spec/client/formula/lintfrom^15.1.1to the
16.0.0-rc.0pre-release across the workspace (root +apps/console+
apps/site+ all consuming packages). ObjectUI's own packages are already on
major 16, so this closes the 15↔16 skew between ObjectUI and the@objectstack
contract libraries (which publish in lockstep withspec).This is a dependency alignment, not a behavioral migration: the full workspace
build (43/43) and the@objectstack-consuming package test suites
(core/app-shell/data-objectstack/plugin-form/types) are green
against16.0.0-rc.0with no source changes required.Practical effect:
@objectstack/client@16.0.0-rc.0now ships
data.batchTransaction(framework #3271), soObjectStackAdapter's feature
detect (typeof client.data.batchTransaction === 'function') routes
master-detail cross-object saves through the typed SDK method instead of the
rawfetch('/api/v1/batch')fallback — realizing the "verify SDK path" half of
#2694. The raw-fetch branch stays as a defensive fallback (removal tracked in
#2694). -
2b17339: fix(list): keep the injected
owner_idout of the leading auto-derived columnsA view-less object's default list columns are derived from the object's field
order. The framework'sapplySystemFieldsspreads its injected
system/audit/ownership fields to the FRONT of that order and stamps them
system: true;owner_idis deliberately non-hidden and non-readonly
(ownership is reassignable), so the old name-based exclusion lists in
ObjectGridandInterfaceListPage— which never listedowner_id— let it
through as column #1 on many showcase list pages (e.g.showcase_field_zoo).Default-column derivation now classifies system fields via the shared
isSystemManagedFieldhel...
@object-ui/sdui-parser@16.1.0
@object-ui/sdui-parser@16.1.0
@object-ui/runner@16.1.0
Minor Changes
-
62b9ab5: feat(data): unify master-detail saves behind
DataSource.batchTransaction, isolate the non-atomic fallback in the adapter (#2679)Master-detail saves (
MasterDetailForm,LineItemsPanel) now always persist
throughdataSource.batchTransaction(operations)— one ordered cross-object
operation list, with{ $ref: <op index> }linking a child to a parent created
in the same batch. The form no longer contains any client-side orchestration or
best-effort compensation-delete; that atomicity anti-pattern is gone from the UI
layer (framework #1604 / framework ADR-0034 item 4).@object-ui/types—batchTransaction?is now a first-class (optional)
method on theDataSourcecontract, typed viaBatchTransactionOperation/
BatchRef. Replaces the previous(dataSource as any).batchTransaction
method-sniffing.@object-ui/core— newemulateBatchTransaction(dataSource, operations)
(sequential writes,$refresolution, best-effort reverse-order compensation)
andrunBatchTransaction(dataSource, operations)(prefers the adapter's method,
emulates otherwise).ApiDataSource/ValueDataSourceimplement
batchTransactionvia the emulation.@object-ui/data-objectstack—ObjectStackAdapter.batchTransactionuses
the server's atomicPOST /api/v1/batch, prefers the typed
client.data.batchTransactionSDK method when the installed client exposes it,
and degrades to the client-side emulation ONLY when the endpoint is missing
(404/405) or the runtime can't do transactions (501). Real errors (400/401/403/
409/500) still surface. This is the isolated, tested home of the non-atomic
fallback.@object-ui/plugin-form— removedapplyDetail/createMany/
ApplyDetailResultfrommasterDetailTx.ts;MasterDetailFormand
LineItemsPanelbuild ops and callrunBatchTransaction.LineItemsPanel
saves are now atomic on a capable backend, with the rollup folded into the same
batch.
No behavior change on a current ObjectStack backend (it has
/api/v1/batch);
older/limited backends keep a working — now clearly non-atomic — save path.
Patch Changes
- Updated dependencies [1c8935a]
- Updated dependencies [8b8b744]
- Updated dependencies [7cf4051]
- Updated dependencies [803558e]
- Updated dependencies [2e7d7f0]
- Updated dependencies [ef14f69]
- Updated dependencies [94d4876]
- Updated dependencies [69fa5d1]
- Updated dependencies [549c67d]
- Updated dependencies [ebe6494]
- Updated dependencies [2b17339]
- Updated dependencies [31b77d4]
- Updated dependencies [6d4fbe6]
- Updated dependencies [0a3710b]
- Updated dependencies [62b9ab5]
- Updated dependencies [1629313]
- Updated dependencies [29c6040]
- Updated dependencies [faebac3]
- Updated dependencies [2331ac9]
- Updated dependencies [199fa83]
- Updated dependencies [eee4ded]
- @object-ui/core@16.1.0
- @object-ui/types@16.1.0
- @object-ui/react@16.1.0
- @object-ui/components@16.1.0
- @object-ui/plugin-kanban@16.1.0
- @object-ui/plugin-charts@16.1.0
@object-ui/react@16.1.0
Minor Changes
-
803558e: feat(data): thread the host's authenticated fetch into
provider: 'api'data sources (#2725)provider: 'api'view data sources went through a bareglobalThis.fetch, so
custom endpoints (gantt composite trees, report aggregates) carried only
same-origin cookies while every native/api/v1/*request carried
Authorization: Bearer— the moment cookie HMAC verification failed (dev
restart rotating the fallback auth secret, cookie expiry/rotation in prod)
those views 401'd while the rest of the app kept working.@object-ui/react—SchemaRendererProvideraccepts an optional
apiFetch; nested providers inherit it from their parent so re-wrapped
subtrees (react pages, preview surfaces) keep the host's authentication.
useViewDatadefaults the api-provider adapter's fetch to the context
apiFetch(explicitadapterOptions.fetchstill wins).@object-ui/auth—createAuthenticatedFetchgains a
sameOriginOnlyoption: cross-origin URLs pass through to the bare fetch
with noAuthorization/X-Tenant-ID/Accept-Language, so metadata-
supplied third-party URLs never see the platform token.@object-ui/app-shell— the console wires
createAuthenticatedFetch({ sameOriginOnly: true })(settle-signal wrapped)
asapiFetchon the rootSchemaRendererProvider.@object-ui/plugin-gantt—ObjectGanttresolves its api-provider
DataSource with the contextapiFetch, covering reads and write-backs.
Behaviour is unchanged for hosts that don't provide
apiFetch(bare fetch +
cookies, as before). -
2e7d7f0: feat(evaluator): route
{ dialect: 'cel' }component/action predicates to the canonical CEL engine (#2661)Component and action
visible/disabled/hiddenpredicates were evaluated
by the home-grown JSExpressionEvaluator, while field rules
(visibleWhen/readonlyWhen/requiredWhen, viafieldRules.ts) and row/list
conditionals (viaevalRowPredicate) already delegate to the canonical
@objectstack/formulaengine. That split meant a{ dialect: 'cel' }predicate
in a renderer/action surface was executed as JavaScript — CEL-only forms
(x in list,has(), typed==, thetoday()/daysFromNow()catalog) behaved
differently from, or faulted against, the server's enforcement.This converges the remaining tier onto the same engine:
@object-ui/core—ExpressionEvaluator.evaluateConditionnow detects a
{ dialect: 'cel', source }envelope and evaluates it on@objectstack/formula
(viaevalFieldPredicate), binding therecordnamespace plus the whole
context bag as top-level scope (record.*,features.*,user.*,app.*).
Fail-soft to visible/enabled to match the legacy default;throwOnError
callers still fail closed on a faulting predicate (a genuinefalsenever
throws). This fixes everySchemaRenderervisibility/disabled read at once.@object-ui/react—toPredicateInputpreserves a CEL envelope instead of
collapsing it to a${source}string, anduseConditionaccepts and forwards
the envelope (keyed on a stable(dialect, source)so it doesn't re-evaluate
each render). Action buttons (action-icon/group/bar/button) therefore
evaluate CELvisible/enabled/disabledon the canonical engine.
Back-compat: bare strings and
${…}templates stay on the legacy JS path
(deprecation window); only an explicit{ dialect: 'cel' }envelope is rerouted.
{ dialect: 'template' }is unaffected.Together with the
^15.1.1alignment (#2662), a renderer CEL predicate now
reaches the identical verdict as the server — including the framework's
dateField == today()equality fix (objectstack-ai/framework#3205) once it
lands in a published 15.x. The broader home-grown-vs-canonical divergence
motivation is #2661.
Patch Changes
-
7cf4051: chore(deps): align every
@objectstack/*dependency to^16.0.0-rc.0Bumps
@objectstack/spec/client/formula/lintfrom^15.1.1to the
16.0.0-rc.0pre-release across the workspace (root +apps/console+
apps/site+ all consuming packages). ObjectUI's own packages are already on
major 16, so this closes the 15↔16 skew between ObjectUI and the@objectstack
contract libraries (which publish in lockstep withspec).This is a dependency alignment, not a behavioral migration: the full workspace
build (43/43) and the@objectstack-consuming package test suites
(core/app-shell/data-objectstack/plugin-form/types) are green
against16.0.0-rc.0with no source changes required.Practical effect:
@objectstack/client@16.0.0-rc.0now ships
data.batchTransaction(framework #3271), soObjectStackAdapter's feature
detect (typeof client.data.batchTransaction === 'function') routes
master-detail cross-object saves through the typed SDK method instead of the
rawfetch('/api/v1/batch')fallback — realizing the "verify SDK path" half of
#2694. The raw-fetch branch stays as a defensive fallback (removal tracked in
#2694). -
549c67d: chore(lint): clear the mechanical baseline lint errors so these packages' lint gates protect them again
Extends the fields/core cleanup from #2709 (objectui#2713). These eight package
lints were red at baseline onmain, so their per-packagelintgate could not
catch new violations of the same class. Cleared every error (no behavior
change; warnings are out of scope):no-useless-catch(data-objectstack) — unwrapped five try/catch blocks
whosecatchonly re-threw; errors still propagate identically.preserve-caught-error(cli,data-objectstack,react) — the caught
error's message is inlined into the thrownError; a scoped disable with a
justifying comment carries each one, because these packages target ES2020
whose lib types the 1-argErrorconstructor only (so{ cause }won't
compile) — same reasoning as the core case in #2709.prefer-const(plugin-calendar,plugin-map) —let→constfor
never-reassigned bindings.no-empty-object-type(plugin-designer) — empty extend-only interfaces
→ equivalenttypealiases.no-useless-assignment(react) — dropped a dead initializer that both
branches overwrite before it is read.no-require-imports(plugin-calendar,plugin-timelinetests) —
hoistedvi.mockfactories now use anasyncfactory with
await import('react')instead ofrequire('react').- stale
eslint-disabledirective (plugin-markdown) — removed a
react/no-dangerdisable whose plugin is not loaded in the flat config (an
unknown-rule reference that ESLint v10 reports as an error); the rationale is
kept as a plain comment.
-
Updated dependencies [0318118]
-
Updated dependencies [1c8935a]
-
Updated dependencies [af1b0db]
-
Updated dependencies [8b8b744]
-
Updated dependencies [7cf4051]
-
Updated dependencies [8c1e415]
-
Updated dependencies [0ea5036]
-
Updated dependencies [2e7d7f0]
-
Updated dependencies [94d4876]
-
Updated dependencies [1100a8b]
-
Updated dependencies [7abe4cd]
-
Updated dependencies [549c67d]
-
Updated dependencies [ebe6494]
-
Updated dependencies [2b17339]
-
Updated dependencies [31b77d4]
-
Updated dependencies [6d4fbe6]
-
Updated dependencies [0a3710b]
-
Updated dependencies [f80aaf2]
-
Updated dependencies [62b9ab5]
-
Updated dependencies [1629313]
-
Updated dependencies [29c6040]
-
Updated dependencies [faebac3]
-
Updated dependencies [2331ac9]
-
Updated dependencies [199fa83]
-
Updated dependencies [eee4ded]
- @object-ui/i18n@16.1.0
- @object-ui/core@16.1.0
- @object-ui/data-objectstack@16.1.0
- @object-ui/types@16.1.0
@object-ui/react-runtime@16.1.0
@object-ui/react-runtime@16.1.0
@object-ui/providers@16.1.0
Patch Changes
- Updated dependencies [7cf4051]
- Updated dependencies [94d4876]
- Updated dependencies [2b17339]
- Updated dependencies [31b77d4]
- Updated dependencies [6d4fbe6]
- Updated dependencies [62b9ab5]
- Updated dependencies [29c6040]
- Updated dependencies [faebac3]
- Updated dependencies [199fa83]
- @object-ui/types@16.1.0
@object-ui/plugin-view@16.1.0
Patch Changes
-
7cf4051: chore(deps): align every
@objectstack/*dependency to^16.0.0-rc.0Bumps
@objectstack/spec/client/formula/lintfrom^15.1.1to the
16.0.0-rc.0pre-release across the workspace (root +apps/console+
apps/site+ all consuming packages). ObjectUI's own packages are already on
major 16, so this closes the 15↔16 skew between ObjectUI and the@objectstack
contract libraries (which publish in lockstep withspec).This is a dependency alignment, not a behavioral migration: the full workspace
build (43/43) and the@objectstack-consuming package test suites
(core/app-shell/data-objectstack/plugin-form/types) are green
against16.0.0-rc.0with no source changes required.Practical effect:
@objectstack/client@16.0.0-rc.0now ships
data.batchTransaction(framework #3271), soObjectStackAdapter's feature
detect (typeof client.data.batchTransaction === 'function') routes
master-detail cross-object saves through the typed SDK method instead of the
rawfetch('/api/v1/batch')fallback — realizing the "verify SDK path" half of
#2694. The raw-fetch branch stays as a defensive fallback (removal tracked in
#2694). -
ebe6494: chore(lint): clear the baseline lint errors in nine more packages (objectui#2713 Wave 2)
Second wave of the #2713 lint-gate restoration (after #2730). These nine package
lints were red at baseline onmain, so their per-packagelintgate could not
catch new violations. Cleared every error (no behavior change; warnings out
of scope):react-hooks/rules-of-hooks(i18n,plugin-grid,plugin-view,
plugin-list) — translation helpers (useSafeFieldLabel,
useRowActionTranslation,useViewLabel,useViewTabLabel,useMoreLabel)
wrapped a provider-safe hook (useObjectTranslation/useObjectLabel, which
never throw) in try/catch; removed the wrapper (the same fix #2709 applied in
fields).plugin-kanbanObjectKanbanmoved itsif (error)early return
below theuseCallbackso hooks run unconditionally.collaboration
__unsafe_usePresenceContextkeeps its deliberate danger-prefix name via a
justified scoped disable.react-hooks/static-components(layout,plugin-list,plugin-report)
— dynamic-icon / registry lookups (resolveIcon,useRegistryComponent) are
stable component references, not components created during render → scoped
disable with justification.plugin-chartsTreemapCellwas a genuine
inline component and is hoisted to module scope (it is purely props-driven).no-irregular-whitespace(plugin-gridImportWizard) — the literal
U+FEFF BOM prepended to exported CSV/text blobs (so Excel detects UTF-8) is
now written as theescape: byte-identical at runtime, no literal
irregular-whitespace character in source.no-useless-assignment(plugin-gridBulkActionDialog) — dropped a
dead= nullinitializer that the exhaustiveswitch(incl.default)
overwrites before it is read.no-unsafe-function-type(plugin-viewViewTabBar) — the dnd-kit
render-proplistenersmap is typedRecord<string, (...args: any[]) => void>
instead of bareFunction.no-require-imports(plugin-kanban,plugin-viewtests) — hoisted
vi.mockfactories use anasyncfactory withawait import('react').
-
Updated dependencies [0318118]
-
Updated dependencies [1c8935a]
-
Updated dependencies [af1b0db]
-
Updated dependencies [8b8b744]
-
Updated dependencies [7cf4051]
-
Updated dependencies [803558e]
-
Updated dependencies [2e7d7f0]
-
Updated dependencies [ef14f69]
-
Updated dependencies [94d4876]
-
Updated dependencies [1100a8b]
-
Updated dependencies [7abe4cd]
-
Updated dependencies [69fa5d1]
-
Updated dependencies [549c67d]
-
Updated dependencies [ebe6494]
-
Updated dependencies [2b17339]
-
Updated dependencies [31b77d4]
-
Updated dependencies [6d4fbe6]
-
Updated dependencies [0a3710b]
-
Updated dependencies [f80aaf2]
-
Updated dependencies [62b9ab5]
-
Updated dependencies [1629313]
-
Updated dependencies [29c6040]
-
Updated dependencies [faebac3]
-
Updated dependencies [2331ac9]
-
Updated dependencies [199fa83]
-
Updated dependencies [eee4ded]
-
Updated dependencies [3b2e4d9]
- @object-ui/i18n@16.1.0
- @object-ui/core@16.1.0
- @object-ui/types@16.1.0
- @object-ui/react@16.1.0
- @object-ui/plugin-form@16.1.0
- @object-ui/components@16.1.0
- @object-ui/plugin-grid@16.1.0
@object-ui/plugin-tree@16.1.0
Patch Changes
-
7cf4051: chore(deps): align every
@objectstack/*dependency to^16.0.0-rc.0Bumps
@objectstack/spec/client/formula/lintfrom^15.1.1to the
16.0.0-rc.0pre-release across the workspace (root +apps/console+
apps/site+ all consuming packages). ObjectUI's own packages are already on
major 16, so this closes the 15↔16 skew between ObjectUI and the@objectstack
contract libraries (which publish in lockstep withspec).This is a dependency alignment, not a behavioral migration: the full workspace
build (43/43) and the@objectstack-consuming package test suites
(core/app-shell/data-objectstack/plugin-form/types) are green
against16.0.0-rc.0with no source changes required.Practical effect:
@objectstack/client@16.0.0-rc.0now ships
data.batchTransaction(framework #3271), soObjectStackAdapter's feature
detect (typeof client.data.batchTransaction === 'function') routes
master-detail cross-object saves through the typed SDK method instead of the
rawfetch('/api/v1/batch')fallback — realizing the "verify SDK path" half of
#2694. The raw-fetch branch stays as a defensive fallback (removal tracked in
#2694). -
Updated dependencies [1c8935a]
-
Updated dependencies [8b8b744]
-
Updated dependencies [7cf4051]
-
Updated dependencies [803558e]
-
Updated dependencies [2e7d7f0]
-
Updated dependencies [ef14f69]
-
Updated dependencies [94d4876]
-
Updated dependencies [69fa5d1]
-
Updated dependencies [549c67d]
-
Updated dependencies [2b17339]
-
Updated dependencies [31b77d4]
-
Updated dependencies [6d4fbe6]
-
Updated dependencies [0a3710b]
-
Updated dependencies [62b9ab5]
-
Updated dependencies [1629313]
-
Updated dependencies [29c6040]
-
Updated dependencies [faebac3]
-
Updated dependencies [2331ac9]
-
Updated dependencies [199fa83]
-
Updated dependencies [eee4ded]
- @object-ui/core@16.1.0
- @object-ui/types@16.1.0
- @object-ui/react@16.1.0
- @object-ui/components@16.1.0
@object-ui/plugin-timeline@16.1.0
Patch Changes
-
7cf4051: chore(deps): align every
@objectstack/*dependency to^16.0.0-rc.0Bumps
@objectstack/spec/client/formula/lintfrom^15.1.1to the
16.0.0-rc.0pre-release across the workspace (root +apps/console+
apps/site+ all consuming packages). ObjectUI's own packages are already on
major 16, so this closes the 15↔16 skew between ObjectUI and the@objectstack
contract libraries (which publish in lockstep withspec).This is a dependency alignment, not a behavioral migration: the full workspace
build (43/43) and the@objectstack-consuming package test suites
(core/app-shell/data-objectstack/plugin-form/types) are green
against16.0.0-rc.0with no source changes required.Practical effect:
@objectstack/client@16.0.0-rc.0now ships
data.batchTransaction(framework #3271), soObjectStackAdapter's feature
detect (typeof client.data.batchTransaction === 'function') routes
master-detail cross-object saves through the typed SDK method instead of the
rawfetch('/api/v1/batch')fallback — realizing the "verify SDK path" half of
#2694. The raw-fetch branch stays as a defensive fallback (removal tracked in
#2694). -
549c67d: chore(lint): clear the mechanical baseline lint errors so these packages' lint gates protect them again
Extends the fields/core cleanup from #2709 (objectui#2713). These eight package
lints were red at baseline onmain, so their per-packagelintgate could not
catch new violations of the same class. Cleared every error (no behavior
change; warnings are out of scope):no-useless-catch(data-objectstack) — unwrapped five try/catch blocks
whosecatchonly re-threw; errors still propagate identically.preserve-caught-error(cli,data-objectstack,react) — the caught
error's message is inlined into the thrownError; a scoped disable with a
justifying comment carries each one, because these packages target ES2020
whose lib types the 1-argErrorconstructor only (so{ cause }won't
compile) — same reasoning as the core case in #2709.prefer-const(plugin-calendar,plugin-map) —let→constfor
never-reassigned bindings.no-empty-object-type(plugin-designer) — empty extend-only interfaces
→ equivalenttypealiases.no-useless-assignment(react) — dropped a dead initializer that both
branches overwrite before it is read.no-require-imports(plugin-calendar,plugin-timelinetests) —
hoistedvi.mockfactories now use anasyncfactory with
await import('react')instead ofrequire('react').- stale
eslint-disabledirective (plugin-markdown) — removed a
react/no-dangerdisable whose plugin is not loaded in the flat config (an
unknown-rule reference that ESLint v10 reports as an error); the rationale is
kept as a plain comment.
-
Updated dependencies [1c8935a]
-
Updated dependencies [8b8b744]
-
Updated dependencies [7cf4051]
-
Updated dependencies [803558e]
-
Updated dependencies [2e7d7f0]
-
Updated dependencies [ef14f69]
-
Updated dependencies [94d4876]
-
Updated dependencies [69fa5d1]
-
Updated dependencies [549c67d]
-
Updated dependencies [2b17339]
-
Updated dependencies [31b77d4]
-
Updated dependencies [6d4fbe6]
-
Updated dependencies [0a3710b]
-
Updated dependencies [62b9ab5]
-
Updated dependencies [1629313]
-
Updated dependencies [29c6040]
-
Updated dependencies [faebac3]
-
Updated dependencies [2331ac9]
-
Updated dependencies [199fa83]
-
Updated dependencies [eee4ded]
- @object-ui/core@16.1.0
- @object-ui/types@16.1.0
- @object-ui/react@16.1.0
- @object-ui/components@16.1.0
- @object-ui/mobile@16.1.0
@object-ui/plugin-report@16.1.0
Minor Changes
-
2331ac9: feat(report): drill a date-bucket cell into its time range, not a superset (#1752)
Clicking a report/dashboard cell grouped by a
dateGranularitydate dimension
("2026-Q2") used to drill into a superset — the date dimension was skipped,
so the record list spanned every time bucket. It now scopes to the clicked
bucket's half-open range, consuming the framework's newdrillRangessidecar.@object-ui/core—buildDatasetDrillFilteraccepts the per-row
drillRangesand emits an ObjectQL range operator object
({ [field]: { $gte, $lt } }) alongside the equality dims.@object-ui/plugin-report/@object-ui/plugin-dashboard— the report
renderer and dashboard widget forwarddrillRanges, and a date-only
report (no equality drill dim) is now drillable via the range alone.@object-ui/app-shell— the "Open in list →" escape hatch
(useOpenRecordList) now targets the ADR-0055 bare data surface
(/:object/data, "the URL is the view" — no baked-in view filter to
over-narrow the drill) and serializes a range to the
filter[field][gte|lt]operator contract.ObjectDataPageparses those
operators (equality shorthand unchanged), renders a range as a single chip,
and removes both bounds together. A newdrillUrlFiltersmodule owns the
write/read serialization so both sides can't drift (round-trip tested).
Companion to the framework analytics change (objectstack-ai/framework#3256).
Patch Changes
-
ebe6494: chore(lint): clear the baseline lint errors in nine more packages (objectui#2713 Wave 2)
Second wave of the #2713 lint-gate restoration (after #2730). These nine package
lints were red at baseline onmain, so their per-packagelintgate could not
catch new violations. Cleared every error (no behavior change; warnings out
of scope):react-hooks/rules-of-hooks(i18n,plugin-grid,plugin-view,
plugin-list) — translation helpers (useSafeFieldLabel,
useRowActionTranslation,useViewLabel,useViewTabLabel,useMoreLabel)
wrapped a provider-safe hook (useObjectTranslation/useObjectLabel, which
never throw) in try/catch; removed the wrapper (the same fix #2709 applied in
fields).plugin-kanbanObjectKanbanmoved itsif (error)early return
below theuseCallbackso hooks run unconditionally.collaboration
__unsafe_usePresenceContextkeeps its deliberate danger-prefix name via a
justified scoped disable.react-hooks/static-components(layout,plugin-list,plugin-report)
— dynamic-icon / registry lookups (resolveIcon,useRegistryComponent) are
stable component references, not components created during render → scoped
disable with justification.plugin-chartsTreemapCellwas a genuine
inline component and is hoisted to module scope (it is purely props-driven).no-irregular-whitespace(plugin-gridImportWizard) — the literal
U+FEFF BOM prepended to exported CSV/text blobs (so Excel detects UTF-8) is
now written as theescape: byte-identical at runtime, no literal
irregular-whitespace character in source.no-useless-assignment(plugin-gridBulkActionDialog) — dropped a
dead= nullinitializer that the exhaustiveswitch(incl.default)
overwrites before it is read.no-unsafe-function-type(plugin-viewViewTabBar) — the dnd-kit
render-proplistenersmap is typedRecord<string, (...args: any[]) => void>
instead of bareFunction.no-require-imports(plugin-kanban,plugin-viewtests) — hoisted
vi.mockfactories use anasyncfactory withawait import('react').
-
Updated dependencies [0318118]
-
Updated dependencies [1c8935a]
-
Updated dependencies [af1b0db]
-
Updated dependencies [8b8b744]
-
Updated dependencies [7cf4051]
-
Updated dependencies [803558e]
-
Updated dependencies [aefcf39]
-
Updated dependencies [2e7d7f0]
-
Updated dependencies [ef14f69]
-
Updated dependencies [94d4876]
-
Updated dependencies [1100a8b]
-
Updated dependencies [7abe4cd]
-
Updated dependencies [69fa5d1]
-
Updated dependencies [549c67d]
-
Updated dependencies [ebe6494]
-
Updated dependencies [2b17339]
-
Updated dependencies [31b77d4]
-
Updated dependencies [6d4fbe6]
-
Updated dependencies [0a3710b]
-
Updated dependencies [f80aaf2]
-
Updated dependencies [62b9ab5]
-
Updated dependencies [14cb729]
-
Updated dependencies [1629313]
-
Updated dependencies [29c6040]
-
Updated dependencies [faebac3]
-
Updated dependencies [2331ac9]
-
Updated dependencies [199fa83]
-
Updated dependencies [eee4ded]
-
Updated dependencies [3b2e4d9]
- @object-ui/fields@16.1.0
- @object-ui/i18n@16.1.0
- @object-ui/core@16.1.0
- @object-ui/types@16.1.0
- @object-ui/react@16.1.0
- @object-ui/components@16.1.0
- @object-ui/plugin-grid@16.1.0