Skip to content

refactor: unify runtime dashboard editor onto studio's spec-driven inspectors#1505

Merged
os-zhuang merged 4 commits into
mainfrom
claude/runtime-dashboard-editor
Jun 6, 2026
Merged

refactor: unify runtime dashboard editor onto studio's spec-driven inspectors#1505
os-zhuang merged 4 commits into
mainfrom
claude/runtime-dashboard-editor

Conversation

@os-zhuang
Copy link
Copy Markdown
Contributor

背景

延续 #1496(视图)、#1504(报表):把运行时仪表盘编辑也统一到 studio 的 spec 驱动 inspector,消除最后一处运行时编辑引擎重复。

仪表盘比报表复杂:运行时右栏在仪表盘级(DashboardConfigPanel)与 widget 级(WidgetConfigPanel,用 flatten/unflatten 的扁平 widget config)间切换。studio 已有 widget 级 DashboardWidgetInspector,缺仪表盘级 default inspector。同样有 plugin-dashboard ↔ app-shell 的循环依赖约束。

改动(两阶段)

Stage 1 — studio 侧补齐

  • dashboard-schema.ts:从 @objectstack/specDashboardSchema/dashboardForm 派生 JSONSchema + 授权表单。
  • DashboardDefaultInspector.tsx:仪表盘级 home inspector(title/description + widgets 列表〔AddWidgetPicker 新增、重排、按 id 下钻 DashboardWidgetInspector〕 + spec 驱动 SchemaForm)。
  • 注册为 dashboard 的 default inspector;EN/ZH i18n。

Stage 2 — 运行时迁移

  • 新增单个 app-shell DashboardConfigPanel(受控组件,无内部 draft),按是否选中 widget 切换 DashboardDefaultInspector / DashboardWidgetInspector,两者都直接编辑完整嵌套 dashboard draft
  • DashboardView 用它替换两个 plugin-dashboard 旧面板;删除 flatten/unflatten/extract 等死代码(运行时不再需要)。
  • sys_dashboard 持久化不变;canvas DashboardRenderer 的 widget 选中机制不变。置于 app-shell 以避开循环依赖。

功能精简点

  • widget 的 object 字段在 inspector 里为自由文本输入(运行时无额外网络请求);旧面板的部分扁平化便捷项以 spec 表单为准。

验证

  • 合并最新 main 后 pnpm turbo run build --filter=@object-ui/app-shell:27/27 通过。
  • app-shell/src/views 测试 179 全过(含新增 dashboard-schema + DashboardDefaultInspector 测试)。
  • lint 改动文件 0 error。

遗留

  • DashboardView 组件本身无单测,迁移正确性靠 build + inspector 测试保障;建议后续补一个渲染/切换冒烟测试。

https://claude.ai/code/session_01SZW3fVCCbijEibXtEH3ZGL


Generated by Claude Code

claude added 4 commits June 6, 2026 07:28
Add a curated dashboard-level home inspector for the studio metadata editor,
mirroring ReportDefaultInspector but for the flat Dashboard document:

- dashboard-schema.ts: derive the Dashboard JSONSchema + authoring form from
  @objectstack/spec (DashboardSchema / dashboardForm), pruning curated fields
- DashboardDefaultInspector: title / description + widgets list (add via
  AddWidgetPicker, reorder, drill into the scoped DashboardWidgetInspector by
  widget id) + the spec-driven SchemaForm for layout/filters/advanced
- register as the default inspector for the 'dashboard' type
- i18n keys (en + zh) for the dashboard inspector labels

Studio-only; the runtime DashboardView is migrated separately.
…pectors

Replace BOTH legacy plugin-dashboard panels (dashboard-level DashboardConfigPanel
and per-widget WidgetConfigPanel) with a single app-shell-local DashboardConfigPanel
that hosts the studio's spec-driven inspectors, so runtime and studio share one
dashboard-editing surface:

- no widget selected -> DashboardDefaultInspector (dashboard level)
- widget selected     -> DashboardWidgetInspector (widget level)

The panel is controlled (no local draft); both inspectors edit the full nested
dashboard schema directly, so the runtime's flatten/unflatten/extract widget
adapters are removed. Lives in app-shell to avoid a circular dep on
plugin-dashboard; the sys_dashboard persistence path is unchanged.
@vercel
Copy link
Copy Markdown

vercel Bot commented Jun 6, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated (UTC)
objectui Ignored Ignored Jun 6, 2026 7:39am

Request Review

@github-actions github-actions Bot added the tests label Jun 6, 2026
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 6, 2026

✅ Console Performance Budget

Metric Value Budget
Main entry (gzip) 264.8 KB 350 KB
Entry file index-BCJOKi8k.js
Status PASS

📦 Bundle Size Report

Package Size Gzipped
app-shell (index.js) 5.77KB 2.03KB
app-shell (runtime-config.js) 4.29KB 1.54KB
app-shell (types.js) 0.01KB 0.04KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 1.17KB 0.53KB
auth (AuthProvider.js) 17.16KB 3.44KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 4.79KB 1.88KB
auth (LoginForm.js) 5.11KB 1.92KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.63KB 2.15KB
auth (SocialSignInButtons.js) 8.89KB 3.61KB
auth (UserMenu.js) 3.40KB 1.22KB
auth (authStyles.js) 5.04KB 1.72KB
auth (createAuthClient.js) 22.29KB 5.30KB
auth (createAuthenticatedFetch.js) 3.33KB 1.32KB
auth (index.js) 1.75KB 0.76KB
auth (types.js) 0.59KB 0.35KB
auth (useAuth.js) 4.01KB 0.79KB
auth (useIsWorkspaceAdmin.js) 1.28KB 0.70KB
collaboration (CommentThread.js) 18.38KB 4.49KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 3.65KB 1.42KB
collaboration (PresenceProvider.js) 2.42KB 0.96KB
collaboration (index.js) 1.25KB 0.53KB
collaboration (useCommentSearch.js) 1.98KB 0.88KB
collaboration (useConflictResolution.js) 7.75KB 1.86KB
collaboration (useMentionNotifications.js) 1.81KB 0.68KB
collaboration (usePresence.js) 6.33KB 1.84KB
collaboration (useRealtimeSubscription.js) 7.91KB 2.01KB
components (index.js) 397.93KB 84.13KB
core (index.js) 1.45KB 0.54KB
create-plugin (index.js) 9.28KB 2.98KB
data-objectstack (index.js) 90.43KB 22.43KB
fields (index.js) 144.92KB 34.19KB
i18n (i18n.js) 4.32KB 1.77KB
i18n (index.js) 2.27KB 0.91KB
i18n (provider.js) 5.37KB 1.72KB
i18n (useObjectLabel.js) 18.42KB 4.30KB
i18n (useSafeTranslation.js) 1.63KB 0.57KB
layout (index.js) 36.05KB 9.94KB
mobile (MobileProvider.js) 0.92KB 0.49KB
mobile (ResponsiveContainer.js) 0.94KB 0.38KB
mobile (breakpoints.js) 1.51KB 0.70KB
mobile (createOfflineDataSource.js) 5.61KB 1.74KB
mobile (index.js) 1.50KB 0.62KB
mobile (offlineQueue.js) 3.91KB 1.35KB
mobile (pwa.js) 0.97KB 0.49KB
mobile (serviceWorker.js) 1.48KB 0.62KB
mobile (serviceWorkerSource.js) 3.41KB 1.48KB
mobile (useBreakpoint.js) 1.54KB 0.65KB
mobile (useGesture.js) 4.42KB 1.27KB
mobile (useOfflineSync.js) 1.99KB 0.72KB
mobile (usePullToRefresh.js) 2.53KB 0.85KB
mobile (useResponsive.js) 0.71KB 0.42KB
mobile (useResponsiveConfig.js) 1.36KB 0.63KB
mobile (useSpecGesture.js) 1.77KB 0.77KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 4.87KB 1.77KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 3.11KB 0.87KB
permissions (evaluator.js) 4.00KB 1.23KB
permissions (index.js) 0.91KB 0.41KB
permissions (store.js) 0.91KB 0.42KB
permissions (useFieldPermissions.js) 1.28KB 0.52KB
permissions (usePermissions.js) 1.42KB 0.68KB
plugin-ai (index.js) 15.71KB 3.79KB
plugin-calendar (index.js) 45.98KB 12.65KB
plugin-charts (index.js) 39.09KB 11.07KB
plugin-chatbot (index.js) 115.56KB 28.13KB
plugin-dashboard (index.js) 87.61KB 20.96KB
plugin-designer (index.js) 213.42KB 42.94KB
plugin-detail (index.js) 192.46KB 46.34KB
plugin-editor (index.js) 2.38KB 1.06KB
plugin-form (index.js) 72.79KB 16.89KB
plugin-gantt (index.js) 28.30KB 7.76KB
plugin-grid (index.js) 110.04KB 29.58KB
plugin-kanban (index.js) 48.82KB 13.13KB
plugin-list (index.js) 89.76KB 21.04KB
plugin-map (index.js) 16.02KB 4.98KB
plugin-markdown (index.js) 2.62KB 1.18KB
plugin-report (index.js) 129.03KB 28.39KB
plugin-timeline (index.js) 25.37KB 7.20KB
plugin-view (index.js) 81.50KB 19.86KB
plugin-workflow (index.js) 69.35KB 14.42KB
providers (DataSourceProvider.js) 0.75KB 0.39KB
providers (MetadataProvider.js) 1.37KB 0.59KB
providers (ThemeProvider.js) 1.55KB 0.67KB
providers (UploadProvider.js) 11.71KB 3.53KB
providers (index.js) 0.44KB 0.22KB
providers (types.js) 0.01KB 0.04KB
react (LazyPluginLoader.js) 3.77KB 1.33KB
react (SchemaRenderer.js) 14.98KB 4.84KB
react (index.js) 0.76KB 0.42KB
tenant (TenantContext.js) 0.31KB 0.25KB
tenant (TenantGuard.js) 1.04KB 0.43KB
tenant (TenantProvider.js) 2.76KB 0.98KB
tenant (TenantScopedQuery.js) 0.77KB 0.44KB
tenant (index.js) 0.75KB 0.38KB
tenant (resolver.js) 2.64KB 0.76KB
tenant (useTenant.js) 0.50KB 0.32KB
tenant (useTenantBranding.js) 0.62KB 0.39KB
types (ai.js) 0.20KB 0.17KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 2.87KB 0.99KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (complex.js) 0.20KB 0.18KB
types (crud.js) 0.20KB 0.18KB
types (data-display.js) 0.20KB 0.18KB
types (data-protocol.js) 0.20KB 0.19KB
types (data.js) 0.20KB 0.18KB
types (designer.js) 0.77KB 0.41KB
types (disclosure.js) 0.20KB 0.18KB
types (feedback.js) 0.20KB 0.18KB
types (field-types.js) 0.20KB 0.18KB
types (form.js) 0.20KB 0.18KB
types (index.js) 1.54KB 0.68KB
types (layout.js) 0.20KB 0.18KB
types (mobile.js) 0.20KB 0.18KB
types (navigation.js) 0.20KB 0.18KB
types (objectql.js) 0.20KB 0.18KB
types (overlay.js) 0.20KB 0.18KB
types (permissions.js) 0.20KB 0.18KB
types (plugin-scope.js) 0.20KB 0.18KB
types (record-components.js) 0.20KB 0.19KB
types (registry.js) 0.20KB 0.18KB
types (reports.js) 0.20KB 0.18KB
types (spec-report.js) 4.80KB 1.76KB
types (tenant.js) 0.20KB 0.18KB
types (theme.js) 0.20KB 0.18KB
types (ui-action.js) 0.75KB 0.46KB
types (views.js) 0.20KB 0.18KB
types (widget.js) 0.20KB 0.18KB
types (workflow.js) 0.20KB 0.18KB

Size Limits

  • ✅ Core packages should be < 50KB gzipped
  • ✅ Component packages should be < 100KB gzipped
  • ⚠️ Plugin packages should be < 150KB gzipped

@os-zhuang os-zhuang marked this pull request as ready for review June 6, 2026 07:45
@os-zhuang os-zhuang merged commit 010883d into main Jun 6, 2026
10 checks passed
@os-zhuang os-zhuang deleted the claude/runtime-dashboard-editor branch June 6, 2026 07:45
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants