Skip to content

Commit 053c948

Browse files
xuyushun441-sysos-zhuangclaude
authored
chore(changeset): backfill changesets for post-9.3 changes (#1718)
Adds changesets for the package-touching PRs merged after the framework 9.3.0 pin that landed without one: gantt (year scale/nav/layout/PDF, configurable tooltip + parent-stretch), plugin-chatbot (inline data-chart, honest turn-liveness), app-shell AI workspace UX + current-object context, ADR-0047 interface pages (app-shell/plugin-list/grid/data-objectstack), plugin-list $select schema gate, ADR-0048 package-id app routing, newTabUrl fast path, and plugin-report dataset matrix totals. Co-authored-by: Jack Zhuang <277994282+os-zhuang@users.noreply.github.com> Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
1 parent a571911 commit 053c948

11 files changed

Lines changed: 202 additions & 0 deletions
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
---
2+
"@object-ui/app-shell": minor
3+
"@object-ui/plugin-list": minor
4+
"@object-ui/plugin-grid": minor
5+
"@object-ui/data-objectstack": minor
6+
---
7+
8+
feat: ADR-0047 — interface pages, visualization switcher, and Airtable-parity filters
9+
10+
End-user interface/list pages reach full rendering and authoring parity:
11+
12+
- **Spec tabs + visualization switcher**`ObjectView` now forwards
13+
`viewDef.tabs` (stored/served but never rendered) and `viewDef.appearance`
14+
(`allowedVisualizations` whitelist), turning on the dormant `ViewSwitcher` when
15+
more than one type is whitelisted; effective options = author whitelist ∩
16+
capability-resolvable types (kanban needs `groupBy`, calendar a date field, …).
17+
`ListView` accepts the canonical `ViewFilterRule[]` tab-filter shape.
18+
- **User filters** — render only when `userFilters` is explicitly configured;
19+
selections (dropdown values + active tab) mirror into `uf_*` URL params and
20+
restore on load, so filtered lists survive reload and are shareable.
21+
- **Toolbar polish** — the visualization switcher becomes a compact right-side
22+
"Grid ▾" dropdown inside the tool cluster (no extra row); filter tabs and
23+
dropdown filters are mutually exclusive.
24+
- **Studio authoring** — a usable, schema-driven interface-page inspector
25+
(collapsible sections honoured, array-of-enum → multi-select, a None/Tabs/
26+
Dropdown `filter-mode` selector where None maps to ABSENCE of `userFilters`),
27+
and the Design/Preview tabs render the live list via `InterfaceListPage`
28+
(including a non-empty grid when the source view is hollow).
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
---
2+
"@object-ui/app-shell": minor
3+
---
4+
5+
feat(app-shell): ADR-0048 (option A) — package-id app routing + prefer-local resolution
6+
7+
Apps are now routed by their canonical package id rather than name:
8+
9+
- **Resolution layer** — new `appRoute` helpers: `appRouteSegment(app)`
10+
(canonical link segment = package id, name fallback) and
11+
`matchAppBySegment(apps, seg)` (prefers `_packageId`, falls back to `name`).
12+
`AppContent` selects the active app via `matchAppBySegment`, so
13+
`/apps/<packageId>` resolves while `/apps/<appName>` keeps working (a per-tenant
14+
alias / legacy URL).
15+
- **Emission layer** — nav generates `/apps/<packageId>` links across app
16+
switching (AppSwitcher/AppSidebar/CommandPalette), sidebar base paths,
17+
create/edit-app, and the hidden-app switch, all via `appRouteSegment(app)`.
18+
- **Prefer-local resolution**`preferLocal(list, name, ownerPackageId)` resolves
19+
a bare metadata name to the item whose `_packageId` matches the active app's
20+
package (falling back to first match), wired at PageView/DashboardView/
21+
ReportView and AppHeader so two installed packages can ship the same bare name.
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
---
2+
"@object-ui/app-shell": minor
3+
---
4+
5+
feat(console/ai): AI workspace UX — date-grouped conversations, draggable split, keyboard shortcuts
6+
7+
ChatGPT/Claude-parity polish for the console AI workspace:
8+
9+
- **Date-grouped conversations** — the flat conversations list groups into
10+
recency sections (Today / Yesterday / Previous 7 days / Previous 30 days /
11+
Older) with calendar-day boundaries, via a pure exported
12+
`groupConversationsByDate()`.
13+
- **Draggable chat ↔ preview split** — a draggable, double-click-to-reset divider
14+
between chat and the Live Canvas preview; width persists to `localStorage`,
15+
clamped so neither pane collapses (chat ≥ 360px, preview ≥ 420px), keyboard-
16+
accessible (`role="separator"`, ←/→ resize).
17+
- **Collapsible conversations list** — auto-tucks when the preview opens, with a
18+
manual toggle.
19+
- **Keyboard shortcuts** — ⌘⇧O new chat, ⌘⇧S toggle the conversations list.
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): send the current-page object to the AI assistant context
6+
7+
The floating console assistant forwarded only `appName` + the full objects list,
8+
never the object the user is actually viewing — so asking it to "analyse this
9+
object" (especially in a non-English prompt) gave the agent nothing to anchor on
10+
and it replied that it couldn't find the object. The current object/record are
11+
now derived from the route (mirroring `useTrackRouteAsRecent`'s URL layout,
12+
tolerant of a `_console` shell prefix) and passed as `context.objectName` /
13+
`context.recordId`, so the backend injects that object's schema into the system
14+
prompt and scopes data queries to it. Pairs with the framework current-object
15+
resolution fix.
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
---
2+
"@object-ui/app-shell": minor
3+
"@object-ui/core": minor
4+
---
5+
6+
feat(app-shell): zero-roundtrip `newTabUrl` fast path for `opensInNewTab` actions
7+
8+
Actions that declare `newTabUrl` (a path template with a `{recordId}` placeholder
9+
whose target endpoint performs all auth/authz itself) now drive the pre-opened
10+
popup straight to that URL on click, skipping the action POST entirely — applied
11+
to both server-action paths (list rows via `useConsoleActionRuntime`, record
12+
header via `RecordDetailView`). The popup paints the existing spinner page until
13+
the (possibly slow) endpoint commits its redirect; the URL is resolved absolute
14+
because `about:blank` gives a bare-relative href no reliable base. The
15+
popup-blocked toast fallback is unchanged. Removes one full round trip of
16+
white-screen latency from every such Open click.
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
---
2+
"@object-ui/plugin-chatbot": minor
3+
---
4+
5+
feat(plugin-chatbot): render AI data-query charts inline (`data-chart`)
6+
7+
Companion to the framework `visualize_data` tool: the data-query assistant can
8+
now answer with a CHART rendered right in the assistant bubble.
9+
10+
- `mapMessages.ts``extractCharts()` lifts every `data-chart` custom stream
11+
part onto `ChatMessage.charts` (defensive narrowing; preserves multiple charts
12+
in order), mirroring the existing `data-build-progress``buildProgress` path.
13+
- `ChatbotEnhanced.tsx` — renders each chart via `<SchemaRenderer schema={{
14+
type:'chart', … }}/>` (decoupled — no hard dep on `plugin-charts`), giving the
15+
chart a definite `width: min(520px, 80vw)` so recharts' `ResponsiveContainer`
16+
measures a stable non-zero width inside the `w-fit` bubble (otherwise the
17+
circular width dependency leaves bars unpainted).
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
---
2+
"@object-ui/plugin-chatbot": minor
3+
---
4+
5+
feat(plugin-chatbot): honest liveness indicator on running AI turns
6+
7+
AI app builds run 1–3 min with long quiet gaps (LLM thinking, sample-data
8+
generation) where a static spinner is indistinguishable from a dropped
9+
connection. The chat now shows a Claude-Code-style liveness indicator driven by
10+
REAL observed stream activity, not a free-running clock:
11+
12+
- `useTurnLiveness(active, activityKey)` stamps the moment real data arrives (a
13+
streamed token / tool delta / `data-build-progress` update) and measures
14+
seconds-since-last-byte.
15+
- `LivenessIndicator` renders three honest states — *receiving* (emerald pulse +
16+
m:ss, bytes arrived recently), *waiting* (request in flight, nothing back yet),
17+
and *stalled* (amber + "no response for Ns", genuinely silent past 6s).
18+
- The build panel prefers the server's monotonic `seq` keep-alive heartbeat as
19+
its activity key (falling back to the content signature on older runtimes), so
20+
a long quiet seed-generation window reads as honestly *receiving* rather than
21+
flipping to amber.
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
---
2+
"@object-ui/plugin-gantt": minor
3+
---
4+
5+
feat(gantt): year scale, navigation, saved layout, and PDF export (follow-up to #1672)
6+
7+
- **Year scale** — new `year` granularity (one column per year, with a "20XXs"
8+
decade group band above); ResourceWorkload follows the same column width/label.
9+
- **Navigation** — toolbar gains *This week* / *This month* jump buttons (beside
10+
the existing *Today*), scrolling the timeline to the current week/month start.
11+
- **Saved layout**`persistLayoutKey` / `onLayoutChange` plus a "Save layout"
12+
button snapshot the current granularity + zoom + collapsed task columns to
13+
`localStorage` (`gantt-layout:<object>:<view>`) and restore on next load (an
14+
explicit `viewMode` prop still wins). `ObjectGantt` derives the key from the
15+
data object by default; `persistLayout: false` opts out.
16+
- **PDF export** — rasterizes the whole chart SVG to JPEG embedded in a
17+
zero-dependency single-page PDF (DCTDecode), alongside PNG export
18+
(`buildExportSvg` shared by both).
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
---
2+
"@object-ui/plugin-gantt": minor
3+
---
4+
5+
feat(gantt): configurable hover tooltip + live parent-stretch (follow-up to #1672)
6+
7+
- **Configurable tooltip** — a view declares `tooltipFields` on its gantt config
8+
(field names, or `{ field, label }` to override the label); `ObjectGantt`
9+
resolves each against the record (select options → label, lookups → embedded
10+
record name, dates/numbers/currency/percent through the shared `@object-ui/
11+
fields` formatters) and feeds `GanttView` a `task.fields` array that replaces
12+
the default hover detail.
13+
- **Live parent-stretch** — a summary bar's displayed range rolls up from its
14+
children live, so dragging a child past the parent's edge stretches the parent.
15+
- Also replaces six prebuilt-CSS utilities the components stylesheet never emits
16+
(connector dot `-right-2` was occluding the progress label, resize-handle
17+
width, progress-fill radius, grid z-index, `sm:` variants) with inline styles
18+
/ a scoped media query so the chart renders correctly in consuming apps.
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
---
2+
"@object-ui/plugin-list": patch
3+
---
4+
5+
fix(plugin-list): gate speculative `$select` fields by the object's real schema
6+
7+
A list view auto-includes view-binding fields (kanban `groupBy`, calendar/gantt/
8+
timeline dates, gallery image, timeline status/priority) in `$select` so
9+
alternate view modes render populated. These were added unconditionally on the
10+
assumption that "the projection ignores unknown names" — but some backends
11+
(notably the cloud multi-tenant runtime) reject an unknown `$select` column with
12+
an EMPTY result set, so a single phantom field zeroed the whole list (an AI-built
13+
`product` view requesting `status`/`due_date`/`image` showed "no data" though
14+
rows existed). The speculative additions now go through `addSpeculative()`, which
15+
keeps only fields present in the object schema; user-declared columns and expand
16+
roots are untouched.

0 commit comments

Comments
 (0)