@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,196 @@
|
|
|
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
|
+
* JsonSourceEditor — Monaco-backed JSON editor for the metadata
|
|
11
|
+
* designer's "Source" tab. Replaces the old textarea so power users
|
|
12
|
+
* get syntax highlighting, bracket matching, folding, and inline
|
|
13
|
+
* error squigglies driven by the server-side `_diagnostics` payload.
|
|
14
|
+
*
|
|
15
|
+
* Markers: `issues[]` use dotted (or array) JSON paths matching the
|
|
16
|
+
* Zod issue shape. We resolve each path to a Monaco range with
|
|
17
|
+
* `jsonc-parser` so the squiggle lands on the offending value (or
|
|
18
|
+
* the property key when the value is absent). Unresolved paths fall
|
|
19
|
+
* back to a marker on line 1, so nothing is silently lost.
|
|
20
|
+
*/
|
|
21
|
+
import React from 'react';
|
|
22
|
+
import { Skeleton } from '@object-ui/components';
|
|
23
|
+
import * as jsonc from 'jsonc-parser';
|
|
24
|
+
import { detectLocale, t } from './i18n';
|
|
25
|
+
// Lazy: Monaco's React wrapper itself pulls in the editor core
|
|
26
|
+
// (~3MB), so we keep it out of the initial app-shell chunk.
|
|
27
|
+
const LazyMonaco = React.lazy(async () => {
|
|
28
|
+
const mod = await import('@monaco-editor/react');
|
|
29
|
+
return { default: mod.default };
|
|
30
|
+
});
|
|
31
|
+
function stringify(v) {
|
|
32
|
+
try {
|
|
33
|
+
return JSON.stringify(v ?? {}, null, 2);
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
return '{}';
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
/** Parse a dotted JSON path like `fields.owner.0.type` to segments. */
|
|
40
|
+
function splitPath(p) {
|
|
41
|
+
if (!p)
|
|
42
|
+
return [];
|
|
43
|
+
return p.split('.').map((seg) => {
|
|
44
|
+
const n = Number(seg);
|
|
45
|
+
return Number.isInteger(n) && String(n) === seg ? n : seg;
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
export function JsonSourceEditor({ value, onChange, readOnly, issues, height = '60vh', fallbackDelayMs = 4000, }) {
|
|
49
|
+
const locale = React.useMemo(() => detectLocale(), []);
|
|
50
|
+
const [text, setText] = React.useState(() => stringify(value));
|
|
51
|
+
const [parseError, setParseError] = React.useState(null);
|
|
52
|
+
const lastCommittedRef = React.useRef(text);
|
|
53
|
+
// Hold onto Monaco's editor + namespace so we can repaint markers
|
|
54
|
+
// when either the source text or the issues prop changes.
|
|
55
|
+
const editorRef = React.useRef(null);
|
|
56
|
+
const monacoRef = React.useRef(null);
|
|
57
|
+
// Monaco's core is fetched lazily and, by default, from a public CDN, and it
|
|
58
|
+
// also spins up web workers. When any of that is blocked — offline /
|
|
59
|
+
// air-gapped / CSP-restricted installs — the editor mounts an empty shell
|
|
60
|
+
// with no error and the Source tab looks blank. Detect "nothing actually
|
|
61
|
+
// painted" via the rendered `.view-line` rows and fall back to a plain
|
|
62
|
+
// textarea so the source is always readable and editable.
|
|
63
|
+
const containerRef = React.useRef(null);
|
|
64
|
+
const [monacoUnavailable, setMonacoUnavailable] = React.useState(false);
|
|
65
|
+
React.useEffect(() => {
|
|
66
|
+
if (monacoUnavailable)
|
|
67
|
+
return;
|
|
68
|
+
const id = setTimeout(() => {
|
|
69
|
+
const el = containerRef.current;
|
|
70
|
+
if (!el || !el.querySelector('.view-line'))
|
|
71
|
+
setMonacoUnavailable(true);
|
|
72
|
+
}, fallbackDelayMs);
|
|
73
|
+
return () => clearTimeout(id);
|
|
74
|
+
}, [monacoUnavailable, fallbackDelayMs]);
|
|
75
|
+
// Match against the dark class our app-shell toggles on <html>; pick
|
|
76
|
+
// a Monaco theme that doesn't fight the rest of the chrome.
|
|
77
|
+
const [theme, setTheme] = React.useState(() => {
|
|
78
|
+
if (typeof document === 'undefined')
|
|
79
|
+
return 'light';
|
|
80
|
+
return document.documentElement.classList.contains('dark') ? 'vs-dark' : 'light';
|
|
81
|
+
});
|
|
82
|
+
React.useEffect(() => {
|
|
83
|
+
if (typeof document === 'undefined')
|
|
84
|
+
return;
|
|
85
|
+
const root = document.documentElement;
|
|
86
|
+
const update = () => setTheme(root.classList.contains('dark') ? 'vs-dark' : 'light');
|
|
87
|
+
const obs = new MutationObserver(update);
|
|
88
|
+
obs.observe(root, { attributes: true, attributeFilter: ['class'] });
|
|
89
|
+
return () => obs.disconnect();
|
|
90
|
+
}, []);
|
|
91
|
+
// Push markers from `issues` onto Monaco's model. We rebuild on
|
|
92
|
+
// every relevant change rather than diffing — sweeping `setModelMarkers`
|
|
93
|
+
// is cheap and avoids stale squigglies when issues drop off.
|
|
94
|
+
const applyMarkers = React.useCallback(() => {
|
|
95
|
+
const editor = editorRef.current;
|
|
96
|
+
const monaco = monacoRef.current;
|
|
97
|
+
if (!editor || !monaco)
|
|
98
|
+
return;
|
|
99
|
+
const model = editor.getModel();
|
|
100
|
+
if (!model)
|
|
101
|
+
return;
|
|
102
|
+
if (!issues || issues.length === 0) {
|
|
103
|
+
monaco.editor.setModelMarkers(model, 'objectui-diagnostics', []);
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
let tree;
|
|
107
|
+
try {
|
|
108
|
+
tree = jsonc.parseTree(text);
|
|
109
|
+
}
|
|
110
|
+
catch {
|
|
111
|
+
tree = undefined;
|
|
112
|
+
}
|
|
113
|
+
const markers = issues.map((iss) => {
|
|
114
|
+
const segs = splitPath(iss.path);
|
|
115
|
+
let startLine = 1;
|
|
116
|
+
let startCol = 1;
|
|
117
|
+
let endLine = 1;
|
|
118
|
+
let endCol = 2;
|
|
119
|
+
const node = tree ? jsonc.findNodeAtLocation(tree, segs) : undefined;
|
|
120
|
+
if (node) {
|
|
121
|
+
const start = model.getPositionAt(node.offset);
|
|
122
|
+
const end = model.getPositionAt(node.offset + node.length);
|
|
123
|
+
startLine = start.lineNumber;
|
|
124
|
+
startCol = start.column;
|
|
125
|
+
endLine = end.lineNumber;
|
|
126
|
+
endCol = end.column;
|
|
127
|
+
}
|
|
128
|
+
const sev = iss.severity === 'warning'
|
|
129
|
+
? monaco.MarkerSeverity.Warning
|
|
130
|
+
: monaco.MarkerSeverity.Error;
|
|
131
|
+
return {
|
|
132
|
+
severity: sev,
|
|
133
|
+
message: iss.path ? `${iss.path}: ${iss.message}` : iss.message,
|
|
134
|
+
startLineNumber: startLine,
|
|
135
|
+
startColumn: startCol,
|
|
136
|
+
endLineNumber: endLine,
|
|
137
|
+
endColumn: endCol,
|
|
138
|
+
source: 'metadata',
|
|
139
|
+
};
|
|
140
|
+
});
|
|
141
|
+
monaco.editor.setModelMarkers(model, 'objectui-diagnostics', markers);
|
|
142
|
+
}, [issues, text]);
|
|
143
|
+
React.useEffect(() => {
|
|
144
|
+
applyMarkers();
|
|
145
|
+
}, [applyMarkers]);
|
|
146
|
+
// Resync the buffer when the parent draft changes externally (Save,
|
|
147
|
+
// Reset, inspector-driven patches). Only sync when the upstream
|
|
148
|
+
// value differs from what we last committed so user keystrokes
|
|
149
|
+
// aren't clobbered while typing.
|
|
150
|
+
React.useEffect(() => {
|
|
151
|
+
const next = stringify(value);
|
|
152
|
+
if (next !== lastCommittedRef.current) {
|
|
153
|
+
setText(next);
|
|
154
|
+
lastCommittedRef.current = next;
|
|
155
|
+
setParseError(null);
|
|
156
|
+
}
|
|
157
|
+
}, [value]);
|
|
158
|
+
const handleChange = (next) => {
|
|
159
|
+
const v = next ?? '';
|
|
160
|
+
setText(v);
|
|
161
|
+
try {
|
|
162
|
+
const parsed = JSON.parse(v);
|
|
163
|
+
if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {
|
|
164
|
+
setParseError(null);
|
|
165
|
+
lastCommittedRef.current = v;
|
|
166
|
+
onChange(parsed);
|
|
167
|
+
}
|
|
168
|
+
else {
|
|
169
|
+
setParseError(t('engine.form.rootJsonObject', locale));
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
catch (err) {
|
|
173
|
+
setParseError(err?.message ?? t('engine.form.invalidJson', locale));
|
|
174
|
+
}
|
|
175
|
+
};
|
|
176
|
+
const handleMount = (editor, monaco) => {
|
|
177
|
+
editorRef.current = editor;
|
|
178
|
+
monacoRef.current = monaco;
|
|
179
|
+
// Defer one tick so the model has settled before the first paint.
|
|
180
|
+
setTimeout(applyMarkers, 0);
|
|
181
|
+
};
|
|
182
|
+
return (_jsxs("div", { className: "flex flex-col gap-2", children: [_jsx("div", { ref: containerRef, "data-testid": "source-editor", className: "border rounded overflow-hidden bg-background", style: { height: typeof height === 'number' ? `${height}px` : height }, children: monacoUnavailable ? (_jsx("textarea", { value: text, onChange: (e) => handleChange(e.target.value), readOnly: readOnly, spellCheck: false, "aria-label": "JSON source", className: "w-full h-full resize-none bg-background p-3 font-mono text-xs leading-relaxed outline-none" })) : (_jsx(React.Suspense, { fallback: _jsx(Skeleton, { className: "w-full h-full" }), children: _jsx(LazyMonaco, { value: text, language: "json", theme: theme, onChange: handleChange, onMount: handleMount, options: {
|
|
183
|
+
readOnly,
|
|
184
|
+
minimap: { enabled: false },
|
|
185
|
+
fontSize: 12,
|
|
186
|
+
lineNumbers: 'on',
|
|
187
|
+
scrollBeyondLastLine: false,
|
|
188
|
+
automaticLayout: true,
|
|
189
|
+
folding: true,
|
|
190
|
+
wordWrap: 'on',
|
|
191
|
+
tabSize: 2,
|
|
192
|
+
renderLineHighlight: 'line',
|
|
193
|
+
scrollbar: { verticalScrollbarSize: 10, horizontalScrollbarSize: 10 },
|
|
194
|
+
} }) })) }), parseError && (_jsxs("div", { className: "text-xs text-destructive flex items-start gap-1.5", children: [_jsx("span", { "aria-hidden": true, children: "\u26A0" }), _jsx("span", { children: parseError })] }))] }));
|
|
195
|
+
}
|
|
196
|
+
export default JsonSourceEditor;
|
|
@@ -1,6 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LayeredDiff — visualizes how the runtime resolves a two-tier metadata item.
|
|
3
|
+
*
|
|
4
|
+
* Tabs:
|
|
5
|
+
* • Diff (default) — field-level table comparing Code (artifact) vs
|
|
6
|
+
* Effective (merged). Highlights modified / added / removed top-level
|
|
7
|
+
* fields with color coding so admins can see at a glance what their
|
|
8
|
+
* overlay actually changes.
|
|
9
|
+
* • Code — pretty-printed JSON of the artifact baseline.
|
|
10
|
+
* • Overlay — pretty-printed JSON of just the deltas they've saved.
|
|
11
|
+
* • Effective — the merged value the runtime serves.
|
|
12
|
+
*
|
|
13
|
+
* Backed by `client.layered(type, name)` (Phase 3a `?layers=true`).
|
|
14
|
+
*
|
|
15
|
+
* Diff scope: top-level keys only. Nested objects/arrays are compared by
|
|
16
|
+
* JSON-stringify equality. Drilling into nested diffs is a future
|
|
17
|
+
* enhancement; the overlay deltas we ship in practice are flat.
|
|
18
|
+
*/
|
|
19
|
+
import * as React from 'react';
|
|
1
20
|
import type { MetadataLayered } from '@object-ui/data-objectstack';
|
|
21
|
+
import { type SupportedLocale } from './i18n';
|
|
2
22
|
export interface LayeredDiffProps {
|
|
3
23
|
layered: MetadataLayered<Record<string, unknown>> | null;
|
|
4
24
|
loading?: boolean;
|
|
25
|
+
locale?: SupportedLocale | string;
|
|
5
26
|
}
|
|
6
|
-
export
|
|
27
|
+
export type DiffStatus = 'unchanged' | 'modified' | 'added' | 'removed';
|
|
28
|
+
export interface DiffRow {
|
|
29
|
+
key: string;
|
|
30
|
+
status: DiffStatus;
|
|
31
|
+
codeValue: unknown;
|
|
32
|
+
effectiveValue: unknown;
|
|
33
|
+
}
|
|
34
|
+
export declare function computeDiffRows(code: unknown, effective: unknown): DiffRow[];
|
|
35
|
+
/**
|
|
36
|
+
* Count of top-level fields where the overlay actually changes the
|
|
37
|
+
* effective value vs the artifact baseline. Used by the editor's
|
|
38
|
+
* Layers tab trigger to show e.g. "3 overlaid" next to the label.
|
|
39
|
+
*
|
|
40
|
+
* Returns 0 when there is no baseline (pure-runtime item) or the two
|
|
41
|
+
* payloads are identical.
|
|
42
|
+
*/
|
|
43
|
+
export declare function countOverlaidFields(code: unknown, effective: unknown): number;
|
|
44
|
+
export declare function LayeredDiff({ layered, loading, locale }: LayeredDiffProps): React.JSX.Element;
|
|
@@ -1,15 +1,181 @@
|
|
|
1
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
|
+
* LayeredDiff — visualizes how the runtime resolves a two-tier metadata item.
|
|
5
|
+
*
|
|
6
|
+
* Tabs:
|
|
7
|
+
* • Diff (default) — field-level table comparing Code (artifact) vs
|
|
8
|
+
* Effective (merged). Highlights modified / added / removed top-level
|
|
9
|
+
* fields with color coding so admins can see at a glance what their
|
|
10
|
+
* overlay actually changes.
|
|
11
|
+
* • Code — pretty-printed JSON of the artifact baseline.
|
|
12
|
+
* • Overlay — pretty-printed JSON of just the deltas they've saved.
|
|
13
|
+
* • Effective — the merged value the runtime serves.
|
|
14
|
+
*
|
|
15
|
+
* Backed by `client.layered(type, name)` (Phase 3a `?layers=true`).
|
|
16
|
+
*
|
|
17
|
+
* Diff scope: top-level keys only. Nested objects/arrays are compared by
|
|
18
|
+
* JSON-stringify equality. Drilling into nested diffs is a future
|
|
19
|
+
* enhancement; the overlay deltas we ship in practice are flat.
|
|
20
|
+
*/
|
|
21
|
+
import * as React from 'react';
|
|
2
22
|
import { Tabs, TabsContent, TabsList, TabsTrigger, } from '@object-ui/components';
|
|
3
|
-
import { Badge } from '@object-ui/components';
|
|
4
|
-
|
|
23
|
+
import { Badge, Switch } from '@object-ui/components';
|
|
24
|
+
import { cn } from '@object-ui/components';
|
|
25
|
+
import { t, tFormat } from './i18n';
|
|
26
|
+
const STATUS_STYLE = {
|
|
27
|
+
unchanged: {
|
|
28
|
+
badge: 'bg-muted text-muted-foreground border border-border',
|
|
29
|
+
row: '',
|
|
30
|
+
},
|
|
31
|
+
modified: {
|
|
32
|
+
badge: 'bg-amber-100 text-amber-900 border border-amber-300 dark:bg-amber-950/60 dark:text-amber-200 dark:border-amber-800',
|
|
33
|
+
row: 'bg-amber-50/50 dark:bg-amber-950/20',
|
|
34
|
+
},
|
|
35
|
+
added: {
|
|
36
|
+
badge: 'bg-emerald-100 text-emerald-900 border border-emerald-300 dark:bg-emerald-950/60 dark:text-emerald-200 dark:border-emerald-800',
|
|
37
|
+
row: 'bg-emerald-50/50 dark:bg-emerald-950/20',
|
|
38
|
+
},
|
|
39
|
+
removed: {
|
|
40
|
+
badge: 'bg-rose-100 text-rose-900 border border-rose-300 dark:bg-rose-950/60 dark:text-rose-200 dark:border-rose-800',
|
|
41
|
+
row: 'bg-rose-50/50 dark:bg-rose-950/20',
|
|
42
|
+
},
|
|
43
|
+
};
|
|
44
|
+
export function computeDiffRows(code, effective) {
|
|
45
|
+
const codeObj = isPlainObject(code) ? code : {};
|
|
46
|
+
const effObj = isPlainObject(effective) ? effective : {};
|
|
47
|
+
const allKeys = new Set([
|
|
48
|
+
...Object.keys(codeObj),
|
|
49
|
+
...Object.keys(effObj),
|
|
50
|
+
]);
|
|
51
|
+
const rows = [];
|
|
52
|
+
for (const key of allKeys) {
|
|
53
|
+
const inCode = key in codeObj;
|
|
54
|
+
const inEff = key in effObj;
|
|
55
|
+
const codeValue = codeObj[key];
|
|
56
|
+
const effectiveValue = effObj[key];
|
|
57
|
+
let status;
|
|
58
|
+
if (inCode && !inEff) {
|
|
59
|
+
status = 'removed';
|
|
60
|
+
}
|
|
61
|
+
else if (!inCode && inEff) {
|
|
62
|
+
status = 'added';
|
|
63
|
+
}
|
|
64
|
+
else if (stableStringify(codeValue) !== stableStringify(effectiveValue)) {
|
|
65
|
+
status = 'modified';
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
status = 'unchanged';
|
|
69
|
+
}
|
|
70
|
+
rows.push({ key, status, codeValue, effectiveValue });
|
|
71
|
+
}
|
|
72
|
+
// Sort: changed first (modified, added, removed), then unchanged; alpha within each.
|
|
73
|
+
const order = {
|
|
74
|
+
modified: 0,
|
|
75
|
+
added: 1,
|
|
76
|
+
removed: 2,
|
|
77
|
+
unchanged: 3,
|
|
78
|
+
};
|
|
79
|
+
rows.sort((a, b) => {
|
|
80
|
+
if (order[a.status] !== order[b.status])
|
|
81
|
+
return order[a.status] - order[b.status];
|
|
82
|
+
return a.key.localeCompare(b.key);
|
|
83
|
+
});
|
|
84
|
+
return rows;
|
|
85
|
+
}
|
|
86
|
+
function isPlainObject(v) {
|
|
87
|
+
return typeof v === 'object' && v !== null && !Array.isArray(v);
|
|
88
|
+
}
|
|
89
|
+
function stableStringify(v) {
|
|
90
|
+
try {
|
|
91
|
+
return JSON.stringify(v, (_k, val) => {
|
|
92
|
+
if (isPlainObject(val)) {
|
|
93
|
+
return Object.keys(val).sort().reduce((acc, k) => {
|
|
94
|
+
acc[k] = val[k];
|
|
95
|
+
return acc;
|
|
96
|
+
}, {});
|
|
97
|
+
}
|
|
98
|
+
return val;
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
return String(v);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
function formatCell(v) {
|
|
106
|
+
if (v === undefined)
|
|
107
|
+
return '—';
|
|
108
|
+
if (v === null)
|
|
109
|
+
return 'null';
|
|
110
|
+
if (typeof v === 'string')
|
|
111
|
+
return v;
|
|
112
|
+
if (typeof v === 'number' || typeof v === 'boolean')
|
|
113
|
+
return String(v);
|
|
114
|
+
try {
|
|
115
|
+
return JSON.stringify(v);
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
return String(v);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Count of top-level fields where the overlay actually changes the
|
|
123
|
+
* effective value vs the artifact baseline. Used by the editor's
|
|
124
|
+
* Layers tab trigger to show e.g. "3 overlaid" next to the label.
|
|
125
|
+
*
|
|
126
|
+
* Returns 0 when there is no baseline (pure-runtime item) or the two
|
|
127
|
+
* payloads are identical.
|
|
128
|
+
*/
|
|
129
|
+
export function countOverlaidFields(code, effective) {
|
|
130
|
+
if (code == null)
|
|
131
|
+
return 0;
|
|
132
|
+
let n = 0;
|
|
133
|
+
for (const row of computeDiffRows(code, effective)) {
|
|
134
|
+
if (row.status !== 'unchanged')
|
|
135
|
+
n += 1;
|
|
136
|
+
}
|
|
137
|
+
return n;
|
|
138
|
+
}
|
|
139
|
+
export function LayeredDiff({ layered, loading, locale }) {
|
|
5
140
|
if (loading) {
|
|
6
|
-
return (_jsx("div", { className: "p-4 text-sm text-muted-foreground", children:
|
|
141
|
+
return (_jsx("div", { className: "p-4 text-sm text-muted-foreground", children: t('engine.edit.loading', locale) }));
|
|
7
142
|
}
|
|
8
143
|
if (!layered) {
|
|
9
|
-
return (_jsx("div", { className: "p-4 text-sm text-muted-foreground", children:
|
|
144
|
+
return (_jsx("div", { className: "p-4 text-sm text-muted-foreground", children: t('engine.layers.diff.noBaseline', locale) }));
|
|
10
145
|
}
|
|
11
146
|
const hasOverlay = layered.overlay != null;
|
|
12
|
-
return (_jsxs(Tabs, { defaultValue: "
|
|
147
|
+
return (_jsxs(Tabs, { defaultValue: "diff", className: "w-full", children: [_jsxs(TabsList, { className: "grid grid-cols-4 w-fit", children: [_jsx(TabsTrigger, { value: "diff", children: t('engine.layers.diff', locale) }), _jsxs(TabsTrigger, { value: "code", children: [t('engine.layers.code', locale), _jsx(Badge, { variant: "outline", className: "ml-1.5 text-[10px]", children: "artifact" })] }), _jsxs(TabsTrigger, { value: "overlay", children: [t('engine.layers.overlay', locale), hasOverlay ? (_jsx(Badge, { className: "ml-1.5 text-[10px] bg-emerald-600 text-emerald-50", children: layered.overlayScope ?? 'set' })) : (_jsx(Badge, { variant: "outline", className: "ml-1.5 text-[10px] text-muted-foreground", children: "none" }))] }), _jsxs(TabsTrigger, { value: "effective", children: [t('engine.layers.effective', locale), _jsx(Badge, { variant: "outline", className: "ml-1.5 text-[10px]", children: "merged" })] })] }), _jsx(TabsContent, { value: "diff", className: "mt-3", children: _jsx(DiffTable, { code: layered.code, effective: layered.effective, locale: locale }) }), _jsx(TabsContent, { value: "code", className: "mt-3", children: _jsx(LayerPanel, { payload: layered.code, emptyHint: t('engine.layers.diff.noBaseline', locale) }) }), _jsx(TabsContent, { value: "overlay", className: "mt-3", children: _jsx(LayerPanel, { payload: layered.overlay, emptyHint: t('engine.layers.diff.noChanges', locale) }) }), _jsx(TabsContent, { value: "effective", className: "mt-3", children: _jsx(LayerPanel, { payload: layered.effective, emptyHint: "No effective value resolved." }) })] }));
|
|
148
|
+
}
|
|
149
|
+
function DiffTable({ code, effective, locale, }) {
|
|
150
|
+
const [showUnchanged, setShowUnchanged] = React.useState(false);
|
|
151
|
+
// No baseline = pure runtime overlay; the diff table has nothing to compare.
|
|
152
|
+
if (code == null) {
|
|
153
|
+
return (_jsx("div", { className: "rounded border bg-muted/30 p-4 text-xs text-muted-foreground", children: t('engine.layers.diff.noBaseline', locale) }));
|
|
154
|
+
}
|
|
155
|
+
const rows = React.useMemo(() => computeDiffRows(code, effective), [code, effective]);
|
|
156
|
+
const counts = React.useMemo(() => {
|
|
157
|
+
return rows.reduce((acc, r) => {
|
|
158
|
+
acc[r.status] += 1;
|
|
159
|
+
return acc;
|
|
160
|
+
}, { unchanged: 0, modified: 0, added: 0, removed: 0 });
|
|
161
|
+
}, [rows]);
|
|
162
|
+
const visibleRows = showUnchanged
|
|
163
|
+
? rows
|
|
164
|
+
: rows.filter((r) => r.status !== 'unchanged');
|
|
165
|
+
const hasAnyChange = counts.modified > 0 || counts.added > 0 || counts.removed > 0;
|
|
166
|
+
return (_jsxs("div", { className: "space-y-3", children: [_jsxs("div", { className: "flex items-center justify-between gap-3 flex-wrap", children: [_jsx("div", { className: "text-xs text-muted-foreground", children: tFormat('engine.layers.diff.summary', locale, {
|
|
167
|
+
modified: counts.modified,
|
|
168
|
+
added: counts.added,
|
|
169
|
+
removed: counts.removed,
|
|
170
|
+
}) }), _jsxs("label", { className: "flex items-center gap-2 text-xs text-muted-foreground cursor-pointer select-none", children: [_jsx(Switch, { checked: showUnchanged, onCheckedChange: setShowUnchanged, "aria-label": t('engine.layers.diff.showUnchanged', locale) }), t('engine.layers.diff.showUnchanged', locale), _jsx(Badge, { variant: "outline", className: "ml-1 text-[10px]", children: counts.unchanged })] })] }), !hasAnyChange && !showUnchanged ? (_jsx("div", { className: "rounded border bg-muted/30 p-4 text-xs text-muted-foreground", children: t('engine.layers.diff.noChanges', locale) })) : (_jsxs("div", { className: "rounded border overflow-hidden", children: [_jsxs("div", { className: "grid grid-cols-[minmax(140px,1fr)_minmax(160px,1.4fr)_minmax(160px,1.4fr)_auto] bg-muted/50 text-[11px] font-medium uppercase tracking-wide text-muted-foreground", children: [_jsx("div", { className: "px-3 py-2", children: t('engine.layers.diff.field', locale) }), _jsx("div", { className: "px-3 py-2", children: t('engine.layers.diff.code', locale) }), _jsx("div", { className: "px-3 py-2", children: t('engine.layers.diff.effective', locale) }), _jsx("div", { className: "px-3 py-2", children: t('engine.layers.diff.status', locale) })] }), _jsx("div", { className: "divide-y", children: visibleRows.map((row) => {
|
|
171
|
+
const style = STATUS_STYLE[row.status];
|
|
172
|
+
return (_jsxs("div", { className: cn('grid grid-cols-[minmax(140px,1fr)_minmax(160px,1.4fr)_minmax(160px,1.4fr)_auto] text-xs', style.row), children: [_jsx("div", { className: "px-3 py-2 font-mono text-foreground truncate", title: row.key, children: row.key }), _jsx(DiffValueCell, { value: row.codeValue, muted: row.status === 'added' }), _jsx(DiffValueCell, { value: row.effectiveValue, muted: row.status === 'removed' }), _jsx("div", { className: "px-3 py-2", children: _jsx("span", { className: cn('inline-flex items-center rounded px-1.5 py-0.5 text-[10px] font-medium', style.badge), children: t(`engine.layers.diff.${row.status}`, locale) }) })] }, row.key));
|
|
173
|
+
}) })] }))] }));
|
|
174
|
+
}
|
|
175
|
+
function DiffValueCell({ value, muted }) {
|
|
176
|
+
const text = formatCell(value);
|
|
177
|
+
const isMissing = value === undefined;
|
|
178
|
+
return (_jsx("div", { className: cn('px-3 py-2 font-mono break-all', muted || isMissing ? 'text-muted-foreground italic' : 'text-foreground'), title: text.length > 200 ? text : undefined, children: text.length > 200 ? `${text.slice(0, 200)}…` : text }));
|
|
13
179
|
}
|
|
14
180
|
function LayerPanel({ payload, emptyHint, }) {
|
|
15
181
|
if (payload == null) {
|
|
@@ -1,3 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MetadataDetailDrawer — slide-over editor for a related metadata item.
|
|
3
|
+
*
|
|
4
|
+
* Opens from the parent's Related tab without taking the user away
|
|
5
|
+
* from the parent's context. Internally we mount the same
|
|
6
|
+
* `MetadataResourceEditPage` used by the full-page route, so all the
|
|
7
|
+
* Save / Reset / Validate behaviour is shared. The drawer just frames
|
|
8
|
+
* it and adds a "Open full page ↗" affordance.
|
|
9
|
+
*
|
|
10
|
+
* Width is wide enough for forms (max 1100px) but capped at 92vw to
|
|
11
|
+
* leave a thin strip of the parent visible behind, reinforcing the
|
|
12
|
+
* "still in the same object" feel.
|
|
13
|
+
*/
|
|
14
|
+
import * as React from 'react';
|
|
1
15
|
import type { RelatedTarget } from './RelatedPanel';
|
|
2
16
|
export interface MetadataDetailDrawerProps {
|
|
3
17
|
/** When non-null, drawer is open and shows this target. */
|
|
@@ -10,4 +24,4 @@ export interface MetadataDetailDrawerProps {
|
|
|
10
24
|
name: string;
|
|
11
25
|
};
|
|
12
26
|
}
|
|
13
|
-
export declare function MetadataDetailDrawer({ target, onClose, parentContext, }: MetadataDetailDrawerProps):
|
|
27
|
+
export declare function MetadataDetailDrawer({ target, onClose, parentContext, }: MetadataDetailDrawerProps): React.JSX.Element;
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `MetadataTypeActions` — renders the declarative, **type-level** actions a
|
|
3
|
+
* metadata type carries (GAP-1) using the same button affordance business
|
|
4
|
+
* objects use for their `actions`.
|
|
5
|
+
*
|
|
6
|
+
* The framework's `/meta/types` endpoint emits these on each rich entry as
|
|
7
|
+
* spec `ActionSchema` objects (see `MetadataTypeAction` in `useMetadata`).
|
|
8
|
+
* The canonical first consumer is the `datasource` type, which declares a
|
|
9
|
+
* "Test connection" action (`type:'api'`, `POST
|
|
10
|
+
* /api/v1/datasources/${ctx.recordId}/test`). Rendering happens in two
|
|
11
|
+
* chrome slots:
|
|
12
|
+
*
|
|
13
|
+
* • ResourceEditPage → `location='record_header'`, `recordId` = item name.
|
|
14
|
+
* • ResourceListPage → `location='list_toolbar'` (no recordId).
|
|
15
|
+
*
|
|
16
|
+
* Execution path mirrors ObjectView's auth-aware `apiHandler` rather than the
|
|
17
|
+
* core ActionRunner's bare `fetch`: the metadata API endpoints require the
|
|
18
|
+
* better-auth session cookie + bearer token, which only ride along through
|
|
19
|
+
* `createAuthenticatedFetch` (and matter in split-origin dev where the SPA is
|
|
20
|
+
* on :5180 and the backend on :3000). `${ctx.recordId}` / `${param.X}` tokens
|
|
21
|
+
* in `target` are resolved here, exactly as the spec mandates renderers do.
|
|
22
|
+
*
|
|
23
|
+
* Dialogs: actions that declare an array of `params` collect them from the
|
|
24
|
+
* user in the shared {@link ActionParamDialog} before running (same UX as
|
|
25
|
+
* business-object actions); actions that declare a `resultDialog` render the
|
|
26
|
+
* API response in {@link ActionResultDialog}. `confirmText` still gates the run.
|
|
27
|
+
*
|
|
28
|
+
* Only `type:'api'` is wired today; other types surface a toast so a
|
|
29
|
+
* misconfigured action fails loud instead of silent.
|
|
30
|
+
*/
|
|
31
|
+
import * as React from 'react';
|
|
32
|
+
import type { RichMetadataTypeEntry } from './useMetadata';
|
|
33
|
+
export interface MetadataTypeActionsProps {
|
|
34
|
+
/** The rich type entry whose `actions` to render. */
|
|
35
|
+
entry?: Pick<RichMetadataTypeEntry, 'actions'> | undefined;
|
|
36
|
+
/** Which chrome slot is asking — actions are filtered by their `locations`. */
|
|
37
|
+
location: string;
|
|
38
|
+
/** Current item name, exposed to actions as `${ctx.recordId}`. */
|
|
39
|
+
recordId?: string;
|
|
40
|
+
/** Called after a successful action when `refreshAfter` is set. */
|
|
41
|
+
onAfter?: () => void;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Render the location-filtered type-level actions. Returns `null` when the
|
|
45
|
+
* type declares none for this slot, so callers can drop it straight into an
|
|
46
|
+
* existing toolbar `<>…</>` without conditionals.
|
|
47
|
+
*/
|
|
48
|
+
export declare function MetadataTypeActions({ entry, location, recordId, onAfter }: MetadataTypeActionsProps): React.ReactElement | null;
|