Skip to content

Releases: objectstack-ai/objectui

@object-ui/types@16.1.0

Choose a tag to compare

@github-actions github-actions released this 21 Jul 05:49
9a5f016

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 enable DashboardWidgetSchema.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/typesDashboardWidgetSchema gains dataset / 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-dashboardWidgetConfigPanel is rewritten as a dataset
      picker (chart AND pivot). Breaking prop change: the unused
      availableObjects / availableFields props are replaced by a new
      datasets?: WidgetDatasetCatalogEntry[] (+ datasetsLoading?) catalog prop,
      also forwarded by DashboardWithConfig. Hosts resolve the catalog (e.g. via
      the metadata client's list('dataset')); without it the panel falls back to
      free-text authoring. New exports: WidgetDatasetCatalogEntry and
      sanitizeDraftForType.
    • @object-ui/app-shell — the metadata-admin DashboardWidgetInspector drops
      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 drops list / custom — neither is a
      member of @objectstack/spec ChartTypeSchema, so a widget authored with
      them could never publish.

    Not changed: DashboardRenderer keeps its legacy/static read branches and
    the ObjectPivotTable / PivotTable blocks (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.

  • 31b77d4: Add the explicit engine-owned lifecycle bucket (tracks framework ADR-0103 addendum / #3343). The framework split the overloaded managedBy: 'system' bucket by promoting the engine-owned case to its own enum value; this mirrors it in the UI type + runtime + badge.

    • @object-ui/typesManagedByBucket union and MANAGED_BY_BUCKETS gain '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/coreresolveCrudAffordances gains the engine-owned default row (identical all-locked matrix as system/append-only), so isObjectInlineEditable / the grid + form gates treat it as read-only automatically.
    • @object-ui/app-shell — the ManagedByBadge renders engine-owned with the same read-only "System-managed" copy as a locked system object (reuses the existing managedByBadge.system i18n key — zero translation churn; the distinction is at the schema level, not the user-facing string), and resolveManagedByEmptyState reuses the system engine-owned empty state.

    Behaviour-preserving: engine-owned resolves to the same locked affordances system did 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 in resolveCrudAffordances / 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
    through dataSource.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/typesbatchTransaction? is now a first-class (optional)
      method on the DataSource contract, typed via BatchTransactionOperation /
      BatchRef. Replaces the previous (dataSource as any).batchTransaction
      method-sniffing.
    • @object-ui/core — new emulateBatchTransaction(dataSource, operations)
      (sequential writes, $ref resolution, best-effort reverse-order compensation)
      and runBatchTransaction(dataSource, operations) (prefers the adapter's method,
      emulates otherwise). ApiDataSource / ValueDataSource implement
      batchTransaction via the emulation.
    • @object-ui/data-objectstackObjectStackAdapter.batchTransaction uses
      the server's atomic POST /api/v1/batch, prefers the typed
      client.data.batchTransaction SDK 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 — removed applyDetail / createMany /
      ApplyDetailResult from masterDetailTx.ts; MasterDetailForm and
      LineItemsPanel build ops and call runBatchTransaction. 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 @deprecated inline-analytics keys (object,
      categoryField, categoryGranularity, valueField, aggregate, measures)
      from DashboardWidgetSchema. They were retained in #2703 only so the renderer
      could read legacy/static metadata during the transition.
    • plugin-dashboard: DashboardRenderer no longer emits the object-bound
      metric / chart / pivot / table / list branches from the top-level object +
      analytics keys. It keeps the renderer-internal static paths (options.data /
      widget.data array and the provider: 'object' async config) and
      widget.component. The dashboard renderer no longer emits object-pivot /
      pivot at all — dataset pivots render through DatasetWidget (grouped table /
      cross-tab); the ObjectPivotTable / PivotTable components stay as public
      SDUI blocks for other surfaces. DashboardGridLayout gets the same treatment.
    • graceful fallback: a widget that still carries the retired inline shape in
      stored metadata (top-level object, no dataset, no inline options.data)
      now renders a visible error placeholder prompting a rebind to a dataset, rather
      than a blank chart/grid.
    • plugin-designer: DashboardEditor drops its inline object / value-field /
      aggregate fields (analytics binding is authored via the dataset picker in
      app-shell's DashboardWidgetInspector / plugin-dashboard's WidgetConfigPanel).

Patch Changes

  • 7cf4051: chore(deps): align every @objectstack/* dependency to ^16.0.0-rc.0

    Bumps @objectstack/spec / client / formula / lint from ^15.1.1 to the
    16.0.0-rc.0 pre-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 with spec).

    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
    against 16.0.0-rc.0 with no source changes required.

    Practical effect: @objectstack/client@16.0.0-rc.0 now ships
    data.batchTransaction (framework #3271), so ObjectStackAdapter's feature
    detect (typeof client.data.batchTransaction === 'function') routes
    master-detail cross-object saves through the typed SDK method instead of the
    raw fetch('/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_id out of the leading auto-derived columns

    A view-less object's default list columns are derived from the object's field
    order. The framework's applySystemFields spreads its injected
    system/audit/ownership fields to the FRONT of that order and stamps them
    system: true; owner_id is deliberately non-hidden and non-readonly
    (ownership is reassignable), so the old name-based exclusion lists in
    ObjectGrid and InterfaceListPage — which never listed owner_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
    isSystemManagedField hel...

Read more

@object-ui/sdui-parser@16.1.0

Choose a tag to compare

@github-actions github-actions released this 21 Jul 05:49
9a5f016
@object-ui/sdui-parser@16.1.0

@object-ui/runner@16.1.0

Choose a tag to compare

@github-actions github-actions released this 21 Jul 05:49
9a5f016

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
    through dataSource.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/typesbatchTransaction? is now a first-class (optional)
      method on the DataSource contract, typed via BatchTransactionOperation /
      BatchRef. Replaces the previous (dataSource as any).batchTransaction
      method-sniffing.
    • @object-ui/core — new emulateBatchTransaction(dataSource, operations)
      (sequential writes, $ref resolution, best-effort reverse-order compensation)
      and runBatchTransaction(dataSource, operations) (prefers the adapter's method,
      emulates otherwise). ApiDataSource / ValueDataSource implement
      batchTransaction via the emulation.
    • @object-ui/data-objectstackObjectStackAdapter.batchTransaction uses
      the server's atomic POST /api/v1/batch, prefers the typed
      client.data.batchTransaction SDK 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 — removed applyDetail / createMany /
      ApplyDetailResult from masterDetailTx.ts; MasterDetailForm and
      LineItemsPanel build ops and call runBatchTransaction. 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

Choose a tag to compare

@github-actions github-actions released this 21 Jul 05:49
9a5f016

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 bare globalThis.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/reactSchemaRendererProvider accepts an optional
      apiFetch; nested providers inherit it from their parent so re-wrapped
      subtrees (react pages, preview surfaces) keep the host's authentication.
      useViewData defaults the api-provider adapter's fetch to the context
      apiFetch (explicit adapterOptions.fetch still wins).
    • @object-ui/authcreateAuthenticatedFetch gains a
      sameOriginOnly option: cross-origin URLs pass through to the bare fetch
      with no Authorization / 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)
      as apiFetch on the root SchemaRendererProvider.
    • @object-ui/plugin-ganttObjectGantt resolves its api-provider
      DataSource with the context apiFetch, 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 / hidden predicates were evaluated
    by the home-grown JS ExpressionEvaluator, while field rules
    (visibleWhen/readonlyWhen/requiredWhen, via fieldRules.ts) and row/list
    conditionals (via evalRowPredicate) already delegate to the canonical
    @objectstack/formula engine. That split meant a { dialect: 'cel' } predicate
    in a renderer/action surface was executed as JavaScript — CEL-only forms
    (x in list, has(), typed ==, the today()/daysFromNow() catalog) behaved
    differently from, or faulted against, the server's enforcement.

    This converges the remaining tier onto the same engine:

    • @object-ui/coreExpressionEvaluator.evaluateCondition now detects a
      { dialect: 'cel', source } envelope and evaluates it on @objectstack/formula
      (via evalFieldPredicate), binding the record namespace 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 genuine false never
      throws). This fixes every SchemaRenderer visibility/disabled read at once.
    • @object-ui/reacttoPredicateInput preserves a CEL envelope instead of
      collapsing it to a ${source} string, and useCondition accepts 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 CEL visible/enabled/disabled on 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.1 alignment (#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.0

    Bumps @objectstack/spec / client / formula / lint from ^15.1.1 to the
    16.0.0-rc.0 pre-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 with spec).

    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
    against 16.0.0-rc.0 with no source changes required.

    Practical effect: @objectstack/client@16.0.0-rc.0 now ships
    data.batchTransaction (framework #3271), so ObjectStackAdapter's feature
    detect (typeof client.data.batchTransaction === 'function') routes
    master-detail cross-object saves through the typed SDK method instead of the
    raw fetch('/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 on main, so their per-package lint gate 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
      whose catch only re-threw; errors still propagate identically.
    • preserve-caught-error (cli, data-objectstack, react) — the caught
      error's message is inlined into the thrown Error; a scoped disable with a
      justifying comment carries each one, because these packages target ES2020
      whose lib types the 1-arg Error constructor only (so { cause } won't
      compile) — same reasoning as the core case in #2709.
    • prefer-const (plugin-calendar, plugin-map) — letconst for
      never-reassigned bindings.
    • no-empty-object-type (plugin-designer) — empty extend-only interfaces
      → equivalent type aliases.
    • no-useless-assignment (react) — dropped a dead initializer that both
      branches overwrite before it is read.
    • no-require-imports (plugin-calendar, plugin-timeline tests) —
      hoisted vi.mock factories now use an async factory with
      await import('react') instead of require('react').
    • stale eslint-disable directive (plugin-markdown) — removed a
      react/no-danger disable 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

Choose a tag to compare

@github-actions github-actions released this 21 Jul 05:49
9a5f016
@object-ui/react-runtime@16.1.0

@object-ui/providers@16.1.0

Choose a tag to compare

@github-actions github-actions released this 21 Jul 05:49
9a5f016

Patch Changes

@object-ui/plugin-view@16.1.0

Choose a tag to compare

@github-actions github-actions released this 21 Jul 05:49
9a5f016

Patch Changes

  • 7cf4051: chore(deps): align every @objectstack/* dependency to ^16.0.0-rc.0

    Bumps @objectstack/spec / client / formula / lint from ^15.1.1 to the
    16.0.0-rc.0 pre-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 with spec).

    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
    against 16.0.0-rc.0 with no source changes required.

    Practical effect: @objectstack/client@16.0.0-rc.0 now ships
    data.batchTransaction (framework #3271), so ObjectStackAdapter's feature
    detect (typeof client.data.batchTransaction === 'function') routes
    master-detail cross-object saves through the typed SDK method instead of the
    raw fetch('/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 on main, so their per-package lint gate 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-kanban ObjectKanban moved its if (error) early return
      below the useCallback so hooks run unconditionally. collaboration
      __unsafe_usePresenceContext keeps 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-charts TreemapCell was a genuine
      inline component and is hoisted to module scope (it is purely props-driven).
    • no-irregular-whitespace (plugin-grid ImportWizard) — the literal
      U+FEFF BOM prepended to exported CSV/text blobs (so Excel detects UTF-8) is
      now written as the  escape: byte-identical at runtime, no literal
      irregular-whitespace character in source.
    • no-useless-assignment (plugin-grid BulkActionDialog) — dropped a
      dead = null initializer that the exhaustive switch (incl. default)
      overwrites before it is read.
    • no-unsafe-function-type (plugin-view ViewTabBar) — the dnd-kit
      render-prop listeners map is typed Record<string, (...args: any[]) => void>
      instead of bare Function.
    • no-require-imports (plugin-kanban, plugin-view tests) — hoisted
      vi.mock factories use an async factory with await 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

Choose a tag to compare

@github-actions github-actions released this 21 Jul 05:49
9a5f016

Patch Changes

  • 7cf4051: chore(deps): align every @objectstack/* dependency to ^16.0.0-rc.0

    Bumps @objectstack/spec / client / formula / lint from ^15.1.1 to the
    16.0.0-rc.0 pre-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 with spec).

    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
    against 16.0.0-rc.0 with no source changes required.

    Practical effect: @objectstack/client@16.0.0-rc.0 now ships
    data.batchTransaction (framework #3271), so ObjectStackAdapter's feature
    detect (typeof client.data.batchTransaction === 'function') routes
    master-detail cross-object saves through the typed SDK method instead of the
    raw fetch('/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

Choose a tag to compare

@github-actions github-actions released this 21 Jul 05:49
9a5f016

Patch Changes

  • 7cf4051: chore(deps): align every @objectstack/* dependency to ^16.0.0-rc.0

    Bumps @objectstack/spec / client / formula / lint from ^15.1.1 to the
    16.0.0-rc.0 pre-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 with spec).

    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
    against 16.0.0-rc.0 with no source changes required.

    Practical effect: @objectstack/client@16.0.0-rc.0 now ships
    data.batchTransaction (framework #3271), so ObjectStackAdapter's feature
    detect (typeof client.data.batchTransaction === 'function') routes
    master-detail cross-object saves through the typed SDK method instead of the
    raw fetch('/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 on main, so their per-package lint gate 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
      whose catch only re-threw; errors still propagate identically.
    • preserve-caught-error (cli, data-objectstack, react) — the caught
      error's message is inlined into the thrown Error; a scoped disable with a
      justifying comment carries each one, because these packages target ES2020
      whose lib types the 1-arg Error constructor only (so { cause } won't
      compile) — same reasoning as the core case in #2709.
    • prefer-const (plugin-calendar, plugin-map) — letconst for
      never-reassigned bindings.
    • no-empty-object-type (plugin-designer) — empty extend-only interfaces
      → equivalent type aliases.
    • no-useless-assignment (react) — dropped a dead initializer that both
      branches overwrite before it is read.
    • no-require-imports (plugin-calendar, plugin-timeline tests) —
      hoisted vi.mock factories now use an async factory with
      await import('react') instead of require('react').
    • stale eslint-disable directive (plugin-markdown) — removed a
      react/no-danger disable 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

Choose a tag to compare

@github-actions github-actions released this 21 Jul 05:49
9a5f016

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 dateGranularity date 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 new drillRanges sidecar.

    • @object-ui/corebuildDatasetDrillFilter accepts the per-row
      drillRanges and 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 forward drillRanges, 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. ObjectDataPage parses those
      operators (equality shorthand unchanged), renders a range as a single chip,
      and removes both bounds together. A new drillUrlFilters module 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 on main, so their per-package lint gate 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-kanban ObjectKanban moved its if (error) early return
      below the useCallback so hooks run unconditionally. collaboration
      __unsafe_usePresenceContext keeps 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-charts TreemapCell was a genuine
      inline component and is hoisted to module scope (it is purely props-driven).
    • no-irregular-whitespace (plugin-grid ImportWizard) — the literal
      U+FEFF BOM prepended to exported CSV/text blobs (so Excel detects UTF-8) is
      now written as the  escape: byte-identical at runtime, no literal
      irregular-whitespace character in source.
    • no-useless-assignment (plugin-grid BulkActionDialog) — dropped a
      dead = null initializer that the exhaustive switch (incl. default)
      overwrites before it is read.
    • no-unsafe-function-type (plugin-view ViewTabBar) — the dnd-kit
      render-prop listeners map is typed Record<string, (...args: any[]) => void>
      instead of bare Function.
    • no-require-imports (plugin-kanban, plugin-view tests) — hoisted
      vi.mock factories use an async factory with await 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