@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,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Interface List Page — ADR-0047 interface mode.
|
|
3
|
+
*
|
|
4
|
+
* Renders a page whose `interfaceConfig` binds a single source view into an
|
|
5
|
+
* author-curated list surface. Where ObjectView (data mode) shows ALL of an
|
|
6
|
+
* object's list views as switcher tabs and lets users create views, this
|
|
7
|
+
* surface is deliberately closed:
|
|
8
|
+
*
|
|
9
|
+
* • the page REFERENCES one view (`interfaceConfig.sourceView`) — columns,
|
|
10
|
+
* base filter and sort are inherited, never restated (the iron rule);
|
|
11
|
+
* • end users get exactly the `userFilters` the author enabled;
|
|
12
|
+
* • the visualization comes from `appearance.allowedVisualizations`
|
|
13
|
+
* (a single entry renders no switcher);
|
|
14
|
+
* • `userActions` toggles map onto the toolbar — advanced filtering and
|
|
15
|
+
* view management are absent by default.
|
|
16
|
+
*/
|
|
17
|
+
import * as React from 'react';
|
|
18
|
+
interface InterfaceListPageProps {
|
|
19
|
+
page: any;
|
|
20
|
+
className?: string;
|
|
21
|
+
/** Design-mode only: persist toolbar edits (sort, column order) back to the
|
|
22
|
+
* page's interfaceConfig metadata (Airtable parity — the toolbar IS the
|
|
23
|
+
* authoring surface). Receives a partial interfaceConfig patch. */
|
|
24
|
+
onConfigChange?: (patch: Record<string, unknown>) => void;
|
|
25
|
+
/** When the host overlays an edit-in-studio affordance at the page's
|
|
26
|
+
* top-right (PageView's pencil), reserve right padding on the header so the
|
|
27
|
+
* toolbar buttons don't sit under it. */
|
|
28
|
+
reserveEditAffordance?: boolean;
|
|
29
|
+
}
|
|
30
|
+
export declare function defaultKanbanFromObject(objectDef: any): {
|
|
31
|
+
groupField: string;
|
|
32
|
+
groupByField: string;
|
|
33
|
+
} | undefined;
|
|
34
|
+
export declare function defaultCalendarFromObject(objectDef: any): {
|
|
35
|
+
startDateField: string;
|
|
36
|
+
} | undefined;
|
|
37
|
+
export declare function defaultGalleryFromObject(objectDef: any): {
|
|
38
|
+
coverField: string;
|
|
39
|
+
} | undefined;
|
|
40
|
+
export declare function defaultGanttFromObject(objectDef: any): {
|
|
41
|
+
startDateField: string;
|
|
42
|
+
endDateField: string;
|
|
43
|
+
progressField?: string;
|
|
44
|
+
} | undefined;
|
|
45
|
+
export declare function defaultMapFromObject(objectDef: any): {
|
|
46
|
+
locationField: string;
|
|
47
|
+
} | undefined;
|
|
48
|
+
export declare function InterfaceListPage({ page, className, onConfigChange, reserveEditAffordance }: InterfaceListPageProps): React.JSX.Element;
|
|
49
|
+
export {};
|
|
@@ -0,0 +1,347 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* Interface List Page — ADR-0047 interface mode.
|
|
4
|
+
*
|
|
5
|
+
* Renders a page whose `interfaceConfig` binds a single source view into an
|
|
6
|
+
* author-curated list surface. Where ObjectView (data mode) shows ALL of an
|
|
7
|
+
* object's list views as switcher tabs and lets users create views, this
|
|
8
|
+
* surface is deliberately closed:
|
|
9
|
+
*
|
|
10
|
+
* • the page REFERENCES one view (`interfaceConfig.sourceView`) — columns,
|
|
11
|
+
* base filter and sort are inherited, never restated (the iron rule);
|
|
12
|
+
* • end users get exactly the `userFilters` the author enabled;
|
|
13
|
+
* • the visualization comes from `appearance.allowedVisualizations`
|
|
14
|
+
* (a single entry renders no switcher);
|
|
15
|
+
* • `userActions` toggles map onto the toolbar — advanced filtering and
|
|
16
|
+
* view management are absent by default.
|
|
17
|
+
*/
|
|
18
|
+
import * as React from 'react';
|
|
19
|
+
import { useSearchParams, useNavigate } from 'react-router-dom';
|
|
20
|
+
import { ListView } from '@object-ui/plugin-list';
|
|
21
|
+
import { useAdapter, SchemaRenderer, useNavigationOverlay } from '@object-ui/react';
|
|
22
|
+
import { Empty, EmptyTitle, EmptyDescription, NavigationOverlay } from '@object-ui/components';
|
|
23
|
+
import { Database } from 'lucide-react';
|
|
24
|
+
import { useObjectTranslation } from '@object-ui/i18n';
|
|
25
|
+
import { useMetadata } from '../providers/MetadataProvider';
|
|
26
|
+
import { parseUserFilterParams, applyUserFilterParams } from './userFilterUrlState';
|
|
27
|
+
import { RecordDetailView } from './RecordDetailView';
|
|
28
|
+
/**
|
|
29
|
+
* Resolve the source list view from the merged object definition.
|
|
30
|
+
* Views merged from ADR-0017 ViewItems are keyed `<object>.<key>`;
|
|
31
|
+
* the page author writes the bare key (`sourceView: 'default'`).
|
|
32
|
+
*/
|
|
33
|
+
/** A view "carries columns" only when its column list is actually non-empty. */
|
|
34
|
+
function hasColumns(v) {
|
|
35
|
+
return Array.isArray(v?.columns) && v.columns.length > 0;
|
|
36
|
+
}
|
|
37
|
+
function resolveSourceView(objectDef, sourceView) {
|
|
38
|
+
const views = objectDef?.listViews || objectDef?.list_views || {};
|
|
39
|
+
// ADR-0017 expansion can serve a default-view item with an empty config
|
|
40
|
+
// while the full body lives on `objectDef.list` — prefer candidates that
|
|
41
|
+
// actually carry columns over hollow name matches. An empty `columns: []`
|
|
42
|
+
// is truthy in JS but renders a column-less grid, so check for non-empty.
|
|
43
|
+
const candidates = sourceView
|
|
44
|
+
? [
|
|
45
|
+
views[`${objectDef?.name}.${sourceView}`],
|
|
46
|
+
views[sourceView],
|
|
47
|
+
...(sourceView === 'default' || sourceView === 'list' ? [objectDef?.list] : []),
|
|
48
|
+
]
|
|
49
|
+
: [objectDef?.list, ...Object.values(views)];
|
|
50
|
+
const present = candidates.filter(Boolean);
|
|
51
|
+
return present.find(hasColumns) ?? present[0];
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Default column set when the resolved view carries none — mirrors
|
|
55
|
+
* ObjectView's data-mode fallback so an interface page never renders a
|
|
56
|
+
* column-less grid. Priority: curated `compactLayout`, else the first
|
|
57
|
+
* business fields (system/audit columns excluded).
|
|
58
|
+
*/
|
|
59
|
+
const SYSTEM_FIELDS = new Set([
|
|
60
|
+
'id', 'created_at', 'createdAt', 'updated_at', 'updatedAt',
|
|
61
|
+
'deleted_at', 'deletedAt', 'created_by', 'createdBy',
|
|
62
|
+
'updated_by', 'updatedBy', '_version', '_rev',
|
|
63
|
+
]);
|
|
64
|
+
function defaultColumnsFromObject(objectDef) {
|
|
65
|
+
if (Array.isArray(objectDef?.compactLayout) && objectDef.compactLayout.length > 0) {
|
|
66
|
+
return objectDef.compactLayout.filter((n) => objectDef.fields?.[n]);
|
|
67
|
+
}
|
|
68
|
+
const fields = objectDef?.fields;
|
|
69
|
+
if (fields && typeof fields === 'object') {
|
|
70
|
+
return Object.entries(fields)
|
|
71
|
+
.filter(([name, f]) => f && !f.hidden && !SYSTEM_FIELDS.has(name))
|
|
72
|
+
.map(([name]) => name)
|
|
73
|
+
.slice(0, 6);
|
|
74
|
+
}
|
|
75
|
+
return [];
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Default visualization bindings derived from the object's fields.
|
|
79
|
+
*
|
|
80
|
+
* ADR-0047: an interface page sets `appearance.allowedVisualizations` to
|
|
81
|
+
* whitelist renderers, but a viz only renders when its field binding
|
|
82
|
+
* resolves (kanban needs a group field, calendar a date, gallery a cover).
|
|
83
|
+
* The page config has nowhere to set those, so — like `defaultColumnsFromObject`
|
|
84
|
+
* — we auto-pick a sensible binding from the object (Airtable does the same
|
|
85
|
+
* when you switch to Kanban). Without this, a whitelisted kanban is silently
|
|
86
|
+
* dropped from the switcher and the author gets no feedback.
|
|
87
|
+
*/
|
|
88
|
+
function firstFieldMatching(objectDef, pred) {
|
|
89
|
+
const fields = objectDef?.fields;
|
|
90
|
+
if (!fields || typeof fields !== 'object')
|
|
91
|
+
return undefined;
|
|
92
|
+
const hit = Object.entries(fields).find(([name, f]) => f && !f.hidden && !SYSTEM_FIELDS.has(name) && pred(name, f));
|
|
93
|
+
return hit?.[0];
|
|
94
|
+
}
|
|
95
|
+
const SELECT_TYPES = new Set(['select', 'multiselect', 'radio', 'enum', 'boolean']);
|
|
96
|
+
const DATE_TYPES = new Set(['date', 'datetime', 'time']);
|
|
97
|
+
const IMAGE_TYPES = new Set(['image', 'file', 'attachment', 'avatar', 'photo']);
|
|
98
|
+
export function defaultKanbanFromObject(objectDef) {
|
|
99
|
+
const field = firstFieldMatching(objectDef, (_n, f) => SELECT_TYPES.has(f.type)) ??
|
|
100
|
+
firstFieldMatching(objectDef, (n) => /status|stage|state|priority|category|kind/i.test(n));
|
|
101
|
+
// ListView reads `groupField` to render and `groupByField || groupField`
|
|
102
|
+
// to decide the viz is available — set both so it resolves either way.
|
|
103
|
+
return field ? { groupField: field, groupByField: field } : undefined;
|
|
104
|
+
}
|
|
105
|
+
function defaultDateField(objectDef) {
|
|
106
|
+
return (firstFieldMatching(objectDef, (_n, f) => DATE_TYPES.has(f.type)) ??
|
|
107
|
+
firstFieldMatching(objectDef, (n) => /date|due|start|end|deadline|schedule/i.test(n)));
|
|
108
|
+
}
|
|
109
|
+
export function defaultCalendarFromObject(objectDef) {
|
|
110
|
+
const field = defaultDateField(objectDef);
|
|
111
|
+
return field ? { startDateField: field } : undefined;
|
|
112
|
+
}
|
|
113
|
+
export function defaultGalleryFromObject(objectDef) {
|
|
114
|
+
const field = firstFieldMatching(objectDef, (_n, f) => IMAGE_TYPES.has(f.type));
|
|
115
|
+
return field ? { coverField: field } : undefined;
|
|
116
|
+
}
|
|
117
|
+
const LOCATION_TYPES = new Set(['location', 'geo', 'geolocation', 'geopoint', 'point']);
|
|
118
|
+
// Gantt needs BOTH a start and an end date. Prefer name-disambiguated fields
|
|
119
|
+
// (start_date / end_date / due_date), else fall back to the first two date
|
|
120
|
+
// fields. Returns undefined unless two distinct dates resolve.
|
|
121
|
+
export function defaultGanttFromObject(objectDef) {
|
|
122
|
+
const start = firstFieldMatching(objectDef, (n, f) => DATE_TYPES.has(f.type) && /start|begin|kickoff/i.test(n)) ??
|
|
123
|
+
firstFieldMatching(objectDef, (_n, f) => DATE_TYPES.has(f.type));
|
|
124
|
+
if (!start)
|
|
125
|
+
return undefined;
|
|
126
|
+
const end = firstFieldMatching(objectDef, (n, f) => DATE_TYPES.has(f.type) && n !== start && /end|due|finish|deadline|close/i.test(n)) ??
|
|
127
|
+
firstFieldMatching(objectDef, (_n, f) => DATE_TYPES.has(f.type) && _n !== start);
|
|
128
|
+
if (!end)
|
|
129
|
+
return undefined;
|
|
130
|
+
const progress = firstFieldMatching(objectDef, (n, f) => (f.type === 'number' || f.type === 'percent') && /progress|percent|complete/i.test(n));
|
|
131
|
+
return { startDateField: start, endDateField: end, ...(progress ? { progressField: progress } : {}) };
|
|
132
|
+
}
|
|
133
|
+
// Map needs a location/geo field (or address). Auto-derive from a location-typed
|
|
134
|
+
// field, else a field whose name looks geographic.
|
|
135
|
+
export function defaultMapFromObject(objectDef) {
|
|
136
|
+
const field = firstFieldMatching(objectDef, (_n, f) => LOCATION_TYPES.has(f.type)) ??
|
|
137
|
+
firstFieldMatching(objectDef, (n) => /location|address|geo|coords?|place|venue/i.test(n));
|
|
138
|
+
return field ? { locationField: field } : undefined;
|
|
139
|
+
}
|
|
140
|
+
export function InterfaceListPage({ page, className, onConfigChange, reserveEditAffordance }) {
|
|
141
|
+
const { t } = useObjectTranslation();
|
|
142
|
+
const { objects } = useMetadata();
|
|
143
|
+
const dataSource = useAdapter();
|
|
144
|
+
const navigate = useNavigate();
|
|
145
|
+
const [searchParams, setSearchParams] = useSearchParams();
|
|
146
|
+
// ADR-0047 filter persistence: restore `uf_*` URL params once at mount,
|
|
147
|
+
// mirror every selection change back (replace — no history spam).
|
|
148
|
+
const [initialUfSelections] = React.useState(() => parseUserFilterParams(new URLSearchParams(window.location.search)));
|
|
149
|
+
const handleUserFilterSelectionsChange = React.useCallback((selections) => {
|
|
150
|
+
setSearchParams(prev => applyUserFilterParams(prev, selections), { replace: true });
|
|
151
|
+
}, [setSearchParams]);
|
|
152
|
+
const cfg = page?.interfaceConfig || {};
|
|
153
|
+
const objectDef = React.useMemo(() => (objects || []).find((o) => o.name === cfg.source), [objects, cfg.source]);
|
|
154
|
+
const resolvedView = React.useMemo(() => resolveSourceView(objectDef, cfg.sourceView), [objectDef, cfg.sourceView]);
|
|
155
|
+
// ── Record open behavior (ADR-0047) — how clicking a record opens its detail.
|
|
156
|
+
// 'drawer' (default) = right-side peek panel rendering the record's detail
|
|
157
|
+
// page; 'page' = full-page navigate to the record route; 'none' = not
|
|
158
|
+
// clickable. Restores record-opening on interface pages (previously a no-op)
|
|
159
|
+
// and makes it author-configurable.
|
|
160
|
+
const recordAction = cfg.recordAction === 'page' || cfg.recordAction === 'modal' || cfg.recordAction === 'none'
|
|
161
|
+
? cfg.recordAction
|
|
162
|
+
: 'drawer';
|
|
163
|
+
const recordUrl = React.useCallback((id) => {
|
|
164
|
+
const seg = window.location.pathname.split('/');
|
|
165
|
+
const appSeg = seg[2] || '';
|
|
166
|
+
return `/apps/${appSeg}/${cfg.source}/record/${encodeURIComponent(String(id))}`;
|
|
167
|
+
}, [cfg.source]);
|
|
168
|
+
const navOverlay = useNavigationOverlay({
|
|
169
|
+
navigation: { mode: recordAction === 'none' ? 'none' : recordAction },
|
|
170
|
+
objectName: cfg.source,
|
|
171
|
+
onNavigate: (id) => navigate(recordUrl(id)),
|
|
172
|
+
});
|
|
173
|
+
const drawerRecordId = searchParams.get('recordId');
|
|
174
|
+
const handleRecordClick = React.useCallback((record, event) => {
|
|
175
|
+
if (recordAction === 'none')
|
|
176
|
+
return;
|
|
177
|
+
const id = record?.id ?? record?._id;
|
|
178
|
+
const isMod = !!(event && (event.metaKey || event.ctrlKey || event.button === 1));
|
|
179
|
+
if (isMod && id != null) {
|
|
180
|
+
window.open(recordUrl(id), '_blank');
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
// Overlay modes are URL-driven (?recordId=…) so the drawer is shareable
|
|
184
|
+
// and survives refresh — same convention as ObjectView.
|
|
185
|
+
if ((recordAction === 'drawer' || recordAction === 'modal') && id != null) {
|
|
186
|
+
setSearchParams((prev) => { const n = new URLSearchParams(prev); n.set('recordId', String(id)); return n; });
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
navOverlay.handleClick(record, event);
|
|
190
|
+
}, [recordAction, recordUrl, navOverlay, setSearchParams]);
|
|
191
|
+
const closeRecordDrawer = React.useCallback(() => {
|
|
192
|
+
setSearchParams((prev) => { const n = new URLSearchParams(prev); n.delete('recordId'); return n; });
|
|
193
|
+
}, [setSearchParams]);
|
|
194
|
+
React.useEffect(() => {
|
|
195
|
+
if (drawerRecordId && !navOverlay.isOpen)
|
|
196
|
+
navOverlay.open({ id: drawerRecordId });
|
|
197
|
+
else if (!drawerRecordId && navOverlay.isOpen)
|
|
198
|
+
navOverlay.close();
|
|
199
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
200
|
+
}, [drawerRecordId]);
|
|
201
|
+
// The view list endpoint can serve hollow expansion items (no columns);
|
|
202
|
+
// the full body lives behind the per-view overlay API — the same
|
|
203
|
+
// hydration ObjectView performs. Only fetch when the resolution came up
|
|
204
|
+
// hollow.
|
|
205
|
+
//
|
|
206
|
+
// IMPORTANT: the deps are SCALARS, not the objectDef/resolvedView object
|
|
207
|
+
// identities. `useMetadata().objects` is rebuilt per render, so identity
|
|
208
|
+
// deps re-fire this effect on every render — and the unconditional
|
|
209
|
+
// `setHydratedView(null)` then ping-pongs with the async `setHydratedView
|
|
210
|
+
// (full)` into an infinite render/refetch loop the moment anything (e.g.
|
|
211
|
+
// a `uf_*` URL write) re-renders this component after hydration settled.
|
|
212
|
+
const objectDefName = objectDef?.name;
|
|
213
|
+
// Hollow = no *non-empty* column list. An empty `columns: []` reads as
|
|
214
|
+
// truthy but renders nothing, so it must still trigger hydration.
|
|
215
|
+
const resolvedViewHollow = !!resolvedView && !hasColumns(resolvedView);
|
|
216
|
+
const resolvedViewKey = resolvedView?.name
|
|
217
|
+
?? (cfg.sourceView ? `${cfg.source}.${cfg.sourceView}` : undefined);
|
|
218
|
+
const [hydratedView, setHydratedView] = React.useState(null);
|
|
219
|
+
React.useEffect(() => {
|
|
220
|
+
let cancelled = false;
|
|
221
|
+
setHydratedView(null);
|
|
222
|
+
if (!objectDefName || !cfg.source || !resolvedViewHollow || !resolvedViewKey)
|
|
223
|
+
return;
|
|
224
|
+
(async () => {
|
|
225
|
+
try {
|
|
226
|
+
const ds = dataSource;
|
|
227
|
+
let full = null;
|
|
228
|
+
if (typeof ds?.listViewOverrides === 'function') {
|
|
229
|
+
const all = await ds.listViewOverrides(cfg.source);
|
|
230
|
+
full = all?.[resolvedViewKey] ?? null;
|
|
231
|
+
}
|
|
232
|
+
if (!hasColumns(full) && typeof ds?.getView === 'function') {
|
|
233
|
+
full = await ds.getView(cfg.source, resolvedViewKey);
|
|
234
|
+
}
|
|
235
|
+
if (!cancelled && full && typeof full === 'object')
|
|
236
|
+
setHydratedView(full);
|
|
237
|
+
}
|
|
238
|
+
catch { /* hollow view stays hollow — renderer falls back to defaults */ }
|
|
239
|
+
})();
|
|
240
|
+
return () => { cancelled = true; };
|
|
241
|
+
}, [objectDefName, cfg.source, cfg.sourceView, resolvedViewHollow, resolvedViewKey, dataSource]);
|
|
242
|
+
const viewDef = React.useMemo(() => (hydratedView ? { ...resolvedView, ...hydratedView } : resolvedView), [resolvedView, hydratedView]);
|
|
243
|
+
// Key the schema on CONTENT, not object identity — `objects` (and thus
|
|
244
|
+
// objectDef/resolvedView) are rebuilt per render, and a new schema
|
|
245
|
+
// identity makes ListView refetch. The serialized view config is small.
|
|
246
|
+
const viewDefJson = JSON.stringify(viewDef ?? null);
|
|
247
|
+
const schema = React.useMemo(() => {
|
|
248
|
+
if (!objectDef)
|
|
249
|
+
return undefined;
|
|
250
|
+
const view = viewDef || {};
|
|
251
|
+
const appearance = cfg.appearance ?? view.appearance;
|
|
252
|
+
const allowed = appearance?.allowedVisualizations || [];
|
|
253
|
+
const allowedSet = new Set(allowed);
|
|
254
|
+
const userActions = cfg.userActions || {};
|
|
255
|
+
// Viz field bindings: the referenced view's config wins; otherwise, when
|
|
256
|
+
// the author whitelisted a viz, derive a sensible default binding from the
|
|
257
|
+
// object so the switcher actually offers (and renders) it. Only derive for
|
|
258
|
+
// whitelisted types — an un-whitelisted viz is never reachable.
|
|
259
|
+
const kanban = view.kanban ?? (allowedSet.has('kanban') ? defaultKanbanFromObject(objectDef) : undefined);
|
|
260
|
+
const calendar = view.calendar ?? (allowedSet.has('calendar') ? defaultCalendarFromObject(objectDef) : undefined);
|
|
261
|
+
const timeline = view.timeline ?? (allowedSet.has('timeline') ? defaultCalendarFromObject(objectDef) : undefined);
|
|
262
|
+
const gallery = view.gallery ?? (allowedSet.has('gallery') ? defaultGalleryFromObject(objectDef) : undefined);
|
|
263
|
+
const gantt = view.gantt ?? (allowedSet.has('gantt') ? defaultGanttFromObject(objectDef) : undefined);
|
|
264
|
+
// Map binding lives under options.map (locationField); auto-derive when
|
|
265
|
+
// whitelisted so a map interface page renders without hand-wiring.
|
|
266
|
+
const mapCfg = view.options?.map ?? (allowedSet.has('map') ? defaultMapFromObject(objectDef) : undefined);
|
|
267
|
+
// Data semantics — ADR-0047 (revised): the PAGE owns its view metadata.
|
|
268
|
+
// Precedence everywhere: the page's own config → legacy sourceView view
|
|
269
|
+
// (back-compat) → a sensible default derived from the object.
|
|
270
|
+
const filters = [
|
|
271
|
+
...(Array.isArray(view.filter) ? view.filter : []),
|
|
272
|
+
...(Array.isArray(cfg.filterBy) ? cfg.filterBy : []),
|
|
273
|
+
];
|
|
274
|
+
// Columns: the page's own `columns` win; else the legacy referenced view's;
|
|
275
|
+
// else a default from the object so the grid never renders just the
|
|
276
|
+
// row-number column.
|
|
277
|
+
const columns = hasColumns(cfg)
|
|
278
|
+
? cfg.columns
|
|
279
|
+
: hasColumns(view)
|
|
280
|
+
? view.columns
|
|
281
|
+
: defaultColumnsFromObject(objectDef);
|
|
282
|
+
// Sort: the page's own first, then the legacy view's.
|
|
283
|
+
const sort = Array.isArray(cfg.sort) && cfg.sort.length ? cfg.sort : view.sort;
|
|
284
|
+
return {
|
|
285
|
+
type: 'list-view',
|
|
286
|
+
objectName: objectDef.name,
|
|
287
|
+
viewType: (allowed[0] ?? view.type ?? 'grid'),
|
|
288
|
+
fields: columns,
|
|
289
|
+
...(filters.length ? { filters } : {}),
|
|
290
|
+
...(sort?.length ? { sort } : {}),
|
|
291
|
+
grouping: view.grouping,
|
|
292
|
+
rowColor: view.rowColor,
|
|
293
|
+
pagination: view.pagination,
|
|
294
|
+
searchableFields: view.searchableFields,
|
|
295
|
+
emptyState: view.emptyState,
|
|
296
|
+
kanban,
|
|
297
|
+
calendar,
|
|
298
|
+
gallery,
|
|
299
|
+
timeline,
|
|
300
|
+
gantt,
|
|
301
|
+
...((mapCfg || view.options) ? { options: { ...(view.options ?? {}), ...(mapCfg ? { map: mapCfg } : {}) } } : {}),
|
|
302
|
+
// Presentation policy — the page layer (ADR-0047).
|
|
303
|
+
userFilters: cfg.userFilters ?? view.userFilters,
|
|
304
|
+
appearance,
|
|
305
|
+
showViewSwitcher: allowed.length > 1,
|
|
306
|
+
showRecordCount: cfg.showRecordCount,
|
|
307
|
+
// Add-record entry point (ListView gates the button on addRecord.enabled,
|
|
308
|
+
// independent of the active visualization). Without forwarding this, the
|
|
309
|
+
// panel's "Add Record" config silently did nothing at runtime.
|
|
310
|
+
addRecord: cfg.addRecord,
|
|
311
|
+
// userActions toggles → toolbar flags. Interface mode is closed by
|
|
312
|
+
// default: the advanced filter builder and view-management tools are
|
|
313
|
+
// only present when the author opted in.
|
|
314
|
+
showSearch: userActions.search !== false,
|
|
315
|
+
showSort: userActions.sort !== false,
|
|
316
|
+
showFilters: userActions.filter === true,
|
|
317
|
+
showDensity: userActions.rowHeight === true,
|
|
318
|
+
showHideFields: false,
|
|
319
|
+
showGroup: false,
|
|
320
|
+
showColor: false,
|
|
321
|
+
allowExport: false,
|
|
322
|
+
inlineEdit: false,
|
|
323
|
+
};
|
|
324
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
325
|
+
}, [objectDefName, viewDefJson, cfg]);
|
|
326
|
+
if (!objectDef || !schema) {
|
|
327
|
+
return (_jsx("div", { className: "h-full flex items-center justify-center p-8", children: _jsxs(Empty, { children: [_jsx("div", { className: "mx-auto mb-4 flex h-12 w-12 items-center justify-center rounded-full bg-muted", children: _jsx(Database, { className: "h-6 w-6 text-muted-foreground" }) }), _jsx(EmptyTitle, { children: t('empty.objectNotFound', { defaultValue: 'Source object not found' }) }), _jsx(EmptyDescription, { children: t('empty.interfacePageSourceMissing', {
|
|
328
|
+
defaultValue: 'This interface page references "{{name}}", which is not available.',
|
|
329
|
+
name: cfg.source || '?',
|
|
330
|
+
}) })] }) }));
|
|
331
|
+
}
|
|
332
|
+
// Toolbar buttons ARE object actions (ADR-0047): resolve the configured
|
|
333
|
+
// action names against the source object's ActionSchema and render them via
|
|
334
|
+
// the shared action:bar (which handles execution).
|
|
335
|
+
const buttonActions = Array.isArray(cfg.buttons) && cfg.buttons.length
|
|
336
|
+
? cfg.buttons
|
|
337
|
+
.map((name) => (objectDef.actions || []).find((a) => a?.name === name))
|
|
338
|
+
.filter(Boolean)
|
|
339
|
+
// The author explicitly chose these as page buttons, so surface them in
|
|
340
|
+
// the toolbar regardless of the action's own `locations` (the action:bar
|
|
341
|
+
// filters by location).
|
|
342
|
+
.map((a) => ({ ...a, locations: ['list_toolbar'] }))
|
|
343
|
+
: [];
|
|
344
|
+
return (_jsxs("div", { className: className ?? 'h-full flex flex-col', "data-testid": "interface-list-page", children: [_jsxs("div", { className: `pl-4 pt-4 pb-2 shrink-0 flex items-start justify-between gap-3 ${reserveEditAffordance ? 'pr-12' : 'pr-4'}`, children: [_jsxs("div", { className: "min-w-0", children: [_jsx("h1", { className: "text-lg font-semibold leading-tight", children: typeof page.label === 'string' ? page.label : page.name }), typeof page.description === 'string' && page.description && (_jsx("p", { className: "text-sm text-muted-foreground mt-0.5", children: page.description }))] }), buttonActions.length > 0 && (_jsx("div", { className: "shrink-0", "data-testid": "interface-page-buttons", children: _jsx(SchemaRenderer, { schema: { type: 'action:bar', location: 'list_toolbar', actions: buttonActions, size: 'sm', variant: 'outline' } }) }))] }), _jsx("div", { className: "flex-1 min-h-0 overflow-auto", children: _jsx(ListView, { schema: schema, dataSource: dataSource, userFilterSelections: initialUfSelections, onUserFilterSelectionsChange: handleUserFilterSelectionsChange, onSortChange: onConfigChange ? (sort) => onConfigChange({ sort }) : undefined, onColumnStateChange: onConfigChange ? (st) => { if (st?.order?.length)
|
|
345
|
+
onConfigChange({ columns: st.order }); } : undefined, onRowClick: recordAction === 'none' ? undefined : handleRecordClick }) }), navOverlay.isOverlay && (_jsx(NavigationOverlay, { ...navOverlay, setIsOpen: (o) => { if (!o)
|
|
346
|
+
closeRecordDrawer(); }, title: typeof page.label === 'string' ? page.label : (cfg.source || 'Record'), children: (record) => (_jsx(RecordDetailView, { objectNameOverride: cfg.source, recordIdOverride: String(record?.id ?? record?._id ?? drawerRecordId ?? ''), embedded: true, dataSource: dataSource, objects: objects, onEdit: () => { } })) }))] }));
|
|
347
|
+
}
|
|
@@ -24,11 +24,11 @@ export declare function MetadataToggle({ open, onToggle, className }: {
|
|
|
24
24
|
open: boolean;
|
|
25
25
|
onToggle: () => void;
|
|
26
26
|
className?: string;
|
|
27
|
-
}): import("react
|
|
27
|
+
}): import("react").JSX.Element;
|
|
28
28
|
/**
|
|
29
29
|
* The side panel that renders JSON metadata sections.
|
|
30
30
|
*/
|
|
31
|
-
export declare function MetadataPanel({ sections, open }: Omit<MetadataInspectorProps, 'onToggle'>): import("react
|
|
31
|
+
export declare function MetadataPanel({ sections, open }: Omit<MetadataInspectorProps, 'onToggle'>): import("react").JSX.Element | null;
|
|
32
32
|
/**
|
|
33
33
|
* Hook to manage MetadataInspector open/close state.
|
|
34
34
|
* Automatically opens when `?__debug` URL parameter is present.
|
|
@@ -8,4 +8,4 @@
|
|
|
8
8
|
* - useObjectActions for toolbar create button
|
|
9
9
|
* - ListView delegation for non-grid view types (kanban, calendar, chart, etc.)
|
|
10
10
|
*/
|
|
11
|
-
export declare function ObjectView({ dataSource, objects, onEdit, externalRefreshKey }: any): import("react
|
|
11
|
+
export declare function ObjectView({ dataSource, objects, onEdit, externalRefreshKey }: any): import("react").JSX.Element;
|