@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
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { jsx as _jsx } from "react/jsx-runtime";
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.
|
|
3
3
|
/**
|
|
4
4
|
* PagePreview — renders a Page metadata record using the runtime
|
|
@@ -9,9 +9,15 @@ import { jsx as _jsx } from "react/jsx-runtime";
|
|
|
9
9
|
* threaded in: previews run in a sandbox with no params context.
|
|
10
10
|
*/
|
|
11
11
|
import * as React from 'react';
|
|
12
|
-
import { SchemaRenderer } from '@object-ui/react';
|
|
12
|
+
import { SchemaRenderer, RecordContextProvider } from '@object-ui/react';
|
|
13
|
+
import { buildExpandFields } from '@object-ui/core';
|
|
14
|
+
import { buildDefaultPageSchema } from '@object-ui/plugin-detail';
|
|
13
15
|
import { PreviewShell, PreviewErrorBoundary, PreviewMessage } from './PreviewShell';
|
|
14
|
-
|
|
16
|
+
import { OutlineStrip } from './OutlineStrip';
|
|
17
|
+
import { PageBlockCanvas } from './PageBlockCanvas';
|
|
18
|
+
import { InterfaceListPage } from '../../InterfaceListPage';
|
|
19
|
+
import { t as tr } from '../i18n';
|
|
20
|
+
export function PagePreview({ draft, editing, selection, onSelectionChange, onPatch, locale }) {
|
|
15
21
|
const schema = React.useMemo(() => {
|
|
16
22
|
// SchemaRenderer needs a `type` discriminator. Page schemas may
|
|
17
23
|
// omit it (Page is the implicit type at this metadata level), so
|
|
@@ -19,8 +25,197 @@ export function PagePreview({ draft }) {
|
|
|
19
25
|
const t = draft.type ?? 'page';
|
|
20
26
|
return { ...draft, type: t };
|
|
21
27
|
}, [draft]);
|
|
28
|
+
const designMode = !!(editing && onSelectionChange);
|
|
29
|
+
const canEdit = designMode && !!onPatch;
|
|
30
|
+
const selectedId = selection && selection.kind === 'block' ? selection.id : null;
|
|
31
|
+
// ADR-0047 interface pages are config-driven, not region-composed. The
|
|
32
|
+
// runtime (PageView) renders them via InterfaceListPage; the generic
|
|
33
|
+
// SchemaRenderer fallback would only produce a bare list shell with no
|
|
34
|
+
// source binding or user filters. Computed here, consumed after all hooks
|
|
35
|
+
// (the early return must not sit above later hooks — Rules of Hooks).
|
|
36
|
+
const isInterfacePage = !!draft?.interfaceConfig?.source;
|
|
37
|
+
// Pages may use either of two canonical shapes:
|
|
38
|
+
// 1. `regions: [{ name, components: [...] }]` (ObjectStack spec, used by seeded pages)
|
|
39
|
+
// 2. `children: [...]` (raw SDUI tree shape)
|
|
40
|
+
// Detect which one is in use and surface chips/IDs accordingly.
|
|
41
|
+
const shape = React.useMemo(() => {
|
|
42
|
+
if (Array.isArray(draft.regions))
|
|
43
|
+
return 'regions';
|
|
44
|
+
return 'children';
|
|
45
|
+
}, [draft]);
|
|
46
|
+
const blockEntries = React.useMemo(() => {
|
|
47
|
+
if (shape === 'regions') {
|
|
48
|
+
const regions = draft.regions;
|
|
49
|
+
const out = [];
|
|
50
|
+
regions.forEach((r, i) => {
|
|
51
|
+
const comps = Array.isArray(r.components) ? r.components : [];
|
|
52
|
+
comps.forEach((c, j) => {
|
|
53
|
+
out.push({
|
|
54
|
+
id: `regions[${i}].components[${j}]`,
|
|
55
|
+
label: c.id || c.type || `${r.name ?? `region ${i + 1}`} · ${j + 1}`,
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
return out;
|
|
60
|
+
}
|
|
61
|
+
const children = Array.isArray(draft.children) ? draft.children : [];
|
|
62
|
+
return children.map((b, i) => ({ id: `children[${i}]`, label: b.id || b.type || `block ${i + 1}` }));
|
|
63
|
+
}, [draft, shape]);
|
|
64
|
+
const handleAddBlock = React.useCallback(() => {
|
|
65
|
+
if (!canEdit)
|
|
66
|
+
return;
|
|
67
|
+
// `container` is a safe default that renders an empty box and
|
|
68
|
+
// accepts further nested children — the user picks the real type
|
|
69
|
+
// from the inspector immediately after.
|
|
70
|
+
const newBlock = { type: 'container' };
|
|
71
|
+
if (shape === 'regions') {
|
|
72
|
+
const regions = Array.isArray(draft.regions) ? [...draft.regions] : [];
|
|
73
|
+
// Append to the last region; create a default region if none exist.
|
|
74
|
+
let targetIdx = regions.length - 1;
|
|
75
|
+
if (targetIdx < 0) {
|
|
76
|
+
regions.push({ name: 'main', components: [] });
|
|
77
|
+
targetIdx = 0;
|
|
78
|
+
}
|
|
79
|
+
const region = { ...regions[targetIdx] };
|
|
80
|
+
const comps = Array.isArray(region.components) ? [...region.components] : [];
|
|
81
|
+
comps.push(newBlock);
|
|
82
|
+
region.components = comps;
|
|
83
|
+
regions[targetIdx] = region;
|
|
84
|
+
onPatch({ regions });
|
|
85
|
+
onSelectionChange?.({ kind: 'block', id: `regions[${targetIdx}].components[${comps.length - 1}]`, label: newBlock.type });
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
const children = Array.isArray(draft.children) ? draft.children : [];
|
|
89
|
+
const next = [...children, newBlock];
|
|
90
|
+
onPatch({ children: next });
|
|
91
|
+
onSelectionChange?.({ kind: 'block', id: `children[${next.length - 1}]`, label: newBlock.type });
|
|
92
|
+
}, [canEdit, draft, onPatch, onSelectionChange, shape]);
|
|
93
|
+
// ── Record binding ──────────────────────────────────────────────────────
|
|
94
|
+
// A `type: 'record'` page's `record:*` blocks (details / highlights / path /
|
|
95
|
+
// alert) read their data from <RecordContextProvider>. The metadata editor
|
|
96
|
+
// has no record route, so without binding a sample they render the
|
|
97
|
+
// "bind a record to preview" placeholder — i.e. the author designs blind.
|
|
98
|
+
// Fetch a handful of real records of the bound object + its schema and let
|
|
99
|
+
// the author pick which one to preview against (mirrors the runtime
|
|
100
|
+
// RecordDetailView's RecordContextProvider).
|
|
101
|
+
// Match the runtime resolver (usePageAssignment): a record page is keyed by
|
|
102
|
+
// either bare `type: 'record'` (editor draft shape) or `pageType: 'record'`
|
|
103
|
+
// (persisted envelope shape). Both must bind a sample record so record:*
|
|
104
|
+
// blocks render real data.
|
|
105
|
+
const isRecordPage = draft?.type === 'record'
|
|
106
|
+
|| draft?.pageType === 'record';
|
|
107
|
+
const recordObject = isRecordPage ? draft?.object : undefined;
|
|
108
|
+
const [recordSamples, setRecordSamples] = React.useState([]);
|
|
109
|
+
const [recordSchema, setRecordSchema] = React.useState(null);
|
|
110
|
+
const [selectedRecordId, setSelectedRecordId] = React.useState(null);
|
|
111
|
+
React.useEffect(() => {
|
|
112
|
+
if (!recordObject) {
|
|
113
|
+
setRecordSamples([]);
|
|
114
|
+
setRecordSchema(null);
|
|
115
|
+
setSelectedRecordId(null);
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
let cancelled = false;
|
|
119
|
+
(async () => {
|
|
120
|
+
try {
|
|
121
|
+
const opts = { headers: { accept: 'application/json' }, credentials: 'include' };
|
|
122
|
+
// Schema first: it tells us which fields are lookup/master_detail so we
|
|
123
|
+
// can `$expand` them. Without expansion record:details/highlights would
|
|
124
|
+
// show raw foreign-key IDs (e.g. "O4VKrNesnsj2JYMa") instead of display
|
|
125
|
+
// names — the runtime RecordDetailView $expands for exactly this reason.
|
|
126
|
+
const schemaRes = await fetch(`/api/v1/meta/object/${encodeURIComponent(recordObject)}`, opts);
|
|
127
|
+
const schemaJson = await schemaRes.json().catch(() => null);
|
|
128
|
+
const schema = schemaJson?.item ?? schemaJson?.data ?? schemaJson;
|
|
129
|
+
const expand = buildExpandFields(schema?.fields);
|
|
130
|
+
const query = expand.length > 0
|
|
131
|
+
? `?$top=50&$expand=${encodeURIComponent(expand.join(','))}`
|
|
132
|
+
: `?$top=50`;
|
|
133
|
+
const recsRes = await fetch(`/api/v1/data/${encodeURIComponent(recordObject)}${query}`, opts);
|
|
134
|
+
const recsJson = await recsRes.json().catch(() => null);
|
|
135
|
+
// The REST data endpoint returns `{ object, records, total, hasMore }`;
|
|
136
|
+
// tolerate the other common envelopes too.
|
|
137
|
+
const recs = Array.isArray(recsJson?.records) ? recsJson.records
|
|
138
|
+
: Array.isArray(recsJson?.items) ? recsJson.items
|
|
139
|
+
: Array.isArray(recsJson?.data) ? recsJson.data
|
|
140
|
+
: Array.isArray(recsJson) ? recsJson : [];
|
|
141
|
+
if (cancelled)
|
|
142
|
+
return;
|
|
143
|
+
setRecordSamples(recs);
|
|
144
|
+
setRecordSchema(schema);
|
|
145
|
+
// Same id-resolution order as recordIdOf so the initial selection's
|
|
146
|
+
// value matches an <option> even for objects keyed only by `name`.
|
|
147
|
+
setSelectedRecordId((prev) => prev ?? (recs[0]?.id ?? recs[0]?._id ?? recs[0]?.name ?? null));
|
|
148
|
+
}
|
|
149
|
+
catch {
|
|
150
|
+
if (!cancelled) {
|
|
151
|
+
setRecordSamples([]);
|
|
152
|
+
setRecordSchema(null);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
})();
|
|
156
|
+
return () => { cancelled = true; };
|
|
157
|
+
}, [recordObject]);
|
|
158
|
+
const recordIdOf = (r) => r?.id ?? r?._id ?? r?.name;
|
|
159
|
+
const recordLabelOf = (r) => String(r?.name ?? r?.title ?? r?.label ?? r?.subject ?? recordIdOf(r) ?? '(record)');
|
|
160
|
+
const selectedRecord = React.useMemo(() => {
|
|
161
|
+
if (!recordSamples.length)
|
|
162
|
+
return null;
|
|
163
|
+
return recordSamples.find((r) => String(recordIdOf(r)) === String(selectedRecordId)) ?? recordSamples[0];
|
|
164
|
+
}, [recordSamples, selectedRecordId]);
|
|
165
|
+
// ── Slotted record page synthesis ────────────────────────────────────────
|
|
166
|
+
// A `kind: 'slotted'` page carries an empty `regions: []` plus a `slots` map
|
|
167
|
+
// of overrides, so the raw draft renders blank through SchemaRenderer (there
|
|
168
|
+
// are no regions to walk). Mirror the runtime RecordDetailView: synthesize the
|
|
169
|
+
// canonical default page from the bound object's schema and apply the slot
|
|
170
|
+
// overrides via the SAME `buildDefaultPageSchema(objectDef, { slots })` path,
|
|
171
|
+
// so omitted slots fall through to the synthesized header/details/discussion
|
|
172
|
+
// while authored slots (highlights/tabs/…) override in place. Non-slotted
|
|
173
|
+
// pages render their authored schema unchanged.
|
|
174
|
+
const isSlotted = draft?.kind === 'slotted';
|
|
175
|
+
const renderSchema = React.useMemo(() => {
|
|
176
|
+
if (!isSlotted)
|
|
177
|
+
return schema;
|
|
178
|
+
try {
|
|
179
|
+
const slots = draft?.slots ?? {};
|
|
180
|
+
// `recordSchema` arrives async; until then synthesize with no objectDef
|
|
181
|
+
// (structure renders immediately, field-level detail fills in on load).
|
|
182
|
+
return buildDefaultPageSchema(recordSchema ?? undefined, { slots });
|
|
183
|
+
}
|
|
184
|
+
catch {
|
|
185
|
+
return schema;
|
|
186
|
+
}
|
|
187
|
+
}, [isSlotted, schema, draft, recordSchema]);
|
|
188
|
+
// Wrap record-page content in the record context (+ a sample-record picker)
|
|
189
|
+
// so detail/highlights/path/alert blocks render real data. No-op for
|
|
190
|
+
// non-record pages and for record pages with no rows yet (renders the node
|
|
191
|
+
// unchanged so the existing placeholder still shows).
|
|
192
|
+
const withRecordBinding = (node) => {
|
|
193
|
+
if (!recordObject || !selectedRecord)
|
|
194
|
+
return node;
|
|
195
|
+
return (_jsxs(RecordContextProvider, { objectName: recordObject, recordId: recordIdOf(selectedRecord), data: selectedRecord, objectSchema: recordSchema ?? undefined, embedded: true, children: [recordSamples.length > 0 && (_jsxs("div", { className: "flex items-center gap-2 px-3 py-1.5 border-b bg-muted/30 text-xs", children: [_jsx("span", { className: "text-muted-foreground shrink-0", children: "Preview record" }), _jsx("select", { className: "h-7 rounded-md border bg-background px-2 text-xs max-w-[260px]", value: String(selectedRecordId ?? ''), onChange: (e) => setSelectedRecordId(e.target.value), children: recordSamples.map((r) => {
|
|
196
|
+
const id = recordIdOf(r);
|
|
197
|
+
return _jsx("option", { value: String(id), children: recordLabelOf(r) }, String(id));
|
|
198
|
+
}) }), _jsxs("span", { className: "text-muted-foreground/70 shrink-0", children: [recordSamples.length, " sample", recordSamples.length === 1 ? '' : 's'] })] })), node] }));
|
|
199
|
+
};
|
|
200
|
+
// Interface page → always mirror the runtime (InterfaceListPage), in BOTH
|
|
201
|
+
// design and preview modes. These pages are config-driven, not region-
|
|
202
|
+
// composed, so there is nothing to drag on a canvas: the author edits the
|
|
203
|
+
// Properties panel on the right and sees the real list (source view + user
|
|
204
|
+
// filters + data) update live on the left — no tab switch, no placeholder.
|
|
205
|
+
if (isInterfacePage) {
|
|
206
|
+
return (_jsx(PreviewShell, { hint: "page \u00B7 interface", children: _jsx(PreviewErrorBoundary, { fallbackHint: "The interface page references a source object/view that isn't available.", children: _jsx(InterfaceListPage, { page: draft, onConfigChange: canEdit ? (patch) => onPatch({ interfaceConfig: { ...((draft.interfaceConfig) || {}), ...patch } }) : undefined }) }) }));
|
|
207
|
+
}
|
|
208
|
+
// Empty draft → no preview; but if we're in design mode show the
|
|
209
|
+
// canvas so users can author from scratch.
|
|
22
210
|
if (!schema || Object.keys(schema).length <= 1) {
|
|
23
|
-
return (
|
|
211
|
+
return (_jsxs(PreviewShell, { hint: `page${designMode ? ' · design' : ''}`, children: [designMode && shape === 'regions' ? (_jsx(PageBlockCanvas, { draft: draft, onPatch: canEdit ? onPatch : undefined, selection: selection ?? null, onSelectionChange: onSelectionChange })) : designMode ? (_jsx(OutlineStrip, { title: tr('engine.inspector.pageBlock.outlineLabel', locale), entries: blockEntries, selectedId: selectedId, onSelect: (e) => onSelectionChange?.({ kind: 'block', id: e.id, label: e.label }), onAdd: canEdit ? handleAddBlock : undefined, addLabel: tr('engine.inspector.add.block', locale) })) : null, !designMode && _jsx(PreviewMessage, { children: "Add components to the page to see a preview." })] }));
|
|
212
|
+
}
|
|
213
|
+
// Design mode with regions shape — show the form-canvas style
|
|
214
|
+
// designer instead of the runtime renderer so authors can drag,
|
|
215
|
+
// rename, and add blocks inline. The outline strip becomes
|
|
216
|
+
// redundant in this view.
|
|
217
|
+
if (designMode && shape === 'regions') {
|
|
218
|
+
return (_jsx(PreviewShell, { hint: `page · design`, children: withRecordBinding(_jsx(PageBlockCanvas, { draft: draft, onPatch: canEdit ? onPatch : undefined, selection: selection ?? null, onSelectionChange: onSelectionChange })) }));
|
|
24
219
|
}
|
|
25
|
-
return (_jsx(PreviewShell, { hint:
|
|
220
|
+
return (_jsx(PreviewShell, { hint: `page${designMode ? ' · design' : ''}`, children: _jsxs(PreviewErrorBoundary, { fallbackHint: "The Page schema is incomplete or references a component that hasn't been registered yet.", children: [designMode && (_jsx(OutlineStrip, { title: tr('engine.inspector.pageBlock.outlineLabel', locale), entries: blockEntries, selectedId: selectedId, onSelect: (e) => onSelectionChange?.({ kind: 'block', id: e.id, label: e.label }), onAdd: canEdit ? handleAddBlock : undefined, addLabel: tr('engine.inspector.add.block', locale) })), withRecordBinding(_jsx("div", { className: "min-h-[200px] max-h-[70vh] overflow-auto p-4", children: _jsx(SchemaRenderer, { schema: renderSchema }) }))] }) }));
|
|
26
221
|
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PermissionPreview — read-only heatmap of a Permission Set draft.
|
|
3
|
+
*
|
|
4
|
+
* Permission Sets get edited as deeply-nested JSON in the generic
|
|
5
|
+
* form, which makes it nearly impossible to spot mistakes like
|
|
6
|
+
* "Account: edit without read" or "this set has zero objects". The
|
|
7
|
+
* preview renders the matrix that operators actually reason about:
|
|
8
|
+
*
|
|
9
|
+
* 1. Header strip: name, profile/permission-set flag, system perms
|
|
10
|
+
* count, tab perms count, RLS rule count.
|
|
11
|
+
* 2. Object × CRUD-VAMA grid. Each row is one object; each column
|
|
12
|
+
* is one capability (Create/Read/Edit/Delete/Transfer/Restore/
|
|
13
|
+
* Purge/ViewAll/ModifyAll). Cells are colored chips — green when
|
|
14
|
+
* granted, neutral when not, amber when "View All" or "Modify
|
|
15
|
+
* All" is on (highlighting the bypass).
|
|
16
|
+
* 3. Field-level security: grouped by object, only fields with a
|
|
17
|
+
* non-default setting are listed (read=false or editable=true).
|
|
18
|
+
* 4. System permissions + Tab visibility as compact chip lists.
|
|
19
|
+
*
|
|
20
|
+
* Sanity-check banner at the bottom flags risky combinations:
|
|
21
|
+
* • allowEdit without allowRead (silently fails at runtime)
|
|
22
|
+
* • allowDelete without allowRead
|
|
23
|
+
* • modifyAllRecords without viewAllRecords
|
|
24
|
+
*/
|
|
25
|
+
import * as React from 'react';
|
|
26
|
+
import type { MetadataPreviewProps } from '../preview-registry';
|
|
27
|
+
export declare function PermissionPreview({ name, draft }: MetadataPreviewProps): React.JSX.Element;
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.
|
|
3
|
+
/**
|
|
4
|
+
* PermissionPreview — read-only heatmap of a Permission Set draft.
|
|
5
|
+
*
|
|
6
|
+
* Permission Sets get edited as deeply-nested JSON in the generic
|
|
7
|
+
* form, which makes it nearly impossible to spot mistakes like
|
|
8
|
+
* "Account: edit without read" or "this set has zero objects". The
|
|
9
|
+
* preview renders the matrix that operators actually reason about:
|
|
10
|
+
*
|
|
11
|
+
* 1. Header strip: name, profile/permission-set flag, system perms
|
|
12
|
+
* count, tab perms count, RLS rule count.
|
|
13
|
+
* 2. Object × CRUD-VAMA grid. Each row is one object; each column
|
|
14
|
+
* is one capability (Create/Read/Edit/Delete/Transfer/Restore/
|
|
15
|
+
* Purge/ViewAll/ModifyAll). Cells are colored chips — green when
|
|
16
|
+
* granted, neutral when not, amber when "View All" or "Modify
|
|
17
|
+
* All" is on (highlighting the bypass).
|
|
18
|
+
* 3. Field-level security: grouped by object, only fields with a
|
|
19
|
+
* non-default setting are listed (read=false or editable=true).
|
|
20
|
+
* 4. System permissions + Tab visibility as compact chip lists.
|
|
21
|
+
*
|
|
22
|
+
* Sanity-check banner at the bottom flags risky combinations:
|
|
23
|
+
* • allowEdit without allowRead (silently fails at runtime)
|
|
24
|
+
* • allowDelete without allowRead
|
|
25
|
+
* • modifyAllRecords without viewAllRecords
|
|
26
|
+
*/
|
|
27
|
+
import * as React from 'react';
|
|
28
|
+
import { AlertTriangle, CheckCircle2, Circle, Eye, Layers, Lock, ShieldCheck, Star, Tag, } from 'lucide-react';
|
|
29
|
+
import { PreviewShell, PreviewMessage, PreviewErrorBoundary } from './PreviewShell';
|
|
30
|
+
const CAPS = [
|
|
31
|
+
{ key: 'allowCreate', short: 'C', long: 'Create' },
|
|
32
|
+
{ key: 'allowRead', short: 'R', long: 'Read' },
|
|
33
|
+
{ key: 'allowEdit', short: 'U', long: 'Edit' },
|
|
34
|
+
{ key: 'allowDelete', short: 'D', long: 'Delete' },
|
|
35
|
+
{ key: 'allowTransfer', short: 'T', long: 'Transfer' },
|
|
36
|
+
{ key: 'allowRestore', short: 'Re', long: 'Restore' },
|
|
37
|
+
{ key: 'allowPurge', short: 'P', long: 'Purge', danger: true },
|
|
38
|
+
{ key: 'viewAllRecords', short: 'V*', long: 'View All', danger: true },
|
|
39
|
+
{ key: 'modifyAllRecords', short: 'M*', long: 'Modify All', danger: true },
|
|
40
|
+
];
|
|
41
|
+
function findWarnings(objects) {
|
|
42
|
+
const out = [];
|
|
43
|
+
for (const [obj, p] of Object.entries(objects)) {
|
|
44
|
+
if (p.allowEdit && !p.allowRead)
|
|
45
|
+
out.push({ object: obj, message: 'Edit granted without Read (record updates will fail).' });
|
|
46
|
+
if (p.allowDelete && !p.allowRead)
|
|
47
|
+
out.push({ object: obj, message: 'Delete granted without Read.' });
|
|
48
|
+
if (p.modifyAllRecords && !p.viewAllRecords)
|
|
49
|
+
out.push({ object: obj, message: 'Modify All without View All — modifications may target invisible records.' });
|
|
50
|
+
if (p.allowPurge && !p.allowDelete)
|
|
51
|
+
out.push({ object: obj, message: 'Purge (hard delete) granted without Delete.' });
|
|
52
|
+
}
|
|
53
|
+
return out;
|
|
54
|
+
}
|
|
55
|
+
export function PermissionPreview({ name, draft }) {
|
|
56
|
+
const d = draft;
|
|
57
|
+
const permName = String(d.name ?? name ?? '');
|
|
58
|
+
const label = String(d.label ?? permName);
|
|
59
|
+
const isProfile = !!d.isProfile;
|
|
60
|
+
const objects = (d.objects ?? {});
|
|
61
|
+
const fields = (d.fields ?? {});
|
|
62
|
+
const systemPerms = Array.isArray(d.systemPermissions) ? d.systemPermissions : [];
|
|
63
|
+
const tabPerms = (d.tabPermissions ?? {});
|
|
64
|
+
const rls = Array.isArray(d.rowLevelSecurity) ? d.rowLevelSecurity : [];
|
|
65
|
+
const objectNames = React.useMemo(() => Object.keys(objects).sort(), [objects]);
|
|
66
|
+
const warnings = React.useMemo(() => findWarnings(objects), [objects]);
|
|
67
|
+
// Group field permissions by object name (key format: "<object>.<field>").
|
|
68
|
+
const fieldsByObject = React.useMemo(() => {
|
|
69
|
+
const out = new Map();
|
|
70
|
+
for (const [key, perm] of Object.entries(fields)) {
|
|
71
|
+
const [obj, ...rest] = key.split('.');
|
|
72
|
+
if (!obj || rest.length === 0)
|
|
73
|
+
continue;
|
|
74
|
+
const fname = rest.join('.');
|
|
75
|
+
// Only surface entries that diverge from the default (read=true, edit=false).
|
|
76
|
+
const isNonDefault = perm.readable === false || perm.editable === true;
|
|
77
|
+
if (!isNonDefault)
|
|
78
|
+
continue;
|
|
79
|
+
if (!out.has(obj))
|
|
80
|
+
out.set(obj, []);
|
|
81
|
+
out.get(obj).push({ field: fname, perm });
|
|
82
|
+
}
|
|
83
|
+
return out;
|
|
84
|
+
}, [fields]);
|
|
85
|
+
if (objectNames.length === 0 && systemPerms.length === 0 && Object.keys(tabPerms).length === 0) {
|
|
86
|
+
return (_jsx(PreviewShell, { hint: "permission", children: _jsx(PreviewMessage, { children: "Grant at least one object, system, or tab permission to see the matrix." }) }));
|
|
87
|
+
}
|
|
88
|
+
return (_jsx(PreviewShell, { hint: `permission · ${objectNames.length} object${objectNames.length === 1 ? '' : 's'}`, children: _jsx(PreviewErrorBoundary, { children: _jsxs("div", { className: "p-3 space-y-3", children: [_jsx("div", { className: "rounded border bg-muted/30 p-3", children: _jsxs("div", { className: "flex items-start gap-2", children: [isProfile ? (_jsx(Star, { className: "h-4 w-4 mt-0.5 text-amber-600 shrink-0" })) : (_jsx(ShieldCheck, { className: "h-4 w-4 mt-0.5 text-muted-foreground shrink-0" })), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsxs("div", { className: "flex flex-wrap items-baseline gap-x-2", children: [_jsx("span", { className: "text-sm font-medium truncate", children: label }), _jsx("span", { className: "font-mono text-[10px] text-muted-foreground", children: permName }), _jsx("span", { className: "text-[10px] uppercase tracking-wider text-muted-foreground", children: isProfile ? 'Profile' : 'Permission Set' })] }), _jsxs("div", { className: "mt-1 flex flex-wrap items-center gap-x-3 gap-y-1 text-[11px]", children: [_jsx(Pill, { icon: Layers, label: `${objectNames.length} objects` }), _jsx(Pill, { icon: Tag, label: `${systemPerms.length} system perms` }), _jsx(Pill, { icon: Eye, label: `${Object.keys(tabPerms).length} tabs` }), _jsx(Pill, { icon: Lock, label: `${rls.length} RLS rules` })] })] })] }) }), objectNames.length > 0 && (_jsxs(Section, { title: "Object Permissions", count: objectNames.length, children: [_jsx("div", { className: "rounded border bg-background overflow-x-auto", children: _jsxs("table", { className: "w-full text-xs", children: [_jsx("thead", { children: _jsxs("tr", { className: "bg-muted/30 text-[10px] uppercase tracking-wider text-muted-foreground", children: [_jsx("th", { className: "px-2.5 py-1.5 text-left font-medium sticky left-0 bg-muted/30", children: "Object" }), CAPS.map((c) => (_jsx("th", { className: "px-1.5 py-1.5 text-center font-medium", title: c.long, children: c.short }, c.key)))] }) }), _jsx("tbody", { className: "divide-y", children: objectNames.map((obj) => {
|
|
89
|
+
const p = objects[obj] ?? {};
|
|
90
|
+
return (_jsxs("tr", { children: [_jsx("td", { className: "px-2.5 py-1 font-mono sticky left-0 bg-background", children: obj }), CAPS.map((c) => {
|
|
91
|
+
const granted = !!p[c.key];
|
|
92
|
+
return (_jsx("td", { className: "px-1.5 py-1 text-center", children: _jsx(Cell, { granted: granted, danger: c.danger }) }, c.key));
|
|
93
|
+
})] }, obj));
|
|
94
|
+
}) })] }) }), _jsx(Legend, {})] })), fieldsByObject.size > 0 && (_jsx(Section, { title: "Field-Level Overrides", count: Array.from(fieldsByObject.values()).reduce((a, v) => a + v.length, 0), children: _jsx("div", { className: "rounded border bg-background divide-y text-xs", children: Array.from(fieldsByObject.entries()).sort().map(([obj, entries]) => (_jsxs("div", { className: "px-2.5 py-2", children: [_jsx("div", { className: "font-mono text-[11px] mb-1", children: obj }), _jsx("ul", { className: "flex flex-wrap gap-1", children: entries.map(({ field, perm }) => (_jsxs("li", { className: "inline-flex items-center gap-1 rounded border bg-muted/30 px-1.5 py-0.5", title: `readable=${perm.readable !== false}, editable=${!!perm.editable}`, children: [_jsx("span", { className: "font-mono", children: field }), perm.readable === false && (_jsx("span", { className: "text-[9px] uppercase text-red-700", children: "hidden" })), perm.editable && (_jsx("span", { className: "text-[9px] uppercase text-emerald-700", children: "editable" }))] }, field))) })] }, obj))) }) })), systemPerms.length > 0 && (_jsx(Section, { title: "System Permissions", count: systemPerms.length, children: _jsx("div", { className: "flex flex-wrap gap-1", children: systemPerms.map((s) => (_jsx("span", { className: "inline-flex items-center gap-1 rounded border bg-background px-1.5 py-0.5 text-[11px] font-mono", children: s }, s))) }) })), Object.keys(tabPerms).length > 0 && (_jsx(Section, { title: "Tab Visibility", count: Object.keys(tabPerms).length, children: _jsx("div", { className: "flex flex-wrap gap-1", children: Object.entries(tabPerms).map(([tab, vis]) => (_jsxs("span", { className: "inline-flex items-center gap-1 rounded border bg-background px-1.5 py-0.5 text-[11px]", children: [_jsx("span", { className: "font-mono", children: tab }), _jsx("span", { className: vis === 'hidden'
|
|
95
|
+
? 'text-[9px] uppercase text-red-700'
|
|
96
|
+
: vis === 'visible' || vis === 'default_on'
|
|
97
|
+
? 'text-[9px] uppercase text-emerald-700'
|
|
98
|
+
: 'text-[9px] uppercase text-muted-foreground', children: vis })] }, tab))) }) })), warnings.length > 0 && (_jsxs("div", { className: "rounded border border-amber-200 bg-amber-50 p-2.5 text-xs space-y-1", children: [_jsxs("div", { className: "flex items-center gap-1.5 font-medium text-amber-800", children: [_jsx(AlertTriangle, { className: "h-3.5 w-3.5" }), " ", warnings.length, " sanity check", warnings.length === 1 ? '' : 's', " failed"] }), _jsx("ul", { className: "space-y-0.5", children: warnings.map((w, i) => (_jsxs("li", { className: "text-amber-900", children: [_jsx("code", { className: "font-mono", children: w.object }), ": ", w.message] }, i))) })] }))] }) }) }));
|
|
99
|
+
}
|
|
100
|
+
function Cell({ granted, danger }) {
|
|
101
|
+
if (!granted) {
|
|
102
|
+
return _jsx(Circle, { className: "inline-block h-3 w-3 text-muted-foreground/40", "aria-label": "not granted" });
|
|
103
|
+
}
|
|
104
|
+
const cls = danger ? 'text-amber-600' : 'text-emerald-600';
|
|
105
|
+
return _jsx(CheckCircle2, { className: `inline-block h-3.5 w-3.5 ${cls}`, "aria-label": "granted" });
|
|
106
|
+
}
|
|
107
|
+
function Legend() {
|
|
108
|
+
return (_jsxs("div", { className: "mt-1 flex flex-wrap items-center gap-x-3 gap-y-1 text-[10px] text-muted-foreground", children: [_jsxs("span", { className: "inline-flex items-center gap-1", children: [_jsx(CheckCircle2, { className: "h-3 w-3 text-emerald-600" }), " granted"] }), _jsxs("span", { className: "inline-flex items-center gap-1", children: [_jsx(CheckCircle2, { className: "h-3 w-3 text-amber-600" }), " bypass (View/Modify All, Purge)"] }), _jsxs("span", { className: "inline-flex items-center gap-1", children: [_jsx(Circle, { className: "h-3 w-3 text-muted-foreground/40" }), " not granted"] }), _jsx("span", { className: "ml-auto font-mono", children: "C R U D = CRUD \u00B7 T Re P = Transfer/Restore/Purge \u00B7 V* M* = View/Modify All" })] }));
|
|
109
|
+
}
|
|
110
|
+
function Section({ title, count, children }) {
|
|
111
|
+
return (_jsxs("div", { className: "space-y-1.5", children: [_jsxs("div", { className: "flex items-center gap-2 text-[11px] font-medium text-muted-foreground uppercase tracking-wider", children: [_jsx("span", { children: title }), count != null && _jsxs("span", { className: "opacity-70", children: ["(", count, ")"] })] }), children] }));
|
|
112
|
+
}
|
|
113
|
+
function Pill({ icon: Icon, label, }) {
|
|
114
|
+
return (_jsxs("span", { className: "inline-flex items-center gap-1", children: [Icon && _jsx(Icon, { className: "h-3 w-3 text-muted-foreground" }), _jsx("span", { children: label })] }));
|
|
115
|
+
}
|
|
@@ -5,19 +5,42 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import * as React from 'react';
|
|
7
7
|
export interface PreviewShellProps {
|
|
8
|
-
/**
|
|
8
|
+
/**
|
|
9
|
+
* Right-hand badge/label, e.g. the resolved view type or row count.
|
|
10
|
+
* Kept in the type signature for backward-compat with existing call
|
|
11
|
+
* sites, but no longer rendered — the breadcrumb + canvas toolbar
|
|
12
|
+
* already identify the resource, and the design/preview toggle says
|
|
13
|
+
* which mode we're in. Showing it again here was just chrome.
|
|
14
|
+
*/
|
|
9
15
|
hint?: React.ReactNode;
|
|
10
|
-
/** Optional title override.
|
|
16
|
+
/** Optional title override. No longer rendered (see `hint`). */
|
|
11
17
|
title?: React.ReactNode;
|
|
12
|
-
/**
|
|
18
|
+
/**
|
|
19
|
+
* Optional toolbar rendered on the right of a slim 32px header. When
|
|
20
|
+
* omitted the header is fully suppressed so the preview body extends
|
|
21
|
+
* edge-to-edge inside the canvas border.
|
|
22
|
+
*/
|
|
13
23
|
toolbar?: React.ReactNode;
|
|
14
24
|
children: React.ReactNode;
|
|
15
25
|
}
|
|
16
|
-
export declare function PreviewShell({
|
|
26
|
+
export declare function PreviewShell({ toolbar, children }: PreviewShellProps): React.JSX.Element;
|
|
17
27
|
export declare function PreviewMessage({ tone, children, }: {
|
|
18
28
|
tone?: 'info' | 'warn' | 'error';
|
|
19
29
|
children: React.ReactNode;
|
|
20
|
-
}):
|
|
30
|
+
}): React.JSX.Element;
|
|
31
|
+
/**
|
|
32
|
+
* Centered placeholder for empty/onboarding preview states (e.g. "no
|
|
33
|
+
* source object yet", "no columns defined"). Fills the canvas
|
|
34
|
+
* vertically so the empty-state feels intentional instead of looking
|
|
35
|
+
* like a tiny banner stranded above a vast blank canvas.
|
|
36
|
+
*/
|
|
37
|
+
export declare function PreviewEmptyState({ icon, title, description, action, tone, }: {
|
|
38
|
+
icon?: React.ReactNode;
|
|
39
|
+
title: React.ReactNode;
|
|
40
|
+
description?: React.ReactNode;
|
|
41
|
+
action?: React.ReactNode;
|
|
42
|
+
tone?: 'info' | 'warn';
|
|
43
|
+
}): React.JSX.Element;
|
|
21
44
|
/**
|
|
22
45
|
* Catch render errors from third-party preview renderers so a buggy
|
|
23
46
|
* widget can't blank the whole edit page. Keeps the rest of the tabs
|
|
@@ -36,5 +59,5 @@ export declare class PreviewErrorBoundary extends React.Component<{
|
|
|
36
59
|
error: Error;
|
|
37
60
|
};
|
|
38
61
|
componentDidCatch(error: Error): void;
|
|
39
|
-
render():
|
|
62
|
+
render(): React.JSX.Element;
|
|
40
63
|
}
|
|
@@ -6,9 +6,9 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
6
6
|
* feel like one feature instead of seven one-offs.
|
|
7
7
|
*/
|
|
8
8
|
import * as React from 'react';
|
|
9
|
-
import { AlertCircle,
|
|
10
|
-
export function PreviewShell({
|
|
11
|
-
return (_jsxs("div", { className: "rounded-lg border bg-background overflow-hidden", children: [
|
|
9
|
+
import { AlertCircle, Inbox } from 'lucide-react';
|
|
10
|
+
export function PreviewShell({ toolbar, children }) {
|
|
11
|
+
return (_jsxs("div", { className: "rounded-lg border bg-background overflow-hidden flex flex-col h-full", children: [toolbar != null && (_jsx("div", { className: "flex items-center justify-end border-b bg-muted/20 px-2 py-1 min-h-[32px]", children: toolbar })), _jsx("div", { className: "bg-background flex-1 min-h-0 overflow-auto", children: children })] }));
|
|
12
12
|
}
|
|
13
13
|
export function PreviewMessage({ tone = 'info', children, }) {
|
|
14
14
|
const styles = tone === 'warn'
|
|
@@ -18,6 +18,19 @@ export function PreviewMessage({ tone = 'info', children, }) {
|
|
|
18
18
|
: 'text-muted-foreground border-muted';
|
|
19
19
|
return (_jsxs("div", { className: `m-4 rounded border p-3 text-sm flex items-start gap-2 ${styles}`, children: [tone !== 'info' && _jsx(AlertCircle, { className: "h-4 w-4 mt-0.5 shrink-0" }), _jsx("div", { className: "flex-1", children: children })] }));
|
|
20
20
|
}
|
|
21
|
+
/**
|
|
22
|
+
* Centered placeholder for empty/onboarding preview states (e.g. "no
|
|
23
|
+
* source object yet", "no columns defined"). Fills the canvas
|
|
24
|
+
* vertically so the empty-state feels intentional instead of looking
|
|
25
|
+
* like a tiny banner stranded above a vast blank canvas.
|
|
26
|
+
*/
|
|
27
|
+
export function PreviewEmptyState({ icon, title, description, action, tone = 'info', }) {
|
|
28
|
+
const toneStyles = tone === 'warn'
|
|
29
|
+
? 'text-amber-700 bg-amber-50/40 border-amber-200/60'
|
|
30
|
+
: 'text-muted-foreground border-dashed border-muted-foreground/25 bg-muted/10';
|
|
31
|
+
const iconNode = icon ?? _jsx(Inbox, { className: "h-8 w-8 opacity-50" });
|
|
32
|
+
return (_jsx("div", { className: "h-full w-full flex items-center justify-center p-6", children: _jsxs("div", { className: `max-w-md w-full rounded-lg border ${toneStyles} px-6 py-10 flex flex-col items-center gap-3 text-center`, children: [_jsx("div", { className: "text-foreground/60", children: iconNode }), _jsx("div", { className: "text-sm font-medium text-foreground/90", children: title }), description && _jsx("div", { className: "text-xs leading-relaxed", children: description }), action && _jsx("div", { className: "mt-1", children: action })] }) }));
|
|
33
|
+
}
|
|
21
34
|
/**
|
|
22
35
|
* Catch render errors from third-party preview renderers so a buggy
|
|
23
36
|
* widget can't blank the whole edit page. Keeps the rest of the tabs
|
|
@@ -1,2 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ReportPreview — runs the live Report draft through the SAME dataset-bound
|
|
3
|
+
* renderer the runtime ReportView uses (ADR-0021 single-form).
|
|
4
|
+
*
|
|
5
|
+
* A 9.0 report binds a semantic-layer `dataset` and selects its measures
|
|
6
|
+
* (`values`) grouped by dimensions (`rows`, plus `columns` across for a
|
|
7
|
+
* matrix); rendering through plugin-report's `ReportRenderer` keeps the
|
|
8
|
+
* studio preview pixel-equal with the runtime — including the matrix
|
|
9
|
+
* cross-tab — and the numbers consistent with every other surface on the
|
|
10
|
+
* same dataset (`adapter.queryDataset`). Drill-down stays inert here: the
|
|
11
|
+
* preview passes no `onDrill` sink.
|
|
12
|
+
*
|
|
13
|
+
* A draft without a dataset binding (e.g. stored pre-9.0 query-form JSON)
|
|
14
|
+
* gets an actionable empty state pointing at the inspector's Dataset control
|
|
15
|
+
* instead of the retired legacy renderer.
|
|
16
|
+
*/
|
|
17
|
+
import * as React from 'react';
|
|
1
18
|
import type { MetadataPreviewProps } from '../preview-registry';
|
|
2
|
-
export declare function ReportPreview({ draft }: MetadataPreviewProps):
|
|
19
|
+
export declare function ReportPreview({ draft }: MetadataPreviewProps): React.JSX.Element;
|
|
@@ -1,27 +1,35 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.
|
|
3
3
|
/**
|
|
4
|
-
* ReportPreview — runs the live Report draft through the
|
|
5
|
-
*
|
|
4
|
+
* ReportPreview — runs the live Report draft through the SAME dataset-bound
|
|
5
|
+
* renderer the runtime ReportView uses (ADR-0021 single-form).
|
|
6
6
|
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
7
|
+
* A 9.0 report binds a semantic-layer `dataset` and selects its measures
|
|
8
|
+
* (`values`) grouped by dimensions (`rows`, plus `columns` across for a
|
|
9
|
+
* matrix); rendering through plugin-report's `ReportRenderer` keeps the
|
|
10
|
+
* studio preview pixel-equal with the runtime — including the matrix
|
|
11
|
+
* cross-tab — and the numbers consistent with every other surface on the
|
|
12
|
+
* same dataset (`adapter.queryDataset`). Drill-down stays inert here: the
|
|
13
|
+
* preview passes no `onDrill` sink.
|
|
14
|
+
*
|
|
15
|
+
* A draft without a dataset binding (e.g. stored pre-9.0 query-form JSON)
|
|
16
|
+
* gets an actionable empty state pointing at the inspector's Dataset control
|
|
17
|
+
* instead of the retired legacy renderer.
|
|
9
18
|
*/
|
|
10
19
|
import * as React from 'react';
|
|
11
|
-
import { Loader2 } from 'lucide-react';
|
|
20
|
+
import { Database, Loader2 } from 'lucide-react';
|
|
12
21
|
import { useAdapter } from '../../../providers/AdapterProvider';
|
|
13
|
-
import { PreviewShell, PreviewErrorBoundary,
|
|
22
|
+
import { PreviewShell, PreviewErrorBoundary, PreviewEmptyState } from './PreviewShell';
|
|
14
23
|
const ReportRenderer = React.lazy(() => import('@object-ui/plugin-report').then((m) => ({ default: m.ReportRenderer })));
|
|
15
24
|
export function ReportPreview({ draft }) {
|
|
16
25
|
const adapter = useAdapter();
|
|
17
|
-
//
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
const objectName = draft.object ?? draft.objectName ?? draft.data?.object;
|
|
22
|
-
const visualization = draft.visualization?.type ?? draft.type;
|
|
23
|
-
if (!objectName) {
|
|
24
|
-
return (_jsx(PreviewShell, { hint: "report", children: _jsx(PreviewMessage, { tone: "warn", children: "Pick an Object in the Form tab \u2014 Reports need a source object before they can render." }) }));
|
|
26
|
+
// ADR-0021 single-form: a report binds a semantic-layer dataset.
|
|
27
|
+
if (typeof draft.dataset === 'string' && draft.dataset) {
|
|
28
|
+
const rows = Array.isArray(draft.rows) ? draft.rows.filter(Boolean) : [];
|
|
29
|
+
return (_jsx(PreviewShell, { hint: `report · dataset "${draft.dataset}"${rows.length ? ' · by ' + rows.join(', ') : ''}`, children: _jsx(PreviewErrorBoundary, { fallbackHint: "The Report references a dataset/measure that doesn't resolve, or its config is incomplete.", children: _jsx(React.Suspense, { fallback: _jsxs("div", { className: "flex items-center gap-2 p-4 text-xs text-muted-foreground", children: [_jsx(Loader2, { className: "h-4 w-4 animate-spin" }), " Loading report renderer\u2026"] }), children: _jsx("div", { className: "p-3 min-h-[200px] max-h-[70vh] overflow-auto", children: _jsx(ReportRenderer, { schema: draft, dataSource: adapter }) }) }) }) }));
|
|
25
30
|
}
|
|
26
|
-
|
|
31
|
+
// No dataset bound — either a fresh draft or stored pre-9.0 query-form
|
|
32
|
+
// JSON (objectName/columns), whose inline-query renderer was retired with
|
|
33
|
+
// the 9.0 cutover. Point the author at the dataset binding.
|
|
34
|
+
return (_jsx(PreviewShell, { children: _jsx(PreviewEmptyState, { icon: _jsx(Database, { className: "h-8 w-8" }), title: "Bind a dataset to preview this report", description: "Since the 9.0 single-form cutover a report renders its dataset's measures (values) grouped by dimensions (rows). Choose a Dataset in the right panel to start designing." }) }));
|
|
27
35
|
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RolePreview — read-only summary of a Role draft.
|
|
3
|
+
*
|
|
4
|
+
* The Role schema is intentionally minimal — name / label / parent /
|
|
5
|
+
* description. The preview's job is therefore to put those four
|
|
6
|
+
* fields into the mental model an operator carries:
|
|
7
|
+
*
|
|
8
|
+
* • Header card with label and machine name.
|
|
9
|
+
* • Hierarchy breadcrumb — the role itself plus a chip for the
|
|
10
|
+
* declared parent. We cannot resolve the full chain from a single
|
|
11
|
+
* draft, but we surface the immediate parent prominently.
|
|
12
|
+
* • Description block.
|
|
13
|
+
* • A "permissions are managed separately" note pointing the user
|
|
14
|
+
* to PermissionSets / Profiles that grant CRUD-VAMA — this is
|
|
15
|
+
* the most common confusion when first authoring a role.
|
|
16
|
+
*/
|
|
17
|
+
import * as React from 'react';
|
|
18
|
+
import type { MetadataPreviewProps } from '../preview-registry';
|
|
19
|
+
export declare function RolePreview({ name, draft }: MetadataPreviewProps): React.JSX.Element;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { CornerDownRight, IdCard, ShieldCheck, Users } from 'lucide-react';
|
|
3
|
+
import { PreviewShell, PreviewMessage, PreviewErrorBoundary } from './PreviewShell';
|
|
4
|
+
export function RolePreview({ name, draft }) {
|
|
5
|
+
const d = draft;
|
|
6
|
+
const roleName = String(d.name ?? name ?? '');
|
|
7
|
+
const label = String(d.label ?? roleName);
|
|
8
|
+
const description = d.description ?? '';
|
|
9
|
+
const parent = d.parent;
|
|
10
|
+
if (!roleName) {
|
|
11
|
+
return (_jsx(PreviewShell, { hint: "role", children: _jsx(PreviewMessage, { children: "Give the role a name to see the preview." }) }));
|
|
12
|
+
}
|
|
13
|
+
return (_jsx(PreviewShell, { hint: "role", children: _jsx(PreviewErrorBoundary, { children: _jsxs("div", { className: "p-3 space-y-3", children: [_jsx("div", { className: "rounded border bg-muted/30 p-3", children: _jsxs("div", { className: "flex items-start gap-2", children: [_jsx(Users, { className: "h-4 w-4 mt-0.5 text-muted-foreground shrink-0" }), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsxs("div", { className: "flex flex-wrap items-baseline gap-x-2", children: [_jsx("span", { className: "text-sm font-medium truncate", children: label }), _jsx("span", { className: "font-mono text-[10px] text-muted-foreground", children: roleName })] }), description && (_jsx("div", { className: "text-xs text-muted-foreground mt-0.5", children: description }))] })] }) }), _jsxs("div", { children: [_jsx("div", { className: "text-[11px] font-medium text-muted-foreground uppercase tracking-wider mb-1.5", children: "Hierarchy" }), _jsx("div", { className: "rounded border bg-background p-2.5 text-xs", children: parent ? (_jsxs("div", { className: "space-y-1", children: [_jsxs("div", { className: "flex items-center gap-1.5", children: [_jsx(IdCard, { className: "h-3.5 w-3.5 text-muted-foreground" }), _jsx("span", { className: "text-muted-foreground", children: "Parent:" }), _jsx("code", { className: "font-mono", children: parent })] }), _jsxs("div", { className: "flex items-center gap-1.5 pl-4", children: [_jsx(CornerDownRight, { className: "h-3.5 w-3.5 text-muted-foreground" }), _jsx("span", { className: "rounded bg-emerald-50 border border-emerald-200 px-1.5 py-0.5 text-[11px] font-mono text-emerald-800", children: roleName }), _jsx("span", { className: "text-[10px] text-muted-foreground italic", children: "this role" })] }), _jsx("div", { className: "text-[10px] text-muted-foreground pt-1", children: "Open the parent role to walk further up the chain." })] })) : (_jsxs("div", { className: "flex items-center gap-1.5", children: [_jsx("span", { className: "rounded bg-emerald-50 border border-emerald-200 px-1.5 py-0.5 text-[11px] font-mono text-emerald-800", children: roleName }), _jsx("span", { className: "text-[10px] text-muted-foreground italic", children: "root role \u2014 no parent" })] })) })] }), _jsx("div", { className: "rounded border border-blue-200 bg-blue-50 p-2.5 text-[11px] text-blue-900", children: _jsxs("div", { className: "flex items-start gap-1.5", children: [_jsx(ShieldCheck, { className: "h-3.5 w-3.5 mt-0.5 shrink-0" }), _jsxs("div", { children: [_jsx("div", { className: "font-medium", children: "Roles don't grant data access on their own." }), _jsxs("div", { className: "opacity-90 mt-0.5", children: ["Bind ", _jsx("code", { className: "font-mono", children: roleName }), " to one or more ", _jsx("strong", { children: "Permission Sets" }), ' ', "or assign it to a ", _jsx("strong", { children: "Profile" }), " to control CRUD-VAMA, field access, and tab visibility."] })] })] }) })] }) }) }));
|
|
14
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ScreenPreview — live design-time preview of a flow `screen` node, rendered
|
|
3
|
+
* exactly as the end user will see it at runtime.
|
|
4
|
+
*
|
|
5
|
+
* It builds a runtime `ScreenSpec` from the node's authored `config` and hands
|
|
6
|
+
* it to the shared {@link ScreenView} — the SAME renderer the runtime
|
|
7
|
+
* FlowRunner uses — so the preview can never drift from runtime (the
|
|
8
|
+
* design↔runtime divergence #1927 set out to kill). `{var}` references in the
|
|
9
|
+
* title/description are interpolated, and `fields` are gated by their
|
|
10
|
+
* `visibleWhen`, against the supplied `variables` (the flow's declared defaults
|
|
11
|
+
* in the inspector, or the live simulated values when paused in the Debug
|
|
12
|
+
* simulator).
|
|
13
|
+
*
|
|
14
|
+
* Object-form mode is fed the SAME enriched object list the runtime uses
|
|
15
|
+
* (`useMetadata().objects`, which derives inline master-detail `subforms` from
|
|
16
|
+
* `inlineEdit` relationships) so the preview renders those child grids too.
|
|
17
|
+
*
|
|
18
|
+
* Homes: the flow node inspector (live-updates as the config is edited) and the
|
|
19
|
+
* Debug simulator's paused-at-screen state.
|
|
20
|
+
*/
|
|
21
|
+
import * as React from 'react';
|
|
22
|
+
import { type ScreenPreviewNode } from './screen-spec';
|
|
23
|
+
export type { ScreenPreviewNode } from './screen-spec';
|
|
24
|
+
export interface ScreenPreviewProps {
|
|
25
|
+
/** The screen node to preview. */
|
|
26
|
+
node: ScreenPreviewNode;
|
|
27
|
+
/**
|
|
28
|
+
* Variable values for `{var}` interpolation in the title/description AND for
|
|
29
|
+
* evaluating each field's `visibleWhen`. The inspector passes the flow's
|
|
30
|
+
* declared defaults; the simulator passes the live run state at the pause
|
|
31
|
+
* point. Unknown `{var}` refs stay literal, and fields whose `visibleWhen`
|
|
32
|
+
* can't be decided stay visible — the design preview never hides on missing
|
|
33
|
+
* data.
|
|
34
|
+
*/
|
|
35
|
+
variables?: Record<string, unknown>;
|
|
36
|
+
className?: string;
|
|
37
|
+
}
|
|
38
|
+
export declare function ScreenPreview({ node, variables, className }: ScreenPreviewProps): React.JSX.Element;
|