@object-ui/app-shell 6.2.3 → 7.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +948 -0
- package/README.md +292 -0
- package/dist/assistant/assistantBus.d.ts +72 -0
- package/dist/assistant/assistantBus.js +133 -0
- package/dist/chrome/CommandPalette.d.ts +1 -1
- package/dist/chrome/CommandPalette.js +26 -22
- package/dist/chrome/ConditionalAuthWrapper.d.ts +1 -1
- package/dist/chrome/ConsoleToaster.d.ts +1 -1
- package/dist/chrome/ConsoleToaster.js +3 -1
- package/dist/chrome/ErrorBoundary.d.ts +1 -1
- package/dist/chrome/KeyboardShortcutsDialog.d.ts +1 -1
- package/dist/chrome/KeyboardShortcutsDialog.js +16 -5
- package/dist/chrome/LoadingScreen.d.ts +1 -1
- package/dist/chrome/LoadingScreen.js +22 -26
- package/dist/chrome/RouteFader.d.ts +1 -1
- package/dist/chrome/ThemeProvider.d.ts +1 -1
- package/dist/components/ManagedByBadge.d.ts +1 -1
- package/dist/console/AppContent.d.ts +1 -1
- package/dist/console/AppContent.js +170 -37
- package/dist/console/ConsoleShell.d.ts +7 -7
- package/dist/console/ConsoleShell.js +32 -3
- package/dist/console/ai/AiChatPage.d.ts +88 -1
- package/dist/console/ai/AiChatPage.js +743 -66
- package/dist/console/ai/ConversationsSidebar.d.ts +26 -1
- package/dist/console/ai/ConversationsSidebar.js +149 -34
- package/dist/console/ai/LiveCanvas.d.ts +22 -0
- package/dist/console/ai/LiveCanvas.js +78 -0
- package/dist/console/ai/reconcileTurn.d.ts +8 -0
- package/dist/console/ai/reconcileTurn.js +20 -0
- package/dist/console/auth/AuthPageLayout.d.ts +1 -1
- package/dist/console/auth/ForgotPasswordPage.d.ts +1 -1
- package/dist/console/auth/LoginPage.d.ts +1 -1
- package/dist/console/auth/RegisterPage.d.ts +1 -1
- package/dist/console/auth/RegisterPage.js +23 -3
- package/dist/console/cloud-connection/CloudConnectionPanel.d.ts +1 -0
- package/dist/console/cloud-connection/CloudConnectionPanel.js +169 -0
- package/dist/console/home/AppCard.d.ts +1 -1
- package/dist/console/home/AppCard.js +6 -12
- package/dist/console/home/HomeAppsStrip.d.ts +8 -0
- package/dist/console/home/HomeAppsStrip.js +61 -0
- package/dist/console/home/HomeLayout.d.ts +1 -1
- package/dist/console/home/HomeLayout.js +3 -1
- package/dist/console/home/HomePage.d.ts +1 -2
- package/dist/console/home/HomePage.js +149 -21
- package/dist/console/home/HomeRail.d.ts +22 -0
- package/dist/console/home/HomeRail.js +62 -0
- package/dist/console/home/QuickActions.d.ts +1 -1
- package/dist/console/home/QuickActions.js +3 -11
- package/dist/console/home/RecentApps.d.ts +1 -1
- package/dist/console/home/RecentApps.js +2 -2
- package/dist/console/home/StarredApps.d.ts +1 -1
- package/dist/console/home/StarredApps.js +2 -2
- package/dist/console/marketplace/InstalledListWidget.d.ts +1 -0
- package/dist/console/marketplace/InstalledListWidget.js +93 -0
- package/dist/console/marketplace/MarkdownText.d.ts +1 -1
- package/dist/console/marketplace/MarketplaceAccessDenied.d.ts +1 -1
- package/dist/console/marketplace/MarketplaceInstalledPage.d.ts +8 -14
- package/dist/console/marketplace/MarketplaceInstalledPage.js +14 -66
- package/dist/console/marketplace/MarketplacePackagePage.d.ts +1 -1
- package/dist/console/marketplace/MarketplacePackagePage.js +249 -8
- package/dist/console/marketplace/MarketplacePage.d.ts +1 -1
- package/dist/console/marketplace/MarketplacePage.js +60 -3
- package/dist/console/marketplace/PackageIcon.d.ts +1 -1
- package/dist/console/marketplace/PluginDisclosure.d.ts +14 -0
- package/dist/console/marketplace/PluginDisclosure.js +38 -0
- package/dist/console/marketplace/marketplaceApi.d.ts +123 -0
- package/dist/console/marketplace/marketplaceApi.js +254 -1
- package/dist/console/organizations/CreateWorkspaceDialog.d.ts +1 -1
- package/dist/console/organizations/OrganizationsLayout.d.ts +1 -1
- package/dist/console/organizations/OrganizationsPage.d.ts +1 -1
- package/dist/console/organizations/manage/AcceptInvitationPage.d.ts +1 -1
- package/dist/console/organizations/manage/InvitationsPage.d.ts +1 -1
- package/dist/console/organizations/manage/InviteMemberDialog.d.ts +1 -1
- package/dist/console/organizations/manage/MembersPage.d.ts +1 -1
- package/dist/console/organizations/manage/OrganizationLayout.d.ts +1 -1
- package/dist/console/organizations/manage/SettingsPage.d.ts +1 -1
- package/dist/context/CommandPaletteProvider.d.ts +44 -0
- package/dist/context/CommandPaletteProvider.js +71 -0
- package/dist/context/FavoritesProvider.d.ts +1 -1
- package/dist/context/NavigationContext.d.ts +1 -1
- package/dist/context/RecentItemsProvider.d.ts +2 -2
- package/dist/context/UserStateAdapters.d.ts +1 -1
- package/dist/context/index.d.ts +2 -0
- package/dist/context/index.js +1 -0
- package/dist/hooks/index.d.ts +5 -2
- package/dist/hooks/index.js +4 -1
- package/dist/hooks/useActionModal.d.ts +53 -0
- package/dist/hooks/useActionModal.js +111 -0
- package/dist/hooks/useChatConversation.d.ts +107 -4
- package/dist/hooks/useChatConversation.js +253 -25
- package/dist/hooks/useConsoleActionRuntime.d.ts +70 -0
- package/dist/hooks/useConsoleActionRuntime.js +560 -0
- package/dist/hooks/useConversationList.js +61 -3
- package/dist/hooks/useHomeInbox.d.ts +13 -0
- package/dist/hooks/useHomeInbox.js +142 -0
- package/dist/hooks/useNavPins.js +17 -23
- package/dist/hooks/useNavigationSync.d.ts +33 -0
- package/dist/hooks/useNavigationSync.js +98 -12
- package/dist/hooks/useReconcileOnError.d.ts +40 -0
- package/dist/hooks/useReconcileOnError.js +37 -0
- package/dist/hooks/useRecordApprovals.d.ts +18 -19
- package/dist/hooks/useRecordApprovals.js +24 -40
- package/dist/hooks/useResponsiveSidebar.js +14 -5
- package/dist/hooks/useSettleSignal.d.ts +19 -0
- package/dist/hooks/useSettleSignal.js +20 -0
- package/dist/hooks/useTrackRouteAsRecent.js +35 -0
- package/dist/hooks/useUrlOverlay.d.ts +62 -0
- package/dist/hooks/useUrlOverlay.js +88 -0
- package/dist/index.d.ts +16 -7
- package/dist/index.js +12 -4
- package/dist/layout/ActivityFeed.d.ts +1 -1
- package/dist/layout/AppHeader.d.ts +3 -2
- package/dist/layout/AppHeader.js +237 -72
- package/dist/layout/AppSidebar.d.ts +2 -1
- package/dist/layout/AppSidebar.js +26 -46
- package/dist/layout/AppSwitcher.d.ts +2 -1
- package/dist/layout/AppSwitcher.js +9 -5
- package/dist/layout/AuthPageLayout.d.ts +1 -1
- package/dist/layout/ConnectionStatus.d.ts +1 -1
- package/dist/layout/ConnectionStatus.js +9 -6
- package/dist/layout/ConsoleChatbotFab.d.ts +19 -1
- package/dist/layout/ConsoleChatbotFab.js +16 -2
- package/dist/layout/ConsoleFloatingChatbot.d.ts +32 -2
- package/dist/layout/ConsoleFloatingChatbot.js +374 -41
- package/dist/layout/ConsoleLayout.d.ts +1 -1
- package/dist/layout/ConsoleLayout.js +27 -11
- package/dist/layout/ContextSelectors.d.ts +44 -0
- package/dist/layout/ContextSelectors.js +218 -0
- package/dist/layout/InboxPopover.d.ts +6 -1
- package/dist/layout/InboxPopover.js +25 -6
- package/dist/layout/LocaleSwitcher.d.ts +1 -1
- package/dist/layout/LocalizedSidebarTrigger.d.ts +2 -0
- package/dist/layout/LocalizedSidebarTrigger.js +15 -0
- package/dist/layout/MobileViewSwitcherContext.d.ts +1 -1
- package/dist/layout/ModeToggle.d.ts +1 -1
- package/dist/layout/PageHeader.d.ts +1 -1
- package/dist/layout/UnifiedSidebar.d.ts +2 -1
- package/dist/layout/UnifiedSidebar.js +116 -15
- package/dist/observability/index.d.ts +1 -0
- package/dist/observability/index.js +1 -0
- package/dist/observability/settleSignal.d.ts +64 -0
- package/dist/observability/settleSignal.js +131 -0
- package/dist/preview/DraftChangesPanel.d.ts +19 -0
- package/dist/preview/DraftChangesPanel.js +114 -0
- package/dist/preview/DraftPreviewBar.d.ts +8 -0
- package/dist/preview/DraftPreviewBar.js +86 -0
- package/dist/preview/PreviewDraftEmptyState.d.ts +16 -0
- package/dist/preview/PreviewDraftEmptyState.js +47 -0
- package/dist/preview/PreviewModeContext.d.ts +57 -0
- package/dist/preview/PreviewModeContext.js +99 -0
- package/dist/preview/UnpublishedAppBar.d.ts +8 -0
- package/dist/preview/UnpublishedAppBar.js +79 -0
- package/dist/preview/draftStatus.d.ts +20 -0
- package/dist/preview/draftStatus.js +27 -0
- package/dist/preview/usePublishAllDrafts.d.ts +18 -0
- package/dist/preview/usePublishAllDrafts.js +106 -0
- package/dist/providers/AdapterProvider.d.ts +1 -1
- package/dist/providers/AdapterProvider.js +6 -1
- package/dist/providers/ExpressionProvider.d.ts +1 -1
- package/dist/providers/MetadataProvider.d.ts +17 -2
- package/dist/providers/MetadataProvider.js +183 -12
- package/dist/runtime-config.d.ts +46 -2
- package/dist/runtime-config.js +39 -2
- package/dist/services/builtinComponents.js +68 -59
- package/dist/skeletons/SkeletonDashboard.d.ts +1 -1
- package/dist/skeletons/SkeletonDetail.d.ts +1 -1
- package/dist/skeletons/SkeletonGrid.d.ts +1 -1
- package/dist/utils/appRoute.d.ts +21 -0
- package/dist/utils/appRoute.js +25 -0
- package/dist/utils/deriveRelatedLists.d.ts +54 -0
- package/dist/utils/deriveRelatedLists.js +91 -0
- package/dist/utils/index.d.ts +4 -0
- package/dist/utils/index.js +3 -0
- package/dist/utils/managedByEmptyState.d.ts +8 -1
- package/dist/utils/managedByEmptyState.js +13 -7
- package/dist/utils/preferLocal.d.ts +18 -0
- package/dist/utils/preferLocal.js +24 -0
- package/dist/views/ActionConfirmDialog.d.ts +1 -1
- package/dist/views/ActionConfirmDialog.js +3 -1
- package/dist/views/ActionParamDialog.d.ts +6 -1
- package/dist/views/ActionParamDialog.js +9 -3
- package/dist/views/ActionResultDialog.d.ts +13 -0
- package/dist/views/ActionResultDialog.js +134 -0
- package/dist/views/ComponentNavView.d.ts +14 -1
- package/dist/views/CreateViewDialog.d.ts +1 -1
- package/dist/views/DashboardConfigPanel.d.ts +28 -0
- package/dist/views/DashboardConfigPanel.js +81 -0
- package/dist/views/DashboardView.d.ts +4 -3
- package/dist/views/DashboardView.js +38 -239
- package/dist/views/FlowRunner.d.ts +59 -0
- package/dist/views/FlowRunner.js +153 -0
- package/dist/views/InterfaceListPage.d.ts +49 -0
- package/dist/views/InterfaceListPage.js +347 -0
- package/dist/views/MetadataInspector.d.ts +2 -2
- package/dist/views/ObjectView.d.ts +1 -1
- package/dist/views/ObjectView.js +209 -532
- package/dist/views/PageView.d.ts +8 -3
- package/dist/views/PageView.js +45 -32
- package/dist/views/RecordDetailView.d.ts +1 -1
- package/dist/views/RecordDetailView.js +363 -148
- package/dist/views/RecordFormPage.d.ts +1 -1
- package/dist/views/RecordFormPage.js +26 -1
- package/dist/views/ReportConfigPanel.d.ts +37 -0
- package/dist/views/ReportConfigPanel.js +85 -0
- package/dist/views/ReportView.d.ts +1 -1
- package/dist/views/ReportView.js +116 -7
- package/dist/views/RuntimeDraftBar.d.ts +30 -0
- package/dist/views/RuntimeDraftBar.js +112 -0
- package/dist/views/SearchResultsPage.d.ts +1 -1
- package/dist/views/SearchResultsPage.js +8 -18
- package/dist/views/ViewConfigPanel.d.ts +24 -17
- package/dist/views/ViewConfigPanel.js +121 -77
- package/dist/views/index.d.ts +1 -1
- package/dist/views/index.js +1 -1
- package/dist/views/metadata-admin/AuditPanel.d.ts +28 -0
- package/dist/views/metadata-admin/AuditPanel.js +79 -0
- package/dist/views/metadata-admin/DiagnosticsPage.d.ts +20 -0
- package/dist/views/metadata-admin/DiagnosticsPage.js +69 -0
- package/dist/views/metadata-admin/DirectoryPage.d.ts +16 -1
- package/dist/views/metadata-admin/DirectoryPage.js +113 -24
- package/dist/views/metadata-admin/DraftReviewPanel.d.ts +33 -0
- package/dist/views/metadata-admin/DraftReviewPanel.js +77 -0
- package/dist/views/metadata-admin/EmbeddedItemEditor.d.ts +17 -1
- package/dist/views/metadata-admin/EmbeddedItemEditor.js +15 -8
- package/dist/views/metadata-admin/JsonSourceEditor.d.ts +37 -0
- package/dist/views/metadata-admin/JsonSourceEditor.js +178 -0
- package/dist/views/metadata-admin/LayeredDiff.d.ts +39 -1
- package/dist/views/metadata-admin/LayeredDiff.js +171 -5
- package/dist/views/metadata-admin/MetadataDetailDrawer.d.ts +15 -1
- package/dist/views/metadata-admin/MetadataTypeActions.d.ts +48 -0
- package/dist/views/metadata-admin/MetadataTypeActions.js +165 -0
- package/dist/views/metadata-admin/PackagesPage.d.ts +18 -0
- package/dist/views/metadata-admin/PackagesPage.js +395 -0
- package/dist/views/metadata-admin/PageShell.d.ts +1 -1
- package/dist/views/metadata-admin/PageShell.js +9 -4
- package/dist/views/metadata-admin/PermissionMatrixEditor.d.ts +35 -1
- package/dist/views/metadata-admin/QuickFind.d.ts +21 -1
- package/dist/views/metadata-admin/QuickFind.js +6 -3
- package/dist/views/metadata-admin/RelatedPanel.d.ts +24 -1
- package/dist/views/metadata-admin/RelatedPanel.js +20 -18
- package/dist/views/metadata-admin/ResourceEditPage.d.ts +40 -1
- package/dist/views/metadata-admin/ResourceEditPage.js +1223 -60
- package/dist/views/metadata-admin/ResourceHistoryPage.d.ts +39 -1
- package/dist/views/metadata-admin/ResourceHistoryPage.js +66 -16
- package/dist/views/metadata-admin/ResourceListPage.d.ts +13 -1
- package/dist/views/metadata-admin/ResourceListPage.js +266 -30
- package/dist/views/metadata-admin/ResourceRouter.d.ts +23 -1
- package/dist/views/metadata-admin/SchemaForm.d.ts +34 -1
- package/dist/views/metadata-admin/SchemaForm.js +559 -49
- package/dist/views/metadata-admin/StudioHomePage.d.ts +22 -0
- package/dist/views/metadata-admin/StudioHomePage.js +213 -0
- package/dist/views/metadata-admin/anchors.js +237 -24
- package/dist/views/metadata-admin/clientValidation.d.ts +50 -0
- package/dist/views/metadata-admin/clientValidation.js +169 -0
- package/dist/views/metadata-admin/color-variant-field.d.ts +30 -0
- package/dist/views/metadata-admin/color-variant-field.js +38 -0
- package/dist/views/metadata-admin/createDerive.d.ts +75 -0
- package/dist/views/metadata-admin/createDerive.js +179 -0
- package/dist/views/metadata-admin/dashboard-schema.d.ts +12 -0
- package/dist/views/metadata-admin/dashboard-schema.js +80 -0
- package/dist/views/metadata-admin/datasource/DatasourceResourcePage.d.ts +35 -0
- package/dist/views/metadata-admin/datasource/DatasourceResourcePage.js +327 -0
- package/dist/views/metadata-admin/datasource/register.d.ts +1 -0
- package/dist/views/metadata-admin/datasource/register.js +24 -0
- package/dist/views/metadata-admin/default-inspector-registry.d.ts +49 -0
- package/dist/views/metadata-admin/default-inspector-registry.js +8 -0
- package/dist/views/metadata-admin/default-schemas.js +115 -10
- package/dist/views/metadata-admin/external/ExternalDatasourcePanel.d.ts +27 -0
- package/dist/views/metadata-admin/external/ExternalDatasourcePanel.js +69 -0
- package/dist/views/metadata-admin/external/ImportObjectDialog.d.ts +27 -0
- package/dist/views/metadata-admin/external/ImportObjectDialog.js +77 -0
- package/dist/views/metadata-admin/external/SchemaBrowser.d.ts +16 -0
- package/dist/views/metadata-admin/external/SchemaBrowser.js +74 -0
- package/dist/views/metadata-admin/external/ValidationPanel.d.ts +16 -0
- package/dist/views/metadata-admin/external/ValidationPanel.js +68 -0
- package/dist/views/metadata-admin/external/api.d.ts +100 -0
- package/dist/views/metadata-admin/external/api.js +124 -0
- package/dist/views/metadata-admin/i18n.d.ts +1 -0
- package/dist/views/metadata-admin/i18n.js +1166 -2
- package/dist/views/metadata-admin/index.d.ts +8 -5
- package/dist/views/metadata-admin/index.js +12 -2
- package/dist/views/metadata-admin/inspector-registry.d.ts +51 -0
- package/dist/views/metadata-admin/inspector-registry.js +11 -0
- package/dist/views/metadata-admin/inspectors/ActionDefaultInspector.d.ts +30 -0
- package/dist/views/metadata-admin/inspectors/ActionDefaultInspector.js +180 -0
- package/dist/views/metadata-admin/inspectors/AppNavInspector.d.ts +16 -0
- package/dist/views/metadata-admin/inspectors/AppNavInspector.js +110 -0
- package/dist/views/metadata-admin/inspectors/ConditionBuilder.d.ts +29 -0
- package/dist/views/metadata-admin/inspectors/ConditionBuilder.js +154 -0
- package/dist/views/metadata-admin/inspectors/DashboardDefaultInspector.d.ts +28 -0
- package/dist/views/metadata-admin/inspectors/DashboardDefaultInspector.js +110 -0
- package/dist/views/metadata-admin/inspectors/DashboardWidgetInspector.d.ts +18 -0
- package/dist/views/metadata-admin/inspectors/DashboardWidgetInspector.js +139 -0
- package/dist/views/metadata-admin/inspectors/DatasetDefaultInspector.d.ts +21 -0
- package/dist/views/metadata-admin/inspectors/DatasetDefaultInspector.js +107 -0
- package/dist/views/metadata-admin/inspectors/FlowEdgeInspector.d.ts +16 -0
- package/dist/views/metadata-admin/inspectors/FlowEdgeInspector.js +45 -0
- package/dist/views/metadata-admin/inspectors/FlowInspector.d.ts +12 -0
- package/dist/views/metadata-admin/inspectors/FlowInspector.js +9 -0
- package/dist/views/metadata-admin/inspectors/FlowKeyValueField.d.ts +30 -0
- package/dist/views/metadata-admin/inspectors/FlowKeyValueField.js +125 -0
- package/dist/views/metadata-admin/inspectors/FlowNodeConfigField.d.ts +18 -0
- package/dist/views/metadata-admin/inspectors/FlowNodeConfigField.js +40 -0
- package/dist/views/metadata-admin/inspectors/FlowNodeInspector.d.ts +14 -0
- package/dist/views/metadata-admin/inspectors/FlowNodeInspector.js +140 -0
- package/dist/views/metadata-admin/inspectors/FlowObjectListField.d.ts +26 -0
- package/dist/views/metadata-admin/inspectors/FlowObjectListField.js +105 -0
- package/dist/views/metadata-admin/inspectors/FlowReferenceField.d.ts +83 -0
- package/dist/views/metadata-admin/inspectors/FlowReferenceField.js +181 -0
- package/dist/views/metadata-admin/inspectors/FlowStringListField.d.ts +21 -0
- package/dist/views/metadata-admin/inspectors/FlowStringListField.js +60 -0
- package/dist/views/metadata-admin/inspectors/InspectorComboField.d.ts +40 -0
- package/dist/views/metadata-admin/inspectors/InspectorComboField.js +61 -0
- package/dist/views/metadata-admin/inspectors/ObjectDefaultInspector.d.ts +21 -0
- package/dist/views/metadata-admin/inspectors/ObjectDefaultInspector.js +54 -0
- package/dist/views/metadata-admin/inspectors/ObjectFieldInspector.d.ts +23 -0
- package/dist/views/metadata-admin/inspectors/ObjectFieldInspector.js +330 -0
- package/dist/views/metadata-admin/inspectors/PageBlockInspector.d.ts +48 -0
- package/dist/views/metadata-admin/inspectors/PageBlockInspector.js +332 -0
- package/dist/views/metadata-admin/inspectors/ReportDefaultInspector.d.ts +58 -0
- package/dist/views/metadata-admin/inspectors/ReportDefaultInspector.js +160 -0
- package/dist/views/metadata-admin/inspectors/ViewColumnInspector.d.ts +19 -0
- package/dist/views/metadata-admin/inspectors/ViewColumnInspector.js +144 -0
- package/dist/views/metadata-admin/inspectors/ViewInspector.d.ts +19 -0
- package/dist/views/metadata-admin/inspectors/ViewInspector.js +21 -0
- package/dist/views/metadata-admin/inspectors/ViewVariantInspector.d.ts +54 -0
- package/dist/views/metadata-admin/inspectors/ViewVariantInspector.js +191 -0
- package/dist/views/metadata-admin/inspectors/_shared.d.ts +124 -0
- package/dist/views/metadata-admin/inspectors/_shared.js +113 -0
- package/dist/views/metadata-admin/inspectors/expression-validate.d.ts +26 -0
- package/dist/views/metadata-admin/inspectors/expression-validate.js +66 -0
- package/dist/views/metadata-admin/inspectors/flow-node-config.d.ts +143 -0
- package/dist/views/metadata-admin/inspectors/flow-node-config.js +461 -0
- package/dist/views/metadata-admin/inspectors/index.d.ts +1 -0
- package/dist/views/metadata-admin/inspectors/index.js +45 -0
- package/dist/views/metadata-admin/inspectors/json-schema-to-fields.d.ts +40 -0
- package/dist/views/metadata-admin/inspectors/json-schema-to-fields.js +227 -0
- package/dist/views/metadata-admin/inspectors/useDatasetFields.d.ts +72 -0
- package/dist/views/metadata-admin/inspectors/useDatasetFields.js +0 -0
- package/dist/views/metadata-admin/mergeServerFields.d.ts +65 -0
- package/dist/views/metadata-admin/mergeServerFields.js +56 -0
- package/dist/views/metadata-admin/preview-registry.d.ts +55 -0
- package/dist/views/metadata-admin/previews/ActionPreview.d.ts +25 -0
- package/dist/views/metadata-admin/previews/ActionPreview.js +238 -0
- package/dist/views/metadata-admin/previews/AddWidgetPicker.d.ts +12 -0
- package/dist/views/metadata-admin/previews/AddWidgetPicker.js +56 -0
- package/dist/views/metadata-admin/previews/AgentPreview.d.ts +24 -0
- package/dist/views/metadata-admin/previews/AgentPreview.js +100 -0
- package/dist/views/metadata-admin/previews/AppNavCanvas.d.ts +31 -0
- package/dist/views/metadata-admin/previews/AppNavCanvas.js +260 -0
- package/dist/views/metadata-admin/previews/AppPreview.d.ts +16 -1
- package/dist/views/metadata-admin/previews/AppPreview.js +23 -14
- package/dist/views/metadata-admin/previews/BookPreview.d.ts +20 -0
- package/dist/views/metadata-admin/previews/BookPreview.js +132 -0
- package/dist/views/metadata-admin/previews/DashboardPreview.d.ts +16 -1
- package/dist/views/metadata-admin/previews/DashboardPreview.js +110 -8
- package/dist/views/metadata-admin/previews/DatasetPreview.d.ts +18 -0
- package/dist/views/metadata-admin/previews/DatasetPreview.js +89 -0
- package/dist/views/metadata-admin/previews/DatasourcePreview.d.ts +23 -0
- package/dist/views/metadata-admin/previews/DatasourcePreview.js +68 -0
- package/dist/views/metadata-admin/previews/EmailTemplatePreview.d.ts +14 -1
- package/dist/views/metadata-admin/previews/FieldStub.d.ts +30 -0
- package/dist/views/metadata-admin/previews/FieldStub.js +104 -0
- package/dist/views/metadata-admin/previews/FieldsListEditor.d.ts +50 -0
- package/dist/views/metadata-admin/previews/FieldsListEditor.js +97 -0
- package/dist/views/metadata-admin/previews/FlowCanvas.d.ts +43 -0
- package/dist/views/metadata-admin/previews/FlowCanvas.js +328 -0
- package/dist/views/metadata-admin/previews/FlowPreview.d.ts +20 -0
- package/dist/views/metadata-admin/previews/FlowPreview.js +92 -0
- package/dist/views/metadata-admin/previews/FlowRunsPanel.d.ts +46 -0
- package/dist/views/metadata-admin/previews/FlowRunsPanel.js +97 -0
- package/dist/views/metadata-admin/previews/FlowSimulatorPanel.d.ts +25 -0
- package/dist/views/metadata-admin/previews/FlowSimulatorPanel.js +170 -0
- package/dist/views/metadata-admin/previews/JobPreview.d.ts +28 -0
- package/dist/views/metadata-admin/previews/JobPreview.js +290 -0
- package/dist/views/metadata-admin/previews/ObjectFormCanvas.d.ts +30 -0
- package/dist/views/metadata-admin/previews/ObjectFormCanvas.js +547 -0
- package/dist/views/metadata-admin/previews/ObjectPreview.d.ts +14 -1
- package/dist/views/metadata-admin/previews/ObjectPreview.js +5 -30
- package/dist/views/metadata-admin/previews/OutlineStrip.d.ts +32 -0
- package/dist/views/metadata-admin/previews/OutlineStrip.js +8 -0
- package/dist/views/metadata-admin/previews/PageBlockCanvas.d.ts +49 -0
- package/dist/views/metadata-admin/previews/PageBlockCanvas.js +510 -0
- package/dist/views/metadata-admin/previews/PagePreview.d.ts +10 -1
- package/dist/views/metadata-admin/previews/PagePreview.js +90 -4
- package/dist/views/metadata-admin/previews/PermissionPreview.d.ts +27 -0
- package/dist/views/metadata-admin/previews/PermissionPreview.js +115 -0
- package/dist/views/metadata-admin/previews/PreviewShell.d.ts +29 -6
- package/dist/views/metadata-admin/previews/PreviewShell.js +16 -3
- package/dist/views/metadata-admin/previews/ReportPreview.d.ts +18 -1
- package/dist/views/metadata-admin/previews/ReportPreview.js +23 -15
- package/dist/views/metadata-admin/previews/RolePreview.d.ts +19 -0
- package/dist/views/metadata-admin/previews/RolePreview.js +14 -0
- package/dist/views/metadata-admin/previews/SkillPreview.d.ts +22 -0
- package/dist/views/metadata-admin/previews/SkillPreview.js +34 -0
- package/dist/views/metadata-admin/previews/ToolPreview.d.ts +25 -0
- package/dist/views/metadata-admin/previews/ToolPreview.js +122 -0
- package/dist/views/metadata-admin/previews/TranslationPreview.d.ts +25 -0
- package/dist/views/metadata-admin/previews/TranslationPreview.js +52 -0
- package/dist/views/metadata-admin/previews/ValidationPreview.d.ts +27 -0
- package/dist/views/metadata-admin/previews/ValidationPreview.js +110 -0
- package/dist/views/metadata-admin/previews/ViewColumnPanes.d.ts +62 -0
- package/dist/views/metadata-admin/previews/ViewColumnPanes.js +140 -0
- package/dist/views/metadata-admin/previews/ViewPreview.d.ts +23 -1
- package/dist/views/metadata-admin/previews/ViewPreview.js +101 -73
- package/dist/views/metadata-admin/previews/block-config.d.ts +82 -0
- package/dist/views/metadata-admin/previews/block-config.js +324 -0
- package/dist/views/metadata-admin/previews/block-types.d.ts +40 -0
- package/dist/views/metadata-admin/previews/block-types.js +110 -0
- package/dist/views/metadata-admin/previews/field-types.d.ts +53 -0
- package/dist/views/metadata-admin/previews/field-types.js +97 -0
- package/dist/views/metadata-admin/previews/flow-canvas-layout.d.ts +88 -0
- package/dist/views/metadata-admin/previews/flow-canvas-layout.js +190 -0
- package/dist/views/metadata-admin/previews/flow-canvas-parts.d.ts +88 -0
- package/dist/views/metadata-admin/previews/flow-canvas-parts.js +358 -0
- package/dist/views/metadata-admin/previews/form-preview.d.ts +24 -0
- package/dist/views/metadata-admin/previews/form-preview.js +29 -0
- package/dist/views/metadata-admin/previews/index.js +43 -0
- package/dist/views/metadata-admin/previews/object-fields-bridge.d.ts +66 -0
- package/dist/views/metadata-admin/previews/object-fields-bridge.js +171 -0
- package/dist/views/metadata-admin/previews/object-fields-io.d.ts +109 -0
- package/dist/views/metadata-admin/previews/object-fields-io.js +208 -0
- package/dist/views/metadata-admin/previews/simulator/flow-sim-types.d.ts +91 -0
- package/dist/views/metadata-admin/previews/simulator/flow-sim-types.js +2 -0
- package/dist/views/metadata-admin/previews/simulator/flow-sim-validate.d.ts +8 -0
- package/dist/views/metadata-admin/previews/simulator/flow-sim-validate.js +113 -0
- package/dist/views/metadata-admin/previews/simulator/flow-simulator.d.ts +44 -0
- package/dist/views/metadata-admin/previews/simulator/flow-simulator.js +316 -0
- package/dist/views/metadata-admin/previews/useDatasetCatalog.d.ts +47 -0
- package/dist/views/metadata-admin/previews/useDatasetCatalog.js +133 -0
- package/dist/views/metadata-admin/previews/useFlowNodePalette.d.ts +44 -0
- package/dist/views/metadata-admin/previews/useFlowNodePalette.js +124 -0
- package/dist/views/metadata-admin/previews/useMetaOptions.d.ts +8 -0
- package/dist/views/metadata-admin/previews/useMetaOptions.js +50 -0
- package/dist/views/metadata-admin/previews/useObjectFields.d.ts +23 -0
- package/dist/views/metadata-admin/previews/useObjectFields.js +79 -0
- package/dist/views/metadata-admin/previews/useObjectOptions.d.ts +8 -0
- package/dist/views/metadata-admin/previews/useObjectOptions.js +43 -0
- package/dist/views/metadata-admin/previews/view-column-io.d.ts +42 -0
- package/dist/views/metadata-admin/previews/view-column-io.js +73 -0
- package/dist/views/metadata-admin/previews/widget-types.d.ts +24 -0
- package/dist/views/metadata-admin/previews/widget-types.js +40 -0
- package/dist/views/metadata-admin/registry.d.ts +140 -19
- package/dist/views/metadata-admin/report-schema.d.ts +26 -0
- package/dist/views/metadata-admin/report-schema.js +121 -0
- package/dist/views/metadata-admin/useMetadata.d.ts +100 -2
- package/dist/views/metadata-admin/useMetadata.js +155 -4
- package/dist/views/metadata-admin/view-item-normalize.d.ts +20 -0
- package/dist/views/metadata-admin/view-item-normalize.js +68 -0
- package/dist/views/metadata-admin/view-schema.d.ts +16 -0
- package/dist/views/metadata-admin/view-schema.js +107 -0
- package/dist/views/metadata-admin/view-variant-model.d.ts +23 -0
- package/dist/views/metadata-admin/view-variant-model.js +64 -0
- package/dist/views/metadata-admin/widgets.d.ts +89 -1
- package/dist/views/metadata-admin/widgets.js +491 -17
- package/dist/views/runtime-metadata-persistence.d.ts +78 -0
- package/dist/views/runtime-metadata-persistence.js +89 -0
- package/dist/views/useOpenRecordList.d.ts +18 -0
- package/dist/views/useOpenRecordList.js +36 -0
- package/dist/views/userFilterUrlState.d.ts +15 -0
- package/dist/views/userFilterUrlState.js +53 -0
- package/dist/views/view-config-adapter.d.ts +38 -0
- package/dist/views/view-config-adapter.js +80 -0
- package/package.json +52 -34
- package/dist/views/DesignDrawer.d.ts +0 -28
- package/dist/views/DesignDrawer.js +0 -51
- package/dist/views/metadata-admin/DesignerEditorWrapper.d.ts +0 -68
- package/dist/views/metadata-admin/DesignerEditorWrapper.js +0 -158
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* ObjectUI
|
|
4
|
+
* Copyright (c) 2024-present ObjectStack Inc.
|
|
5
|
+
*
|
|
6
|
+
* This source code is licensed under the MIT license found in the
|
|
7
|
+
* LICENSE file in the root directory of this source tree.
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* ADR-0045 — the "unpublished app" banner. Renders while the CURRENT app is
|
|
11
|
+
* materialized-but-unlisted (`app.hidden === true`): the app is fully real —
|
|
12
|
+
* tables, data, interactions — but end users can't see it (launchers exclude
|
|
13
|
+
* it; the REST gate strips it for non-builders). The banner narrates that
|
|
14
|
+
* state and offers the one action that matters: Publish, which simply flips
|
|
15
|
+
* visibility (`hidden: false`) — instant and reversible, per ADR-0045.
|
|
16
|
+
*
|
|
17
|
+
* Sibling of DraftPreviewBar (the ADR-0037 draft-overlay watermark): that bar
|
|
18
|
+
* owns mutation preview (`?preview=draft`); this one owns the materialize
|
|
19
|
+
* regime. In preview mode this bar yields — the draft bar already narrates.
|
|
20
|
+
*/
|
|
21
|
+
import { useState } from 'react';
|
|
22
|
+
import { useLocation, useParams } from 'react-router-dom';
|
|
23
|
+
import { EyeOff, Rocket } from 'lucide-react';
|
|
24
|
+
import { toast } from 'sonner';
|
|
25
|
+
import { Button } from '@object-ui/components';
|
|
26
|
+
import { useObjectTranslation } from '@object-ui/i18n';
|
|
27
|
+
import { useMetadata } from '../providers/MetadataProvider';
|
|
28
|
+
import { matchAppBySegment } from '../utils/appRoute';
|
|
29
|
+
import { usePreviewDrafts } from './PreviewModeContext';
|
|
30
|
+
export function UnpublishedAppBar() {
|
|
31
|
+
const preview = usePreviewDrafts();
|
|
32
|
+
const { appName } = useParams();
|
|
33
|
+
const location = useLocation();
|
|
34
|
+
const { apps, refresh } = useMetadata();
|
|
35
|
+
const { t } = useObjectTranslation();
|
|
36
|
+
const [publishing, setPublishing] = useState(false);
|
|
37
|
+
// The draft-preview watermark owns the preview tree; never stack both bars.
|
|
38
|
+
if (preview)
|
|
39
|
+
return null;
|
|
40
|
+
const routeApp = appName ?? location.pathname.match(/\/apps\/([^/?#]+)/)?.[1];
|
|
41
|
+
if (!routeApp)
|
|
42
|
+
return null;
|
|
43
|
+
const app = matchAppBySegment(apps ?? [], routeApp);
|
|
44
|
+
if (!app || app.hidden !== true)
|
|
45
|
+
return null;
|
|
46
|
+
const publish = async () => {
|
|
47
|
+
setPublishing(true);
|
|
48
|
+
try {
|
|
49
|
+
// Publish = the ADR-0045 visibility flip: one metadata write, no
|
|
50
|
+
// lifecycle machinery. Body is the full current app with hidden:false
|
|
51
|
+
// (the meta save endpoint replaces the overlay row).
|
|
52
|
+
const res = await fetch(`/api/v1/meta/app/${encodeURIComponent(routeApp)}`, {
|
|
53
|
+
method: 'PUT',
|
|
54
|
+
credentials: 'include',
|
|
55
|
+
headers: { 'Content-Type': 'application/json', Accept: 'application/json' },
|
|
56
|
+
body: JSON.stringify({ ...app, hidden: false }),
|
|
57
|
+
});
|
|
58
|
+
if (!res.ok) {
|
|
59
|
+
const payload = await res.json().catch(() => null);
|
|
60
|
+
throw new Error(payload?.error?.message ?? payload?.error ?? `HTTP ${res.status}`);
|
|
61
|
+
}
|
|
62
|
+
toast.success(t('preview.unpublishedBar.published', {
|
|
63
|
+
defaultValue: 'Published! The app is now visible to your users.',
|
|
64
|
+
}));
|
|
65
|
+
refresh?.();
|
|
66
|
+
}
|
|
67
|
+
catch (e) {
|
|
68
|
+
toast.error(`${t('preview.unpublishedBar.publishFailed', { defaultValue: 'Publish failed' })}: ${e.message}`);
|
|
69
|
+
}
|
|
70
|
+
finally {
|
|
71
|
+
setPublishing(false);
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
return (_jsxs("div", { className: "sticky top-0 z-40 flex items-center gap-3 border-b border-amber-300/70 bg-amber-50 px-4 py-2 text-sm text-amber-900 dark:border-amber-700/60 dark:bg-amber-950/40 dark:text-amber-200", "data-testid": "unpublished-app-bar", children: [_jsx(EyeOff, { className: "h-4 w-4 shrink-0" }), _jsx("p", { className: "min-w-0 flex-1 truncate", children: t('preview.unpublishedBar.message', {
|
|
75
|
+
defaultValue: 'Unpublished app — fully functional, but only builders can see it. Publish to make it visible to your users.',
|
|
76
|
+
}) }), _jsxs(Button, { size: "sm", onClick: publish, disabled: publishing, "data-testid": "unpublished-app-publish", children: [_jsx(Rocket, { className: "mr-1 h-3.5 w-3.5" }), publishing
|
|
77
|
+
? t('preview.unpublishedBar.publishing', { defaultValue: 'Publishing…' })
|
|
78
|
+
: t('preview.unpublishedBar.publish', { defaultValue: 'Publish' })] })] }));
|
|
79
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ObjectUI
|
|
3
|
+
* Copyright (c) 2024-present ObjectStack Inc.
|
|
4
|
+
*
|
|
5
|
+
* This source code is licensed under the MIT license found in the
|
|
6
|
+
* LICENSE file in the root directory of this source tree.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Live draft-status read for the chat's draft cards (panel-as-source-of-truth,
|
|
10
|
+
* made literal): how many drafts are still PENDING in a package, straight from
|
|
11
|
+
* the ADR-0033 `_drafts` endpoint. The chat passes this to
|
|
12
|
+
* `fetchPendingDraftCount` so a card's Publish/Published affordance reflects
|
|
13
|
+
* the server's CURRENT state — across conversation reloads, other sessions'
|
|
14
|
+
* publishes, and later edits into the same package — instead of replaying the
|
|
15
|
+
* tool-result snapshot it was born with.
|
|
16
|
+
*
|
|
17
|
+
* Cookie-authenticated like every other console call; tolerant of both
|
|
18
|
+
* response shapes (`[...]` and `{ drafts: [...] }`).
|
|
19
|
+
*/
|
|
20
|
+
export declare function fetchPendingDraftCount(packageId: string): Promise<number>;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ObjectUI
|
|
3
|
+
* Copyright (c) 2024-present ObjectStack Inc.
|
|
4
|
+
*
|
|
5
|
+
* This source code is licensed under the MIT license found in the
|
|
6
|
+
* LICENSE file in the root directory of this source tree.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Live draft-status read for the chat's draft cards (panel-as-source-of-truth,
|
|
10
|
+
* made literal): how many drafts are still PENDING in a package, straight from
|
|
11
|
+
* the ADR-0033 `_drafts` endpoint. The chat passes this to
|
|
12
|
+
* `fetchPendingDraftCount` so a card's Publish/Published affordance reflects
|
|
13
|
+
* the server's CURRENT state — across conversation reloads, other sessions'
|
|
14
|
+
* publishes, and later edits into the same package — instead of replaying the
|
|
15
|
+
* tool-result snapshot it was born with.
|
|
16
|
+
*
|
|
17
|
+
* Cookie-authenticated like every other console call; tolerant of both
|
|
18
|
+
* response shapes (`[...]` and `{ drafts: [...] }`).
|
|
19
|
+
*/
|
|
20
|
+
export async function fetchPendingDraftCount(packageId) {
|
|
21
|
+
const res = await fetch(`/api/v1/meta/_drafts?packageId=${encodeURIComponent(packageId)}`, { credentials: 'include', headers: { Accept: 'application/json' }, cache: 'no-store' });
|
|
22
|
+
if (!res.ok)
|
|
23
|
+
throw new Error(`_drafts HTTP ${res.status}`);
|
|
24
|
+
const data = (await res.json());
|
|
25
|
+
const list = Array.isArray(data) ? data : data?.drafts ?? data?.data?.drafts ?? [];
|
|
26
|
+
return Array.isArray(list) ? list.length : 0;
|
|
27
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ObjectUI
|
|
3
|
+
* Copyright (c) 2024-present ObjectStack Inc.
|
|
4
|
+
*
|
|
5
|
+
* This source code is licensed under the MIT license found in the
|
|
6
|
+
* LICENSE file in the root directory of this source tree.
|
|
7
|
+
*/
|
|
8
|
+
type TranslateFn = (key: string, opts?: Record<string, unknown>) => string;
|
|
9
|
+
export interface PublishAllResult {
|
|
10
|
+
ok: boolean;
|
|
11
|
+
/** Count of drafts the call attempted to publish. */
|
|
12
|
+
attempted: number;
|
|
13
|
+
}
|
|
14
|
+
export declare function usePublishAllDrafts(t: TranslateFn): {
|
|
15
|
+
publishAll: () => Promise<PublishAllResult>;
|
|
16
|
+
publishing: boolean;
|
|
17
|
+
};
|
|
18
|
+
export {};
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ObjectUI
|
|
3
|
+
* Copyright (c) 2024-present ObjectStack Inc.
|
|
4
|
+
*
|
|
5
|
+
* This source code is licensed under the MIT license found in the
|
|
6
|
+
* LICENSE file in the root directory of this source tree.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* One-click "publish everything pending" — shared by the Home pending-drafts
|
|
10
|
+
* banner and the ADR-0037 draft-preview bar, so both surfaces publish through
|
|
11
|
+
* the SAME governed path and report the SAME health.
|
|
12
|
+
*
|
|
13
|
+
* Package-bound drafts go through `POST /packages/:id/publish-drafts` — the
|
|
14
|
+
* path that orders structure-before-seeds server-side and runs the ADR-0038
|
|
15
|
+
* L3 runtime probes; findings surface as a loud warning toast instead of a
|
|
16
|
+
* blind "Published!". Package-less drafts fall back to by-reference publish
|
|
17
|
+
* (structure first, seeds last) so they never dead-end.
|
|
18
|
+
*/
|
|
19
|
+
import { useCallback, useState } from 'react';
|
|
20
|
+
import { toast } from 'sonner';
|
|
21
|
+
import { publishHealthFromResponse } from '@object-ui/plugin-chatbot';
|
|
22
|
+
import { useMetadataClient } from '../views/metadata-admin/useMetadata';
|
|
23
|
+
export function usePublishAllDrafts(t) {
|
|
24
|
+
const client = useMetadataClient();
|
|
25
|
+
const [publishing, setPublishing] = useState(false);
|
|
26
|
+
const publishAll = useCallback(async () => {
|
|
27
|
+
setPublishing(true);
|
|
28
|
+
try {
|
|
29
|
+
const pending = ((await client.listDrafts?.({})) || [])
|
|
30
|
+
.filter((d) => d && typeof d.type === 'string' && typeof d.name === 'string')
|
|
31
|
+
.map((d) => ({
|
|
32
|
+
type: d.type,
|
|
33
|
+
name: d.name,
|
|
34
|
+
packageId: typeof d.packageId === 'string' && d.packageId ? d.packageId : null,
|
|
35
|
+
}));
|
|
36
|
+
if (pending.length === 0) {
|
|
37
|
+
toast.info(t('home.pendingDrafts.nothing', { defaultValue: 'Nothing to publish.' }));
|
|
38
|
+
return { ok: true, attempted: 0 };
|
|
39
|
+
}
|
|
40
|
+
const packageIds = [...new Set(pending.map((d) => d.packageId).filter((p) => p !== null))];
|
|
41
|
+
const orphans = pending.filter((d) => d.packageId === null);
|
|
42
|
+
const seedProblems = [];
|
|
43
|
+
const probeProblems = [];
|
|
44
|
+
let seededRows = 0;
|
|
45
|
+
const recordHealth = (health) => {
|
|
46
|
+
if (!health)
|
|
47
|
+
return;
|
|
48
|
+
if (health.seedError)
|
|
49
|
+
seedProblems.push(health.seedError);
|
|
50
|
+
if (typeof health.seededRows === 'number')
|
|
51
|
+
seededRows += health.seededRows;
|
|
52
|
+
for (const issue of health.issues ?? []) {
|
|
53
|
+
if (issue.severity === 'error')
|
|
54
|
+
probeProblems.push(issue.message);
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
for (const packageId of packageIds) {
|
|
58
|
+
const res = await fetch(`/api/v1/packages/${encodeURIComponent(packageId)}/publish-drafts`, {
|
|
59
|
+
method: 'POST',
|
|
60
|
+
credentials: 'include',
|
|
61
|
+
headers: { 'Content-Type': 'application/json', Accept: 'application/json' },
|
|
62
|
+
body: '{}',
|
|
63
|
+
});
|
|
64
|
+
const payload = await res.json().catch(() => null);
|
|
65
|
+
if (!res.ok || payload?.success === false) {
|
|
66
|
+
throw new Error(payload?.error?.message || `HTTP ${res.status}`);
|
|
67
|
+
}
|
|
68
|
+
recordHealth(publishHealthFromResponse(payload));
|
|
69
|
+
}
|
|
70
|
+
const ordered = [
|
|
71
|
+
...orphans.filter((d) => d.type !== 'seed'),
|
|
72
|
+
...orphans.filter((d) => d.type === 'seed'),
|
|
73
|
+
];
|
|
74
|
+
for (const d of ordered) {
|
|
75
|
+
const res = await client.publishDraft(d.type, d.name);
|
|
76
|
+
const seedApplied = res?.seedApplied;
|
|
77
|
+
if (seedApplied && seedApplied.success === false) {
|
|
78
|
+
seedProblems.push(seedApplied.error ?? `${d.name}: sample data failed to load`);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
if (probeProblems.length > 0) {
|
|
82
|
+
toast.warning(t('home.pendingDrafts.probeWarn', { defaultValue: 'Published, but verification found problems.' }), { description: probeProblems[0] });
|
|
83
|
+
}
|
|
84
|
+
else if (seedProblems.length > 0) {
|
|
85
|
+
toast.warning(t('home.pendingDrafts.seedWarn', { defaultValue: 'Published, but some sample data failed to load.' }), { description: seedProblems[0] });
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
toast.success(seededRows > 0
|
|
89
|
+
? t('home.pendingDrafts.publishedVerified', {
|
|
90
|
+
count: seededRows,
|
|
91
|
+
defaultValue: 'Published & verified — {{count}} sample row(s) live.',
|
|
92
|
+
})
|
|
93
|
+
: t('home.pendingDrafts.published', { defaultValue: 'Published! Your changes are live.' }));
|
|
94
|
+
}
|
|
95
|
+
return { ok: true, attempted: pending.length };
|
|
96
|
+
}
|
|
97
|
+
catch (e) {
|
|
98
|
+
toast.error(`${t('home.pendingDrafts.publishFailed', { defaultValue: 'Publish failed' })}: ${e.message}`);
|
|
99
|
+
return { ok: false, attempted: 0 };
|
|
100
|
+
}
|
|
101
|
+
finally {
|
|
102
|
+
setPublishing(false);
|
|
103
|
+
}
|
|
104
|
+
}, [client, t]);
|
|
105
|
+
return { publishAll, publishing };
|
|
106
|
+
}
|
|
@@ -18,4 +18,4 @@ interface AdapterProviderProps {
|
|
|
18
18
|
* Creates an ObjectStackAdapter, connects to the API, then provides it to children.
|
|
19
19
|
* Shows nothing (returns null) until the adapter is ready.
|
|
20
20
|
*/
|
|
21
|
-
export declare function AdapterProvider({ children, adapter: externalAdapter }: AdapterProviderProps): import("react
|
|
21
|
+
export declare function AdapterProvider({ children, adapter: externalAdapter }: AdapterProviderProps): import("react").JSX.Element;
|
|
@@ -11,6 +11,7 @@ import { useState, useEffect } from 'react';
|
|
|
11
11
|
import { ObjectStackAdapter } from '@object-ui/data-objectstack';
|
|
12
12
|
import { createAuthenticatedFetch } from '@object-ui/auth';
|
|
13
13
|
import { AdapterCtx } from '@object-ui/react';
|
|
14
|
+
import { installSettleSignalGlobal, withSettleSignal } from '../observability/settleSignal';
|
|
14
15
|
export { useAdapter } from '@object-ui/react';
|
|
15
16
|
/**
|
|
16
17
|
* Creates an ObjectStackAdapter, connects to the API, then provides it to children.
|
|
@@ -24,11 +25,15 @@ export function AdapterProvider({ children, adapter: externalAdapter }) {
|
|
|
24
25
|
return;
|
|
25
26
|
}
|
|
26
27
|
let cancelled = false;
|
|
28
|
+
// Expose window.__objectui.{pendingRequests,idle,whenIdle} so an automated
|
|
29
|
+
// (AI) browser driver has one "is the app settled?" predicate (ADR-0054 C5).
|
|
30
|
+
installSettleSignalGlobal();
|
|
27
31
|
async function init() {
|
|
28
32
|
try {
|
|
29
33
|
const a = new ObjectStackAdapter({
|
|
30
34
|
baseUrl: import.meta.env.VITE_SERVER_URL || '',
|
|
31
|
-
|
|
35
|
+
// Count every outbound request in the global in-flight signal (C5).
|
|
36
|
+
fetch: withSettleSignal(createAuthenticatedFetch()),
|
|
32
37
|
autoReconnect: true,
|
|
33
38
|
maxReconnectAttempts: 5,
|
|
34
39
|
reconnectDelay: 1000,
|
|
@@ -41,7 +41,7 @@ interface ExpressionProviderProps {
|
|
|
41
41
|
data?: Record<string, any>;
|
|
42
42
|
features?: Record<string, any>;
|
|
43
43
|
}
|
|
44
|
-
export declare function ExpressionProvider({ children, user, app, data, features }: ExpressionProviderProps):
|
|
44
|
+
export declare function ExpressionProvider({ children, user, app, data, features }: ExpressionProviderProps): React.JSX.Element;
|
|
45
45
|
/**
|
|
46
46
|
* Hook to access the expression context.
|
|
47
47
|
* Returns the full context value or a default empty context.
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type ReactNode } from 'react';
|
|
2
|
-
import type
|
|
2
|
+
import { type ObjectStackAdapter } from '@object-ui/data-objectstack';
|
|
3
3
|
import { useMetadata, type MetadataContextValue, type MetadataState } from '@object-ui/react';
|
|
4
4
|
export type { MetadataState, MetadataContextValue };
|
|
5
5
|
export { useMetadataItem } from '@object-ui/react';
|
|
@@ -10,7 +10,22 @@ interface MetadataProviderProps {
|
|
|
10
10
|
adapter: ObjectStackAdapter;
|
|
11
11
|
ttlMs?: number;
|
|
12
12
|
}
|
|
13
|
-
|
|
13
|
+
/** Exported for tests — both metadata sources must normalize identically. */
|
|
14
|
+
export declare function extractItems(res: unknown): any[];
|
|
15
|
+
export declare function mergeViewsIntoObjects(objects: any[], views: any[]): any[];
|
|
16
|
+
/**
|
|
17
|
+
* Relationship-driven master-detail: a child object's `master_detail`/`lookup`
|
|
18
|
+
* field can carry `inlineEdit: true` to declare "edit me inline within my
|
|
19
|
+
* parent's form". This pass scans every object for such fields and merges the
|
|
20
|
+
* resulting child collections into each parent object's form view as
|
|
21
|
+
* `subforms` — so the parent's standard create/edit form renders an atomic
|
|
22
|
+
* master-detail form with NO view config and NO bespoke page. The intent lives
|
|
23
|
+
* in the data model (where it's defined once, e.g. by an AI modelling the
|
|
24
|
+
* schema); forms just follow. An explicit `form.subforms` entry for the same
|
|
25
|
+
* child overrides the model-derived one.
|
|
26
|
+
*/
|
|
27
|
+
export declare function attachInlineSubforms(objects: any[]): any[];
|
|
28
|
+
export declare function MetadataProvider({ children, adapter, ttlMs }: MetadataProviderProps): import("react").JSX.Element;
|
|
14
29
|
export declare function useMetadataType(type: string): {
|
|
15
30
|
items: any[];
|
|
16
31
|
loading: boolean;
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
2
|
import { useState, useEffect, useCallback, useRef, useMemo, } from 'react';
|
|
3
|
+
import { MetadataClient } from '@object-ui/data-objectstack';
|
|
4
|
+
import { resolveInlineMode } from '@object-ui/plugin-form';
|
|
3
5
|
import { MetadataCtx, useMetadata } from '@object-ui/react';
|
|
6
|
+
import { usePreviewDrafts } from '../preview/PreviewModeContext';
|
|
7
|
+
import { subscribeCanvasInvalidate, subscribeMetadataRefresh } from '../assistant/assistantBus';
|
|
4
8
|
export { useMetadataItem } from '@object-ui/react';
|
|
5
9
|
export { useMetadata };
|
|
6
10
|
// ---------------------------------------------------------------------------
|
|
@@ -41,7 +45,15 @@ function debug(...args) {
|
|
|
41
45
|
// ---------------------------------------------------------------------------
|
|
42
46
|
// Helpers
|
|
43
47
|
// ---------------------------------------------------------------------------
|
|
44
|
-
|
|
48
|
+
/** Exported for tests — both metadata sources must normalize identically. */
|
|
49
|
+
export function extractItems(res) {
|
|
50
|
+
// Both source shapes must parse: the adapter SDK returns the wrapped
|
|
51
|
+
// `{ type, items: [...] }` envelope, while the ADR-0037 preview path's
|
|
52
|
+
// MetadataClient.list() returns the already-unwrapped array. Dropping the
|
|
53
|
+
// bare-array shape silently emptied the ENTIRE draft-preview world (every
|
|
54
|
+
// type read 0 items), stranding the Live Canvas on "No Apps Configured".
|
|
55
|
+
if (Array.isArray(res))
|
|
56
|
+
return res;
|
|
45
57
|
if (res && typeof res === 'object' && 'items' in res && Array.isArray(res.items)) {
|
|
46
58
|
return res.items;
|
|
47
59
|
}
|
|
@@ -61,14 +73,54 @@ function isNamedItem(item) {
|
|
|
61
73
|
'name' in item &&
|
|
62
74
|
typeof item.name === 'string');
|
|
63
75
|
}
|
|
64
|
-
|
|
76
|
+
/** A first-class ViewItem carries a `viewKind` discriminant + `object` binding. */
|
|
77
|
+
function isViewItem(view) {
|
|
78
|
+
return !!view && typeof view === 'object' && !!view.viewKind && !!view.object;
|
|
79
|
+
}
|
|
80
|
+
export function mergeViewsIntoObjects(objects, views) {
|
|
81
|
+
var _a;
|
|
65
82
|
if (!objects.length || !views.length)
|
|
66
83
|
return objects;
|
|
67
84
|
const byObject = {};
|
|
85
|
+
// Objects that received expanded ViewItems — their legacy aggregated
|
|
86
|
+
// container (also present in the `view` list) is superseded and skipped.
|
|
87
|
+
const hasViewItems = new Set();
|
|
88
|
+
for (const view of views) {
|
|
89
|
+
if (isViewItem(view))
|
|
90
|
+
hasViewItems.add(view.object);
|
|
91
|
+
}
|
|
68
92
|
for (const view of views) {
|
|
93
|
+
// ── New protocol: independent ViewItem ({ name, object, viewKind, config }) ──
|
|
94
|
+
if (isViewItem(view)) {
|
|
95
|
+
const bucket = (byObject[_a = view.object] || (byObject[_a] = { listViews: {}, formViews: {} }));
|
|
96
|
+
// Canonical `<object>.<key>` name doubles as the view id, so `/view/<name>`
|
|
97
|
+
// URLs resolve directly against the switcher tab ids.
|
|
98
|
+
const key = view.name || `${view.object}.${view.viewKind}`;
|
|
99
|
+
const body = view.config && typeof view.config === 'object' ? view.config : {};
|
|
100
|
+
// Flatten `config` to the legacy NamedListView/FormView shape the
|
|
101
|
+
// renderer consumes (type/data/columns/sections at top level); carry the
|
|
102
|
+
// item-level label/isDefault and stamp `name` so primary-view promotion
|
|
103
|
+
// (which matches on `list.name`) finds this entry by its listViews key.
|
|
104
|
+
const entry = { ...body, name: key, label: view.label ?? body.label, isDefault: !!view.isDefault };
|
|
105
|
+
if (view.viewKind === 'form') {
|
|
106
|
+
bucket.formViews[key] = entry;
|
|
107
|
+
if (view.isDefault || !bucket.form)
|
|
108
|
+
bucket.form = entry;
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
bucket.listViews[key] = entry;
|
|
112
|
+
if (view.isDefault)
|
|
113
|
+
bucket.primary = entry;
|
|
114
|
+
}
|
|
115
|
+
continue;
|
|
116
|
+
}
|
|
117
|
+
// ── Legacy aggregated container ({ list, form, listViews, formViews }) ──
|
|
69
118
|
const objName = view?.name || view?.list?.data?.object || view?.form?.data?.object;
|
|
70
119
|
if (!objName)
|
|
71
120
|
continue;
|
|
121
|
+
// Expanded ViewItems supersede the bare container for this object.
|
|
122
|
+
if (hasViewItems.has(objName))
|
|
123
|
+
continue;
|
|
72
124
|
const bucket = (byObject[objName] || (byObject[objName] = { listViews: {}, formViews: {} }));
|
|
73
125
|
if (view.list) {
|
|
74
126
|
// Preserve the primary list view as `obj.list` per @objectstack/spec
|
|
@@ -115,6 +167,67 @@ function mergeViewsIntoObjects(objects, views) {
|
|
|
115
167
|
return merged;
|
|
116
168
|
});
|
|
117
169
|
}
|
|
170
|
+
/**
|
|
171
|
+
* Relationship-driven master-detail: a child object's `master_detail`/`lookup`
|
|
172
|
+
* field can carry `inlineEdit: true` to declare "edit me inline within my
|
|
173
|
+
* parent's form". This pass scans every object for such fields and merges the
|
|
174
|
+
* resulting child collections into each parent object's form view as
|
|
175
|
+
* `subforms` — so the parent's standard create/edit form renders an atomic
|
|
176
|
+
* master-detail form with NO view config and NO bespoke page. The intent lives
|
|
177
|
+
* in the data model (where it's defined once, e.g. by an AI modelling the
|
|
178
|
+
* schema); forms just follow. An explicit `form.subforms` entry for the same
|
|
179
|
+
* child overrides the model-derived one.
|
|
180
|
+
*/
|
|
181
|
+
export function attachInlineSubforms(objects) {
|
|
182
|
+
if (!objects?.length)
|
|
183
|
+
return objects;
|
|
184
|
+
const inlineByParent = {};
|
|
185
|
+
for (const child of objects) {
|
|
186
|
+
const fields = child?.fields;
|
|
187
|
+
if (!fields)
|
|
188
|
+
continue;
|
|
189
|
+
const entries = Array.isArray(fields)
|
|
190
|
+
? fields.map((f) => [f?.name, f])
|
|
191
|
+
: Object.entries(fields);
|
|
192
|
+
for (const [fname, fdef] of entries) {
|
|
193
|
+
const d = fdef;
|
|
194
|
+
if (!fname || !d?.inlineEdit)
|
|
195
|
+
continue;
|
|
196
|
+
if (d.type !== 'master_detail' && d.type !== 'lookup')
|
|
197
|
+
continue;
|
|
198
|
+
const parent = d.reference;
|
|
199
|
+
if (!parent)
|
|
200
|
+
continue;
|
|
201
|
+
(inlineByParent[parent] || (inlineByParent[parent] = [])).push({
|
|
202
|
+
childObject: child.name,
|
|
203
|
+
relationshipField: fname,
|
|
204
|
+
// Resolve the inline-edit form factor (grid vs per-row form) from the
|
|
205
|
+
// declared value, falling back to the smart default by child shape.
|
|
206
|
+
inlineMode: resolveInlineMode(child, d.inlineEdit, { relationshipField: fname }),
|
|
207
|
+
...(d.inlineTitle ? { title: d.inlineTitle } : {}),
|
|
208
|
+
...(Array.isArray(d.inlineColumns) ? { columns: d.inlineColumns } : {}),
|
|
209
|
+
...(typeof d.inlineAmountField === 'string' ? { amountField: d.inlineAmountField } : {}),
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
if (!Object.keys(inlineByParent).length)
|
|
214
|
+
return objects;
|
|
215
|
+
return objects.map((obj) => {
|
|
216
|
+
const derived = inlineByParent[obj.name];
|
|
217
|
+
if (!derived?.length)
|
|
218
|
+
return obj;
|
|
219
|
+
const form = { ...(obj.form || { type: 'simple' }) };
|
|
220
|
+
const explicit = Array.isArray(form.subforms) ? form.subforms : [];
|
|
221
|
+
const explicitChildren = new Set(explicit.map((s) => s.childObject));
|
|
222
|
+
// Model-derived first; an explicit view subform for the same child wins.
|
|
223
|
+
form.subforms = [...derived.filter((d) => !explicitChildren.has(d.childObject)), ...explicit];
|
|
224
|
+
const next = { ...obj, form };
|
|
225
|
+
if (obj.formViews?.default) {
|
|
226
|
+
next.formViews = { ...obj.formViews, default: { ...obj.formViews.default, subforms: form.subforms } };
|
|
227
|
+
}
|
|
228
|
+
return next;
|
|
229
|
+
});
|
|
230
|
+
}
|
|
118
231
|
function emptyEntry() {
|
|
119
232
|
return {
|
|
120
233
|
status: 'idle',
|
|
@@ -157,6 +270,20 @@ export function MetadataProvider({ children, adapter, ttlMs = DEFAULT_TTL_MS })
|
|
|
157
270
|
const itemPromisesRef = useRef(new Map());
|
|
158
271
|
const adapterRef = useRef(adapter);
|
|
159
272
|
adapterRef.current = adapter;
|
|
273
|
+
// ADR-0037 Live Canvas: when the tree is in draft-preview mode, metadata
|
|
274
|
+
// reads come from the REST `?preview=draft` overlay (pending ADR-0033
|
|
275
|
+
// drafts win over active) instead of the adapter SDK. The MetadataClient
|
|
276
|
+
// is used because the SDK's meta API doesn't carry the preview flag; same
|
|
277
|
+
// endpoints, same cookie auth. Reads only — every write path is unchanged.
|
|
278
|
+
const previewDrafts = usePreviewDrafts();
|
|
279
|
+
const previewClient = useMemo(() => {
|
|
280
|
+
if (!previewDrafts)
|
|
281
|
+
return null;
|
|
282
|
+
const baseUrl = (typeof import.meta !== 'undefined' && import.meta.env?.VITE_SERVER_URL) || '';
|
|
283
|
+
return new MetadataClient({ baseUrl, previewDrafts: true });
|
|
284
|
+
}, [previewDrafts]);
|
|
285
|
+
const previewClientRef = useRef(previewClient);
|
|
286
|
+
previewClientRef.current = previewClient;
|
|
160
287
|
const [version, setVersion] = useState(0);
|
|
161
288
|
// Defer state bumps so they never occur synchronously during a consumer's
|
|
162
289
|
// render phase. `ensureType` may be invoked from inside `useMemo` getters
|
|
@@ -171,6 +298,14 @@ export function MetadataProvider({ children, adapter, ttlMs = DEFAULT_TTL_MS })
|
|
|
171
298
|
Promise.resolve().then(() => setVersion(v => v + 1));
|
|
172
299
|
}
|
|
173
300
|
}, []);
|
|
301
|
+
// Entering/leaving preview swaps the entire metadata source — the published
|
|
302
|
+
// and draft-overlaid worlds must never mix in one cache. Drop everything and
|
|
303
|
+
// let consumers refetch through the new source.
|
|
304
|
+
useEffect(() => {
|
|
305
|
+
cacheRef.current.clear();
|
|
306
|
+
itemPromisesRef.current.clear();
|
|
307
|
+
bump();
|
|
308
|
+
}, [previewDrafts, bump]);
|
|
174
309
|
const getEntry = useCallback((type) => {
|
|
175
310
|
let entry = cacheRef.current.get(type);
|
|
176
311
|
if (!entry) {
|
|
@@ -190,9 +325,13 @@ export function MetadataProvider({ children, adapter, ttlMs = DEFAULT_TTL_MS })
|
|
|
190
325
|
const started = Date.now();
|
|
191
326
|
entry.status = 'loading';
|
|
192
327
|
entry.error = null;
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
328
|
+
// Preview mode reads the draft-overlaid world (`?preview=draft`);
|
|
329
|
+
// normal mode reads the adapter SDK as before.
|
|
330
|
+
const preview = previewClientRef.current;
|
|
331
|
+
const fetchItems = preview
|
|
332
|
+
? preview.list(type)
|
|
333
|
+
: adapterRef.current.getClient().meta.getItems(type);
|
|
334
|
+
const promise = fetchItems
|
|
196
335
|
.then((res) => {
|
|
197
336
|
const items = extractItems(res);
|
|
198
337
|
entry.items = items;
|
|
@@ -206,7 +345,9 @@ export function MetadataProvider({ children, adapter, ttlMs = DEFAULT_TTL_MS })
|
|
|
206
345
|
entry.byName.set(it.name, it);
|
|
207
346
|
}
|
|
208
347
|
}
|
|
209
|
-
|
|
348
|
+
// Never let the draft-overlaid world poison the published session
|
|
349
|
+
// cache — preview is ephemeral by design.
|
|
350
|
+
if (type === 'app' && !preview)
|
|
210
351
|
saveToSession(type, items);
|
|
211
352
|
debug(`fetched type=${type} items=${items.length} in ${Date.now() - started}ms`);
|
|
212
353
|
bump();
|
|
@@ -243,9 +384,11 @@ export function MetadataProvider({ children, adapter, ttlMs = DEFAULT_TTL_MS })
|
|
|
243
384
|
if (existing)
|
|
244
385
|
return existing;
|
|
245
386
|
const started = Date.now();
|
|
246
|
-
const
|
|
247
|
-
const
|
|
248
|
-
.
|
|
387
|
+
const preview = previewClientRef.current;
|
|
388
|
+
const fetchItem = preview
|
|
389
|
+
? preview.get(type, name)
|
|
390
|
+
: adapterRef.current.getClient().meta.getItem(type, name);
|
|
391
|
+
const promise = fetchItem
|
|
249
392
|
.then((res) => {
|
|
250
393
|
const item = extractItem(res);
|
|
251
394
|
if (item)
|
|
@@ -297,11 +440,35 @@ export function MetadataProvider({ children, adapter, ttlMs = DEFAULT_TTL_MS })
|
|
|
297
440
|
}
|
|
298
441
|
bump();
|
|
299
442
|
}, [bump]);
|
|
443
|
+
// ADR-0037 P2.5 — same-document live refresh: while this tree renders the
|
|
444
|
+
// draft overlay, chat hosts announce each drafted artifact on the assistant
|
|
445
|
+
// bus; drop that type's cache entry so the next read refetches the updated
|
|
446
|
+
// draft world. Published-mode trees ignore the events entirely.
|
|
447
|
+
useEffect(() => {
|
|
448
|
+
if (!previewDrafts)
|
|
449
|
+
return;
|
|
450
|
+
return subscribeCanvasInvalidate(({ type }) => {
|
|
451
|
+
invalidate(type);
|
|
452
|
+
});
|
|
453
|
+
}, [previewDrafts, invalidate]);
|
|
454
|
+
// Live-metadata-changed refresh: a publish (drafts → live) or a marketplace
|
|
455
|
+
// install changed the registry out-of-band, so the schema this tree cached
|
|
456
|
+
// is stale. Refetch every loaded type — open forms/views/nav then reflect
|
|
457
|
+
// the new live world without a manual page reload (the chat-card "Publish"
|
|
458
|
+
// and Browse-page install paths do not reload, unlike the DraftPreviewBar).
|
|
459
|
+
// NOT gated to preview-drafts mode: the live world every tree reads changed.
|
|
460
|
+
useEffect(() => {
|
|
461
|
+
return subscribeMetadataRefresh(() => {
|
|
462
|
+
void refresh();
|
|
463
|
+
});
|
|
464
|
+
}, [refresh]);
|
|
300
465
|
const [initialLoading, setInitialLoading] = useState(true);
|
|
301
466
|
const [initialError, setInitialError] = useState(null);
|
|
302
467
|
useEffect(() => {
|
|
303
468
|
let cancelled = false;
|
|
304
|
-
|
|
469
|
+
// Session-cached apps are PUBLISHED-world data — seeding them while in
|
|
470
|
+
// draft preview would flash the wrong universe before the fetch lands.
|
|
471
|
+
const cached = previewDrafts ? null : loadFromSession('app');
|
|
305
472
|
if (cached) {
|
|
306
473
|
const entry = getEntry('app');
|
|
307
474
|
entry.items = cached;
|
|
@@ -334,7 +501,7 @@ export function MetadataProvider({ children, adapter, ttlMs = DEFAULT_TTL_MS })
|
|
|
334
501
|
return () => {
|
|
335
502
|
cancelled = true;
|
|
336
503
|
};
|
|
337
|
-
}, [adapter, ensureType, getEntry, bump]);
|
|
504
|
+
}, [adapter, ensureType, getEntry, bump, previewDrafts]);
|
|
338
505
|
const value = useMemo(() => {
|
|
339
506
|
void version;
|
|
340
507
|
const readType = (type) => {
|
|
@@ -350,7 +517,8 @@ export function MetadataProvider({ children, adapter, ttlMs = DEFAULT_TTL_MS })
|
|
|
350
517
|
get objects() {
|
|
351
518
|
const objs = readType(TYPE_BY_STATE_KEY.objects);
|
|
352
519
|
const views = readType('view');
|
|
353
|
-
|
|
520
|
+
const merged = views.length ? mergeViewsIntoObjects(objs, views) : objs;
|
|
521
|
+
return attachInlineSubforms(merged);
|
|
354
522
|
},
|
|
355
523
|
get dashboards() {
|
|
356
524
|
return readType(TYPE_BY_STATE_KEY.dashboards);
|
|
@@ -368,6 +536,9 @@ export function MetadataProvider({ children, adapter, ttlMs = DEFAULT_TTL_MS })
|
|
|
368
536
|
ensureType,
|
|
369
537
|
getItem,
|
|
370
538
|
getItemsByType,
|
|
539
|
+
// Pure read — must NOT kick a fetch, so render-phase status checks
|
|
540
|
+
// can't recurse into ensureType.
|
|
541
|
+
getTypeStatus: (type) => getEntry(type).status,
|
|
371
542
|
};
|
|
372
543
|
return base;
|
|
373
544
|
}, [version, initialLoading, initialError, ensureType, getItem, getEntry, refresh, invalidate]);
|