@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
|
@@ -15,7 +15,7 @@ import { Layers } from 'lucide-react';
|
|
|
15
15
|
import { getIcon as resolveIcon } from '../utils/getIcon';
|
|
16
16
|
import { Sidebar, SidebarHeader, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupLabel, SidebarGroupContent, SidebarMenu, SidebarMenuItem, SidebarMenuButton, SidebarMenuAction, SidebarInput, DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuGroup, Avatar, AvatarImage, AvatarFallback, useSidebar, } from '@object-ui/components';
|
|
17
17
|
import { ChevronsUpDown, Plus, Settings, LogOut, Database, Clock, Star, StarOff, Search, Pencil, ChevronRight, Home, } from 'lucide-react';
|
|
18
|
-
import { NavigationRenderer } from '@object-ui/layout';
|
|
18
|
+
import { NavigationRenderer, resolveHref } from '@object-ui/layout';
|
|
19
19
|
import { useMetadata } from '../providers/MetadataProvider';
|
|
20
20
|
import { useExpressionContext, evaluateVisibility } from '../providers/ExpressionProvider';
|
|
21
21
|
import { useAuth, useIsWorkspaceAdmin, getUserInitials } from '@object-ui/auth';
|
|
@@ -23,8 +23,9 @@ import { usePermissions } from '@object-ui/permissions';
|
|
|
23
23
|
import { useRecentItems } from '../hooks/useRecentItems';
|
|
24
24
|
import { useFavorites } from '../hooks/useFavorites';
|
|
25
25
|
import { useNavPins } from '../hooks/useNavPins';
|
|
26
|
-
import { resolveI18nLabel } from '../utils';
|
|
26
|
+
import { resolveI18nLabel, matchAppBySegment, appRouteSegment } from '../utils';
|
|
27
27
|
import { useObjectTranslation, useObjectLabel } from '@object-ui/i18n';
|
|
28
|
+
import { useAppContextSelectors } from './ContextSelectors';
|
|
28
29
|
// ---------------------------------------------------------------------------
|
|
29
30
|
// useNavOrder – localStorage-persisted drag-and-drop reorder for nav items
|
|
30
31
|
// ---------------------------------------------------------------------------
|
|
@@ -90,7 +91,7 @@ function useNavOrder(appName) {
|
|
|
90
91
|
*/
|
|
91
92
|
const getIcon = resolveIcon;
|
|
92
93
|
export function AppSidebar({ activeAppName, onAppChange }) {
|
|
93
|
-
const { isMobile } = useSidebar();
|
|
94
|
+
const { isMobile, setOpenMobile } = useSidebar();
|
|
94
95
|
const { user, signOut, isAuthEnabled } = useAuth();
|
|
95
96
|
const isWorkspaceAdmin = useIsWorkspaceAdmin();
|
|
96
97
|
const navigate = useNavigate();
|
|
@@ -107,7 +108,8 @@ export function AppSidebar({ activeAppName, onAppChange }) {
|
|
|
107
108
|
const handleTouchEnd = (e) => {
|
|
108
109
|
const deltaX = e.changedTouches[0].clientX - touchStartX;
|
|
109
110
|
if (touchStartX < EDGE_THRESHOLD && deltaX > SWIPE_DISTANCE && isMobile) {
|
|
110
|
-
|
|
111
|
+
// Idempotent direct open (ADR-0054 C1) — no synthetic click dispatch.
|
|
112
|
+
setOpenMobile(true);
|
|
111
113
|
}
|
|
112
114
|
};
|
|
113
115
|
document.addEventListener('touchstart', handleTouchStart, { passive: true });
|
|
@@ -116,14 +118,17 @@ export function AppSidebar({ activeAppName, onAppChange }) {
|
|
|
116
118
|
document.removeEventListener('touchstart', handleTouchStart);
|
|
117
119
|
document.removeEventListener('touchend', handleTouchEnd);
|
|
118
120
|
};
|
|
119
|
-
}, [isMobile]);
|
|
121
|
+
}, [isMobile, setOpenMobile]);
|
|
120
122
|
const { recentItems } = useRecentItems();
|
|
121
123
|
const { favorites, removeFavorite } = useFavorites();
|
|
122
124
|
const { apps: metadataApps, objects: metadataObjects } = useMetadata();
|
|
123
125
|
const apps = metadataApps || [];
|
|
124
|
-
// Filter out inactive apps
|
|
125
|
-
const activeApps = apps.filter((a) => a.active !== false);
|
|
126
|
-
|
|
126
|
+
// Filter out inactive + hidden apps from the switcher list.
|
|
127
|
+
const activeApps = apps.filter((a) => a.active !== false && a.hidden !== true);
|
|
128
|
+
// The active-app lookup still spans ALL apps (incl. hidden) so a
|
|
129
|
+
// direct /apps/account navigation keeps rendering the Account branding.
|
|
130
|
+
// ADR-0048 (A) — route segment may be a package id; match by it (name fallback).
|
|
131
|
+
const activeApp = matchAppBySegment(apps.filter((a) => a.active !== false), activeAppName) || activeApps[0];
|
|
127
132
|
// Extract branding information from spec
|
|
128
133
|
const logo = activeApp?.branding?.logo;
|
|
129
134
|
const primaryColor = activeApp?.branding?.primaryColor;
|
|
@@ -146,6 +151,9 @@ export function AppSidebar({ activeAppName, onAppChange }) {
|
|
|
146
151
|
// Resolve navigation items: area navigation > flat navigation > empty
|
|
147
152
|
const activeArea = areas.find((a) => a.id === activeAreaId);
|
|
148
153
|
const resolvedNavigation = activeArea?.navigation || activeApp?.navigation || [];
|
|
154
|
+
// App-level context selectors (e.g. Studio's package scope). Their
|
|
155
|
+
// values are injected into nav items as `{<id>}` template vars.
|
|
156
|
+
const { contextValues, element: contextSelectorsUI } = useAppContextSelectors(activeAppName, activeApp?.contextSelectors, t);
|
|
149
157
|
// Apply saved order and pin state to navigation items
|
|
150
158
|
const processedNavigation = React.useMemo(() => {
|
|
151
159
|
const ordered = applyOrder(resolvedNavigation);
|
|
@@ -185,26 +193,26 @@ export function AppSidebar({ activeAppName, onAppChange }) {
|
|
|
185
193
|
}
|
|
186
194
|
return true;
|
|
187
195
|
}, [registeredObjectNames]);
|
|
188
|
-
const basePath = activeApp ? `/apps/${activeAppName}` : '';
|
|
196
|
+
const basePath = activeApp ? `/apps/${appRouteSegment(activeApp) ?? activeAppName}` : '';
|
|
189
197
|
// Fallback system navigation when no active app exists — routes into the Setup app.
|
|
190
198
|
// The marketplace entry is hidden from non-admin members (install is gated to
|
|
191
199
|
// owner/admin on the server, so non-admins have no reason to see it).
|
|
192
200
|
const systemFallbackNavigation = React.useMemo(() => {
|
|
193
201
|
const items = [
|
|
194
|
-
{ id: 'sys-settings', label: 'System Settings', type: 'url', url: '/apps/setup', icon: 'settings' },
|
|
195
|
-
{ id: 'sys-apps', label: 'Applications', type: 'url', url: '/apps/setup/system/apps', icon: 'layout-grid' },
|
|
202
|
+
{ id: 'sys-settings', label: t('layout.systemNav.systemSettings', { defaultValue: 'System Settings' }), type: 'url', url: '/apps/setup', icon: 'settings' },
|
|
203
|
+
{ id: 'sys-apps', label: t('layout.systemNav.applications', { defaultValue: 'Applications' }), type: 'url', url: '/apps/setup/system/apps', icon: 'layout-grid' },
|
|
196
204
|
];
|
|
197
205
|
if (isWorkspaceAdmin) {
|
|
198
|
-
items.push({ id: 'sys-marketplace', label: 'App Marketplace', type: 'url', url: '/apps/setup/system/marketplace', icon: 'store' });
|
|
206
|
+
items.push({ id: 'sys-marketplace', label: t('layout.systemNav.appMarketplace', { defaultValue: 'App Marketplace' }), type: 'url', url: '/apps/setup/system/marketplace', icon: 'store' });
|
|
199
207
|
}
|
|
200
|
-
items.push({ id: 'sys-objects', label: 'Object Manager', type: 'url', url: '/apps/setup/system/metadata/object', icon: 'database' }, { id: 'sys-
|
|
208
|
+
items.push({ id: 'sys-objects', label: t('layout.systemNav.objectManager', { defaultValue: 'Object Manager' }), type: 'url', url: '/apps/setup/system/metadata/object', icon: 'database' }, { id: 'sys-datasources', label: t('layout.systemNav.datasources', { defaultValue: 'Datasources' }), type: 'url', url: '/apps/setup/component/metadata/resource?type=datasource', icon: 'database' }, { id: 'sys-users', label: t('layout.systemNav.users', { defaultValue: 'Users' }), type: 'url', url: '/apps/setup/system/users', icon: 'users' }, { id: 'sys-orgs', label: t('layout.systemNav.organizations', { defaultValue: 'Organizations' }), type: 'url', url: '/apps/setup/system/organizations', icon: 'building-2' }, { id: 'sys-roles', label: t('layout.systemNav.roles', { defaultValue: 'Roles' }), type: 'url', url: '/apps/setup/system/roles', icon: 'shield' }, { id: 'sys-config', label: t('layout.systemNav.configuration', { defaultValue: 'Configuration' }), type: 'url', url: '/apps/setup/system/settings', icon: 'sliders-horizontal' });
|
|
201
209
|
return items;
|
|
202
|
-
}, [isWorkspaceAdmin]);
|
|
203
|
-
return (_jsxs(_Fragment, { children: [_jsxs(Sidebar, { collapsible: "icon", children: [_jsx(SidebarHeader, { children: _jsx(SidebarMenu, { children: _jsx(SidebarMenuItem, { children: activeApp ? (_jsxs(DropdownMenu, { children: [_jsx(DropdownMenuTrigger, { asChild: true, children: _jsxs(SidebarMenuButton, { size: "lg", className: "data-[state=open]:bg-sidebar-accent data-[state=open]:text-sidebar-accent-foreground", children: [_jsx("div", { className: "flex aspect-square size-8 items-center justify-center rounded-lg bg-primary text-primary-foreground", style: primaryColor ? { backgroundColor: primaryColor } : undefined, children: logo ? (_jsx("img", { src: logo, alt: resolveI18nLabel(activeApp.label, t), className: "size-6 object-contain" })) : (React.createElement(getIcon(activeApp.icon), { className: "size-4" })) }), _jsxs("div", { className: "grid flex-1 text-left text-sm leading-tight", children: [_jsx("span", { className: "truncate font-semibold", children: resolveI18nLabel(activeApp.label, t) }), _jsx("span", { className: "truncate text-xs", children: resolveI18nLabel(activeApp.description, t) ||
|
|
210
|
+
}, [isWorkspaceAdmin, t]);
|
|
211
|
+
return (_jsxs(_Fragment, { children: [_jsxs(Sidebar, { collapsible: "icon", children: [_jsx(SidebarHeader, { children: _jsx(SidebarMenu, { children: _jsx(SidebarMenuItem, { children: activeApp ? (_jsxs(DropdownMenu, { children: [_jsx(DropdownMenuTrigger, { asChild: true, children: _jsxs(SidebarMenuButton, { size: "lg", className: "data-[state=open]:bg-sidebar-accent data-[state=open]:text-sidebar-accent-foreground", children: [_jsx("div", { className: "flex aspect-square size-8 items-center justify-center rounded-lg bg-primary text-primary-foreground", style: primaryColor ? { backgroundColor: primaryColor } : undefined, children: logo ? (_jsx("img", { src: logo, alt: resolveI18nLabel(activeApp.label, t), className: "size-6 object-contain" })) : (React.createElement(getIcon(activeApp.icon), { className: "size-4" })) }), _jsxs("div", { className: "grid flex-1 text-left text-sm leading-tight", children: [_jsx("span", { className: "truncate font-semibold", children: resolveI18nLabel(activeApp.label, t) }), _jsx("span", { className: "truncate text-xs", children: resolveI18nLabel(activeApp.description, t) || t('layout.appSwitcher.appsAvailable', { defaultValue: '{{count}} apps available', count: activeApps.length }) })] }), _jsx(ChevronsUpDown, { className: "ml-auto" })] }) }), _jsxs(DropdownMenuContent, { className: "w-(--radix-dropdown-menu-trigger-width) min-w-56 rounded-lg", align: "start", side: isMobile ? "bottom" : "right", sideOffset: 4, children: [_jsx(DropdownMenuLabel, { className: "text-xs text-muted-foreground", children: t('layout.appSwitcher.switchApplication', { defaultValue: 'Switch Application' }) }), activeApps.map((app) => (_jsxs(DropdownMenuItem, { onClick: () => onAppChange(appRouteSegment(app) ?? app.name), className: "gap-2 p-2", children: [_jsx("div", { className: "flex size-6 items-center justify-center rounded-sm border", children: app.icon ? React.createElement(getIcon(app.icon), { className: "size-3" }) : _jsx(Database, { className: "size-3" }) }), resolveI18nLabel(app.label, t), activeApp.name === app.name && _jsx("span", { className: "ml-auto text-xs", children: "\u2713" })] }, app.name))), _jsx(DropdownMenuSeparator, {}), _jsxs(DropdownMenuItem, { className: "gap-2 p-2", onClick: () => navigate('/home'), "data-testid": "home-link-btn", children: [_jsx("div", { className: "flex size-6 items-center justify-center rounded-md border bg-background", children: _jsx(Home, { className: "size-4" }) }), _jsx("div", { className: "font-medium text-muted-foreground", children: t('layout.appSwitcher.home') })] }), _jsx(DropdownMenuSeparator, {}), _jsxs(DropdownMenuItem, { className: "gap-2 p-2", onClick: () => navigate(`/apps/${appRouteSegment(activeApp) ?? activeAppName}/create-app`), "data-testid": "add-app-btn", children: [_jsx("div", { className: "flex size-6 items-center justify-center rounded-md border bg-background", children: _jsx(Plus, { className: "size-4" }) }), _jsx("div", { className: "font-medium text-muted-foreground", children: t('layout.appSwitcher.addApp') })] }), _jsxs(DropdownMenuItem, { className: "gap-2 p-2", onClick: () => navigate(`/apps/${appRouteSegment(activeApp) ?? activeAppName}/edit-app/${activeAppName}`), "data-testid": "edit-app-btn", children: [_jsx("div", { className: "flex size-6 items-center justify-center rounded-md border bg-background", children: _jsx(Pencil, { className: "size-4" }) }), _jsx("div", { className: "font-medium text-muted-foreground", children: t('layout.appSwitcher.editApp') })] }), _jsxs(DropdownMenuItem, { className: "gap-2 p-2", onClick: () => navigate('/apps/setup/system/apps'), "data-testid": "manage-all-apps-btn", children: [_jsx("div", { className: "flex size-6 items-center justify-center rounded-md border bg-background", children: _jsx(Settings, { className: "size-4" }) }), _jsx("div", { className: "font-medium text-muted-foreground", children: t('layout.appSwitcher.manageAllApps') })] })] })] })) : (_jsxs(SidebarMenuButton, { size: "lg", onClick: () => navigate('/apps/setup'), "data-testid": "system-sidebar-header", children: [_jsx("div", { className: "flex aspect-square size-8 items-center justify-center rounded-lg bg-primary text-primary-foreground", children: _jsx(Settings, { className: "size-4" }) }), _jsxs("div", { className: "grid flex-1 text-left text-sm leading-tight", children: [_jsx("span", { className: "truncate font-semibold", children: t('layout.appSwitcher.systemConsole') }), _jsx("span", { className: "truncate text-xs text-muted-foreground", children: t('layout.appSwitcher.noAppsConfigured') })] })] })) }) }) }), _jsx(SidebarContent, { children: activeApp ? (_jsxs(_Fragment, { children: [areas.length > 1 && (_jsxs(SidebarGroup, { children: [_jsxs(SidebarGroupLabel, { className: "flex items-center gap-1.5", children: [_jsx(Layers, { className: "h-3.5 w-3.5" }), t('sidebar.area', { defaultValue: 'Area' })] }), _jsx(SidebarGroupContent, { children: _jsx(SidebarMenu, { children: areas.map((area) => {
|
|
204
212
|
const AreaIcon = getIcon(area.icon);
|
|
205
213
|
const isActiveArea = area.id === activeAreaId;
|
|
206
214
|
return (_jsx(SidebarMenuItem, { children: _jsxs(SidebarMenuButton, { isActive: isActiveArea, tooltip: area.label, onClick: () => setActiveAreaId(area.id), children: [_jsx(AreaIcon, { className: "h-4 w-4" }), _jsx("span", { children: area.label })] }) }, area.id));
|
|
207
|
-
}) }) })] })), _jsx(SidebarGroup, { className: "py-0", children: _jsxs(SidebarGroupContent, { className: "relative", children: [_jsx(Search, { className: "pointer-events-none absolute left-2 top-1/2 size-4 -translate-y-1/2 select-none opacity-70" }), _jsx(SidebarInput, { placeholder:
|
|
215
|
+
}) }) })] })), contextSelectorsUI && (_jsx(SidebarGroup, { className: "py-1", children: _jsx(SidebarGroupContent, { children: contextSelectorsUI }) })), _jsx(SidebarGroup, { className: "py-0", children: _jsxs(SidebarGroupContent, { className: "relative", children: [_jsx(Search, { className: "pointer-events-none absolute left-2 top-1/2 size-4 -translate-y-1/2 select-none opacity-70" }), _jsx(SidebarInput, { placeholder: t('sidebar.searchNavigation', { defaultValue: 'Search navigation...' }), value: navSearchQuery, onChange: (e) => setNavSearchQuery(e.target.value), className: "pl-8" })] }) }), _jsx(NavigationRenderer, { items: processedNavigation, basePath: basePath, evaluateVisibility: evalVis, checkPermission: checkPerm, checkCapability: checkCap, searchQuery: navSearchQuery, enablePinning: true, onPinToggle: togglePin, enableReorder: true, onReorder: handleReorder, resolveObjectLabel: (objectName, fallback) => resolveNavObjectLabel({ name: objectName, label: fallback }), resolveViewLabel: (objectName, viewName, fallback) => resolveNavViewLabel(objectName, viewName, fallback), t: t, templateContext: { currentUserId: user?.id ?? null, contextValues } }), recentItems.length > 0 && (_jsxs(SidebarGroup, { children: [_jsxs(SidebarGroupLabel, { className: "flex items-center gap-1.5 cursor-pointer select-none", onClick: () => setRecentExpanded(prev => !prev), children: [_jsx(ChevronRight, { className: `h-3 w-3 transition-transform duration-150 ${recentExpanded ? 'rotate-90' : ''}` }), _jsx(Clock, { className: "h-3.5 w-3.5" }), t('sidebar.recent', { defaultValue: 'Recent' })] }), recentExpanded && (_jsx(SidebarGroupContent, { children: _jsx(SidebarMenu, { children: recentItems.slice(0, 5).map(item => (_jsx(SidebarMenuItem, { children: _jsx(SidebarMenuButton, { asChild: true, tooltip: item.label, children: _jsxs(Link, { to: item.href, children: [_jsx("span", { className: "text-muted-foreground", children: item.type === 'dashboard' ? '📊' : item.type === 'report' ? '📈' : '📄' }), _jsx("span", { className: "truncate", children: item.label })] }) }) }, item.id))) }) }))] })), favorites.some(f => f.type !== 'nav') && (_jsxs(SidebarGroup, { children: [_jsxs(SidebarGroupLabel, { className: "flex items-center gap-1.5", children: [_jsx(Star, { className: "h-3.5 w-3.5" }), t('sidebar.favorites', { defaultValue: 'Favorites' })] }), _jsx(SidebarGroupContent, { children: _jsx(SidebarMenu, { children: favorites.filter(f => f.type !== 'nav').slice(0, 8).map(item => (_jsxs(SidebarMenuItem, { children: [_jsx(SidebarMenuButton, { asChild: true, tooltip: item.label, children: _jsxs(Link, { to: item.href, children: [_jsx("span", { className: "text-muted-foreground", children: item.type === 'dashboard' ? '📊' : item.type === 'report' ? '📈' : item.type === 'page' ? '📄' : '📋' }), _jsx("span", { className: "truncate", children: item.label })] }) }), _jsx(SidebarMenuAction, { showOnHover: true, onClick: (e) => { e.stopPropagation(); removeFavorite(item.id); }, "aria-label": t('sidebar.removeFromFavorites', { defaultValue: 'Remove {{name}} from favorites', name: item.label }), children: _jsx(StarOff, { className: "h-3 w-3" }) })] }, item.id))) }) })] }))] })) : (_jsxs(SidebarGroup, { "data-testid": "system-fallback-nav", children: [_jsxs(SidebarGroupLabel, { className: "flex items-center gap-1.5", children: [_jsx(Settings, { className: "h-3.5 w-3.5" }), t('layout.appSwitcher.systemConsole', { defaultValue: 'System' })] }), _jsx(SidebarGroupContent, { children: _jsx(SidebarMenu, { children: systemFallbackNavigation.map((item) => {
|
|
208
216
|
const NavIcon = getIcon(item.icon);
|
|
209
217
|
return (_jsx(SidebarMenuItem, { children: _jsx(SidebarMenuButton, { asChild: true, tooltip: item.label, children: _jsxs(Link, { to: item.url || '/system', children: [_jsx(NavIcon, { className: "h-4 w-4" }), _jsx("span", { children: item.label })] }) }) }, item.id));
|
|
210
218
|
}) }) })] })) }), _jsx(SidebarFooter, { children: _jsx(SidebarMenu, { children: _jsx(SidebarMenuItem, { children: _jsxs(DropdownMenu, { children: [_jsx(DropdownMenuTrigger, { asChild: true, children: _jsxs(SidebarMenuButton, { size: "lg", className: "data-[state=open]:bg-sidebar-accent data-[state=open]:text-sidebar-accent-foreground", children: [_jsxs(Avatar, { className: "h-8 w-8 rounded-lg", children: [_jsx(AvatarImage, { src: user?.image, alt: user?.name ?? 'User' }), _jsx(AvatarFallback, { className: "rounded-lg bg-primary text-primary-foreground", children: getUserInitials(user) })] }), _jsxs("div", { className: "grid flex-1 text-left text-sm leading-tight", children: [_jsx("span", { className: "truncate font-semibold", children: user?.name ?? 'User' }), _jsx("span", { className: "truncate text-xs text-muted-foreground", children: user?.email ?? '' })] }), _jsx(ChevronsUpDown, { className: "ml-auto size-4" })] }) }), _jsxs(DropdownMenuContent, { className: "w-(--radix-dropdown-menu-trigger-width) min-w-56 rounded-lg", side: isMobile ? "bottom" : "right", align: "end", sideOffset: 4, children: [_jsx(DropdownMenuLabel, { className: "p-0 font-normal", children: _jsxs("div", { className: "flex items-center gap-2 px-1 py-1.5 text-left text-sm", children: [_jsxs(Avatar, { className: "h-8 w-8 rounded-lg", children: [_jsx(AvatarImage, { src: user?.image, alt: user?.name ?? 'User' }), _jsx(AvatarFallback, { className: "rounded-lg bg-primary text-primary-foreground", children: getUserInitials(user) })] }), _jsxs("div", { className: "grid flex-1 text-left text-sm leading-tight", children: [_jsx("span", { className: "truncate font-semibold", children: user?.name ?? 'User' }), _jsx("span", { className: "truncate text-xs text-muted-foreground", children: user?.email ?? '' })] })] }) }), _jsx(DropdownMenuSeparator, {}), _jsx(DropdownMenuGroup, { children: _jsxs(DropdownMenuItem, { onClick: () => navigate('/apps/setup'), children: [_jsx(Settings, { className: "mr-2 h-4 w-4" }), t('user.settings', { defaultValue: 'Settings' })] }) }), isAuthEnabled && (_jsxs(_Fragment, { children: [_jsx(DropdownMenuSeparator, {}), _jsxs(DropdownMenuItem, { className: "text-destructive focus:text-destructive", onClick: () => signOut(), children: [_jsx(LogOut, { className: "mr-2 h-4 w-4" }), t('user.logout', { defaultValue: 'Log out' })] })] }))] })] }) }) }) })] }), isMobile && (_jsx("div", { className: "fixed bottom-0 left-0 right-0 z-50 flex items-center justify-around border-t bg-background/95 backdrop-blur-sm px-2 py-1 sm:hidden safe-area-bottom", children: (() => {
|
|
@@ -226,36 +234,8 @@ export function AppSidebar({ activeAppName, onAppChange }) {
|
|
|
226
234
|
}
|
|
227
235
|
return leaves.slice(0, 5).map((item) => {
|
|
228
236
|
const NavIcon = getIcon(item.icon);
|
|
229
|
-
const baseUrl = activeApp ? `/apps/${activeAppName}` : '';
|
|
230
|
-
|
|
231
|
-
if (item.type === 'object') {
|
|
232
|
-
href = `${baseUrl}/${item.objectName}`;
|
|
233
|
-
if (item.viewName)
|
|
234
|
-
href += `/view/${item.viewName}`;
|
|
235
|
-
}
|
|
236
|
-
else if (item.type === 'dashboard')
|
|
237
|
-
href = item.dashboardName ? `${baseUrl}/dashboard/${item.dashboardName}` : '#';
|
|
238
|
-
else if (item.type === 'page')
|
|
239
|
-
href = item.pageName ? `${baseUrl}/page/${item.pageName}` : '#';
|
|
240
|
-
else if (item.type === 'component') {
|
|
241
|
-
const ref = item.componentRef;
|
|
242
|
-
if (ref) {
|
|
243
|
-
const segs = ref.split(':').filter(Boolean);
|
|
244
|
-
href = `${baseUrl}/component/${segs.join('/')}`;
|
|
245
|
-
const navParams = item.params;
|
|
246
|
-
if (navParams) {
|
|
247
|
-
const usp = new URLSearchParams();
|
|
248
|
-
for (const [k, v] of Object.entries(navParams)) {
|
|
249
|
-
if (v === undefined || v === null)
|
|
250
|
-
continue;
|
|
251
|
-
usp.set(k, typeof v === 'string' ? v : JSON.stringify(v));
|
|
252
|
-
}
|
|
253
|
-
const qs = usp.toString();
|
|
254
|
-
if (qs)
|
|
255
|
-
href += `?${qs}`;
|
|
256
|
-
}
|
|
257
|
-
}
|
|
258
|
-
}
|
|
237
|
+
const baseUrl = activeApp ? `/apps/${appRouteSegment(activeApp) ?? activeAppName}` : '';
|
|
238
|
+
const { href } = resolveHref(item, baseUrl, { currentUserId: user?.id ?? null });
|
|
259
239
|
return (_jsxs(Link, { to: href, className: "flex flex-col items-center gap-0.5 px-2 py-1.5 text-muted-foreground hover:text-foreground transition-colors min-w-[44px] min-h-[44px] justify-center", children: [_jsx(NavIcon, { className: "h-5 w-5" }), _jsx("span", { className: "text-[10px] truncate max-w-[60px]", children: resolveI18nLabel(item.label, t) })] }, item.id));
|
|
260
240
|
});
|
|
261
241
|
})() }))] }));
|
|
@@ -5,8 +5,9 @@
|
|
|
5
5
|
* Renders as: [App Name] [ChevronDown] — minimal ghost trigger, no icon box.
|
|
6
6
|
* @module
|
|
7
7
|
*/
|
|
8
|
+
import * as React from 'react';
|
|
8
9
|
export interface AppSwitcherProps {
|
|
9
10
|
activeAppName: string;
|
|
10
11
|
onAppChange: (name: string) => void;
|
|
11
12
|
}
|
|
12
|
-
export declare function AppSwitcher({ activeAppName, onAppChange }: AppSwitcherProps):
|
|
13
|
+
export declare function AppSwitcher({ activeAppName, onAppChange }: AppSwitcherProps): React.JSX.Element | null;
|
|
@@ -2,7 +2,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
2
2
|
import { DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, } from '@object-ui/components';
|
|
3
3
|
import { ChevronDown, Check } from 'lucide-react';
|
|
4
4
|
import { useMetadata } from '../providers/MetadataProvider';
|
|
5
|
-
import { resolveI18nLabel } from '../utils';
|
|
5
|
+
import { resolveI18nLabel, matchAppBySegment, appRouteSegment } from '../utils';
|
|
6
6
|
import { useObjectTranslation, useObjectLabel } from '@object-ui/i18n';
|
|
7
7
|
import { getIcon } from '../utils/getIcon';
|
|
8
8
|
export function AppSwitcher({ activeAppName, onAppChange }) {
|
|
@@ -10,15 +10,19 @@ export function AppSwitcher({ activeAppName, onAppChange }) {
|
|
|
10
10
|
const { t } = useObjectTranslation();
|
|
11
11
|
const { appLabel } = useObjectLabel();
|
|
12
12
|
const apps = metadataApps || [];
|
|
13
|
-
|
|
14
|
-
|
|
13
|
+
// Hidden apps (App.hidden === true) live in the avatar dropdown
|
|
14
|
+
// (personal-settings-style surfaces like the Account app), not the
|
|
15
|
+
// top-level App Switcher.
|
|
16
|
+
const activeApps = apps.filter((a) => a.active !== false && a.hidden !== true);
|
|
17
|
+
// ADR-0048 (A) — route segment may be a package id; match by it (name fallback).
|
|
18
|
+
const activeApp = matchAppBySegment(activeApps, activeAppName) || matchAppBySegment(apps.filter((a) => a.active !== false), activeAppName) || activeApps[0];
|
|
15
19
|
if (!activeApp)
|
|
16
20
|
return null;
|
|
17
21
|
const appLabelText = appLabel({ name: activeApp.name, label: resolveI18nLabel(activeApp.label, t) });
|
|
18
|
-
return (_jsxs(DropdownMenu, { children: [_jsx(DropdownMenuTrigger, { asChild: true, children: _jsxs("button", { className: "flex items-center gap-1 rounded-md px-1.5 py-1 text-sm font-medium text-foreground/80 hover:bg-accent hover:text-foreground transition-colors outline-none focus-visible:ring-2 focus-visible:ring-ring max-w-[40vw] sm:max-w-none", children: [_jsx("span", { className: "truncate whitespace-nowrap", children: appLabelText }), _jsx(ChevronDown, { className: "h-3.5 w-3.5 text-muted-foreground shrink-0" })] }) }), _jsxs(DropdownMenuContent, { align: "start", sideOffset: 8, className: "w-60", children: [_jsx(DropdownMenuLabel, { className: "text-xs text-muted-foreground font-normal", children:
|
|
22
|
+
return (_jsxs(DropdownMenu, { children: [_jsx(DropdownMenuTrigger, { asChild: true, children: _jsxs("button", { className: "flex items-center gap-1 rounded-md px-1.5 py-1 text-sm font-medium text-foreground/80 hover:bg-accent hover:text-foreground transition-colors outline-none focus-visible:ring-2 focus-visible:ring-ring max-w-[40vw] sm:max-w-none", children: [_jsx("span", { className: "truncate whitespace-nowrap", children: appLabelText }), _jsx(ChevronDown, { className: "h-3.5 w-3.5 text-muted-foreground shrink-0" })] }) }), _jsxs(DropdownMenuContent, { align: "start", sideOffset: 8, className: "w-60", children: [_jsx(DropdownMenuLabel, { className: "text-xs text-muted-foreground font-normal", children: t('layout.appSwitcher.switchApplication', { defaultValue: 'Switch Application' }) }), _jsx(DropdownMenuSeparator, {}), activeApps.map((app) => {
|
|
19
23
|
const AppIcon = getIcon(app.icon);
|
|
20
24
|
const label = appLabel({ name: app.name, label: resolveI18nLabel(app.label, t) });
|
|
21
25
|
const isActive = activeApp.name === app.name;
|
|
22
|
-
return (_jsxs(DropdownMenuItem, { onClick: () => onAppChange(app.name), className: "flex items-center gap-2.5 py-2", children: [_jsx("div", { className: "flex size-5 shrink-0 items-center justify-center rounded border bg-muted text-muted-foreground", children: _jsx(AppIcon, { className: "size-3" }) }), _jsx("span", { className: "flex-1 truncate", children: label }), isActive && _jsx(Check, { className: "size-3.5 text-primary shrink-0" })] }, app.name));
|
|
26
|
+
return (_jsxs(DropdownMenuItem, { onClick: () => onAppChange(appRouteSegment(app) ?? app.name), className: "flex items-center gap-2.5 py-2", children: [_jsx("div", { className: "flex size-5 shrink-0 items-center justify-center rounded border bg-muted text-muted-foreground", children: _jsx(AppIcon, { className: "size-3" }) }), _jsx("span", { className: "flex-1 truncate", children: label }), isActive && _jsx(Check, { className: "size-3.5 text-primary shrink-0" })] }, app.name));
|
|
23
27
|
})] })] }));
|
|
24
28
|
}
|
|
@@ -10,5 +10,5 @@ interface ConnectionStatusProps {
|
|
|
10
10
|
state: ConnectionState;
|
|
11
11
|
className?: string;
|
|
12
12
|
}
|
|
13
|
-
export declare function ConnectionStatus({ state, className }: ConnectionStatusProps): import("react
|
|
13
|
+
export declare function ConnectionStatus({ state, className }: ConnectionStatusProps): import("react").JSX.Element | null;
|
|
14
14
|
export {};
|
|
@@ -9,15 +9,18 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
9
9
|
import { useState, useEffect } from 'react';
|
|
10
10
|
import { cn } from '@object-ui/components';
|
|
11
11
|
import { WifiOff, Loader2, CheckCircle2 } from 'lucide-react';
|
|
12
|
+
import { useObjectTranslation } from '@object-ui/i18n';
|
|
12
13
|
const statusConfig = {
|
|
13
|
-
connected: {
|
|
14
|
-
connecting: {
|
|
15
|
-
reconnecting: {
|
|
16
|
-
disconnected: {
|
|
17
|
-
error: {
|
|
14
|
+
connected: { labelKey: 'topbar.connection.connected', defaultValue: 'Connected', color: 'text-green-500', icon: CheckCircle2 },
|
|
15
|
+
connecting: { labelKey: 'topbar.connection.connecting', defaultValue: 'Connecting...', color: 'text-yellow-500', icon: Loader2 },
|
|
16
|
+
reconnecting: { labelKey: 'topbar.connection.reconnecting', defaultValue: 'Reconnecting...', color: 'text-yellow-500', icon: Loader2 },
|
|
17
|
+
disconnected: { labelKey: 'topbar.connection.disconnected', defaultValue: 'Disconnected', color: 'text-muted-foreground', icon: WifiOff },
|
|
18
|
+
error: { labelKey: 'topbar.connection.error', defaultValue: 'Connection Error', color: 'text-destructive', icon: WifiOff },
|
|
18
19
|
};
|
|
19
20
|
export function ConnectionStatus({ state, className }) {
|
|
20
21
|
const config = statusConfig[state];
|
|
22
|
+
const { t } = useObjectTranslation();
|
|
23
|
+
const label = t(config.labelKey, { defaultValue: config.defaultValue });
|
|
21
24
|
const Icon = config.icon;
|
|
22
25
|
const [showConnected, setShowConnected] = useState(false);
|
|
23
26
|
// Briefly show "Connected" when transitioning to connected state
|
|
@@ -32,5 +35,5 @@ export function ConnectionStatus({ state, className }) {
|
|
|
32
35
|
// Hide when connected (after the brief flash)
|
|
33
36
|
if (state === 'connected' && !showConnected)
|
|
34
37
|
return null;
|
|
35
|
-
return (_jsxs("div", { className: cn('flex items-center gap-1.5 text-xs font-medium px-2 py-1 rounded-md transition-opacity duration-300', config.color, state === 'connected' && 'bg-green-500/10', state === 'error' && 'bg-destructive/10', state === 'reconnecting' && 'bg-yellow-500/10', className), title:
|
|
38
|
+
return (_jsxs("div", { className: cn('flex items-center gap-1.5 text-xs font-medium px-2 py-1 rounded-md transition-opacity duration-300', config.color, state === 'connected' && 'bg-green-500/10', state === 'error' && 'bg-destructive/10', state === 'reconnecting' && 'bg-yellow-500/10', className), title: label, children: [_jsx(Icon, { className: cn('h-3.5 w-3.5', (state === 'connecting' || state === 'reconnecting') && 'animate-spin') }), _jsx("span", { className: "hidden sm:inline", children: label })] }));
|
|
36
39
|
}
|
|
@@ -1,3 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ConsoleChatbotFab
|
|
3
|
+
*
|
|
4
|
+
* Lightweight FAB proxy for the console's floating AI assistant.
|
|
5
|
+
*
|
|
6
|
+
* Before any interaction this component renders a small, zero-dependency
|
|
7
|
+
* button (~1KB). On first hover/focus it speculatively warms the heavy
|
|
8
|
+
* chat chunk graph (plugin-chatbot → streamdown → shiki → mermaid →
|
|
9
|
+
* @ai-sdk, ~20MB); on first click it lazy-mounts `<ConsoleFloatingChatbot
|
|
10
|
+
* defaultOpen />` which takes over (its own FAB replaces this stub).
|
|
11
|
+
*
|
|
12
|
+
* Net effect: every console page-load no longer pays the chat-bundle
|
|
13
|
+
* cost just for the FAB to be visible — those bytes only download when
|
|
14
|
+
* the user actually opens (or hovers) the assistant.
|
|
15
|
+
*
|
|
16
|
+
* @module
|
|
17
|
+
*/
|
|
18
|
+
import React from 'react';
|
|
1
19
|
import type { ConsoleFloatingChatbotProps } from './ConsoleFloatingChatbot';
|
|
2
20
|
export type ConsoleChatbotFabProps = ConsoleFloatingChatbotProps;
|
|
3
|
-
export declare function ConsoleChatbotFab(props: ConsoleChatbotFabProps):
|
|
21
|
+
export declare function ConsoleChatbotFab(props: ConsoleChatbotFabProps): React.JSX.Element;
|
|
@@ -16,15 +16,29 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
16
16
|
*
|
|
17
17
|
* @module
|
|
18
18
|
*/
|
|
19
|
-
import { Suspense, lazy, useState } from 'react';
|
|
19
|
+
import { Suspense, lazy, useEffect, useRef, useState } from 'react';
|
|
20
|
+
import { useAssistant } from '../assistant/assistantBus';
|
|
21
|
+
import { useObjectTranslation } from '@object-ui/i18n';
|
|
20
22
|
const ConsoleFloatingChatbot = lazy(() => import('./ConsoleFloatingChatbot'));
|
|
21
23
|
const prefetchChatbot = () => {
|
|
22
24
|
void import('./ConsoleFloatingChatbot');
|
|
23
25
|
};
|
|
24
26
|
export function ConsoleChatbotFab(props) {
|
|
25
27
|
const [armed, setArmed] = useState(false);
|
|
28
|
+
const { t } = useObjectTranslation();
|
|
29
|
+
// A designer surface can ask the assistant to open (e.g. an "Ask AI"
|
|
30
|
+
// button) via the assistant bus — arming the lazy chatbot just like a
|
|
31
|
+
// click does. Once armed, the chatbot's own trigger owns open/close.
|
|
32
|
+
const { openSeq } = useAssistant();
|
|
33
|
+
const seenOpenSeq = useRef(openSeq);
|
|
34
|
+
useEffect(() => {
|
|
35
|
+
if (openSeq !== seenOpenSeq.current) {
|
|
36
|
+
seenOpenSeq.current = openSeq;
|
|
37
|
+
setArmed(true);
|
|
38
|
+
}
|
|
39
|
+
}, [openSeq]);
|
|
26
40
|
if (armed) {
|
|
27
41
|
return (_jsx(Suspense, { fallback: null, children: _jsx(ConsoleFloatingChatbot, { ...props, defaultOpen: true }) }));
|
|
28
42
|
}
|
|
29
|
-
return (_jsx("button", { type: "button", "aria-label":
|
|
43
|
+
return (_jsx("button", { type: "button", "aria-label": t('topbar.openAssistant', { defaultValue: 'Open {{name}} assistant', name: props.appLabel }), onClick: () => setArmed(true), onMouseEnter: prefetchChatbot, onFocus: prefetchChatbot, className: "fixed bottom-20 right-6 z-50 flex h-14 w-14 items-center justify-center rounded-full bg-primary text-primary-foreground shadow-lg ring-1 ring-primary/20 transition-transform hover:scale-105 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary focus-visible:ring-offset-2 sm:bottom-6", "data-testid": "console-chatbot-fab", children: _jsxs("svg", { width: "22", height: "22", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": "true", children: [_jsx("path", { d: "M12 3v3" }), _jsx("path", { d: "M12 18v3" }), _jsx("path", { d: "M5.6 5.6l2.1 2.1" }), _jsx("path", { d: "M16.3 16.3l2.1 2.1" }), _jsx("path", { d: "M3 12h3" }), _jsx("path", { d: "M18 12h3" }), _jsx("path", { d: "M5.6 18.4l2.1-2.1" }), _jsx("path", { d: "M16.3 7.7l2.1-2.1" }), _jsx("circle", { cx: "12", cy: "12", r: "3" })] }) }));
|
|
30
44
|
}
|
|
@@ -1,17 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ConsoleFloatingChatbot
|
|
3
|
+
*
|
|
4
|
+
* Wires the global FAB chatbot to the framework's `@objectstack/service-ai`
|
|
5
|
+
* backend (the `/api/v1/ai/agents/:agentName/chat` Vercel Data Stream
|
|
6
|
+
* endpoint) and exposes an in-header agent picker.
|
|
7
|
+
*
|
|
8
|
+
* The chatbot pulls in `react-markdown` + `micromark` (~150 KB) which is
|
|
9
|
+
* unused on every page until the AI assistant is enabled, so deferring it
|
|
10
|
+
* keeps those bytes off the initial paint.
|
|
11
|
+
* @module
|
|
12
|
+
*/
|
|
13
|
+
import React from 'react';
|
|
1
14
|
interface ConsoleObject {
|
|
2
15
|
name: string;
|
|
3
16
|
label?: string;
|
|
4
17
|
}
|
|
5
18
|
export interface ConsoleFloatingChatbotProps {
|
|
6
19
|
appLabel: string;
|
|
20
|
+
/**
|
|
21
|
+
* Machine name of the active app (e.g. "studio", "crm"). Forwarded as
|
|
22
|
+
* `context.appName` so the backend can scope skills/resolution to the
|
|
23
|
+
* current application surface.
|
|
24
|
+
*/
|
|
25
|
+
appName?: string;
|
|
7
26
|
objects: ConsoleObject[];
|
|
8
27
|
/**
|
|
9
28
|
* Base URL of the AI service. Defaults to `${VITE_SERVER_URL}/api/v1/ai`
|
|
10
29
|
* (or the relative `/api/v1/ai` when no server URL is configured).
|
|
11
30
|
*/
|
|
12
31
|
apiBase?: string;
|
|
13
|
-
/**
|
|
32
|
+
/**
|
|
33
|
+
* Agent the app is bound to (`app.defaultAgent`). When set, the chatbot
|
|
34
|
+
* opens straight onto this agent — Studio → `metadata_assistant`, every
|
|
35
|
+
* other app falls through to the platform data-query agent (`data_chat`).
|
|
36
|
+
*/
|
|
14
37
|
defaultAgent?: string;
|
|
38
|
+
/**
|
|
39
|
+
* Force the in-header agent switcher on (`true`) or off (`false`),
|
|
40
|
+
* overriding the default. When left undefined the switcher auto-reveals
|
|
41
|
+
* only when AI development is unlocked for the viewer — the live catalog
|
|
42
|
+
* serves BOTH an `ask` and a `build` agent and `aiStudio` isn't disabled —
|
|
43
|
+
* so pure end-user apps (only `ask`) stay clean while builders can flip
|
|
44
|
+
* Ask↔Build inline. `VITE_AI_SHOW_AGENT_PICKER=true` also forces it on.
|
|
45
|
+
*/
|
|
46
|
+
showAgentPicker?: boolean;
|
|
15
47
|
/** Whether the floating panel should open immediately on mount. */
|
|
16
48
|
defaultOpen?: boolean;
|
|
17
49
|
/**
|
|
@@ -21,5 +53,5 @@ export interface ConsoleFloatingChatbotProps {
|
|
|
21
53
|
*/
|
|
22
54
|
userId?: string;
|
|
23
55
|
}
|
|
24
|
-
export default function ConsoleFloatingChatbot({ appLabel, objects, apiBase: apiBaseProp, defaultAgent: defaultAgentProp, defaultOpen, userId, }: ConsoleFloatingChatbotProps):
|
|
56
|
+
export default function ConsoleFloatingChatbot({ appLabel, appName, objects, apiBase: apiBaseProp, defaultAgent: defaultAgentProp, showAgentPicker: showAgentPickerProp, defaultOpen, userId, }: ConsoleFloatingChatbotProps): React.JSX.Element;
|
|
25
57
|
export {};
|