Skip to content

feat: ADR-0047 implementation (objectui) — spec tabs render, visualization switcher, interface pages#1678

Merged
xuyushun441-sys merged 3 commits into
mainfrom
feat/adr-0047-run-modes
Jun 12, 2026
Merged

feat: ADR-0047 implementation (objectui) — spec tabs render, visualization switcher, interface pages#1678
xuyushun441-sys merged 3 commits into
mainfrom
feat/adr-0047-run-modes

Conversation

@xuyushun441-sys

Copy link
Copy Markdown
Contributor

Implements the objectui side of ADR-0047 (phases 2, 4). Companion to framework#1792.

Phase 2 — data mode

  • ObjectView forwards viewDef.tabs (spec ViewTab metadata was stored and served but never rendered — the one-line gap) and viewDef.appearance, and enables the dormant ViewSwitcher when the author whitelists >1 visualization
  • ListView.handleTabChange accepts the canonical ViewFilterRule[] tab-filter shape (was silently ignored); mapOperator learns spec snake_case operators
  • availableViews = author whitelist ∩ capability-resolvable types (kanban needs a groupBy, calendar a date field) instead of trusting the whitelist blindly
  • UserFilters tabs element normalizes spec ViewTab presets

Phase 4 — interface mode

  • New InterfaceListPage: binds interfaceConfig.source/sourceView to the merged object definition, inherits columns/filter/sort from the referenced view (iron rule), overlays page presentation policy (userFilters / locked visualization / closed toolbar). PageView routes pages carrying interfaceConfig.source to it
  • Hydrates hollow ADR-0017 expansion items through listViewOverrides()/getView()

Bug fixes found during live verification

  • data-objectstack getView() passed the object name as the metadata TYPE (hit /meta/<object>/<view>, always 404 — latent since ADR-0017)
  • ListView reads showViewSwitcher from the schema as well as the prop

Verified live (app-showcase + console)

  • Data mode showcase_task: metadata filter tabs (All/In Progress/Urgent/Done — tab click filters 10→2), metadata dropdowns (状态/优先级/done), Grid|Kanban|Gallery|Calendar switcher, kanban groups by status
  • Interface mode Task Workbench: inherited columns, page-curated dropdowns only, locked grid, no view management/advanced filter/export, dropdown filter 10→2

🤖 Generated with Claude Code

os-zhuang and others added 3 commits June 12, 2026 18:24
…t∩capability visualization switcher

- ObjectView forwards viewDef.tabs (spec ViewTab metadata was stored and
  served but never rendered) and viewDef.appearance (allowedVisualizations
  whitelist), and turns on the dormant ViewSwitcher when the author
  whitelisted more than one type
- ListView.handleTabChange accepts the canonical ViewFilterRule[] tab
  filter shape (was silently ignored — only the legacy FilterGroup worked);
  mapOperator learns the spec snake_case operators
- availableViews: effective options = author whitelist ∩ capability-
  resolvable types (kanban needs groupBy, calendar a date field, …) instead
  of trusting the whitelist blindly; chart included
- UserFilters tabs element normalizes spec ViewTab presets
  ({name,filter,isDefault} → {id,filters,default})

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…(interface mode)

InterfaceListPage binds interfaceConfig.source/sourceView to the merged
object definition, inherits columns/filter/sort from the referenced view
(the iron rule), and overlays the page's presentation policy: userFilters,
appearance.allowedVisualizations (single entry = no switcher), userActions
toggles (closed-by-default toolbar — no advanced filter builder, no view
management, no export). PageView routes pages carrying
interfaceConfig.source to this surface instead of the region renderer.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ollow-view hydration, getView type bug

- ListView reads showViewSwitcher from the schema too (ObjectView/
  InterfaceListPage stamp it there; the prop-only read left the switcher
  permanently hidden)
- InterfaceListPage: prefer source-view candidates that actually carry
  columns, and hydrate hollow ADR-0017 expansion items through
  listViewOverrides()/getView() — the same path ObjectView uses
- data-objectstack getView(): pass 'view' as the metadata type instead of
  the object name (hit /meta/<object>/<view> and always 404ed — latent
  since ADR-0017)

All verified live in the browser: data mode (tabs + dropdowns + Grid/
Kanban/Gallery/Calendar switcher, tab filter 10→2 records) and interface
mode (inherited columns, page-curated dropdowns only, locked grid,
closed toolbar, dropdown filter 10→2 records).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@vercel

vercel Bot commented Jun 12, 2026

Copy link
Copy Markdown

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

1 Skipped Deployment
Project Deployment Actions Updated (UTC)
objectui Ignored Ignored Jun 12, 2026 3:57pm

Request Review

@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

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

📦 Bundle Size Report

Package Size Gzipped
app-shell (index.js) 5.95KB 2.10KB
app-shell (runtime-config.js) 4.40KB 1.57KB
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) 399.21KB 84.50KB
core (index.js) 1.45KB 0.54KB
create-plugin (index.js) 9.28KB 2.98KB
data-objectstack (index.js) 96.04KB 23.89KB
fields (index.js) 157.36KB 37.46KB
i18n (i18n.js) 4.32KB 1.77KB
i18n (index.js) 2.27KB 0.91KB
i18n (provider.js) 5.37KB 1.72KB
i18n (useObjectLabel.js) 19.40KB 4.48KB
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.79KB 11.29KB
plugin-chatbot (index.js) 132.57KB 32.40KB
plugin-dashboard (index.js) 93.20KB 22.36KB
plugin-designer (index.js) 213.42KB 42.94KB
plugin-detail (index.js) 192.76KB 46.42KB
plugin-editor (index.js) 2.38KB 1.06KB
plugin-form (index.js) 89.69KB 21.45KB
plugin-gantt (index.js) 28.30KB 7.76KB
plugin-grid (index.js) 110.17KB 29.64KB
plugin-kanban (index.js) 48.82KB 13.13KB
plugin-list (index.js) 91.24KB 21.46KB
plugin-map (index.js) 16.02KB 4.98KB
plugin-markdown (index.js) 2.62KB 1.18KB
plugin-report (index.js) 34.79KB 9.13KB
plugin-timeline (index.js) 25.37KB 7.20KB
plugin-view (index.js) 81.53KB 19.87KB
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) 5.26KB 1.96KB
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

Size Limits

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

@xuyushun441-sys xuyushun441-sys merged commit 5cdb0c9 into main Jun 12, 2026
10 checks passed
@xuyushun441-sys xuyushun441-sys deleted the feat/adr-0047-run-modes branch June 12, 2026 16:28
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants