@object-ui/app-shell 6.2.3 → 7.1.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 +1229 -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 +184 -39
- 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 +747 -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 +28 -0
- package/dist/console/ai/LiveCanvas.js +80 -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 +137 -4
- package/dist/hooks/useChatConversation.js +316 -25
- package/dist/hooks/useConsoleActionRuntime.d.ts +70 -0
- package/dist/hooks/useConsoleActionRuntime.js +564 -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 +18 -8
- package/dist/index.js +17 -5
- 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 +34 -2
- package/dist/layout/ConsoleFloatingChatbot.js +391 -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 +242 -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/layout/agentPicker.d.ts +56 -0
- package/dist/layout/agentPicker.js +40 -0
- 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/CommitTimeline.d.ts +15 -0
- package/dist/preview/CommitTimeline.js +82 -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 +83 -0
- package/dist/preview/commitHistory.d.ts +28 -0
- package/dist/preview/commitHistory.js +48 -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 +192 -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 +31 -0
- package/dist/views/FlowRunner.js +121 -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/ScreenView.d.ts +70 -0
- package/dist/views/ScreenView.js +73 -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 +101 -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 +39 -0
- package/dist/views/metadata-admin/JsonSourceEditor.js +196 -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 +403 -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 +1250 -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 +258 -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 +205 -0
- package/dist/views/metadata-admin/anchors.js +255 -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 +1252 -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 +221 -0
- package/dist/views/metadata-admin/inspectors/FlowEdgeInspector.d.ts +16 -0
- package/dist/views/metadata-admin/inspectors/FlowEdgeInspector.js +126 -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 +205 -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 +55 -0
- package/dist/views/metadata-admin/inspectors/ObjectFieldInspector.d.ts +23 -0
- package/dist/views/metadata-admin/inspectors/ObjectFieldInspector.js +365 -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 +218 -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 +128 -0
- package/dist/views/metadata-admin/inspectors/_shared.js +113 -0
- package/dist/views/metadata-admin/inspectors/datasetFilterCondition.d.ts +24 -0
- package/dist/views/metadata-admin/inspectors/datasetFilterCondition.js +97 -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 +506 -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/issuePath.d.ts +22 -0
- package/dist/views/metadata-admin/issuePath.js +65 -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/package-scope.d.ts +26 -0
- package/dist/views/metadata-admin/package-scope.js +43 -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 +105 -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 +49 -0
- package/dist/views/metadata-admin/previews/FlowCanvas.js +416 -0
- package/dist/views/metadata-admin/previews/FlowPreview.d.ts +20 -0
- package/dist/views/metadata-admin/previews/FlowPreview.js +120 -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 +204 -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 +200 -5
- 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/ScreenPreview.d.ts +38 -0
- package/dist/views/metadata-admin/previews/ScreenPreview.js +61 -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 +102 -0
- package/dist/views/metadata-admin/previews/flow-canvas-layout.js +227 -0
- package/dist/views/metadata-admin/previews/flow-canvas-parts.d.ts +96 -0
- package/dist/views/metadata-admin/previews/flow-canvas-parts.js +373 -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 +130 -0
- package/dist/views/metadata-admin/previews/object-fields-io.js +243 -0
- package/dist/views/metadata-admin/previews/screen-spec.d.ts +43 -0
- package/dist/views/metadata-admin/previews/screen-spec.js +108 -0
- package/dist/views/metadata-admin/previews/simulator/flow-sim-types.d.ts +102 -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 +15 -0
- package/dist/views/metadata-admin/previews/simulator/flow-sim-validate.js +185 -0
- package/dist/views/metadata-admin/previews/simulator/flow-simulator.d.ts +73 -0
- package/dist/views/metadata-admin/previews/simulator/flow-simulator.js +426 -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,47 @@
|
|
|
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-0037 — the draft preview's own empty/error states.
|
|
11
|
+
*
|
|
12
|
+
* A `?preview=draft` tree (the Live Canvas iframe, or a hand-opened preview
|
|
13
|
+
* URL) must NEVER fall through to the console's generic "No Apps Configured"
|
|
14
|
+
* screen: that screen tells the user nothing exists and offers "Create Your
|
|
15
|
+
* First App" — both wrong and disorienting inside a preview of an app the AI
|
|
16
|
+
* just drafted. Preview has exactly three honest non-happy states, all
|
|
17
|
+
* rendered here:
|
|
18
|
+
*
|
|
19
|
+
* - loading failed → say so, offer Retry (the overlay read errored);
|
|
20
|
+
* - app not in draft → the build likely failed or hasn't run — point the
|
|
21
|
+
* user back to the conversation, never to "create app";
|
|
22
|
+
* - nothing drafted → same message, generic (no app name in the URL).
|
|
23
|
+
*
|
|
24
|
+
* Deliberately CTA-free beyond Retry: the preview is a window owned by the
|
|
25
|
+
* build conversation; every corrective action lives there.
|
|
26
|
+
*/
|
|
27
|
+
import { Eye, RefreshCw, TriangleAlert } from 'lucide-react';
|
|
28
|
+
import { Empty, EmptyTitle, EmptyDescription, Button } from '@object-ui/components';
|
|
29
|
+
import { useObjectTranslation } from '@object-ui/i18n';
|
|
30
|
+
export function PreviewDraftEmptyState({ appName, error, onRetry }) {
|
|
31
|
+
const { t } = useObjectTranslation();
|
|
32
|
+
const failed = Boolean(error);
|
|
33
|
+
return (_jsx("div", { className: "flex h-screen items-center justify-center", "data-testid": "preview-draft-empty-state", children: _jsxs(Empty, { children: [_jsx("div", { className: "mb-2 flex justify-center text-muted-foreground", "aria-hidden": "true", children: failed ? _jsx(TriangleAlert, { className: "h-8 w-8" }) : _jsx(Eye, { className: "h-8 w-8" }) }), _jsx(EmptyTitle, { children: failed
|
|
34
|
+
? t('preview.empty.loadFailedTitle', { defaultValue: 'Draft preview failed to load' })
|
|
35
|
+
: appName
|
|
36
|
+
? t('preview.empty.notReadyTitle', {
|
|
37
|
+
app: appName,
|
|
38
|
+
defaultValue: '“{{app}}” isn’t in the draft yet',
|
|
39
|
+
})
|
|
40
|
+
: t('preview.empty.nothingTitle', { defaultValue: 'Nothing to preview yet' }) }), _jsx(EmptyDescription, { children: failed
|
|
41
|
+
? t('preview.empty.loadFailedDescription', {
|
|
42
|
+
defaultValue: 'The draft overlay could not be read. Retry, or check your connection.',
|
|
43
|
+
})
|
|
44
|
+
: t('preview.empty.notReadyDescription', {
|
|
45
|
+
defaultValue: 'The build may still be running, or it may have failed before this app was staged. Check the conversation for the build status — this pane refreshes as drafts land.',
|
|
46
|
+
}) }), _jsx("div", { className: "mt-4 flex justify-center", children: _jsxs(Button, { variant: "outline", onClick: onRetry, "data-testid": "preview-draft-retry", children: [_jsx(RefreshCw, { className: "mr-1.5 h-3.5 w-3.5" }), t('preview.empty.retry', { defaultValue: 'Retry' })] }) })] }) }));
|
|
47
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
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
|
+
* ADR-0037 Live Canvas — preview mode plumbing.
|
|
10
|
+
*
|
|
11
|
+
* One URL flag (`?preview=draft`) flips the whole renderer tree into
|
|
12
|
+
* "as-if-published" mode: metadata reads overlay pending ADR-0033 drafts on
|
|
13
|
+
* the active registry, so an unpublished app/view/dashboard renders exactly
|
|
14
|
+
* what Publish would make real. The canvas (and the Preview button in chat)
|
|
15
|
+
* navigate with this flag; everything below just reads the context.
|
|
16
|
+
*
|
|
17
|
+
* Read-only by design: preview changes the SOURCE of metadata reads, never
|
|
18
|
+
* writes, and Publish remains the single commit gate.
|
|
19
|
+
*/
|
|
20
|
+
import { type ReactNode } from 'react';
|
|
21
|
+
/** Query flag that switches the console into draft-preview mode. */
|
|
22
|
+
export declare const PREVIEW_QUERY_FLAG = "preview";
|
|
23
|
+
export declare const PREVIEW_QUERY_VALUE = "draft";
|
|
24
|
+
/** True when `search` (a `location.search` string) carries `preview=draft`. */
|
|
25
|
+
export declare function isPreviewSearch(search: string): boolean;
|
|
26
|
+
/**
|
|
27
|
+
* Declare that the NEXT navigation is an intentional exit from draft preview.
|
|
28
|
+
* Call right before navigating away (e.g. the preview bar's Exit button);
|
|
29
|
+
* without it, the sticky keeper re-applies `?preview=draft` to in-app
|
|
30
|
+
* navigation so a click inside the previewed app can't silently drop the
|
|
31
|
+
* draft world mid-session.
|
|
32
|
+
*/
|
|
33
|
+
export declare function markPreviewExit(): void;
|
|
34
|
+
/**
|
|
35
|
+
* Provides the preview-mode flag to the tree. Reads the router location
|
|
36
|
+
* LIVE, so entering/leaving `?preview=draft` flips consumers without a
|
|
37
|
+
* remount. `force` overrides the URL — the Live Canvas mounts its embedded
|
|
38
|
+
* renderer subtree with `force` so the canvas is always a draft window
|
|
39
|
+
* regardless of the host page's own URL.
|
|
40
|
+
*
|
|
41
|
+
* STICKY by design: preview is URL-keyed, but in-app navigation (the app's
|
|
42
|
+
* landing redirect, sidebar links, row clicks) builds URLs without the
|
|
43
|
+
* query string. Once the tree is in preview, this provider re-applies the
|
|
44
|
+
* flag (history REPLACE, no extra entry) to any same-session navigation
|
|
45
|
+
* that lost it — so the only way out of the draft world is the explicit
|
|
46
|
+
* Exit affordance ({@link markPreviewExit}), never an accidental click.
|
|
47
|
+
*/
|
|
48
|
+
export declare function PreviewModeProvider({ force, children }: {
|
|
49
|
+
force?: boolean;
|
|
50
|
+
children: ReactNode;
|
|
51
|
+
}): import("react").JSX.Element;
|
|
52
|
+
/**
|
|
53
|
+
* Whether the current tree renders the draft-overlaid world. Defaults to
|
|
54
|
+
* false outside a provider, so surfaces that never mount preview (login,
|
|
55
|
+
* bare pages) keep reading published metadata only.
|
|
56
|
+
*/
|
|
57
|
+
export declare function usePreviewDrafts(): boolean;
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { jsx as _jsx } 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-0037 Live Canvas — preview mode plumbing.
|
|
11
|
+
*
|
|
12
|
+
* One URL flag (`?preview=draft`) flips the whole renderer tree into
|
|
13
|
+
* "as-if-published" mode: metadata reads overlay pending ADR-0033 drafts on
|
|
14
|
+
* the active registry, so an unpublished app/view/dashboard renders exactly
|
|
15
|
+
* what Publish would make real. The canvas (and the Preview button in chat)
|
|
16
|
+
* navigate with this flag; everything below just reads the context.
|
|
17
|
+
*
|
|
18
|
+
* Read-only by design: preview changes the SOURCE of metadata reads, never
|
|
19
|
+
* writes, and Publish remains the single commit gate.
|
|
20
|
+
*/
|
|
21
|
+
import { createContext, useContext, useEffect, useMemo, useState } from 'react';
|
|
22
|
+
import { useLocation, useNavigate } from 'react-router-dom';
|
|
23
|
+
const PreviewModeContext = createContext(false);
|
|
24
|
+
/** Query flag that switches the console into draft-preview mode. */
|
|
25
|
+
export const PREVIEW_QUERY_FLAG = 'preview';
|
|
26
|
+
export const PREVIEW_QUERY_VALUE = 'draft';
|
|
27
|
+
/** True when `search` (a `location.search` string) carries `preview=draft`. */
|
|
28
|
+
export function isPreviewSearch(search) {
|
|
29
|
+
return new URLSearchParams(search).get(PREVIEW_QUERY_FLAG) === PREVIEW_QUERY_VALUE;
|
|
30
|
+
}
|
|
31
|
+
// Set by markPreviewExit() for exactly one navigation: the user explicitly
|
|
32
|
+
// left preview (DraftPreviewBar's Exit / post-publish), so the keeper below
|
|
33
|
+
// must NOT re-stick the flag onto the next location.
|
|
34
|
+
let previewExitRequested = false;
|
|
35
|
+
/**
|
|
36
|
+
* Declare that the NEXT navigation is an intentional exit from draft preview.
|
|
37
|
+
* Call right before navigating away (e.g. the preview bar's Exit button);
|
|
38
|
+
* without it, the sticky keeper re-applies `?preview=draft` to in-app
|
|
39
|
+
* navigation so a click inside the previewed app can't silently drop the
|
|
40
|
+
* draft world mid-session.
|
|
41
|
+
*/
|
|
42
|
+
export function markPreviewExit() {
|
|
43
|
+
previewExitRequested = true;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Provides the preview-mode flag to the tree. Reads the router location
|
|
47
|
+
* LIVE, so entering/leaving `?preview=draft` flips consumers without a
|
|
48
|
+
* remount. `force` overrides the URL — the Live Canvas mounts its embedded
|
|
49
|
+
* renderer subtree with `force` so the canvas is always a draft window
|
|
50
|
+
* regardless of the host page's own URL.
|
|
51
|
+
*
|
|
52
|
+
* STICKY by design: preview is URL-keyed, but in-app navigation (the app's
|
|
53
|
+
* landing redirect, sidebar links, row clicks) builds URLs without the
|
|
54
|
+
* query string. Once the tree is in preview, this provider re-applies the
|
|
55
|
+
* flag (history REPLACE, no extra entry) to any same-session navigation
|
|
56
|
+
* that lost it — so the only way out of the draft world is the explicit
|
|
57
|
+
* Exit affordance ({@link markPreviewExit}), never an accidental click.
|
|
58
|
+
*/
|
|
59
|
+
export function PreviewModeProvider({ force, children }) {
|
|
60
|
+
const location = useLocation();
|
|
61
|
+
const navigate = useNavigate();
|
|
62
|
+
const fromUrl = useMemo(() => isPreviewSearch(location.search), [location.search]);
|
|
63
|
+
// Sticky state: stays true across the flag-less navigation window so the
|
|
64
|
+
// CONTEXT VALUE never flickers false mid-session. A flicker is not benign —
|
|
65
|
+
// it swaps the whole metadata source to published for one render, which
|
|
66
|
+
// (a) wastes a full refetch and (b) feeds cross-world diffs to effects
|
|
67
|
+
// like NavigationSyncEffect that must never see the two worlds as one
|
|
68
|
+
// timeline (that misread once WROTE nav changes from inside a preview).
|
|
69
|
+
const [sticky, setSticky] = useState(fromUrl);
|
|
70
|
+
useEffect(() => {
|
|
71
|
+
if (fromUrl) {
|
|
72
|
+
setSticky(true);
|
|
73
|
+
previewExitRequested = false;
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
if (!sticky)
|
|
77
|
+
return;
|
|
78
|
+
if (previewExitRequested) {
|
|
79
|
+
previewExitRequested = false;
|
|
80
|
+
setSticky(false);
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
// In-app navigation lost the flag without an explicit exit — restore it
|
|
84
|
+
// in place (history REPLACE, no extra entry) so a refresh/share of the
|
|
85
|
+
// URL stays in the draft world too.
|
|
86
|
+
const params = new URLSearchParams(location.search);
|
|
87
|
+
params.set(PREVIEW_QUERY_FLAG, PREVIEW_QUERY_VALUE);
|
|
88
|
+
navigate(`${location.pathname}?${params.toString()}${location.hash}`, { replace: true });
|
|
89
|
+
}, [fromUrl, sticky, location.pathname, location.search, location.hash, navigate]);
|
|
90
|
+
return (_jsx(PreviewModeContext.Provider, { value: force ?? (fromUrl || sticky), children: children }));
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Whether the current tree renders the draft-overlaid world. Defaults to
|
|
94
|
+
* false outside a provider, so surfaces that never mount preview (login,
|
|
95
|
+
* bare pages) keep reading published metadata only.
|
|
96
|
+
*/
|
|
97
|
+
export function usePreviewDrafts() {
|
|
98
|
+
return useContext(PreviewModeContext);
|
|
99
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
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
|
+
export declare function UnpublishedAppBar(): import("react").JSX.Element | null;
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } 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, History, 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 { CommitTimeline } from './CommitTimeline';
|
|
30
|
+
import { usePreviewDrafts } from './PreviewModeContext';
|
|
31
|
+
export function UnpublishedAppBar() {
|
|
32
|
+
const preview = usePreviewDrafts();
|
|
33
|
+
const { appName } = useParams();
|
|
34
|
+
const location = useLocation();
|
|
35
|
+
const { apps, refresh } = useMetadata();
|
|
36
|
+
const { t } = useObjectTranslation();
|
|
37
|
+
const [publishing, setPublishing] = useState(false);
|
|
38
|
+
const [historyOpen, setHistoryOpen] = useState(false);
|
|
39
|
+
// The draft-preview watermark owns the preview tree; never stack both bars.
|
|
40
|
+
if (preview)
|
|
41
|
+
return null;
|
|
42
|
+
const routeApp = appName ?? location.pathname.match(/\/apps\/([^/?#]+)/)?.[1];
|
|
43
|
+
if (!routeApp)
|
|
44
|
+
return null;
|
|
45
|
+
const app = matchAppBySegment(apps ?? [], routeApp);
|
|
46
|
+
if (!app || app.hidden !== true)
|
|
47
|
+
return null;
|
|
48
|
+
// ADR-0067 — the package this app belongs to keys its commit timeline.
|
|
49
|
+
const packageId = app?.packageId ?? app?._packageId ?? null;
|
|
50
|
+
const publish = async () => {
|
|
51
|
+
setPublishing(true);
|
|
52
|
+
try {
|
|
53
|
+
// Publish = the ADR-0045 visibility flip: one metadata write, no
|
|
54
|
+
// lifecycle machinery. Body is the full current app with hidden:false
|
|
55
|
+
// (the meta save endpoint replaces the overlay row).
|
|
56
|
+
const res = await fetch(`/api/v1/meta/app/${encodeURIComponent(routeApp)}`, {
|
|
57
|
+
method: 'PUT',
|
|
58
|
+
credentials: 'include',
|
|
59
|
+
headers: { 'Content-Type': 'application/json', Accept: 'application/json' },
|
|
60
|
+
body: JSON.stringify({ ...app, hidden: false }),
|
|
61
|
+
});
|
|
62
|
+
if (!res.ok) {
|
|
63
|
+
const payload = await res.json().catch(() => null);
|
|
64
|
+
throw new Error(payload?.error?.message ?? payload?.error ?? `HTTP ${res.status}`);
|
|
65
|
+
}
|
|
66
|
+
toast.success(t('preview.unpublishedBar.published', {
|
|
67
|
+
defaultValue: 'Published! The app is now visible to your users.',
|
|
68
|
+
}));
|
|
69
|
+
refresh?.();
|
|
70
|
+
}
|
|
71
|
+
catch (e) {
|
|
72
|
+
toast.error(`${t('preview.unpublishedBar.publishFailed', { defaultValue: 'Publish failed' })}: ${e.message}`);
|
|
73
|
+
}
|
|
74
|
+
finally {
|
|
75
|
+
setPublishing(false);
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
return (_jsxs(_Fragment, { children: [_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', {
|
|
79
|
+
defaultValue: 'Unpublished app — fully functional, but only builders can see it. Publish to make it visible to your users.',
|
|
80
|
+
}) }), packageId ? (_jsxs(Button, { size: "sm", variant: "outline", onClick: () => setHistoryOpen(true), "data-testid": "unpublished-app-history", children: [_jsx(History, { className: "mr-1 h-3.5 w-3.5" }), t('preview.history.button', { defaultValue: 'History' })] })) : null, _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
|
|
81
|
+
? t('preview.unpublishedBar.publishing', { defaultValue: 'Publishing…' })
|
|
82
|
+
: t('preview.unpublishedBar.publish', { defaultValue: 'Publish' })] })] }), packageId ? (_jsx(CommitTimeline, { open: historyOpen, onOpenChange: setHistoryOpen, packageId: packageId, onReverted: refresh })) : null] }));
|
|
83
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
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
|
+
* ADR-0067 — package-scoped commit history reads/writes for the timeline.
|
|
10
|
+
*
|
|
11
|
+
* Each AI build (and Studio batch) lands as one revertible COMMIT on top of
|
|
12
|
+
* the metadata history. The history-not-confirm model: you don't approve each
|
|
13
|
+
* publish — you review this timeline and revert if a change was wrong. These
|
|
14
|
+
* helpers read the timeline (`GET /packages/:id/commits`) and revert one
|
|
15
|
+
* commit (`POST /packages/:id/commits/:cid/revert`). Cookie-authenticated like
|
|
16
|
+
* every console call; tolerant of the `{ data: ... }` / bare envelope shapes.
|
|
17
|
+
*/
|
|
18
|
+
export interface CommitEntry {
|
|
19
|
+
id: string;
|
|
20
|
+
operation: 'apply' | 'revert';
|
|
21
|
+
message?: string;
|
|
22
|
+
actor?: string;
|
|
23
|
+
aiModel?: string;
|
|
24
|
+
itemCount: number;
|
|
25
|
+
createdAt?: string;
|
|
26
|
+
}
|
|
27
|
+
export declare function fetchCommits(packageId: string): Promise<CommitEntry[]>;
|
|
28
|
+
export declare function revertCommit(packageId: string, commitId: string): Promise<void>;
|
|
@@ -0,0 +1,48 @@
|
|
|
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
|
+
export async function fetchCommits(packageId) {
|
|
9
|
+
const res = await fetch(`/api/v1/packages/${encodeURIComponent(packageId)}/commits`, {
|
|
10
|
+
credentials: 'include',
|
|
11
|
+
headers: { Accept: 'application/json' },
|
|
12
|
+
cache: 'no-store',
|
|
13
|
+
});
|
|
14
|
+
if (!res.ok)
|
|
15
|
+
throw new Error(`commits HTTP ${res.status}`);
|
|
16
|
+
const data = (await res.json());
|
|
17
|
+
const list = Array.isArray(data)
|
|
18
|
+
? data
|
|
19
|
+
: data?.commits ??
|
|
20
|
+
data?.data?.commits ??
|
|
21
|
+
[];
|
|
22
|
+
return (Array.isArray(list) ? list : []).map((raw) => {
|
|
23
|
+
const c = raw;
|
|
24
|
+
return {
|
|
25
|
+
id: String(c.id),
|
|
26
|
+
operation: c.operation === 'revert' ? 'revert' : 'apply',
|
|
27
|
+
message: typeof c.message === 'string' ? c.message : undefined,
|
|
28
|
+
actor: typeof c.actor === 'string' ? c.actor : undefined,
|
|
29
|
+
aiModel: typeof c.aiModel === 'string' ? c.aiModel : undefined,
|
|
30
|
+
itemCount: typeof c.itemCount === 'number' ? c.itemCount : 0,
|
|
31
|
+
createdAt: typeof c.createdAt === 'string' ? c.createdAt : undefined,
|
|
32
|
+
};
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
export async function revertCommit(packageId, commitId) {
|
|
36
|
+
const res = await fetch(`/api/v1/packages/${encodeURIComponent(packageId)}/commits/${encodeURIComponent(commitId)}/revert`, {
|
|
37
|
+
method: 'POST',
|
|
38
|
+
credentials: 'include',
|
|
39
|
+
headers: { 'Content-Type': 'application/json', Accept: 'application/json' },
|
|
40
|
+
body: '{}',
|
|
41
|
+
});
|
|
42
|
+
const payload = (await res.json().catch(() => null));
|
|
43
|
+
const inner = payload?.data ?? payload ?? undefined;
|
|
44
|
+
if (!res.ok || inner?.success === false) {
|
|
45
|
+
const err = payload?.error;
|
|
46
|
+
throw new Error((typeof err === 'object' ? err?.message : err) ?? `HTTP ${res.status}`);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
@@ -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;
|