@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,5 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MetadataResourceHistoryPage — durable change log for one item
|
|
3
|
+
* (Phase 3c).
|
|
4
|
+
*
|
|
5
|
+
* Calls `client.history(type, name)`. The framework returns
|
|
6
|
+
* `{ events: MetadataEvent[] }` where each event records who saved
|
|
7
|
+
* what, with a monotonic `seq`. We render a vertical timeline; clicking
|
|
8
|
+
* an event expands its payload diff.
|
|
9
|
+
*
|
|
10
|
+
* Rollback is intentionally not exposed in MVP — restoring a previous
|
|
11
|
+
* version is just `client.save(type, name, oldPayload)` which already
|
|
12
|
+
* works, but a one-click revert needs a confirmation flow we'll add
|
|
13
|
+
* once admins ask for it.
|
|
14
|
+
*/
|
|
15
|
+
import * as React from 'react';
|
|
16
|
+
import { useMetadataClient } from './useMetadata';
|
|
1
17
|
export interface MetadataResourceHistoryPageProps {
|
|
2
18
|
type?: string;
|
|
3
19
|
name?: string;
|
|
4
20
|
}
|
|
5
|
-
export declare function MetadataResourceHistoryPage({ type: typeProp, name: nameProp, }: MetadataResourceHistoryPageProps):
|
|
21
|
+
export declare function MetadataResourceHistoryPage({ type: typeProp, name: nameProp, }: MetadataResourceHistoryPageProps): React.JSX.Element;
|
|
22
|
+
/**
|
|
23
|
+
* Embeddable version of the history timeline. Re-used by both the
|
|
24
|
+
* routed full page and the right-side sheet on the edit page so we
|
|
25
|
+
* keep a single visual + fetching implementation.
|
|
26
|
+
*
|
|
27
|
+
* Pass `onRollback` to enable the per-event Rollback action — the
|
|
28
|
+
* embedded version inside ResourceEditPage uses it to refresh the
|
|
29
|
+
* editor's layered view after restoring a previous version.
|
|
30
|
+
*/
|
|
31
|
+
export declare function HistoryPanel({ type, name, refreshKey, onCount, client, onRollback, rollbackConfirm, rollbackLabel, }: {
|
|
32
|
+
type: string;
|
|
33
|
+
name: string;
|
|
34
|
+
refreshKey?: number;
|
|
35
|
+
onCount?: (n: number) => void;
|
|
36
|
+
client: ReturnType<typeof useMetadataClient>;
|
|
37
|
+
/** Called after a successful rollback so the parent can refresh. */
|
|
38
|
+
onRollback?: (version: number) => void;
|
|
39
|
+
/** Confirmation message — defaults to a literal English string. */
|
|
40
|
+
rollbackConfirm?: (version: number) => string;
|
|
41
|
+
/** Tooltip / button label — defaults to "Rollback". */
|
|
42
|
+
rollbackLabel?: string;
|
|
43
|
+
}): React.JSX.Element;
|
|
@@ -16,7 +16,7 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
|
|
|
16
16
|
*/
|
|
17
17
|
import * as React from 'react';
|
|
18
18
|
import { useNavigate, useParams } from 'react-router-dom';
|
|
19
|
-
import { ArrowLeft, RefreshCw, Loader2 } from 'lucide-react';
|
|
19
|
+
import { ArrowLeft, RefreshCw, Loader2, RotateCcw } from 'lucide-react';
|
|
20
20
|
import { Button } from '@object-ui/components';
|
|
21
21
|
import { Badge } from '@object-ui/components';
|
|
22
22
|
import { Empty, EmptyTitle, EmptyDescription } from '@object-ui/components';
|
|
@@ -30,11 +30,26 @@ export function MetadataResourceHistoryPage({ type: typeProp, name: nameProp, })
|
|
|
30
30
|
const client = useMetadataClient();
|
|
31
31
|
const { entries } = useMetadataTypes(client);
|
|
32
32
|
const entry = entries.find((t) => t.type === type);
|
|
33
|
+
const [refreshKey, setRefreshKey] = React.useState(0);
|
|
34
|
+
const [eventCount, setEventCount] = React.useState(0);
|
|
35
|
+
return (_jsx(PageShell, { entry: entry ?? { type, label: type }, itemName: name, subtitle: "Version history", stats: [{ label: 'Events', value: eventCount }], actions: _jsxs(_Fragment, { children: [_jsxs(Button, { variant: "ghost", size: "sm", onClick: () => navigate(`../${encodeURIComponent(name)}`), children: [_jsx(ArrowLeft, { className: "h-4 w-4 mr-1" }), "Back to item"] }), _jsx(Button, { variant: "ghost", size: "sm", onClick: () => setRefreshKey((k) => k + 1), children: _jsx(RefreshCw, { className: "h-4 w-4" }) })] }), children: _jsx("div", { className: "p-6 max-w-4xl", children: _jsx(HistoryPanel, { type: type, name: name, refreshKey: refreshKey, onCount: setEventCount, client: client, onRollback: () => setRefreshKey((k) => k + 1) }) }) }));
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Embeddable version of the history timeline. Re-used by both the
|
|
39
|
+
* routed full page and the right-side sheet on the edit page so we
|
|
40
|
+
* keep a single visual + fetching implementation.
|
|
41
|
+
*
|
|
42
|
+
* Pass `onRollback` to enable the per-event Rollback action — the
|
|
43
|
+
* embedded version inside ResourceEditPage uses it to refresh the
|
|
44
|
+
* editor's layered view after restoring a previous version.
|
|
45
|
+
*/
|
|
46
|
+
export function HistoryPanel({ type, name, refreshKey = 0, onCount, client, onRollback, rollbackConfirm, rollbackLabel, }) {
|
|
33
47
|
const [events, setEvents] = React.useState([]);
|
|
34
48
|
const [loading, setLoading] = React.useState(true);
|
|
35
49
|
const [error, setError] = React.useState(null);
|
|
36
|
-
const [refreshKey, setRefreshKey] = React.useState(0);
|
|
37
50
|
const [expanded, setExpanded] = React.useState(null);
|
|
51
|
+
const [rollingBack, setRollingBack] = React.useState(null);
|
|
52
|
+
const [localRefresh, setLocalRefresh] = React.useState(0);
|
|
38
53
|
React.useEffect(() => {
|
|
39
54
|
let cancelled = false;
|
|
40
55
|
setLoading(true);
|
|
@@ -52,6 +67,7 @@ export function MetadataResourceHistoryPage({ type: typeProp, name: nameProp, })
|
|
|
52
67
|
// Reverse chronological — most recent first.
|
|
53
68
|
const sorted = [...list].sort((a, b) => (b.seq ?? 0) - (a.seq ?? 0));
|
|
54
69
|
setEvents(sorted);
|
|
70
|
+
onCount?.(sorted.length);
|
|
55
71
|
setLoading(false);
|
|
56
72
|
}
|
|
57
73
|
catch (err) {
|
|
@@ -64,20 +80,54 @@ export function MetadataResourceHistoryPage({ type: typeProp, name: nameProp, })
|
|
|
64
80
|
return () => {
|
|
65
81
|
cancelled = true;
|
|
66
82
|
};
|
|
67
|
-
}, [client, type, name, refreshKey]);
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
83
|
+
}, [client, type, name, refreshKey, localRefresh]);
|
|
84
|
+
async function doRollback(version) {
|
|
85
|
+
const message = rollbackConfirm
|
|
86
|
+
? rollbackConfirm(version)
|
|
87
|
+
: `Restore version ${version}? This writes the historical body back as the current overlay.`;
|
|
88
|
+
if (!confirm(message))
|
|
89
|
+
return;
|
|
90
|
+
setRollingBack(version);
|
|
91
|
+
setError(null);
|
|
92
|
+
try {
|
|
93
|
+
await client.rollback(type, name, version);
|
|
94
|
+
onRollback?.(version);
|
|
95
|
+
// Refetch so the new revert event shows up at the top.
|
|
96
|
+
setLocalRefresh((k) => k + 1);
|
|
97
|
+
}
|
|
98
|
+
catch (err) {
|
|
99
|
+
setError(err?.message ?? String(err));
|
|
100
|
+
}
|
|
101
|
+
finally {
|
|
102
|
+
setRollingBack(null);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return (_jsxs(_Fragment, { children: [loading && (_jsxs("div", { className: "text-sm text-muted-foreground flex items-center gap-2", children: [_jsx(Loader2, { className: "h-4 w-4 animate-spin" }), " Loading history\u2026"] })), error && (_jsx("div", { className: "text-sm text-destructive border border-destructive/30 rounded p-3 bg-destructive/5", children: error })), !loading && !error && events.length === 0 && (_jsxs(Empty, { children: [_jsx(EmptyTitle, { children: "No history yet" }), _jsx(EmptyDescription, { children: "This item has never been edited via an overlay. The first save will create the initial history record." })] })), !loading && events.length > 0 && (_jsx("ol", { className: "space-y-2 relative pl-6 border-l", children: events.map((ev, i) => {
|
|
106
|
+
const isOpen = expanded === i;
|
|
107
|
+
const op = ev.op ?? ev.kind;
|
|
108
|
+
const ts = ev.ts ?? ev.at;
|
|
109
|
+
const canRollback = !!onRollback
|
|
110
|
+
&& typeof ev.version === 'number'
|
|
111
|
+
&& op !== 'delete'
|
|
112
|
+
&& op !== 'tombstone';
|
|
113
|
+
return (_jsxs("li", { className: "relative", children: [_jsx("span", { className: "absolute -left-[27px] top-2 w-3 h-3 rounded-full bg-primary ring-4 ring-background" }), _jsxs("div", { role: "button", tabIndex: 0, onClick: () => setExpanded(isOpen ? null : i), onKeyDown: (e) => {
|
|
114
|
+
if (e.key === 'Enter' || e.key === ' ') {
|
|
115
|
+
setExpanded(isOpen ? null : i);
|
|
116
|
+
}
|
|
117
|
+
}, className: "border rounded-lg p-3 hover:border-primary/50 cursor-pointer transition-colors", children: [_jsxs("div", { className: "flex items-center gap-2 flex-wrap", children: [_jsxs(Badge, { variant: "outline", className: "text-[10px] font-mono", children: ["seq ", ev.seq ?? '–'] }), typeof ev.version === 'number' && (_jsxs(Badge, { variant: "outline", className: "text-[10px] font-mono", children: ["v", ev.version] })), op && (_jsx(Badge, { className: 'text-[10px] ' +
|
|
118
|
+
(op === 'delete' || op === 'tombstone'
|
|
119
|
+
? 'bg-red-100 text-red-800 hover:bg-red-100'
|
|
120
|
+
: op === 'create'
|
|
121
|
+
? 'bg-blue-100 text-blue-800 hover:bg-blue-100'
|
|
122
|
+
: op === 'publish'
|
|
123
|
+
? 'bg-emerald-100 text-emerald-800 hover:bg-emerald-100'
|
|
124
|
+
: op === 'revert'
|
|
125
|
+
? 'bg-amber-100 text-amber-900 hover:bg-amber-100'
|
|
126
|
+
: 'bg-emerald-100 text-emerald-800 hover:bg-emerald-100'), children: String(op) })), ev.actor && (_jsxs("span", { className: "text-xs text-muted-foreground", children: ["by", ' ', _jsx("span", { className: "font-mono", children: String(ev.actor) })] })), ts && (_jsx("span", { className: "text-xs text-muted-foreground ml-auto", children: formatWhen(ts) })), canRollback && (_jsx(Button, { size: "sm", variant: "ghost", className: "h-6 w-6 p-0", title: rollbackLabel ?? 'Rollback to this version', disabled: rollingBack !== null, onClick: (e) => {
|
|
127
|
+
e.stopPropagation();
|
|
128
|
+
doRollback(ev.version);
|
|
129
|
+
}, children: rollingBack === ev.version ? (_jsx(Loader2, { className: "h-3.5 w-3.5 animate-spin" })) : (_jsx(RotateCcw, { className: "h-3.5 w-3.5" })) }))] }), isOpen && (_jsx("pre", { className: "mt-2 text-xs font-mono bg-muted/30 rounded p-2 overflow-auto max-h-[280px]", children: safeStringify(ev) }))] })] }, `${ev.seq ?? i}-${i}`));
|
|
130
|
+
}) }))] }));
|
|
81
131
|
}
|
|
82
132
|
function formatWhen(at) {
|
|
83
133
|
try {
|
|
@@ -1,4 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MetadataResourceListPage — generic list of items for a metadata type
|
|
3
|
+
* (Phase 3c).
|
|
4
|
+
*
|
|
5
|
+
* Reads `/meta/:type`, applies registry-driven columns + search +
|
|
6
|
+
* source/overlay filters, and renders an ObjectGrid-like table.
|
|
7
|
+
* Each row links to its EditPage at `./:name?type=…`.
|
|
8
|
+
*
|
|
9
|
+
* No virtualisation in MVP — metadata lists are typically < 200 items
|
|
10
|
+
* per type, well under the threshold where it'd matter.
|
|
11
|
+
*/
|
|
12
|
+
import * as React from 'react';
|
|
1
13
|
export interface MetadataResourceListPageProps {
|
|
2
14
|
type?: string;
|
|
3
15
|
}
|
|
4
|
-
export declare function MetadataResourceListPage({ type: typeProp }: MetadataResourceListPageProps):
|
|
16
|
+
export declare function MetadataResourceListPage({ type: typeProp }: MetadataResourceListPageProps): React.JSX.Element;
|
|
@@ -12,37 +12,178 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
|
|
|
12
12
|
* per type, well under the threshold where it'd matter.
|
|
13
13
|
*/
|
|
14
14
|
import * as React from 'react';
|
|
15
|
-
import { Link, useNavigate, useParams } from 'react-router-dom';
|
|
16
|
-
import { Plus, Search, RefreshCw } from 'lucide-react';
|
|
15
|
+
import { Link, Navigate, useNavigate, useParams, useSearchParams } from 'react-router-dom';
|
|
16
|
+
import { Plus, Search, RefreshCw, AlertTriangle, Lock } from 'lucide-react';
|
|
17
17
|
import { Button } from '@object-ui/components';
|
|
18
18
|
import { Input } from '@object-ui/components';
|
|
19
19
|
import { Badge } from '@object-ui/components';
|
|
20
20
|
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '@object-ui/components';
|
|
21
21
|
import { Empty, EmptyTitle, EmptyDescription } from '@object-ui/components';
|
|
22
22
|
import { PageShell } from './PageShell';
|
|
23
|
+
import { MetadataTypeActions } from './MetadataTypeActions';
|
|
23
24
|
import { useMetadataClient, useMetadataTypes, matchesQuery, } from './useMetadata';
|
|
24
25
|
import { getMetadataResource, resolveResourceConfig, } from './registry';
|
|
25
|
-
import { t, detectLocale } from './i18n';
|
|
26
|
+
import { t, tFormat, translateMetadataType, detectLocale } from './i18n';
|
|
27
|
+
import { buildPackageScopeOptions, LOCAL_PACKAGE_ID } from './package-scope';
|
|
28
|
+
/**
|
|
29
|
+
* Derive provenance from item._packageId. The `loadMetaFromDb` path
|
|
30
|
+
* tags objects with the synthetic packageId 'sys_metadata' (see
|
|
31
|
+
* framework protocol.ts:3092); treat that sentinel as runtime-authored.
|
|
32
|
+
*/
|
|
33
|
+
function classifyProvenance(item, rawSource) {
|
|
34
|
+
if (rawSource === 'overlay' || rawSource === 'runtime')
|
|
35
|
+
return 'runtime';
|
|
36
|
+
if (rawSource === 'code' || rawSource === 'artifact')
|
|
37
|
+
return 'artifact';
|
|
38
|
+
const pkg = item._packageId;
|
|
39
|
+
if (!pkg || pkg === 'sys_metadata')
|
|
40
|
+
return 'runtime';
|
|
41
|
+
return 'artifact';
|
|
42
|
+
}
|
|
26
43
|
export function MetadataResourceListPage({ type: typeProp }) {
|
|
27
44
|
const params = useParams();
|
|
28
45
|
const type = typeProp ?? params.type ?? '';
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
const config = resolveResourceConfig(type, entry);
|
|
46
|
+
if (type === 'package') {
|
|
47
|
+
const appName = params.appName ?? 'studio';
|
|
48
|
+
return _jsx(Navigate, { to: `/apps/${appName}/component/developer/packages`, replace: true });
|
|
49
|
+
}
|
|
34
50
|
// If a fully custom ListPage is registered, render it and bail.
|
|
51
|
+
// Done before any other hooks so hook count stays stable across type
|
|
52
|
+
// switches between custom and default list pages.
|
|
35
53
|
const customConfig = getMetadataResource(type);
|
|
36
54
|
if (customConfig?.ListPage) {
|
|
37
55
|
const Custom = customConfig.ListPage;
|
|
38
56
|
return _jsx(Custom, { type: type });
|
|
39
57
|
}
|
|
58
|
+
return _jsx(DefaultMetadataList, { type: type, appName: params.appName });
|
|
59
|
+
}
|
|
60
|
+
function DefaultMetadataList({ type, appName }) {
|
|
61
|
+
const navigate = useNavigate();
|
|
62
|
+
const client = useMetadataClient();
|
|
63
|
+
const { entries: typesEntries } = useMetadataTypes(client);
|
|
64
|
+
const entry = typesEntries.find((t) => t.type === type);
|
|
65
|
+
const config = resolveResourceConfig(type, entry);
|
|
40
66
|
const [items, setItems] = React.useState([]);
|
|
41
67
|
const [loading, setLoading] = React.useState(true);
|
|
42
68
|
const [error, setError] = React.useState(null);
|
|
43
69
|
const [query, setQuery] = React.useState('');
|
|
44
70
|
const [sourceFilter, setSourceFilter] = React.useState('all');
|
|
71
|
+
const [searchParams, setSearchParams] = useSearchParams();
|
|
45
72
|
const [refreshKey, setRefreshKey] = React.useState(0);
|
|
73
|
+
// Studio is scoped to a single *project* package at a time. Load the
|
|
74
|
+
// installed packages and keep only project-scoped ones — anything not
|
|
75
|
+
// tagged `system`/`cloud` (a missing scope counts as project). System
|
|
76
|
+
// metadata therefore never leaks: the scope selector never offers a
|
|
77
|
+
// system package and an unscoped view is not allowed.
|
|
78
|
+
const [projectPackages, setProjectPackages] = React.useState(null);
|
|
79
|
+
React.useEffect(() => {
|
|
80
|
+
let cancelled = false;
|
|
81
|
+
(async () => {
|
|
82
|
+
try {
|
|
83
|
+
const list = await client.list('package');
|
|
84
|
+
if (cancelled)
|
|
85
|
+
return;
|
|
86
|
+
setProjectPackages(buildPackageScopeOptions(list));
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
if (!cancelled)
|
|
90
|
+
setProjectPackages([]);
|
|
91
|
+
}
|
|
92
|
+
})();
|
|
93
|
+
return () => {
|
|
94
|
+
cancelled = true;
|
|
95
|
+
};
|
|
96
|
+
}, [client]);
|
|
97
|
+
// Resolve the CURRENT APP's package so the list defaults to the scope the
|
|
98
|
+
// admin is actually working in (e.g. opening Pages from the Showcase app
|
|
99
|
+
// shows that app's pages, not an alphabetically-first empty template). The
|
|
100
|
+
// route segment may be the app `name` or its package id, so match both.
|
|
101
|
+
const [appPackage, setAppPackage] = React.useState(null);
|
|
102
|
+
React.useEffect(() => {
|
|
103
|
+
let cancelled = false;
|
|
104
|
+
if (!appName) {
|
|
105
|
+
setAppPackage(null);
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
(async () => {
|
|
109
|
+
try {
|
|
110
|
+
const apps = await client.list('app');
|
|
111
|
+
if (cancelled)
|
|
112
|
+
return;
|
|
113
|
+
const match = (apps ?? [])
|
|
114
|
+
.map((raw) => (raw && typeof raw === 'object' && 'item' in raw ? raw.item : raw))
|
|
115
|
+
.find((a) => a?.name === appName || a?._packageId === appName);
|
|
116
|
+
setAppPackage(match?._packageId ?? null);
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
if (!cancelled)
|
|
120
|
+
setAppPackage(null);
|
|
121
|
+
}
|
|
122
|
+
})();
|
|
123
|
+
return () => { cancelled = true; };
|
|
124
|
+
}, [client, appName]);
|
|
125
|
+
// Resolve the active package from the URL, validated against the project
|
|
126
|
+
// package set. `null` while packages are still loading (fail closed).
|
|
127
|
+
const urlPackage = searchParams.get('package');
|
|
128
|
+
const activePackage = React.useMemo(() => {
|
|
129
|
+
if (!projectPackages)
|
|
130
|
+
return null;
|
|
131
|
+
if (urlPackage && projectPackages.some((p) => p.id === urlPackage))
|
|
132
|
+
return urlPackage;
|
|
133
|
+
if (projectPackages.length === 0)
|
|
134
|
+
return null;
|
|
135
|
+
// No valid URL package: prefer the CURRENT APP's package (the scope the
|
|
136
|
+
// admin is working in) when it's a valid project package — this is what
|
|
137
|
+
// makes "Pages" in the Showcase app default to Showcase's pages.
|
|
138
|
+
if (appPackage && projectPackages.some((p) => p.id === appPackage))
|
|
139
|
+
return appPackage;
|
|
140
|
+
// Otherwise prefer the project package that actually OWNS rows of this
|
|
141
|
+
// metadata type, so the list never opens empty on an alphabetically-first
|
|
142
|
+
// package that happens to own none. Falls back to the first package.
|
|
143
|
+
const counts = new Map();
|
|
144
|
+
for (const row of items) {
|
|
145
|
+
const pkg = row.item?._packageId;
|
|
146
|
+
if (pkg && pkg !== 'sys_metadata')
|
|
147
|
+
counts.set(pkg, (counts.get(pkg) ?? 0) + 1);
|
|
148
|
+
}
|
|
149
|
+
let best = null;
|
|
150
|
+
let bestN = 0;
|
|
151
|
+
for (const p of projectPackages) {
|
|
152
|
+
const n = counts.get(p.id) ?? 0;
|
|
153
|
+
if (n > bestN) {
|
|
154
|
+
best = p.id;
|
|
155
|
+
bestN = n;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
return best ?? projectPackages[0]?.id ?? null;
|
|
159
|
+
}, [projectPackages, urlPackage, items, appPackage]);
|
|
160
|
+
// Repair `?package=` so the sidebar selector, deep-links and create/edit
|
|
161
|
+
// navigation all agree on the active scope. Runs once packages resolve
|
|
162
|
+
// and the URL holds no valid project package.
|
|
163
|
+
React.useEffect(() => {
|
|
164
|
+
if (!projectPackages || projectPackages.length === 0)
|
|
165
|
+
return;
|
|
166
|
+
if (urlPackage && projectPackages.some((p) => p.id === urlPackage))
|
|
167
|
+
return;
|
|
168
|
+
// If the current app's package is known we can repair immediately; otherwise
|
|
169
|
+
// wait for rows so `activePackage` can resolve to the package that owns this
|
|
170
|
+
// type (repairing to the alphabetical-first package before then would lock
|
|
171
|
+
// the list onto an empty scope).
|
|
172
|
+
const appPkgValid = !!(appPackage && projectPackages.some((p) => p.id === appPackage));
|
|
173
|
+
if (!appPkgValid && items.length === 0)
|
|
174
|
+
return;
|
|
175
|
+
if (!activePackage)
|
|
176
|
+
return;
|
|
177
|
+
const next = new URLSearchParams(searchParams);
|
|
178
|
+
next.set('package', activePackage);
|
|
179
|
+
setSearchParams(next, { replace: true });
|
|
180
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
181
|
+
}, [projectPackages, urlPackage, items, activePackage, appPackage]);
|
|
182
|
+
// Carry the active package into create/edit navigation as `?package=` so
|
|
183
|
+
// the editor binds newly-saved rows to that software package.
|
|
184
|
+
const pkgSuffix = activePackage
|
|
185
|
+
? `?package=${encodeURIComponent(activePackage)}`
|
|
186
|
+
: '';
|
|
46
187
|
React.useEffect(() => {
|
|
47
188
|
let cancelled = false;
|
|
48
189
|
setLoading(true);
|
|
@@ -54,10 +195,14 @@ export function MetadataResourceListPage({ type: typeProp }) {
|
|
|
54
195
|
return;
|
|
55
196
|
const rows = (list ?? []).map((raw) => {
|
|
56
197
|
const item = (raw && typeof raw === 'object' && 'item' in raw ? raw.item : raw) ?? {};
|
|
198
|
+
// _diagnostics may live on the unwrapped item (default) or on the
|
|
199
|
+
// outer envelope when callers reshape rows; check both.
|
|
200
|
+
const diagnostics = item?._diagnostics ?? raw?._diagnostics ?? undefined;
|
|
57
201
|
return {
|
|
58
202
|
raw,
|
|
59
203
|
item,
|
|
60
|
-
source: raw?.source,
|
|
204
|
+
source: classifyProvenance(item, raw?.source),
|
|
205
|
+
diagnostics,
|
|
61
206
|
};
|
|
62
207
|
});
|
|
63
208
|
setItems(rows);
|
|
@@ -75,24 +220,55 @@ export function MetadataResourceListPage({ type: typeProp }) {
|
|
|
75
220
|
};
|
|
76
221
|
}, [client, type, refreshKey]);
|
|
77
222
|
const searchableFields = config.searchableFields ?? ['name', 'label', 'description'];
|
|
78
|
-
|
|
223
|
+
// Structural scope — every row this package could ever show for this
|
|
224
|
+
// type, before the user's search box / source dropdown narrow it. Header
|
|
225
|
+
// counts, the source filter, and the empty-state copy all key off this so
|
|
226
|
+
// a package with zero items of a type reads as "暂无…条目", not "no match
|
|
227
|
+
// for an (empty) query" just because *other* packages own rows of the
|
|
228
|
+
// same type (server list() is not package-scoped; we scope client-side).
|
|
229
|
+
const scopedItems = React.useMemo(() => items.filter((row) => {
|
|
230
|
+
// Per-type hide hook (e.g. `view` drops the bare aggregated
|
|
231
|
+
// container the framework keeps for runtime dual-read).
|
|
232
|
+
if (config.listFilter && !config.listFilter(row.item))
|
|
233
|
+
return false;
|
|
234
|
+
// Mandatory project-package scope: show nothing until a concrete
|
|
235
|
+
// project package is active, then only rows tagged with it. The
|
|
236
|
+
// 'sys_metadata' sentinel and untagged rows never match.
|
|
237
|
+
if (!activePackage)
|
|
238
|
+
return false;
|
|
239
|
+
const pkg = row.item?._packageId;
|
|
240
|
+
const isLocal = !pkg || pkg === LOCAL_PACKAGE_ID;
|
|
241
|
+
// Local/Custom scope surfaces this environment's runtime-authored items
|
|
242
|
+
// (untagged / `sys_metadata` provenance); a code package shows its own.
|
|
243
|
+
if (activePackage === LOCAL_PACKAGE_ID)
|
|
244
|
+
return isLocal;
|
|
245
|
+
return !isLocal && pkg === activePackage;
|
|
246
|
+
}), [items, activePackage, config]);
|
|
247
|
+
// User-driven filters (search query + source provenance) on top of scope.
|
|
248
|
+
const filtered = scopedItems.filter((row) => {
|
|
79
249
|
if (!matchesQuery(row.item, query, searchableFields))
|
|
80
250
|
return false;
|
|
81
|
-
if (sourceFilter !== 'all' && row.source
|
|
251
|
+
if (sourceFilter !== 'all' && row.source !== sourceFilter)
|
|
82
252
|
return false;
|
|
83
253
|
return true;
|
|
84
254
|
});
|
|
85
|
-
// Compute source counts for
|
|
255
|
+
// Compute source + invalid counts for filter / header stats.
|
|
86
256
|
const sourceCounts = React.useMemo(() => {
|
|
87
|
-
const c = { all:
|
|
88
|
-
for (const r of
|
|
89
|
-
|
|
90
|
-
c[r.source]++;
|
|
257
|
+
const c = { all: scopedItems.length, artifact: 0, runtime: 0 };
|
|
258
|
+
for (const r of scopedItems) {
|
|
259
|
+
c[r.source]++;
|
|
91
260
|
}
|
|
92
261
|
return c;
|
|
93
|
-
}, [
|
|
262
|
+
}, [scopedItems]);
|
|
263
|
+
const invalidCount = React.useMemo(() => scopedItems.filter((r) => r.diagnostics && r.diagnostics.valid === false).length, [scopedItems]);
|
|
264
|
+
// Items with warnings but no errors — softer, advisory tier. We
|
|
265
|
+
// count rows (not warning instances) for consistency with `invalid`.
|
|
266
|
+
const warnOnlyCount = React.useMemo(() => scopedItems.filter((r) => r.diagnostics &&
|
|
267
|
+
r.diagnostics.valid !== false &&
|
|
268
|
+
(r.diagnostics.warnings?.length ?? 0) > 0).length, [scopedItems]);
|
|
94
269
|
const columns = config.listColumns ?? defaultColumns(config.primaryKey ?? 'name');
|
|
95
270
|
const locale = detectLocale();
|
|
271
|
+
const typeLabel = translateMetadataType(type, locale, entry?.label ?? type);
|
|
96
272
|
// Localise default column labels — registered columns keep their
|
|
97
273
|
// hand-authored labels (consumers may want bespoke wording).
|
|
98
274
|
const localizeColumnLabel = (col) => {
|
|
@@ -101,24 +277,76 @@ export function MetadataResourceListPage({ type: typeProp }) {
|
|
|
101
277
|
return translated === tryKey ? col.label : translated;
|
|
102
278
|
};
|
|
103
279
|
return (_jsx(PageShell, { entry: entry ?? { type, label: type }, stats: [
|
|
104
|
-
{ label: t('engine.list.items', locale), value:
|
|
280
|
+
{ label: t('engine.list.items', locale), value: scopedItems.length },
|
|
105
281
|
{ label: t('engine.list.filtered', locale), value: filtered.length },
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
282
|
+
...(invalidCount > 0
|
|
283
|
+
? [
|
|
284
|
+
{
|
|
285
|
+
label: t('engine.list.invalid', locale),
|
|
286
|
+
value: (_jsxs("span", { className: "inline-flex items-center gap-1 text-destructive", children: [_jsx(AlertTriangle, { className: "w-3.5 h-3.5" }), invalidCount] })),
|
|
287
|
+
},
|
|
288
|
+
]
|
|
289
|
+
: []),
|
|
290
|
+
...(warnOnlyCount > 0
|
|
291
|
+
? [
|
|
292
|
+
{
|
|
293
|
+
label: t('engine.list.warnings', locale),
|
|
294
|
+
value: (_jsxs("span", { className: "inline-flex items-center gap-1 text-amber-600 dark:text-amber-400", children: [_jsx(AlertTriangle, { className: "w-3.5 h-3.5" }), warnOnlyCount] })),
|
|
295
|
+
},
|
|
296
|
+
]
|
|
297
|
+
: []),
|
|
298
|
+
], actions: _jsxs(_Fragment, { children: [_jsx(MetadataTypeActions, { entry: entry, location: "list_toolbar", onAfter: () => setRefreshKey((k) => k + 1) }), _jsx(Button, { variant: "ghost", size: "sm", onClick: () => setRefreshKey((k) => k + 1), title: t('engine.list.refresh', locale), children: _jsx(RefreshCw, { className: "h-4 w-4" }) }), (entry?.allowOrgOverride || entry?.allowRuntimeCreate) && (_jsxs(Button, { size: "sm", variant: config.createFields ? 'default' : 'outline', onClick: () => navigate(`./new${pkgSuffix}`), title: config.createFields
|
|
299
|
+
? tFormat('engine.list.createHint', locale, { type: typeLabel })
|
|
300
|
+
: undefined, children: [_jsx(Plus, { className: "h-4 w-4 mr-1" }), t('engine.list.create', locale)] }))] }), children: _jsxs("div", { className: "p-6 space-y-4", children: [_jsxs("div", { className: "flex items-center gap-3 flex-wrap", children: [_jsxs("div", { className: "relative flex-1 min-w-[200px] max-w-md", children: [_jsx(Search, { className: "absolute left-2.5 top-1/2 -translate-y-1/2 h-3.5 w-3.5 text-muted-foreground" }), _jsx(Input, { className: "pl-8", placeholder: t('engine.list.search', locale), value: query, onChange: (e) => setQuery(e.target.value) })] }), _jsxs(Select, { value: sourceFilter, onValueChange: setSourceFilter, children: [_jsx(SelectTrigger, { className: "w-[180px]", children: _jsx(SelectValue, {}) }), _jsxs(SelectContent, { children: [_jsxs(SelectItem, { value: "all", children: [t('engine.list.allSources', locale), " (", sourceCounts.all, ")"] }), _jsxs(SelectItem, { value: "artifact", children: [t('engine.list.source.artifact', locale), " (", sourceCounts.artifact, ")"] }), _jsxs(SelectItem, { value: "runtime", children: [t('engine.list.source.runtime', locale), " (", sourceCounts.runtime, ")"] })] })] })] }), (loading || projectPackages === null) && (_jsxs("div", { className: "text-sm text-muted-foreground", children: [t('engine.edit.loading', locale), " ", type, "\u2026"] })), error && (_jsx("div", { className: "text-sm text-destructive border border-destructive/30 rounded p-3 bg-destructive/5", children: error })), !loading && !error && projectPackages !== null && projectPackages.length === 0 && (_jsxs(Empty, { children: [_jsx(EmptyTitle, { children: "No project packages installed" }), _jsx(EmptyDescription, { children: "Studio only shows metadata that belongs to a project software package. Install or create a project package to manage its metadata here." })] })), !loading && !error && projectPackages !== null && projectPackages.length > 0 && filtered.length === 0 && (_jsxs(Empty, { children: [_jsx(EmptyTitle, { children: scopedItems.length === 0
|
|
301
|
+
? tFormat('engine.list.emptyType', locale, { type: typeLabel })
|
|
302
|
+
: tFormat('engine.list.emptyQuery', locale, { query }) }), _jsx(EmptyDescription, { children: config.emptyStateHint ??
|
|
303
|
+
(entry?.allowOrgOverride || entry?.allowRuntimeCreate
|
|
304
|
+
? tFormat('engine.list.createHint', locale, { type: typeLabel })
|
|
305
|
+
: t('engine.list.readOnlyHint', locale)) }), scopedItems.length === 0 && (entry?.allowOrgOverride || entry?.allowRuntimeCreate) && (_jsx("div", { className: "mt-4", children: _jsxs(Button, { onClick: () => navigate(`./new${pkgSuffix}`), children: [_jsx(Plus, { className: "h-4 w-4 mr-1" }), t('engine.list.create', locale)] }) }))] })), !loading && filtered.length > 0 && (_jsx("div", { className: "border rounded-lg overflow-hidden", children: _jsxs("table", { className: "w-full text-sm", children: [_jsx("thead", { className: "bg-muted/40 text-xs uppercase tracking-wider text-muted-foreground", children: _jsxs("tr", { children: [columns.map((c) => (_jsx("th", { className: "px-3 py-2 text-left font-medium", style: c.width ? { width: c.width } : undefined, children: localizeColumnLabel(c) }, c.key))), _jsx("th", { className: "px-3 py-2 text-right font-medium w-[80px]", children: t('engine.list.col.source', locale) })] }) }), _jsx("tbody", { className: "divide-y", children: filtered.map((row, i) => {
|
|
112
306
|
const pk = config.primaryKey ?? 'name';
|
|
113
307
|
const name = String(row.item[pk] ?? `(unnamed-${i})`);
|
|
114
|
-
|
|
308
|
+
// ADR-0048 — link to this row's OWNING package so the editor
|
|
309
|
+
// resolves the right item even in the unscoped "all" list
|
|
310
|
+
// where two packages may ship the same name. Falls back to the
|
|
311
|
+
// workspace suffix for runtime/overlay-only rows (no real
|
|
312
|
+
// package, or the `sys_metadata` rehydration sentinel).
|
|
313
|
+
const rowPkg = row.item._packageId;
|
|
314
|
+
const rowEditSuffix = rowPkg && rowPkg !== 'sys_metadata'
|
|
315
|
+
? `?package=${encodeURIComponent(rowPkg)}`
|
|
316
|
+
: pkgSuffix;
|
|
317
|
+
const invalid = row.diagnostics?.valid === false;
|
|
318
|
+
const errorList = row.diagnostics?.errors ?? [];
|
|
319
|
+
const warnList = row.diagnostics?.warnings ?? [];
|
|
320
|
+
const warnOnly = !invalid && warnList.length > 0;
|
|
321
|
+
const errorTitle = invalid
|
|
322
|
+
? errorList
|
|
323
|
+
.slice(0, 3)
|
|
324
|
+
.map((e) => `${e.path || '(root)'}: ${e.message}`)
|
|
325
|
+
.join('\n') +
|
|
326
|
+
(errorList.length > 3 ? `\n+${errorList.length - 3} more` : '')
|
|
327
|
+
: warnOnly
|
|
328
|
+
? warnList
|
|
329
|
+
.slice(0, 3)
|
|
330
|
+
.map((w) => `${w.path || '(root)'}: ${w.message}`)
|
|
331
|
+
.join('\n') +
|
|
332
|
+
(warnList.length > 3 ? `\n+${warnList.length - 3} more` : '')
|
|
333
|
+
: '';
|
|
334
|
+
return (_jsxs("tr", { className: 'hover:bg-accent/50 ' +
|
|
335
|
+
(invalid
|
|
336
|
+
? 'bg-destructive/[0.04]'
|
|
337
|
+
: warnOnly
|
|
338
|
+
? 'bg-amber-500/[0.05]'
|
|
339
|
+
: ''), children: [columns.map((c, ci) => {
|
|
115
340
|
const value = row.item[c.key];
|
|
116
341
|
const cell = c.render ? c.render(value, row.item) : defaultCell(value);
|
|
117
|
-
return (_jsx("td", { className: "px-3 py-2 align-top", children: ci === 0 ? (_jsx(Link, { to: `./${encodeURIComponent(name)}`, className: "text-primary hover:underline font-mono", children: cell })) : (cell) }, c.key));
|
|
118
|
-
}),
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
342
|
+
return (_jsx("td", { className: "px-3 py-2 align-top", children: ci === 0 ? (_jsxs("span", { className: "inline-flex items-center gap-1.5", children: [invalid && (_jsx("span", { className: "inline-flex", "aria-label": t('engine.list.invalidTitle', locale), title: `${tFormat('engine.list.invalidCount', locale, { count: errorList.length })}\n${errorTitle}`, children: _jsx(AlertTriangle, { className: "w-3.5 h-3.5 text-destructive shrink-0" }) })), warnOnly && (_jsx("span", { className: "inline-flex", "aria-label": t('engine.list.warnTitle', locale), title: `${tFormat('engine.list.warnCount', locale, { count: warnList.length })}\n${errorTitle}`, children: _jsx(AlertTriangle, { className: "w-3.5 h-3.5 text-amber-600 dark:text-amber-400 shrink-0" }) })), _jsx(Link, { to: `./${encodeURIComponent(name)}${rowEditSuffix}`, className: "text-primary hover:underline font-mono", children: cell })] })) : (cell) }, c.key));
|
|
343
|
+
}), _jsxs("td", { className: "px-3 py-2 text-right align-top", children: [row.item._lock && row.item._lock !== 'none' && (_jsx("span", { className: "inline-flex items-center mr-1 text-amber-600 dark:text-amber-400", title: row.item._lockReason
|
|
344
|
+
?? `_lock=${String(row.item._lock)}`, children: _jsx(Lock, { className: "h-3 w-3" }) })), _jsx(Badge, { variant: "outline", className: 'text-[10px] ' +
|
|
345
|
+
(row.source === 'artifact'
|
|
346
|
+
? 'border-sky-500/50 text-sky-700 dark:text-sky-300'
|
|
347
|
+
: 'border-emerald-500/50 text-emerald-700 dark:text-emerald-300'), title: row.source === 'artifact'
|
|
348
|
+
? `${t('engine.list.source.artifactDesc', locale)}${row.item._packageId ? ` (${row.item._packageId})` : ''}`
|
|
349
|
+
: t('engine.list.source.runtimeDesc', locale), children: t(`engine.list.source.${row.source}`, locale) })] })] }, name + i));
|
|
122
350
|
}) })] }) }))] }) }));
|
|
123
351
|
}
|
|
124
352
|
function defaultColumns(primaryKey) {
|
|
@@ -1,3 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MetadataResourceRouter — top-level component bound to
|
|
3
|
+
* `metadata:resource`. Switches between list / create / edit /
|
|
4
|
+
* history based on the trailing wildcard URL.
|
|
5
|
+
*
|
|
6
|
+
* URL shape (the parent route is `/apps/:appName/component/:ns/:name/*`,
|
|
7
|
+
* so the wildcard begins AFTER `metadata/resource`):
|
|
8
|
+
*
|
|
9
|
+
* `?type=view` → list of `view` items
|
|
10
|
+
* `/new?type=view` → create new view
|
|
11
|
+
* `/account?type=object` → edit object `account`
|
|
12
|
+
* `/account/history?type=object` → history for object `account`
|
|
13
|
+
*
|
|
14
|
+
* The `type` query param is the single source of truth for the
|
|
15
|
+
* metadata type. The wildcard provides the item name (or `'new'`).
|
|
16
|
+
*
|
|
17
|
+
* Why parse the wildcard manually instead of nested `<Routes>`?
|
|
18
|
+
* The parent route's `path` is `component/:ns/:name/*` and React
|
|
19
|
+
* Router strips the matched portion before passing what's left to
|
|
20
|
+
* `useParams['*']`, so we just split on `/`.
|
|
21
|
+
*/
|
|
22
|
+
import * as React from 'react';
|
|
1
23
|
/**
|
|
2
24
|
* Props forwarded by `ComponentNavView` — it merges URL query-string
|
|
3
25
|
* into props, so we accept both `type` (from `?type=…`) and route
|
|
@@ -7,4 +29,4 @@ export interface MetadataResourceRouterProps {
|
|
|
7
29
|
/** Singular metadata type, e.g. 'view'. */
|
|
8
30
|
type?: string;
|
|
9
31
|
}
|
|
10
|
-
export declare function MetadataResourceRouter({ type }: MetadataResourceRouterProps):
|
|
32
|
+
export declare function MetadataResourceRouter({ type }: MetadataResourceRouterProps): React.JSX.Element;
|