@vertesia/ui 1.5.0-dev.20260905.011013Z → 1.5.0-dev.20260910.052912Z
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/lib/core/components/Avatar.d.ts.map +1 -1
- package/lib/core/components/Avatar.js +3 -3
- package/lib/core/components/Avatar.js.map +1 -1
- package/lib/core/components/ComboBox.js +1 -1
- package/lib/core/components/ComboBox.js.map +1 -1
- package/lib/core/components/FileUpload.js +1 -1
- package/lib/core/components/FileUpload.js.map +1 -1
- package/lib/core/components/Link.js +1 -1
- package/lib/core/components/Link.js.map +1 -1
- package/lib/core/components/SelectList.js +1 -1
- package/lib/core/components/SelectList.js.map +1 -1
- package/lib/core/components/SidePanel.js +1 -1
- package/lib/core/components/SidePanel.js.map +1 -1
- package/lib/core/components/Spinner.js +1 -1
- package/lib/core/components/Spinner.js.map +1 -1
- package/lib/core/components/TagsInput.js +8 -8
- package/lib/core/components/TagsInput.js.map +1 -1
- package/lib/core/components/shadcn/MessageBox.js +1 -1
- package/lib/core/components/shadcn/MessageBox.js.map +1 -1
- package/lib/core/components/shadcn/button.js +1 -1
- package/lib/core/components/shadcn/button.js.map +1 -1
- package/lib/core/components/shadcn/card.d.ts.map +1 -1
- package/lib/core/components/shadcn/card.js +1 -1
- package/lib/core/components/shadcn/card.js.map +1 -1
- package/lib/core/components/shadcn/command.js +5 -5
- package/lib/core/components/shadcn/command.js.map +1 -1
- package/lib/core/components/shadcn/filters/DynamicLabel.js +1 -1
- package/lib/core/components/shadcn/filters/DynamicLabel.js.map +1 -1
- package/lib/core/components/shadcn/filters/comboBox/DateCombobox.js +3 -3
- package/lib/core/components/shadcn/filters/comboBox/DateCombobox.js.map +1 -1
- package/lib/core/components/shadcn/input.js +3 -3
- package/lib/core/components/shadcn/input.js.map +1 -1
- package/lib/core/components/shadcn/modal/ConfirmModal.js +1 -1
- package/lib/core/components/shadcn/modal/ConfirmModal.js.map +1 -1
- package/lib/core/components/shadcn/modal/dialog.d.ts.map +1 -1
- package/lib/core/components/shadcn/modal/dialog.js +2 -2
- package/lib/core/components/shadcn/modal/dialog.js.map +1 -1
- package/lib/core/components/shadcn/overflowTabs.js +2 -2
- package/lib/core/components/shadcn/overflowTabs.js.map +1 -1
- package/lib/core/components/shadcn/popover.js +1 -1
- package/lib/core/components/shadcn/popover.js.map +1 -1
- package/lib/core/components/shadcn/radioGroup.d.ts.map +1 -1
- package/lib/core/components/shadcn/radioGroup.js +3 -3
- package/lib/core/components/shadcn/radioGroup.js.map +1 -1
- package/lib/core/components/shadcn/selectBox.js +1 -1
- package/lib/core/components/shadcn/selectBox.js.map +1 -1
- package/lib/core/components/shadcn/tabs.d.ts.map +1 -1
- package/lib/core/components/shadcn/tabs.js +5 -2
- package/lib/core/components/shadcn/tabs.js.map +1 -1
- package/lib/core/components/styles.js +1 -1
- package/lib/core/components/styles.js.map +1 -1
- package/lib/core/components/table/index.js +1 -1
- package/lib/core/hooks/useFetch.d.ts.map +1 -1
- package/lib/core/hooks/useFetch.js +2 -0
- package/lib/core/hooks/useFetch.js.map +1 -1
- package/lib/features/activity-doc/ActivityDoc.js +8 -8
- package/lib/features/activity-doc/ActivityDoc.js.map +1 -1
- package/lib/features/agent/chat/AgentChart.js +1 -1
- package/lib/features/agent/chat/AgentChart.js.map +1 -1
- package/lib/features/agent/chat/AskUserWidget.d.ts.map +1 -1
- package/lib/features/agent/chat/AskUserWidget.js +13 -13
- package/lib/features/agent/chat/AskUserWidget.js.map +1 -1
- package/lib/features/agent/chat/JumpingDots.js +1 -1
- package/lib/features/agent/chat/JumpingDots.js.map +1 -1
- package/lib/features/agent/chat/ModernAgentConversation.js +1 -1
- package/lib/features/agent/chat/ModernAgentConversation.js.map +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/AllMessagesMixed.d.ts.map +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/AllMessagesMixed.js +22 -9
- package/lib/features/agent/chat/ModernAgentOutput/AllMessagesMixed.js.map +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/BatchProgressPanel.js +5 -5
- package/lib/features/agent/chat/ModernAgentOutput/BatchProgressPanel.js.map +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/Header.js +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/Header.js.map +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/InlineSlideInPanel.js +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/InlineSlideInPanel.js.map +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/MessageInput.js +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/MessageInput.js.map +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/MessageItem.d.ts.map +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/MessageItem.js +7 -7
- package/lib/features/agent/chat/ModernAgentOutput/MessageItem.js.map +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/MessagesContainer.js +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/MessagesContainer.js.map +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/PlanPanel.d.ts.map +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/PlanPanel.js +10 -10
- package/lib/features/agent/chat/ModernAgentOutput/PlanPanel.js.map +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/SlideInPanel.js +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/SlideInPanel.js.map +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/SlidingMessages.d.ts.map +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/SlidingMessages.js +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/SlidingMessages.js.map +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/SlidingPlanPanel.js +17 -17
- package/lib/features/agent/chat/ModernAgentOutput/SlidingPlanPanel.js.map +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/StreamingMessage.js +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/StreamingMessage.js.map +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/SummaryConversation.d.ts.map +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/SummaryConversation.js +14 -2
- package/lib/features/agent/chat/ModernAgentOutput/SummaryConversation.js.map +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/ToolCallGroup.d.ts.map +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/ToolCallGroup.js +15 -15
- package/lib/features/agent/chat/ModernAgentOutput/ToolCallGroup.js.map +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/requestInputMessages.d.ts.map +1 -1
- package/lib/features/agent/chat/ModernAgentOutput/requestInputMessages.js +18 -0
- package/lib/features/agent/chat/ModernAgentOutput/requestInputMessages.js.map +1 -1
- package/lib/features/agent/chat/SlidingThinkingIndicator.d.ts.map +1 -1
- package/lib/features/agent/chat/SlidingThinkingIndicator.js +5 -2
- package/lib/features/agent/chat/SlidingThinkingIndicator.js.map +1 -1
- package/lib/features/agent/chat/VegaLiteChart.d.ts.map +1 -1
- package/lib/features/agent/chat/VegaLiteChart.js +6 -2
- package/lib/features/agent/chat/VegaLiteChart.js.map +1 -1
- package/lib/features/errors/RowErrorBoundary.js +1 -1
- package/lib/features/errors/RowErrorBoundary.js.map +1 -1
- package/lib/features/facets/AgentRunnerFacetsNav.js +1 -1
- package/lib/features/facets/AgentRunnerFacetsNav.js.map +1 -1
- package/lib/features/facets/utils/VInteractionFacet.d.ts +3 -5
- package/lib/features/facets/utils/VInteractionFacet.d.ts.map +1 -1
- package/lib/features/facets/utils/VInteractionFacet.js +10 -23
- package/lib/features/facets/utils/VInteractionFacet.js.map +1 -1
- package/lib/features/facets/utils/VUserFacet.js +1 -1
- package/lib/features/facets/utils/VUserFacet.js.map +1 -1
- package/lib/features/layout/GenericPageNavHeader.d.ts.map +1 -1
- package/lib/features/layout/GenericPageNavHeader.js +4 -1
- package/lib/features/layout/GenericPageNavHeader.js.map +1 -1
- package/lib/features/layout/NotFoundView.js +1 -1
- package/lib/features/layout/NotFoundView.js.map +1 -1
- package/lib/features/magic-pdf/AnnotatedImageSlider.js +4 -12
- package/lib/features/magic-pdf/AnnotatedImageSlider.js.map +1 -1
- package/lib/features/magic-pdf/ExtractedContentView.js +4 -4
- package/lib/features/magic-pdf/ExtractedContentView.js.map +1 -1
- package/lib/features/magic-pdf/MagicPdfView.js +1 -1
- package/lib/features/magic-pdf/MagicPdfView.js.map +1 -1
- package/lib/features/pdf-viewer/PdfPageRenderer.js +2 -2
- package/lib/features/pdf-viewer/PdfPageRenderer.js.map +1 -1
- package/lib/features/pdf-viewer/PdfPageSlider.js +3 -3
- package/lib/features/pdf-viewer/PdfPageSlider.js.map +1 -1
- package/lib/features/pdf-viewer/SimplePdfViewer.js +1 -1
- package/lib/features/pdf-viewer/SimplePdfViewer.js.map +1 -1
- package/lib/features/permissions/UserPermissionsProvider.d.ts +2 -1
- package/lib/features/permissions/UserPermissionsProvider.d.ts.map +1 -1
- package/lib/features/permissions/UserPermissionsProvider.js +35 -22
- package/lib/features/permissions/UserPermissionsProvider.js.map +1 -1
- package/lib/features/permissions/useRoleMappings.d.ts +19 -0
- package/lib/features/permissions/useRoleMappings.d.ts.map +1 -0
- package/lib/features/permissions/useRoleMappings.js +87 -0
- package/lib/features/permissions/useRoleMappings.js.map +1 -0
- package/lib/features/store/collections/SelectCollection.js +1 -1
- package/lib/features/store/collections/SelectCollection.js.map +1 -1
- package/lib/features/store/objects/DocumentPreviewPanel.d.ts.map +1 -1
- package/lib/features/store/objects/DocumentPreviewPanel.js +9 -9
- package/lib/features/store/objects/DocumentPreviewPanel.js.map +1 -1
- package/lib/features/store/objects/DocumentTable.js +1 -1
- package/lib/features/store/objects/DocumentTable.js.map +1 -1
- package/lib/features/store/objects/components/DocumentIcon.js +2 -2
- package/lib/features/store/objects/components/DocumentIcon.js.map +1 -1
- package/lib/features/store/objects/components/DocumentInput.js +1 -1
- package/lib/features/store/objects/components/DocumentInput.js.map +1 -1
- package/lib/features/store/objects/components/PropertiesEditorModal.js +1 -1
- package/lib/features/store/objects/components/PropertiesEditorModal.js.map +1 -1
- package/lib/features/store/objects/components/SaveVersionConfirmModal.js +1 -1
- package/lib/features/store/objects/components/SaveVersionConfirmModal.js.map +1 -1
- package/lib/features/store/objects/layout/documentLayout.d.ts.map +1 -1
- package/lib/features/store/objects/layout/documentLayout.js +2 -2
- package/lib/features/store/objects/layout/documentLayout.js.map +1 -1
- package/lib/features/store/objects/selection/SelectionActions.js +1 -1
- package/lib/features/store/objects/selection/SelectionActions.js.map +1 -1
- package/lib/features/store/types/IntakePolicyEditor.d.ts +10 -1
- package/lib/features/store/types/IntakePolicyEditor.d.ts.map +1 -1
- package/lib/features/store/types/IntakePolicyEditor.js +29 -19
- package/lib/features/store/types/IntakePolicyEditor.js.map +1 -1
- package/lib/features/store/types/IntakePolicyForm.d.ts +1 -1
- package/lib/features/store/types/IntakePolicyForm.d.ts.map +1 -1
- package/lib/features/store/types/IntakePolicyForm.js +5 -3
- package/lib/features/store/types/IntakePolicyForm.js.map +1 -1
- package/lib/features/store/types/SelectContentTypeModal.js +1 -1
- package/lib/features/store/types/SelectContentTypeModal.js.map +1 -1
- package/lib/features/user/UserAvatar.js +2 -2
- package/lib/features/user/UserAvatar.js.map +1 -1
- package/lib/features/user/UserInfo.d.ts.map +1 -1
- package/lib/features/user/UserInfo.js +7 -7
- package/lib/features/user/UserInfo.js.map +1 -1
- package/lib/features/utils/index.d.ts +1 -0
- package/lib/features/utils/index.d.ts.map +1 -1
- package/lib/features/utils/index.js +1 -0
- package/lib/features/utils/index.js.map +1 -1
- package/lib/features/utils/interaction.d.ts +55 -0
- package/lib/features/utils/interaction.d.ts.map +1 -0
- package/lib/features/utils/interaction.js +77 -0
- package/lib/features/utils/interaction.js.map +1 -0
- package/lib/features/views/ViewResults.js +2 -2
- package/lib/features/views/ViewResults.js.map +1 -1
- package/lib/i18n/locales/ar.json +7 -1
- package/lib/i18n/locales/de.json +7 -1
- package/lib/i18n/locales/en.json +7 -1
- package/lib/i18n/locales/es.json +7 -1
- package/lib/i18n/locales/fr.json +7 -1
- package/lib/i18n/locales/it.json +7 -1
- package/lib/i18n/locales/ja.json +7 -1
- package/lib/i18n/locales/ko.json +7 -1
- package/lib/i18n/locales/pt.json +7 -1
- package/lib/i18n/locales/ru.json +7 -1
- package/lib/i18n/locales/tr.json +7 -1
- package/lib/i18n/locales/zh-TW.json +7 -1
- package/lib/i18n/locales/zh.json +7 -1
- package/lib/layout/FullHeightLayout.js +2 -2
- package/lib/layout/FullHeightLayout.js.map +1 -1
- package/lib/layout/Navbar.js +4 -4
- package/lib/layout/Navbar.js.map +1 -1
- package/lib/layout/Sidebar.js +1 -1
- package/lib/layout/Sidebar.js.map +1 -1
- package/lib/session/UserSessionProvider.d.ts.map +1 -1
- package/lib/session/UserSessionProvider.js +2 -13
- package/lib/session/UserSessionProvider.js.map +1 -1
- package/lib/session/auth/authState.d.ts +13 -0
- package/lib/session/auth/authState.d.ts.map +1 -0
- package/lib/session/auth/authState.js +37 -0
- package/lib/session/auth/authState.js.map +1 -0
- package/lib/session/auth/domainRouting.d.ts +39 -0
- package/lib/session/auth/domainRouting.d.ts.map +1 -1
- package/lib/session/auth/domainRouting.js +85 -0
- package/lib/session/auth/domainRouting.js.map +1 -1
- package/lib/session/auth/useAuthState.d.ts +4 -7
- package/lib/session/auth/useAuthState.d.ts.map +1 -1
- package/lib/session/auth/useAuthState.js +5 -41
- package/lib/session/auth/useAuthState.js.map +1 -1
- package/lib/session/index.d.ts +1 -0
- package/lib/session/index.d.ts.map +1 -1
- package/lib/session/index.js +2 -0
- package/lib/session/index.js.map +1 -1
- package/lib/shell/SplashScreen.d.ts +1 -1
- package/lib/shell/SplashScreen.d.ts.map +1 -1
- package/lib/shell/SplashScreen.js +6 -2
- package/lib/shell/SplashScreen.js.map +1 -1
- package/lib/shell/VertesiaShell.js +1 -1
- package/lib/shell/VertesiaShell.js.map +1 -1
- package/lib/shell/apps/AppProjectSelector.js +1 -1
- package/lib/shell/apps/AppProjectSelector.js.map +1 -1
- package/lib/shell/apps/StandaloneApp.js +2 -2
- package/lib/shell/apps/StandaloneApp.js.map +1 -1
- package/lib/shell/login/SignInPrimitives.js +2 -2
- package/lib/shell/login/SignInPrimitives.js.map +1 -1
- package/lib/shell/login/SigninScreen.js +1 -1
- package/lib/shell/login/SigninScreen.js.map +1 -1
- package/lib/shell/login/SignupForm.js +1 -1
- package/lib/shell/login/SignupForm.js.map +1 -1
- package/lib/shell/login/TerminalLogin.js +2 -2
- package/lib/shell/login/TerminalLogin.js.map +1 -1
- package/lib/shell/login/UserInfo.d.ts.map +1 -1
- package/lib/shell/login/UserInfo.js +1 -1
- package/lib/shell/login/UserInfo.js.map +1 -1
- package/lib/shell/login/UserSessionMenu.js +1 -1
- package/lib/shell/login/UserSessionMenu.js.map +1 -1
- package/lib/vertesia-ui-core.js +7 -7
- package/lib/vertesia-ui-core.js.map +1 -1
- package/lib/vertesia-ui-features.js +179 -182
- package/lib/vertesia-ui-features.js.map +1 -1
- package/lib/vertesia-ui-i18n.BfN7iOHb.chunk.js +5 -0
- package/lib/vertesia-ui-i18n.BfN7iOHb.chunk.js.map +1 -0
- package/lib/vertesia-ui-i18n.BjH2zEZw.chunk.js +5 -0
- package/lib/vertesia-ui-i18n.BjH2zEZw.chunk.js.map +1 -0
- package/lib/vertesia-ui-i18n.BjSwAZXl.chunk.js +5 -0
- package/lib/vertesia-ui-i18n.BjSwAZXl.chunk.js.map +1 -0
- package/lib/vertesia-ui-i18n.C7PUm5Au.chunk.js +5 -0
- package/lib/vertesia-ui-i18n.C7PUm5Au.chunk.js.map +1 -0
- package/lib/vertesia-ui-i18n.CF_1mUS5.chunk.js +5 -0
- package/lib/vertesia-ui-i18n.CF_1mUS5.chunk.js.map +1 -0
- package/lib/vertesia-ui-i18n.ChfUl3_-.chunk.js +5 -0
- package/lib/vertesia-ui-i18n.ChfUl3_-.chunk.js.map +1 -0
- package/lib/vertesia-ui-i18n.D-Sk-5d1.chunk.js +5 -0
- package/lib/vertesia-ui-i18n.D-Sk-5d1.chunk.js.map +1 -0
- package/lib/vertesia-ui-i18n.D4rnu1_S.chunk.js +5 -0
- package/lib/vertesia-ui-i18n.D4rnu1_S.chunk.js.map +1 -0
- package/lib/vertesia-ui-i18n.DDf0-laK.chunk.js +5 -0
- package/lib/vertesia-ui-i18n.DDf0-laK.chunk.js.map +1 -0
- package/lib/vertesia-ui-i18n.DN79y06J.chunk.js +5 -0
- package/lib/vertesia-ui-i18n.DN79y06J.chunk.js.map +1 -0
- package/lib/vertesia-ui-i18n.DWLIciYQ.chunk.js +5 -0
- package/lib/vertesia-ui-i18n.DWLIciYQ.chunk.js.map +1 -0
- package/lib/vertesia-ui-i18n.DvF_YaAJ.chunk.js +5 -0
- package/lib/vertesia-ui-i18n.DvF_YaAJ.chunk.js.map +1 -0
- package/lib/vertesia-ui-i18n.js +2 -2
- package/lib/vertesia-ui-layout.js +1 -1
- package/lib/vertesia-ui-layout.js.map +1 -1
- package/lib/vertesia-ui-rich-text.js +24 -24
- package/lib/vertesia-ui-rich-text.js.map +1 -1
- package/lib/vertesia-ui-session.js +1 -1
- package/lib/vertesia-ui-session.js.map +1 -1
- package/lib/vertesia-ui-shell.js +3 -3
- package/lib/vertesia-ui-shell.js.map +1 -1
- package/lib/vertesia-ui-widgets.js +54 -54
- package/lib/vertesia-ui-widgets.js.map +1 -1
- package/lib/widgets/Progress.js +1 -1
- package/lib/widgets/Progress.js.map +1 -1
- package/lib/widgets/form/Form.js +2 -2
- package/lib/widgets/form/Form.js.map +1 -1
- package/lib/widgets/form/fields.js +2 -2
- package/lib/widgets/form/fields.js.map +1 -1
- package/lib/widgets/json-view/JSONView.js +1 -1
- package/lib/widgets/json-view/JSONView.js.map +1 -1
- package/lib/widgets/markdown/MermaidDiagram.js +1 -1
- package/lib/widgets/markdown/MermaidDiagram.js.map +1 -1
- package/lib/widgets/markdown/remarkDirectiveHandler.d.ts +7 -2
- package/lib/widgets/markdown/remarkDirectiveHandler.d.ts.map +1 -1
- package/lib/widgets/markdown/remarkDirectiveHandler.js +19 -4
- package/lib/widgets/markdown/remarkDirectiveHandler.js.map +1 -1
- package/lib/widgets/monacoEditor/MonacoEditor.d.ts.map +1 -1
- package/lib/widgets/monacoEditor/MonacoEditor.js +4 -2
- package/lib/widgets/monacoEditor/MonacoEditor.js.map +1 -1
- package/lib/widgets/monacoEditor/index.d.ts +1 -0
- package/lib/widgets/monacoEditor/index.d.ts.map +1 -1
- package/lib/widgets/monacoEditor/index.js +1 -0
- package/lib/widgets/monacoEditor/index.js.map +1 -1
- package/lib/widgets/monacoEditor/loadMonaco.d.ts +45 -0
- package/lib/widgets/monacoEditor/loadMonaco.d.ts.map +1 -0
- package/lib/widgets/monacoEditor/loadMonaco.js +62 -0
- package/lib/widgets/monacoEditor/loadMonaco.js.map +1 -0
- package/lib/widgets/properties/PropertiesView.js +1 -1
- package/lib/widgets/properties/PropertiesView.js.map +1 -1
- package/lib/widgets/schema-editor/editor/Editable.js +2 -2
- package/lib/widgets/schema-editor/editor/Editable.js.map +1 -1
- package/lib/widgets/schema-editor/editor/PropertyEditor.js +1 -1
- package/lib/widgets/schema-editor/editor/PropertyEditor.js.map +1 -1
- package/lib/widgets/schema-editor/editor/SchemaEditor.js +2 -2
- package/lib/widgets/schema-editor/editor/SchemaEditor.js.map +1 -1
- package/lib/widgets/upload/DropZone.js +1 -1
- package/lib/widgets/upload/DropZone.js.map +1 -1
- package/lib/widgets/upload/UploadResultCategory.d.ts +1 -1
- package/lib/widgets/upload/UploadResultCategory.d.ts.map +1 -1
- package/lib/widgets/upload/UploadResultCategory.js +3 -3
- package/lib/widgets/upload/UploadResultCategory.js.map +1 -1
- package/lib/widgets/upload/UploadSummary.js +1 -1
- package/lib/widgets/upload/UploadSummary.js.map +1 -1
- package/lib/widgets/xml-viewer/components/XMLViewer.d.ts.map +1 -1
- package/lib/widgets/xml-viewer/components/XMLViewer.js +7 -3
- package/lib/widgets/xml-viewer/components/XMLViewer.js.map +1 -1
- package/lib/widgets/xml-viewer/hooks/useCollapsible.d.ts +1 -1
- package/lib/widgets/xml-viewer/hooks/useXMLViewer.d.ts +11 -13
- package/lib/widgets/xml-viewer/hooks/useXMLViewer.d.ts.map +1 -1
- package/lib/widgets/xml-viewer/hooks/useXMLViewer.js +41 -14
- package/lib/widgets/xml-viewer/hooks/useXMLViewer.js.map +1 -1
- package/package.json +7 -7
- package/src/__tests__/contrast.test.ts +1 -0
- package/src/core/components/Avatar.tsx +3 -3
- package/src/core/components/ComboBox.tsx +1 -1
- package/src/core/components/FileUpload.tsx +4 -4
- package/src/core/components/Link.tsx +1 -1
- package/src/core/components/SelectList.tsx +1 -1
- package/src/core/components/SidePanel.tsx +1 -1
- package/src/core/components/Spinner.tsx +1 -1
- package/src/core/components/TagsInput.tsx +8 -8
- package/src/core/components/shadcn/MessageBox.tsx +1 -1
- package/src/core/components/shadcn/button.tsx +1 -1
- package/src/core/components/shadcn/card.tsx +1 -3
- package/src/core/components/shadcn/command.tsx +5 -5
- package/src/core/components/shadcn/filters/DynamicLabel.tsx +1 -1
- package/src/core/components/shadcn/filters/comboBox/DateCombobox.tsx +3 -3
- package/src/core/components/shadcn/input.tsx +3 -3
- package/src/core/components/shadcn/modal/ConfirmModal.tsx +3 -3
- package/src/core/components/shadcn/modal/dialog.tsx +2 -4
- package/src/core/components/shadcn/overflowTabs.tsx +2 -2
- package/src/core/components/shadcn/popover.tsx +1 -1
- package/src/core/components/shadcn/radioGroup.tsx +5 -7
- package/src/core/components/shadcn/selectBox.tsx +1 -1
- package/src/core/components/shadcn/tabs.tsx +4 -2
- package/src/core/components/styles.ts +1 -1
- package/src/core/components/table/index.tsx +1 -1
- package/src/core/hooks/useFetch.test.ts +20 -0
- package/src/core/hooks/useFetch.ts +2 -0
- package/src/css/base.css +1 -1
- package/src/css/color.css +4 -0
- package/src/css/theme.css +1 -0
- package/src/css/typography.css +2 -2
- package/src/features/activity-doc/ActivityDoc.tsx +11 -11
- package/src/features/agent/chat/AgentChart.tsx +1 -1
- package/src/features/agent/chat/AskUserWidget.tsx +19 -23
- package/src/features/agent/chat/JumpingDots.tsx +3 -3
- package/src/features/agent/chat/ModernAgentConversation.tsx +3 -3
- package/src/features/agent/chat/ModernAgentOutput/AllMessagesMixed.test.tsx +60 -1
- package/src/features/agent/chat/ModernAgentOutput/AllMessagesMixed.tsx +44 -24
- package/src/features/agent/chat/ModernAgentOutput/BatchProgressPanel.tsx +12 -12
- package/src/features/agent/chat/ModernAgentOutput/Header.tsx +1 -1
- package/src/features/agent/chat/ModernAgentOutput/InlineSlideInPanel.tsx +4 -4
- package/src/features/agent/chat/ModernAgentOutput/MessageInput.tsx +2 -2
- package/src/features/agent/chat/ModernAgentOutput/MessageItem.tsx +7 -12
- package/src/features/agent/chat/ModernAgentOutput/MessagesContainer.tsx +1 -1
- package/src/features/agent/chat/ModernAgentOutput/PlanPanel.tsx +16 -22
- package/src/features/agent/chat/ModernAgentOutput/SlideInPanel.tsx +4 -4
- package/src/features/agent/chat/ModernAgentOutput/SlidingMessages.tsx +2 -4
- package/src/features/agent/chat/ModernAgentOutput/SlidingPlanPanel.tsx +21 -21
- package/src/features/agent/chat/ModernAgentOutput/StreamingMessage.tsx +4 -4
- package/src/features/agent/chat/ModernAgentOutput/SummaryConversation.ts +16 -1
- package/src/features/agent/chat/ModernAgentOutput/ToolCallGroup.tsx +19 -40
- package/src/features/agent/chat/ModernAgentOutput/requestInputMessages.test.ts +41 -0
- package/src/features/agent/chat/ModernAgentOutput/requestInputMessages.ts +19 -0
- package/src/features/agent/chat/ModernAgentOutput/utils.test.ts +93 -0
- package/src/features/agent/chat/SlidingThinkingIndicator.tsx +5 -2
- package/src/features/agent/chat/VegaLiteChart.tsx +6 -2
- package/src/features/errors/RowErrorBoundary.tsx +1 -1
- package/src/features/facets/AgentRunnerFacetsNav.tsx +1 -1
- package/src/features/facets/utils/VInteractionFacet.tsx +22 -34
- package/src/features/facets/utils/VUserFacet.tsx +1 -1
- package/src/features/layout/GenericPageNavHeader.tsx +9 -1
- package/src/features/layout/NotFoundView.tsx +1 -1
- package/src/features/magic-pdf/AnnotatedImageSlider.tsx +8 -16
- package/src/features/magic-pdf/ExtractedContentView.tsx +4 -4
- package/src/features/magic-pdf/MagicPdfView.tsx +1 -1
- package/src/features/pdf-viewer/PdfPageRenderer.tsx +2 -2
- package/src/features/pdf-viewer/PdfPageSlider.tsx +4 -4
- package/src/features/pdf-viewer/SimplePdfViewer.tsx +1 -1
- package/src/features/permissions/UserPermissionsProvider.test.tsx +172 -0
- package/src/features/permissions/UserPermissionsProvider.tsx +68 -21
- package/src/features/permissions/useRoleMappings.ts +105 -0
- package/src/features/store/collections/SelectCollection.tsx +1 -1
- package/src/features/store/objects/DocumentPreviewPanel.tsx +43 -53
- package/src/features/store/objects/DocumentTable.tsx +2 -2
- package/src/features/store/objects/components/DocumentIcon.tsx +4 -4
- package/src/features/store/objects/components/DocumentInput.tsx +3 -3
- package/src/features/store/objects/components/PropertiesEditorModal.tsx +2 -2
- package/src/features/store/objects/components/SaveVersionConfirmModal.tsx +2 -2
- package/src/features/store/objects/layout/documentLayout.tsx +2 -4
- package/src/features/store/objects/selection/SelectionActions.tsx +1 -1
- package/src/features/store/types/IntakePolicyEditor.tsx +70 -36
- package/src/features/store/types/IntakePolicyForm.tsx +11 -3
- package/src/features/store/types/SelectContentTypeModal.tsx +1 -1
- package/src/features/user/UserAvatar.tsx +3 -3
- package/src/features/user/UserInfo.tsx +11 -16
- package/src/features/utils/index.ts +1 -0
- package/src/features/utils/interaction.test.tsx +93 -0
- package/src/features/utils/interaction.tsx +125 -0
- package/src/features/views/ViewResults.tsx +3 -3
- package/src/i18n/locales/ar.json +7 -1
- package/src/i18n/locales/de.json +7 -1
- package/src/i18n/locales/en.json +7 -1
- package/src/i18n/locales/es.json +7 -1
- package/src/i18n/locales/fr.json +7 -1
- package/src/i18n/locales/it.json +7 -1
- package/src/i18n/locales/ja.json +7 -1
- package/src/i18n/locales/ko.json +7 -1
- package/src/i18n/locales/pt.json +7 -1
- package/src/i18n/locales/ru.json +7 -1
- package/src/i18n/locales/tr.json +7 -1
- package/src/i18n/locales/zh-TW.json +7 -1
- package/src/i18n/locales/zh.json +7 -1
- package/src/layout/FullHeightLayout.tsx +2 -2
- package/src/layout/Navbar.tsx +5 -5
- package/src/layout/Sidebar.tsx +1 -1
- package/src/session/UserSessionProvider.tsx +2 -15
- package/src/session/auth/authState.test.ts +35 -0
- package/src/session/auth/authState.ts +42 -0
- package/src/session/auth/domainRouting.test.ts +169 -1
- package/src/session/auth/domainRouting.ts +89 -0
- package/src/session/auth/useAuthState.ts +5 -49
- package/src/session/index.ts +6 -0
- package/src/shell/SplashScreen.test.tsx +22 -0
- package/src/shell/SplashScreen.tsx +6 -2
- package/src/shell/VertesiaShell.tsx +1 -1
- package/src/shell/apps/AppProjectSelector.tsx +1 -1
- package/src/shell/apps/StandaloneApp.tsx +9 -9
- package/src/shell/login/SignInPrimitives.tsx +2 -2
- package/src/shell/login/SigninScreen.tsx +1 -1
- package/src/shell/login/SignupForm.tsx +2 -2
- package/src/shell/login/TerminalLogin.tsx +5 -5
- package/src/shell/login/UserInfo.tsx +2 -5
- package/src/shell/login/UserSessionMenu.tsx +2 -2
- package/src/widgets/Progress.tsx +2 -2
- package/src/widgets/form/Form.tsx +4 -4
- package/src/widgets/form/fields.tsx +2 -2
- package/src/widgets/json-view/JSONView.tsx +1 -6
- package/src/widgets/markdown/ArtifactEditingSurface.test.tsx +33 -29
- package/src/widgets/markdown/MarkdownRenderer.test.tsx +52 -0
- package/src/widgets/markdown/MermaidDiagram.tsx +2 -2
- package/src/widgets/markdown/remarkDirectiveHandler.ts +21 -5
- package/src/widgets/monacoEditor/MonacoEditor.tsx +4 -2
- package/src/widgets/monacoEditor/index.ts +1 -0
- package/src/widgets/monacoEditor/loadMonaco.test.ts +63 -0
- package/src/widgets/monacoEditor/loadMonaco.ts +70 -0
- package/src/widgets/properties/PropertiesView.tsx +1 -1
- package/src/widgets/schema-editor/editor/Editable.tsx +2 -2
- package/src/widgets/schema-editor/editor/PropertyEditor.tsx +1 -1
- package/src/widgets/schema-editor/editor/SchemaEditor.tsx +2 -2
- package/src/widgets/upload/DropZone.tsx +1 -1
- package/src/widgets/upload/UploadResultCategory.tsx +7 -7
- package/src/widgets/upload/UploadSummary.tsx +4 -4
- package/src/widgets/xml-viewer/components/XMLViewer.tsx +7 -3
- package/src/widgets/xml-viewer/hooks/useXMLViewer.test.ts +60 -7
- package/src/widgets/xml-viewer/hooks/useXMLViewer.ts +70 -16
- package/lib/vertesia-ui-i18n.3yHWompP.chunk.js +0 -5
- package/lib/vertesia-ui-i18n.3yHWompP.chunk.js.map +0 -1
- package/lib/vertesia-ui-i18n.4XKCcnL0.chunk.js +0 -5
- package/lib/vertesia-ui-i18n.4XKCcnL0.chunk.js.map +0 -1
- package/lib/vertesia-ui-i18n.78KG4J25.chunk.js +0 -5
- package/lib/vertesia-ui-i18n.78KG4J25.chunk.js.map +0 -1
- package/lib/vertesia-ui-i18n.BN06mpp1.chunk.js +0 -5
- package/lib/vertesia-ui-i18n.BN06mpp1.chunk.js.map +0 -1
- package/lib/vertesia-ui-i18n.CSzKLlHJ.chunk.js +0 -5
- package/lib/vertesia-ui-i18n.CSzKLlHJ.chunk.js.map +0 -1
- package/lib/vertesia-ui-i18n.Ccus7aRh.chunk.js +0 -5
- package/lib/vertesia-ui-i18n.Ccus7aRh.chunk.js.map +0 -1
- package/lib/vertesia-ui-i18n.D9j3c6gI.chunk.js +0 -5
- package/lib/vertesia-ui-i18n.D9j3c6gI.chunk.js.map +0 -1
- package/lib/vertesia-ui-i18n.DAUg4rrI.chunk.js +0 -5
- package/lib/vertesia-ui-i18n.DAUg4rrI.chunk.js.map +0 -1
- package/lib/vertesia-ui-i18n.DSxVZKXy.chunk.js +0 -5
- package/lib/vertesia-ui-i18n.DSxVZKXy.chunk.js.map +0 -1
- package/lib/vertesia-ui-i18n.aahVhHvR.chunk.js +0 -5
- package/lib/vertesia-ui-i18n.aahVhHvR.chunk.js.map +0 -1
- package/lib/vertesia-ui-i18n.nZ3xJ26v.chunk.js +0 -5
- package/lib/vertesia-ui-i18n.nZ3xJ26v.chunk.js.map +0 -1
- package/lib/vertesia-ui-i18n.xPYbuFzT.chunk.js +0 -5
- package/lib/vertesia-ui-i18n.xPYbuFzT.chunk.js.map +0 -1
|
@@ -23,10 +23,17 @@ import { type EditorApi, type Monaco, MonacoEditor } from '@vertesia/ui/widgets'
|
|
|
23
23
|
import Ajv, { type ErrorObject, type ValidateFunction } from 'ajv';
|
|
24
24
|
import addFormats from 'ajv-formats';
|
|
25
25
|
import type { TFunction } from 'i18next';
|
|
26
|
-
import { Braces, CheckCircle2, FileText, RotateCcw,
|
|
27
|
-
import { useMemo, useRef, useState } from 'react';
|
|
26
|
+
import { Braces, CheckCircle2, FileText, RotateCcw, WandSparkles } from 'lucide-react';
|
|
27
|
+
import { type ReactNode, useMemo, useRef, useState } from 'react';
|
|
28
28
|
import { IntakePolicyForm, type IntakePolicyFormSection } from './IntakePolicyForm.js';
|
|
29
29
|
|
|
30
|
+
/** A tab rendered above the policy tabs. The owner supplies its own Panel and actions. */
|
|
31
|
+
export interface IntakePolicyEditorTab {
|
|
32
|
+
name: string;
|
|
33
|
+
label: string;
|
|
34
|
+
content: ReactNode;
|
|
35
|
+
}
|
|
36
|
+
|
|
30
37
|
interface IntakePolicyEditorProps {
|
|
31
38
|
/** Content type whose intake policy is edited; omit when editing a standalone policy. */
|
|
32
39
|
objectType?: ContentObjectTypeCatalogEntry;
|
|
@@ -36,6 +43,8 @@ interface IntakePolicyEditorProps {
|
|
|
36
43
|
* Defaults to saving the objectType's intake when objectType is provided. */
|
|
37
44
|
onSave?: (policy: ContentTypeIntakePolicy) => Promise<ContentTypeIntakePolicy | undefined>;
|
|
38
45
|
onIntakeUpdate?: (value: ContentTypeIntakePolicy | undefined) => void;
|
|
46
|
+
/** Extra tabs shown above the policy tabs, each owning its panel and actions. */
|
|
47
|
+
leadingTabs?: IntakePolicyEditorTab[];
|
|
39
48
|
readonly?: boolean;
|
|
40
49
|
}
|
|
41
50
|
|
|
@@ -279,6 +288,7 @@ export function IntakePolicyEditor({
|
|
|
279
288
|
value,
|
|
280
289
|
onSave: onSaveProp,
|
|
281
290
|
onIntakeUpdate,
|
|
291
|
+
leadingTabs,
|
|
282
292
|
readonly = false,
|
|
283
293
|
}: IntakePolicyEditorProps) {
|
|
284
294
|
const { store } = useUserSession();
|
|
@@ -293,7 +303,9 @@ export function IntakePolicyEditor({
|
|
|
293
303
|
const [editorValue, setEditorValue] = useState(() => stringifyPolicy(initialPolicy));
|
|
294
304
|
const [savedValue, setSavedValue] = useState(() => stringifyPolicy(initialPolicy));
|
|
295
305
|
const [validationMessage, setValidationMessage] = useState<string | undefined>(undefined);
|
|
296
|
-
|
|
306
|
+
// Open on the first leading tab when a consumer supplies one (settings opens on General);
|
|
307
|
+
// otherwise the policy sections start at their first tab.
|
|
308
|
+
const [activeTab, setActiveTab] = useState<string>(leadingTabs?.[0]?.name ?? 'classification');
|
|
297
309
|
|
|
298
310
|
const isDirty = editorValue !== savedValue;
|
|
299
311
|
const currentPolicy = useMemo(() => {
|
|
@@ -421,7 +433,7 @@ export function IntakePolicyEditor({
|
|
|
421
433
|
setEditorValue(value);
|
|
422
434
|
editorRef.current?.setValue(value);
|
|
423
435
|
setValidationMessage(undefined);
|
|
424
|
-
setActiveTab('
|
|
436
|
+
setActiveTab('classification');
|
|
425
437
|
};
|
|
426
438
|
|
|
427
439
|
const onFormChange = (policy: ContentTypeIntakePolicy) => {
|
|
@@ -430,6 +442,11 @@ export function IntakePolicyEditor({
|
|
|
430
442
|
};
|
|
431
443
|
|
|
432
444
|
const onTabChange = (tab: string) => {
|
|
445
|
+
// Leading tabs are not policy sections, so invalid policy JSON must not trap the user there.
|
|
446
|
+
if (leadingTabs?.some((leading) => leading.name === tab)) {
|
|
447
|
+
setActiveTab(tab);
|
|
448
|
+
return;
|
|
449
|
+
}
|
|
433
450
|
const nextTab = tab as IntakePolicyFormSection | 'json';
|
|
434
451
|
if (nextTab !== 'json' && !currentPolicy) {
|
|
435
452
|
setValidationMessage(t('intakePolicy.error.fixJsonBeforeForm'));
|
|
@@ -441,7 +458,7 @@ export function IntakePolicyEditor({
|
|
|
441
458
|
|
|
442
459
|
const title = (
|
|
443
460
|
<div className="flex items-center gap-2">
|
|
444
|
-
<div
|
|
461
|
+
<div>{t('intakePolicy.title')}</div>
|
|
445
462
|
{isDirty && <Badge variant="attention">{t('intakePolicy.status.unsaved')}</Badge>}
|
|
446
463
|
</div>
|
|
447
464
|
);
|
|
@@ -451,7 +468,7 @@ export function IntakePolicyEditor({
|
|
|
451
468
|
<Dropdown
|
|
452
469
|
align="right"
|
|
453
470
|
trigger={
|
|
454
|
-
<Button variant="outline" size="
|
|
471
|
+
<Button variant="outline" size="md">
|
|
455
472
|
<WandSparkles className="size-4" />
|
|
456
473
|
{t('intakePolicy.action.examples')}
|
|
457
474
|
</Button>
|
|
@@ -473,58 +490,74 @@ export function IntakePolicyEditor({
|
|
|
473
490
|
</Dropdown>
|
|
474
491
|
{activeTab === 'json' && (
|
|
475
492
|
<>
|
|
476
|
-
<Button variant="outline" size="
|
|
493
|
+
<Button variant="outline" size="md" onClick={onFormat}>
|
|
477
494
|
<Braces className="size-4" />
|
|
478
495
|
{t('intakePolicy.action.format')}
|
|
479
496
|
</Button>
|
|
480
|
-
<Button variant="outline" size="
|
|
497
|
+
<Button variant="outline" size="md" onClick={onValidate}>
|
|
481
498
|
<CheckCircle2 className="size-4" />
|
|
482
499
|
{t('intakePolicy.action.validate')}
|
|
483
500
|
</Button>
|
|
484
501
|
</>
|
|
485
502
|
)}
|
|
486
|
-
<Button variant="outline" size="
|
|
503
|
+
<Button variant="outline" size="md" onClick={onRevert} disabled={!isDirty}>
|
|
487
504
|
<RotateCcw className="size-4" />
|
|
488
505
|
{t('intakePolicy.action.revert')}
|
|
489
506
|
</Button>
|
|
490
|
-
<Button isLoading={isUpdating} size="
|
|
491
|
-
<Save className="size-4" />
|
|
507
|
+
<Button isLoading={isUpdating} size="md" onClick={onSave} disabled={!isDirty}>
|
|
492
508
|
{t('intakePolicy.action.save')}
|
|
493
509
|
</Button>
|
|
494
510
|
</>
|
|
495
511
|
) : undefined;
|
|
496
512
|
|
|
497
|
-
|
|
513
|
+
/** Panel chrome for the policy tabs. Each tab owns its panel now that the switcher is outside. */
|
|
514
|
+
const withPolicyPanel = (content: ReactNode) => (
|
|
498
515
|
<Panel title={title} className="bg-background! h-full" action={action}>
|
|
499
516
|
<div className="flex h-full min-h-0 flex-col gap-3">
|
|
500
|
-
<IntakeSummary policy={summaryPolicy} />
|
|
501
517
|
{validationMessage && (
|
|
502
518
|
<div className="rounded-sm border border-destructive bg-mixer-destructive/10 px-3 py-2 text-sm whitespace-pre-line text-destructive">
|
|
503
519
|
{validationMessage}
|
|
504
520
|
</div>
|
|
505
521
|
)}
|
|
506
|
-
|
|
507
|
-
tabs={createEditorTabs(t, currentPolicy ?? EMPTY_POLICY, readonly, onFormChange, editorValue, {
|
|
508
|
-
editorRef,
|
|
509
|
-
beforeMount,
|
|
510
|
-
onChange: (value) => {
|
|
511
|
-
setEditorValue(value);
|
|
512
|
-
setValidationMessage(undefined);
|
|
513
|
-
},
|
|
514
|
-
theme,
|
|
515
|
-
})}
|
|
516
|
-
current={activeTab}
|
|
517
|
-
onTabChange={onTabChange}
|
|
518
|
-
updateHash={false}
|
|
519
|
-
fullHeight
|
|
520
|
-
className="px-0 flex-row!"
|
|
521
|
-
>
|
|
522
|
-
<TabsBar className="py-2 w-48 shrink-0" direction="vertical" />
|
|
523
|
-
<TabsPanel className="min-h-0 min-w-0 flex-1 overflow-auto pt-1 ps-4" />
|
|
524
|
-
</Tabs>
|
|
522
|
+
{content}
|
|
525
523
|
</div>
|
|
526
524
|
</Panel>
|
|
527
525
|
);
|
|
526
|
+
|
|
527
|
+
const policyTabs = createEditorTabs(
|
|
528
|
+
t,
|
|
529
|
+
currentPolicy ?? EMPTY_POLICY,
|
|
530
|
+
readonly,
|
|
531
|
+
onFormChange,
|
|
532
|
+
editorValue,
|
|
533
|
+
{
|
|
534
|
+
editorRef,
|
|
535
|
+
beforeMount,
|
|
536
|
+
onChange: (value) => {
|
|
537
|
+
setEditorValue(value);
|
|
538
|
+
setValidationMessage(undefined);
|
|
539
|
+
},
|
|
540
|
+
theme,
|
|
541
|
+
},
|
|
542
|
+
withPolicyPanel,
|
|
543
|
+
);
|
|
544
|
+
|
|
545
|
+
return (
|
|
546
|
+
<div className="flex h-full min-h-0 w-full flex-col gap-3">
|
|
547
|
+
<IntakeSummary policy={summaryPolicy} />
|
|
548
|
+
<Tabs
|
|
549
|
+
tabs={leadingTabs ? [...leadingTabs, ...policyTabs] : policyTabs}
|
|
550
|
+
current={activeTab}
|
|
551
|
+
onTabChange={onTabChange}
|
|
552
|
+
updateHash={false}
|
|
553
|
+
fullHeight
|
|
554
|
+
className="px-0 min-h-0 flex-1 flex-row!"
|
|
555
|
+
>
|
|
556
|
+
<TabsBar className="py-2 w-48 shrink-0" direction="vertical" />
|
|
557
|
+
<TabsPanel className="min-h-0 min-w-0 flex-1 overflow-auto ps-4" />
|
|
558
|
+
</Tabs>
|
|
559
|
+
</div>
|
|
560
|
+
);
|
|
528
561
|
}
|
|
529
562
|
|
|
530
563
|
function createEditorTabs(
|
|
@@ -539,15 +572,16 @@ function createEditorTabs(
|
|
|
539
572
|
onChange: (value: string) => void;
|
|
540
573
|
theme: string;
|
|
541
574
|
},
|
|
575
|
+
wrap: (content: ReactNode) => ReactNode,
|
|
542
576
|
) {
|
|
543
577
|
const formTab = (name: IntakePolicyFormSection, label: string) => ({
|
|
544
578
|
name,
|
|
545
579
|
label,
|
|
546
|
-
content: <IntakePolicyForm policy={policy} section={name} onChange={onChange} readonly={readonly}
|
|
580
|
+
content: wrap(<IntakePolicyForm policy={policy} section={name} onChange={onChange} readonly={readonly} />),
|
|
547
581
|
});
|
|
548
582
|
|
|
549
583
|
return [
|
|
550
|
-
formTab('
|
|
584
|
+
formTab('classification', t('intakePolicy.tab.classification')),
|
|
551
585
|
formTab('conversion', t('intakePolicy.tab.conversion')),
|
|
552
586
|
formTab('extraction', t('intakePolicy.tab.extraction')),
|
|
553
587
|
formTab('grounding', t('intakePolicy.tab.grounding')),
|
|
@@ -555,7 +589,7 @@ function createEditorTabs(
|
|
|
555
589
|
{
|
|
556
590
|
name: 'json',
|
|
557
591
|
label: t('intakePolicy.tab.json'),
|
|
558
|
-
content: (
|
|
592
|
+
content: wrap(
|
|
559
593
|
<div className="flex h-full min-h-[36rem] gap-4 py-3">
|
|
560
594
|
<div className="min-w-0 flex-1 overflow-hidden rounded-sm border">
|
|
561
595
|
<MonacoEditor
|
|
@@ -579,7 +613,7 @@ function createEditorTabs(
|
|
|
579
613
|
/>
|
|
580
614
|
</div>
|
|
581
615
|
<IntakeHelp />
|
|
582
|
-
</div
|
|
616
|
+
</div>,
|
|
583
617
|
),
|
|
584
618
|
},
|
|
585
619
|
];
|
|
@@ -27,7 +27,7 @@ import {
|
|
|
27
27
|
updateIntakePolicy,
|
|
28
28
|
} from './intake-policy-editor.logic.js';
|
|
29
29
|
|
|
30
|
-
export type IntakePolicyFormSection = '
|
|
30
|
+
export type IntakePolicyFormSection = 'classification' | 'conversion' | 'extraction' | 'grounding' | 'output';
|
|
31
31
|
|
|
32
32
|
interface IntakePolicyFormProps {
|
|
33
33
|
policy: ContentTypeIntakePolicy;
|
|
@@ -45,7 +45,7 @@ export function IntakePolicyForm({ policy, section, onChange, readonly = false }
|
|
|
45
45
|
const { t } = useUITranslation();
|
|
46
46
|
const setValue = (path: IntakePolicyPath, value: unknown) => onChange(updateIntakePolicy(policy, path, value));
|
|
47
47
|
|
|
48
|
-
if (section === '
|
|
48
|
+
if (section === 'classification') {
|
|
49
49
|
return (
|
|
50
50
|
<FormSurface>
|
|
51
51
|
<FormSection
|
|
@@ -317,6 +317,8 @@ export function IntakePolicyForm({ policy, section, onChange, readonly = false }
|
|
|
317
317
|
<FormSection
|
|
318
318
|
title={t('intakePolicy.section.visionBudget')}
|
|
319
319
|
description={t('intakePolicy.help.section.visionBudget')}
|
|
320
|
+
// `last` only because Verification below is hidden; drop it when that is restored.
|
|
321
|
+
last
|
|
320
322
|
>
|
|
321
323
|
<div className="grid gap-4 md:grid-cols-2 xl:grid-cols-3">
|
|
322
324
|
<SelectField
|
|
@@ -359,6 +361,11 @@ export function IntakePolicyForm({ policy, section, onChange, readonly = false }
|
|
|
359
361
|
</div>
|
|
360
362
|
</FormSection>
|
|
361
363
|
|
|
364
|
+
{/* Verification is hidden until the feature is wired up. The policy schema, the
|
|
365
|
+
API contract and this form all still carry it; nothing here consumes the values
|
|
366
|
+
at processing time yet. Uncomment as-is to bring the section back, and remove
|
|
367
|
+
the `last` prop added to the Vision evidence budget section above.
|
|
368
|
+
|
|
362
369
|
<FormSection title={t('intakePolicy.section.verification')} last>
|
|
363
370
|
<div className="grid gap-4 md:grid-cols-2 xl:grid-cols-3">
|
|
364
371
|
<TriStateField
|
|
@@ -410,6 +417,7 @@ export function IntakePolicyForm({ policy, section, onChange, readonly = false }
|
|
|
410
417
|
readonly={readonly}
|
|
411
418
|
/>
|
|
412
419
|
</FormSection>
|
|
420
|
+
*/}
|
|
413
421
|
</FormSurface>
|
|
414
422
|
);
|
|
415
423
|
}
|
|
@@ -636,7 +644,7 @@ export function IntakePolicyForm({ policy, section, onChange, readonly = false }
|
|
|
636
644
|
}
|
|
637
645
|
|
|
638
646
|
function FormSurface({ children }: { children: ReactNode }) {
|
|
639
|
-
return <div className="
|
|
647
|
+
return <div className="w-full px-1 py-4">{children}</div>;
|
|
640
648
|
}
|
|
641
649
|
|
|
642
650
|
function FormSection({
|
|
@@ -71,7 +71,7 @@ export function SelectContentTypeModal({
|
|
|
71
71
|
<div className="mb-4 mt-4">
|
|
72
72
|
<div className="block text-sm font-medium mb-2">
|
|
73
73
|
{t('store.contentType')}{' '}
|
|
74
|
-
{allowNone && <span className="text-
|
|
74
|
+
{allowNone && <span className="text-muted font-normal">{t('store.optional')}</span>}
|
|
75
75
|
</div>
|
|
76
76
|
{allowNone ? (
|
|
77
77
|
<SelectBox
|
|
@@ -13,7 +13,7 @@ export function UserAvatar({ user }: { user: AuthTokenPayload | UserRef }) {
|
|
|
13
13
|
.map((n) => n[0])
|
|
14
14
|
.join('');
|
|
15
15
|
return (
|
|
16
|
-
<span className="inline-flex h-8 w-8 items-center justify-center rounded-full bg-
|
|
16
|
+
<span className="inline-flex h-8 w-8 items-center justify-center rounded-full bg-primary">
|
|
17
17
|
<span className="text-sm font-medium leading-none text-white">{initials}</span>
|
|
18
18
|
</span>
|
|
19
19
|
);
|
|
@@ -26,10 +26,10 @@ export function UserAvatar({ user }: { user: AuthTokenPayload | UserRef }) {
|
|
|
26
26
|
<div className="flex items-center">
|
|
27
27
|
<div className="w-9 h-9">{userPicture()}</div>
|
|
28
28
|
<div className="ms-3">
|
|
29
|
-
<p className="text-sm font-medium text-
|
|
29
|
+
<p className="text-sm font-medium text-foreground group-hover:text-foreground">
|
|
30
30
|
{user.name ?? 'Deleted User'}
|
|
31
31
|
</p>
|
|
32
|
-
<p className="text-xs font-medium text-
|
|
32
|
+
<p className="text-xs font-medium text-muted dark:text-foreground group-hover:text-foreground">
|
|
33
33
|
{user.email ?? 'Deleted User'}
|
|
34
34
|
</p>
|
|
35
35
|
</div>
|
|
@@ -148,10 +148,10 @@ function EmailAgentAvatar({ email, showTitle = false, size = 'md' }: EmailAgentA
|
|
|
148
148
|
<Avatar
|
|
149
149
|
src="/cloud.svg"
|
|
150
150
|
color="bg-amber-500"
|
|
151
|
-
className="px-[5px] text-white border-2 border-
|
|
151
|
+
className="px-[5px] text-white border-2 border-background"
|
|
152
152
|
size={size}
|
|
153
153
|
/>
|
|
154
|
-
<Avatar name={email} size={size} className="border-2 border-
|
|
154
|
+
<Avatar name={email} size={size} className="border-2 border-background" />
|
|
155
155
|
</div>
|
|
156
156
|
{showTitle && <div className="text-sm font-semibold truncate">Agent ({email})</div>}
|
|
157
157
|
</div>
|
|
@@ -208,13 +208,13 @@ function AgentAvatar({
|
|
|
208
208
|
{apiKey && (
|
|
209
209
|
<div>
|
|
210
210
|
<div className="font-medium">{apiKey.name}</div>
|
|
211
|
-
<div className="text-xs text-muted
|
|
211
|
+
<div className="text-xs text-muted">Key ID: {apiKey.id}</div>
|
|
212
212
|
</div>
|
|
213
213
|
)}
|
|
214
214
|
{!user && !apiKey && (
|
|
215
215
|
<>
|
|
216
216
|
<div>{t('user.serviceAccountDescription')}</div>
|
|
217
|
-
<div className="text-
|
|
217
|
+
<div className="text-foreground dark:text-muted text-sm">
|
|
218
218
|
<span className="font-semibold">ID:</span> {agentId}
|
|
219
219
|
</div>
|
|
220
220
|
</>
|
|
@@ -229,7 +229,7 @@ function AgentAvatar({
|
|
|
229
229
|
<Avatar
|
|
230
230
|
src="/cloud.svg"
|
|
231
231
|
color="bg-amber-500"
|
|
232
|
-
className="px-[5px] text-white border-2 border-
|
|
232
|
+
className="px-[5px] text-white border-2 border-background"
|
|
233
233
|
size={size}
|
|
234
234
|
/>
|
|
235
235
|
{user && (
|
|
@@ -237,16 +237,11 @@ function AgentAvatar({
|
|
|
237
237
|
src={user.picture}
|
|
238
238
|
name={user.name}
|
|
239
239
|
size={size}
|
|
240
|
-
className="border-2 border-
|
|
240
|
+
className="border-2 border-background"
|
|
241
241
|
/>
|
|
242
242
|
)}
|
|
243
243
|
{apiKey && (
|
|
244
|
-
<Avatar
|
|
245
|
-
name="API"
|
|
246
|
-
color="bg-gray-400"
|
|
247
|
-
size={size}
|
|
248
|
-
className="border-2 border-white dark:border-gray-800"
|
|
249
|
-
/>
|
|
244
|
+
<Avatar name="API" color="bg-gray-400" size={size} className="border-2 border-background" />
|
|
250
245
|
)}
|
|
251
246
|
</div>
|
|
252
247
|
{showTitle && (
|
|
@@ -455,7 +450,7 @@ function GroupAvatar({ userId, showTitle = false, size = 'md' }: GroupAvatarProp
|
|
|
455
450
|
const description = (
|
|
456
451
|
<div className="space-y-1">
|
|
457
452
|
{group.description && <div className="text-sm">{group.description}</div>}
|
|
458
|
-
<div className="text-xs text-muted
|
|
453
|
+
<div className="text-xs text-muted">{t('user.groupId', { id: group.id })}</div>
|
|
459
454
|
{group.tags && group.tags.length > 0 && (
|
|
460
455
|
<div className="flex flex-wrap gap-1">
|
|
461
456
|
{group.tags.map((tag) => (
|
|
@@ -471,7 +466,7 @@ function GroupAvatar({ userId, showTitle = false, size = 'md' }: GroupAvatarProp
|
|
|
471
466
|
return (
|
|
472
467
|
<UserPopoverPanel title={group.name || t('user.unnamedGroup')} description={description}>
|
|
473
468
|
<div className="flex flex-row items-center gap-2">
|
|
474
|
-
<Users className="size-6 text-
|
|
469
|
+
<Users className="size-6 text-primary" size={size} />
|
|
475
470
|
{showTitle && <div className="text-sm font-semibold ps-2">{group.name || t('user.unnamedGroup')}</div>}
|
|
476
471
|
</div>
|
|
477
472
|
</UserPopoverPanel>
|
|
@@ -540,7 +535,7 @@ export function ApiKeyAvatar({ keyId, showTitle = false, size = 'md' }: ApiKeyAv
|
|
|
540
535
|
const title = t('user.privateKey');
|
|
541
536
|
const avatar = <Avatar name={'PK'} color="bg-pink-500" size={size} />;
|
|
542
537
|
const description = (
|
|
543
|
-
<Table className="dark:bg-
|
|
538
|
+
<Table className="dark:bg-muted dark:text-foreground table-fixed w-full">
|
|
544
539
|
<tr>
|
|
545
540
|
<td className="font-semibold w-20">{t('user.key')}</td>
|
|
546
541
|
<td className="truncate max-w-0">{data?.name}</td>
|
|
@@ -583,7 +578,7 @@ function UserPopoverPanel({ title, description, children }: UserPopoverPanelProp
|
|
|
583
578
|
</PopoverTrigger>
|
|
584
579
|
<PopoverContent align="center" sideOffset={8} side="right">
|
|
585
580
|
<div className="flex flex-col gap-1 rounded-md shadow-md p-2">
|
|
586
|
-
<div className="text-
|
|
581
|
+
<div className="text-base font-semibold">{title}</div>
|
|
587
582
|
{description}
|
|
588
583
|
</div>
|
|
589
584
|
</PopoverContent>
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { cleanup, render, screen } from '@testing-library/react';
|
|
2
|
+
import { InteractionStatus } from '@vertesia/common';
|
|
3
|
+
import { afterEach, describe, expect, it } from 'vitest';
|
|
4
|
+
import {
|
|
5
|
+
InteractionLabel,
|
|
6
|
+
isUnresolvedInteractionRef,
|
|
7
|
+
resolveInteractionName,
|
|
8
|
+
splitInteractionType,
|
|
9
|
+
} from './interaction.js';
|
|
10
|
+
|
|
11
|
+
describe('splitInteractionType', () => {
|
|
12
|
+
it('splits a known namespace off the name', () => {
|
|
13
|
+
expect(splitInteractionType('sys:code_agent')).toEqual({ type: 'sys', label: 'code_agent' });
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
it('keeps colons that are part of the name', () => {
|
|
17
|
+
expect(splitInteractionType('nfwf-chatbot:main:rag-agent')).toEqual({ label: 'nfwf-chatbot:main:rag-agent' });
|
|
18
|
+
expect(splitInteractionType('WhatColor')).toEqual({ label: 'WhatColor' });
|
|
19
|
+
});
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
describe('resolveInteractionName', () => {
|
|
23
|
+
it('prefers the resolved ref name over the run snapshot', () => {
|
|
24
|
+
const name = resolveInteractionName({ name: 'Current Name' }, 'Stale Name', '682a822c4dbfdc27017ff6cd');
|
|
25
|
+
expect(name).toBe('Current Name');
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
it('falls back when the ref name is the bare ObjectId the resolver left behind', () => {
|
|
29
|
+
const name = resolveInteractionName({ name: '682a822c4dbfdc27017ff6cd' }, 'Legacy Name');
|
|
30
|
+
expect(name).toBe('Legacy Name');
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
it('skips empty fallbacks and returns undefined when nothing is usable', () => {
|
|
34
|
+
expect(resolveInteractionName(undefined, '', 'ref-string')).toBe('ref-string');
|
|
35
|
+
expect(resolveInteractionName(undefined, undefined, '')).toBeUndefined();
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
it('names a deleted interaction from its id, from either the ref or a bare bucket id', () => {
|
|
39
|
+
// The run row has the ref the server left behind; the facet bucket has only its `_id`.
|
|
40
|
+
// Both must produce the same label or the option stops matching the row it filters for.
|
|
41
|
+
const fromRow = resolveInteractionName({ name: '682a822c4dbfdc27017ff6cd' });
|
|
42
|
+
const fromBucket = resolveInteractionName(undefined, '682a822c4dbfdc27017ff6cd');
|
|
43
|
+
expect(fromRow).toBe('Deleted interaction (~017ff6cd)');
|
|
44
|
+
expect(fromBucket).toBe(fromRow);
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
describe('isUnresolvedInteractionRef', () => {
|
|
49
|
+
it('flags only refs with neither a version nor a status', () => {
|
|
50
|
+
expect(isUnresolvedInteractionRef({ version: 0, status: InteractionStatus.unknown })).toBe(true);
|
|
51
|
+
expect(isUnresolvedInteractionRef({ version: 0, status: InteractionStatus.code })).toBe(false);
|
|
52
|
+
expect(isUnresolvedInteractionRef({ version: 2, status: InteractionStatus.unknown })).toBe(false);
|
|
53
|
+
expect(isUnresolvedInteractionRef(undefined)).toBe(false);
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
describe('InteractionLabel', () => {
|
|
58
|
+
afterEach(cleanup);
|
|
59
|
+
|
|
60
|
+
it('lifts the namespace out of the name and badges the version and status', () => {
|
|
61
|
+
render(
|
|
62
|
+
<InteractionLabel interaction={{ name: 'sys:code_agent', version: 3, status: InteractionStatus.code }} />,
|
|
63
|
+
);
|
|
64
|
+
expect(screen.getByText('code_agent')).toBeTruthy();
|
|
65
|
+
expect(screen.getByText('sys')).toBeTruthy();
|
|
66
|
+
expect(screen.getByText('v3 code')).toBeTruthy();
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
it('badges nothing for a ref the server could not resolve', () => {
|
|
70
|
+
const { container } = render(
|
|
71
|
+
<InteractionLabel
|
|
72
|
+
interaction={{ name: '682a822c4dbfdc27017ff6cd', version: 0, status: InteractionStatus.unknown }}
|
|
73
|
+
fallbacks={['Legacy Name']}
|
|
74
|
+
/>,
|
|
75
|
+
);
|
|
76
|
+
expect(container.textContent).toBe('Legacy Name');
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
it('renders the fallback node only when there is no reference at all', () => {
|
|
80
|
+
render(<InteractionLabel fallbackNode={<span>Interaction not found</span>} />);
|
|
81
|
+
expect(screen.getByText('Interaction not found')).toBeTruthy();
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
it('names a deleted interaction rather than falling through to the fallback node', () => {
|
|
85
|
+
const { container } = render(
|
|
86
|
+
<InteractionLabel
|
|
87
|
+
interaction={{ name: '682a822c4dbfdc27017ff6cd', version: 0, status: InteractionStatus.unknown }}
|
|
88
|
+
fallbackNode={<span>Interaction not found</span>}
|
|
89
|
+
/>,
|
|
90
|
+
);
|
|
91
|
+
expect(container.textContent).toBe('Deleted interaction (~017ff6cd)');
|
|
92
|
+
});
|
|
93
|
+
});
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { InteractionStatus } from '@vertesia/common';
|
|
2
|
+
import { Badge } from '@vertesia/ui/core';
|
|
3
|
+
import type { ReactNode } from 'react';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* The parts of an interaction reference the display helpers below read. Kept structural so runs,
|
|
7
|
+
* facet buckets and full interactions can all be passed as-is.
|
|
8
|
+
*/
|
|
9
|
+
export interface InteractionDisplayRef {
|
|
10
|
+
name?: string;
|
|
11
|
+
version?: number;
|
|
12
|
+
status?: InteractionStatus;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Namespaces that a ref actually uses as a type prefix. Every other colon in a ref belongs to the
|
|
17
|
+
* name itself (`main:rag-agent`, `nfwf-chatbot:main:rag-agent`), so it must not become a badge.
|
|
18
|
+
*/
|
|
19
|
+
const INTERACTION_TYPES: string[] = ['sys', 'app', 'tmp'];
|
|
20
|
+
|
|
21
|
+
const OBJECT_ID_RE = /^[0-9a-fA-F]{24}$/;
|
|
22
|
+
|
|
23
|
+
/** Split `<type>:<rest>` into the type badge and the label to display; untyped refs keep their name. */
|
|
24
|
+
export function splitInteractionType(name: string): { type?: string; label: string } {
|
|
25
|
+
const separator = name.indexOf(':');
|
|
26
|
+
const type = separator > 0 ? name.slice(0, separator) : undefined;
|
|
27
|
+
return type && INTERACTION_TYPES.includes(type) ? { type, label: name.slice(separator + 1) } : { label: name };
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Pick the name to display for an interaction reference: the ref's own name, then the fallbacks —
|
|
32
|
+
* a run's `interaction_name` / raw ref string, a facet bucket's id — in order.
|
|
33
|
+
*
|
|
34
|
+
* A bare ObjectId is never a name: it is what a deleted stored interaction leaves behind once the
|
|
35
|
+
* server can no longer resolve it. Those candidates are skipped, and if nothing else is left the
|
|
36
|
+
* id becomes a short "deleted" label instead, so a run row and the facet option that filters for
|
|
37
|
+
* it name the missing interaction identically. Returns undefined when there is no id either.
|
|
38
|
+
*/
|
|
39
|
+
export function resolveInteractionName(
|
|
40
|
+
ref: InteractionDisplayRef | undefined,
|
|
41
|
+
...fallbacks: (string | undefined)[]
|
|
42
|
+
): string | undefined {
|
|
43
|
+
const candidates = [ref?.name, ...fallbacks].filter((candidate): candidate is string => !!candidate);
|
|
44
|
+
const name = candidates.find((candidate) => !OBJECT_ID_RE.test(candidate));
|
|
45
|
+
if (name) return name;
|
|
46
|
+
const id = candidates[0];
|
|
47
|
+
return id ? `Deleted interaction (~${id.slice(-8)})` : undefined;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* A reference the server couldn't resolve carries neither a version nor a status; it has no status
|
|
52
|
+
* worth badging.
|
|
53
|
+
*/
|
|
54
|
+
export function isUnresolvedInteractionRef(ref: InteractionDisplayRef | undefined): boolean {
|
|
55
|
+
return !!ref && ref.version === 0 && ref.status === InteractionStatus.unknown;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
interface InteractionStatusBadgeProps {
|
|
59
|
+
interaction: InteractionDisplayRef;
|
|
60
|
+
className?: string;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export function InteractionStatusBadge({ interaction, className }: InteractionStatusBadgeProps) {
|
|
64
|
+
let variant: 'success' | 'info' | 'destructive' | 'default' = 'success';
|
|
65
|
+
switch (interaction.status) {
|
|
66
|
+
case InteractionStatus.published:
|
|
67
|
+
variant = 'success';
|
|
68
|
+
break;
|
|
69
|
+
case InteractionStatus.archived:
|
|
70
|
+
variant = 'destructive';
|
|
71
|
+
break;
|
|
72
|
+
case InteractionStatus.code:
|
|
73
|
+
variant = 'info';
|
|
74
|
+
break;
|
|
75
|
+
}
|
|
76
|
+
const version = interaction.version ? `v${interaction.version}` : '';
|
|
77
|
+
const status = interaction.status && interaction.status !== InteractionStatus.unknown ? interaction.status : '';
|
|
78
|
+
const text = [version, status].filter(Boolean).join(' ');
|
|
79
|
+
// Nothing resolved (an unresolved ref, or a bucket carrying neither field) — no badge at all.
|
|
80
|
+
if (!text) return null;
|
|
81
|
+
return (
|
|
82
|
+
<Badge variant={variant} className={className}>
|
|
83
|
+
{text}
|
|
84
|
+
</Badge>
|
|
85
|
+
);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
interface InteractionLabelProps {
|
|
89
|
+
/** The resolved reference, when the server could resolve one. */
|
|
90
|
+
interaction?: InteractionDisplayRef;
|
|
91
|
+
/**
|
|
92
|
+
* Names to fall back on, in order, when the ref carries no usable name — a run's
|
|
93
|
+
* `interaction_name`, the raw ref string it was launched with, a facet bucket id.
|
|
94
|
+
*/
|
|
95
|
+
fallbacks?: (string | undefined)[];
|
|
96
|
+
/** Rendered in place of the label when no name resolves at all. */
|
|
97
|
+
fallbackNode?: ReactNode;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* How every run listing names the interaction it ran: the name with its `sys`/`app`/`tmp`
|
|
102
|
+
* namespace lifted into its own badge, above the version/status badge. Keep listings on this
|
|
103
|
+
* component so a row, its quick filter and the interaction facet never disagree.
|
|
104
|
+
*/
|
|
105
|
+
export function InteractionLabel({ interaction, fallbacks = [], fallbackNode = null }: InteractionLabelProps) {
|
|
106
|
+
const name = resolveInteractionName(interaction, ...fallbacks);
|
|
107
|
+
if (!name) {
|
|
108
|
+
return <>{fallbackNode}</>;
|
|
109
|
+
}
|
|
110
|
+
const { type, label } = splitInteractionType(name);
|
|
111
|
+
// InteractionStatusBadge renders null for an unresolved ref, so skip the row entirely here
|
|
112
|
+
// rather than emit an empty badge line.
|
|
113
|
+
const showStatus = !!interaction && !isUnresolvedInteractionRef(interaction);
|
|
114
|
+
return (
|
|
115
|
+
<>
|
|
116
|
+
{label}
|
|
117
|
+
{(type || showStatus) && (
|
|
118
|
+
<div className="flex items-center mt-1.5 shrink-0 gap-2">
|
|
119
|
+
{type && <Badge variant="secondary">{type}</Badge>}
|
|
120
|
+
{showStatus && interaction && <InteractionStatusBadge interaction={interaction} />}
|
|
121
|
+
</div>
|
|
122
|
+
)}
|
|
123
|
+
</>
|
|
124
|
+
);
|
|
125
|
+
}
|
|
@@ -258,9 +258,9 @@ function ViewMedia({
|
|
|
258
258
|
return (
|
|
259
259
|
<div className={`flex items-center justify-center bg-muted ${className ?? ''}`} aria-hidden="true">
|
|
260
260
|
{fallback === 'placeholder' ? (
|
|
261
|
-
<ImageIcon className="size-10 text-muted
|
|
261
|
+
<ImageIcon className="size-10 text-muted" />
|
|
262
262
|
) : (
|
|
263
|
-
<FileText className="size-10 text-muted
|
|
263
|
+
<FileText className="size-10 text-muted" />
|
|
264
264
|
)}
|
|
265
265
|
</div>
|
|
266
266
|
);
|
|
@@ -379,7 +379,7 @@ function ListResults({
|
|
|
379
379
|
)}
|
|
380
380
|
</div>
|
|
381
381
|
{display.description && (
|
|
382
|
-
<p className="line-clamp-3 text-sm text-muted
|
|
382
|
+
<p className="line-clamp-3 text-sm text-muted">
|
|
383
383
|
<ViewField hit={hit} field={display.description} />
|
|
384
384
|
</p>
|
|
385
385
|
)}
|