@patternfly/chatbot 6.8.0-prerelease.7 → 6.8.0-prerelease.9
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/dist/cjs/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.d.ts +46 -5
- package/dist/cjs/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.js +125 -16
- package/dist/cjs/CodeModal/CodeModal.js +5 -0
- package/dist/cjs/MarkdownContent/MarkdownContent.d.ts +26 -7
- package/dist/cjs/MarkdownContent/MarkdownContent.js +79 -166
- package/dist/cjs/MarkdownContent/MarkdownRenderer.d.ts +6 -0
- package/dist/cjs/MarkdownContent/MarkdownRenderer.js +187 -0
- package/dist/cjs/Message/Message.d.ts +3 -4
- package/dist/cjs/Message/Message.js +0 -2
- package/dist/cjs/MessageBox/MessageBox.d.ts +2 -0
- package/dist/cjs/MessageBox/MessageBox.js +7 -2
- package/dist/cjs/index.d.ts +0 -8
- package/dist/cjs/index.js +1 -13
- package/dist/css/main.css +77 -10
- package/dist/css/main.css.map +1 -1
- package/dist/esm/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.d.ts +46 -5
- package/dist/esm/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.js +128 -19
- package/dist/esm/CodeModal/CodeModal.js +5 -0
- package/dist/esm/MarkdownContent/MarkdownContent.d.ts +26 -7
- package/dist/esm/MarkdownContent/MarkdownContent.js +52 -165
- package/dist/esm/MarkdownContent/MarkdownRenderer.d.ts +6 -0
- package/dist/esm/MarkdownContent/MarkdownRenderer.js +182 -0
- package/dist/esm/Message/Message.d.ts +3 -4
- package/dist/esm/Message/Message.js +0 -2
- package/dist/esm/MessageBox/MessageBox.d.ts +2 -0
- package/dist/esm/MessageBox/MessageBox.js +7 -2
- package/dist/esm/index.d.ts +0 -8
- package/dist/esm/index.js +0 -8
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/generate-index.js +41 -16
- package/generate-index.test.js +68 -0
- package/monaco-environment.js +45 -0
- package/package.json +20 -2
- package/patternfly-docs/content/extensions/chatbot/chatbot.md +1 -0
- package/patternfly-docs/content/extensions/chatbot/examples/Messages/BotMessage.tsx +1 -1
- package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithQuickStart.tsx +2 -2
- package/patternfly-docs/content/extensions/chatbot/examples/Messages/Messages.md +2 -2
- package/patternfly-docs/content/extensions/chatbot/examples/Messages/UserMessage.tsx +1 -1
- package/patternfly-docs/content/extensions/chatbot/examples/Messages/monitor-sampleapp-quickstart.ts +1 -0
- package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotHeaderDrawerWithExpandableGroups.tsx +104 -0
- package/patternfly-docs/content/extensions/chatbot/examples/UI/UI.md +12 -1
- package/patternfly-docs/content/extensions/chatbot/tree-shaking.md +124 -0
- package/patternfly-docs/monaco-environment.js +45 -0
- package/patternfly-docs/patternfly-docs.css.js +6 -0
- package/src/Chatbot/Chatbot.scss +4 -0
- package/src/ChatbotContent/ChatbotContent.scss +1 -1
- package/src/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.scss +52 -6
- package/src/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.test.tsx +551 -3
- package/src/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.tsx +350 -49
- package/src/ChatbotFooter/ChatbotFooter.scss +2 -2
- package/src/ChatbotHeader/ChatbotHeader.scss +4 -0
- package/src/ChatbotModal/ChatbotModal.scss +10 -0
- package/src/ChatbotToggle/ChatbotToggle.scss +6 -0
- package/src/CodeModal/CodeModal.tsx +6 -0
- package/src/DeepThinking/DeepThinking.test.tsx +10 -12
- package/src/MarkdownContent/MarkdownContent.test.tsx +52 -5
- package/src/MarkdownContent/MarkdownContent.tsx +77 -220
- package/src/MarkdownContent/MarkdownRenderer.tsx +235 -0
- package/src/Message/Message.scss +5 -0
- package/src/Message/Message.test.tsx +5 -0
- package/src/Message/Message.tsx +3 -5
- package/src/MessageBox/MessageBox.scss +15 -1
- package/src/MessageBox/MessageBox.tsx +23 -2
- package/src/ResponseActions/ResponseActions.test.tsx +42 -48
- package/src/ToolCall/ToolCall.test.tsx +6 -9
- package/src/ToolResponse/ToolResponse.test.tsx +16 -22
- package/src/index.ts +0 -12
- package/src/test-utils/markdownTestUtils.ts +21 -0
- package/tsconfig.json +6 -1
- package/dist/cjs/AttachmentEdit/AttachmentEdit.test.d.ts +0 -1
- package/dist/cjs/AttachmentEdit/AttachmentEdit.test.js +0 -77
- package/dist/cjs/Chatbot/Chatbot.test.d.ts +0 -1
- package/dist/cjs/Chatbot/Chatbot.test.js +0 -32
- package/dist/cjs/ChatbotAlert/ChatbotAlert.test.d.ts +0 -1
- package/dist/cjs/ChatbotAlert/ChatbotAlert.test.js +0 -27
- package/dist/cjs/ChatbotContent/ChatbotContent.test.d.ts +0 -1
- package/dist/cjs/ChatbotContent/ChatbotContent.test.js +0 -22
- package/dist/cjs/ChatbotConversationHistoryNav/ChatbotConversationHistoryDropdown.test.d.ts +0 -1
- package/dist/cjs/ChatbotConversationHistoryNav/ChatbotConversationHistoryDropdown.test.js +0 -75
- package/dist/cjs/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.test.d.ts +0 -1
- package/dist/cjs/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.test.js +0 -277
- package/dist/cjs/ChatbotFooter/ChatbotFooter.test.d.ts +0 -1
- package/dist/cjs/ChatbotFooter/ChatbotFooter.test.js +0 -27
- package/dist/cjs/ChatbotFooter/ChatbotFooternote.test.d.ts +0 -1
- package/dist/cjs/ChatbotFooter/ChatbotFooternote.test.js +0 -87
- package/dist/cjs/ChatbotHeader/ChatbotHeader.test.d.ts +0 -1
- package/dist/cjs/ChatbotHeader/ChatbotHeader.test.js +0 -18
- package/dist/cjs/ChatbotHeader/ChatbotHeaderActions.test.d.ts +0 -1
- package/dist/cjs/ChatbotHeader/ChatbotHeaderActions.test.js +0 -18
- package/dist/cjs/ChatbotHeader/ChatbotHeaderCloseButton.test.d.ts +0 -1
- package/dist/cjs/ChatbotHeader/ChatbotHeaderCloseButton.test.js +0 -22
- package/dist/cjs/ChatbotHeader/ChatbotHeaderMain.test.d.ts +0 -1
- package/dist/cjs/ChatbotHeader/ChatbotHeaderMain.test.js +0 -18
- package/dist/cjs/ChatbotHeader/ChatbotHeaderMenu.test.d.ts +0 -1
- package/dist/cjs/ChatbotHeader/ChatbotHeaderMenu.test.js +0 -22
- package/dist/cjs/ChatbotHeader/ChatbotHeaderNewChatButton.test.d.ts +0 -1
- package/dist/cjs/ChatbotHeader/ChatbotHeaderNewChatButton.test.js +0 -22
- package/dist/cjs/ChatbotHeader/ChatbotHeaderOptionsDropdown.test.d.ts +0 -1
- package/dist/cjs/ChatbotHeader/ChatbotHeaderOptionsDropdown.test.js +0 -46
- package/dist/cjs/ChatbotHeader/ChatbotHeaderSelectorDropdown.test.d.ts +0 -1
- package/dist/cjs/ChatbotHeader/ChatbotHeaderSelectorDropdown.test.js +0 -44
- package/dist/cjs/ChatbotHeader/ChatbotHeaderTitle.test.d.ts +0 -1
- package/dist/cjs/ChatbotHeader/ChatbotHeaderTitle.test.js +0 -55
- package/dist/cjs/ChatbotModal/ChatbotModal.test.d.ts +0 -1
- package/dist/cjs/ChatbotModal/ChatbotModal.test.js +0 -16
- package/dist/cjs/ChatbotToggle/ChatbotToggle.test.d.ts +0 -1
- package/dist/cjs/ChatbotToggle/ChatbotToggle.test.js +0 -64
- package/dist/cjs/ChatbotWelcomePrompt/ChatbotWelcomePrompt.test.d.ts +0 -1
- package/dist/cjs/ChatbotWelcomePrompt/ChatbotWelcomePrompt.test.js +0 -61
- package/dist/cjs/CodeModal/CodeModal.test.d.ts +0 -1
- package/dist/cjs/CodeModal/CodeModal.test.js +0 -34
- package/dist/cjs/Compare/Compare.test.d.ts +0 -1
- package/dist/cjs/Compare/Compare.test.js +0 -18
- package/dist/cjs/DeepThinking/DeepThinking.test.d.ts +0 -1
- package/dist/cjs/DeepThinking/DeepThinking.test.js +0 -146
- package/dist/cjs/FileDetails/FileDetails.test.d.ts +0 -1
- package/dist/cjs/FileDetails/FileDetails.test.js +0 -42
- package/dist/cjs/FileDetailsLabel/FileDetailsLabel.test.d.ts +0 -1
- package/dist/cjs/FileDetailsLabel/FileDetailsLabel.test.js +0 -79
- package/dist/cjs/FileDropZone/FileDropZone.test.d.ts +0 -1
- package/dist/cjs/FileDropZone/FileDropZone.test.js +0 -100
- package/dist/cjs/FilePreview/FilePreview.test.d.ts +0 -1
- package/dist/cjs/FilePreview/FilePreview.test.js +0 -97
- package/dist/cjs/ImagePreview/ImagePreview.test.d.ts +0 -1
- package/dist/cjs/ImagePreview/ImagePreview.test.js +0 -225
- package/dist/cjs/MarkdownContent/MarkdownContent.test.d.ts +0 -1
- package/dist/cjs/MarkdownContent/MarkdownContent.test.js +0 -192
- package/dist/cjs/Message/CodeBlockMessage/CodeBlockMessage.test.d.ts +0 -1
- package/dist/cjs/Message/CodeBlockMessage/CodeBlockMessage.test.js +0 -131
- package/dist/cjs/Message/ErrorMessage/ErrorMessage.test.d.ts +0 -1
- package/dist/cjs/Message/ErrorMessage/ErrorMessage.test.js +0 -30
- package/dist/cjs/Message/Message.test.d.ts +0 -1
- package/dist/cjs/Message/Message.test.js +0 -1128
- package/dist/cjs/Message/MessageAndActions/MessageAndActions.test.d.ts +0 -1
- package/dist/cjs/Message/MessageAndActions/MessageAndActions.test.js +0 -25
- package/dist/cjs/Message/MessageAttachments/MessageAttachmentItem.test.d.ts +0 -1
- package/dist/cjs/Message/MessageAttachments/MessageAttachmentItem.test.js +0 -25
- package/dist/cjs/Message/MessageAttachments/MessageAttachmentsContainer.test.d.ts +0 -1
- package/dist/cjs/Message/MessageAttachments/MessageAttachmentsContainer.test.js +0 -25
- package/dist/cjs/Message/MessageLoading.test.d.ts +0 -1
- package/dist/cjs/Message/MessageLoading.test.js +0 -25
- package/dist/cjs/Message/QuickResponse/QuickResponse.test.d.ts +0 -1
- package/dist/cjs/Message/QuickResponse/QuickResponse.test.js +0 -109
- package/dist/cjs/Message/QuickStarts/QuickStartTileDescription.test.d.ts +0 -1
- package/dist/cjs/Message/QuickStarts/QuickStartTileDescription.test.js +0 -76
- package/dist/cjs/Message/UserFeedback/UserFeedback.test.d.ts +0 -1
- package/dist/cjs/Message/UserFeedback/UserFeedback.test.js +0 -181
- package/dist/cjs/Message/UserFeedback/UserFeedbackComplete.test.d.ts +0 -1
- package/dist/cjs/Message/UserFeedback/UserFeedbackComplete.test.js +0 -243
- package/dist/cjs/MessageBar/AttachButton.test.d.ts +0 -1
- package/dist/cjs/MessageBar/AttachButton.test.js +0 -152
- package/dist/cjs/MessageBar/MessageBar.test.d.ts +0 -1
- package/dist/cjs/MessageBar/MessageBar.test.js +0 -338
- package/dist/cjs/MessageBar/SendButton.test.d.ts +0 -1
- package/dist/cjs/MessageBar/SendButton.test.js +0 -58
- package/dist/cjs/MessageBar/StopButton.test.d.ts +0 -1
- package/dist/cjs/MessageBar/StopButton.test.js +0 -58
- package/dist/cjs/MessageBox/JumpButton.test.d.ts +0 -1
- package/dist/cjs/MessageBox/JumpButton.test.js +0 -39
- package/dist/cjs/MessageBox/MessageBox.test.d.ts +0 -1
- package/dist/cjs/MessageBox/MessageBox.test.js +0 -294
- package/dist/cjs/MessageDivider/MessageDivider.test.d.ts +0 -1
- package/dist/cjs/MessageDivider/MessageDivider.test.js +0 -29
- package/dist/cjs/Onboarding/Onboarding.test.d.ts +0 -1
- package/dist/cjs/Onboarding/Onboarding.test.js +0 -80
- package/dist/cjs/PreviewAttachment/PreviewAttachment.test.d.ts +0 -1
- package/dist/cjs/PreviewAttachment/PreviewAttachment.test.js +0 -50
- package/dist/cjs/ResponseActions/ResponseActionButton.test.d.ts +0 -1
- package/dist/cjs/ResponseActions/ResponseActionButton.test.js +0 -54
- package/dist/cjs/ResponseActions/ResponseActions.test.d.ts +0 -1
- package/dist/cjs/ResponseActions/ResponseActions.test.js +0 -455
- package/dist/cjs/ResponseActions/ResponseActionsGroups.test.d.ts +0 -1
- package/dist/cjs/ResponseActions/ResponseActionsGroups.test.js +0 -25
- package/dist/cjs/Settings/SettingsForm.test.d.ts +0 -1
- package/dist/cjs/Settings/SettingsForm.test.js +0 -35
- package/dist/cjs/SourcesCard/SourcesCard.test.d.ts +0 -1
- package/dist/cjs/SourcesCard/SourcesCard.test.js +0 -39
- package/dist/cjs/SourcesCardBase/SourcesCardBase.test.d.ts +0 -1
- package/dist/cjs/SourcesCardBase/SourcesCardBase.test.js +0 -199
- package/dist/cjs/TermsOfUse/TermsOfUse.test.d.ts +0 -1
- package/dist/cjs/TermsOfUse/TermsOfUse.test.js +0 -77
- package/dist/cjs/ToolCall/ToolCall.test.d.ts +0 -1
- package/dist/cjs/ToolCall/ToolCall.test.js +0 -201
- package/dist/cjs/ToolResponse/ToolResponse.test.d.ts +0 -1
- package/dist/cjs/ToolResponse/ToolResponse.test.js +0 -184
- package/dist/cjs/__mocks__/monaco-editor.d.ts +0 -11
- package/dist/cjs/__mocks__/monaco-editor.js +0 -18
- package/dist/cjs/__mocks__/rehype-external-links.d.ts +0 -2
- package/dist/cjs/__mocks__/rehype-external-links.js +0 -4
- package/dist/cjs/__mocks__/rehype-highlight.d.ts +0 -2
- package/dist/cjs/__mocks__/rehype-highlight.js +0 -4
- package/dist/cjs/__mocks__/rehype-sanitize.d.ts +0 -2
- package/dist/cjs/__mocks__/rehype-sanitize.js +0 -4
- package/dist/cjs/__mocks__/rehype-unwrap-images.d.ts +0 -2
- package/dist/cjs/__mocks__/rehype-unwrap-images.js +0 -4
- package/dist/esm/AttachmentEdit/AttachmentEdit.test.d.ts +0 -1
- package/dist/esm/AttachmentEdit/AttachmentEdit.test.js +0 -72
- package/dist/esm/Chatbot/Chatbot.test.d.ts +0 -1
- package/dist/esm/Chatbot/Chatbot.test.js +0 -27
- package/dist/esm/ChatbotAlert/ChatbotAlert.test.d.ts +0 -1
- package/dist/esm/ChatbotAlert/ChatbotAlert.test.js +0 -22
- package/dist/esm/ChatbotContent/ChatbotContent.test.d.ts +0 -1
- package/dist/esm/ChatbotContent/ChatbotContent.test.js +0 -17
- package/dist/esm/ChatbotConversationHistoryNav/ChatbotConversationHistoryDropdown.test.d.ts +0 -1
- package/dist/esm/ChatbotConversationHistoryNav/ChatbotConversationHistoryDropdown.test.js +0 -70
- package/dist/esm/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.test.d.ts +0 -1
- package/dist/esm/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.test.js +0 -272
- package/dist/esm/ChatbotFooter/ChatbotFooter.test.d.ts +0 -1
- package/dist/esm/ChatbotFooter/ChatbotFooter.test.js +0 -22
- package/dist/esm/ChatbotFooter/ChatbotFooternote.test.d.ts +0 -1
- package/dist/esm/ChatbotFooter/ChatbotFooternote.test.js +0 -82
- package/dist/esm/ChatbotHeader/ChatbotHeader.test.d.ts +0 -1
- package/dist/esm/ChatbotHeader/ChatbotHeader.test.js +0 -13
- package/dist/esm/ChatbotHeader/ChatbotHeaderActions.test.d.ts +0 -1
- package/dist/esm/ChatbotHeader/ChatbotHeaderActions.test.js +0 -13
- package/dist/esm/ChatbotHeader/ChatbotHeaderCloseButton.test.d.ts +0 -1
- package/dist/esm/ChatbotHeader/ChatbotHeaderCloseButton.test.js +0 -20
- package/dist/esm/ChatbotHeader/ChatbotHeaderMain.test.d.ts +0 -1
- package/dist/esm/ChatbotHeader/ChatbotHeaderMain.test.js +0 -13
- package/dist/esm/ChatbotHeader/ChatbotHeaderMenu.test.d.ts +0 -1
- package/dist/esm/ChatbotHeader/ChatbotHeaderMenu.test.js +0 -20
- package/dist/esm/ChatbotHeader/ChatbotHeaderNewChatButton.test.d.ts +0 -1
- package/dist/esm/ChatbotHeader/ChatbotHeaderNewChatButton.test.js +0 -20
- package/dist/esm/ChatbotHeader/ChatbotHeaderOptionsDropdown.test.d.ts +0 -1
- package/dist/esm/ChatbotHeader/ChatbotHeaderOptionsDropdown.test.js +0 -44
- package/dist/esm/ChatbotHeader/ChatbotHeaderSelectorDropdown.test.d.ts +0 -1
- package/dist/esm/ChatbotHeader/ChatbotHeaderSelectorDropdown.test.js +0 -42
- package/dist/esm/ChatbotHeader/ChatbotHeaderTitle.test.d.ts +0 -1
- package/dist/esm/ChatbotHeader/ChatbotHeaderTitle.test.js +0 -50
- package/dist/esm/ChatbotModal/ChatbotModal.test.d.ts +0 -1
- package/dist/esm/ChatbotModal/ChatbotModal.test.js +0 -11
- package/dist/esm/ChatbotToggle/ChatbotToggle.test.d.ts +0 -1
- package/dist/esm/ChatbotToggle/ChatbotToggle.test.js +0 -59
- package/dist/esm/ChatbotWelcomePrompt/ChatbotWelcomePrompt.test.d.ts +0 -1
- package/dist/esm/ChatbotWelcomePrompt/ChatbotWelcomePrompt.test.js +0 -56
- package/dist/esm/CodeModal/CodeModal.test.d.ts +0 -1
- package/dist/esm/CodeModal/CodeModal.test.js +0 -29
- package/dist/esm/Compare/Compare.test.d.ts +0 -1
- package/dist/esm/Compare/Compare.test.js +0 -13
- package/dist/esm/DeepThinking/DeepThinking.test.d.ts +0 -1
- package/dist/esm/DeepThinking/DeepThinking.test.js +0 -141
- package/dist/esm/FileDetails/FileDetails.test.d.ts +0 -1
- package/dist/esm/FileDetails/FileDetails.test.js +0 -37
- package/dist/esm/FileDetailsLabel/FileDetailsLabel.test.d.ts +0 -1
- package/dist/esm/FileDetailsLabel/FileDetailsLabel.test.js +0 -74
- package/dist/esm/FileDropZone/FileDropZone.test.d.ts +0 -1
- package/dist/esm/FileDropZone/FileDropZone.test.js +0 -95
- package/dist/esm/FilePreview/FilePreview.test.d.ts +0 -1
- package/dist/esm/FilePreview/FilePreview.test.js +0 -92
- package/dist/esm/ImagePreview/ImagePreview.test.d.ts +0 -1
- package/dist/esm/ImagePreview/ImagePreview.test.js +0 -220
- package/dist/esm/MarkdownContent/MarkdownContent.test.d.ts +0 -1
- package/dist/esm/MarkdownContent/MarkdownContent.test.js +0 -187
- package/dist/esm/Message/CodeBlockMessage/CodeBlockMessage.test.d.ts +0 -1
- package/dist/esm/Message/CodeBlockMessage/CodeBlockMessage.test.js +0 -126
- package/dist/esm/Message/ErrorMessage/ErrorMessage.test.d.ts +0 -1
- package/dist/esm/Message/ErrorMessage/ErrorMessage.test.js +0 -25
- package/dist/esm/Message/Message.test.d.ts +0 -1
- package/dist/esm/Message/Message.test.js +0 -1123
- package/dist/esm/Message/MessageAndActions/MessageAndActions.test.d.ts +0 -1
- package/dist/esm/Message/MessageAndActions/MessageAndActions.test.js +0 -20
- package/dist/esm/Message/MessageAttachments/MessageAttachmentItem.test.d.ts +0 -1
- package/dist/esm/Message/MessageAttachments/MessageAttachmentItem.test.js +0 -20
- package/dist/esm/Message/MessageAttachments/MessageAttachmentsContainer.test.d.ts +0 -1
- package/dist/esm/Message/MessageAttachments/MessageAttachmentsContainer.test.js +0 -20
- package/dist/esm/Message/MessageLoading.test.d.ts +0 -1
- package/dist/esm/Message/MessageLoading.test.js +0 -20
- package/dist/esm/Message/QuickResponse/QuickResponse.test.d.ts +0 -1
- package/dist/esm/Message/QuickResponse/QuickResponse.test.js +0 -104
- package/dist/esm/Message/QuickStarts/QuickStartTileDescription.test.d.ts +0 -1
- package/dist/esm/Message/QuickStarts/QuickStartTileDescription.test.js +0 -48
- package/dist/esm/Message/UserFeedback/UserFeedback.test.d.ts +0 -1
- package/dist/esm/Message/UserFeedback/UserFeedback.test.js +0 -176
- package/dist/esm/Message/UserFeedback/UserFeedbackComplete.test.d.ts +0 -1
- package/dist/esm/Message/UserFeedback/UserFeedbackComplete.test.js +0 -238
- package/dist/esm/MessageBar/AttachButton.test.d.ts +0 -1
- package/dist/esm/MessageBar/AttachButton.test.js +0 -147
- package/dist/esm/MessageBar/MessageBar.test.d.ts +0 -1
- package/dist/esm/MessageBar/MessageBar.test.js +0 -333
- package/dist/esm/MessageBar/SendButton.test.d.ts +0 -1
- package/dist/esm/MessageBar/SendButton.test.js +0 -53
- package/dist/esm/MessageBar/StopButton.test.d.ts +0 -1
- package/dist/esm/MessageBar/StopButton.test.js +0 -53
- package/dist/esm/MessageBox/JumpButton.test.d.ts +0 -1
- package/dist/esm/MessageBox/JumpButton.test.js +0 -34
- package/dist/esm/MessageBox/MessageBox.test.d.ts +0 -1
- package/dist/esm/MessageBox/MessageBox.test.js +0 -289
- package/dist/esm/MessageDivider/MessageDivider.test.d.ts +0 -1
- package/dist/esm/MessageDivider/MessageDivider.test.js +0 -24
- package/dist/esm/Onboarding/Onboarding.test.d.ts +0 -1
- package/dist/esm/Onboarding/Onboarding.test.js +0 -75
- package/dist/esm/PreviewAttachment/PreviewAttachment.test.d.ts +0 -1
- package/dist/esm/PreviewAttachment/PreviewAttachment.test.js +0 -48
- package/dist/esm/ResponseActions/ResponseActionButton.test.d.ts +0 -1
- package/dist/esm/ResponseActions/ResponseActionButton.test.js +0 -49
- package/dist/esm/ResponseActions/ResponseActions.test.d.ts +0 -1
- package/dist/esm/ResponseActions/ResponseActions.test.js +0 -450
- package/dist/esm/ResponseActions/ResponseActionsGroups.test.d.ts +0 -1
- package/dist/esm/ResponseActions/ResponseActionsGroups.test.js +0 -20
- package/dist/esm/Settings/SettingsForm.test.d.ts +0 -1
- package/dist/esm/Settings/SettingsForm.test.js +0 -33
- package/dist/esm/SourcesCard/SourcesCard.test.d.ts +0 -1
- package/dist/esm/SourcesCard/SourcesCard.test.js +0 -34
- package/dist/esm/SourcesCardBase/SourcesCardBase.test.d.ts +0 -1
- package/dist/esm/SourcesCardBase/SourcesCardBase.test.js +0 -194
- package/dist/esm/TermsOfUse/TermsOfUse.test.d.ts +0 -1
- package/dist/esm/TermsOfUse/TermsOfUse.test.js +0 -72
- package/dist/esm/ToolCall/ToolCall.test.d.ts +0 -1
- package/dist/esm/ToolCall/ToolCall.test.js +0 -196
- package/dist/esm/ToolResponse/ToolResponse.test.d.ts +0 -1
- package/dist/esm/ToolResponse/ToolResponse.test.js +0 -179
- package/dist/esm/__mocks__/monaco-editor.d.ts +0 -11
- package/dist/esm/__mocks__/monaco-editor.js +0 -18
- package/dist/esm/__mocks__/rehype-external-links.d.ts +0 -2
- package/dist/esm/__mocks__/rehype-external-links.js +0 -2
- package/dist/esm/__mocks__/rehype-highlight.d.ts +0 -2
- package/dist/esm/__mocks__/rehype-highlight.js +0 -2
- package/dist/esm/__mocks__/rehype-sanitize.d.ts +0 -2
- package/dist/esm/__mocks__/rehype-sanitize.js +0 -2
- package/dist/esm/__mocks__/rehype-unwrap-images.d.ts +0 -2
- package/dist/esm/__mocks__/rehype-unwrap-images.js +0 -2
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
// ============================================================================
|
|
2
2
|
// Chatbot Header - Chatbot Conversation History Nav
|
|
3
3
|
// ============================================================================
|
|
4
|
-
import type { KeyboardEvent, FunctionComponent } from 'react';
|
|
5
|
-
import { useRef, Fragment } from 'react';
|
|
4
|
+
import type { KeyboardEvent, FunctionComponent, ReactNode, Ref, RefObject } from 'react';
|
|
5
|
+
import { useEffect, useRef, Fragment, isValidElement } from 'react';
|
|
6
6
|
|
|
7
7
|
// Import PatternFly components
|
|
8
8
|
import {
|
|
@@ -42,7 +42,11 @@ import {
|
|
|
42
42
|
MenuContent,
|
|
43
43
|
MenuItemProps,
|
|
44
44
|
MenuGroupProps,
|
|
45
|
-
MenuContentProps
|
|
45
|
+
MenuContentProps,
|
|
46
|
+
ExpandableSection,
|
|
47
|
+
ExpandableSectionToggle,
|
|
48
|
+
ExpandableSectionProps,
|
|
49
|
+
ExpandableSectionToggleProps
|
|
46
50
|
} from '@patternfly/react-core';
|
|
47
51
|
|
|
48
52
|
import { RhUiClockIcon, RhUiCommentIcon, RhUiEditFillIcon } from '@patternfly/react-icons';
|
|
@@ -51,6 +55,189 @@ import ConversationHistoryDropdown from './ChatbotConversationHistoryDropdown';
|
|
|
51
55
|
import LoadingState from './LoadingState';
|
|
52
56
|
import HistoryEmptyState, { HistoryEmptyStateProps } from './EmptyState';
|
|
53
57
|
|
|
58
|
+
const isConversation = (item: unknown): item is Conversation =>
|
|
59
|
+
Boolean(item && typeof item === 'object' && 'id' in item && 'text' in item && !('items' in item));
|
|
60
|
+
|
|
61
|
+
const isConversationGroup = (item: unknown): item is ConversationGroup =>
|
|
62
|
+
Boolean(item && typeof item === 'object' && 'id' in item && 'label' in item && 'items' in item);
|
|
63
|
+
|
|
64
|
+
const isConversationGroupArray = (items: unknown[]): items is ConversationGroup[] =>
|
|
65
|
+
items.length > 0 && isConversationGroup(items[0]);
|
|
66
|
+
|
|
67
|
+
const getExpandableGroupContentId = (groupId: string) => `chatbot-nav-group-${groupId}-content`;
|
|
68
|
+
|
|
69
|
+
const getGroupLabelId = (groupId: string) => `chatbot-nav-group-${groupId}-label`;
|
|
70
|
+
|
|
71
|
+
const getExpandableGroupToggleId = (groupId: string) => `chatbot-nav-group-${groupId}-toggle`;
|
|
72
|
+
|
|
73
|
+
const getShowAllToggleId = (groupId: string) => `chatbot-nav-group-${groupId}-show-all-toggle`;
|
|
74
|
+
|
|
75
|
+
const getStaticMenuLabelId = (group: { id: string; menuGroupProps?: MenuGroupProps }) =>
|
|
76
|
+
group.menuGroupProps?.titleId ?? getGroupLabelId(group.id);
|
|
77
|
+
|
|
78
|
+
const getMenuListLabelledBy = (group: {
|
|
79
|
+
id: string;
|
|
80
|
+
expandable?: { isExpanded: boolean; onToggle: (isExpanded: boolean) => void };
|
|
81
|
+
menuGroupProps?: MenuGroupProps;
|
|
82
|
+
}) => {
|
|
83
|
+
if (group.expandable) {
|
|
84
|
+
return group.menuGroupProps?.['aria-labelledby'] ?? getExpandableGroupToggleId(group.id);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
return group.menuGroupProps?.['aria-labelledby'] ?? getStaticMenuLabelId(group);
|
|
88
|
+
};
|
|
89
|
+
|
|
90
|
+
const getMenuListProps = (group: {
|
|
91
|
+
id: string;
|
|
92
|
+
label: ReactNode;
|
|
93
|
+
expandable?: { isExpanded: boolean; onToggle: (isExpanded: boolean) => void };
|
|
94
|
+
menuGroupProps?: MenuGroupProps;
|
|
95
|
+
menuListProps?: Omit<MenuListProps, 'children'>;
|
|
96
|
+
}): Omit<MenuListProps, 'children'> => ({
|
|
97
|
+
...group.menuListProps,
|
|
98
|
+
'aria-labelledby': group.menuListProps?.['aria-labelledby'] ?? getMenuListLabelledBy(group)
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
const focusElementById = (id: string) => {
|
|
102
|
+
document.getElementById(id)?.focus();
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
// Matches PatternFly's Menu "view more" example: expanding moves focus to the first
|
|
106
|
+
// newly revealed item; collapsing keeps focus on the toggle as it updates to "Show all".
|
|
107
|
+
const useShowAllFocusManagement = (
|
|
108
|
+
isExpanded: boolean,
|
|
109
|
+
toggleId: string,
|
|
110
|
+
firstOverflowItemRef: Ref<HTMLButtonElement | HTMLAnchorElement | null>,
|
|
111
|
+
hasOverflowItems: boolean
|
|
112
|
+
) => {
|
|
113
|
+
const wasExpandedRef = useRef(isExpanded);
|
|
114
|
+
|
|
115
|
+
useEffect(() => {
|
|
116
|
+
if (hasOverflowItems && isExpanded !== wasExpandedRef.current) {
|
|
117
|
+
if (isExpanded) {
|
|
118
|
+
(firstOverflowItemRef as RefObject<HTMLElement | null>).current?.focus();
|
|
119
|
+
} else {
|
|
120
|
+
focusElementById(toggleId);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
wasExpandedRef.current = isExpanded;
|
|
125
|
+
}, [isExpanded, toggleId, firstOverflowItemRef, hasOverflowItems]);
|
|
126
|
+
};
|
|
127
|
+
|
|
128
|
+
interface ShowAllGroupBodyProps {
|
|
129
|
+
group: ConversationGroup;
|
|
130
|
+
getNavItem: (
|
|
131
|
+
conversation: Conversation,
|
|
132
|
+
itemOverrides?: Partial<MenuItemProps>,
|
|
133
|
+
itemRef?: Ref<HTMLButtonElement | HTMLAnchorElement>
|
|
134
|
+
) => ReactNode;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
// The toggle is rendered as a real MenuItem (rather than a standalone button) so it
|
|
138
|
+
// participates in the Menu's built-in roving tabindex and arrow-key navigation just
|
|
139
|
+
// like any other conversation item, instead of being skipped over or interrupting
|
|
140
|
+
// arrow-key handling. Since it keeps a stable key and DOM position regardless of how
|
|
141
|
+
// many overflow items are shown, it also keeps focus across clicks without being
|
|
142
|
+
// unmounted or recreated.
|
|
143
|
+
const ShowAllGroupBody: FunctionComponent<ShowAllGroupBodyProps> = ({ group, getNavItem }) => {
|
|
144
|
+
const { visibleCount, isExpanded, onToggle, label } = group.showAll!;
|
|
145
|
+
const conversationItems = group.items.filter(isConversation);
|
|
146
|
+
const alwaysVisibleItems = conversationItems.slice(0, visibleCount);
|
|
147
|
+
const overflowItems = conversationItems.slice(visibleCount);
|
|
148
|
+
const hasOverflowItems = overflowItems.length > 0;
|
|
149
|
+
const toggleId = getShowAllToggleId(group.id);
|
|
150
|
+
const firstOverflowItemRef = useRef<HTMLButtonElement | HTMLAnchorElement>(null);
|
|
151
|
+
const toggleLabel = label ?? (isExpanded ? 'Show less' : 'Show all');
|
|
152
|
+
|
|
153
|
+
useShowAllFocusManagement(isExpanded, toggleId, firstOverflowItemRef, hasOverflowItems);
|
|
154
|
+
|
|
155
|
+
return (
|
|
156
|
+
<>
|
|
157
|
+
<MenuList {...getMenuListProps(group)}>
|
|
158
|
+
{alwaysVisibleItems.map((chat) => (
|
|
159
|
+
<Fragment key={chat.id}>{getNavItem(chat)}</Fragment>
|
|
160
|
+
))}
|
|
161
|
+
{isExpanded &&
|
|
162
|
+
overflowItems.map((chat, index) => (
|
|
163
|
+
<Fragment key={chat.id}>
|
|
164
|
+
{getNavItem(chat, undefined, index === 0 ? firstOverflowItemRef : undefined)}
|
|
165
|
+
</Fragment>
|
|
166
|
+
))}
|
|
167
|
+
{hasOverflowItems && (
|
|
168
|
+
<MenuItem
|
|
169
|
+
key="show-all-toggle"
|
|
170
|
+
id={toggleId}
|
|
171
|
+
itemId={toggleId}
|
|
172
|
+
className="pf-chatbot__menu-show-all-toggle"
|
|
173
|
+
onClick={() => onToggle(!isExpanded)}
|
|
174
|
+
>
|
|
175
|
+
{toggleLabel}
|
|
176
|
+
</MenuItem>
|
|
177
|
+
)}
|
|
178
|
+
</MenuList>
|
|
179
|
+
{group.footer}
|
|
180
|
+
</>
|
|
181
|
+
);
|
|
182
|
+
};
|
|
183
|
+
|
|
184
|
+
interface ExpandableConversationGroupProps {
|
|
185
|
+
group: ConversationGroup;
|
|
186
|
+
children: ReactNode;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
const ExpandableConversationGroup: FunctionComponent<ExpandableConversationGroupProps> = ({ group, children }) => {
|
|
190
|
+
const toggleId = getExpandableGroupToggleId(group.id);
|
|
191
|
+
const contentId = getExpandableGroupContentId(group.id);
|
|
192
|
+
const { isExpanded, onToggle, expandableSectionProps, expandableSectionToggleProps } = group.expandable!;
|
|
193
|
+
|
|
194
|
+
return (
|
|
195
|
+
<div
|
|
196
|
+
className={`pf-chatbot__menu-item-header pf-chatbot__menu-item-header--expandable ${group.menuGroupProps?.className ?? ''}`}
|
|
197
|
+
>
|
|
198
|
+
<ExpandableSectionToggle
|
|
199
|
+
toggleId={toggleId}
|
|
200
|
+
contentId={contentId}
|
|
201
|
+
isExpanded={isExpanded}
|
|
202
|
+
onToggle={onToggle}
|
|
203
|
+
toggleWrapper="h3"
|
|
204
|
+
className="pf-chatbot__menu-group-toggle"
|
|
205
|
+
{...expandableSectionToggleProps}
|
|
206
|
+
>
|
|
207
|
+
{group.label}
|
|
208
|
+
</ExpandableSectionToggle>
|
|
209
|
+
<ExpandableSection
|
|
210
|
+
isDetached
|
|
211
|
+
isExpanded={isExpanded}
|
|
212
|
+
toggleId={toggleId}
|
|
213
|
+
contentId={contentId}
|
|
214
|
+
{...expandableSectionProps}
|
|
215
|
+
>
|
|
216
|
+
{isExpanded && children}
|
|
217
|
+
</ExpandableSection>
|
|
218
|
+
</div>
|
|
219
|
+
);
|
|
220
|
+
};
|
|
221
|
+
|
|
222
|
+
type ConversationMenuSegment =
|
|
223
|
+
| { type: 'static'; groups: ConversationGroup[] }
|
|
224
|
+
| { type: 'expandable'; group: ConversationGroup };
|
|
225
|
+
|
|
226
|
+
const buildConversationMenuSegments = (groups: ConversationGroup[]): ConversationMenuSegment[] =>
|
|
227
|
+
groups.reduce<ConversationMenuSegment[]>((segments, group) => {
|
|
228
|
+
if (group.expandable) {
|
|
229
|
+
return [...segments, { type: 'expandable', group }];
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
const last = segments[segments.length - 1];
|
|
233
|
+
if (last?.type === 'static') {
|
|
234
|
+
last.groups.push(group);
|
|
235
|
+
return segments;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
return [...segments, { type: 'static', groups: [group] }];
|
|
239
|
+
}, []);
|
|
240
|
+
|
|
54
241
|
export interface Conversation {
|
|
55
242
|
/** Conversation id */
|
|
56
243
|
id: string;
|
|
@@ -73,6 +260,55 @@ export interface Conversation {
|
|
|
73
260
|
/** Custom dropdown ID to ensure uniqueness across demo instances */
|
|
74
261
|
dropdownId?: string;
|
|
75
262
|
}
|
|
263
|
+
|
|
264
|
+
export interface ConversationGroupShowAll {
|
|
265
|
+
/** Number of items visible when collapsed */
|
|
266
|
+
visibleCount: number;
|
|
267
|
+
/** Whether all items are shown */
|
|
268
|
+
isExpanded: boolean;
|
|
269
|
+
/** Callback when show all / show less is toggled */
|
|
270
|
+
onToggle: (isExpanded: boolean) => void;
|
|
271
|
+
/** Custom content rendered in the show all / show less toggle. Defaults to "Show all" when collapsed and "Show less" when expanded. */
|
|
272
|
+
label?: ReactNode;
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
export interface ConversationGroupExpandable {
|
|
276
|
+
/** Whether the group content is expanded */
|
|
277
|
+
isExpanded: boolean;
|
|
278
|
+
/** Callback when the group is toggled */
|
|
279
|
+
onToggle: (isExpanded: boolean) => void;
|
|
280
|
+
/** Additional props applied to ExpandableSection */
|
|
281
|
+
expandableSectionProps?: Omit<ExpandableSectionProps, 'ref'>;
|
|
282
|
+
/** Additional props applied to ExpandableSectionToggle */
|
|
283
|
+
expandableSectionToggleProps?: ExpandableSectionToggleProps;
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
export interface ConversationGroup {
|
|
287
|
+
/** Unique group id */
|
|
288
|
+
id: string;
|
|
289
|
+
/** Group label rendered as a MenuGroup heading or expandable toggle label */
|
|
290
|
+
label: ReactNode;
|
|
291
|
+
/** Conversation items or custom menu content such as a "Show all" action */
|
|
292
|
+
items: (Conversation | ReactNode)[];
|
|
293
|
+
/** Content rendered after the group's menu list */
|
|
294
|
+
footer?: ReactNode;
|
|
295
|
+
/** Custom group header that replaces the default label or expandable toggle */
|
|
296
|
+
header?: ReactNode;
|
|
297
|
+
/** When set, the group renders as an expandable section */
|
|
298
|
+
expandable?: ConversationGroupExpandable;
|
|
299
|
+
/** When set, truncates the list with an expandable show all / show less section */
|
|
300
|
+
showAll?: ConversationGroupShowAll;
|
|
301
|
+
/** Additional props applied to the conversation menu group */
|
|
302
|
+
menuGroupProps?: MenuGroupProps;
|
|
303
|
+
/** Additional props applied to the conversation list */
|
|
304
|
+
menuListProps?: Omit<MenuListProps, 'children'>;
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
export type Conversations =
|
|
308
|
+
| (Conversation | ReactNode)[]
|
|
309
|
+
| ConversationGroup[]
|
|
310
|
+
| { [key: string]: (Conversation | ReactNode)[] };
|
|
311
|
+
|
|
76
312
|
export interface ChatbotConversationHistoryNavProps extends DrawerProps {
|
|
77
313
|
/** Function called to toggle drawer */
|
|
78
314
|
onDrawerToggle: (event: React.KeyboardEvent | React.MouseEvent | React.TransitionEvent) => void;
|
|
@@ -85,7 +321,7 @@ export interface ChatbotConversationHistoryNavProps extends DrawerProps {
|
|
|
85
321
|
/** Callback function for when an item is selected */
|
|
86
322
|
onSelectActiveItem?: (event?: React.MouseEvent, itemId?: string | number) => void;
|
|
87
323
|
/** Items shown in chat history */
|
|
88
|
-
conversations:
|
|
324
|
+
conversations: Conversations;
|
|
89
325
|
/** Additional button props for new chat button. */
|
|
90
326
|
newChatButtonProps?: ButtonProps;
|
|
91
327
|
/** Additional props applied to conversation menu group. If conversations is an object, you should pass an object of MenuGroupProps for each group. */
|
|
@@ -211,13 +447,15 @@ export const ChatbotConversationHistoryNav: FunctionComponent<ChatbotConversatio
|
|
|
211
447
|
drawerRef.current && drawerRef.current.focus();
|
|
212
448
|
};
|
|
213
449
|
|
|
214
|
-
const
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
450
|
+
const getNavItem = (
|
|
451
|
+
conversation: Conversation,
|
|
452
|
+
itemOverrides?: Partial<MenuItemProps>,
|
|
453
|
+
itemRef?: Ref<HTMLButtonElement | HTMLAnchorElement>
|
|
454
|
+
) => (
|
|
218
455
|
<MenuItem
|
|
219
456
|
className={`pf-chatbot__menu-item ${activeItemId && activeItemId === conversation.id ? 'pf-chatbot__menu-item--active' : ''}`}
|
|
220
457
|
itemId={conversation.id}
|
|
458
|
+
ref={itemRef}
|
|
221
459
|
{...(conversation.noIcon ? {} : { icon: conversation.icon ?? <RhUiCommentIcon /> })}
|
|
222
460
|
/* eslint-disable indent */
|
|
223
461
|
{...(conversation.menuItems
|
|
@@ -233,45 +471,118 @@ export const ChatbotConversationHistoryNav: FunctionComponent<ChatbotConversatio
|
|
|
233
471
|
}
|
|
234
472
|
: {})}
|
|
235
473
|
{...conversation.additionalProps}
|
|
474
|
+
{...itemOverrides}
|
|
236
475
|
>
|
|
237
476
|
{conversation.text}
|
|
238
477
|
</MenuItem>
|
|
239
478
|
);
|
|
240
479
|
|
|
241
|
-
const
|
|
242
|
-
|
|
480
|
+
const renderConversationItems = (items: (Conversation | ReactNode)[], keyPrefix = '') =>
|
|
481
|
+
items.map((item, index) => {
|
|
482
|
+
if (isConversation(item)) {
|
|
483
|
+
return <Fragment key={item.id}>{getNavItem(item)}</Fragment>;
|
|
484
|
+
}
|
|
485
|
+
|
|
486
|
+
const key = isValidElement(item) && item.key != null ? String(item.key) : `${keyPrefix}-${index}`;
|
|
487
|
+
|
|
488
|
+
return <Fragment key={key}>{item}</Fragment>;
|
|
489
|
+
});
|
|
490
|
+
|
|
491
|
+
const renderGroupBody = (group: ConversationGroup) => {
|
|
492
|
+
if (group.showAll) {
|
|
493
|
+
return <ShowAllGroupBody group={group} getNavItem={getNavItem} />;
|
|
494
|
+
}
|
|
495
|
+
|
|
496
|
+
return (
|
|
497
|
+
<>
|
|
498
|
+
<MenuList {...getMenuListProps(group)}>{renderConversationItems(group.items, group.id)}</MenuList>
|
|
499
|
+
{group.footer}
|
|
500
|
+
</>
|
|
501
|
+
);
|
|
502
|
+
};
|
|
503
|
+
|
|
504
|
+
const renderConversationGroup = (group: ConversationGroup) => {
|
|
505
|
+
if (group.header) {
|
|
243
506
|
return (
|
|
244
|
-
<
|
|
245
|
-
{
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
} else {
|
|
249
|
-
return conversation;
|
|
250
|
-
}
|
|
251
|
-
})}
|
|
252
|
-
</MenuList>
|
|
507
|
+
<div className={`pf-chatbot__menu-item-header ${group.menuGroupProps?.className ?? ''}`} key={group.id}>
|
|
508
|
+
{group.header}
|
|
509
|
+
{renderGroupBody(group)}
|
|
510
|
+
</div>
|
|
253
511
|
);
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
const labelId = getStaticMenuLabelId(group);
|
|
515
|
+
|
|
516
|
+
return (
|
|
517
|
+
<MenuGroup
|
|
518
|
+
className="pf-chatbot__menu-item-header"
|
|
519
|
+
label={group.label}
|
|
520
|
+
key={group.id}
|
|
521
|
+
labelHeadingLevel="h3"
|
|
522
|
+
{...group.menuGroupProps}
|
|
523
|
+
titleId={labelId}
|
|
524
|
+
aria-labelledby={group.menuGroupProps?.['aria-labelledby'] ?? labelId}
|
|
525
|
+
>
|
|
526
|
+
{renderGroupBody(group)}
|
|
527
|
+
</MenuGroup>
|
|
528
|
+
);
|
|
529
|
+
};
|
|
530
|
+
|
|
531
|
+
const renderConversationMenu = (content: ReactNode, key?: string) => (
|
|
532
|
+
<Menu
|
|
533
|
+
key={key}
|
|
534
|
+
className="pf-chatbot__history-menu"
|
|
535
|
+
isPlain
|
|
536
|
+
onSelect={onSelectActiveItem}
|
|
537
|
+
activeItemId={activeItemId}
|
|
538
|
+
{...menuProps}
|
|
539
|
+
>
|
|
540
|
+
<MenuContent {...menuContentProps}>{content}</MenuContent>
|
|
541
|
+
</Menu>
|
|
542
|
+
);
|
|
543
|
+
|
|
544
|
+
const renderConversationMenuSegment = (segment: ConversationMenuSegment) => {
|
|
545
|
+
if (segment.type === 'static') {
|
|
546
|
+
return renderConversationMenu(
|
|
547
|
+
<>{segment.groups.map(renderConversationGroup)}</>,
|
|
548
|
+
segment.groups.map((group) => group.id).join('-')
|
|
273
549
|
);
|
|
274
550
|
}
|
|
551
|
+
|
|
552
|
+
return (
|
|
553
|
+
<ExpandableConversationGroup group={segment.group} key={segment.group.id}>
|
|
554
|
+
{renderConversationMenu(renderGroupBody(segment.group))}
|
|
555
|
+
</ExpandableConversationGroup>
|
|
556
|
+
);
|
|
557
|
+
};
|
|
558
|
+
|
|
559
|
+
const normalizeObjectGroups = (groupedConversations: { [key: string]: (Conversation | ReactNode)[] }) =>
|
|
560
|
+
Object.keys(groupedConversations).map((groupKey) => ({
|
|
561
|
+
id: groupKey,
|
|
562
|
+
label: groupKey,
|
|
563
|
+
items: groupedConversations[groupKey],
|
|
564
|
+
menuGroupProps:
|
|
565
|
+
menuGroupProps && typeof menuGroupProps === 'object' && groupKey in menuGroupProps
|
|
566
|
+
? (menuGroupProps as { [key: string]: MenuGroupProps })[groupKey]
|
|
567
|
+
: undefined,
|
|
568
|
+
menuListProps:
|
|
569
|
+
menuListProps && typeof menuListProps === 'object' && groupKey in menuListProps
|
|
570
|
+
? (menuListProps as { [key: string]: Omit<MenuListProps, 'children'> })[groupKey]
|
|
571
|
+
: undefined
|
|
572
|
+
}));
|
|
573
|
+
|
|
574
|
+
const buildConversations = () => {
|
|
575
|
+
if (Array.isArray(conversations)) {
|
|
576
|
+
if (isConversationGroupArray(conversations)) {
|
|
577
|
+
return <>{buildConversationMenuSegments(conversations).map(renderConversationMenuSegment)}</>;
|
|
578
|
+
}
|
|
579
|
+
|
|
580
|
+
return renderConversationMenu(<MenuList {...menuListProps}>{renderConversationItems(conversations)}</MenuList>);
|
|
581
|
+
}
|
|
582
|
+
|
|
583
|
+
return (
|
|
584
|
+
<>{buildConversationMenuSegments(normalizeObjectGroups(conversations)).map(renderConversationMenuSegment)}</>
|
|
585
|
+
);
|
|
275
586
|
};
|
|
276
587
|
|
|
277
588
|
// Menu Content
|
|
@@ -289,17 +600,7 @@ export const ChatbotConversationHistoryNav: FunctionComponent<ChatbotConversatio
|
|
|
289
600
|
if (noResultsState) {
|
|
290
601
|
return <HistoryEmptyState {...noResultsState} />;
|
|
291
602
|
}
|
|
292
|
-
return (
|
|
293
|
-
<Menu
|
|
294
|
-
className="pf-chatbot__history-menu"
|
|
295
|
-
isPlain
|
|
296
|
-
onSelect={onSelectActiveItem}
|
|
297
|
-
activeItemId={activeItemId}
|
|
298
|
-
{...menuProps}
|
|
299
|
-
>
|
|
300
|
-
<MenuContent {...menuContentProps}>{buildConversations()}</MenuContent>
|
|
301
|
-
</Menu>
|
|
302
|
-
);
|
|
603
|
+
return buildConversations();
|
|
303
604
|
};
|
|
304
605
|
|
|
305
606
|
const renderDrawerContent = () => (
|
|
@@ -17,8 +17,8 @@
|
|
|
17
17
|
}
|
|
18
18
|
}
|
|
19
19
|
|
|
20
|
-
.pf-chatbot:not(.pf-
|
|
21
|
-
.pf-chatbot__footer {
|
|
20
|
+
.pf-chatbot:not(.pf-chatbot--default) {
|
|
21
|
+
.pf-chatbot__footer:not(.pf-m-primary) {
|
|
22
22
|
background-color: var(--pf-t--global--background--color--secondary--default);
|
|
23
23
|
|
|
24
24
|
@at-root :where(.pf-v6-theme-glass) & {
|
|
@@ -64,6 +64,10 @@
|
|
|
64
64
|
background-color: var(--pf-t--global--background--color--glass--primary--default);
|
|
65
65
|
}
|
|
66
66
|
}
|
|
67
|
+
|
|
68
|
+
&:has(.pf-chatbot__content.pf-m-primary) .pf-chatbot__header {
|
|
69
|
+
background-color: var(--pf-t--global--background--color--primary--default);
|
|
70
|
+
}
|
|
67
71
|
}
|
|
68
72
|
|
|
69
73
|
// ============================================================================
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
.pf-chatbot__chatbot-modal {
|
|
6
6
|
--pf-v6-c-modal-box--BorderRadius: var(--pf-t--global--border--radius--medium) !important;
|
|
7
|
+
--pf-v6-c-modal-box--BackgroundColor: var(--pf-t--global--background--color--floating--secondary--default);
|
|
7
8
|
position: fixed !important;
|
|
8
9
|
inset-block-end: var(--pf-t--global--spacer--800); // no associated semantic token
|
|
9
10
|
inset-inline-end: var(--pf-t--global--spacer--lg);
|
|
@@ -26,6 +27,15 @@
|
|
|
26
27
|
}
|
|
27
28
|
}
|
|
28
29
|
|
|
30
|
+
:root:where(.pf-v6-theme-glass) {
|
|
31
|
+
.pf-chatbot__chatbot-modal {
|
|
32
|
+
--pf-v6-c-modal-box--BackgroundColor: var(
|
|
33
|
+
--pf-t--global--background--color--glass--primary--default,
|
|
34
|
+
var(--pf-t--global--background--color--secondary--default)
|
|
35
|
+
);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
29
39
|
// ============================================================================
|
|
30
40
|
// Chatbot Display Mode - Fullscreen and Embedded
|
|
31
41
|
// ============================================================================
|
|
@@ -27,6 +27,12 @@ import ChatbotModal from '../ChatbotModal/ChatbotModal';
|
|
|
27
27
|
let monacoInstance: typeof import('monaco-editor') | null = null;
|
|
28
28
|
const loadMonaco = async () => {
|
|
29
29
|
if (!monacoInstance) {
|
|
30
|
+
if (!globalThis.MonacoEnvironment?.getWorker && !globalThis.MonacoEnvironment?.getWorkerUrl) {
|
|
31
|
+
// eslint-disable-next-line no-console
|
|
32
|
+
console.error(
|
|
33
|
+
'Monaco web workers are not configured. Import @patternfly/chatbot/monaco-environment before using CodeModal.'
|
|
34
|
+
);
|
|
35
|
+
}
|
|
30
36
|
const [monaco, { loader }] = await Promise.all([import('monaco-editor'), import('@monaco-editor/react')]);
|
|
31
37
|
monacoInstance = monaco;
|
|
32
38
|
loader.config({ monaco });
|
|
@@ -2,6 +2,7 @@ import { render, screen } from '@testing-library/react';
|
|
|
2
2
|
import userEvent from '@testing-library/user-event';
|
|
3
3
|
import '@testing-library/jest-dom';
|
|
4
4
|
import DeepThinking from './DeepThinking';
|
|
5
|
+
import { expectBoldMarkdownText } from '../test-utils/markdownTestUtils';
|
|
5
6
|
|
|
6
7
|
describe('DeepThinking', () => {
|
|
7
8
|
const defaultProps = {
|
|
@@ -120,11 +121,10 @@ describe('DeepThinking', () => {
|
|
|
120
121
|
expect(screen.getByText('Thinking content')).not.toBeVisible();
|
|
121
122
|
});
|
|
122
123
|
|
|
123
|
-
it('should render toggleContent as markdown when isToggleContentMarkdown is true', () => {
|
|
124
|
+
it('should render toggleContent as markdown when isToggleContentMarkdown is true', async () => {
|
|
124
125
|
const toggleContent = '**Bold thinking**';
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
expect(screen.getByText('Bold thinking')).toBeTruthy();
|
|
126
|
+
render(<DeepThinking toggleContent={toggleContent} isToggleContentMarkdown />);
|
|
127
|
+
await expectBoldMarkdownText('Bold thinking');
|
|
128
128
|
});
|
|
129
129
|
|
|
130
130
|
it('should not render toggleContent as markdown when isToggleContentMarkdown is false', () => {
|
|
@@ -134,11 +134,10 @@ describe('DeepThinking', () => {
|
|
|
134
134
|
expect(screen.getByText('**Bold thinking**')).toBeTruthy();
|
|
135
135
|
});
|
|
136
136
|
|
|
137
|
-
it('should render subheading as markdown when isSubheadingMarkdown is true', () => {
|
|
137
|
+
it('should render subheading as markdown when isSubheadingMarkdown is true', async () => {
|
|
138
138
|
const subheading = '**Bold subheading**';
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
expect(screen.getByText('Bold subheading')).toBeTruthy();
|
|
139
|
+
render(<DeepThinking {...defaultProps} subheading={subheading} isSubheadingMarkdown />);
|
|
140
|
+
await expectBoldMarkdownText('Bold subheading');
|
|
142
141
|
});
|
|
143
142
|
|
|
144
143
|
it('should not render subheading as markdown when isSubheadingMarkdown is false', () => {
|
|
@@ -147,11 +146,10 @@ describe('DeepThinking', () => {
|
|
|
147
146
|
expect(screen.getByText('**Bold subheading**')).toBeTruthy();
|
|
148
147
|
});
|
|
149
148
|
|
|
150
|
-
it('should render body as markdown when isBodyMarkdown is true', () => {
|
|
149
|
+
it('should render body as markdown when isBodyMarkdown is true', async () => {
|
|
151
150
|
const body = '**Bold body**';
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
expect(screen.getByText('Bold body')).toBeTruthy();
|
|
151
|
+
render(<DeepThinking {...defaultProps} body={body} isBodyMarkdown />);
|
|
152
|
+
await expectBoldMarkdownText('Bold body');
|
|
155
153
|
});
|
|
156
154
|
|
|
157
155
|
it('should not render body as markdown when isBodyMarkdown is false', () => {
|
|
@@ -1,7 +1,12 @@
|
|
|
1
1
|
import { render, screen } from '@testing-library/react';
|
|
2
2
|
import '@testing-library/jest-dom';
|
|
3
|
-
import MarkdownContent
|
|
3
|
+
import MarkdownContent, {
|
|
4
|
+
MarkdownRendererReadyContext,
|
|
5
|
+
preloadMarkdownRenderer,
|
|
6
|
+
whenMarkdownRendererReady
|
|
7
|
+
} from './MarkdownContent';
|
|
4
8
|
import rehypeExternalLinks from '../__mocks__/rehype-external-links';
|
|
9
|
+
import { expectBoldMarkdownText, warmupMarkdownRenderer } from '../test-utils/markdownTestUtils';
|
|
5
10
|
|
|
6
11
|
const BOLD_TEXT = '**Bold text**';
|
|
7
12
|
const ITALIC_TEXT = '*Italic text*';
|
|
@@ -33,14 +38,17 @@ const BLOCKQUOTE = '> This is a blockquote';
|
|
|
33
38
|
const IMAGE = '';
|
|
34
39
|
|
|
35
40
|
describe('MarkdownContent', () => {
|
|
41
|
+
beforeAll(async () => {
|
|
42
|
+
await warmupMarkdownRenderer();
|
|
43
|
+
});
|
|
44
|
+
|
|
36
45
|
beforeEach(() => {
|
|
37
46
|
jest.clearAllMocks();
|
|
38
47
|
});
|
|
39
48
|
|
|
40
|
-
it('should render bold text correctly', () => {
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
expect(screen.getByText('Bold text')).toBeTruthy();
|
|
49
|
+
it('should render bold text correctly', async () => {
|
|
50
|
+
render(<MarkdownContent content={BOLD_TEXT} />);
|
|
51
|
+
await expectBoldMarkdownText('Bold text');
|
|
44
52
|
});
|
|
45
53
|
|
|
46
54
|
it('should render italic text correctly', () => {
|
|
@@ -205,3 +213,42 @@ const x = 5;
|
|
|
205
213
|
expect(screen.getByRole('link', { name: /Link/i })).toBeTruthy();
|
|
206
214
|
});
|
|
207
215
|
});
|
|
216
|
+
|
|
217
|
+
describe('preloadMarkdownRenderer', () => {
|
|
218
|
+
it('starts loading the markdown renderer', async () => {
|
|
219
|
+
preloadMarkdownRenderer();
|
|
220
|
+
const module = await whenMarkdownRendererReady();
|
|
221
|
+
expect(module.default).toBeDefined();
|
|
222
|
+
});
|
|
223
|
+
});
|
|
224
|
+
|
|
225
|
+
describe('whenMarkdownRendererReady', () => {
|
|
226
|
+
it('should resolve to the MarkdownRenderer module', async () => {
|
|
227
|
+
const module = await whenMarkdownRendererReady();
|
|
228
|
+
expect(module.default).toBeDefined();
|
|
229
|
+
});
|
|
230
|
+
});
|
|
231
|
+
|
|
232
|
+
describe('MarkdownContent with MarkdownRendererReadyContext', () => {
|
|
233
|
+
it('renders nothing while markdown is not ready inside MessageBox', () => {
|
|
234
|
+
const { container } = render(
|
|
235
|
+
<MarkdownRendererReadyContext.Provider value={false}>
|
|
236
|
+
<MarkdownContent content={BOLD_TEXT} />
|
|
237
|
+
</MarkdownRendererReadyContext.Provider>
|
|
238
|
+
);
|
|
239
|
+
|
|
240
|
+
expect(container).toBeEmptyDOMElement();
|
|
241
|
+
});
|
|
242
|
+
});
|
|
243
|
+
|
|
244
|
+
describe('MarkdownContent lazy loading', () => {
|
|
245
|
+
it('renders nothing while markdown renderer is not ready', () => {
|
|
246
|
+
const { container } = render(
|
|
247
|
+
<MarkdownRendererReadyContext.Provider value={false}>
|
|
248
|
+
<MarkdownContent content={BOLD_TEXT} />
|
|
249
|
+
</MarkdownRendererReadyContext.Provider>
|
|
250
|
+
);
|
|
251
|
+
|
|
252
|
+
expect(container).toBeEmptyDOMElement();
|
|
253
|
+
});
|
|
254
|
+
});
|