@patternfly/chatbot 6.5.0-prerelease.3 → 6.5.0-prerelease.30
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/AttachMenu/AttachMenu.d.ts +8 -2
- package/dist/cjs/AttachMenu/AttachMenu.js +2 -2
- package/dist/cjs/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.d.ts +9 -1
- package/dist/cjs/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.js +9 -2
- package/dist/cjs/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.test.js +38 -0
- package/dist/cjs/ChatbotFooter/ChatbotFooter.d.ts +5 -2
- package/dist/cjs/ChatbotFooter/ChatbotFooter.js +2 -2
- package/dist/cjs/ChatbotFooter/ChatbotFooter.test.js +5 -1
- package/dist/cjs/ChatbotHeader/ChatbotHeaderMenu.js +29 -2
- package/dist/cjs/CodeModal/CodeModal.d.ts +2 -0
- package/dist/cjs/CodeModal/CodeModal.js +53 -8
- package/dist/cjs/DeepThinking/DeepThinking.d.ts +13 -0
- package/dist/cjs/DeepThinking/DeepThinking.js +31 -3
- package/dist/cjs/DeepThinking/DeepThinking.test.js +80 -0
- package/dist/cjs/FileDetailsLabel/FileDetailsLabel.d.ts +2 -1
- package/dist/cjs/MarkdownContent/MarkdownContent.d.ts +44 -0
- package/dist/cjs/MarkdownContent/MarkdownContent.js +181 -0
- package/dist/cjs/MarkdownContent/MarkdownContent.test.d.ts +1 -0
- package/dist/cjs/MarkdownContent/MarkdownContent.test.js +192 -0
- package/dist/cjs/MarkdownContent/index.d.ts +2 -0
- package/dist/cjs/MarkdownContent/index.js +23 -0
- package/dist/cjs/Message/CodeBlockMessage/CodeBlockMessage.d.ts +5 -1
- package/dist/cjs/Message/CodeBlockMessage/CodeBlockMessage.js +16 -5
- package/dist/cjs/Message/CodeBlockMessage/CodeBlockMessage.test.d.ts +1 -0
- package/dist/cjs/Message/CodeBlockMessage/CodeBlockMessage.test.js +131 -0
- package/dist/cjs/Message/ErrorMessage/ErrorMessage.d.ts +15 -1
- package/dist/cjs/Message/ErrorMessage/ErrorMessage.js +5 -3
- package/dist/cjs/Message/ErrorMessage/ErrorMessage.test.d.ts +1 -0
- package/dist/cjs/Message/ErrorMessage/ErrorMessage.test.js +30 -0
- package/dist/cjs/Message/LinkMessage/LinkMessage.d.ts +5 -1
- package/dist/cjs/Message/LinkMessage/LinkMessage.js +4 -3
- package/dist/cjs/Message/ListMessage/OrderedListMessage.d.ts +9 -1
- package/dist/cjs/Message/ListMessage/OrderedListMessage.js +2 -1
- package/dist/cjs/Message/ListMessage/UnorderedListMessage.d.ts +7 -1
- package/dist/cjs/Message/ListMessage/UnorderedListMessage.js +2 -1
- package/dist/cjs/Message/Message.d.ts +22 -3
- package/dist/cjs/Message/Message.js +8 -161
- package/dist/cjs/Message/Message.test.js +161 -2
- package/dist/cjs/Message/MessageAndActions/MessageAndActions.d.ts +14 -0
- package/dist/cjs/Message/MessageAndActions/MessageAndActions.js +22 -0
- package/dist/cjs/Message/MessageAndActions/MessageAndActions.test.d.ts +1 -0
- package/dist/cjs/Message/MessageAndActions/MessageAndActions.test.js +25 -0
- package/dist/cjs/Message/MessageAndActions/index.d.ts +1 -0
- package/dist/cjs/Message/MessageAndActions/index.js +17 -0
- package/dist/cjs/Message/MessageAttachments/MessageAttachmentItem.d.ts +13 -0
- package/dist/cjs/Message/MessageAttachments/MessageAttachmentItem.js +22 -0
- package/dist/cjs/Message/MessageAttachments/MessageAttachmentItem.test.d.ts +1 -0
- package/dist/cjs/Message/MessageAttachments/MessageAttachmentItem.test.js +25 -0
- package/dist/cjs/Message/MessageAttachments/MessageAttachmentsContainer.d.ts +13 -0
- package/dist/cjs/Message/MessageAttachments/MessageAttachmentsContainer.js +22 -0
- package/dist/cjs/Message/MessageAttachments/MessageAttachmentsContainer.test.d.ts +1 -0
- package/dist/cjs/Message/MessageAttachments/MessageAttachmentsContainer.test.js +25 -0
- package/dist/cjs/Message/MessageAttachments/index.d.ts +2 -0
- package/dist/cjs/Message/MessageAttachments/index.js +18 -0
- package/dist/cjs/Message/MessageInput.d.ts +1 -1
- package/dist/cjs/Message/MessageInput.js +3 -1
- package/dist/cjs/Message/MessageLoading.d.ts +13 -3
- package/dist/cjs/Message/MessageLoading.js +19 -5
- package/dist/cjs/Message/MessageLoading.test.d.ts +1 -0
- package/dist/cjs/Message/MessageLoading.test.js +25 -0
- package/dist/cjs/Message/QuickResponse/QuickResponse.js +3 -2
- package/dist/cjs/Message/QuickResponse/QuickResponse.test.d.ts +1 -0
- package/dist/cjs/Message/QuickResponse/QuickResponse.test.js +109 -0
- package/dist/cjs/Message/QuickResponse/index.d.ts +1 -0
- package/dist/cjs/Message/QuickResponse/index.js +17 -0
- package/dist/cjs/Message/QuickStarts/QuickStartTile.d.ts +1 -1
- package/dist/cjs/Message/QuickStarts/QuickStartTile.js +3 -2
- package/dist/cjs/Message/QuickStarts/index.d.ts +2 -0
- package/dist/cjs/Message/QuickStarts/index.js +18 -0
- package/dist/cjs/Message/TableMessage/TableMessage.d.ts +9 -1
- package/dist/cjs/Message/TableMessage/TableMessage.js +3 -2
- package/dist/cjs/Message/TextMessage/TextMessage.d.ts +11 -1
- package/dist/cjs/Message/TextMessage/TextMessage.js +3 -2
- package/dist/cjs/Message/UserFeedback/UserFeedback.d.ts +3 -1
- package/dist/cjs/Message/UserFeedback/UserFeedback.js +8 -6
- package/dist/cjs/Message/UserFeedback/UserFeedbackComplete.d.ts +1 -1
- package/dist/cjs/Message/UserFeedback/UserFeedbackComplete.js +3 -2
- package/dist/cjs/Message/UserFeedback/index.d.ts +2 -0
- package/dist/cjs/Message/UserFeedback/index.js +18 -0
- package/dist/cjs/Message/index.d.ts +8 -0
- package/dist/cjs/Message/index.js +8 -0
- package/dist/cjs/MessageBar/AttachButton.d.ts +2 -0
- package/dist/cjs/MessageBar/AttachButton.js +2 -2
- package/dist/cjs/MessageBar/AttachButton.test.js +4 -0
- package/dist/cjs/MessageBar/MessageBar.d.ts +22 -6
- package/dist/cjs/MessageBar/MessageBar.js +43 -11
- package/dist/cjs/MessageBar/MessageBar.test.js +74 -0
- package/dist/cjs/Onboarding/Onboarding.d.ts +36 -0
- package/dist/cjs/Onboarding/Onboarding.js +37 -0
- package/dist/cjs/Onboarding/Onboarding.test.d.ts +1 -0
- package/dist/cjs/Onboarding/Onboarding.test.js +80 -0
- package/dist/cjs/Onboarding/index.d.ts +2 -0
- package/dist/cjs/Onboarding/index.js +23 -0
- package/dist/cjs/ResponseActions/ResponseActions.d.ts +7 -0
- package/dist/cjs/ResponseActions/ResponseActions.js +28 -7
- package/dist/cjs/ResponseActions/ResponseActions.test.js +67 -12
- package/dist/cjs/ResponseActions/ResponseActionsGroups.d.ts +13 -0
- package/dist/cjs/ResponseActions/ResponseActionsGroups.js +22 -0
- package/dist/cjs/ResponseActions/ResponseActionsGroups.test.d.ts +1 -0
- package/dist/cjs/ResponseActions/ResponseActionsGroups.test.js +25 -0
- package/dist/cjs/ResponseActions/index.d.ts +1 -0
- package/dist/cjs/ResponseActions/index.js +1 -0
- package/dist/cjs/ToolCall/ToolCall.d.ts +11 -0
- package/dist/cjs/ToolCall/ToolCall.js +24 -3
- package/dist/cjs/ToolCall/ToolCall.test.js +57 -0
- package/dist/cjs/ToolResponse/ToolResponse.d.ts +17 -0
- package/dist/cjs/ToolResponse/ToolResponse.js +49 -3
- package/dist/cjs/ToolResponse/ToolResponse.test.js +100 -0
- package/dist/cjs/__mocks__/monaco-editor.d.ts +11 -0
- package/dist/cjs/__mocks__/monaco-editor.js +18 -0
- package/dist/cjs/index.d.ts +4 -0
- package/dist/cjs/index.js +7 -1
- package/dist/css/main.css +336 -30
- package/dist/css/main.css.map +1 -1
- package/dist/dynamic/MarkdownContent/package.json +1 -0
- package/dist/dynamic/Onboarding/package.json +1 -0
- package/dist/esm/AttachMenu/AttachMenu.d.ts +8 -2
- package/dist/esm/AttachMenu/AttachMenu.js +2 -2
- package/dist/esm/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.d.ts +9 -1
- package/dist/esm/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.js +10 -3
- package/dist/esm/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.test.js +38 -0
- package/dist/esm/ChatbotFooter/ChatbotFooter.d.ts +5 -2
- package/dist/esm/ChatbotFooter/ChatbotFooter.js +2 -2
- package/dist/esm/ChatbotFooter/ChatbotFooter.test.js +5 -1
- package/dist/esm/ChatbotHeader/ChatbotHeaderMenu.js +30 -3
- package/dist/esm/CodeModal/CodeModal.d.ts +2 -0
- package/dist/esm/CodeModal/CodeModal.js +54 -9
- package/dist/esm/DeepThinking/DeepThinking.d.ts +13 -0
- package/dist/esm/DeepThinking/DeepThinking.js +28 -3
- package/dist/esm/DeepThinking/DeepThinking.test.js +80 -0
- package/dist/esm/FileDetailsLabel/FileDetailsLabel.d.ts +2 -1
- package/dist/esm/MarkdownContent/MarkdownContent.d.ts +44 -0
- package/dist/esm/MarkdownContent/MarkdownContent.js +174 -0
- package/dist/esm/MarkdownContent/MarkdownContent.test.d.ts +1 -0
- package/dist/esm/MarkdownContent/MarkdownContent.test.js +187 -0
- package/dist/esm/MarkdownContent/index.d.ts +2 -0
- package/dist/esm/MarkdownContent/index.js +2 -0
- package/dist/esm/Message/CodeBlockMessage/CodeBlockMessage.d.ts +5 -1
- package/dist/esm/Message/CodeBlockMessage/CodeBlockMessage.js +16 -5
- package/dist/esm/Message/CodeBlockMessage/CodeBlockMessage.test.d.ts +1 -0
- package/dist/esm/Message/CodeBlockMessage/CodeBlockMessage.test.js +126 -0
- package/dist/esm/Message/ErrorMessage/ErrorMessage.d.ts +15 -1
- package/dist/esm/Message/ErrorMessage/ErrorMessage.js +3 -3
- package/dist/esm/Message/ErrorMessage/ErrorMessage.test.d.ts +1 -0
- package/dist/esm/Message/ErrorMessage/ErrorMessage.test.js +25 -0
- package/dist/esm/Message/LinkMessage/LinkMessage.d.ts +5 -1
- package/dist/esm/Message/LinkMessage/LinkMessage.js +4 -3
- package/dist/esm/Message/ListMessage/OrderedListMessage.d.ts +9 -1
- package/dist/esm/Message/ListMessage/OrderedListMessage.js +2 -1
- package/dist/esm/Message/ListMessage/UnorderedListMessage.d.ts +7 -1
- package/dist/esm/Message/ListMessage/UnorderedListMessage.js +2 -1
- package/dist/esm/Message/Message.d.ts +22 -3
- package/dist/esm/Message/Message.js +9 -162
- package/dist/esm/Message/Message.test.js +161 -2
- package/dist/esm/Message/MessageAndActions/MessageAndActions.d.ts +14 -0
- package/dist/esm/Message/MessageAndActions/MessageAndActions.js +18 -0
- package/dist/esm/Message/MessageAndActions/MessageAndActions.test.d.ts +1 -0
- package/dist/esm/Message/MessageAndActions/MessageAndActions.test.js +20 -0
- package/dist/esm/Message/MessageAndActions/index.d.ts +1 -0
- package/dist/esm/Message/MessageAndActions/index.js +1 -0
- package/dist/esm/Message/MessageAttachments/MessageAttachmentItem.d.ts +13 -0
- package/dist/esm/Message/MessageAttachments/MessageAttachmentItem.js +18 -0
- package/dist/esm/Message/MessageAttachments/MessageAttachmentItem.test.d.ts +1 -0
- package/dist/esm/Message/MessageAttachments/MessageAttachmentItem.test.js +20 -0
- package/dist/esm/Message/MessageAttachments/MessageAttachmentsContainer.d.ts +13 -0
- package/dist/esm/Message/MessageAttachments/MessageAttachmentsContainer.js +18 -0
- package/dist/esm/Message/MessageAttachments/MessageAttachmentsContainer.test.d.ts +1 -0
- package/dist/esm/Message/MessageAttachments/MessageAttachmentsContainer.test.js +20 -0
- package/dist/esm/Message/MessageAttachments/index.d.ts +2 -0
- package/dist/esm/Message/MessageAttachments/index.js +2 -0
- package/dist/esm/Message/MessageInput.d.ts +1 -1
- package/dist/esm/Message/MessageInput.js +1 -1
- package/dist/esm/Message/MessageLoading.d.ts +13 -3
- package/dist/esm/Message/MessageLoading.js +16 -4
- package/dist/esm/Message/MessageLoading.test.d.ts +1 -0
- package/dist/esm/Message/MessageLoading.test.js +20 -0
- package/dist/esm/Message/QuickResponse/QuickResponse.js +3 -2
- package/dist/esm/Message/QuickResponse/QuickResponse.test.d.ts +1 -0
- package/dist/esm/Message/QuickResponse/QuickResponse.test.js +104 -0
- package/dist/esm/Message/QuickResponse/index.d.ts +1 -0
- package/dist/esm/Message/QuickResponse/index.js +1 -0
- package/dist/esm/Message/QuickStarts/QuickStartTile.d.ts +1 -1
- package/dist/esm/Message/QuickStarts/QuickStartTile.js +1 -1
- package/dist/esm/Message/QuickStarts/index.d.ts +2 -0
- package/dist/esm/Message/QuickStarts/index.js +2 -0
- package/dist/esm/Message/TableMessage/TableMessage.d.ts +9 -1
- package/dist/esm/Message/TableMessage/TableMessage.js +3 -2
- package/dist/esm/Message/TextMessage/TextMessage.d.ts +11 -1
- package/dist/esm/Message/TextMessage/TextMessage.js +3 -2
- package/dist/esm/Message/UserFeedback/UserFeedback.d.ts +3 -1
- package/dist/esm/Message/UserFeedback/UserFeedback.js +7 -7
- package/dist/esm/Message/UserFeedback/UserFeedbackComplete.d.ts +1 -1
- package/dist/esm/Message/UserFeedback/UserFeedbackComplete.js +1 -2
- package/dist/esm/Message/UserFeedback/index.d.ts +2 -0
- package/dist/esm/Message/UserFeedback/index.js +2 -0
- package/dist/esm/Message/index.d.ts +8 -0
- package/dist/esm/Message/index.js +8 -0
- package/dist/esm/MessageBar/AttachButton.d.ts +2 -0
- package/dist/esm/MessageBar/AttachButton.js +2 -2
- package/dist/esm/MessageBar/AttachButton.test.js +4 -0
- package/dist/esm/MessageBar/MessageBar.d.ts +22 -6
- package/dist/esm/MessageBar/MessageBar.js +43 -11
- package/dist/esm/MessageBar/MessageBar.test.js +74 -0
- package/dist/esm/Onboarding/Onboarding.d.ts +36 -0
- package/dist/esm/Onboarding/Onboarding.js +30 -0
- package/dist/esm/Onboarding/Onboarding.test.d.ts +1 -0
- package/dist/esm/Onboarding/Onboarding.test.js +75 -0
- package/dist/esm/Onboarding/index.d.ts +2 -0
- package/dist/esm/Onboarding/index.js +2 -0
- package/dist/esm/ResponseActions/ResponseActions.d.ts +7 -0
- package/dist/esm/ResponseActions/ResponseActions.js +28 -7
- package/dist/esm/ResponseActions/ResponseActions.test.js +67 -12
- package/dist/esm/ResponseActions/ResponseActionsGroups.d.ts +13 -0
- package/dist/esm/ResponseActions/ResponseActionsGroups.js +18 -0
- package/dist/esm/ResponseActions/ResponseActionsGroups.test.d.ts +1 -0
- package/dist/esm/ResponseActions/ResponseActionsGroups.test.js +20 -0
- package/dist/esm/ResponseActions/index.d.ts +1 -0
- package/dist/esm/ResponseActions/index.js +1 -0
- package/dist/esm/ToolCall/ToolCall.d.ts +11 -0
- package/dist/esm/ToolCall/ToolCall.js +21 -3
- package/dist/esm/ToolCall/ToolCall.test.js +57 -0
- package/dist/esm/ToolResponse/ToolResponse.d.ts +17 -0
- package/dist/esm/ToolResponse/ToolResponse.js +46 -3
- package/dist/esm/ToolResponse/ToolResponse.test.js +100 -0
- package/dist/esm/__mocks__/monaco-editor.d.ts +11 -0
- package/dist/esm/__mocks__/monaco-editor.js +18 -0
- package/dist/esm/index.d.ts +4 -0
- package/dist/esm/index.js +4 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +13 -2
- package/patternfly-docs/content/extensions/chatbot/chatbot.md +57 -0
- package/patternfly-docs/content/extensions/chatbot/design-guidelines.md +12 -12
- package/patternfly-docs/content/extensions/chatbot/examples/Analytics/Analytics.md +1 -1
- package/patternfly-docs/content/extensions/chatbot/examples/Customizing Messages/Customizing Messages.md +1 -1
- package/patternfly-docs/content/extensions/chatbot/examples/Messages/BotMessage.tsx +1 -0
- package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithCustomStructure.tsx +102 -0
- package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithDeepThinking.tsx +25 -11
- package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithFeedback.tsx +14 -1
- package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithMarkdownDeepThinking.tsx +26 -0
- package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithMarkdownToolCall.tsx +29 -0
- package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithMarkdownToolResponse.tsx +200 -0
- package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithMultipleActionGroups.tsx +61 -0
- package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithPersistedActions.tsx +22 -0
- package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithQuickResponses.tsx +11 -0
- package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithToolCall.tsx +14 -1
- package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithToolResponse.tsx +222 -105
- package/patternfly-docs/content/extensions/chatbot/examples/Messages/Messages.md +123 -14
- package/patternfly-docs/content/extensions/chatbot/examples/Messages/UserMessage.tsx +1 -0
- package/patternfly-docs/content/extensions/chatbot/examples/Messages/UserMessageWithExtraContent.tsx +3 -1
- package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotHeaderDrawerWithSearchActions.tsx +198 -0
- package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotMessageBarCustomActions.tsx +190 -0
- package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotMessageBarIndicatorThinking.tsx +15 -0
- package/patternfly-docs/content/extensions/chatbot/examples/UI/CompactOnboarding.tsx +141 -0
- package/patternfly-docs/content/extensions/chatbot/examples/UI/Onboarding.tsx +151 -0
- package/patternfly-docs/content/extensions/chatbot/examples/UI/RH-Hat-Image.svg +9 -0
- package/patternfly-docs/content/extensions/chatbot/examples/UI/Settings.tsx +1 -1
- package/patternfly-docs/content/extensions/chatbot/examples/UI/UI.md +81 -30
- package/patternfly-docs/content/extensions/chatbot/examples/demos/AttachmentDemos.md +18 -18
- package/patternfly-docs/content/extensions/chatbot/examples/demos/Chatbot.md +44 -22
- package/patternfly-docs/content/extensions/chatbot/examples/demos/WhiteEmbeddedChatbot.tsx +451 -0
- package/patternfly-docs/patternfly-docs.config.js +1 -1
- package/patternfly-docs/patternfly-docs.source.js +1 -1
- package/src/AttachMenu/AttachMenu.tsx +26 -11
- package/src/Chatbot/Chatbot.scss +23 -1
- package/src/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.scss +43 -0
- package/src/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.test.tsx +95 -0
- package/src/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.tsx +51 -15
- package/src/ChatbotFooter/ChatbotFooter.scss +21 -0
- package/src/ChatbotFooter/ChatbotFooter.test.tsx +10 -1
- package/src/ChatbotFooter/ChatbotFooter.tsx +10 -3
- package/src/ChatbotHeader/ChatbotHeader.scss +19 -0
- package/src/ChatbotHeader/ChatbotHeaderMenu.tsx +56 -14
- package/src/ChatbotModal/ChatbotModal.scss +3 -0
- package/src/CodeModal/CodeModal.tsx +72 -23
- package/src/DeepThinking/DeepThinking.scss +1 -1
- package/src/DeepThinking/DeepThinking.test.tsx +109 -0
- package/src/DeepThinking/DeepThinking.tsx +54 -5
- package/src/FileDetailsLabel/FileDetailsLabel.tsx +2 -2
- package/src/MarkdownContent/MarkdownContent.test.tsx +207 -0
- package/src/MarkdownContent/MarkdownContent.tsx +269 -0
- package/src/MarkdownContent/index.ts +2 -0
- package/src/Message/CodeBlockMessage/CodeBlockMessage.scss +17 -0
- package/src/Message/CodeBlockMessage/CodeBlockMessage.test.tsx +171 -0
- package/src/Message/CodeBlockMessage/CodeBlockMessage.tsx +21 -5
- package/src/Message/ErrorMessage/ErrorMessage.test.tsx +38 -0
- package/src/Message/ErrorMessage/ErrorMessage.tsx +17 -2
- package/src/Message/LinkMessage/LinkMessage.scss +5 -0
- package/src/Message/LinkMessage/LinkMessage.tsx +24 -2
- package/src/Message/ListMessage/ListMessage.scss +8 -0
- package/src/Message/ListMessage/OrderedListMessage.tsx +16 -2
- package/src/Message/ListMessage/UnorderedListMessage.tsx +12 -2
- package/src/Message/Message.scss +11 -7
- package/src/Message/Message.test.tsx +239 -2
- package/src/Message/Message.tsx +133 -241
- package/src/Message/MessageAndActions/MessageAndActions.test.tsx +23 -0
- package/src/Message/MessageAndActions/MessageAndActions.tsx +22 -0
- package/src/Message/MessageAndActions/index.ts +1 -0
- package/src/Message/MessageAttachments/MessageAttachmentItem.test.tsx +23 -0
- package/src/Message/MessageAttachments/MessageAttachmentItem.tsx +25 -0
- package/src/Message/MessageAttachments/MessageAttachmentsContainer.test.tsx +23 -0
- package/src/Message/MessageAttachments/MessageAttachmentsContainer.tsx +25 -0
- package/src/Message/MessageAttachments/index.ts +2 -0
- package/src/Message/MessageInput.tsx +1 -1
- package/src/Message/MessageLoading.scss +7 -0
- package/src/Message/MessageLoading.test.tsx +23 -0
- package/src/Message/MessageLoading.tsx +17 -2
- package/src/Message/QuickResponse/QuickResponse.scss +3 -1
- package/src/Message/QuickResponse/QuickResponse.test.tsx +131 -0
- package/src/Message/QuickResponse/QuickResponse.tsx +3 -2
- package/src/Message/QuickResponse/index.ts +1 -0
- package/src/Message/QuickStarts/QuickStartTile.tsx +1 -1
- package/src/Message/QuickStarts/index.ts +2 -0
- package/src/Message/TableMessage/TableMessage.scss +17 -1
- package/src/Message/TableMessage/TableMessage.tsx +22 -2
- package/src/Message/TextMessage/TextMessage.scss +18 -0
- package/src/Message/TextMessage/TextMessage.tsx +39 -3
- package/src/Message/UserFeedback/UserFeedback.scss +30 -2
- package/src/Message/UserFeedback/UserFeedback.tsx +23 -13
- package/src/Message/UserFeedback/UserFeedbackComplete.tsx +1 -4
- package/src/Message/UserFeedback/index.ts +2 -0
- package/src/Message/index.ts +8 -0
- package/src/MessageBar/AttachButton.scss +0 -1
- package/src/MessageBar/AttachButton.test.tsx +4 -0
- package/src/MessageBar/AttachButton.tsx +4 -1
- package/src/MessageBar/MessageBar.scss +66 -6
- package/src/MessageBar/MessageBar.test.tsx +129 -1
- package/src/MessageBar/MessageBar.tsx +150 -56
- package/src/MessageBar/MicrophoneButton.scss +0 -1
- package/src/MessageBar/SendButton.scss +0 -1
- package/src/MessageBar/StopButton.scss +0 -1
- package/src/Onboarding/Onboarding.scss +101 -0
- package/src/Onboarding/Onboarding.test.tsx +148 -0
- package/src/Onboarding/Onboarding.tsx +126 -0
- package/src/Onboarding/index.ts +3 -0
- package/src/ResponseActions/ResponseActions.scss +12 -1
- package/src/ResponseActions/ResponseActions.test.tsx +111 -12
- package/src/ResponseActions/ResponseActions.tsx +44 -10
- package/src/ResponseActions/ResponseActionsGroups.test.tsx +23 -0
- package/src/ResponseActions/ResponseActionsGroups.tsx +28 -0
- package/src/ResponseActions/index.ts +1 -0
- package/src/ToolCall/ToolCall.scss +1 -1
- package/src/ToolCall/ToolCall.test.tsx +91 -0
- package/src/ToolCall/ToolCall.tsx +49 -4
- package/src/ToolResponse/ToolResponse.scss +13 -3
- package/src/ToolResponse/ToolResponse.test.tsx +119 -0
- package/src/ToolResponse/ToolResponse.tsx +82 -7
- package/src/__mocks__/monaco-editor.ts +19 -0
- package/src/index.ts +6 -0
- package/src/main.scss +2 -0
- package/tsconfig.json +1 -1
- package/patternfly-docs/content/extensions/chatbot/about-chatbot.md +0 -44
package/src/Message/Message.tsx
CHANGED
|
@@ -3,14 +3,12 @@
|
|
|
3
3
|
// ============================================================================
|
|
4
4
|
import { forwardRef, ReactNode, useEffect, useState } from 'react';
|
|
5
5
|
import type { FunctionComponent, HTMLProps, MouseEvent as ReactMouseEvent, Ref } from 'react';
|
|
6
|
-
import
|
|
7
|
-
import remarkGfm from 'remark-gfm';
|
|
6
|
+
import { Options } from 'react-markdown';
|
|
8
7
|
import {
|
|
9
8
|
AlertProps,
|
|
10
9
|
Avatar,
|
|
11
10
|
AvatarProps,
|
|
12
11
|
ButtonProps,
|
|
13
|
-
ContentVariants,
|
|
14
12
|
FormProps,
|
|
15
13
|
Label,
|
|
16
14
|
LabelGroupProps,
|
|
@@ -18,42 +16,25 @@ import {
|
|
|
18
16
|
Truncate
|
|
19
17
|
} from '@patternfly/react-core';
|
|
20
18
|
import MessageLoading from './MessageLoading';
|
|
21
|
-
import
|
|
22
|
-
import TextMessage from './TextMessage/TextMessage';
|
|
19
|
+
import { CodeBlockMessageProps } from './CodeBlockMessage/CodeBlockMessage';
|
|
23
20
|
import FileDetailsLabel from '../FileDetailsLabel/FileDetailsLabel';
|
|
24
21
|
import ResponseActions, { ActionProps } from '../ResponseActions/ResponseActions';
|
|
25
22
|
import SourcesCard, { SourcesCardProps } from '../SourcesCard';
|
|
26
|
-
import ListItemMessage from './ListMessage/ListItemMessage';
|
|
27
|
-
import UnorderedListMessage from './ListMessage/UnorderedListMessage';
|
|
28
|
-
import OrderedListMessage from './ListMessage/OrderedListMessage';
|
|
29
23
|
import QuickStartTile from './QuickStarts/QuickStartTile';
|
|
30
24
|
import { QuickStart, QuickstartAction } from './QuickStarts/types';
|
|
31
25
|
import QuickResponse from './QuickResponse/QuickResponse';
|
|
32
26
|
import UserFeedback, { UserFeedbackProps } from './UserFeedback/UserFeedback';
|
|
33
27
|
import UserFeedbackComplete, { UserFeedbackCompleteProps } from './UserFeedback/UserFeedbackComplete';
|
|
34
|
-
import TableMessage from './TableMessage/TableMessage';
|
|
35
|
-
import TrMessage from './TableMessage/TrMessage';
|
|
36
|
-
import TdMessage from './TableMessage/TdMessage';
|
|
37
|
-
import TbodyMessage from './TableMessage/TbodyMessage';
|
|
38
|
-
import TheadMessage from './TableMessage/TheadMessage';
|
|
39
|
-
import ThMessage from './TableMessage/ThMessage';
|
|
40
28
|
import { TableProps } from '@patternfly/react-table';
|
|
41
|
-
import ImageMessage from './ImageMessage/ImageMessage';
|
|
42
|
-
import rehypeUnwrapImages from 'rehype-unwrap-images';
|
|
43
|
-
import rehypeExternalLinks from 'rehype-external-links';
|
|
44
|
-
import rehypeSanitize from 'rehype-sanitize';
|
|
45
|
-
import rehypeHighlight from 'rehype-highlight';
|
|
46
29
|
// see the full list of styles here: https://highlightjs.org/examples
|
|
47
30
|
import 'highlight.js/styles/vs2015.css';
|
|
48
31
|
import { PluggableList } from 'unified';
|
|
49
|
-
import LinkMessage from './LinkMessage/LinkMessage';
|
|
50
32
|
import ErrorMessage from './ErrorMessage/ErrorMessage';
|
|
51
33
|
import MessageInput from './MessageInput';
|
|
52
|
-
import { rehypeMoveImagesOutOfParagraphs } from './Plugins/rehypeMoveImagesOutOfParagraphs';
|
|
53
34
|
import ToolResponse, { ToolResponseProps } from '../ToolResponse';
|
|
54
35
|
import DeepThinking, { DeepThinkingProps } from '../DeepThinking';
|
|
55
|
-
import SuperscriptMessage from './SuperscriptMessage/SuperscriptMessage';
|
|
56
36
|
import ToolCall, { ToolCallProps } from '../ToolCall';
|
|
37
|
+
import MarkdownContent from '../MarkdownContent';
|
|
57
38
|
|
|
58
39
|
export interface MessageAttachment {
|
|
59
40
|
/** Name of file attached to the message */
|
|
@@ -86,6 +67,8 @@ export interface MessageExtraContent {
|
|
|
86
67
|
}
|
|
87
68
|
|
|
88
69
|
export interface MessageProps extends Omit<HTMLProps<HTMLDivElement>, 'role'> {
|
|
70
|
+
/** Children to render instead of the default message structure, allowing more fine-tuned message control. When provided, this will override the default rendering of content, toolResponse, deepThinking, toolCall, sources, quickStarts, actions, etc. */
|
|
71
|
+
children?: ReactNode;
|
|
89
72
|
/** Unique id for message */
|
|
90
73
|
id?: string;
|
|
91
74
|
/** Role of the user sending the message */
|
|
@@ -97,17 +80,35 @@ export interface MessageProps extends Omit<HTMLProps<HTMLDivElement>, 'role'> {
|
|
|
97
80
|
/** Name of the user */
|
|
98
81
|
name?: string;
|
|
99
82
|
/** Avatar src for the user */
|
|
100
|
-
avatar
|
|
83
|
+
avatar?: string;
|
|
101
84
|
/** Timestamp for the message */
|
|
102
85
|
timestamp?: string;
|
|
103
86
|
/** Set this to true if message is being loaded */
|
|
104
87
|
isLoading?: boolean;
|
|
105
88
|
/** Array of attachments attached to a message */
|
|
106
89
|
attachments?: MessageAttachment[];
|
|
107
|
-
/** Props for message actions, such as feedback (positive or negative), copy button, edit message, share, and listen
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
90
|
+
/** Props for message actions, such as feedback (positive or negative), copy button, edit message, share, and listen.
|
|
91
|
+
* Can be a single actions object or an array of action group objects. When passing an array, you can pass an object of actions or
|
|
92
|
+
* an object that contains an actions property for finer control of selection persistence.
|
|
93
|
+
*/
|
|
94
|
+
actions?:
|
|
95
|
+
| {
|
|
96
|
+
[key: string]: ActionProps;
|
|
97
|
+
}
|
|
98
|
+
| {
|
|
99
|
+
[key: string]: ActionProps;
|
|
100
|
+
}[]
|
|
101
|
+
| {
|
|
102
|
+
actions: {
|
|
103
|
+
[key: string]: ActionProps;
|
|
104
|
+
};
|
|
105
|
+
persistActionSelection?: boolean;
|
|
106
|
+
}[];
|
|
107
|
+
/** When true, the selected action will persist even when clicking outside the component.
|
|
108
|
+
* When false (default), clicking outside or clicking another action will deselect the current selection.
|
|
109
|
+
* For finer control of multiple action groups, use persistActionSelection on each group.
|
|
110
|
+
*/
|
|
111
|
+
persistActionSelection?: boolean;
|
|
111
112
|
/** Sources for message */
|
|
112
113
|
sources?: SourcesCardProps;
|
|
113
114
|
/** Label for the English word "AI," used to tag messages with role "bot" */
|
|
@@ -189,9 +190,12 @@ export interface MessageProps extends Omit<HTMLProps<HTMLDivElement>, 'role'> {
|
|
|
189
190
|
toolCall?: ToolCallProps;
|
|
190
191
|
/** Whether user messages default to stripping out images in markdown */
|
|
191
192
|
hasNoImagesInUserMessages?: boolean;
|
|
193
|
+
/** Sets background colors to be appropriate on primary chatbot background */
|
|
194
|
+
isPrimary?: boolean;
|
|
192
195
|
}
|
|
193
196
|
|
|
194
197
|
export const MessageBase: FunctionComponent<MessageProps> = ({
|
|
198
|
+
children,
|
|
195
199
|
role,
|
|
196
200
|
content,
|
|
197
201
|
extraContent,
|
|
@@ -200,6 +204,7 @@ export const MessageBase: FunctionComponent<MessageProps> = ({
|
|
|
200
204
|
timestamp,
|
|
201
205
|
isLoading,
|
|
202
206
|
actions,
|
|
207
|
+
persistActionSelection,
|
|
203
208
|
sources,
|
|
204
209
|
botWord = 'AI',
|
|
205
210
|
loadingWord = 'Loading message',
|
|
@@ -236,6 +241,7 @@ export const MessageBase: FunctionComponent<MessageProps> = ({
|
|
|
236
241
|
remarkGfmProps,
|
|
237
242
|
toolCall,
|
|
238
243
|
hasNoImagesInUserMessages = true,
|
|
244
|
+
isPrimary,
|
|
239
245
|
...props
|
|
240
246
|
}: MessageProps) => {
|
|
241
247
|
const [messageText, setMessageText] = useState(content);
|
|
@@ -245,14 +251,8 @@ export const MessageBase: FunctionComponent<MessageProps> = ({
|
|
|
245
251
|
}, [content]);
|
|
246
252
|
|
|
247
253
|
const { beforeMainContent, afterMainContent, endContent } = extraContent || {};
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
rehypePlugins = rehypePlugins.concat([[rehypeExternalLinks, { target: '_blank' }, rehypeSanitize]]);
|
|
251
|
-
}
|
|
252
|
-
if (additionalRehypePlugins) {
|
|
253
|
-
rehypePlugins.push(...additionalRehypePlugins);
|
|
254
|
-
}
|
|
255
|
-
let avatarClassName;
|
|
254
|
+
|
|
255
|
+
let avatarClassName: string | undefined;
|
|
256
256
|
if (avatarProps && 'className' in avatarProps) {
|
|
257
257
|
const { className, ...rest } = avatarProps;
|
|
258
258
|
avatarClassName = className;
|
|
@@ -262,161 +262,26 @@ export const MessageBase: FunctionComponent<MessageProps> = ({
|
|
|
262
262
|
const date = new Date();
|
|
263
263
|
const dateString = timestamp ?? `${date.toLocaleDateString()} ${date.toLocaleTimeString()}`;
|
|
264
264
|
|
|
265
|
-
const
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
section: (props) => {
|
|
282
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
283
|
-
const { node, ...rest } = props;
|
|
284
|
-
return <section {...rest} className={`pf-chatbot__message-text ${rest?.className}`} />;
|
|
285
|
-
},
|
|
286
|
-
p: (props) => {
|
|
287
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
288
|
-
const { node, ...rest } = props;
|
|
289
|
-
return <TextMessage component={ContentVariants.p} {...rest} />;
|
|
290
|
-
},
|
|
291
|
-
code: ({ children, ...props }) => {
|
|
292
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
293
|
-
const { node, ...codeProps } = props;
|
|
294
|
-
return (
|
|
295
|
-
<CodeBlockMessage {...codeProps} {...codeBlockProps}>
|
|
296
|
-
{children}
|
|
297
|
-
</CodeBlockMessage>
|
|
298
|
-
);
|
|
299
|
-
},
|
|
300
|
-
h1: (props) => {
|
|
301
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
302
|
-
const { node, ...rest } = props;
|
|
303
|
-
return <TextMessage component={ContentVariants.h1} {...rest} />;
|
|
304
|
-
},
|
|
305
|
-
h2: (props) => {
|
|
306
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
307
|
-
const { node, ...rest } = props;
|
|
308
|
-
return <TextMessage component={ContentVariants.h2} {...rest} />;
|
|
309
|
-
},
|
|
310
|
-
h3: (props) => {
|
|
311
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
312
|
-
const { node, ...rest } = props;
|
|
313
|
-
return <TextMessage component={ContentVariants.h3} {...rest} />;
|
|
314
|
-
},
|
|
315
|
-
h4: (props) => {
|
|
316
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
317
|
-
const { node, ...rest } = props;
|
|
318
|
-
return <TextMessage component={ContentVariants.h4} {...rest} />;
|
|
319
|
-
},
|
|
320
|
-
h5: (props) => {
|
|
321
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
322
|
-
const { node, ...rest } = props;
|
|
323
|
-
return <TextMessage component={ContentVariants.h5} {...rest} />;
|
|
324
|
-
},
|
|
325
|
-
h6: (props) => {
|
|
326
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
327
|
-
const { node, ...rest } = props;
|
|
328
|
-
return <TextMessage component={ContentVariants.h6} {...rest} />;
|
|
329
|
-
},
|
|
330
|
-
blockquote: (props) => {
|
|
331
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
332
|
-
const { node, ...rest } = props;
|
|
333
|
-
return <TextMessage component={ContentVariants.blockquote} {...rest} />;
|
|
334
|
-
},
|
|
335
|
-
ul: (props) => {
|
|
336
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
337
|
-
const { node, ...rest } = props;
|
|
338
|
-
return <UnorderedListMessage {...rest} />;
|
|
339
|
-
},
|
|
340
|
-
ol: (props) => {
|
|
341
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
342
|
-
const { node, ...rest } = props;
|
|
343
|
-
return <OrderedListMessage {...rest} />;
|
|
344
|
-
},
|
|
345
|
-
li: (props) => {
|
|
346
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
347
|
-
const { node, ...rest } = props;
|
|
348
|
-
return <ListItemMessage {...rest} />;
|
|
349
|
-
},
|
|
350
|
-
// table requires node attribute for calculating headers for mobile breakpoint
|
|
351
|
-
table: (props) => <TableMessage {...props} {...tableProps} />,
|
|
352
|
-
tbody: (props) => {
|
|
353
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
354
|
-
const { node, ...rest } = props;
|
|
355
|
-
return <TbodyMessage {...rest} />;
|
|
356
|
-
},
|
|
357
|
-
thead: (props) => {
|
|
358
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
359
|
-
const { node, ...rest } = props;
|
|
360
|
-
return <TheadMessage {...rest} />;
|
|
361
|
-
},
|
|
362
|
-
tr: (props) => {
|
|
363
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
364
|
-
const { node, ...rest } = props;
|
|
365
|
-
return <TrMessage {...rest} />;
|
|
366
|
-
},
|
|
367
|
-
td: (props) => {
|
|
368
|
-
// Conflicts with Td type
|
|
369
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
370
|
-
const { node, width, ...rest } = props;
|
|
371
|
-
return <TdMessage {...rest} />;
|
|
372
|
-
},
|
|
373
|
-
th: (props) => {
|
|
374
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
375
|
-
const { node, ...rest } = props;
|
|
376
|
-
return <ThMessage {...rest} />;
|
|
377
|
-
},
|
|
378
|
-
img: (props) => {
|
|
379
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
380
|
-
const { node, ...rest } = props;
|
|
381
|
-
return <ImageMessage {...rest} />;
|
|
382
|
-
},
|
|
383
|
-
a: (props) => {
|
|
384
|
-
// node is just the details of the document structure - not needed
|
|
385
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
386
|
-
const { node, ...rest } = props;
|
|
387
|
-
return (
|
|
388
|
-
// some a types conflict with ButtonProps, but it's ok because we are using an a tag
|
|
389
|
-
// there are too many to handle manually
|
|
390
|
-
<LinkMessage {...(rest as any)} {...linkProps}>
|
|
391
|
-
{props.children}
|
|
392
|
-
</LinkMessage>
|
|
393
|
-
);
|
|
394
|
-
},
|
|
395
|
-
// used for footnotes
|
|
396
|
-
sup: (props) => {
|
|
397
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
398
|
-
const { node, ...rest } = props;
|
|
399
|
-
return <SuperscriptMessage {...rest} />;
|
|
400
|
-
}
|
|
401
|
-
}}
|
|
402
|
-
remarkPlugins={[[remarkGfm, { ...remarkGfmProps }], ...additionalRemarkPlugins]}
|
|
403
|
-
rehypePlugins={rehypePlugins}
|
|
404
|
-
{...reactMarkdownProps}
|
|
405
|
-
remarkRehypeOptions={{
|
|
406
|
-
// removes sr-only class from footnote labels applied by default
|
|
407
|
-
footnoteLabelProperties: { className: [''] },
|
|
408
|
-
...reactMarkdownProps?.remarkRehypeOptions
|
|
409
|
-
}}
|
|
410
|
-
disallowedElements={disallowedElements}
|
|
411
|
-
>
|
|
412
|
-
{messageText}
|
|
413
|
-
</Markdown>
|
|
414
|
-
);
|
|
415
|
-
};
|
|
265
|
+
const handleMarkdown = () => (
|
|
266
|
+
<MarkdownContent
|
|
267
|
+
content={messageText}
|
|
268
|
+
isMarkdownDisabled={isMarkdownDisabled}
|
|
269
|
+
codeBlockProps={codeBlockProps}
|
|
270
|
+
tableProps={tableProps}
|
|
271
|
+
openLinkInNewTab={openLinkInNewTab}
|
|
272
|
+
additionalRehypePlugins={additionalRehypePlugins}
|
|
273
|
+
additionalRemarkPlugins={additionalRemarkPlugins}
|
|
274
|
+
linkProps={linkProps}
|
|
275
|
+
reactMarkdownProps={reactMarkdownProps}
|
|
276
|
+
remarkGfmProps={remarkGfmProps}
|
|
277
|
+
hasNoImages={role === 'user' && hasNoImagesInUserMessages}
|
|
278
|
+
isPrimary={isPrimary}
|
|
279
|
+
/>
|
|
280
|
+
);
|
|
416
281
|
|
|
417
282
|
const renderMessage = () => {
|
|
418
283
|
if (isLoading) {
|
|
419
|
-
return <MessageLoading loadingWord={loadingWord} />;
|
|
284
|
+
return <MessageLoading loadingWord={loadingWord} isPrimary={isPrimary} />;
|
|
420
285
|
}
|
|
421
286
|
if (isEditable) {
|
|
422
287
|
return (
|
|
@@ -456,12 +321,14 @@ export const MessageBase: FunctionComponent<MessageProps> = ({
|
|
|
456
321
|
{...props}
|
|
457
322
|
>
|
|
458
323
|
{/* We are using an empty alt tag intentionally in order to reduce noise on screen readers */}
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
324
|
+
{avatar && (
|
|
325
|
+
<Avatar
|
|
326
|
+
className={`pf-chatbot__message-avatar ${hasRoundAvatar ? 'pf-chatbot__message-avatar--round' : ''} ${avatarClassName ? avatarClassName : ''}`}
|
|
327
|
+
src={avatar}
|
|
328
|
+
alt=""
|
|
329
|
+
{...avatarProps}
|
|
330
|
+
/>
|
|
331
|
+
)}
|
|
465
332
|
<div className="pf-chatbot__message-contents">
|
|
466
333
|
<div className="pf-chatbot__message-meta">
|
|
467
334
|
{name && (
|
|
@@ -477,57 +344,82 @@ export const MessageBase: FunctionComponent<MessageProps> = ({
|
|
|
477
344
|
<Timestamp date={date}>{timestamp}</Timestamp>
|
|
478
345
|
</div>
|
|
479
346
|
<div className="pf-chatbot__message-response">
|
|
480
|
-
|
|
481
|
-
{
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
347
|
+
{children ? (
|
|
348
|
+
<>{children}</>
|
|
349
|
+
) : (
|
|
350
|
+
<>
|
|
351
|
+
<div className="pf-chatbot__message-and-actions">
|
|
352
|
+
{renderMessage()}
|
|
353
|
+
{afterMainContent && <>{afterMainContent}</>}
|
|
354
|
+
{toolResponse && <ToolResponse {...toolResponse} />}
|
|
355
|
+
{deepThinking && <DeepThinking {...deepThinking} />}
|
|
356
|
+
{toolCall && <ToolCall {...toolCall} />}
|
|
357
|
+
{!isLoading && sources && <SourcesCard {...sources} isCompact={isCompact} />}
|
|
358
|
+
{quickStarts && quickStarts.quickStart && (
|
|
359
|
+
<QuickStartTile
|
|
360
|
+
quickStart={quickStarts.quickStart}
|
|
361
|
+
onSelectQuickStart={quickStarts.onSelectQuickStart}
|
|
362
|
+
minuteWord={quickStarts.minuteWord}
|
|
363
|
+
minuteWordPlural={quickStarts.minuteWordPlural}
|
|
364
|
+
prerequisiteWord={quickStarts.prerequisiteWord}
|
|
365
|
+
prerequisiteWordPlural={quickStarts.prerequisiteWordPlural}
|
|
366
|
+
quickStartButtonAriaLabel={quickStarts.quickStartButtonAriaLabel}
|
|
367
|
+
isCompact={isCompact}
|
|
368
|
+
/>
|
|
369
|
+
)}
|
|
370
|
+
{!isLoading && !isEditable && actions && (
|
|
371
|
+
<>
|
|
372
|
+
{Array.isArray(actions) ? (
|
|
373
|
+
<div className="pf-chatbot__response-actions-groups">
|
|
374
|
+
{actions.map((actionGroup, index) => (
|
|
375
|
+
<ResponseActions
|
|
376
|
+
key={index}
|
|
377
|
+
actions={actionGroup.actions || actionGroup}
|
|
378
|
+
persistActionSelection={persistActionSelection || actionGroup.persistActionSelection}
|
|
379
|
+
/>
|
|
380
|
+
))}
|
|
381
|
+
</div>
|
|
382
|
+
) : (
|
|
383
|
+
<ResponseActions actions={actions} persistActionSelection={persistActionSelection} />
|
|
384
|
+
)}
|
|
385
|
+
</>
|
|
386
|
+
)}
|
|
387
|
+
{userFeedbackForm && (
|
|
388
|
+
<UserFeedback {...userFeedbackForm} timestamp={dateString} isCompact={isCompact} />
|
|
389
|
+
)}
|
|
390
|
+
{userFeedbackComplete && (
|
|
391
|
+
<UserFeedbackComplete {...userFeedbackComplete} timestamp={dateString} isCompact={isCompact} />
|
|
392
|
+
)}
|
|
393
|
+
{!isLoading && quickResponses && (
|
|
394
|
+
<QuickResponse
|
|
395
|
+
quickResponses={quickResponses}
|
|
396
|
+
quickResponseContainerProps={quickResponseContainerProps}
|
|
397
|
+
isCompact={isCompact}
|
|
525
398
|
/>
|
|
399
|
+
)}
|
|
400
|
+
</div>
|
|
401
|
+
{attachments && (
|
|
402
|
+
<div className="pf-chatbot__message-attachments-container">
|
|
403
|
+
{attachments.map((attachment) => (
|
|
404
|
+
<div key={attachment.id ?? attachment.name} className="pf-chatbot__message-attachment">
|
|
405
|
+
<FileDetailsLabel
|
|
406
|
+
fileName={attachment.name}
|
|
407
|
+
fileId={attachment.id}
|
|
408
|
+
onClose={attachment.onClose}
|
|
409
|
+
onClick={attachment.onClick}
|
|
410
|
+
isLoading={attachment.isLoading}
|
|
411
|
+
closeButtonAriaLabel={attachment.closeButtonAriaLabel}
|
|
412
|
+
languageTestId={attachment.languageTestId}
|
|
413
|
+
spinnerTestId={attachment.spinnerTestId}
|
|
414
|
+
variant={isPrimary ? 'outline' : undefined}
|
|
415
|
+
/>
|
|
416
|
+
</div>
|
|
417
|
+
))}
|
|
526
418
|
</div>
|
|
527
|
-
)
|
|
528
|
-
|
|
419
|
+
)}
|
|
420
|
+
{!isLoading && endContent && <>{endContent}</>}
|
|
421
|
+
</>
|
|
529
422
|
)}
|
|
530
|
-
{!isLoading && endContent && <>{endContent}</>}
|
|
531
423
|
</div>
|
|
532
424
|
</div>
|
|
533
425
|
</section>
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import '@testing-library/jest-dom';
|
|
2
|
+
import { render, screen } from '@testing-library/react';
|
|
3
|
+
import MessageAndActions from './MessageAndActions';
|
|
4
|
+
|
|
5
|
+
test('Renders with children', () => {
|
|
6
|
+
render(<MessageAndActions>Test content</MessageAndActions>);
|
|
7
|
+
expect(screen.getByText('Test content')).toBeInTheDocument();
|
|
8
|
+
});
|
|
9
|
+
|
|
10
|
+
test('Renders with pf-chatbot__message-and-actions class by default', () => {
|
|
11
|
+
render(<MessageAndActions>Test content</MessageAndActions>);
|
|
12
|
+
expect(screen.getByText('Test content')).toHaveClass('pf-chatbot__message-and-actions', { exact: true });
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
test('Renders with custom className', () => {
|
|
16
|
+
render(<MessageAndActions className="custom-class">Test content</MessageAndActions>);
|
|
17
|
+
expect(screen.getByText('Test content')).toHaveClass('custom-class');
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
test('Spreads additional props', () => {
|
|
21
|
+
render(<MessageAndActions id="test-id">Test content</MessageAndActions>);
|
|
22
|
+
expect(screen.getByText('Test content')).toHaveAttribute('id', 'test-id');
|
|
23
|
+
});
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { FunctionComponent, HTMLProps, ReactNode } from 'react';
|
|
2
|
+
import { css } from '@patternfly/react-styles';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* The container that wraps the primary message content and inline actions, such as ToolCall, ToolResponse, DeepThinking, ResponseActions, etc.
|
|
6
|
+
* Attachments should not be rendered inside this container.
|
|
7
|
+
* Use this component when passing children to Message to customize its structure.
|
|
8
|
+
*/
|
|
9
|
+
export interface MessageAndActionsProps extends HTMLProps<HTMLDivElement> {
|
|
10
|
+
/** Content to render inside the message and actions container. */
|
|
11
|
+
children: ReactNode;
|
|
12
|
+
/** Additional classes applied to the message and actions container. */
|
|
13
|
+
className?: string;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export const MessageAndActions: FunctionComponent<MessageAndActionsProps> = ({ children, className, ...props }) => (
|
|
17
|
+
<div className={css('pf-chatbot__message-and-actions', className)} {...props}>
|
|
18
|
+
{children}
|
|
19
|
+
</div>
|
|
20
|
+
);
|
|
21
|
+
|
|
22
|
+
export default MessageAndActions;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './MessageAndActions';
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import '@testing-library/jest-dom';
|
|
2
|
+
import { render, screen } from '@testing-library/react';
|
|
3
|
+
import MessageAttachmentItem from './MessageAttachmentItem';
|
|
4
|
+
|
|
5
|
+
test('Renders with children', () => {
|
|
6
|
+
render(<MessageAttachmentItem>Test content</MessageAttachmentItem>);
|
|
7
|
+
expect(screen.getByText('Test content')).toBeInTheDocument();
|
|
8
|
+
});
|
|
9
|
+
|
|
10
|
+
test('Renders with pf-chatbot__message-attachment class by default', () => {
|
|
11
|
+
render(<MessageAttachmentItem>Test content</MessageAttachmentItem>);
|
|
12
|
+
expect(screen.getByText('Test content')).toHaveClass('pf-chatbot__message-attachment', { exact: true });
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
test('Renders with custom className', () => {
|
|
16
|
+
render(<MessageAttachmentItem className="custom-class">Test content</MessageAttachmentItem>);
|
|
17
|
+
expect(screen.getByText('Test content')).toHaveClass('custom-class');
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
test('Spreads additional props', () => {
|
|
21
|
+
render(<MessageAttachmentItem id="test-id">Test content</MessageAttachmentItem>);
|
|
22
|
+
expect(screen.getByText('Test content')).toHaveAttribute('id', 'test-id');
|
|
23
|
+
});
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { FunctionComponent, HTMLProps, ReactNode } from 'react';
|
|
2
|
+
import { css } from '@patternfly/react-styles';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* The container for a single message attachment item, typically the FileDetailsLabel component. You must wrap any attachment components in this container.
|
|
6
|
+
* Use this component within MessageAttachmentsContainer when passing children to Message to customize its structure.
|
|
7
|
+
*/
|
|
8
|
+
export interface MessageAttachmentItemProps extends HTMLProps<HTMLDivElement> {
|
|
9
|
+
/** Content to render inside a single attachment container */
|
|
10
|
+
children: ReactNode;
|
|
11
|
+
/** Additional classes applied to the attachment container. */
|
|
12
|
+
className?: string;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export const MessageAttachmentItem: FunctionComponent<MessageAttachmentItemProps> = ({
|
|
16
|
+
children,
|
|
17
|
+
className,
|
|
18
|
+
...props
|
|
19
|
+
}) => (
|
|
20
|
+
<div className={css('pf-chatbot__message-attachment', className)} {...props}>
|
|
21
|
+
{children}
|
|
22
|
+
</div>
|
|
23
|
+
);
|
|
24
|
+
|
|
25
|
+
export default MessageAttachmentItem;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import '@testing-library/jest-dom';
|
|
2
|
+
import { render, screen } from '@testing-library/react';
|
|
3
|
+
import MessageAttachmentsContainer from './MessageAttachmentsContainer';
|
|
4
|
+
|
|
5
|
+
test('Renders with children', () => {
|
|
6
|
+
render(<MessageAttachmentsContainer>Test content</MessageAttachmentsContainer>);
|
|
7
|
+
expect(screen.getByText('Test content')).toBeInTheDocument();
|
|
8
|
+
});
|
|
9
|
+
|
|
10
|
+
test('Renders with pf-chatbot__message-attachments-container class by default', () => {
|
|
11
|
+
render(<MessageAttachmentsContainer>Test content</MessageAttachmentsContainer>);
|
|
12
|
+
expect(screen.getByText('Test content')).toHaveClass('pf-chatbot__message-attachments-container', { exact: true });
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
test('Renders with custom className', () => {
|
|
16
|
+
render(<MessageAttachmentsContainer className="custom-class">Test content</MessageAttachmentsContainer>);
|
|
17
|
+
expect(screen.getByText('Test content')).toHaveClass('custom-class');
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
test('Spreads additional props', () => {
|
|
21
|
+
render(<MessageAttachmentsContainer id="test-id">Test content</MessageAttachmentsContainer>);
|
|
22
|
+
expect(screen.getByText('Test content')).toHaveAttribute('id', 'test-id');
|
|
23
|
+
});
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { FunctionComponent, HTMLProps, ReactNode } from 'react';
|
|
2
|
+
import { css } from '@patternfly/react-styles';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* The container to wrap MessageAttachment components. You must wrap any MessageAttachment components in this container.
|
|
6
|
+
* Use this component when passing children to Message to customize its structure.
|
|
7
|
+
*/
|
|
8
|
+
export interface MessageAttachmentsContainerProps extends HTMLProps<HTMLDivElement> {
|
|
9
|
+
/** Content to render inside the attachments container */
|
|
10
|
+
children: ReactNode;
|
|
11
|
+
/** Additional classes applied to the attachments container. */
|
|
12
|
+
className?: string;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export const MessageAttachmentsContainer: FunctionComponent<MessageAttachmentsContainerProps> = ({
|
|
16
|
+
children,
|
|
17
|
+
className,
|
|
18
|
+
...props
|
|
19
|
+
}) => (
|
|
20
|
+
<div className={css('pf-chatbot__message-attachments-container', className)} {...props}>
|
|
21
|
+
{children}
|
|
22
|
+
</div>
|
|
23
|
+
);
|
|
24
|
+
|
|
25
|
+
export default MessageAttachmentsContainer;
|
|
@@ -22,7 +22,7 @@ export interface MessageInputProps extends FormProps {
|
|
|
22
22
|
content?: string;
|
|
23
23
|
}
|
|
24
24
|
|
|
25
|
-
const MessageInput: FunctionComponent<MessageInputProps> = ({
|
|
25
|
+
export const MessageInput: FunctionComponent<MessageInputProps> = ({
|
|
26
26
|
editPlaceholder = 'Edit prompt message...',
|
|
27
27
|
updateWord = 'Update',
|
|
28
28
|
cancelWord = 'Cancel',
|