@object-ui/app-shell 6.2.3 → 7.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +948 -0
- package/README.md +292 -0
- package/dist/assistant/assistantBus.d.ts +72 -0
- package/dist/assistant/assistantBus.js +133 -0
- package/dist/chrome/CommandPalette.d.ts +1 -1
- package/dist/chrome/CommandPalette.js +26 -22
- package/dist/chrome/ConditionalAuthWrapper.d.ts +1 -1
- package/dist/chrome/ConsoleToaster.d.ts +1 -1
- package/dist/chrome/ConsoleToaster.js +3 -1
- package/dist/chrome/ErrorBoundary.d.ts +1 -1
- package/dist/chrome/KeyboardShortcutsDialog.d.ts +1 -1
- package/dist/chrome/KeyboardShortcutsDialog.js +16 -5
- package/dist/chrome/LoadingScreen.d.ts +1 -1
- package/dist/chrome/LoadingScreen.js +22 -26
- package/dist/chrome/RouteFader.d.ts +1 -1
- package/dist/chrome/ThemeProvider.d.ts +1 -1
- package/dist/components/ManagedByBadge.d.ts +1 -1
- package/dist/console/AppContent.d.ts +1 -1
- package/dist/console/AppContent.js +170 -37
- package/dist/console/ConsoleShell.d.ts +7 -7
- package/dist/console/ConsoleShell.js +32 -3
- package/dist/console/ai/AiChatPage.d.ts +88 -1
- package/dist/console/ai/AiChatPage.js +743 -66
- package/dist/console/ai/ConversationsSidebar.d.ts +26 -1
- package/dist/console/ai/ConversationsSidebar.js +149 -34
- package/dist/console/ai/LiveCanvas.d.ts +22 -0
- package/dist/console/ai/LiveCanvas.js +78 -0
- package/dist/console/ai/reconcileTurn.d.ts +8 -0
- package/dist/console/ai/reconcileTurn.js +20 -0
- package/dist/console/auth/AuthPageLayout.d.ts +1 -1
- package/dist/console/auth/ForgotPasswordPage.d.ts +1 -1
- package/dist/console/auth/LoginPage.d.ts +1 -1
- package/dist/console/auth/RegisterPage.d.ts +1 -1
- package/dist/console/auth/RegisterPage.js +23 -3
- package/dist/console/cloud-connection/CloudConnectionPanel.d.ts +1 -0
- package/dist/console/cloud-connection/CloudConnectionPanel.js +169 -0
- package/dist/console/home/AppCard.d.ts +1 -1
- package/dist/console/home/AppCard.js +6 -12
- package/dist/console/home/HomeAppsStrip.d.ts +8 -0
- package/dist/console/home/HomeAppsStrip.js +61 -0
- package/dist/console/home/HomeLayout.d.ts +1 -1
- package/dist/console/home/HomeLayout.js +3 -1
- package/dist/console/home/HomePage.d.ts +1 -2
- package/dist/console/home/HomePage.js +149 -21
- package/dist/console/home/HomeRail.d.ts +22 -0
- package/dist/console/home/HomeRail.js +62 -0
- package/dist/console/home/QuickActions.d.ts +1 -1
- package/dist/console/home/QuickActions.js +3 -11
- package/dist/console/home/RecentApps.d.ts +1 -1
- package/dist/console/home/RecentApps.js +2 -2
- package/dist/console/home/StarredApps.d.ts +1 -1
- package/dist/console/home/StarredApps.js +2 -2
- package/dist/console/marketplace/InstalledListWidget.d.ts +1 -0
- package/dist/console/marketplace/InstalledListWidget.js +93 -0
- package/dist/console/marketplace/MarkdownText.d.ts +1 -1
- package/dist/console/marketplace/MarketplaceAccessDenied.d.ts +1 -1
- package/dist/console/marketplace/MarketplaceInstalledPage.d.ts +8 -14
- package/dist/console/marketplace/MarketplaceInstalledPage.js +14 -66
- package/dist/console/marketplace/MarketplacePackagePage.d.ts +1 -1
- package/dist/console/marketplace/MarketplacePackagePage.js +249 -8
- package/dist/console/marketplace/MarketplacePage.d.ts +1 -1
- package/dist/console/marketplace/MarketplacePage.js +60 -3
- package/dist/console/marketplace/PackageIcon.d.ts +1 -1
- package/dist/console/marketplace/PluginDisclosure.d.ts +14 -0
- package/dist/console/marketplace/PluginDisclosure.js +38 -0
- package/dist/console/marketplace/marketplaceApi.d.ts +123 -0
- package/dist/console/marketplace/marketplaceApi.js +254 -1
- package/dist/console/organizations/CreateWorkspaceDialog.d.ts +1 -1
- package/dist/console/organizations/OrganizationsLayout.d.ts +1 -1
- package/dist/console/organizations/OrganizationsPage.d.ts +1 -1
- package/dist/console/organizations/manage/AcceptInvitationPage.d.ts +1 -1
- package/dist/console/organizations/manage/InvitationsPage.d.ts +1 -1
- package/dist/console/organizations/manage/InviteMemberDialog.d.ts +1 -1
- package/dist/console/organizations/manage/MembersPage.d.ts +1 -1
- package/dist/console/organizations/manage/OrganizationLayout.d.ts +1 -1
- package/dist/console/organizations/manage/SettingsPage.d.ts +1 -1
- package/dist/context/CommandPaletteProvider.d.ts +44 -0
- package/dist/context/CommandPaletteProvider.js +71 -0
- package/dist/context/FavoritesProvider.d.ts +1 -1
- package/dist/context/NavigationContext.d.ts +1 -1
- package/dist/context/RecentItemsProvider.d.ts +2 -2
- package/dist/context/UserStateAdapters.d.ts +1 -1
- package/dist/context/index.d.ts +2 -0
- package/dist/context/index.js +1 -0
- package/dist/hooks/index.d.ts +5 -2
- package/dist/hooks/index.js +4 -1
- package/dist/hooks/useActionModal.d.ts +53 -0
- package/dist/hooks/useActionModal.js +111 -0
- package/dist/hooks/useChatConversation.d.ts +107 -4
- package/dist/hooks/useChatConversation.js +253 -25
- package/dist/hooks/useConsoleActionRuntime.d.ts +70 -0
- package/dist/hooks/useConsoleActionRuntime.js +560 -0
- package/dist/hooks/useConversationList.js +61 -3
- package/dist/hooks/useHomeInbox.d.ts +13 -0
- package/dist/hooks/useHomeInbox.js +142 -0
- package/dist/hooks/useNavPins.js +17 -23
- package/dist/hooks/useNavigationSync.d.ts +33 -0
- package/dist/hooks/useNavigationSync.js +98 -12
- package/dist/hooks/useReconcileOnError.d.ts +40 -0
- package/dist/hooks/useReconcileOnError.js +37 -0
- package/dist/hooks/useRecordApprovals.d.ts +18 -19
- package/dist/hooks/useRecordApprovals.js +24 -40
- package/dist/hooks/useResponsiveSidebar.js +14 -5
- package/dist/hooks/useSettleSignal.d.ts +19 -0
- package/dist/hooks/useSettleSignal.js +20 -0
- package/dist/hooks/useTrackRouteAsRecent.js +35 -0
- package/dist/hooks/useUrlOverlay.d.ts +62 -0
- package/dist/hooks/useUrlOverlay.js +88 -0
- package/dist/index.d.ts +16 -7
- package/dist/index.js +12 -4
- package/dist/layout/ActivityFeed.d.ts +1 -1
- package/dist/layout/AppHeader.d.ts +3 -2
- package/dist/layout/AppHeader.js +237 -72
- package/dist/layout/AppSidebar.d.ts +2 -1
- package/dist/layout/AppSidebar.js +26 -46
- package/dist/layout/AppSwitcher.d.ts +2 -1
- package/dist/layout/AppSwitcher.js +9 -5
- package/dist/layout/AuthPageLayout.d.ts +1 -1
- package/dist/layout/ConnectionStatus.d.ts +1 -1
- package/dist/layout/ConnectionStatus.js +9 -6
- package/dist/layout/ConsoleChatbotFab.d.ts +19 -1
- package/dist/layout/ConsoleChatbotFab.js +16 -2
- package/dist/layout/ConsoleFloatingChatbot.d.ts +32 -2
- package/dist/layout/ConsoleFloatingChatbot.js +374 -41
- package/dist/layout/ConsoleLayout.d.ts +1 -1
- package/dist/layout/ConsoleLayout.js +27 -11
- package/dist/layout/ContextSelectors.d.ts +44 -0
- package/dist/layout/ContextSelectors.js +218 -0
- package/dist/layout/InboxPopover.d.ts +6 -1
- package/dist/layout/InboxPopover.js +25 -6
- package/dist/layout/LocaleSwitcher.d.ts +1 -1
- package/dist/layout/LocalizedSidebarTrigger.d.ts +2 -0
- package/dist/layout/LocalizedSidebarTrigger.js +15 -0
- package/dist/layout/MobileViewSwitcherContext.d.ts +1 -1
- package/dist/layout/ModeToggle.d.ts +1 -1
- package/dist/layout/PageHeader.d.ts +1 -1
- package/dist/layout/UnifiedSidebar.d.ts +2 -1
- package/dist/layout/UnifiedSidebar.js +116 -15
- package/dist/observability/index.d.ts +1 -0
- package/dist/observability/index.js +1 -0
- package/dist/observability/settleSignal.d.ts +64 -0
- package/dist/observability/settleSignal.js +131 -0
- package/dist/preview/DraftChangesPanel.d.ts +19 -0
- package/dist/preview/DraftChangesPanel.js +114 -0
- package/dist/preview/DraftPreviewBar.d.ts +8 -0
- package/dist/preview/DraftPreviewBar.js +86 -0
- package/dist/preview/PreviewDraftEmptyState.d.ts +16 -0
- package/dist/preview/PreviewDraftEmptyState.js +47 -0
- package/dist/preview/PreviewModeContext.d.ts +57 -0
- package/dist/preview/PreviewModeContext.js +99 -0
- package/dist/preview/UnpublishedAppBar.d.ts +8 -0
- package/dist/preview/UnpublishedAppBar.js +79 -0
- package/dist/preview/draftStatus.d.ts +20 -0
- package/dist/preview/draftStatus.js +27 -0
- package/dist/preview/usePublishAllDrafts.d.ts +18 -0
- package/dist/preview/usePublishAllDrafts.js +106 -0
- package/dist/providers/AdapterProvider.d.ts +1 -1
- package/dist/providers/AdapterProvider.js +6 -1
- package/dist/providers/ExpressionProvider.d.ts +1 -1
- package/dist/providers/MetadataProvider.d.ts +17 -2
- package/dist/providers/MetadataProvider.js +183 -12
- package/dist/runtime-config.d.ts +46 -2
- package/dist/runtime-config.js +39 -2
- package/dist/services/builtinComponents.js +68 -59
- package/dist/skeletons/SkeletonDashboard.d.ts +1 -1
- package/dist/skeletons/SkeletonDetail.d.ts +1 -1
- package/dist/skeletons/SkeletonGrid.d.ts +1 -1
- package/dist/utils/appRoute.d.ts +21 -0
- package/dist/utils/appRoute.js +25 -0
- package/dist/utils/deriveRelatedLists.d.ts +54 -0
- package/dist/utils/deriveRelatedLists.js +91 -0
- package/dist/utils/index.d.ts +4 -0
- package/dist/utils/index.js +3 -0
- package/dist/utils/managedByEmptyState.d.ts +8 -1
- package/dist/utils/managedByEmptyState.js +13 -7
- package/dist/utils/preferLocal.d.ts +18 -0
- package/dist/utils/preferLocal.js +24 -0
- package/dist/views/ActionConfirmDialog.d.ts +1 -1
- package/dist/views/ActionConfirmDialog.js +3 -1
- package/dist/views/ActionParamDialog.d.ts +6 -1
- package/dist/views/ActionParamDialog.js +9 -3
- package/dist/views/ActionResultDialog.d.ts +13 -0
- package/dist/views/ActionResultDialog.js +134 -0
- package/dist/views/ComponentNavView.d.ts +14 -1
- package/dist/views/CreateViewDialog.d.ts +1 -1
- package/dist/views/DashboardConfigPanel.d.ts +28 -0
- package/dist/views/DashboardConfigPanel.js +81 -0
- package/dist/views/DashboardView.d.ts +4 -3
- package/dist/views/DashboardView.js +38 -239
- package/dist/views/FlowRunner.d.ts +59 -0
- package/dist/views/FlowRunner.js +153 -0
- package/dist/views/InterfaceListPage.d.ts +49 -0
- package/dist/views/InterfaceListPage.js +347 -0
- package/dist/views/MetadataInspector.d.ts +2 -2
- package/dist/views/ObjectView.d.ts +1 -1
- package/dist/views/ObjectView.js +209 -532
- package/dist/views/PageView.d.ts +8 -3
- package/dist/views/PageView.js +45 -32
- package/dist/views/RecordDetailView.d.ts +1 -1
- package/dist/views/RecordDetailView.js +363 -148
- package/dist/views/RecordFormPage.d.ts +1 -1
- package/dist/views/RecordFormPage.js +26 -1
- package/dist/views/ReportConfigPanel.d.ts +37 -0
- package/dist/views/ReportConfigPanel.js +85 -0
- package/dist/views/ReportView.d.ts +1 -1
- package/dist/views/ReportView.js +116 -7
- package/dist/views/RuntimeDraftBar.d.ts +30 -0
- package/dist/views/RuntimeDraftBar.js +112 -0
- package/dist/views/SearchResultsPage.d.ts +1 -1
- package/dist/views/SearchResultsPage.js +8 -18
- package/dist/views/ViewConfigPanel.d.ts +24 -17
- package/dist/views/ViewConfigPanel.js +121 -77
- package/dist/views/index.d.ts +1 -1
- package/dist/views/index.js +1 -1
- package/dist/views/metadata-admin/AuditPanel.d.ts +28 -0
- package/dist/views/metadata-admin/AuditPanel.js +79 -0
- package/dist/views/metadata-admin/DiagnosticsPage.d.ts +20 -0
- package/dist/views/metadata-admin/DiagnosticsPage.js +69 -0
- package/dist/views/metadata-admin/DirectoryPage.d.ts +16 -1
- package/dist/views/metadata-admin/DirectoryPage.js +113 -24
- package/dist/views/metadata-admin/DraftReviewPanel.d.ts +33 -0
- package/dist/views/metadata-admin/DraftReviewPanel.js +77 -0
- package/dist/views/metadata-admin/EmbeddedItemEditor.d.ts +17 -1
- package/dist/views/metadata-admin/EmbeddedItemEditor.js +15 -8
- package/dist/views/metadata-admin/JsonSourceEditor.d.ts +37 -0
- package/dist/views/metadata-admin/JsonSourceEditor.js +178 -0
- package/dist/views/metadata-admin/LayeredDiff.d.ts +39 -1
- package/dist/views/metadata-admin/LayeredDiff.js +171 -5
- package/dist/views/metadata-admin/MetadataDetailDrawer.d.ts +15 -1
- package/dist/views/metadata-admin/MetadataTypeActions.d.ts +48 -0
- package/dist/views/metadata-admin/MetadataTypeActions.js +165 -0
- package/dist/views/metadata-admin/PackagesPage.d.ts +18 -0
- package/dist/views/metadata-admin/PackagesPage.js +395 -0
- package/dist/views/metadata-admin/PageShell.d.ts +1 -1
- package/dist/views/metadata-admin/PageShell.js +9 -4
- package/dist/views/metadata-admin/PermissionMatrixEditor.d.ts +35 -1
- package/dist/views/metadata-admin/QuickFind.d.ts +21 -1
- package/dist/views/metadata-admin/QuickFind.js +6 -3
- package/dist/views/metadata-admin/RelatedPanel.d.ts +24 -1
- package/dist/views/metadata-admin/RelatedPanel.js +20 -18
- package/dist/views/metadata-admin/ResourceEditPage.d.ts +40 -1
- package/dist/views/metadata-admin/ResourceEditPage.js +1223 -60
- package/dist/views/metadata-admin/ResourceHistoryPage.d.ts +39 -1
- package/dist/views/metadata-admin/ResourceHistoryPage.js +66 -16
- package/dist/views/metadata-admin/ResourceListPage.d.ts +13 -1
- package/dist/views/metadata-admin/ResourceListPage.js +266 -30
- package/dist/views/metadata-admin/ResourceRouter.d.ts +23 -1
- package/dist/views/metadata-admin/SchemaForm.d.ts +34 -1
- package/dist/views/metadata-admin/SchemaForm.js +559 -49
- package/dist/views/metadata-admin/StudioHomePage.d.ts +22 -0
- package/dist/views/metadata-admin/StudioHomePage.js +213 -0
- package/dist/views/metadata-admin/anchors.js +237 -24
- package/dist/views/metadata-admin/clientValidation.d.ts +50 -0
- package/dist/views/metadata-admin/clientValidation.js +169 -0
- package/dist/views/metadata-admin/color-variant-field.d.ts +30 -0
- package/dist/views/metadata-admin/color-variant-field.js +38 -0
- package/dist/views/metadata-admin/createDerive.d.ts +75 -0
- package/dist/views/metadata-admin/createDerive.js +179 -0
- package/dist/views/metadata-admin/dashboard-schema.d.ts +12 -0
- package/dist/views/metadata-admin/dashboard-schema.js +80 -0
- package/dist/views/metadata-admin/datasource/DatasourceResourcePage.d.ts +35 -0
- package/dist/views/metadata-admin/datasource/DatasourceResourcePage.js +327 -0
- package/dist/views/metadata-admin/datasource/register.d.ts +1 -0
- package/dist/views/metadata-admin/datasource/register.js +24 -0
- package/dist/views/metadata-admin/default-inspector-registry.d.ts +49 -0
- package/dist/views/metadata-admin/default-inspector-registry.js +8 -0
- package/dist/views/metadata-admin/default-schemas.js +115 -10
- package/dist/views/metadata-admin/external/ExternalDatasourcePanel.d.ts +27 -0
- package/dist/views/metadata-admin/external/ExternalDatasourcePanel.js +69 -0
- package/dist/views/metadata-admin/external/ImportObjectDialog.d.ts +27 -0
- package/dist/views/metadata-admin/external/ImportObjectDialog.js +77 -0
- package/dist/views/metadata-admin/external/SchemaBrowser.d.ts +16 -0
- package/dist/views/metadata-admin/external/SchemaBrowser.js +74 -0
- package/dist/views/metadata-admin/external/ValidationPanel.d.ts +16 -0
- package/dist/views/metadata-admin/external/ValidationPanel.js +68 -0
- package/dist/views/metadata-admin/external/api.d.ts +100 -0
- package/dist/views/metadata-admin/external/api.js +124 -0
- package/dist/views/metadata-admin/i18n.d.ts +1 -0
- package/dist/views/metadata-admin/i18n.js +1166 -2
- package/dist/views/metadata-admin/index.d.ts +8 -5
- package/dist/views/metadata-admin/index.js +12 -2
- package/dist/views/metadata-admin/inspector-registry.d.ts +51 -0
- package/dist/views/metadata-admin/inspector-registry.js +11 -0
- package/dist/views/metadata-admin/inspectors/ActionDefaultInspector.d.ts +30 -0
- package/dist/views/metadata-admin/inspectors/ActionDefaultInspector.js +180 -0
- package/dist/views/metadata-admin/inspectors/AppNavInspector.d.ts +16 -0
- package/dist/views/metadata-admin/inspectors/AppNavInspector.js +110 -0
- package/dist/views/metadata-admin/inspectors/ConditionBuilder.d.ts +29 -0
- package/dist/views/metadata-admin/inspectors/ConditionBuilder.js +154 -0
- package/dist/views/metadata-admin/inspectors/DashboardDefaultInspector.d.ts +28 -0
- package/dist/views/metadata-admin/inspectors/DashboardDefaultInspector.js +110 -0
- package/dist/views/metadata-admin/inspectors/DashboardWidgetInspector.d.ts +18 -0
- package/dist/views/metadata-admin/inspectors/DashboardWidgetInspector.js +139 -0
- package/dist/views/metadata-admin/inspectors/DatasetDefaultInspector.d.ts +21 -0
- package/dist/views/metadata-admin/inspectors/DatasetDefaultInspector.js +107 -0
- package/dist/views/metadata-admin/inspectors/FlowEdgeInspector.d.ts +16 -0
- package/dist/views/metadata-admin/inspectors/FlowEdgeInspector.js +45 -0
- package/dist/views/metadata-admin/inspectors/FlowInspector.d.ts +12 -0
- package/dist/views/metadata-admin/inspectors/FlowInspector.js +9 -0
- package/dist/views/metadata-admin/inspectors/FlowKeyValueField.d.ts +30 -0
- package/dist/views/metadata-admin/inspectors/FlowKeyValueField.js +125 -0
- package/dist/views/metadata-admin/inspectors/FlowNodeConfigField.d.ts +18 -0
- package/dist/views/metadata-admin/inspectors/FlowNodeConfigField.js +40 -0
- package/dist/views/metadata-admin/inspectors/FlowNodeInspector.d.ts +14 -0
- package/dist/views/metadata-admin/inspectors/FlowNodeInspector.js +140 -0
- package/dist/views/metadata-admin/inspectors/FlowObjectListField.d.ts +26 -0
- package/dist/views/metadata-admin/inspectors/FlowObjectListField.js +105 -0
- package/dist/views/metadata-admin/inspectors/FlowReferenceField.d.ts +83 -0
- package/dist/views/metadata-admin/inspectors/FlowReferenceField.js +181 -0
- package/dist/views/metadata-admin/inspectors/FlowStringListField.d.ts +21 -0
- package/dist/views/metadata-admin/inspectors/FlowStringListField.js +60 -0
- package/dist/views/metadata-admin/inspectors/InspectorComboField.d.ts +40 -0
- package/dist/views/metadata-admin/inspectors/InspectorComboField.js +61 -0
- package/dist/views/metadata-admin/inspectors/ObjectDefaultInspector.d.ts +21 -0
- package/dist/views/metadata-admin/inspectors/ObjectDefaultInspector.js +54 -0
- package/dist/views/metadata-admin/inspectors/ObjectFieldInspector.d.ts +23 -0
- package/dist/views/metadata-admin/inspectors/ObjectFieldInspector.js +330 -0
- package/dist/views/metadata-admin/inspectors/PageBlockInspector.d.ts +48 -0
- package/dist/views/metadata-admin/inspectors/PageBlockInspector.js +332 -0
- package/dist/views/metadata-admin/inspectors/ReportDefaultInspector.d.ts +58 -0
- package/dist/views/metadata-admin/inspectors/ReportDefaultInspector.js +160 -0
- package/dist/views/metadata-admin/inspectors/ViewColumnInspector.d.ts +19 -0
- package/dist/views/metadata-admin/inspectors/ViewColumnInspector.js +144 -0
- package/dist/views/metadata-admin/inspectors/ViewInspector.d.ts +19 -0
- package/dist/views/metadata-admin/inspectors/ViewInspector.js +21 -0
- package/dist/views/metadata-admin/inspectors/ViewVariantInspector.d.ts +54 -0
- package/dist/views/metadata-admin/inspectors/ViewVariantInspector.js +191 -0
- package/dist/views/metadata-admin/inspectors/_shared.d.ts +124 -0
- package/dist/views/metadata-admin/inspectors/_shared.js +113 -0
- package/dist/views/metadata-admin/inspectors/expression-validate.d.ts +26 -0
- package/dist/views/metadata-admin/inspectors/expression-validate.js +66 -0
- package/dist/views/metadata-admin/inspectors/flow-node-config.d.ts +143 -0
- package/dist/views/metadata-admin/inspectors/flow-node-config.js +461 -0
- package/dist/views/metadata-admin/inspectors/index.d.ts +1 -0
- package/dist/views/metadata-admin/inspectors/index.js +45 -0
- package/dist/views/metadata-admin/inspectors/json-schema-to-fields.d.ts +40 -0
- package/dist/views/metadata-admin/inspectors/json-schema-to-fields.js +227 -0
- package/dist/views/metadata-admin/inspectors/useDatasetFields.d.ts +72 -0
- package/dist/views/metadata-admin/inspectors/useDatasetFields.js +0 -0
- package/dist/views/metadata-admin/mergeServerFields.d.ts +65 -0
- package/dist/views/metadata-admin/mergeServerFields.js +56 -0
- package/dist/views/metadata-admin/preview-registry.d.ts +55 -0
- package/dist/views/metadata-admin/previews/ActionPreview.d.ts +25 -0
- package/dist/views/metadata-admin/previews/ActionPreview.js +238 -0
- package/dist/views/metadata-admin/previews/AddWidgetPicker.d.ts +12 -0
- package/dist/views/metadata-admin/previews/AddWidgetPicker.js +56 -0
- package/dist/views/metadata-admin/previews/AgentPreview.d.ts +24 -0
- package/dist/views/metadata-admin/previews/AgentPreview.js +100 -0
- package/dist/views/metadata-admin/previews/AppNavCanvas.d.ts +31 -0
- package/dist/views/metadata-admin/previews/AppNavCanvas.js +260 -0
- package/dist/views/metadata-admin/previews/AppPreview.d.ts +16 -1
- package/dist/views/metadata-admin/previews/AppPreview.js +23 -14
- package/dist/views/metadata-admin/previews/BookPreview.d.ts +20 -0
- package/dist/views/metadata-admin/previews/BookPreview.js +132 -0
- package/dist/views/metadata-admin/previews/DashboardPreview.d.ts +16 -1
- package/dist/views/metadata-admin/previews/DashboardPreview.js +110 -8
- package/dist/views/metadata-admin/previews/DatasetPreview.d.ts +18 -0
- package/dist/views/metadata-admin/previews/DatasetPreview.js +89 -0
- package/dist/views/metadata-admin/previews/DatasourcePreview.d.ts +23 -0
- package/dist/views/metadata-admin/previews/DatasourcePreview.js +68 -0
- package/dist/views/metadata-admin/previews/EmailTemplatePreview.d.ts +14 -1
- package/dist/views/metadata-admin/previews/FieldStub.d.ts +30 -0
- package/dist/views/metadata-admin/previews/FieldStub.js +104 -0
- package/dist/views/metadata-admin/previews/FieldsListEditor.d.ts +50 -0
- package/dist/views/metadata-admin/previews/FieldsListEditor.js +97 -0
- package/dist/views/metadata-admin/previews/FlowCanvas.d.ts +43 -0
- package/dist/views/metadata-admin/previews/FlowCanvas.js +328 -0
- package/dist/views/metadata-admin/previews/FlowPreview.d.ts +20 -0
- package/dist/views/metadata-admin/previews/FlowPreview.js +92 -0
- package/dist/views/metadata-admin/previews/FlowRunsPanel.d.ts +46 -0
- package/dist/views/metadata-admin/previews/FlowRunsPanel.js +97 -0
- package/dist/views/metadata-admin/previews/FlowSimulatorPanel.d.ts +25 -0
- package/dist/views/metadata-admin/previews/FlowSimulatorPanel.js +170 -0
- package/dist/views/metadata-admin/previews/JobPreview.d.ts +28 -0
- package/dist/views/metadata-admin/previews/JobPreview.js +290 -0
- package/dist/views/metadata-admin/previews/ObjectFormCanvas.d.ts +30 -0
- package/dist/views/metadata-admin/previews/ObjectFormCanvas.js +547 -0
- package/dist/views/metadata-admin/previews/ObjectPreview.d.ts +14 -1
- package/dist/views/metadata-admin/previews/ObjectPreview.js +5 -30
- package/dist/views/metadata-admin/previews/OutlineStrip.d.ts +32 -0
- package/dist/views/metadata-admin/previews/OutlineStrip.js +8 -0
- package/dist/views/metadata-admin/previews/PageBlockCanvas.d.ts +49 -0
- package/dist/views/metadata-admin/previews/PageBlockCanvas.js +510 -0
- package/dist/views/metadata-admin/previews/PagePreview.d.ts +10 -1
- package/dist/views/metadata-admin/previews/PagePreview.js +90 -4
- package/dist/views/metadata-admin/previews/PermissionPreview.d.ts +27 -0
- package/dist/views/metadata-admin/previews/PermissionPreview.js +115 -0
- package/dist/views/metadata-admin/previews/PreviewShell.d.ts +29 -6
- package/dist/views/metadata-admin/previews/PreviewShell.js +16 -3
- package/dist/views/metadata-admin/previews/ReportPreview.d.ts +18 -1
- package/dist/views/metadata-admin/previews/ReportPreview.js +23 -15
- package/dist/views/metadata-admin/previews/RolePreview.d.ts +19 -0
- package/dist/views/metadata-admin/previews/RolePreview.js +14 -0
- package/dist/views/metadata-admin/previews/SkillPreview.d.ts +22 -0
- package/dist/views/metadata-admin/previews/SkillPreview.js +34 -0
- package/dist/views/metadata-admin/previews/ToolPreview.d.ts +25 -0
- package/dist/views/metadata-admin/previews/ToolPreview.js +122 -0
- package/dist/views/metadata-admin/previews/TranslationPreview.d.ts +25 -0
- package/dist/views/metadata-admin/previews/TranslationPreview.js +52 -0
- package/dist/views/metadata-admin/previews/ValidationPreview.d.ts +27 -0
- package/dist/views/metadata-admin/previews/ValidationPreview.js +110 -0
- package/dist/views/metadata-admin/previews/ViewColumnPanes.d.ts +62 -0
- package/dist/views/metadata-admin/previews/ViewColumnPanes.js +140 -0
- package/dist/views/metadata-admin/previews/ViewPreview.d.ts +23 -1
- package/dist/views/metadata-admin/previews/ViewPreview.js +101 -73
- package/dist/views/metadata-admin/previews/block-config.d.ts +82 -0
- package/dist/views/metadata-admin/previews/block-config.js +324 -0
- package/dist/views/metadata-admin/previews/block-types.d.ts +40 -0
- package/dist/views/metadata-admin/previews/block-types.js +110 -0
- package/dist/views/metadata-admin/previews/field-types.d.ts +53 -0
- package/dist/views/metadata-admin/previews/field-types.js +97 -0
- package/dist/views/metadata-admin/previews/flow-canvas-layout.d.ts +88 -0
- package/dist/views/metadata-admin/previews/flow-canvas-layout.js +190 -0
- package/dist/views/metadata-admin/previews/flow-canvas-parts.d.ts +88 -0
- package/dist/views/metadata-admin/previews/flow-canvas-parts.js +358 -0
- package/dist/views/metadata-admin/previews/form-preview.d.ts +24 -0
- package/dist/views/metadata-admin/previews/form-preview.js +29 -0
- package/dist/views/metadata-admin/previews/index.js +43 -0
- package/dist/views/metadata-admin/previews/object-fields-bridge.d.ts +66 -0
- package/dist/views/metadata-admin/previews/object-fields-bridge.js +171 -0
- package/dist/views/metadata-admin/previews/object-fields-io.d.ts +109 -0
- package/dist/views/metadata-admin/previews/object-fields-io.js +208 -0
- package/dist/views/metadata-admin/previews/simulator/flow-sim-types.d.ts +91 -0
- package/dist/views/metadata-admin/previews/simulator/flow-sim-types.js +2 -0
- package/dist/views/metadata-admin/previews/simulator/flow-sim-validate.d.ts +8 -0
- package/dist/views/metadata-admin/previews/simulator/flow-sim-validate.js +113 -0
- package/dist/views/metadata-admin/previews/simulator/flow-simulator.d.ts +44 -0
- package/dist/views/metadata-admin/previews/simulator/flow-simulator.js +316 -0
- package/dist/views/metadata-admin/previews/useDatasetCatalog.d.ts +47 -0
- package/dist/views/metadata-admin/previews/useDatasetCatalog.js +133 -0
- package/dist/views/metadata-admin/previews/useFlowNodePalette.d.ts +44 -0
- package/dist/views/metadata-admin/previews/useFlowNodePalette.js +124 -0
- package/dist/views/metadata-admin/previews/useMetaOptions.d.ts +8 -0
- package/dist/views/metadata-admin/previews/useMetaOptions.js +50 -0
- package/dist/views/metadata-admin/previews/useObjectFields.d.ts +23 -0
- package/dist/views/metadata-admin/previews/useObjectFields.js +79 -0
- package/dist/views/metadata-admin/previews/useObjectOptions.d.ts +8 -0
- package/dist/views/metadata-admin/previews/useObjectOptions.js +43 -0
- package/dist/views/metadata-admin/previews/view-column-io.d.ts +42 -0
- package/dist/views/metadata-admin/previews/view-column-io.js +73 -0
- package/dist/views/metadata-admin/previews/widget-types.d.ts +24 -0
- package/dist/views/metadata-admin/previews/widget-types.js +40 -0
- package/dist/views/metadata-admin/registry.d.ts +140 -19
- package/dist/views/metadata-admin/report-schema.d.ts +26 -0
- package/dist/views/metadata-admin/report-schema.js +121 -0
- package/dist/views/metadata-admin/useMetadata.d.ts +100 -2
- package/dist/views/metadata-admin/useMetadata.js +155 -4
- package/dist/views/metadata-admin/view-item-normalize.d.ts +20 -0
- package/dist/views/metadata-admin/view-item-normalize.js +68 -0
- package/dist/views/metadata-admin/view-schema.d.ts +16 -0
- package/dist/views/metadata-admin/view-schema.js +107 -0
- package/dist/views/metadata-admin/view-variant-model.d.ts +23 -0
- package/dist/views/metadata-admin/view-variant-model.js +64 -0
- package/dist/views/metadata-admin/widgets.d.ts +89 -1
- package/dist/views/metadata-admin/widgets.js +491 -17
- package/dist/views/runtime-metadata-persistence.d.ts +78 -0
- package/dist/views/runtime-metadata-persistence.js +89 -0
- package/dist/views/useOpenRecordList.d.ts +18 -0
- package/dist/views/useOpenRecordList.js +36 -0
- package/dist/views/userFilterUrlState.d.ts +15 -0
- package/dist/views/userFilterUrlState.js +53 -0
- package/dist/views/view-config-adapter.d.ts +38 -0
- package/dist/views/view-config-adapter.js +80 -0
- package/package.json +52 -34
- package/dist/views/DesignDrawer.d.ts +0 -28
- package/dist/views/DesignDrawer.js +0 -51
- package/dist/views/metadata-admin/DesignerEditorWrapper.d.ts +0 -68
- package/dist/views/metadata-admin/DesignerEditorWrapper.js +0 -158
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* StudioHomePage — the landing page for the metadata-admin ("Studio")
|
|
3
|
+
* app root (`/apps/:appName/`).
|
|
4
|
+
*
|
|
5
|
+
* Previously the app root resolved to an empty `<Navigate>` target and
|
|
6
|
+
* rendered a blank content area. This page replaces that blank space
|
|
7
|
+
* with a real, data-driven overview built on the same hooks the
|
|
8
|
+
* directory uses:
|
|
9
|
+
*
|
|
10
|
+
* • Hero band with a time-of-day greeting + headline KPIs.
|
|
11
|
+
* • KPI cards (types / writable / packages / health) — health card
|
|
12
|
+
* deep-links to diagnostics when issues exist.
|
|
13
|
+
* • "Explore" grid — one card per metadata domain, each listing its
|
|
14
|
+
* top types as count-badged chips that link straight into the list.
|
|
15
|
+
* • Quick actions — one-click "New …" buttons for writable types.
|
|
16
|
+
* • Recently viewed — pulls from the shared RecentItemsProvider.
|
|
17
|
+
*
|
|
18
|
+
* All data comes from `/meta/types` + the diagnostics sweep, so the page
|
|
19
|
+
* stays correct regardless of which packages are installed.
|
|
20
|
+
*/
|
|
21
|
+
import * as React from 'react';
|
|
22
|
+
export declare function StudioHomePage(): React.JSX.Element;
|
|
@@ -0,0 +1,213 @@
|
|
|
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
|
+
* StudioHomePage — the landing page for the metadata-admin ("Studio")
|
|
5
|
+
* app root (`/apps/:appName/`).
|
|
6
|
+
*
|
|
7
|
+
* Previously the app root resolved to an empty `<Navigate>` target and
|
|
8
|
+
* rendered a blank content area. This page replaces that blank space
|
|
9
|
+
* with a real, data-driven overview built on the same hooks the
|
|
10
|
+
* directory uses:
|
|
11
|
+
*
|
|
12
|
+
* • Hero band with a time-of-day greeting + headline KPIs.
|
|
13
|
+
* • KPI cards (types / writable / packages / health) — health card
|
|
14
|
+
* deep-links to diagnostics when issues exist.
|
|
15
|
+
* • "Explore" grid — one card per metadata domain, each listing its
|
|
16
|
+
* top types as count-badged chips that link straight into the list.
|
|
17
|
+
* • Quick actions — one-click "New …" buttons for writable types.
|
|
18
|
+
* • Recently viewed — pulls from the shared RecentItemsProvider.
|
|
19
|
+
*
|
|
20
|
+
* All data comes from `/meta/types` + the diagnostics sweep, so the page
|
|
21
|
+
* stays correct regardless of which packages are installed.
|
|
22
|
+
*/
|
|
23
|
+
import * as React from 'react';
|
|
24
|
+
import { Link, useSearchParams } from 'react-router-dom';
|
|
25
|
+
import { Search, Database, Layers, Workflow, Sparkles, Settings, ShieldCheck, Box, Package as PackageIcon, AlertTriangle, CheckCircle2, ArrowRight, Plus, Clock, LayoutDashboard, FileText, BarChart3, Table2, } from 'lucide-react';
|
|
26
|
+
import { Button } from '@object-ui/components';
|
|
27
|
+
import { useRecentItems } from '../../context/RecentItemsProvider';
|
|
28
|
+
import { useMetadataClient, useMetadataTypes, useGlobalDiagnostics, } from './useMetadata';
|
|
29
|
+
import { MetadataQuickFind } from './QuickFind';
|
|
30
|
+
import { translateMetadataType, translateMetadataDomain, t, tFormat, detectLocale, } from './i18n';
|
|
31
|
+
const HIDDEN_TYPES = new Set(['field', 'package']);
|
|
32
|
+
const DOMAIN_ICONS = {
|
|
33
|
+
data: Database,
|
|
34
|
+
ui: Layers,
|
|
35
|
+
automation: Workflow,
|
|
36
|
+
ai: Sparkles,
|
|
37
|
+
system: Settings,
|
|
38
|
+
platform: Settings,
|
|
39
|
+
identity: ShieldCheck,
|
|
40
|
+
security: ShieldCheck,
|
|
41
|
+
};
|
|
42
|
+
/** Per-domain accent gradients — used for icon chips + chip hover rings. */
|
|
43
|
+
const DOMAIN_ACCENT = {
|
|
44
|
+
data: { from: 'from-sky-500', to: 'to-blue-600', ring: 'hover:ring-sky-400/40', text: 'text-sky-600 dark:text-sky-400' },
|
|
45
|
+
ui: { from: 'from-violet-500', to: 'to-fuchsia-600', ring: 'hover:ring-violet-400/40', text: 'text-violet-600 dark:text-violet-400' },
|
|
46
|
+
automation: { from: 'from-amber-500', to: 'to-orange-600', ring: 'hover:ring-amber-400/40', text: 'text-amber-600 dark:text-amber-400' },
|
|
47
|
+
ai: { from: 'from-pink-500', to: 'to-rose-600', ring: 'hover:ring-pink-400/40', text: 'text-pink-600 dark:text-pink-400' },
|
|
48
|
+
identity: { from: 'from-emerald-500', to: 'to-teal-600', ring: 'hover:ring-emerald-400/40', text: 'text-emerald-600 dark:text-emerald-400' },
|
|
49
|
+
security: { from: 'from-emerald-500', to: 'to-teal-600', ring: 'hover:ring-emerald-400/40', text: 'text-emerald-600 dark:text-emerald-400' },
|
|
50
|
+
system: { from: 'from-slate-500', to: 'to-slate-700', ring: 'hover:ring-slate-400/40', text: 'text-slate-600 dark:text-slate-300' },
|
|
51
|
+
platform: { from: 'from-slate-500', to: 'to-slate-700', ring: 'hover:ring-slate-400/40', text: 'text-slate-600 dark:text-slate-300' },
|
|
52
|
+
other: { from: 'from-slate-400', to: 'to-slate-600', ring: 'hover:ring-slate-400/40', text: 'text-slate-600 dark:text-slate-300' },
|
|
53
|
+
};
|
|
54
|
+
const DOMAIN_ORDER = ['data', 'ui', 'automation', 'ai', 'identity', 'security', 'system', 'platform', 'other'];
|
|
55
|
+
/** Types that are most useful to surface as one-click "New …" actions. */
|
|
56
|
+
const QUICK_CREATE_ORDER = ['object', 'view', 'page', 'dashboard', 'report', 'flow', 'action', 'agent'];
|
|
57
|
+
const RECENT_ICONS = {
|
|
58
|
+
object: Table2,
|
|
59
|
+
dashboard: LayoutDashboard,
|
|
60
|
+
page: FileText,
|
|
61
|
+
report: BarChart3,
|
|
62
|
+
record: Box,
|
|
63
|
+
metadata: Layers,
|
|
64
|
+
};
|
|
65
|
+
function greetingKey() {
|
|
66
|
+
const h = new Date().getHours();
|
|
67
|
+
if (h < 12)
|
|
68
|
+
return 'engine.home.greetingMorning';
|
|
69
|
+
if (h < 18)
|
|
70
|
+
return 'engine.home.greetingAfternoon';
|
|
71
|
+
return 'engine.home.greetingEvening';
|
|
72
|
+
}
|
|
73
|
+
function relativeTime(iso, locale) {
|
|
74
|
+
const then = new Date(iso).getTime();
|
|
75
|
+
if (Number.isNaN(then))
|
|
76
|
+
return '';
|
|
77
|
+
const diff = Date.now() - then;
|
|
78
|
+
const zh = locale.startsWith('zh');
|
|
79
|
+
const mins = Math.floor(diff / 60000);
|
|
80
|
+
if (mins < 1)
|
|
81
|
+
return zh ? '刚刚' : 'just now';
|
|
82
|
+
if (mins < 60)
|
|
83
|
+
return zh ? `${mins} 分钟前` : `${mins}m ago`;
|
|
84
|
+
const hrs = Math.floor(mins / 60);
|
|
85
|
+
if (hrs < 24)
|
|
86
|
+
return zh ? `${hrs} 小时前` : `${hrs}h ago`;
|
|
87
|
+
const days = Math.floor(hrs / 24);
|
|
88
|
+
if (days < 7)
|
|
89
|
+
return zh ? `${days} 天前` : `${days}d ago`;
|
|
90
|
+
const weeks = Math.floor(days / 7);
|
|
91
|
+
return zh ? `${weeks} 周前` : `${weeks}w ago`;
|
|
92
|
+
}
|
|
93
|
+
export function StudioHomePage() {
|
|
94
|
+
const client = useMetadataClient();
|
|
95
|
+
const { loading, entries } = useMetadataTypes(client);
|
|
96
|
+
const { recentItems } = useRecentItems();
|
|
97
|
+
const locale = React.useMemo(() => detectLocale(), []);
|
|
98
|
+
const [searchParams, setSearchParams] = useSearchParams();
|
|
99
|
+
const [projectPackages, setProjectPackages] = React.useState(null);
|
|
100
|
+
React.useEffect(() => {
|
|
101
|
+
let cancelled = false;
|
|
102
|
+
(async () => {
|
|
103
|
+
try {
|
|
104
|
+
const list = await client.list('package');
|
|
105
|
+
if (cancelled)
|
|
106
|
+
return;
|
|
107
|
+
const SYSTEM_SCOPES = new Set(['system', 'cloud']);
|
|
108
|
+
const rows = (list ?? [])
|
|
109
|
+
.map((raw) => {
|
|
110
|
+
const item = raw && typeof raw === 'object' && 'item' in raw ? raw.item : raw;
|
|
111
|
+
const m = (item?.manifest ?? item ?? {});
|
|
112
|
+
return {
|
|
113
|
+
id: m.id,
|
|
114
|
+
scope: m.scope,
|
|
115
|
+
name: m.name || m.id,
|
|
116
|
+
};
|
|
117
|
+
})
|
|
118
|
+
.filter((p) => p.id && !SYSTEM_SCOPES.has(p.scope));
|
|
119
|
+
rows.sort((a, b) => a.name.localeCompare(b.name));
|
|
120
|
+
setProjectPackages(rows.map((p) => ({ id: p.id, name: p.name })));
|
|
121
|
+
}
|
|
122
|
+
catch {
|
|
123
|
+
if (!cancelled)
|
|
124
|
+
setProjectPackages([]);
|
|
125
|
+
}
|
|
126
|
+
})();
|
|
127
|
+
return () => {
|
|
128
|
+
cancelled = true;
|
|
129
|
+
};
|
|
130
|
+
}, [client]);
|
|
131
|
+
const urlPackage = searchParams.get('package');
|
|
132
|
+
const activePackage = React.useMemo(() => {
|
|
133
|
+
if (!projectPackages)
|
|
134
|
+
return null;
|
|
135
|
+
if (urlPackage && projectPackages.some((p) => p.id === urlPackage))
|
|
136
|
+
return urlPackage;
|
|
137
|
+
return projectPackages[0]?.id ?? null;
|
|
138
|
+
}, [projectPackages, urlPackage]);
|
|
139
|
+
React.useEffect(() => {
|
|
140
|
+
if (!projectPackages || projectPackages.length === 0)
|
|
141
|
+
return;
|
|
142
|
+
if (urlPackage && projectPackages.some((p) => p.id === urlPackage))
|
|
143
|
+
return;
|
|
144
|
+
const next = new URLSearchParams(searchParams);
|
|
145
|
+
next.set('package', projectPackages[0].id);
|
|
146
|
+
setSearchParams(next, { replace: true });
|
|
147
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
148
|
+
}, [projectPackages, urlPackage]);
|
|
149
|
+
const packageSuffix = activePackage ? `?package=${encodeURIComponent(activePackage)}` : '';
|
|
150
|
+
const metadataHref = `metadata${packageSuffix}`;
|
|
151
|
+
const packagesHref = `component/developer/packages${packageSuffix}`;
|
|
152
|
+
const { summary: diagSummary, countsByType, packagesByType, loading: diagLoading, } = useGlobalDiagnostics(client, 'warning', activePackage ?? undefined);
|
|
153
|
+
const visible = React.useMemo(() => entries.filter((e) => {
|
|
154
|
+
if (HIDDEN_TYPES.has(e.type))
|
|
155
|
+
return false;
|
|
156
|
+
if (!activePackage)
|
|
157
|
+
return false;
|
|
158
|
+
return (packagesByType[e.type] ?? []).includes(activePackage);
|
|
159
|
+
}), [activePackage, entries, packagesByType]);
|
|
160
|
+
const writable = React.useMemo(() => visible.filter((e) => e.allowOrgOverride || e.allowRuntimeCreate), [visible]);
|
|
161
|
+
// Group visible types by domain, sorted by count desc within each group.
|
|
162
|
+
const grouped = React.useMemo(() => {
|
|
163
|
+
var _a;
|
|
164
|
+
const map = {};
|
|
165
|
+
for (const e of visible)
|
|
166
|
+
(map[_a = e.domain ?? 'other'] ?? (map[_a] = [])).push(e);
|
|
167
|
+
for (const list of Object.values(map)) {
|
|
168
|
+
list.sort((a, b) => (countsByType[b.type] ?? 0) - (countsByType[a.type] ?? 0));
|
|
169
|
+
}
|
|
170
|
+
return Object.entries(map).sort(([a], [b]) => (DOMAIN_ORDER.indexOf(a) === -1 ? 99 : DOMAIN_ORDER.indexOf(a)) -
|
|
171
|
+
(DOMAIN_ORDER.indexOf(b) === -1 ? 99 : DOMAIN_ORDER.indexOf(b)));
|
|
172
|
+
}, [visible, countsByType]);
|
|
173
|
+
const quickCreate = React.useMemo(() => {
|
|
174
|
+
const byType = new Map(writable.map((e) => [e.type, e]));
|
|
175
|
+
return QUICK_CREATE_ORDER.map((ty) => byType.get(ty)).filter(Boolean);
|
|
176
|
+
}, [writable]);
|
|
177
|
+
const issues = diagSummary.total;
|
|
178
|
+
const healthy = !loading && !diagLoading && issues === 0;
|
|
179
|
+
if (loading || projectPackages === null || (activePackage && diagLoading)) {
|
|
180
|
+
return (_jsx("div", { className: "flex h-full items-center justify-center p-8 text-sm text-muted-foreground", children: t('engine.home.loading', locale) }));
|
|
181
|
+
}
|
|
182
|
+
return (_jsxs("div", { className: "h-full overflow-auto bg-gradient-to-b from-muted/40 to-background", children: [_jsxs("div", { className: "mx-auto w-full max-w-6xl px-6 py-6 space-y-6", children: [_jsxs("section", { className: "relative overflow-hidden rounded-3xl bg-gradient-to-br from-indigo-600 via-violet-600 to-fuchsia-600 px-7 py-8 text-white shadow-xl shadow-violet-500/20", children: [_jsx("div", { className: "pointer-events-none absolute -right-16 -top-20 h-64 w-64 rounded-full bg-white/15 blur-3xl" }), _jsx("div", { className: "pointer-events-none absolute -bottom-24 left-1/3 h-56 w-56 rounded-full bg-fuchsia-300/20 blur-3xl" }), _jsx("div", { className: "pointer-events-none absolute inset-0 opacity-[0.12]", style: {
|
|
183
|
+
backgroundImage: 'radial-gradient(currentColor 1px, transparent 1px)',
|
|
184
|
+
backgroundSize: '18px 18px',
|
|
185
|
+
} }), _jsxs("div", { className: "relative flex flex-col gap-6 lg:flex-row lg:items-end lg:justify-between", children: [_jsxs("div", { className: "max-w-xl", children: [_jsxs("div", { className: "flex items-center gap-2 text-sm font-medium text-white/80", children: [_jsx(Sparkles, { className: "h-4 w-4" }), t(greetingKey(), locale)] }), _jsx("h1", { className: "mt-2 text-3xl font-bold tracking-tight sm:text-4xl", children: "Studio" }), _jsx("p", { className: "mt-2 text-sm leading-relaxed text-white/85 sm:text-base", children: t('engine.home.subtitle', locale) }), _jsxs("div", { className: "mt-5 flex flex-wrap items-center gap-2.5", children: [_jsx(Button, { asChild: true, size: "sm", variant: "ghost", className: "bg-white/10 text-white shadow-sm ring-1 ring-white/25 hover:bg-white/20 hover:text-white", children: _jsxs(Link, { to: metadataHref, children: [_jsx(Layers, { className: "mr-1.5 h-4 w-4" }), t('engine.home.browseAll', locale)] }) }), _jsxs("span", { className: "inline-flex items-center gap-1.5 rounded-full bg-white/15 px-3 py-1.5 text-xs font-medium text-white/90 backdrop-blur-sm", children: [_jsx(Search, { className: "h-3.5 w-3.5" }), t('engine.directory.quickFind', locale), " \u2318\u21E7M"] })] })] }), _jsxs("div", { className: "grid grid-cols-3 gap-3", children: [_jsx(HeroPill, { value: visible.length, label: t('engine.home.statTypes', locale) }), _jsx(HeroPill, { value: writable.length, label: t('engine.home.statWritable', locale) }), _jsx(HeroPill, { value: projectPackages.length, label: t('engine.home.statPackages', locale) })] })] })] }), _jsxs("section", { className: "grid grid-cols-2 gap-4 lg:grid-cols-4", children: [_jsx(StatCard, { icon: Layers, from: "from-indigo-500", to: "to-violet-600", value: visible.length, label: t('engine.home.statTypes', locale), to_link: metadataHref }), _jsx(StatCard, { icon: CheckCircle2, from: "from-sky-500", to: "to-blue-600", value: writable.length, label: t('engine.home.statWritable', locale), to_link: metadataHref }), _jsx(StatCard, { icon: PackageIcon, from: "from-emerald-500", to: "to-teal-600", value: projectPackages.length, label: t('engine.home.statPackages', locale), to_link: packagesHref }), _jsxs(Link, { to: healthy ? metadataHref : `metadata/_diagnostics${packageSuffix}`, className: 'group relative flex flex-col justify-between overflow-hidden rounded-2xl border p-4 transition-all hover:-translate-y-0.5 hover:shadow-lg ' +
|
|
186
|
+
(healthy
|
|
187
|
+
? 'border-emerald-200 bg-emerald-50/60 dark:border-emerald-900/50 dark:bg-emerald-950/30'
|
|
188
|
+
: 'border-amber-300 bg-amber-50/70 dark:border-amber-900/50 dark:bg-amber-950/30'), children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsx("div", { className: 'flex h-10 w-10 items-center justify-center rounded-xl bg-gradient-to-br text-white shadow-sm ' +
|
|
189
|
+
(healthy ? 'from-emerald-500 to-teal-600' : 'from-amber-500 to-orange-600'), children: healthy ? _jsx(CheckCircle2, { className: "h-5 w-5" }) : _jsx(AlertTriangle, { className: "h-5 w-5" }) }), _jsx(ArrowRight, { className: "h-4 w-4 text-muted-foreground transition-transform group-hover:translate-x-0.5" })] }), _jsxs("div", { className: "mt-3", children: [_jsx("div", { className: "text-2xl font-bold tabular-nums", children: healthy ? t('engine.home.allHealthy', locale) : issues }), _jsx("div", { className: "text-xs text-muted-foreground", children: healthy
|
|
190
|
+
? t('engine.home.allHealthyHint', locale)
|
|
191
|
+
: t('engine.home.statIssues', locale) })] })] })] }), quickCreate.length > 0 && (_jsxs("section", { children: [_jsx(SectionHeader, { icon: Plus, title: t('engine.home.quickActions', locale), hint: t('engine.home.quickActionsHint', locale) }), _jsx("div", { className: "mt-3 flex flex-wrap gap-2.5", children: quickCreate.map((e) => (_jsx(Button, { asChild: true, variant: "outline", size: "sm", className: "group rounded-full border-transparent bg-muted hover:bg-primary/10 hover:text-primary", children: _jsxs(Link, { to: `metadata/${encodeURIComponent(e.type)}/new${packageSuffix}`, children: [_jsx(Plus, { className: "mr-1 h-3.5 w-3.5 text-primary transition-transform group-hover:rotate-90" }), tFormat('engine.home.newItem', locale, {
|
|
192
|
+
label: translateMetadataType(e.type, locale, e.label),
|
|
193
|
+
})] }) }, e.type))) })] })), _jsxs("div", { className: "grid gap-6 lg:grid-cols-3", children: [_jsxs("section", { className: "lg:col-span-2", children: [_jsx(SectionHeader, { icon: Layers, title: t('engine.home.explore', locale), hint: t('engine.home.exploreHint', locale) }), _jsx("div", { className: "mt-3 grid gap-4 sm:grid-cols-2", children: grouped.map(([domain, group]) => (_jsx(DomainCard, { domain: domain, group: group, countsByType: countsByType, locale: locale, packageSuffix: packageSuffix }, domain))) })] }), _jsxs("section", { children: [_jsx(SectionHeader, { icon: Clock, title: t('engine.home.recent', locale) }), _jsx("div", { className: "mt-3 rounded-2xl border bg-card p-2", children: recentItems.length === 0 ? (_jsx("div", { className: "px-3 py-8 text-center text-xs text-muted-foreground", children: t('engine.home.recentEmpty', locale) })) : (_jsx("ul", { className: "space-y-0.5", children: recentItems.slice(0, 8).map((item) => {
|
|
194
|
+
const Icon = RECENT_ICONS[item.type] ?? Box;
|
|
195
|
+
return (_jsx("li", { children: _jsxs(Link, { to: item.href, className: "group flex items-center gap-3 rounded-xl px-3 py-2 transition-colors hover:bg-accent", children: [_jsx("span", { className: "flex h-8 w-8 shrink-0 items-center justify-center rounded-lg bg-muted text-muted-foreground transition-colors group-hover:bg-primary/10 group-hover:text-primary", children: _jsx(Icon, { className: "h-4 w-4" }) }), _jsxs("span", { className: "min-w-0 flex-1", children: [_jsx("span", { className: "block truncate text-sm font-medium", children: item.label }), _jsx("span", { className: "block text-[11px] text-muted-foreground", children: relativeTime(item.visitedAt, locale) })] }), _jsx(ArrowRight, { className: "h-3.5 w-3.5 text-muted-foreground opacity-0 transition-opacity group-hover:opacity-100" })] }) }, item.id));
|
|
196
|
+
}) })) })] })] })] }), _jsx(MetadataQuickFind, {})] }));
|
|
197
|
+
}
|
|
198
|
+
function HeroPill({ value, label }) {
|
|
199
|
+
return (_jsxs("div", { className: "rounded-2xl bg-white/15 px-4 py-3 text-center backdrop-blur-sm ring-1 ring-white/20", children: [_jsx("div", { className: "text-2xl font-bold tabular-nums leading-none", children: value }), _jsx("div", { className: "mt-1 text-[11px] font-medium text-white/80", children: label })] }));
|
|
200
|
+
}
|
|
201
|
+
function StatCard({ icon: Icon, from, to, value, label, to_link, }) {
|
|
202
|
+
return (_jsxs(Link, { to: to_link, className: "group relative flex flex-col justify-between overflow-hidden rounded-2xl border bg-card p-4 transition-all hover:-translate-y-0.5 hover:border-primary/40 hover:shadow-lg", children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsx("div", { className: `flex h-10 w-10 items-center justify-center rounded-xl bg-gradient-to-br ${from} ${to} text-white shadow-sm`, children: _jsx(Icon, { className: "h-5 w-5" }) }), _jsx(ArrowRight, { className: "h-4 w-4 text-muted-foreground opacity-0 transition-all group-hover:translate-x-0.5 group-hover:opacity-100" })] }), _jsxs("div", { className: "mt-3", children: [_jsx("div", { className: "text-2xl font-bold tabular-nums", children: value }), _jsx("div", { className: "text-xs text-muted-foreground", children: label })] })] }));
|
|
203
|
+
}
|
|
204
|
+
function SectionHeader({ icon: Icon, title, hint, }) {
|
|
205
|
+
return (_jsxs("div", { className: "flex items-baseline gap-2.5", children: [_jsxs("h2", { className: "flex items-center gap-2 text-base font-semibold", children: [_jsx(Icon, { className: "h-4 w-4 text-muted-foreground" }), title] }), hint && _jsx("p", { className: "text-xs text-muted-foreground", children: hint })] }));
|
|
206
|
+
}
|
|
207
|
+
function DomainCard({ domain, group, countsByType, locale, packageSuffix, }) {
|
|
208
|
+
const Icon = DOMAIN_ICONS[domain] ?? Box;
|
|
209
|
+
const accent = DOMAIN_ACCENT[domain] ?? DOMAIN_ACCENT.other;
|
|
210
|
+
const top = group.slice(0, 6);
|
|
211
|
+
const more = group.length - top.length;
|
|
212
|
+
return (_jsxs("div", { className: `group rounded-2xl border bg-card p-4 ring-1 ring-transparent transition-all hover:-translate-y-0.5 hover:shadow-lg ${accent.ring}`, children: [_jsxs("div", { className: "flex items-center gap-3", children: [_jsx("div", { className: `flex h-9 w-9 items-center justify-center rounded-xl bg-gradient-to-br ${accent.from} ${accent.to} text-white shadow-sm`, children: _jsx(Icon, { className: "h-[18px] w-[18px]" }) }), _jsxs("div", { className: "min-w-0", children: [_jsx("div", { className: "truncate text-sm font-semibold", children: translateMetadataDomain(domain, locale) }), _jsxs("div", { className: "text-[11px] text-muted-foreground", children: [group.length, " ", t('engine.home.typesLower', locale)] })] })] }), _jsxs("div", { className: "mt-3 flex flex-wrap gap-1.5", children: [top.map((e) => (_jsxs(Link, { to: `metadata/${encodeURIComponent(e.type)}${packageSuffix}`, className: "inline-flex items-center gap-1.5 rounded-lg border bg-background px-2 py-1 text-xs transition-colors hover:border-primary/50 hover:bg-accent", children: [_jsx("span", { className: "truncate max-w-[10rem]", children: translateMetadataType(e.type, locale, e.label) }), _jsx("span", { className: "tabular-nums text-[10px] text-muted-foreground", children: countsByType[e.type] ?? 0 })] }, e.type))), more > 0 && (_jsxs(Link, { to: `metadata${packageSuffix}`, className: `inline-flex items-center gap-1 rounded-lg px-2 py-1 text-xs font-medium ${accent.text} hover:underline`, children: ["+", more] }))] })] }));
|
|
213
|
+
}
|
|
@@ -88,17 +88,15 @@ export function registerBuiltinAnchors() {
|
|
|
88
88
|
groupLabel: 'Hooks',
|
|
89
89
|
order: 20,
|
|
90
90
|
}],
|
|
91
|
+
createFields: ['label', 'name', 'object', 'description'],
|
|
92
|
+
createDerive: [
|
|
93
|
+
{ from: 'label', to: 'name', transform: 'slugify', untilUserEdits: true },
|
|
94
|
+
],
|
|
95
|
+
createDefaults: { events: [] },
|
|
91
96
|
});
|
|
92
|
-
//
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
anchors: [{
|
|
96
|
-
anchorType: 'object',
|
|
97
|
-
match: anchorByField('object'),
|
|
98
|
-
groupLabel: 'Approval Processes',
|
|
99
|
-
order: 70,
|
|
100
|
-
}],
|
|
101
|
-
});
|
|
97
|
+
// Approval is no longer a standalone metadata type (ADR-0019) — it is a flow
|
|
98
|
+
// node (`type: 'approval'`). Approvals therefore surface on an object through
|
|
99
|
+
// the Flows it belongs to, not a separate "Approval Processes" group.
|
|
102
100
|
// page.object → object (auto-generated record pages, etc.)
|
|
103
101
|
registerMetadataResource({
|
|
104
102
|
type: 'page',
|
|
@@ -108,23 +106,144 @@ export function registerBuiltinAnchors() {
|
|
|
108
106
|
groupLabel: 'Pages',
|
|
109
107
|
order: 40,
|
|
110
108
|
}],
|
|
109
|
+
// Mirror `view`'s create form: a page (esp. a *record* page) must be able to
|
|
110
|
+
// bind an `object` and pick its page `type` / `kind` at creation — the
|
|
111
|
+
// identity-only form (label/name/icon/description) couldn't make a record
|
|
112
|
+
// page. The block layout is then composed in the editor's PagePreview canvas.
|
|
113
|
+
createFields: ['label', 'name', 'object', 'type', 'kind'],
|
|
114
|
+
createDerive: [
|
|
115
|
+
{ from: 'label', to: 'name', transform: 'slugify', untilUserEdits: true },
|
|
116
|
+
],
|
|
117
|
+
createSchema: {
|
|
118
|
+
type: 'object',
|
|
119
|
+
required: ['label', 'name', 'type'],
|
|
120
|
+
properties: {
|
|
121
|
+
label: { type: 'string', title: 'Label', description: 'Human-readable page title.' },
|
|
122
|
+
name: {
|
|
123
|
+
type: 'string',
|
|
124
|
+
title: 'Name',
|
|
125
|
+
description: 'Page key (snake_case).',
|
|
126
|
+
pattern: '^[a-z_][a-z0-9_]*$',
|
|
127
|
+
},
|
|
128
|
+
type: {
|
|
129
|
+
type: 'string',
|
|
130
|
+
title: 'Page type',
|
|
131
|
+
// 'list' (interface page) is the primary, most-built page type — offer
|
|
132
|
+
// it first and as the default. 'dashboard' is roadmap (no distinct
|
|
133
|
+
// renderer yet), so it's omitted here, matching the edit form.
|
|
134
|
+
enum: ['list', 'record', 'home', 'app', 'utility'],
|
|
135
|
+
default: 'list',
|
|
136
|
+
description: 'List / Interface page = a data view (Airtable-style: columns, filters, visualizations). Record page renders one object record.',
|
|
137
|
+
},
|
|
138
|
+
object: {
|
|
139
|
+
type: 'string',
|
|
140
|
+
title: 'Object',
|
|
141
|
+
widget: 'ref:object',
|
|
142
|
+
description: 'The object this page reads from — the data source for a list page, or the record object for a record page.',
|
|
143
|
+
},
|
|
144
|
+
kind: {
|
|
145
|
+
type: 'string',
|
|
146
|
+
title: 'Kind',
|
|
147
|
+
enum: ['full', 'slotted'],
|
|
148
|
+
default: 'full',
|
|
149
|
+
description: 'full = the whole page; slotted = override only named slots of the default.',
|
|
150
|
+
},
|
|
151
|
+
},
|
|
152
|
+
},
|
|
153
|
+
createDefaults: { type: 'list', kind: 'full', regions: [] },
|
|
154
|
+
// Seed a record page's regions from the bound object's synthesized default
|
|
155
|
+
// detail page, so authoring starts from the auto-generated layout (the same
|
|
156
|
+
// one the runtime renders by default) instead of a blank canvas.
|
|
157
|
+
createSeed: async (draft, { client }) => {
|
|
158
|
+
// List/interface page: pre-bind the chosen object as the data source so
|
|
159
|
+
// the new page renders immediately (the author then curates columns,
|
|
160
|
+
// filters, visualizations in the editor).
|
|
161
|
+
if (draft?.type === 'list') {
|
|
162
|
+
return draft?.object ? { interfaceConfig: { source: String(draft.object) } } : {};
|
|
163
|
+
}
|
|
164
|
+
if (draft?.type !== 'record' || !draft?.object)
|
|
165
|
+
return {};
|
|
166
|
+
try {
|
|
167
|
+
const objectDef = await client.get('object', String(draft.object));
|
|
168
|
+
if (!objectDef || typeof objectDef !== 'object')
|
|
169
|
+
return {};
|
|
170
|
+
const { buildDefaultPageSchema } = await import('@object-ui/plugin-detail');
|
|
171
|
+
const synth = buildDefaultPageSchema(objectDef);
|
|
172
|
+
const seed = {};
|
|
173
|
+
if (Array.isArray(synth?.regions) && synth.regions.length)
|
|
174
|
+
seed.regions = synth.regions;
|
|
175
|
+
if (synth?.template)
|
|
176
|
+
seed.template = synth.template;
|
|
177
|
+
return seed;
|
|
178
|
+
}
|
|
179
|
+
catch {
|
|
180
|
+
return {};
|
|
181
|
+
}
|
|
182
|
+
},
|
|
111
183
|
});
|
|
112
|
-
// view
|
|
184
|
+
// A view is the canonical first-class ViewItem ({ viewKind, config }),
|
|
185
|
+
// bound to its object by the top-level `object` foreign key.
|
|
113
186
|
registerMetadataResource({
|
|
114
187
|
type: 'view',
|
|
115
188
|
anchors: [{
|
|
116
189
|
anchorType: 'object',
|
|
117
190
|
match: anchorByField([
|
|
118
|
-
'data.object',
|
|
119
|
-
'list.data.object',
|
|
120
|
-
'form.data.object',
|
|
121
191
|
'object',
|
|
192
|
+
'config.data.object',
|
|
122
193
|
]),
|
|
123
194
|
groupLabel: 'Views',
|
|
124
195
|
order: 30,
|
|
125
196
|
}],
|
|
197
|
+
createFields: ['label', 'name', 'object', 'kind'],
|
|
198
|
+
createDerive: [
|
|
199
|
+
{ from: 'label', to: 'name', transform: 'slugify', untilUserEdits: true },
|
|
200
|
+
],
|
|
201
|
+
createSchema: {
|
|
202
|
+
type: 'object',
|
|
203
|
+
required: ['label', 'name', 'object', 'kind'],
|
|
204
|
+
properties: {
|
|
205
|
+
label: { type: 'string', title: 'Label', description: 'Human-readable view name.' },
|
|
206
|
+
name: {
|
|
207
|
+
type: 'string',
|
|
208
|
+
title: 'Name',
|
|
209
|
+
description: 'View key (snake_case). Qualified to <object>.<key> on save.',
|
|
210
|
+
pattern: '^[a-z_][a-z0-9_]*$',
|
|
211
|
+
},
|
|
212
|
+
object: {
|
|
213
|
+
type: 'string',
|
|
214
|
+
title: 'Object',
|
|
215
|
+
description: 'The object this view displays.',
|
|
216
|
+
},
|
|
217
|
+
kind: {
|
|
218
|
+
type: 'string',
|
|
219
|
+
title: 'View kind',
|
|
220
|
+
enum: ['grid', 'kanban', 'gallery', 'calendar', 'timeline', 'gantt', 'chart'],
|
|
221
|
+
default: 'grid',
|
|
222
|
+
description: 'Pick a starter layout. Switch later in the designer.',
|
|
223
|
+
},
|
|
224
|
+
},
|
|
225
|
+
},
|
|
226
|
+
// Emit a canonical ViewItem. `name` is the globally-unique qualified id
|
|
227
|
+
// `<object>.<key>`; the layout `kind` (grid/kanban/…) is all list-family,
|
|
228
|
+
// so `viewKind` is 'list' and the chosen layout lives at `config.type`.
|
|
229
|
+
createBuildBody: (draft) => {
|
|
230
|
+
const object = String(draft.object ?? '');
|
|
231
|
+
const key = String(draft.name ?? '');
|
|
232
|
+
const qualifiedName = key.includes('.') || !object ? key : `${object}.${key}`;
|
|
233
|
+
return {
|
|
234
|
+
name: qualifiedName,
|
|
235
|
+
object,
|
|
236
|
+
viewKind: 'list',
|
|
237
|
+
label: draft.label,
|
|
238
|
+
config: {
|
|
239
|
+
type: draft.kind || 'grid',
|
|
240
|
+
columns: [],
|
|
241
|
+
data: { provider: 'object', object },
|
|
242
|
+
},
|
|
243
|
+
};
|
|
244
|
+
},
|
|
126
245
|
});
|
|
127
|
-
// flow
|
|
246
|
+
// flow may reference an object at the root or under `on`
|
|
128
247
|
registerMetadataResource({
|
|
129
248
|
type: 'flow',
|
|
130
249
|
anchors: [{
|
|
@@ -133,16 +252,14 @@ export function registerBuiltinAnchors() {
|
|
|
133
252
|
groupLabel: 'Flows',
|
|
134
253
|
order: 50,
|
|
135
254
|
}],
|
|
255
|
+
createFields: ['label', 'name', 'type', 'description'],
|
|
256
|
+
createDerive: [
|
|
257
|
+
{ from: 'label', to: 'name', transform: 'slugify', untilUserEdits: true },
|
|
258
|
+
],
|
|
259
|
+
createDefaults: { nodes: [], edges: [] },
|
|
136
260
|
});
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
anchors: [{
|
|
140
|
-
anchorType: 'object',
|
|
141
|
-
match: anchorByField(['object', 'on.object']),
|
|
142
|
-
groupLabel: 'Workflow Rules',
|
|
143
|
-
order: 51,
|
|
144
|
-
}],
|
|
145
|
-
});
|
|
261
|
+
// ADR-0020: `workflow` retired as a metadata type — record state machines
|
|
262
|
+
// are a `state_machine` validation rule on the object (no separate anchor).
|
|
146
263
|
// trigger.object → object (low-level DB-style triggers)
|
|
147
264
|
registerMetadataResource({
|
|
148
265
|
type: 'trigger',
|
|
@@ -152,6 +269,10 @@ export function registerBuiltinAnchors() {
|
|
|
152
269
|
groupLabel: 'Triggers',
|
|
153
270
|
order: 52,
|
|
154
271
|
}],
|
|
272
|
+
createFields: ['label', 'name', 'object'],
|
|
273
|
+
createDerive: [
|
|
274
|
+
{ from: 'label', to: 'name', transform: 'slugify', untilUserEdits: true },
|
|
275
|
+
],
|
|
155
276
|
});
|
|
156
277
|
// validation: usually embedded in the object, but standalone variants
|
|
157
278
|
// do exist. Match anything whose `object` points back at us.
|
|
@@ -163,6 +284,36 @@ export function registerBuiltinAnchors() {
|
|
|
163
284
|
groupLabel: 'Validations',
|
|
164
285
|
order: 25,
|
|
165
286
|
}],
|
|
287
|
+
createFields: ['label', 'name', 'message'],
|
|
288
|
+
createDerive: [
|
|
289
|
+
{ from: 'label', to: 'name', transform: 'slugify', untilUserEdits: true },
|
|
290
|
+
],
|
|
291
|
+
createSchema: {
|
|
292
|
+
type: 'object',
|
|
293
|
+
required: ['label', 'name', 'message'],
|
|
294
|
+
properties: {
|
|
295
|
+
label: { type: 'string', title: 'Label', description: 'Human-readable rule name.' },
|
|
296
|
+
name: {
|
|
297
|
+
type: 'string',
|
|
298
|
+
title: 'Name',
|
|
299
|
+
description: 'Machine name (snake_case). Used in URLs.',
|
|
300
|
+
pattern: '^[a-z_][a-z0-9_]*$',
|
|
301
|
+
},
|
|
302
|
+
message: {
|
|
303
|
+
type: 'string',
|
|
304
|
+
title: 'Error message',
|
|
305
|
+
description: 'Shown to the user when the rule blocks save.',
|
|
306
|
+
},
|
|
307
|
+
},
|
|
308
|
+
},
|
|
309
|
+
createDefaults: {
|
|
310
|
+
type: 'script',
|
|
311
|
+
active: true,
|
|
312
|
+
events: ['insert', 'update'],
|
|
313
|
+
priority: 10,
|
|
314
|
+
severity: 'error',
|
|
315
|
+
condition: 'false',
|
|
316
|
+
},
|
|
166
317
|
});
|
|
167
318
|
// permission has a sparse object-keyed map under `objects`. Match by
|
|
168
319
|
// membership of the parent name in that map.
|
|
@@ -177,6 +328,11 @@ export function registerBuiltinAnchors() {
|
|
|
177
328
|
groupLabel: 'Permissions',
|
|
178
329
|
order: 60,
|
|
179
330
|
}],
|
|
331
|
+
createFields: ['label', 'name', 'isProfile'],
|
|
332
|
+
createDerive: [
|
|
333
|
+
{ from: 'label', to: 'name', transform: 'slugify', untilUserEdits: true },
|
|
334
|
+
],
|
|
335
|
+
createDefaults: { objects: {} },
|
|
180
336
|
});
|
|
181
337
|
// action — both record-scoped and object-scoped actions live here.
|
|
182
338
|
// Schemas vary, so accept any of the three common shapes.
|
|
@@ -192,6 +348,10 @@ export function registerBuiltinAnchors() {
|
|
|
192
348
|
groupLabel: 'Actions',
|
|
193
349
|
order: 55,
|
|
194
350
|
}],
|
|
351
|
+
createFields: ['label', 'name', 'objectName', 'icon'],
|
|
352
|
+
createDerive: [
|
|
353
|
+
{ from: 'label', to: 'name', transform: 'slugify', untilUserEdits: true },
|
|
354
|
+
],
|
|
195
355
|
});
|
|
196
356
|
// dashboard / report — surface ones bound to a specific object.
|
|
197
357
|
// Many will not have an explicit anchor; those simply don't appear.
|
|
@@ -203,6 +363,11 @@ export function registerBuiltinAnchors() {
|
|
|
203
363
|
groupLabel: 'Dashboards',
|
|
204
364
|
order: 80,
|
|
205
365
|
}],
|
|
366
|
+
createFields: ['label', 'name', 'description'],
|
|
367
|
+
createDerive: [
|
|
368
|
+
{ from: 'label', to: 'name', transform: 'slugify', untilUserEdits: true },
|
|
369
|
+
],
|
|
370
|
+
createDefaults: { widgets: [] },
|
|
206
371
|
});
|
|
207
372
|
registerMetadataResource({
|
|
208
373
|
type: 'report',
|
|
@@ -212,6 +377,54 @@ export function registerBuiltinAnchors() {
|
|
|
212
377
|
groupLabel: 'Reports',
|
|
213
378
|
order: 81,
|
|
214
379
|
}],
|
|
380
|
+
createFields: ['label', 'name', 'objectName', 'description'],
|
|
381
|
+
createDerive: [
|
|
382
|
+
{ from: 'label', to: 'name', transform: 'slugify', untilUserEdits: true },
|
|
383
|
+
],
|
|
384
|
+
createDefaults: { columns: [] },
|
|
385
|
+
});
|
|
386
|
+
// Cosmetic defaults for the `object` type list page — gives Object the
|
|
387
|
+
// same look as every other metadata type while still surfacing the
|
|
388
|
+
// fields/columns developers care about most.
|
|
389
|
+
registerMetadataResource({
|
|
390
|
+
type: 'object',
|
|
391
|
+
iconName: 'database',
|
|
392
|
+
domain: 'data',
|
|
393
|
+
// Protocol-driven create form: ask for identity only. The rest of
|
|
394
|
+
// the object (fields, validations, indexes, hooks, …) is added
|
|
395
|
+
// through the bespoke designer that takes over on the edit page,
|
|
396
|
+
// so requiring it up-front would just front-load 30 inputs with
|
|
397
|
+
// no payoff.
|
|
398
|
+
createFields: ['label', 'pluralLabel', 'name', 'description'],
|
|
399
|
+
createDerive: [
|
|
400
|
+
{ from: 'label', to: 'name', transform: 'slugify', untilUserEdits: true },
|
|
401
|
+
{ from: 'label', to: 'pluralLabel', transform: 'plural-en', untilUserEdits: true },
|
|
402
|
+
],
|
|
403
|
+
// `fields` is the only other required key on the ObjectSchema —
|
|
404
|
+
// seed it as an empty record so the saved body validates.
|
|
405
|
+
createDefaults: { fields: {} },
|
|
406
|
+
searchableFields: ['name', 'label', 'pluralLabel', 'description'],
|
|
407
|
+
listColumns: [
|
|
408
|
+
{ key: 'name', label: 'Name', width: '24%' },
|
|
409
|
+
{ key: 'label', label: 'Label', width: '22%' },
|
|
410
|
+
{ key: 'pluralLabel', label: 'Plural', width: '22%' },
|
|
411
|
+
{
|
|
412
|
+
key: 'fields',
|
|
413
|
+
label: 'Fields',
|
|
414
|
+
width: '90px',
|
|
415
|
+
render: (value) => {
|
|
416
|
+
if (value == null)
|
|
417
|
+
return '—';
|
|
418
|
+
const count = Array.isArray(value)
|
|
419
|
+
? value.length
|
|
420
|
+
: typeof value === 'object'
|
|
421
|
+
? Object.keys(value).length
|
|
422
|
+
: 0;
|
|
423
|
+
return count;
|
|
424
|
+
},
|
|
425
|
+
},
|
|
426
|
+
{ key: 'description', label: 'Description' },
|
|
427
|
+
],
|
|
215
428
|
});
|
|
216
429
|
}
|
|
217
430
|
/**
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Live client-side Zod validation for metadata drafts.
|
|
3
|
+
*
|
|
4
|
+
* Unblocked by `@objectstack/spec@7.x` — the spec package now ships
|
|
5
|
+
* per-metadata-type Zod schemas under its kernel/data/ui/automation/
|
|
6
|
+
* ai/system subpaths, so we no longer have to wait for the next save
|
|
7
|
+
* round-trip to learn the draft is invalid.
|
|
8
|
+
*
|
|
9
|
+
* Usage (from ResourceEditPage):
|
|
10
|
+
*
|
|
11
|
+
* const { issues } = await validateMetadataDraft(type, draft);
|
|
12
|
+
* setIssues(issues);
|
|
13
|
+
*
|
|
14
|
+
* Schemas are loaded lazily — the first call for a given type kicks
|
|
15
|
+
* off a dynamic `import()` of the relevant spec subpath, then caches
|
|
16
|
+
* the result. Types we don't have a client-side schema for (e.g.
|
|
17
|
+
* `validation`, `trigger`, `connector`, etc.) return an empty issue list;
|
|
18
|
+
* the user still gets server-side diagnostics on save.
|
|
19
|
+
*/
|
|
20
|
+
import type { SchemaFormIssue } from './SchemaForm';
|
|
21
|
+
/**
|
|
22
|
+
* Returns true if a client-side schema exists for the given metadata
|
|
23
|
+
* type. Useful for deciding whether to skip the debounce in caller.
|
|
24
|
+
*/
|
|
25
|
+
export declare function hasClientValidator(type: string): boolean;
|
|
26
|
+
export interface ValidateResult {
|
|
27
|
+
/** Whether a client schema was available and the draft conforms. */
|
|
28
|
+
ok: boolean;
|
|
29
|
+
/** Issues to render in SchemaForm + Monaco. Empty on success or unsupported type. */
|
|
30
|
+
issues: SchemaFormIssue[];
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Run Zod validation for the given metadata draft. Returns `{ok: true,
|
|
34
|
+
* issues: []}` for types without a registered schema so callers can
|
|
35
|
+
* fall back to server-side diagnostics without special-casing.
|
|
36
|
+
*/
|
|
37
|
+
export declare function validateMetadataDraft(type: string, draft: unknown,
|
|
38
|
+
/**
|
|
39
|
+
* The live server JSON schema for this type (from `/meta/types`, i.e.
|
|
40
|
+
* `RichMetadataTypeEntry.schema`). When provided it ROOT-CURES cross-repo
|
|
41
|
+
* spec skew: the bundled `@objectstack/spec` may lag the running server, so
|
|
42
|
+
* we never let the client be STRICTER than the server — a "missing required
|
|
43
|
+
* field" flagged by the (possibly stale) bundled Zod is suppressed when the
|
|
44
|
+
* server marks that field optional. The server's own validation on save
|
|
45
|
+
* stays authoritative. This makes the editor track the live schema without a
|
|
46
|
+
* per-change shim (cf. `FORWARD_COMPAT_FLOW_NODE_TYPES`).
|
|
47
|
+
*/
|
|
48
|
+
serverSchema?: {
|
|
49
|
+
required?: unknown;
|
|
50
|
+
}): Promise<ValidateResult>;
|