@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,171 @@
|
|
|
1
|
+
// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.
|
|
2
|
+
/** Set of types the designer can edit losslessly. Keep in sync with FieldDesigner. */
|
|
3
|
+
const DESIGNER_TYPES = new Set([
|
|
4
|
+
'text',
|
|
5
|
+
'textarea',
|
|
6
|
+
'number',
|
|
7
|
+
'boolean',
|
|
8
|
+
'date',
|
|
9
|
+
'datetime',
|
|
10
|
+
'time',
|
|
11
|
+
'select',
|
|
12
|
+
'email',
|
|
13
|
+
'phone',
|
|
14
|
+
'url',
|
|
15
|
+
'password',
|
|
16
|
+
'currency',
|
|
17
|
+
'percent',
|
|
18
|
+
'lookup',
|
|
19
|
+
'formula',
|
|
20
|
+
'autonumber',
|
|
21
|
+
'file',
|
|
22
|
+
'image',
|
|
23
|
+
'markdown',
|
|
24
|
+
'html',
|
|
25
|
+
'color',
|
|
26
|
+
'code',
|
|
27
|
+
'location',
|
|
28
|
+
'address',
|
|
29
|
+
'rating',
|
|
30
|
+
'slider',
|
|
31
|
+
]);
|
|
32
|
+
/** Try to map a framework field type to a designer type; null if unsupported. */
|
|
33
|
+
function mapFrameworkToDesignerType(t) {
|
|
34
|
+
if (!t)
|
|
35
|
+
return null;
|
|
36
|
+
if (DESIGNER_TYPES.has(t))
|
|
37
|
+
return t;
|
|
38
|
+
// Best-effort fallbacks for the most common "close cousin" types.
|
|
39
|
+
switch (t) {
|
|
40
|
+
case 'richtext':
|
|
41
|
+
return 'html';
|
|
42
|
+
case 'toggle':
|
|
43
|
+
return 'boolean';
|
|
44
|
+
case 'multiselect':
|
|
45
|
+
case 'checkboxes':
|
|
46
|
+
case 'radio':
|
|
47
|
+
return 'select';
|
|
48
|
+
case 'master_detail':
|
|
49
|
+
case 'tree':
|
|
50
|
+
return 'lookup';
|
|
51
|
+
default:
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
export function bridgeFromDraft(fieldsInput) {
|
|
56
|
+
const preserved = new Map();
|
|
57
|
+
const designerFields = [];
|
|
58
|
+
const originalOrder = [];
|
|
59
|
+
if (!fieldsInput || typeof fieldsInput !== 'object') {
|
|
60
|
+
return { designerFields, preserved, inputShape: 'record', originalOrder };
|
|
61
|
+
}
|
|
62
|
+
const isArray = Array.isArray(fieldsInput);
|
|
63
|
+
const inputShape = isArray ? 'array' : 'record';
|
|
64
|
+
const entries = isArray
|
|
65
|
+
? fieldsInput.map((def, i) => [
|
|
66
|
+
String(def?.name ?? `field_${i + 1}`),
|
|
67
|
+
def,
|
|
68
|
+
])
|
|
69
|
+
: Object.entries(fieldsInput);
|
|
70
|
+
for (const [name, def] of entries) {
|
|
71
|
+
originalOrder.push(name);
|
|
72
|
+
const mapped = mapFrameworkToDesignerType(def?.type);
|
|
73
|
+
if (mapped === null) {
|
|
74
|
+
// Quarantine — preserve as-is, do not surface in the designer.
|
|
75
|
+
preserved.set(name, def);
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
78
|
+
designerFields.push({
|
|
79
|
+
id: name, // FieldDesigner uses id as React key; using `name` is stable across edits.
|
|
80
|
+
name,
|
|
81
|
+
label: String(def?.label ?? name),
|
|
82
|
+
type: mapped,
|
|
83
|
+
required: !!def?.required,
|
|
84
|
+
unique: !!def?.unique,
|
|
85
|
+
readonly: !!def?.readonly,
|
|
86
|
+
hidden: !!def?.hidden,
|
|
87
|
+
description: typeof def?.description === 'string' ? def.description : undefined,
|
|
88
|
+
defaultValue: def?.default,
|
|
89
|
+
placeholder: typeof def?.placeholder === 'string' ? def.placeholder : undefined,
|
|
90
|
+
group: typeof def?.group === 'string' ? def.group : undefined,
|
|
91
|
+
options: Array.isArray(def?.options)
|
|
92
|
+
? def.options.map((o) => ({
|
|
93
|
+
label: String(o.label ?? o.value),
|
|
94
|
+
value: String(o.value),
|
|
95
|
+
color: o.color,
|
|
96
|
+
}))
|
|
97
|
+
: undefined,
|
|
98
|
+
referenceTo: typeof def?.reference === 'string' ? def.reference : undefined,
|
|
99
|
+
formula: typeof def?.formula === 'string' ? def.formula : undefined,
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
return { designerFields, preserved, inputShape, originalOrder };
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Reassemble the framework-shape fields record from designer output.
|
|
106
|
+
* Preserved fields are spliced back in their original order. Newly
|
|
107
|
+
* added fields land at the end.
|
|
108
|
+
*/
|
|
109
|
+
export function commitToDraft(designerFields, prev) {
|
|
110
|
+
const designerByName = new Map();
|
|
111
|
+
for (const f of designerFields)
|
|
112
|
+
designerByName.set(f.name, f);
|
|
113
|
+
const writeName = (name, target) => {
|
|
114
|
+
const preserved = prev.preserved.get(name);
|
|
115
|
+
if (preserved) {
|
|
116
|
+
target[name] = preserved;
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
const f = designerByName.get(name);
|
|
120
|
+
if (f) {
|
|
121
|
+
target[name] = serializeDesignerField(f);
|
|
122
|
+
}
|
|
123
|
+
};
|
|
124
|
+
const result = {};
|
|
125
|
+
// First emit fields in their original order to preserve user-visible
|
|
126
|
+
// ordering and keep diff noise low for unchanged drafts.
|
|
127
|
+
for (const name of prev.originalOrder) {
|
|
128
|
+
if (designerByName.has(name) || prev.preserved.has(name)) {
|
|
129
|
+
writeName(name, result);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
// Then append any newly added designer fields (not in originalOrder).
|
|
133
|
+
for (const f of designerFields) {
|
|
134
|
+
if (!prev.originalOrder.includes(f.name)) {
|
|
135
|
+
result[f.name] = serializeDesignerField(f);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
if (prev.inputShape === 'array') {
|
|
139
|
+
return Object.entries(result).map(([name, def]) => ({ name, ...def }));
|
|
140
|
+
}
|
|
141
|
+
return result;
|
|
142
|
+
}
|
|
143
|
+
function serializeDesignerField(f) {
|
|
144
|
+
const out = {
|
|
145
|
+
type: f.type,
|
|
146
|
+
label: f.label,
|
|
147
|
+
};
|
|
148
|
+
if (f.required)
|
|
149
|
+
out.required = true;
|
|
150
|
+
if (f.unique)
|
|
151
|
+
out.unique = true;
|
|
152
|
+
if (f.readonly)
|
|
153
|
+
out.readonly = true;
|
|
154
|
+
if (f.hidden)
|
|
155
|
+
out.hidden = true;
|
|
156
|
+
if (f.description)
|
|
157
|
+
out.description = f.description;
|
|
158
|
+
if (f.defaultValue !== undefined)
|
|
159
|
+
out.default = f.defaultValue;
|
|
160
|
+
if (f.placeholder)
|
|
161
|
+
out.placeholder = f.placeholder;
|
|
162
|
+
if (f.group)
|
|
163
|
+
out.group = f.group;
|
|
164
|
+
if (f.options && f.options.length > 0)
|
|
165
|
+
out.options = f.options;
|
|
166
|
+
if (f.referenceTo)
|
|
167
|
+
out.reference = f.referenceTo;
|
|
168
|
+
if (f.formula)
|
|
169
|
+
out.formula = f.formula;
|
|
170
|
+
return out;
|
|
171
|
+
}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Field-IO helpers for the form-designer canvas + inspector.
|
|
3
|
+
*
|
|
4
|
+
* `draft.fields` can be either an array `[{name, ...def}, …]` (the
|
|
5
|
+
* legacy / objectql shape) or a record `{name: def, …}` (the spec
|
|
6
|
+
* shape used in `*.object.ts`). This module reads/writes both shapes
|
|
7
|
+
* transparently and preserves arbitrary unknown properties on each
|
|
8
|
+
* field — the inspector only edits the keys it knows about.
|
|
9
|
+
*
|
|
10
|
+
* Field reorders / inserts / removes are performed on a normalized
|
|
11
|
+
* ordered list and serialized back to the input shape, so round-trips
|
|
12
|
+
* are non-destructive.
|
|
13
|
+
*/
|
|
14
|
+
import type { FieldTypeId } from './field-types';
|
|
15
|
+
export type Shape = 'array' | 'record';
|
|
16
|
+
export interface FieldEntry {
|
|
17
|
+
/** Canonical snake_case key. */
|
|
18
|
+
name: string;
|
|
19
|
+
/** Raw framework field definition (label, type, options, …). */
|
|
20
|
+
def: Record<string, unknown>;
|
|
21
|
+
}
|
|
22
|
+
export interface FieldsView {
|
|
23
|
+
shape: Shape;
|
|
24
|
+
entries: FieldEntry[];
|
|
25
|
+
}
|
|
26
|
+
/** Read draft.fields into a normalized ordered list. */
|
|
27
|
+
export declare function readFields(fieldsInput: unknown): FieldsView;
|
|
28
|
+
/** Serialize the ordered list back to the original shape. */
|
|
29
|
+
export declare function writeFields(view: FieldsView): Record<string, unknown> | Array<Record<string, unknown>>;
|
|
30
|
+
/** Find the index of a field by name. Returns -1 if not found. */
|
|
31
|
+
export declare function indexOfField(view: FieldsView, name: string): number;
|
|
32
|
+
/** Build a fresh field definition for the given type. */
|
|
33
|
+
export declare function newField(name: string, type: FieldTypeId, label?: string): FieldEntry;
|
|
34
|
+
/** Convert a snake_case name to a human-friendly Title Case label. */
|
|
35
|
+
export declare function toLabel(name: string): string;
|
|
36
|
+
/** Normalize an arbitrary string into a valid snake_case field name. */
|
|
37
|
+
export declare function toFieldName(raw: string): string;
|
|
38
|
+
/**
|
|
39
|
+
* Prefix-stable variant of {@link toFieldName} for *live keystroke* input.
|
|
40
|
+
*
|
|
41
|
+
* The strict `toFieldName` trims a trailing `_`, which makes it impossible
|
|
42
|
+
* to TYPE a multi-word identifier into a controlled input: the field's
|
|
43
|
+
* `onChange` re-normalizes on every keystroke, so the instant the user
|
|
44
|
+
* presses `_` the value is `"repair_"` -> trimmed to `"repair"` -> the
|
|
45
|
+
* underscore vanishes before the next letter arrives, yielding
|
|
46
|
+
* `"repairticket"` instead of `"repair_ticket"`. (Authors of non-Latin
|
|
47
|
+
* locales hit this hardest: their label cannot derive a Latin slug, so
|
|
48
|
+
* they MUST type the identifier by hand.)
|
|
49
|
+
*
|
|
50
|
+
* This variant keeps a single trailing `_` so typing can continue, and
|
|
51
|
+
* returns `''` (not the `'field'` placeholder) on empty input so clearing
|
|
52
|
+
* the box actually clears it. A trailing `_` is itself a valid identifier
|
|
53
|
+
* per the spec ("starts with a letter, may contain letters/digits/`_`"),
|
|
54
|
+
* so no separate commit-time trim is required for correctness; callers
|
|
55
|
+
* that need a canonical form for a *complete* string (label->name
|
|
56
|
+
* derivation, group keys) should keep using strict `toFieldName`.
|
|
57
|
+
*/
|
|
58
|
+
export declare function toFieldNameLoose(raw: string): string;
|
|
59
|
+
/**
|
|
60
|
+
* A declared field group (a.k.a. "section"). Lives at the object's
|
|
61
|
+
* top level as `draft.fieldGroups`; individual fields opt into a group
|
|
62
|
+
* via `Field.group === FieldGroup.key`.
|
|
63
|
+
*/
|
|
64
|
+
export interface FieldGroup {
|
|
65
|
+
key: string;
|
|
66
|
+
label: string;
|
|
67
|
+
}
|
|
68
|
+
/** Read `draft.fieldGroups` into a normalized, well-typed list. */
|
|
69
|
+
export declare function readGroups(fieldGroupsInput: unknown): FieldGroup[];
|
|
70
|
+
/**
|
|
71
|
+
* Derive a unique snake_case group key from a human label, avoiding
|
|
72
|
+
* collisions with `existing` keys. Falls back to `group` / `group_N`.
|
|
73
|
+
*/
|
|
74
|
+
export declare function genGroupKey(label: string, existing: string[]): string;
|
|
75
|
+
/** Append a new group with a unique key derived from `label`. */
|
|
76
|
+
export declare function addGroup(groups: FieldGroup[], label: string): FieldGroup[];
|
|
77
|
+
/** Rename a group's label in place (key is stable). */
|
|
78
|
+
export declare function renameGroup(groups: FieldGroup[], key: string, label: string): FieldGroup[];
|
|
79
|
+
/** Remove a group declaration (callers should also clear members' `group`). */
|
|
80
|
+
export declare function removeGroup(groups: FieldGroup[], key: string): FieldGroup[];
|
|
81
|
+
/** Move a group one slot up (-1) or down (+1), clamped to bounds. */
|
|
82
|
+
export declare function moveGroup(groups: FieldGroup[], key: string, dir: -1 | 1): FieldGroup[];
|
|
83
|
+
/** Strip `group === key` from every field (used after removing a group). */
|
|
84
|
+
export declare function clearFieldGroup(view: FieldsView, key: string): FieldsView;
|
|
85
|
+
/** Generic immutable array move helper (also used by group reorder). */
|
|
86
|
+
export declare function moveArray<T>(arr: T[], from: number, to: number): T[];
|
|
87
|
+
/**
|
|
88
|
+
* Group entries by their `group` property, in `fieldGroups[]` order.
|
|
89
|
+
* Fields with no group (or a group not declared in fieldGroups) land
|
|
90
|
+
* in a trailing "Ungrouped" bucket.
|
|
91
|
+
*
|
|
92
|
+
* By default empty *declared* groups are dropped to avoid chrome noise
|
|
93
|
+
* (read-only / preview). Pass `includeEmptyDeclared` while editing so a
|
|
94
|
+
* freshly-added, still-empty section stays visible as a drop target.
|
|
95
|
+
*/
|
|
96
|
+
export interface GroupedEntries {
|
|
97
|
+
key: string | null;
|
|
98
|
+
label: string;
|
|
99
|
+
entries: FieldEntry[];
|
|
100
|
+
}
|
|
101
|
+
export declare function groupEntries(view: FieldsView, fieldGroups: Array<{
|
|
102
|
+
key?: string;
|
|
103
|
+
label?: string;
|
|
104
|
+
}> | undefined, opts?: {
|
|
105
|
+
includeEmptyDeclared?: boolean;
|
|
106
|
+
}): GroupedEntries[];
|
|
107
|
+
export type FieldDiffStatus = 'added' | 'removed' | 'changed' | 'unchanged';
|
|
108
|
+
export interface FieldDiffEntry {
|
|
109
|
+
name: string;
|
|
110
|
+
status: FieldDiffStatus;
|
|
111
|
+
/** Sorted def keys that differ (only for `changed`). */
|
|
112
|
+
changedKeys: string[];
|
|
113
|
+
}
|
|
114
|
+
export interface FieldsDiff {
|
|
115
|
+
/** Per current-field status, keyed by field name. */
|
|
116
|
+
byName: Record<string, FieldDiffEntry>;
|
|
117
|
+
/** Baseline fields absent from the current draft (rendered as ghosts). */
|
|
118
|
+
removed: FieldEntry[];
|
|
119
|
+
counts: {
|
|
120
|
+
added: number;
|
|
121
|
+
changed: number;
|
|
122
|
+
removed: number;
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Diff the current `fields` against a `baseline` (e.g. the last published
|
|
127
|
+
* version). Drives the canvas review mode: added / changed / removed
|
|
128
|
+
* per field. Shape-agnostic — both inputs are read via {@link readFields}.
|
|
129
|
+
*/
|
|
130
|
+
export declare function diffFields(baselineInput: unknown, currentInput: unknown): FieldsDiff;
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.
|
|
2
|
+
/** Read draft.fields into a normalized ordered list. */
|
|
3
|
+
export function readFields(fieldsInput) {
|
|
4
|
+
if (Array.isArray(fieldsInput)) {
|
|
5
|
+
return {
|
|
6
|
+
shape: 'array',
|
|
7
|
+
entries: fieldsInput.map((raw, i) => {
|
|
8
|
+
const { name, ...rest } = raw ?? {};
|
|
9
|
+
return {
|
|
10
|
+
name: typeof name === 'string' && name ? name : `field_${i + 1}`,
|
|
11
|
+
def: rest,
|
|
12
|
+
};
|
|
13
|
+
}),
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
if (fieldsInput && typeof fieldsInput === 'object') {
|
|
17
|
+
return {
|
|
18
|
+
shape: 'record',
|
|
19
|
+
entries: Object.entries(fieldsInput).map(([name, def]) => ({ name, def: { ...(def ?? {}) } })),
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
return { shape: 'record', entries: [] };
|
|
23
|
+
}
|
|
24
|
+
/** Serialize the ordered list back to the original shape. */
|
|
25
|
+
export function writeFields(view) {
|
|
26
|
+
if (view.shape === 'array') {
|
|
27
|
+
return view.entries.map((e) => ({ name: e.name, ...e.def }));
|
|
28
|
+
}
|
|
29
|
+
const out = {};
|
|
30
|
+
for (const e of view.entries)
|
|
31
|
+
out[e.name] = e.def;
|
|
32
|
+
return out;
|
|
33
|
+
}
|
|
34
|
+
/** Find the index of a field by name. Returns -1 if not found. */
|
|
35
|
+
export function indexOfField(view, name) {
|
|
36
|
+
return view.entries.findIndex((e) => e.name === name);
|
|
37
|
+
}
|
|
38
|
+
/** Build a fresh field definition for the given type. */
|
|
39
|
+
export function newField(name, type, label) {
|
|
40
|
+
const def = { type, label: label ?? toLabel(name) };
|
|
41
|
+
// Picklist-style fields start with no options; the OptionsEditor shows a
|
|
42
|
+
// blank input row locally and only persists rows once they have a value, so
|
|
43
|
+
// an unfilled row never trips the spec's identifier validation.
|
|
44
|
+
if (type === 'select' || type === 'multiselect' || type === 'radio' || type === 'checkboxes') {
|
|
45
|
+
def.options = [];
|
|
46
|
+
}
|
|
47
|
+
return { name, def };
|
|
48
|
+
}
|
|
49
|
+
/** Convert a snake_case name to a human-friendly Title Case label. */
|
|
50
|
+
export function toLabel(name) {
|
|
51
|
+
if (!name)
|
|
52
|
+
return '';
|
|
53
|
+
return name
|
|
54
|
+
.split('_')
|
|
55
|
+
.filter(Boolean)
|
|
56
|
+
.map((w) => w.charAt(0).toUpperCase() + w.slice(1))
|
|
57
|
+
.join(' ');
|
|
58
|
+
}
|
|
59
|
+
/** Normalize an arbitrary string into a valid snake_case field name. */
|
|
60
|
+
export function toFieldName(raw) {
|
|
61
|
+
const lower = raw.trim().toLowerCase();
|
|
62
|
+
const sanitized = lower
|
|
63
|
+
.replace(/[^a-z0-9]+/g, '_')
|
|
64
|
+
.replace(/^_+|_+$/g, '')
|
|
65
|
+
.replace(/_{2,}/g, '_');
|
|
66
|
+
if (!sanitized)
|
|
67
|
+
return 'field';
|
|
68
|
+
if (!/^[a-z_]/.test(sanitized))
|
|
69
|
+
return `f_${sanitized}`;
|
|
70
|
+
return sanitized;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Prefix-stable variant of {@link toFieldName} for *live keystroke* input.
|
|
74
|
+
*
|
|
75
|
+
* The strict `toFieldName` trims a trailing `_`, which makes it impossible
|
|
76
|
+
* to TYPE a multi-word identifier into a controlled input: the field's
|
|
77
|
+
* `onChange` re-normalizes on every keystroke, so the instant the user
|
|
78
|
+
* presses `_` the value is `"repair_"` -> trimmed to `"repair"` -> the
|
|
79
|
+
* underscore vanishes before the next letter arrives, yielding
|
|
80
|
+
* `"repairticket"` instead of `"repair_ticket"`. (Authors of non-Latin
|
|
81
|
+
* locales hit this hardest: their label cannot derive a Latin slug, so
|
|
82
|
+
* they MUST type the identifier by hand.)
|
|
83
|
+
*
|
|
84
|
+
* This variant keeps a single trailing `_` so typing can continue, and
|
|
85
|
+
* returns `''` (not the `'field'` placeholder) on empty input so clearing
|
|
86
|
+
* the box actually clears it. A trailing `_` is itself a valid identifier
|
|
87
|
+
* per the spec ("starts with a letter, may contain letters/digits/`_`"),
|
|
88
|
+
* so no separate commit-time trim is required for correctness; callers
|
|
89
|
+
* that need a canonical form for a *complete* string (label->name
|
|
90
|
+
* derivation, group keys) should keep using strict `toFieldName`.
|
|
91
|
+
*/
|
|
92
|
+
export function toFieldNameLoose(raw) {
|
|
93
|
+
const sanitized = raw
|
|
94
|
+
.trim()
|
|
95
|
+
.toLowerCase()
|
|
96
|
+
.replace(/[^a-z0-9]+/g, '_')
|
|
97
|
+
.replace(/^_+/g, '') // trim leading only -- a trailing `_` must survive
|
|
98
|
+
.replace(/_{2,}/g, '_');
|
|
99
|
+
if (!sanitized)
|
|
100
|
+
return '';
|
|
101
|
+
if (!/^[a-z_]/.test(sanitized))
|
|
102
|
+
return `f_${sanitized}`;
|
|
103
|
+
return sanitized;
|
|
104
|
+
}
|
|
105
|
+
/** Read `draft.fieldGroups` into a normalized, well-typed list. */
|
|
106
|
+
export function readGroups(fieldGroupsInput) {
|
|
107
|
+
if (!Array.isArray(fieldGroupsInput))
|
|
108
|
+
return [];
|
|
109
|
+
return fieldGroupsInput
|
|
110
|
+
.filter((g) => !!g && typeof g === 'object')
|
|
111
|
+
.map((g) => ({
|
|
112
|
+
key: typeof g.key === 'string' ? g.key : '',
|
|
113
|
+
label: typeof g.label === 'string' ? g.label : '',
|
|
114
|
+
}))
|
|
115
|
+
.filter((g) => g.key);
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Derive a unique snake_case group key from a human label, avoiding
|
|
119
|
+
* collisions with `existing` keys. Falls back to `group` / `group_N`.
|
|
120
|
+
*/
|
|
121
|
+
export function genGroupKey(label, existing) {
|
|
122
|
+
// toFieldName() bottoms out at "field"; for a *group* key prefer
|
|
123
|
+
// "group" when the label carries no usable alphanumerics.
|
|
124
|
+
const base = /[a-z0-9]/i.test(label) ? toFieldName(label) : 'group';
|
|
125
|
+
if (!existing.includes(base))
|
|
126
|
+
return base;
|
|
127
|
+
let i = 2;
|
|
128
|
+
while (existing.includes(`${base}_${i}`))
|
|
129
|
+
i += 1;
|
|
130
|
+
return `${base}_${i}`;
|
|
131
|
+
}
|
|
132
|
+
/** Append a new group with a unique key derived from `label`. */
|
|
133
|
+
export function addGroup(groups, label) {
|
|
134
|
+
const clean = label.trim() || 'New section';
|
|
135
|
+
const key = genGroupKey(clean, groups.map((g) => g.key));
|
|
136
|
+
return [...groups, { key, label: clean }];
|
|
137
|
+
}
|
|
138
|
+
/** Rename a group's label in place (key is stable). */
|
|
139
|
+
export function renameGroup(groups, key, label) {
|
|
140
|
+
const clean = label.trim();
|
|
141
|
+
if (!clean)
|
|
142
|
+
return groups;
|
|
143
|
+
return groups.map((g) => (g.key === key ? { ...g, label: clean } : g));
|
|
144
|
+
}
|
|
145
|
+
/** Remove a group declaration (callers should also clear members' `group`). */
|
|
146
|
+
export function removeGroup(groups, key) {
|
|
147
|
+
return groups.filter((g) => g.key !== key);
|
|
148
|
+
}
|
|
149
|
+
/** Move a group one slot up (-1) or down (+1), clamped to bounds. */
|
|
150
|
+
export function moveGroup(groups, key, dir) {
|
|
151
|
+
const idx = groups.findIndex((g) => g.key === key);
|
|
152
|
+
if (idx < 0)
|
|
153
|
+
return groups;
|
|
154
|
+
const to = idx + dir;
|
|
155
|
+
if (to < 0 || to >= groups.length)
|
|
156
|
+
return groups;
|
|
157
|
+
return moveArray(groups, idx, to);
|
|
158
|
+
}
|
|
159
|
+
/** Strip `group === key` from every field (used after removing a group). */
|
|
160
|
+
export function clearFieldGroup(view, key) {
|
|
161
|
+
return {
|
|
162
|
+
shape: view.shape,
|
|
163
|
+
entries: view.entries.map((e) => e.def.group === key ? { name: e.name, def: { ...e.def, group: undefined } } : e),
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
/** Generic immutable array move helper (also used by group reorder). */
|
|
167
|
+
export function moveArray(arr, from, to) {
|
|
168
|
+
const next = arr.slice();
|
|
169
|
+
const [item] = next.splice(from, 1);
|
|
170
|
+
next.splice(to, 0, item);
|
|
171
|
+
return next;
|
|
172
|
+
}
|
|
173
|
+
export function groupEntries(view, fieldGroups, opts) {
|
|
174
|
+
const declared = Array.isArray(fieldGroups) ? fieldGroups.filter((g) => typeof g?.key === 'string') : [];
|
|
175
|
+
const buckets = new Map();
|
|
176
|
+
for (const g of declared) {
|
|
177
|
+
buckets.set(g.key, { key: g.key, label: String(g.label ?? g.key), entries: [] });
|
|
178
|
+
}
|
|
179
|
+
const declaredKeys = new Set(declared.map((g) => g.key));
|
|
180
|
+
for (const e of view.entries) {
|
|
181
|
+
const g = typeof e.def.group === 'string' ? e.def.group : null;
|
|
182
|
+
if (g && declaredKeys.has(g)) {
|
|
183
|
+
buckets.get(g).entries.push(e);
|
|
184
|
+
}
|
|
185
|
+
else {
|
|
186
|
+
if (!buckets.has(null))
|
|
187
|
+
buckets.set(null, { key: null, label: 'Ungrouped', entries: [] });
|
|
188
|
+
buckets.get(null).entries.push(e);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
const includeEmpty = !!opts?.includeEmptyDeclared;
|
|
192
|
+
// Drop empty declared buckets unless asked to keep them (edit mode).
|
|
193
|
+
// The implicit "Ungrouped" bucket is only created when populated, so
|
|
194
|
+
// it never shows empty.
|
|
195
|
+
return Array.from(buckets.values()).filter((b) => b.entries.length > 0 || (includeEmpty && b.key !== null));
|
|
196
|
+
}
|
|
197
|
+
/** Stable equality for field-def values (small JSON — order-sensitive is fine). */
|
|
198
|
+
function valueEqual(a, b) {
|
|
199
|
+
if (a === b)
|
|
200
|
+
return true;
|
|
201
|
+
return JSON.stringify(a ?? null) === JSON.stringify(b ?? null);
|
|
202
|
+
}
|
|
203
|
+
/** Def keys whose values differ between two field definitions, sorted. */
|
|
204
|
+
function changedDefKeys(a, b) {
|
|
205
|
+
const keys = new Set([...Object.keys(a), ...Object.keys(b)]);
|
|
206
|
+
const out = [];
|
|
207
|
+
for (const k of keys)
|
|
208
|
+
if (!valueEqual(a[k], b[k]))
|
|
209
|
+
out.push(k);
|
|
210
|
+
return out.sort();
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Diff the current `fields` against a `baseline` (e.g. the last published
|
|
214
|
+
* version). Drives the canvas review mode: added / changed / removed
|
|
215
|
+
* per field. Shape-agnostic — both inputs are read via {@link readFields}.
|
|
216
|
+
*/
|
|
217
|
+
export function diffFields(baselineInput, currentInput) {
|
|
218
|
+
const base = readFields(baselineInput);
|
|
219
|
+
const cur = readFields(currentInput);
|
|
220
|
+
const baseByName = new Map(base.entries.map((e) => [e.name, e]));
|
|
221
|
+
const curNames = new Set(cur.entries.map((e) => e.name));
|
|
222
|
+
const byName = {};
|
|
223
|
+
let added = 0;
|
|
224
|
+
let changed = 0;
|
|
225
|
+
for (const e of cur.entries) {
|
|
226
|
+
const b = baseByName.get(e.name);
|
|
227
|
+
if (!b) {
|
|
228
|
+
byName[e.name] = { name: e.name, status: 'added', changedKeys: [] };
|
|
229
|
+
added += 1;
|
|
230
|
+
continue;
|
|
231
|
+
}
|
|
232
|
+
const keys = changedDefKeys(b.def, e.def);
|
|
233
|
+
if (keys.length) {
|
|
234
|
+
byName[e.name] = { name: e.name, status: 'changed', changedKeys: keys };
|
|
235
|
+
changed += 1;
|
|
236
|
+
}
|
|
237
|
+
else {
|
|
238
|
+
byName[e.name] = { name: e.name, status: 'unchanged', changedKeys: [] };
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
const removed = base.entries.filter((e) => !curNames.has(e.name));
|
|
242
|
+
return { byName, removed, counts: { added, changed, removed: removed.length } };
|
|
243
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* screen-spec — pure helpers that map a flow `screen` node's authored `config`
|
|
3
|
+
* onto the runtime `ScreenSpec` (the contract {@link ScreenView} renders), plus
|
|
4
|
+
* `{var}` interpolation for the title/description and `visibleWhen` field
|
|
5
|
+
* gating. Kept framework-free so {@link ScreenPreview} stays a thin component
|
|
6
|
+
* and these stay unit-testable.
|
|
7
|
+
*/
|
|
8
|
+
import type { ScreenSpec } from '../../ScreenView';
|
|
9
|
+
/** Minimal node shape the preview needs (id + authored config). */
|
|
10
|
+
export interface ScreenPreviewNode {
|
|
11
|
+
id: string;
|
|
12
|
+
label?: string;
|
|
13
|
+
config?: Record<string, unknown>;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Interpolate `{var}` references, mirroring the simulator's `{var}` syntax
|
|
17
|
+
* (flow-simulator.ts). Known vars are substituted; unknown refs stay literal so
|
|
18
|
+
* the author still sees the dependency in the design preview.
|
|
19
|
+
*/
|
|
20
|
+
export declare function interpolate(text: string | undefined, vars: Record<string, unknown> | undefined): string;
|
|
21
|
+
/**
|
|
22
|
+
* A field's `visibleWhen` gate, evaluated against the current variables using
|
|
23
|
+
* the SAME evaluator the simulator uses for edge conditions (so the preview
|
|
24
|
+
* agrees with the simulator). Real metadata mixes `{var}` and bare-var styles
|
|
25
|
+
* (e.g. `{createOpportunity} == true`, `stage == "review"`), so brace
|
|
26
|
+
* placeholders are normalised to bare identifiers first.
|
|
27
|
+
*
|
|
28
|
+
* Fail-OPEN: a missing condition, an unparseable one, or one that references a
|
|
29
|
+
* not-yet-set variable (the inspector has no run state) keeps the field
|
|
30
|
+
* visible — the design preview never hides a configured field just because it
|
|
31
|
+
* lacks the data to decide. With live run state (the simulator) it gates
|
|
32
|
+
* faithfully: `createOpportunity == false` hides the field.
|
|
33
|
+
*/
|
|
34
|
+
export declare function isFieldVisibleWhen(visibleWhen: unknown, variables: Record<string, unknown> | undefined): boolean;
|
|
35
|
+
/** Count of authored field rows hidden by their `visibleWhen` against `variables`. */
|
|
36
|
+
export declare function hiddenFieldCount(node: ScreenPreviewNode, variables: Record<string, unknown> | undefined): number;
|
|
37
|
+
/**
|
|
38
|
+
* Map a screen node's authored `config` onto the runtime `ScreenSpec` — the
|
|
39
|
+
* same keys the engine's `screen` executor reads (title / description / fields
|
|
40
|
+
* / objectName / mode / defaults / idVariable). `fields` are gated by their
|
|
41
|
+
* `visibleWhen` against `variables` (omit `variables` to keep every field).
|
|
42
|
+
*/
|
|
43
|
+
export declare function buildScreenSpec(node: ScreenPreviewNode, variables?: Record<string, unknown>): ScreenSpec;
|