@object-ui/app-shell 6.2.3 → 7.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +1229 -0
- package/README.md +292 -0
- package/dist/assistant/assistantBus.d.ts +72 -0
- package/dist/assistant/assistantBus.js +133 -0
- package/dist/chrome/CommandPalette.d.ts +1 -1
- package/dist/chrome/CommandPalette.js +26 -22
- package/dist/chrome/ConditionalAuthWrapper.d.ts +1 -1
- package/dist/chrome/ConsoleToaster.d.ts +1 -1
- package/dist/chrome/ConsoleToaster.js +3 -1
- package/dist/chrome/ErrorBoundary.d.ts +1 -1
- package/dist/chrome/KeyboardShortcutsDialog.d.ts +1 -1
- package/dist/chrome/KeyboardShortcutsDialog.js +16 -5
- package/dist/chrome/LoadingScreen.d.ts +1 -1
- package/dist/chrome/LoadingScreen.js +22 -26
- package/dist/chrome/RouteFader.d.ts +1 -1
- package/dist/chrome/ThemeProvider.d.ts +1 -1
- package/dist/components/ManagedByBadge.d.ts +1 -1
- package/dist/console/AppContent.d.ts +1 -1
- package/dist/console/AppContent.js +184 -39
- package/dist/console/ConsoleShell.d.ts +7 -7
- package/dist/console/ConsoleShell.js +32 -3
- package/dist/console/ai/AiChatPage.d.ts +88 -1
- package/dist/console/ai/AiChatPage.js +747 -66
- package/dist/console/ai/ConversationsSidebar.d.ts +26 -1
- package/dist/console/ai/ConversationsSidebar.js +149 -34
- package/dist/console/ai/LiveCanvas.d.ts +28 -0
- package/dist/console/ai/LiveCanvas.js +80 -0
- package/dist/console/ai/reconcileTurn.d.ts +8 -0
- package/dist/console/ai/reconcileTurn.js +20 -0
- package/dist/console/auth/AuthPageLayout.d.ts +1 -1
- package/dist/console/auth/ForgotPasswordPage.d.ts +1 -1
- package/dist/console/auth/LoginPage.d.ts +1 -1
- package/dist/console/auth/RegisterPage.d.ts +1 -1
- package/dist/console/auth/RegisterPage.js +23 -3
- package/dist/console/cloud-connection/CloudConnectionPanel.d.ts +1 -0
- package/dist/console/cloud-connection/CloudConnectionPanel.js +169 -0
- package/dist/console/home/AppCard.d.ts +1 -1
- package/dist/console/home/AppCard.js +6 -12
- package/dist/console/home/HomeAppsStrip.d.ts +8 -0
- package/dist/console/home/HomeAppsStrip.js +61 -0
- package/dist/console/home/HomeLayout.d.ts +1 -1
- package/dist/console/home/HomeLayout.js +3 -1
- package/dist/console/home/HomePage.d.ts +1 -2
- package/dist/console/home/HomePage.js +149 -21
- package/dist/console/home/HomeRail.d.ts +22 -0
- package/dist/console/home/HomeRail.js +62 -0
- package/dist/console/home/QuickActions.d.ts +1 -1
- package/dist/console/home/QuickActions.js +3 -11
- package/dist/console/home/RecentApps.d.ts +1 -1
- package/dist/console/home/RecentApps.js +2 -2
- package/dist/console/home/StarredApps.d.ts +1 -1
- package/dist/console/home/StarredApps.js +2 -2
- package/dist/console/marketplace/InstalledListWidget.d.ts +1 -0
- package/dist/console/marketplace/InstalledListWidget.js +93 -0
- package/dist/console/marketplace/MarkdownText.d.ts +1 -1
- package/dist/console/marketplace/MarketplaceAccessDenied.d.ts +1 -1
- package/dist/console/marketplace/MarketplaceInstalledPage.d.ts +8 -14
- package/dist/console/marketplace/MarketplaceInstalledPage.js +14 -66
- package/dist/console/marketplace/MarketplacePackagePage.d.ts +1 -1
- package/dist/console/marketplace/MarketplacePackagePage.js +249 -8
- package/dist/console/marketplace/MarketplacePage.d.ts +1 -1
- package/dist/console/marketplace/MarketplacePage.js +60 -3
- package/dist/console/marketplace/PackageIcon.d.ts +1 -1
- package/dist/console/marketplace/PluginDisclosure.d.ts +14 -0
- package/dist/console/marketplace/PluginDisclosure.js +38 -0
- package/dist/console/marketplace/marketplaceApi.d.ts +123 -0
- package/dist/console/marketplace/marketplaceApi.js +254 -1
- package/dist/console/organizations/CreateWorkspaceDialog.d.ts +1 -1
- package/dist/console/organizations/OrganizationsLayout.d.ts +1 -1
- package/dist/console/organizations/OrganizationsPage.d.ts +1 -1
- package/dist/console/organizations/manage/AcceptInvitationPage.d.ts +1 -1
- package/dist/console/organizations/manage/InvitationsPage.d.ts +1 -1
- package/dist/console/organizations/manage/InviteMemberDialog.d.ts +1 -1
- package/dist/console/organizations/manage/MembersPage.d.ts +1 -1
- package/dist/console/organizations/manage/OrganizationLayout.d.ts +1 -1
- package/dist/console/organizations/manage/SettingsPage.d.ts +1 -1
- package/dist/context/CommandPaletteProvider.d.ts +44 -0
- package/dist/context/CommandPaletteProvider.js +71 -0
- package/dist/context/FavoritesProvider.d.ts +1 -1
- package/dist/context/NavigationContext.d.ts +1 -1
- package/dist/context/RecentItemsProvider.d.ts +2 -2
- package/dist/context/UserStateAdapters.d.ts +1 -1
- package/dist/context/index.d.ts +2 -0
- package/dist/context/index.js +1 -0
- package/dist/hooks/index.d.ts +5 -2
- package/dist/hooks/index.js +4 -1
- package/dist/hooks/useActionModal.d.ts +53 -0
- package/dist/hooks/useActionModal.js +111 -0
- package/dist/hooks/useChatConversation.d.ts +137 -4
- package/dist/hooks/useChatConversation.js +316 -25
- package/dist/hooks/useConsoleActionRuntime.d.ts +70 -0
- package/dist/hooks/useConsoleActionRuntime.js +564 -0
- package/dist/hooks/useConversationList.js +61 -3
- package/dist/hooks/useHomeInbox.d.ts +13 -0
- package/dist/hooks/useHomeInbox.js +142 -0
- package/dist/hooks/useNavPins.js +17 -23
- package/dist/hooks/useNavigationSync.d.ts +33 -0
- package/dist/hooks/useNavigationSync.js +98 -12
- package/dist/hooks/useReconcileOnError.d.ts +40 -0
- package/dist/hooks/useReconcileOnError.js +37 -0
- package/dist/hooks/useRecordApprovals.d.ts +18 -19
- package/dist/hooks/useRecordApprovals.js +24 -40
- package/dist/hooks/useResponsiveSidebar.js +14 -5
- package/dist/hooks/useSettleSignal.d.ts +19 -0
- package/dist/hooks/useSettleSignal.js +20 -0
- package/dist/hooks/useTrackRouteAsRecent.js +35 -0
- package/dist/hooks/useUrlOverlay.d.ts +62 -0
- package/dist/hooks/useUrlOverlay.js +88 -0
- package/dist/index.d.ts +18 -8
- package/dist/index.js +17 -5
- package/dist/layout/ActivityFeed.d.ts +1 -1
- package/dist/layout/AppHeader.d.ts +3 -2
- package/dist/layout/AppHeader.js +237 -72
- package/dist/layout/AppSidebar.d.ts +2 -1
- package/dist/layout/AppSidebar.js +26 -46
- package/dist/layout/AppSwitcher.d.ts +2 -1
- package/dist/layout/AppSwitcher.js +9 -5
- package/dist/layout/AuthPageLayout.d.ts +1 -1
- package/dist/layout/ConnectionStatus.d.ts +1 -1
- package/dist/layout/ConnectionStatus.js +9 -6
- package/dist/layout/ConsoleChatbotFab.d.ts +19 -1
- package/dist/layout/ConsoleChatbotFab.js +16 -2
- package/dist/layout/ConsoleFloatingChatbot.d.ts +34 -2
- package/dist/layout/ConsoleFloatingChatbot.js +391 -41
- package/dist/layout/ConsoleLayout.d.ts +1 -1
- package/dist/layout/ConsoleLayout.js +27 -11
- package/dist/layout/ContextSelectors.d.ts +44 -0
- package/dist/layout/ContextSelectors.js +242 -0
- package/dist/layout/InboxPopover.d.ts +6 -1
- package/dist/layout/InboxPopover.js +25 -6
- package/dist/layout/LocaleSwitcher.d.ts +1 -1
- package/dist/layout/LocalizedSidebarTrigger.d.ts +2 -0
- package/dist/layout/LocalizedSidebarTrigger.js +15 -0
- package/dist/layout/MobileViewSwitcherContext.d.ts +1 -1
- package/dist/layout/ModeToggle.d.ts +1 -1
- package/dist/layout/PageHeader.d.ts +1 -1
- package/dist/layout/UnifiedSidebar.d.ts +2 -1
- package/dist/layout/UnifiedSidebar.js +116 -15
- package/dist/layout/agentPicker.d.ts +56 -0
- package/dist/layout/agentPicker.js +40 -0
- package/dist/observability/index.d.ts +1 -0
- package/dist/observability/index.js +1 -0
- package/dist/observability/settleSignal.d.ts +64 -0
- package/dist/observability/settleSignal.js +131 -0
- package/dist/preview/CommitTimeline.d.ts +15 -0
- package/dist/preview/CommitTimeline.js +82 -0
- package/dist/preview/DraftChangesPanel.d.ts +19 -0
- package/dist/preview/DraftChangesPanel.js +114 -0
- package/dist/preview/DraftPreviewBar.d.ts +8 -0
- package/dist/preview/DraftPreviewBar.js +86 -0
- package/dist/preview/PreviewDraftEmptyState.d.ts +16 -0
- package/dist/preview/PreviewDraftEmptyState.js +47 -0
- package/dist/preview/PreviewModeContext.d.ts +57 -0
- package/dist/preview/PreviewModeContext.js +99 -0
- package/dist/preview/UnpublishedAppBar.d.ts +8 -0
- package/dist/preview/UnpublishedAppBar.js +83 -0
- package/dist/preview/commitHistory.d.ts +28 -0
- package/dist/preview/commitHistory.js +48 -0
- package/dist/preview/draftStatus.d.ts +20 -0
- package/dist/preview/draftStatus.js +27 -0
- package/dist/preview/usePublishAllDrafts.d.ts +18 -0
- package/dist/preview/usePublishAllDrafts.js +106 -0
- package/dist/providers/AdapterProvider.d.ts +1 -1
- package/dist/providers/AdapterProvider.js +6 -1
- package/dist/providers/ExpressionProvider.d.ts +1 -1
- package/dist/providers/MetadataProvider.d.ts +17 -2
- package/dist/providers/MetadataProvider.js +192 -12
- package/dist/runtime-config.d.ts +46 -2
- package/dist/runtime-config.js +39 -2
- package/dist/services/builtinComponents.js +68 -59
- package/dist/skeletons/SkeletonDashboard.d.ts +1 -1
- package/dist/skeletons/SkeletonDetail.d.ts +1 -1
- package/dist/skeletons/SkeletonGrid.d.ts +1 -1
- package/dist/utils/appRoute.d.ts +21 -0
- package/dist/utils/appRoute.js +25 -0
- package/dist/utils/deriveRelatedLists.d.ts +54 -0
- package/dist/utils/deriveRelatedLists.js +91 -0
- package/dist/utils/index.d.ts +4 -0
- package/dist/utils/index.js +3 -0
- package/dist/utils/managedByEmptyState.d.ts +8 -1
- package/dist/utils/managedByEmptyState.js +13 -7
- package/dist/utils/preferLocal.d.ts +18 -0
- package/dist/utils/preferLocal.js +24 -0
- package/dist/views/ActionConfirmDialog.d.ts +1 -1
- package/dist/views/ActionConfirmDialog.js +3 -1
- package/dist/views/ActionParamDialog.d.ts +6 -1
- package/dist/views/ActionParamDialog.js +9 -3
- package/dist/views/ActionResultDialog.d.ts +13 -0
- package/dist/views/ActionResultDialog.js +134 -0
- package/dist/views/ComponentNavView.d.ts +14 -1
- package/dist/views/CreateViewDialog.d.ts +1 -1
- package/dist/views/DashboardConfigPanel.d.ts +28 -0
- package/dist/views/DashboardConfigPanel.js +81 -0
- package/dist/views/DashboardView.d.ts +4 -3
- package/dist/views/DashboardView.js +38 -239
- package/dist/views/FlowRunner.d.ts +31 -0
- package/dist/views/FlowRunner.js +121 -0
- package/dist/views/InterfaceListPage.d.ts +49 -0
- package/dist/views/InterfaceListPage.js +347 -0
- package/dist/views/MetadataInspector.d.ts +2 -2
- package/dist/views/ObjectView.d.ts +1 -1
- package/dist/views/ObjectView.js +209 -532
- package/dist/views/PageView.d.ts +8 -3
- package/dist/views/PageView.js +45 -32
- package/dist/views/RecordDetailView.d.ts +1 -1
- package/dist/views/RecordDetailView.js +363 -148
- package/dist/views/RecordFormPage.d.ts +1 -1
- package/dist/views/RecordFormPage.js +26 -1
- package/dist/views/ReportConfigPanel.d.ts +37 -0
- package/dist/views/ReportConfigPanel.js +85 -0
- package/dist/views/ReportView.d.ts +1 -1
- package/dist/views/ReportView.js +116 -7
- package/dist/views/RuntimeDraftBar.d.ts +30 -0
- package/dist/views/RuntimeDraftBar.js +112 -0
- package/dist/views/ScreenView.d.ts +70 -0
- package/dist/views/ScreenView.js +73 -0
- package/dist/views/SearchResultsPage.d.ts +1 -1
- package/dist/views/SearchResultsPage.js +8 -18
- package/dist/views/ViewConfigPanel.d.ts +24 -17
- package/dist/views/ViewConfigPanel.js +121 -77
- package/dist/views/index.d.ts +1 -1
- package/dist/views/index.js +1 -1
- package/dist/views/metadata-admin/AuditPanel.d.ts +28 -0
- package/dist/views/metadata-admin/AuditPanel.js +79 -0
- package/dist/views/metadata-admin/DiagnosticsPage.d.ts +20 -0
- package/dist/views/metadata-admin/DiagnosticsPage.js +69 -0
- package/dist/views/metadata-admin/DirectoryPage.d.ts +16 -1
- package/dist/views/metadata-admin/DirectoryPage.js +101 -24
- package/dist/views/metadata-admin/DraftReviewPanel.d.ts +33 -0
- package/dist/views/metadata-admin/DraftReviewPanel.js +77 -0
- package/dist/views/metadata-admin/EmbeddedItemEditor.d.ts +17 -1
- package/dist/views/metadata-admin/EmbeddedItemEditor.js +15 -8
- package/dist/views/metadata-admin/JsonSourceEditor.d.ts +39 -0
- package/dist/views/metadata-admin/JsonSourceEditor.js +196 -0
- package/dist/views/metadata-admin/LayeredDiff.d.ts +39 -1
- package/dist/views/metadata-admin/LayeredDiff.js +171 -5
- package/dist/views/metadata-admin/MetadataDetailDrawer.d.ts +15 -1
- package/dist/views/metadata-admin/MetadataTypeActions.d.ts +48 -0
- package/dist/views/metadata-admin/MetadataTypeActions.js +165 -0
- package/dist/views/metadata-admin/PackagesPage.d.ts +18 -0
- package/dist/views/metadata-admin/PackagesPage.js +403 -0
- package/dist/views/metadata-admin/PageShell.d.ts +1 -1
- package/dist/views/metadata-admin/PageShell.js +9 -4
- package/dist/views/metadata-admin/PermissionMatrixEditor.d.ts +35 -1
- package/dist/views/metadata-admin/QuickFind.d.ts +21 -1
- package/dist/views/metadata-admin/QuickFind.js +6 -3
- package/dist/views/metadata-admin/RelatedPanel.d.ts +24 -1
- package/dist/views/metadata-admin/RelatedPanel.js +20 -18
- package/dist/views/metadata-admin/ResourceEditPage.d.ts +40 -1
- package/dist/views/metadata-admin/ResourceEditPage.js +1250 -60
- package/dist/views/metadata-admin/ResourceHistoryPage.d.ts +39 -1
- package/dist/views/metadata-admin/ResourceHistoryPage.js +66 -16
- package/dist/views/metadata-admin/ResourceListPage.d.ts +13 -1
- package/dist/views/metadata-admin/ResourceListPage.js +258 -30
- package/dist/views/metadata-admin/ResourceRouter.d.ts +23 -1
- package/dist/views/metadata-admin/SchemaForm.d.ts +34 -1
- package/dist/views/metadata-admin/SchemaForm.js +559 -49
- package/dist/views/metadata-admin/StudioHomePage.d.ts +22 -0
- package/dist/views/metadata-admin/StudioHomePage.js +205 -0
- package/dist/views/metadata-admin/anchors.js +255 -24
- package/dist/views/metadata-admin/clientValidation.d.ts +50 -0
- package/dist/views/metadata-admin/clientValidation.js +169 -0
- package/dist/views/metadata-admin/color-variant-field.d.ts +30 -0
- package/dist/views/metadata-admin/color-variant-field.js +38 -0
- package/dist/views/metadata-admin/createDerive.d.ts +75 -0
- package/dist/views/metadata-admin/createDerive.js +179 -0
- package/dist/views/metadata-admin/dashboard-schema.d.ts +12 -0
- package/dist/views/metadata-admin/dashboard-schema.js +80 -0
- package/dist/views/metadata-admin/datasource/DatasourceResourcePage.d.ts +35 -0
- package/dist/views/metadata-admin/datasource/DatasourceResourcePage.js +327 -0
- package/dist/views/metadata-admin/datasource/register.d.ts +1 -0
- package/dist/views/metadata-admin/datasource/register.js +24 -0
- package/dist/views/metadata-admin/default-inspector-registry.d.ts +49 -0
- package/dist/views/metadata-admin/default-inspector-registry.js +8 -0
- package/dist/views/metadata-admin/default-schemas.js +115 -10
- package/dist/views/metadata-admin/external/ExternalDatasourcePanel.d.ts +27 -0
- package/dist/views/metadata-admin/external/ExternalDatasourcePanel.js +69 -0
- package/dist/views/metadata-admin/external/ImportObjectDialog.d.ts +27 -0
- package/dist/views/metadata-admin/external/ImportObjectDialog.js +77 -0
- package/dist/views/metadata-admin/external/SchemaBrowser.d.ts +16 -0
- package/dist/views/metadata-admin/external/SchemaBrowser.js +74 -0
- package/dist/views/metadata-admin/external/ValidationPanel.d.ts +16 -0
- package/dist/views/metadata-admin/external/ValidationPanel.js +68 -0
- package/dist/views/metadata-admin/external/api.d.ts +100 -0
- package/dist/views/metadata-admin/external/api.js +124 -0
- package/dist/views/metadata-admin/i18n.d.ts +1 -0
- package/dist/views/metadata-admin/i18n.js +1252 -2
- package/dist/views/metadata-admin/index.d.ts +8 -5
- package/dist/views/metadata-admin/index.js +12 -2
- package/dist/views/metadata-admin/inspector-registry.d.ts +51 -0
- package/dist/views/metadata-admin/inspector-registry.js +11 -0
- package/dist/views/metadata-admin/inspectors/ActionDefaultInspector.d.ts +30 -0
- package/dist/views/metadata-admin/inspectors/ActionDefaultInspector.js +180 -0
- package/dist/views/metadata-admin/inspectors/AppNavInspector.d.ts +16 -0
- package/dist/views/metadata-admin/inspectors/AppNavInspector.js +110 -0
- package/dist/views/metadata-admin/inspectors/ConditionBuilder.d.ts +29 -0
- package/dist/views/metadata-admin/inspectors/ConditionBuilder.js +154 -0
- package/dist/views/metadata-admin/inspectors/DashboardDefaultInspector.d.ts +28 -0
- package/dist/views/metadata-admin/inspectors/DashboardDefaultInspector.js +110 -0
- package/dist/views/metadata-admin/inspectors/DashboardWidgetInspector.d.ts +18 -0
- package/dist/views/metadata-admin/inspectors/DashboardWidgetInspector.js +139 -0
- package/dist/views/metadata-admin/inspectors/DatasetDefaultInspector.d.ts +21 -0
- package/dist/views/metadata-admin/inspectors/DatasetDefaultInspector.js +221 -0
- package/dist/views/metadata-admin/inspectors/FlowEdgeInspector.d.ts +16 -0
- package/dist/views/metadata-admin/inspectors/FlowEdgeInspector.js +126 -0
- package/dist/views/metadata-admin/inspectors/FlowInspector.d.ts +12 -0
- package/dist/views/metadata-admin/inspectors/FlowInspector.js +9 -0
- package/dist/views/metadata-admin/inspectors/FlowKeyValueField.d.ts +30 -0
- package/dist/views/metadata-admin/inspectors/FlowKeyValueField.js +125 -0
- package/dist/views/metadata-admin/inspectors/FlowNodeConfigField.d.ts +18 -0
- package/dist/views/metadata-admin/inspectors/FlowNodeConfigField.js +40 -0
- package/dist/views/metadata-admin/inspectors/FlowNodeInspector.d.ts +14 -0
- package/dist/views/metadata-admin/inspectors/FlowNodeInspector.js +205 -0
- package/dist/views/metadata-admin/inspectors/FlowObjectListField.d.ts +26 -0
- package/dist/views/metadata-admin/inspectors/FlowObjectListField.js +105 -0
- package/dist/views/metadata-admin/inspectors/FlowReferenceField.d.ts +83 -0
- package/dist/views/metadata-admin/inspectors/FlowReferenceField.js +181 -0
- package/dist/views/metadata-admin/inspectors/FlowStringListField.d.ts +21 -0
- package/dist/views/metadata-admin/inspectors/FlowStringListField.js +60 -0
- package/dist/views/metadata-admin/inspectors/InspectorComboField.d.ts +40 -0
- package/dist/views/metadata-admin/inspectors/InspectorComboField.js +61 -0
- package/dist/views/metadata-admin/inspectors/ObjectDefaultInspector.d.ts +21 -0
- package/dist/views/metadata-admin/inspectors/ObjectDefaultInspector.js +55 -0
- package/dist/views/metadata-admin/inspectors/ObjectFieldInspector.d.ts +23 -0
- package/dist/views/metadata-admin/inspectors/ObjectFieldInspector.js +365 -0
- package/dist/views/metadata-admin/inspectors/PageBlockInspector.d.ts +48 -0
- package/dist/views/metadata-admin/inspectors/PageBlockInspector.js +332 -0
- package/dist/views/metadata-admin/inspectors/ReportDefaultInspector.d.ts +58 -0
- package/dist/views/metadata-admin/inspectors/ReportDefaultInspector.js +218 -0
- package/dist/views/metadata-admin/inspectors/ViewColumnInspector.d.ts +19 -0
- package/dist/views/metadata-admin/inspectors/ViewColumnInspector.js +144 -0
- package/dist/views/metadata-admin/inspectors/ViewInspector.d.ts +19 -0
- package/dist/views/metadata-admin/inspectors/ViewInspector.js +21 -0
- package/dist/views/metadata-admin/inspectors/ViewVariantInspector.d.ts +54 -0
- package/dist/views/metadata-admin/inspectors/ViewVariantInspector.js +191 -0
- package/dist/views/metadata-admin/inspectors/_shared.d.ts +128 -0
- package/dist/views/metadata-admin/inspectors/_shared.js +113 -0
- package/dist/views/metadata-admin/inspectors/datasetFilterCondition.d.ts +24 -0
- package/dist/views/metadata-admin/inspectors/datasetFilterCondition.js +97 -0
- package/dist/views/metadata-admin/inspectors/expression-validate.d.ts +26 -0
- package/dist/views/metadata-admin/inspectors/expression-validate.js +66 -0
- package/dist/views/metadata-admin/inspectors/flow-node-config.d.ts +143 -0
- package/dist/views/metadata-admin/inspectors/flow-node-config.js +506 -0
- package/dist/views/metadata-admin/inspectors/index.d.ts +1 -0
- package/dist/views/metadata-admin/inspectors/index.js +45 -0
- package/dist/views/metadata-admin/inspectors/json-schema-to-fields.d.ts +40 -0
- package/dist/views/metadata-admin/inspectors/json-schema-to-fields.js +227 -0
- package/dist/views/metadata-admin/inspectors/useDatasetFields.d.ts +72 -0
- package/dist/views/metadata-admin/inspectors/useDatasetFields.js +0 -0
- package/dist/views/metadata-admin/issuePath.d.ts +22 -0
- package/dist/views/metadata-admin/issuePath.js +65 -0
- package/dist/views/metadata-admin/mergeServerFields.d.ts +65 -0
- package/dist/views/metadata-admin/mergeServerFields.js +56 -0
- package/dist/views/metadata-admin/package-scope.d.ts +26 -0
- package/dist/views/metadata-admin/package-scope.js +43 -0
- package/dist/views/metadata-admin/preview-registry.d.ts +55 -0
- package/dist/views/metadata-admin/previews/ActionPreview.d.ts +25 -0
- package/dist/views/metadata-admin/previews/ActionPreview.js +238 -0
- package/dist/views/metadata-admin/previews/AddWidgetPicker.d.ts +12 -0
- package/dist/views/metadata-admin/previews/AddWidgetPicker.js +56 -0
- package/dist/views/metadata-admin/previews/AgentPreview.d.ts +24 -0
- package/dist/views/metadata-admin/previews/AgentPreview.js +100 -0
- package/dist/views/metadata-admin/previews/AppNavCanvas.d.ts +31 -0
- package/dist/views/metadata-admin/previews/AppNavCanvas.js +260 -0
- package/dist/views/metadata-admin/previews/AppPreview.d.ts +16 -1
- package/dist/views/metadata-admin/previews/AppPreview.js +23 -14
- package/dist/views/metadata-admin/previews/BookPreview.d.ts +20 -0
- package/dist/views/metadata-admin/previews/BookPreview.js +132 -0
- package/dist/views/metadata-admin/previews/DashboardPreview.d.ts +16 -1
- package/dist/views/metadata-admin/previews/DashboardPreview.js +110 -8
- package/dist/views/metadata-admin/previews/DatasetPreview.d.ts +18 -0
- package/dist/views/metadata-admin/previews/DatasetPreview.js +105 -0
- package/dist/views/metadata-admin/previews/DatasourcePreview.d.ts +23 -0
- package/dist/views/metadata-admin/previews/DatasourcePreview.js +68 -0
- package/dist/views/metadata-admin/previews/EmailTemplatePreview.d.ts +14 -1
- package/dist/views/metadata-admin/previews/FieldStub.d.ts +30 -0
- package/dist/views/metadata-admin/previews/FieldStub.js +104 -0
- package/dist/views/metadata-admin/previews/FieldsListEditor.d.ts +50 -0
- package/dist/views/metadata-admin/previews/FieldsListEditor.js +97 -0
- package/dist/views/metadata-admin/previews/FlowCanvas.d.ts +49 -0
- package/dist/views/metadata-admin/previews/FlowCanvas.js +416 -0
- package/dist/views/metadata-admin/previews/FlowPreview.d.ts +20 -0
- package/dist/views/metadata-admin/previews/FlowPreview.js +120 -0
- package/dist/views/metadata-admin/previews/FlowRunsPanel.d.ts +46 -0
- package/dist/views/metadata-admin/previews/FlowRunsPanel.js +97 -0
- package/dist/views/metadata-admin/previews/FlowSimulatorPanel.d.ts +25 -0
- package/dist/views/metadata-admin/previews/FlowSimulatorPanel.js +204 -0
- package/dist/views/metadata-admin/previews/JobPreview.d.ts +28 -0
- package/dist/views/metadata-admin/previews/JobPreview.js +290 -0
- package/dist/views/metadata-admin/previews/ObjectFormCanvas.d.ts +30 -0
- package/dist/views/metadata-admin/previews/ObjectFormCanvas.js +547 -0
- package/dist/views/metadata-admin/previews/ObjectPreview.d.ts +14 -1
- package/dist/views/metadata-admin/previews/ObjectPreview.js +5 -30
- package/dist/views/metadata-admin/previews/OutlineStrip.d.ts +32 -0
- package/dist/views/metadata-admin/previews/OutlineStrip.js +8 -0
- package/dist/views/metadata-admin/previews/PageBlockCanvas.d.ts +49 -0
- package/dist/views/metadata-admin/previews/PageBlockCanvas.js +510 -0
- package/dist/views/metadata-admin/previews/PagePreview.d.ts +10 -1
- package/dist/views/metadata-admin/previews/PagePreview.js +200 -5
- package/dist/views/metadata-admin/previews/PermissionPreview.d.ts +27 -0
- package/dist/views/metadata-admin/previews/PermissionPreview.js +115 -0
- package/dist/views/metadata-admin/previews/PreviewShell.d.ts +29 -6
- package/dist/views/metadata-admin/previews/PreviewShell.js +16 -3
- package/dist/views/metadata-admin/previews/ReportPreview.d.ts +18 -1
- package/dist/views/metadata-admin/previews/ReportPreview.js +23 -15
- package/dist/views/metadata-admin/previews/RolePreview.d.ts +19 -0
- package/dist/views/metadata-admin/previews/RolePreview.js +14 -0
- package/dist/views/metadata-admin/previews/ScreenPreview.d.ts +38 -0
- package/dist/views/metadata-admin/previews/ScreenPreview.js +61 -0
- package/dist/views/metadata-admin/previews/SkillPreview.d.ts +22 -0
- package/dist/views/metadata-admin/previews/SkillPreview.js +34 -0
- package/dist/views/metadata-admin/previews/ToolPreview.d.ts +25 -0
- package/dist/views/metadata-admin/previews/ToolPreview.js +122 -0
- package/dist/views/metadata-admin/previews/TranslationPreview.d.ts +25 -0
- package/dist/views/metadata-admin/previews/TranslationPreview.js +52 -0
- package/dist/views/metadata-admin/previews/ValidationPreview.d.ts +27 -0
- package/dist/views/metadata-admin/previews/ValidationPreview.js +110 -0
- package/dist/views/metadata-admin/previews/ViewColumnPanes.d.ts +62 -0
- package/dist/views/metadata-admin/previews/ViewColumnPanes.js +140 -0
- package/dist/views/metadata-admin/previews/ViewPreview.d.ts +23 -1
- package/dist/views/metadata-admin/previews/ViewPreview.js +101 -73
- package/dist/views/metadata-admin/previews/block-config.d.ts +82 -0
- package/dist/views/metadata-admin/previews/block-config.js +324 -0
- package/dist/views/metadata-admin/previews/block-types.d.ts +40 -0
- package/dist/views/metadata-admin/previews/block-types.js +110 -0
- package/dist/views/metadata-admin/previews/field-types.d.ts +53 -0
- package/dist/views/metadata-admin/previews/field-types.js +97 -0
- package/dist/views/metadata-admin/previews/flow-canvas-layout.d.ts +102 -0
- package/dist/views/metadata-admin/previews/flow-canvas-layout.js +227 -0
- package/dist/views/metadata-admin/previews/flow-canvas-parts.d.ts +96 -0
- package/dist/views/metadata-admin/previews/flow-canvas-parts.js +373 -0
- package/dist/views/metadata-admin/previews/form-preview.d.ts +24 -0
- package/dist/views/metadata-admin/previews/form-preview.js +29 -0
- package/dist/views/metadata-admin/previews/index.js +43 -0
- package/dist/views/metadata-admin/previews/object-fields-bridge.d.ts +66 -0
- package/dist/views/metadata-admin/previews/object-fields-bridge.js +171 -0
- package/dist/views/metadata-admin/previews/object-fields-io.d.ts +130 -0
- package/dist/views/metadata-admin/previews/object-fields-io.js +243 -0
- package/dist/views/metadata-admin/previews/screen-spec.d.ts +43 -0
- package/dist/views/metadata-admin/previews/screen-spec.js +108 -0
- package/dist/views/metadata-admin/previews/simulator/flow-sim-types.d.ts +102 -0
- package/dist/views/metadata-admin/previews/simulator/flow-sim-types.js +2 -0
- package/dist/views/metadata-admin/previews/simulator/flow-sim-validate.d.ts +15 -0
- package/dist/views/metadata-admin/previews/simulator/flow-sim-validate.js +185 -0
- package/dist/views/metadata-admin/previews/simulator/flow-simulator.d.ts +73 -0
- package/dist/views/metadata-admin/previews/simulator/flow-simulator.js +426 -0
- package/dist/views/metadata-admin/previews/useDatasetCatalog.d.ts +47 -0
- package/dist/views/metadata-admin/previews/useDatasetCatalog.js +133 -0
- package/dist/views/metadata-admin/previews/useFlowNodePalette.d.ts +44 -0
- package/dist/views/metadata-admin/previews/useFlowNodePalette.js +124 -0
- package/dist/views/metadata-admin/previews/useMetaOptions.d.ts +8 -0
- package/dist/views/metadata-admin/previews/useMetaOptions.js +50 -0
- package/dist/views/metadata-admin/previews/useObjectFields.d.ts +23 -0
- package/dist/views/metadata-admin/previews/useObjectFields.js +79 -0
- package/dist/views/metadata-admin/previews/useObjectOptions.d.ts +8 -0
- package/dist/views/metadata-admin/previews/useObjectOptions.js +43 -0
- package/dist/views/metadata-admin/previews/view-column-io.d.ts +42 -0
- package/dist/views/metadata-admin/previews/view-column-io.js +73 -0
- package/dist/views/metadata-admin/previews/widget-types.d.ts +24 -0
- package/dist/views/metadata-admin/previews/widget-types.js +40 -0
- package/dist/views/metadata-admin/registry.d.ts +140 -19
- package/dist/views/metadata-admin/report-schema.d.ts +26 -0
- package/dist/views/metadata-admin/report-schema.js +121 -0
- package/dist/views/metadata-admin/useMetadata.d.ts +100 -2
- package/dist/views/metadata-admin/useMetadata.js +155 -4
- package/dist/views/metadata-admin/view-item-normalize.d.ts +20 -0
- package/dist/views/metadata-admin/view-item-normalize.js +68 -0
- package/dist/views/metadata-admin/view-schema.d.ts +16 -0
- package/dist/views/metadata-admin/view-schema.js +107 -0
- package/dist/views/metadata-admin/view-variant-model.d.ts +23 -0
- package/dist/views/metadata-admin/view-variant-model.js +64 -0
- package/dist/views/metadata-admin/widgets.d.ts +89 -1
- package/dist/views/metadata-admin/widgets.js +491 -17
- package/dist/views/runtime-metadata-persistence.d.ts +78 -0
- package/dist/views/runtime-metadata-persistence.js +89 -0
- package/dist/views/useOpenRecordList.d.ts +18 -0
- package/dist/views/useOpenRecordList.js +36 -0
- package/dist/views/userFilterUrlState.d.ts +15 -0
- package/dist/views/userFilterUrlState.js +53 -0
- package/dist/views/view-config-adapter.d.ts +38 -0
- package/dist/views/view-config-adapter.js +80 -0
- package/package.json +52 -34
- package/dist/views/DesignDrawer.d.ts +0 -28
- package/dist/views/DesignDrawer.js +0 -51
- package/dist/views/metadata-admin/DesignerEditorWrapper.d.ts +0 -68
- package/dist/views/metadata-admin/DesignerEditorWrapper.js +0 -158
|
@@ -0,0 +1,365 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.
|
|
3
|
+
/**
|
|
4
|
+
* ObjectFieldInspector — scoped editor for the selected Object field.
|
|
5
|
+
*
|
|
6
|
+
* Selection shape: { kind: 'field', id: '<field_name>' }
|
|
7
|
+
*
|
|
8
|
+
* The inspector edits one field at a time. Sections:
|
|
9
|
+
* • Basic — name (rename), label, type, required, unique, description
|
|
10
|
+
* • Specific — picklist options / lookup target / formula / numeric
|
|
11
|
+
* precision / max length, conditional on type
|
|
12
|
+
* • Advanced — readonly, hidden, indexed, externalId, group
|
|
13
|
+
*
|
|
14
|
+
* All edits are applied as immutable splices of `draft.fields` via
|
|
15
|
+
* the object-fields-io helpers, preserving the original array-vs-record
|
|
16
|
+
* shape AND any unknown keys on the field definition.
|
|
17
|
+
*
|
|
18
|
+
* Rename: changing the `name` rewrites the field's key in-place and
|
|
19
|
+
* re-issues the selection so the inspector stays bound to the same
|
|
20
|
+
* field. Other fields/options that reference the old name are NOT
|
|
21
|
+
* auto-rewritten — callers should re-validate downstream.
|
|
22
|
+
*/
|
|
23
|
+
import * as React from 'react';
|
|
24
|
+
import { slugify } from '../createDerive';
|
|
25
|
+
import { useMetadataClient } from '../useMetadata';
|
|
26
|
+
import { InspectorShell, InspectorReorderButtons, InspectorTextField, InspectorNumberField, InspectorSelectField, InspectorCheckboxField, InspectorRemoveButton, InspectorEmptyState, moveArray, } from './_shared';
|
|
27
|
+
import { Button, Input, Label, Badge } from '@object-ui/components';
|
|
28
|
+
import { Plus, X, ArrowUp, ArrowDown, Copy } from 'lucide-react';
|
|
29
|
+
import { InspectorComboField } from './InspectorComboField';
|
|
30
|
+
import { useObjectFields } from '../previews/useObjectFields';
|
|
31
|
+
import { readFields, writeFields, toFieldNameLoose, indexOfField, } from '../previews/object-fields-io';
|
|
32
|
+
import { FIELD_TYPE_META, TYPES_BY_CATEGORY, CATEGORY_LABEL_EN, CATEGORY_LABEL_ZH, } from '../previews/field-types';
|
|
33
|
+
import { t, tFormat } from '../i18n';
|
|
34
|
+
const isZh = (locale) => (locale ?? '').toLowerCase().startsWith('zh');
|
|
35
|
+
/* ─────────────── Helpers ─────────────── */
|
|
36
|
+
function readOptions(def) {
|
|
37
|
+
const raw = def.options;
|
|
38
|
+
if (!Array.isArray(raw))
|
|
39
|
+
return [];
|
|
40
|
+
return raw.map((o) => ({
|
|
41
|
+
value: String(o?.value ?? ''),
|
|
42
|
+
label: typeof o?.label === 'string' ? o.label : undefined,
|
|
43
|
+
color: typeof o?.color === 'string' ? o.color : undefined,
|
|
44
|
+
}));
|
|
45
|
+
}
|
|
46
|
+
function isPicklist(type) {
|
|
47
|
+
return type === 'select' || type === 'multiselect' || type === 'radio' || type === 'checkboxes';
|
|
48
|
+
}
|
|
49
|
+
function isLookup(type) {
|
|
50
|
+
return type === 'lookup' || type === 'master_detail' || type === 'tree';
|
|
51
|
+
}
|
|
52
|
+
function isComputed(type) {
|
|
53
|
+
return type === 'formula' || type === 'summary';
|
|
54
|
+
}
|
|
55
|
+
function isNumeric(type) {
|
|
56
|
+
return type === 'number' || type === 'currency' || type === 'percent';
|
|
57
|
+
}
|
|
58
|
+
function isTexty(type) {
|
|
59
|
+
return type === 'text' || type === 'textarea' || type === 'email' || type === 'url' || type === 'phone' || type === 'password';
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Which default-value editor (if any) fits a field type. Computed,
|
|
63
|
+
* relational, media and structural types have no meaningful literal
|
|
64
|
+
* default in this UI, so they return null (no editor rendered).
|
|
65
|
+
*/
|
|
66
|
+
function defaultValueKind(type) {
|
|
67
|
+
if (type === 'boolean' || type === 'toggle')
|
|
68
|
+
return 'bool';
|
|
69
|
+
if (type === 'number' || type === 'currency' || type === 'percent')
|
|
70
|
+
return 'number';
|
|
71
|
+
if (type === 'select' || type === 'radio')
|
|
72
|
+
return 'picklist';
|
|
73
|
+
const noDefault = [
|
|
74
|
+
'formula', 'summary', 'autonumber',
|
|
75
|
+
'lookup', 'master_detail', 'tree',
|
|
76
|
+
'file', 'image', 'avatar', 'video', 'audio', 'signature', 'qrcode',
|
|
77
|
+
'composite', 'repeater', 'vector',
|
|
78
|
+
'multiselect', 'checkboxes', 'tags',
|
|
79
|
+
];
|
|
80
|
+
if (noDefault.includes(type))
|
|
81
|
+
return null;
|
|
82
|
+
return 'text';
|
|
83
|
+
}
|
|
84
|
+
function buildTypeOptions(locale) {
|
|
85
|
+
const zh = (locale ?? '').toLowerCase().startsWith('zh');
|
|
86
|
+
const cats = zh ? CATEGORY_LABEL_ZH : CATEGORY_LABEL_EN;
|
|
87
|
+
return TYPES_BY_CATEGORY.flatMap((g) => g.types.map((id) => {
|
|
88
|
+
const m = FIELD_TYPE_META[id];
|
|
89
|
+
return { value: id, label: `${cats[g.category]} · ${zh ? m.labelZh : m.label}` };
|
|
90
|
+
}));
|
|
91
|
+
}
|
|
92
|
+
/* ─────────────── Inspector ─────────────── */
|
|
93
|
+
export function ObjectFieldInspector({ selection, draft, onPatch, onClearSelection, onSelectionChange, readOnly, locale, }) {
|
|
94
|
+
const tr = React.useCallback((key) => t(key, locale), [locale]);
|
|
95
|
+
const typeOptions = React.useMemo(() => buildTypeOptions(locale), [locale]);
|
|
96
|
+
const view = React.useMemo(() => readFields(draft.fields), [draft]);
|
|
97
|
+
const name = String(selection.id);
|
|
98
|
+
const idx = indexOfField(view, name);
|
|
99
|
+
const entry = idx >= 0 ? view.entries[idx] : null;
|
|
100
|
+
const fieldGroups = Array.isArray(draft.fieldGroups)
|
|
101
|
+
? draft.fieldGroups
|
|
102
|
+
: [];
|
|
103
|
+
const objectOptions = useObjectOptions();
|
|
104
|
+
if (!entry) {
|
|
105
|
+
return (_jsx(InspectorShell, { kindLabel: tr('designer.field.kind'), title: name || tr('designer.field.kind'), onClose: onClearSelection, closeLabel: tr('designer.field.close'), children: _jsx(InspectorEmptyState, { message: tr('designer.field.missing') }) }));
|
|
106
|
+
}
|
|
107
|
+
const def = entry.def;
|
|
108
|
+
const type = (typeof def.type === 'string' ? def.type : 'text');
|
|
109
|
+
const typeMeta = FIELD_TYPE_META[type];
|
|
110
|
+
/* ─── Patch helpers ─── */
|
|
111
|
+
const writeView = (next) => {
|
|
112
|
+
onPatch({ fields: writeFields(next) });
|
|
113
|
+
};
|
|
114
|
+
const patchDef = (patch) => {
|
|
115
|
+
const nextEntries = [...view.entries];
|
|
116
|
+
nextEntries[idx] = { ...entry, def: { ...def, ...patch } };
|
|
117
|
+
writeView({ shape: view.shape, entries: nextEntries });
|
|
118
|
+
};
|
|
119
|
+
const setKey = (rawNext) => {
|
|
120
|
+
const nextName = toFieldNameLoose(rawNext);
|
|
121
|
+
if (!nextName || nextName === entry.name)
|
|
122
|
+
return;
|
|
123
|
+
// Disallow collision
|
|
124
|
+
if (view.entries.some((e, i) => i !== idx && e.name === nextName))
|
|
125
|
+
return;
|
|
126
|
+
const nextEntries = [...view.entries];
|
|
127
|
+
nextEntries[idx] = { ...entry, name: nextName };
|
|
128
|
+
writeView({ shape: view.shape, entries: nextEntries });
|
|
129
|
+
onSelectionChange?.({ kind: 'field', id: nextName, label: String(def.label ?? nextName) });
|
|
130
|
+
};
|
|
131
|
+
// Derive the API name from the label (on blur, so we use the complete
|
|
132
|
+
// string — not per keystroke, which would churn the field key) while the
|
|
133
|
+
// name is still an auto-generated default and the user hasn't customised it.
|
|
134
|
+
// Mirrors the object Name behaviour; slugify() returns '' for non-Latin
|
|
135
|
+
// labels, in which case the unique default name is kept.
|
|
136
|
+
const maybeDeriveName = (label) => {
|
|
137
|
+
if (readOnly)
|
|
138
|
+
return;
|
|
139
|
+
const base = type === 'select' ? 'status' : type;
|
|
140
|
+
const isAutoName = entry.name === base ||
|
|
141
|
+
(entry.name.startsWith(`${base}_`) && /^\d+$/.test(entry.name.slice(base.length + 1)));
|
|
142
|
+
if (!isAutoName)
|
|
143
|
+
return;
|
|
144
|
+
const derived = slugify(label);
|
|
145
|
+
if (!derived || derived === entry.name)
|
|
146
|
+
return;
|
|
147
|
+
if (view.entries.some((e, i) => i !== idx && e.name === derived))
|
|
148
|
+
return;
|
|
149
|
+
const nextEntries = [...view.entries];
|
|
150
|
+
nextEntries[idx] = { ...entry, name: derived };
|
|
151
|
+
writeView({ shape: view.shape, entries: nextEntries });
|
|
152
|
+
onSelectionChange?.({ kind: 'field', id: derived, label: String(def.label ?? derived) });
|
|
153
|
+
};
|
|
154
|
+
const removeField = () => {
|
|
155
|
+
const nextEntries = view.entries.filter((_, i) => i !== idx);
|
|
156
|
+
writeView({ shape: view.shape, entries: nextEntries });
|
|
157
|
+
onClearSelection();
|
|
158
|
+
};
|
|
159
|
+
const duplicateField = () => {
|
|
160
|
+
// Clone the field below itself with a collision-free name and a
|
|
161
|
+
// "(copy)" label, then select the clone so it's ready to tweak.
|
|
162
|
+
const existing = new Set(view.entries.map((e) => e.name));
|
|
163
|
+
const base = `${entry.name}_copy`;
|
|
164
|
+
let name = base;
|
|
165
|
+
let n = 1;
|
|
166
|
+
while (existing.has(name)) {
|
|
167
|
+
n += 1;
|
|
168
|
+
name = `${base}_${n}`;
|
|
169
|
+
}
|
|
170
|
+
const labelStr = typeof def.label === 'string' && def.label ? def.label : '';
|
|
171
|
+
const clone = {
|
|
172
|
+
name,
|
|
173
|
+
def: { ...def, label: labelStr ? labelStr + tr('designer.field.copySuffix') : undefined },
|
|
174
|
+
};
|
|
175
|
+
const nextEntries = [...view.entries];
|
|
176
|
+
nextEntries.splice(idx + 1, 0, clone);
|
|
177
|
+
writeView({ shape: view.shape, entries: nextEntries });
|
|
178
|
+
onSelectionChange?.({ kind: 'field', id: name, label: String(clone.def.label ?? name) });
|
|
179
|
+
};
|
|
180
|
+
const moveTo = (toIndex) => {
|
|
181
|
+
const next = { shape: view.shape, entries: moveArray(view.entries, idx, toIndex) };
|
|
182
|
+
writeView(next);
|
|
183
|
+
// Keep selection on the moved field (its name is unchanged).
|
|
184
|
+
};
|
|
185
|
+
/* ─── Option editor ─── */
|
|
186
|
+
const options = readOptions(def);
|
|
187
|
+
const patchOptions = (next) => {
|
|
188
|
+
const clean = next.map((o) => {
|
|
189
|
+
const out = { value: o.value };
|
|
190
|
+
if (o.label)
|
|
191
|
+
out.label = o.label;
|
|
192
|
+
if (o.color)
|
|
193
|
+
out.color = o.color;
|
|
194
|
+
return out;
|
|
195
|
+
});
|
|
196
|
+
patchDef({ options: clean });
|
|
197
|
+
};
|
|
198
|
+
/* ─── Render ─── */
|
|
199
|
+
const headerActions = (_jsxs("div", { className: "flex items-center gap-1", children: [!readOnly && (_jsx(Button, { variant: "ghost", size: "sm", className: "h-7 w-7 p-0", onClick: duplicateField, title: tr('designer.field.duplicate'), "aria-label": tr('designer.field.duplicate'), children: _jsx(Copy, { className: "h-3.5 w-3.5" }) })), _jsx(InspectorReorderButtons, { index: idx, total: view.entries.length, onMove: moveTo, disabled: readOnly })] }));
|
|
200
|
+
const footer = (_jsx(InspectorRemoveButton, { label: tFormat('designer.field.remove', locale, {
|
|
201
|
+
label: typeof def.label === 'string' ? def.label : entry.name,
|
|
202
|
+
}), onClick: removeField, disabled: readOnly }));
|
|
203
|
+
const typeMetaLabel = isZh(locale) ? typeMeta?.labelZh : typeMeta?.label;
|
|
204
|
+
return (_jsxs(InspectorShell, { kindLabel: tr('designer.field.kind'), title: typeof def.label === 'string' && def.label ? def.label : entry.name, onClose: onClearSelection, closeLabel: tr('designer.field.close'), headerActions: headerActions, footer: footer, children: [_jsxs(Section, { title: tr('designer.field.section.basic'), children: [_jsx(InspectorTextField, { label: tr('designer.field.apiName'), value: entry.name, onCommit: setKey, disabled: readOnly, mono: true, testId: "field-apiname-input" }), _jsx(InspectorTextField, { label: tr('designer.field.label'), value: typeof def.label === 'string' ? def.label : '', onCommit: (v) => patchDef({ label: v }), onBlur: maybeDeriveName, disabled: readOnly, testId: "field-label-input" }), _jsx(InspectorSelectField, { label: tr('designer.field.type'), value: type, options: typeOptions, onCommit: (v) => patchDef({ type: v }), disabled: readOnly }), _jsxs("div", { className: "flex items-center gap-4 pt-1", children: [_jsx(InspectorCheckboxField, { label: tr('designer.field.required'), value: !!def.required, onCommit: (v) => patchDef({ required: v || undefined }), disabled: readOnly }), _jsx(InspectorCheckboxField, { label: tr('designer.field.unique'), value: !!def.unique, onCommit: (v) => patchDef({ unique: v || undefined }), disabled: readOnly })] }), _jsx(TextareaField, { label: tr('designer.field.description'), value: typeof def.description === 'string' ? def.description : '', onCommit: (v) => patchDef({ description: v || undefined }), disabled: readOnly, rows: 2 }), defaultValueKind(type) && (_jsx(DefaultValueField, { kind: defaultValueKind(type), value: def.defaultValue, options: options, onCommit: (v) => patchDef({ defaultValue: v }), disabled: readOnly, locale: locale })), _jsx(TextareaField, { label: tr('designer.field.helpText'), value: typeof def.inlineHelpText === 'string' ? def.inlineHelpText : '', onCommit: (v) => patchDef({ inlineHelpText: v || undefined }), disabled: readOnly, rows: 2, placeholder: tr('designer.field.helpTextPlaceholder') })] }), (isPicklist(type) || isLookup(type) || isComputed(type) || isNumeric(type) || isTexty(type)) && (_jsxs(Section, { title: tFormat('designer.field.section.options', locale, { type: typeMetaLabel ?? type }), children: [isPicklist(type) && (_jsx(OptionsEditor, { options: options, onChange: patchOptions, disabled: readOnly, locale: locale }, entry.name)), isLookup(type) && (_jsxs(_Fragment, { children: [_jsx(ObjectPicker, { label: tr('designer.field.relatedObject'), value: typeof def.reference === 'string' ? def.reference : '', options: objectOptions, onCommit: (v) => patchDef({ reference: v || undefined }), disabled: readOnly, placeholder: tr('designer.field.objectNamePlaceholder') }), _jsx(InspectorTextField, { label: tr('designer.field.relationshipName'), value: typeof def.relationshipName === 'string' ? def.relationshipName : '', onCommit: (v) => patchDef({ relationshipName: v || undefined }), disabled: readOnly, placeholder: tr('designer.field.relationshipNameHint') }), _jsx(LookupConfigFields, { def: def, patchDef: patchDef, hostFieldNames: view.entries.map((e) => e.name).filter((n) => n !== entry.name), readOnly: readOnly, locale: locale })] })), isComputed(type) && (_jsx(TextareaField, { label: tr('designer.field.formula'), value: typeof def.formula === 'string' ? def.formula : '', onCommit: (v) => patchDef({ formula: v || undefined }), disabled: readOnly, rows: 4, mono: true, placeholder: "record.amount * 0.2" })), isNumeric(type) && (_jsxs("div", { className: "grid grid-cols-2 gap-2", children: [_jsx(InspectorNumberField, { label: tr('designer.field.precision'), value: typeof def.precision === 'number' ? def.precision : undefined, onCommit: (v) => patchDef({ precision: v }), disabled: readOnly }), _jsx(InspectorNumberField, { label: tr('designer.field.scale'), value: typeof def.scale === 'number' ? def.scale : undefined, onCommit: (v) => patchDef({ scale: v }), disabled: readOnly }), _jsx(InspectorNumberField, { label: tr('designer.field.min'), value: typeof def.min === 'number' ? def.min : undefined, onCommit: (v) => patchDef({ min: v }), disabled: readOnly }), _jsx(InspectorNumberField, { label: tr('designer.field.max'), value: typeof def.max === 'number' ? def.max : undefined, onCommit: (v) => patchDef({ max: v }), disabled: readOnly })] })), isTexty(type) && (_jsxs("div", { className: "grid grid-cols-2 gap-2", children: [_jsx(InspectorNumberField, { label: tr('designer.field.minLength'), value: typeof def.minLength === 'number' ? def.minLength : undefined, onCommit: (v) => patchDef({ minLength: v }), disabled: readOnly, placeholder: "0" }), _jsx(InspectorNumberField, { label: tr('designer.field.maxLength'), value: typeof def.maxLength === 'number' ? def.maxLength : undefined, onCommit: (v) => patchDef({ maxLength: v }), disabled: readOnly, placeholder: "255" })] }))] })), _jsxs(Section, { title: tr('designer.field.section.advanced'), children: [_jsxs("div", { className: "grid grid-cols-2 gap-2", children: [_jsx(InspectorCheckboxField, { label: tr('designer.field.readonly'), value: !!def.readonly, onCommit: (v) => patchDef({ readonly: v || undefined }), disabled: readOnly }), _jsx(InspectorCheckboxField, { label: tr('designer.field.hidden'), value: !!def.hidden, onCommit: (v) => patchDef({ hidden: v || undefined }), disabled: readOnly }), _jsx(InspectorCheckboxField, { label: tr('designer.field.indexed'), value: !!def.indexed, onCommit: (v) => patchDef({ indexed: v || undefined }), disabled: readOnly }), _jsx(InspectorCheckboxField, { label: tr('designer.field.externalId'), value: !!def.externalId, onCommit: (v) => patchDef({ externalId: v || undefined }), disabled: readOnly }), _jsx(InspectorCheckboxField, { label: tr('designer.field.trackHistory'), value: !!def.trackHistory, onCommit: (v) => patchDef({ trackHistory: v || undefined }), disabled: readOnly })] }), _jsx(InspectorTextField, { label: tr('designer.field.placeholder'), value: typeof def.placeholder === 'string' ? def.placeholder : '', onCommit: (v) => patchDef({ placeholder: v || undefined }), disabled: readOnly }), _jsxs("div", { className: "space-y-1", children: [_jsx(InspectorTextField, { label: tr('designer.field.conditionalRequired'), value: typeof def.conditionalRequired === 'string' ? def.conditionalRequired : '', onCommit: (v) => patchDef({ conditionalRequired: v || undefined }), disabled: readOnly, mono: true, placeholder: "record.status == 'closed'" }), _jsx("p", { className: "text-[11px] text-muted-foreground/80 px-0.5 leading-snug", children: tr('designer.field.conditionalRequiredHint') })] }), fieldGroups.length > 0 && (_jsx(InspectorSelectField, { label: tr('designer.field.group'), value: typeof def.group === 'string' ? def.group : '', options: [
|
|
205
|
+
{ value: '', label: tr('designer.field.noGroup') },
|
|
206
|
+
...fieldGroups
|
|
207
|
+
.filter((g) => typeof g.key === 'string')
|
|
208
|
+
.map((g) => ({ value: g.key, label: String(g.label ?? g.key) })),
|
|
209
|
+
], onCommit: (v) => patchDef({ group: v || undefined }), disabled: readOnly }))] })] }));
|
|
210
|
+
}
|
|
211
|
+
/* ─────────────── Sub-components ─────────────── */
|
|
212
|
+
function Section({ title, children }) {
|
|
213
|
+
return (_jsxs("div", { className: "space-y-2", children: [_jsx("div", { className: "text-[10px] font-semibold uppercase tracking-wider text-muted-foreground border-b pb-1", children: title }), _jsx("div", { className: "space-y-2", children: children })] }));
|
|
214
|
+
}
|
|
215
|
+
/** Type-aware default-value editor. Stores the literal on `Field.defaultValue`. */
|
|
216
|
+
function DefaultValueField({ kind, value, options, onCommit, disabled, locale, }) {
|
|
217
|
+
const label = t('designer.field.defaultValue', locale);
|
|
218
|
+
const none = t('designer.field.defaultNone', locale);
|
|
219
|
+
if (kind === 'bool') {
|
|
220
|
+
const cur = value === true ? 'true' : value === false ? 'false' : '';
|
|
221
|
+
return (_jsx(InspectorSelectField, { label: label, value: cur, options: [
|
|
222
|
+
{ value: '', label: none },
|
|
223
|
+
{ value: 'true', label: t('designer.field.true', locale) },
|
|
224
|
+
{ value: 'false', label: t('designer.field.false', locale) },
|
|
225
|
+
], onCommit: (v) => onCommit(v === '' ? undefined : v === 'true'), disabled: disabled }));
|
|
226
|
+
}
|
|
227
|
+
if (kind === 'number') {
|
|
228
|
+
return (_jsx(InspectorNumberField, { label: label, value: typeof value === 'number' ? value : undefined, onCommit: (v) => onCommit(v), disabled: disabled }));
|
|
229
|
+
}
|
|
230
|
+
if (kind === 'picklist') {
|
|
231
|
+
return (_jsx(InspectorSelectField, { label: label, value: typeof value === 'string' ? value : '', options: [
|
|
232
|
+
{ value: '', label: none },
|
|
233
|
+
...options
|
|
234
|
+
.filter((o) => o.value)
|
|
235
|
+
.map((o) => ({ value: o.value, label: o.label || o.value })),
|
|
236
|
+
], onCommit: (v) => onCommit(v || undefined), disabled: disabled }));
|
|
237
|
+
}
|
|
238
|
+
return (_jsx(InspectorTextField, { label: label, value: typeof value === 'string' ? value : value == null ? '' : String(value), onCommit: (v) => onCommit(v || undefined), disabled: disabled }));
|
|
239
|
+
}
|
|
240
|
+
function TextareaField({ label, value, onCommit, disabled, rows = 2, mono, placeholder, }) {
|
|
241
|
+
return (_jsxs("div", { className: "space-y-1", children: [_jsx(Label, { className: "text-xs text-muted-foreground", children: label }), _jsx("textarea", { value: value, disabled: disabled, rows: rows, placeholder: placeholder, onChange: (e) => onCommit(e.target.value), className: 'w-full text-sm rounded-md border bg-background px-2 py-1.5 focus:outline-none focus:ring-1 focus:ring-primary ' +
|
|
242
|
+
(mono ? 'font-mono text-xs ' : '') })] }));
|
|
243
|
+
}
|
|
244
|
+
function ObjectPicker({ label, value, options, onCommit, disabled, placeholder, }) {
|
|
245
|
+
// List may be empty (still loading or no objects). Allow free-text fallback.
|
|
246
|
+
const listId = React.useId();
|
|
247
|
+
return (_jsxs("div", { className: "space-y-1", children: [_jsx(Label, { className: "text-xs text-muted-foreground", children: label }), _jsx(Input, { list: listId, value: value, onChange: (e) => onCommit(e.target.value), disabled: disabled, className: "h-8 text-sm font-mono", placeholder: placeholder ?? 'object_name' }), _jsx("datalist", { id: listId, children: options.map((o) => (_jsx("option", { value: o.value, children: o.label }, o.value))) })] }));
|
|
248
|
+
}
|
|
249
|
+
function OptionsEditor({ options, onChange, disabled, locale, }) {
|
|
250
|
+
// Local editing buffer. We keep a blank trailing row visible for input but
|
|
251
|
+
// only PERSIST rows whose `value` is non-empty — otherwise the blank row
|
|
252
|
+
// fails the spec identifier rule ("System identifier must be at least 2
|
|
253
|
+
// characters") and shows a confusing error mid-edit. The editor is remounted
|
|
254
|
+
// per field (key={entry.name}), so seeding from `options` once is correct.
|
|
255
|
+
const [rows, setRows] = React.useState(() => (options.length > 0 ? options : [{ value: '', label: '' }]));
|
|
256
|
+
const commit = (next) => {
|
|
257
|
+
setRows(next);
|
|
258
|
+
onChange(next.filter((o) => o.value.trim() !== ''));
|
|
259
|
+
};
|
|
260
|
+
const update = (i, patch) => {
|
|
261
|
+
const next = [...rows];
|
|
262
|
+
next[i] = { ...next[i], ...patch };
|
|
263
|
+
commit(next);
|
|
264
|
+
};
|
|
265
|
+
const remove = (i) => commit(rows.filter((_, j) => j !== i));
|
|
266
|
+
const move = (i, to) => commit(moveArray(rows, i, to));
|
|
267
|
+
const add = () => commit([...rows, { value: '', label: '' }]);
|
|
268
|
+
return (_jsxs("div", { className: "space-y-1.5", children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsx(Label, { className: "text-xs text-muted-foreground", children: t('designer.field.picklistValues', locale) }), _jsx(Badge, { variant: "outline", className: "text-[10px]", children: rows.length })] }), rows.length === 0 ? (_jsx("div", { className: "text-[11px] italic text-muted-foreground px-1", children: t('designer.field.noValues', locale) })) : (_jsx("div", { className: "space-y-1", children: rows.map((o, i) => (_jsxs("div", { className: "flex items-center gap-1", children: [_jsx(Input, { value: o.value, onChange: (e) => update(i, { value: e.target.value }), placeholder: t('designer.field.optValue', locale), disabled: disabled, className: "h-7 text-xs font-mono flex-1" }), _jsx(Input, { value: o.label ?? '', onChange: (e) => update(i, { label: e.target.value }), placeholder: t('designer.field.optLabel', locale), disabled: disabled, className: "h-7 text-xs flex-1" }), _jsx("input", { type: "color", value: o.color ?? '#cccccc', onChange: (e) => update(i, { color: e.target.value }), disabled: disabled, className: "h-7 w-7 rounded border bg-background cursor-pointer p-0.5", title: t('designer.field.optColor', locale) }), _jsx(Button, { variant: "ghost", size: "sm", className: "h-7 w-7 p-0", onClick: () => move(i, i - 1), disabled: disabled || i === 0, "aria-label": t('designer.field.moveUp', locale), children: _jsx(ArrowUp, { className: "h-3 w-3" }) }), _jsx(Button, { variant: "ghost", size: "sm", className: "h-7 w-7 p-0", onClick: () => move(i, i + 1), disabled: disabled || i === rows.length - 1, "aria-label": t('designer.field.moveDown', locale), children: _jsx(ArrowDown, { className: "h-3 w-3" }) }), _jsx(Button, { variant: "ghost", size: "sm", className: "h-7 w-7 p-0 text-destructive", onClick: () => remove(i), disabled: disabled, "aria-label": t('designer.field.removeValue', locale), children: _jsx(X, { className: "h-3 w-3" }) })] }, i))) })), !disabled && (_jsxs(Button, { variant: "outline", size: "sm", className: "h-7 gap-1 text-xs", onClick: add, children: [_jsx(Plus, { className: "h-3 w-3" }), t('designer.field.addValue', locale)] }))] }));
|
|
269
|
+
}
|
|
270
|
+
/* ─────────────── Lookup picker config (displayField / filters / dependent) ─────────────── */
|
|
271
|
+
const LOOKUP_OPERATORS = [
|
|
272
|
+
{ value: 'eq', label: '= equals' },
|
|
273
|
+
{ value: 'ne', label: '≠ not equals' },
|
|
274
|
+
{ value: 'gt', label: '> greater than' },
|
|
275
|
+
{ value: 'lt', label: '< less than' },
|
|
276
|
+
{ value: 'gte', label: '≥ at least' },
|
|
277
|
+
{ value: 'lte', label: '≤ at most' },
|
|
278
|
+
{ value: 'contains', label: 'contains' },
|
|
279
|
+
{ value: 'in', label: 'in (any of)' },
|
|
280
|
+
{ value: 'notIn', label: 'not in' },
|
|
281
|
+
];
|
|
282
|
+
function readLookupFilters(def) {
|
|
283
|
+
const raw = def.lookupFilters ?? def.lookup_filters;
|
|
284
|
+
return Array.isArray(raw) ? raw : [];
|
|
285
|
+
}
|
|
286
|
+
function readDependsOn(def) {
|
|
287
|
+
const raw = def.dependsOn ?? def.depends_on;
|
|
288
|
+
if (!Array.isArray(raw))
|
|
289
|
+
return [];
|
|
290
|
+
return raw
|
|
291
|
+
.map((d) => (typeof d === 'string' ? d : d && typeof d === 'object' ? d.field : undefined))
|
|
292
|
+
.filter((x) => !!x);
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* Lookup/master_detail picker configuration. Surfaces the parts that
|
|
296
|
+
* previously required hand-editing the raw JSON: which field labels each
|
|
297
|
+
* candidate (`displayField`/`descriptionField`), which records are even
|
|
298
|
+
* selectable (structured `lookupFilters` — the form the runtime LookupField
|
|
299
|
+
* actually honours, not the legacy `referenceFilters` strings), and
|
|
300
|
+
* dependent-lookup links to other fields on the same record (`dependsOn`).
|
|
301
|
+
* Every field choice is picked from the referenced object's live schema.
|
|
302
|
+
*/
|
|
303
|
+
function LookupConfigFields({ def, patchDef, hostFieldNames, readOnly, locale, }) {
|
|
304
|
+
const tr = (key) => t(key, locale);
|
|
305
|
+
const reference = typeof def.reference === 'string' ? def.reference : undefined;
|
|
306
|
+
const { fields: targetFields, loading } = useObjectFields(reference);
|
|
307
|
+
const fieldOptions = React.useMemo(() => targetFields.filter((f) => !f.hidden).map((f) => ({ value: f.name, label: f.label, hint: f.type })), [targetFields]);
|
|
308
|
+
const hostOptions = React.useMemo(() => hostFieldNames.map((n) => ({ value: n, label: n })), [hostFieldNames]);
|
|
309
|
+
const filters = readLookupFilters(def);
|
|
310
|
+
const dependsOn = readDependsOn(def);
|
|
311
|
+
const patchFilter = (i, patch) => patchDef({ lookupFilters: filters.map((f, idx) => (idx === i ? { ...f, ...patch } : f)) });
|
|
312
|
+
const addFilter = () => patchDef({ lookupFilters: [...filters, { field: '', operator: 'eq', value: '' }] });
|
|
313
|
+
const removeFilter = (i) => {
|
|
314
|
+
const next = filters.filter((_, idx) => idx !== i);
|
|
315
|
+
patchDef({ lookupFilters: next.length ? next : undefined });
|
|
316
|
+
};
|
|
317
|
+
// `in` / `notIn` take a list; everything else a scalar. Keep the editor a
|
|
318
|
+
// single text input and (de)serialize the list form at the boundary.
|
|
319
|
+
const valueToText = (v) => (Array.isArray(v) ? v.join(', ') : v == null ? '' : String(v));
|
|
320
|
+
const textToValue = (op, s) => op === 'in' || op === 'notIn' ? s.split(',').map((x) => x.trim()).filter(Boolean) : s;
|
|
321
|
+
const addDependsOn = (name) => {
|
|
322
|
+
if (!name || dependsOn.includes(name))
|
|
323
|
+
return;
|
|
324
|
+
patchDef({ dependsOn: [...dependsOn, name] });
|
|
325
|
+
};
|
|
326
|
+
const removeDependsOn = (name) => {
|
|
327
|
+
const next = dependsOn.filter((n) => n !== name);
|
|
328
|
+
patchDef({ dependsOn: next.length ? next : undefined });
|
|
329
|
+
};
|
|
330
|
+
const displayField = typeof def.displayField === 'string' ? def.displayField : '';
|
|
331
|
+
const descriptionField = typeof def.descriptionField === 'string' ? def.descriptionField : '';
|
|
332
|
+
const pageSize = typeof def.lookupPageSize === 'number' ? def.lookupPageSize : undefined;
|
|
333
|
+
const allowCreate = def.allowCreate === true;
|
|
334
|
+
const fieldPlaceholder = reference ? tr('designer.field.lookup.selectField') : tr('designer.field.lookup.setTargetFirst');
|
|
335
|
+
return (_jsxs("div", { className: "space-y-2 border-t pt-2.5", children: [_jsx("div", { className: "text-[11px] font-medium text-muted-foreground", children: tr('designer.field.lookup.pickerConfig') }), _jsx(InspectorComboField, { label: tr('designer.field.lookup.displayField'), value: displayField, onCommit: (v) => patchDef({ displayField: v || undefined }), options: fieldOptions, loading: loading, placeholder: fieldPlaceholder, searchPlaceholder: tr('designer.field.lookup.searchFields'), disabled: readOnly, mono: true }), _jsx(InspectorComboField, { label: tr('designer.field.lookup.descriptionField'), value: descriptionField, onCommit: (v) => patchDef({ descriptionField: v || undefined }), options: fieldOptions, loading: loading, placeholder: fieldPlaceholder, searchPlaceholder: tr('designer.field.lookup.searchFields'), disabled: readOnly, mono: true }), _jsxs("div", { className: "space-y-1.5 pt-1", children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsxs("div", { className: "flex items-center gap-1.5", children: [_jsx(Label, { className: "text-xs text-muted-foreground", children: tr('designer.field.lookup.selectableRecords') }), _jsx(Badge, { variant: "outline", className: "text-[10px]", children: filters.length })] }), !readOnly && (_jsxs(Button, { type: "button", variant: "ghost", size: "sm", className: "h-6 gap-1 px-1.5 text-[11px]", onClick: addFilter, children: [_jsx(Plus, { className: "h-3 w-3" }), " ", tr('designer.field.lookup.addFilter')] }))] }), filters.length === 0 ? (_jsx("p", { className: "rounded-md border border-dashed bg-muted/30 px-3 py-2 text-center text-[11px] text-muted-foreground", children: tFormat('designer.field.lookup.noFilter', locale, { ref: reference || 'related' }) })) : (filters.map((f, i) => (_jsxs("div", { className: "rounded-md border p-2 space-y-1.5", children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsx("span", { className: "text-[11px] text-muted-foreground", children: tFormat('designer.field.lookup.filterN', locale, { n: i + 1 }) }), !readOnly && (_jsx(Button, { type: "button", variant: "ghost", size: "sm", "aria-label": tr('designer.field.lookup.removeFilter'), className: "h-6 w-6 p-0 text-muted-foreground hover:text-destructive", onClick: () => removeFilter(i), children: _jsx(X, { className: "h-3.5 w-3.5" }) }))] }), _jsx(InspectorComboField, { label: tr('designer.field.lookup.filterField'), value: f.field ?? '', onCommit: (v) => patchFilter(i, { field: v }), options: fieldOptions, loading: loading, placeholder: fieldPlaceholder, searchPlaceholder: tr('designer.field.lookup.searchFields'), disabled: readOnly, mono: true }), _jsx(InspectorSelectField, { label: tr('designer.field.lookup.filterOperator'), value: f.operator ?? 'eq', options: LOOKUP_OPERATORS, onCommit: (v) => patchFilter(i, { operator: v }), disabled: readOnly }), _jsx(InspectorTextField, { label: tr('designer.field.lookup.filterValue'), value: valueToText(f.value), onCommit: (v) => patchFilter(i, { value: textToValue(f.operator, v) }), placeholder: f.operator === 'in' || f.operator === 'notIn' ? 'comma,separated,values' : 'value', disabled: readOnly, mono: true })] }, i))))] }), _jsxs("div", { className: "space-y-1.5 pt-1", children: [_jsx(Label, { className: "text-xs text-muted-foreground", children: tr('designer.field.lookup.dependsOn') }), dependsOn.length > 0 && (_jsx("div", { className: "flex flex-wrap gap-1", children: dependsOn.map((n) => (_jsxs("span", { className: "inline-flex items-center gap-1 rounded bg-secondary px-2 py-0.5 text-[11px] font-mono", children: [n, !readOnly && (_jsx("button", { type: "button", className: "text-muted-foreground hover:text-foreground", onClick: () => removeDependsOn(n), "aria-label": `Remove ${n}`, children: "\u00D7" }))] }, n))) })), !readOnly && hostOptions.length > 0 && (_jsx(InspectorComboField, { value: "", onCommit: (v) => addDependsOn(v), options: hostOptions.filter((o) => !dependsOn.includes(o.value)), placeholder: tr('designer.field.lookup.addDependsOn'), searchPlaceholder: tr('designer.field.lookup.searchHostFields'), disabled: readOnly, allowCustom: false, mono: true }))] }), _jsxs("div", { className: "grid grid-cols-2 gap-2 pt-1", children: [_jsx(InspectorNumberField, { label: tr('designer.field.lookup.pageSize'), value: pageSize, onCommit: (v) => patchDef({ lookupPageSize: v }), placeholder: "10", disabled: readOnly }), _jsx("div", { className: "flex items-end pb-1.5", children: _jsx(InspectorCheckboxField, { label: tr('designer.field.lookup.allowCreate'), value: allowCreate, onCommit: (v) => patchDef({ allowCreate: v || undefined }), disabled: readOnly }) })] })] }));
|
|
336
|
+
}
|
|
337
|
+
/* ─────────────── Hook: load object list for lookup picker ─────────────── */
|
|
338
|
+
function useObjectOptions() {
|
|
339
|
+
const client = useMetadataClient();
|
|
340
|
+
const [opts, setOpts] = React.useState([]);
|
|
341
|
+
React.useEffect(() => {
|
|
342
|
+
let cancelled = false;
|
|
343
|
+
client
|
|
344
|
+
.list('object')
|
|
345
|
+
.then((items) => {
|
|
346
|
+
if (cancelled)
|
|
347
|
+
return;
|
|
348
|
+
const mapped = items
|
|
349
|
+
.filter((i) => typeof i?.name === 'string' && i.name)
|
|
350
|
+
.map((i) => ({
|
|
351
|
+
value: i.name,
|
|
352
|
+
label: i.label ? `${i.label} (${i.name})` : i.name,
|
|
353
|
+
}))
|
|
354
|
+
.sort((a, b) => a.value.localeCompare(b.value));
|
|
355
|
+
setOpts(mapped);
|
|
356
|
+
})
|
|
357
|
+
.catch(() => {
|
|
358
|
+
// Empty list — picker falls back to free-text. No banner needed.
|
|
359
|
+
});
|
|
360
|
+
return () => {
|
|
361
|
+
cancelled = true;
|
|
362
|
+
};
|
|
363
|
+
}, [client]);
|
|
364
|
+
return opts;
|
|
365
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PageBlockInspector — scoped editor for the selected page block /
|
|
3
|
+
* component subtree.
|
|
4
|
+
*
|
|
5
|
+
* Selection shape: { kind: 'block', id: 'children[i]' | 'children[i].children[j]' | … }
|
|
6
|
+
*
|
|
7
|
+
* A Page schema is a SDUI tree; "blocks" are children nodes. The id
|
|
8
|
+
* is a dotted path of `children[i]` hops, identical in spirit to
|
|
9
|
+
* AppNavInspector but always rooted at top-level `children`.
|
|
10
|
+
*/
|
|
11
|
+
import * as React from 'react';
|
|
12
|
+
import type { MetadataInspectorProps } from '../inspector-registry';
|
|
13
|
+
interface Block {
|
|
14
|
+
type?: string;
|
|
15
|
+
id?: string;
|
|
16
|
+
className?: string;
|
|
17
|
+
hidden?: string;
|
|
18
|
+
children?: Block[];
|
|
19
|
+
[k: string]: unknown;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* A path hop. `index < 0` means a plain object-property access (e.g.
|
|
23
|
+
* `properties`); `index >= 0` adds an array index after the key (e.g.
|
|
24
|
+
* `items[0]`). Supporting object hops lets us address nested container
|
|
25
|
+
* children at `…components[0].properties.items[0].children[0]` (issue #1499).
|
|
26
|
+
*/
|
|
27
|
+
type Hop = {
|
|
28
|
+
key: string;
|
|
29
|
+
index: number;
|
|
30
|
+
};
|
|
31
|
+
export type PathSeg = string | number;
|
|
32
|
+
/** A segment is `key` (object) or `key[i]` (array). */
|
|
33
|
+
export declare function parsePath(id: string): Hop[] | null;
|
|
34
|
+
/** Flatten hops to a JSON-pointer-like path: object key, then index if any. */
|
|
35
|
+
export declare function hopsToPath(hops: Hop[]): PathSeg[];
|
|
36
|
+
export declare function getByPath(root: any, path: PathSeg[]): any;
|
|
37
|
+
/** Immutable set/remove along a path. `value === REMOVE` deletes the leaf. */
|
|
38
|
+
export declare function setByPath(root: any, path: PathSeg[], value: any): any;
|
|
39
|
+
export declare function readAt(root: Record<string, unknown>, hops: Hop[]): Block | null;
|
|
40
|
+
/** Returns a shallow patch `{ [topKey]: newValue }` for onPatch. */
|
|
41
|
+
export declare function writeAt(root: Record<string, unknown>, hops: Hop[], replacement: Block | null): Record<string, unknown>;
|
|
42
|
+
export declare function readSiblings(root: Record<string, unknown>, hops: Hop[]): {
|
|
43
|
+
siblings: Block[];
|
|
44
|
+
index: number;
|
|
45
|
+
} | null;
|
|
46
|
+
export declare function writeSiblings(root: Record<string, unknown>, hops: Hop[], nextSiblings: Block[]): Record<string, unknown>;
|
|
47
|
+
export declare function PageBlockInspector({ selection, draft, onPatch, onClearSelection, onSelectionChange, locale, readOnly }: MetadataInspectorProps): React.JSX.Element;
|
|
48
|
+
export {};
|