Skip to content
This repository was archived by the owner on Oct 26, 2026. It is now read-only.

Commit 44de8b6

Browse files
committed
Merge origin/main (7e8b3c0) into claude/issue-10918-console-ctx-org
Claude-Session: https://claude.ai/code/session_015AUunPkX7UTkCH9e7AdZo1 Co-authored-by: Claude <noreply@anthropic.com>
2 parents 04f6e70 + 7e8b3c0 commit 44de8b6

71 files changed

Lines changed: 3290 additions & 143 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
---
2+
'@object-ui/plugin-view': patch
3+
---
4+
5+
The registered `object-view` renderer reads a named grid view's own grid members off the named view (objectui#10885).
6+
7+
`object-view` is registered without a `renderListView`, so an authored node, and the Studio's view preview (which renders a stored view through `SchemaRenderer`), draws a grid view as the `object-grid` node `ObjectView` builds for `ObjectGrid`. That node read `columns`, `filter`, `sort`, `grouping` and `rowColor` off the active named view and nothing else, so a stored or authored grid view's `rowHeight`, `pagination` and the rest were accepted and not shown.
8+
9+
It now also reads, off the active named view first, ten members the protocol declares under the same name on both a named view and `object-grid` and that `ObjectGrid` reads: `pagination`, `selection`, `rowHeight`, `resizable`, `searchableFields`, `conditionalFormatting`, `rowActions`, `bulkActions`, `bulkActionDefs` and `exportOptions`. `pagination` and `selection` still fall back to the node's `table` when the named view omits them; the others have no node fallback on this path, as before. Three other members declared on both, `label`, `data` and `navigation`, are still not read off the named view on this path.
10+
11+
A named view's `hiddenFields` is applied the way the protocol composes it: the hidden fields are removed from the column projection the grid receives. Only a declared projection is narrowed; with no `columns` anywhere the grid still derives its own.
12+
13+
What moves: only a grid view that authors one of these members. A named view that carries none of them renders exactly as before, and the host `renderListView` delegation is unchanged.
14+
15+
`Clause-②: no` — no declared type, accepted key or published export moves. A renderer starts honouring members the spec already declares on a named view and the grid already reads.
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
---
2+
'@object-ui/plugin-designer': patch
3+
---
4+
5+
fix(plugin-designer): editing an app keeps its stored navigation (objectui#10894)
6+
7+
**Clause-②: no** — an edit stops destroying stored navigation. No declared type, accepted key or published surface moves.
8+
9+
The console's "edit app" page (`EditAppPage`) loads the stored app into `AppCreationWizard`. Leaving the wizard's Objects step replaced the draft's `navigation` with one generated object entry per selected object, and every edit passes through that step. So any edit, even a title change, saved a stored `[object, separator, group, url]` tree as `[object]`. It dropped every separator, group (with its children) and `url` / `dashboard` / `page` / `report` / `component` / `action` entry, and each object entry's own label, icon and order, with no warning.
10+
11+
- **Leaving the Objects step no longer replaces the navigation.** An empty navigation (the create path) is still filled with one object entry per selected object. A non-empty one is merged:
12+
- a newly selected object gets an object entry, appended at the end;
13+
- the object entries of a deselected object are dropped, at the top level or inside a group. The group keeps its place and its other children, even when that leaves it with none;
14+
- every other entry is kept as stored, in its position. That includes each object entry's label, icon and order, and an object entry for an object the Objects step does not list.
15+
- **`EditAppPage` counts an object as selected when the stored navigation has an object entry for it at the top level or inside a group, at any depth.** It counted only top-level entries, so a grouped object showed as unselected.
16+
- The same merge applies on the create path once the author has shaped the navigation. Going back to the Objects step and forward again keeps the added separators, groups and links, and the order.
17+
18+
Pinned in `packages/plugin-designer/src/__tests__/EditAppPage.keepsNavigation-10894.test.tsx`.
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
---
2+
---
3+
4+
Test-only, no package released: `RelatedList.unmaterializedSort.test.tsx`'s case "keeps that button in
5+
client mode" now awaits the object schema before it reads the `Total` sort button. Since
6+
objectui#10728 the sort-button row reads the masked stamp, which covers every column until
7+
`getObjectSchema` resolves, and the case gated only on the view type, which client mode reaches on the
8+
first commit. So whether the button existed when it was read depended on scheduling; on one merge-queue
9+
build it did not (objectui#10895). No source file changes.
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
---
2+
'@object-ui/app-shell': patch
3+
---
4+
5+
fix(app-shell): the assistant FAB is hidden while the chat dock is open (objectui#10899)
6+
7+
The console's round assistant button is the chat dock's collapsed affordance
8+
(ADR-0057), but `ConsoleLayout` rendered it whether the dock was collapsed or
9+
open. With the right rail open inside an app, the `fixed bottom-6 right-6`
10+
button sat on top of the rail composer's send button, so only the Enter key
11+
could send.
12+
13+
The FAB now renders only while the dock is collapsed — the same rule the Studio
14+
dock's `ChatDockLauncher` already follows. The open rail and the mobile sheet
15+
keep their own collapse and close controls.
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
---
2+
'@object-ui/plugin-chatbot': patch
3+
---
4+
5+
fix(plugin-chatbot): a reloaded multi-step build no longer shows an empty 「执行过程」 block under every step (objectui#10899)
6+
7+
The conversation store persists each step of an agent turn as its own assistant
8+
row whose only text is a `(called …)` placeholder, so a reloaded build (the
9+
in-app dock, the Studio copilot) hydrates into one message per step. Each one
10+
rendered its tool row, then the italic 执行过程 note, then the message action
11+
bar — invisible until hover but full height — so every step read as an empty
12+
block with a large gap.
13+
14+
- The 执行过程 note is now only the fallback for a placeholder turn that shows
15+
nothing else. A turn whose tool row, build panel or design panel is on screen
16+
does not repeat it.
17+
- The copy / regenerate bar renders only for a turn with visible prose. A
18+
prose-less step has nothing to copy, and Copy used to copy the internal
19+
placeholder.
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
---
2+
'@object-ui/data-objectstack': patch
3+
'@object-ui/plugin-dashboard': patch
4+
'@object-ui/i18n': patch
5+
---
6+
7+
fix(data-objectstack, plugin-dashboard): a dataset tile the viewer may not read shows a localized "no access" state (objectui#10899)
8+
9+
When the analytics read admission refused a dashboard dataset query — `403`
10+
with ADR-0112 `PERMISSION_DENIED` — `queryDataset` had no branch for that code,
11+
so it threw the generic `Dataset query failed: 403 Forbidden — [Analytics]
12+
Access denied: …` string, and `DatasetWidget` printed it verbatim in a red
13+
alert. The list view over the same object already says 「无权访问」.
14+
15+
- `queryDataset` now throws a typed `AnalyticsForbiddenError` for that code,
16+
carrying `httpStatus: 403` and `code: 'PERMISSION_DENIED'` (plus the server's
17+
code and message for diagnostics). A code-less 403 — no ObjectStack route
18+
wrote it — keeps the generic error.
19+
- `DatasetWidget` classifies a failed query with the shared `classifyLoadError`
20+
and, for `forbidden`, renders a localized no-access state
21+
(`dashboard.widgetForbiddenTitle` / `dashboard.widgetForbiddenMessage`, new in
22+
all ten packs) instead of the exception text. Every other failure keeps the
23+
detailed alert.
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
---
2+
'@object-ui/app-shell': patch
3+
'@object-ui/plugin-detail': patch
4+
'@object-ui/i18n': patch
5+
---
6+
7+
fix(app-shell, plugin-detail): a record comment whose write fails is never shown as sent (objectui#10899)
8+
9+
The record page's discussion writers appended the new comment (or reply) to the
10+
panel first and then fired the `sys_comment` create, swallowing its rejection.
11+
On a tenant with no `sys_comment` the write answered 404 while the panel showed
12+
the comment and a bumped count, with no error — and the comment was gone after a
13+
reload.
14+
15+
`RecordDetailView` now appends a comment or reply only after its write resolves.
16+
A failed write raises a localized error toast (`detail.commentFailed`, new in all
17+
ten packs) and rejects back to the composer. The composers — the activity
18+
timeline's comment box, the threaded reply input, and `RecordComments` — now
19+
treat a rejected `onAddComment` / `onAddReply` explicitly as "not written": they
20+
keep the draft for a retry instead of letting the rejection escape unhandled.
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
---
2+
'@object-ui/app-shell': patch
3+
---
4+
5+
fix(app-shell): the marketplace offers an "update" only for a HIGHER version (objectui#10899)
6+
7+
The environment marketplace detail page decided "update available" — the amber
8+
`Update available → vX` badge, the primary button's `Update` label, and the
9+
install dialog's per-environment `Update → vX` hint — by comparing the installed
10+
version with the latest approved one using `!==`. An environment holding a newer
11+
version than the latest approved one (a draft installed ahead of review) was
12+
therefore told `Installed v1.1.0 · Update available → v1.0.0`, and the button
13+
offered to "update" it to the older version.
14+
15+
Both call sites now ask `isNewerVersion`, which orders the two by SemVer 2.0.0
16+
precedence — the grammar the package manifest contract declares for `version`.
17+
Only a version of higher precedence is an update; an equal, older or
18+
non-SemVer pair offers none, so the page never guesses an order the contract did
19+
not give it.
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
---
2+
'@object-ui/app-shell': patch
3+
---
4+
5+
fix(app-shell): the Studio edit/design affordances follow the server's authoring capability (objectui#10899)
6+
7+
A page's "Edit in Studio" pencil and the top bar's "Design in Studio" hammer
8+
were gated on the workspace-admin ROLE alone. An organization owner is a
9+
workspace admin, but framework's `organization_admin` permission set
10+
deliberately withholds `manage_metadata` (ADR-0066), and
11+
`GET /api/v1/auth/me/permissions` reports that. So on the cloud control plane a
12+
freshly signed-up customer was offered the platform's own page metadata editor.
13+
14+
Both affordances now also require `manage_metadata` through
15+
`useCanAuthorMetadata` — the server's answer, the same one HomePage's builder
16+
CTAs already consume. A server that reports no `systemPermissions` at all
17+
(predating ADR-0066) keeps today's admin-only behaviour, since an unknown answer
18+
fails open; the server refuses the write either way.
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
---
3+
4+
Comment-only in `@object-ui/core`: the built-in `TODAY()` formula function now carries a docblock stating which calendar day it names, as ruled on objectui#10903 (option A). A client-evaluated `TODAY()` names the same reference day the server resolves for that user, on the compute-tz axis of objectstack ADR-0053, and the UTC day while no reference timezone reaches the client. The implementation reads no timezone, so it answers the UTC day, which is the ruled fallback; nothing it returns changes.
5+
6+
Declared as releasing nothing because the emit was measured rather than assumed: the docblock sits inside the private `registerDateFunctions` body, so it cannot reach the emitted `FormulaFunctions.d.ts`, and the comment-stripped emit of `FormulaFunctions.ts` is byte-identical to the base. No published behaviour changes (objectui#10903).

0 commit comments

Comments
 (0)