@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
|
@@ -21,17 +21,43 @@
|
|
|
21
21
|
justify-content: flex-end;
|
|
22
22
|
background-color: var(--pf-t--global--background--color--primary--default);
|
|
23
23
|
border-radius: calc(var(--pf-t--global--border--radius--medium) * 2);
|
|
24
|
-
transition:
|
|
24
|
+
transition: border-color var(--pf-t--global--motion--timing-function--accelerate)
|
|
25
25
|
var(--pf-t--global--motion--duration--sm);
|
|
26
|
+
position: relative;
|
|
27
|
+
border: var(--pf-t--global--border--width--control--default) solid transparent;
|
|
26
28
|
|
|
27
29
|
overflow: hidden;
|
|
28
30
|
|
|
31
|
+
&::after {
|
|
32
|
+
content: '';
|
|
33
|
+
position: absolute;
|
|
34
|
+
inset: 0;
|
|
35
|
+
border-radius: inherit;
|
|
36
|
+
border: var(--pf-t--global--border--width--control--default) solid transparent;
|
|
37
|
+
pointer-events: none;
|
|
38
|
+
transition:
|
|
39
|
+
border-color var(--pf-t--global--motion--timing-function--accelerate) var(--pf-t--global--motion--duration--sm),
|
|
40
|
+
border-width var(--pf-t--global--motion--timing-function--accelerate) var(--pf-t--global--motion--duration--sm);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
&.pf-m-primary {
|
|
44
|
+
&::after {
|
|
45
|
+
border-color: var(--pf-t--global--border--color--default);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
29
49
|
&:hover {
|
|
30
|
-
|
|
50
|
+
&::after {
|
|
51
|
+
border-color: var(--pf-t--global--border--color--default);
|
|
52
|
+
border-width: var(--pf-t--global--border--width--control--hover);
|
|
53
|
+
}
|
|
31
54
|
}
|
|
32
55
|
|
|
33
56
|
&:focus-within {
|
|
34
|
-
|
|
57
|
+
&::after {
|
|
58
|
+
border-color: var(--pf-t--global--color--brand--default);
|
|
59
|
+
border-width: var(--pf-t--global--border--width--control--clicked);
|
|
60
|
+
}
|
|
35
61
|
}
|
|
36
62
|
|
|
37
63
|
&-actions {
|
|
@@ -40,6 +66,19 @@
|
|
|
40
66
|
padding-block-start: var(--pf-t--global--spacer--xs);
|
|
41
67
|
padding-block-end: var(--pf-t--global--spacer--xs);
|
|
42
68
|
gap: var(--pf-t--global--spacer--gap--action-to-action--plain);
|
|
69
|
+
|
|
70
|
+
&.pf-m-grouped {
|
|
71
|
+
flex-basis: 100%;
|
|
72
|
+
justify-content: space-between;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
&-actions-group {
|
|
77
|
+
display: flex;
|
|
78
|
+
padding-block-start: var(--pf-t--global--spacer--xs);
|
|
79
|
+
padding-block-end: var(--pf-t--global--spacer--xs);
|
|
80
|
+
gap: var(--pf-t--global--spacer--gap--action-to-action--plain);
|
|
81
|
+
align-items: center;
|
|
43
82
|
}
|
|
44
83
|
|
|
45
84
|
&-input {
|
|
@@ -121,9 +160,30 @@
|
|
|
121
160
|
.pf-chatbot__message-textarea {
|
|
122
161
|
font-size: var(--pf-t--global--font--size--sm) !important;
|
|
123
162
|
}
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
.pf-m-compact {
|
|
166
|
+
.pf-chatbot__message-bar-actions,
|
|
167
|
+
.pf-chatbot__message-bar-actions-group {
|
|
168
|
+
padding-block-start: var(--pf-t--global--spacer--sm);
|
|
169
|
+
padding-block-end: var(--pf-t--global--spacer--sm);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
124
172
|
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
173
|
+
// ============================================================================
|
|
174
|
+
// Multiline textarea styles (2+ lines)
|
|
175
|
+
// ============================================================================
|
|
176
|
+
.pf-chatbot__message-bar.pf-m-multiline {
|
|
177
|
+
border-radius: calc(var(--pf-t--global--border--radius--small) * 2);
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
// ============================================================================
|
|
181
|
+
// High contrast styles
|
|
182
|
+
// ============================================================================
|
|
183
|
+
:root:where(.pf-v6-theme-high-contrast) {
|
|
184
|
+
.pf-chatbot__message-bar {
|
|
185
|
+
&::after {
|
|
186
|
+
border-color: var(--pf-t--global--border--color--default);
|
|
187
|
+
}
|
|
128
188
|
}
|
|
129
189
|
}
|
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
import '@testing-library/jest-dom';
|
|
2
|
-
import {
|
|
2
|
+
import {
|
|
3
|
+
DropdownGroup,
|
|
4
|
+
DropdownItem,
|
|
5
|
+
DropdownList,
|
|
6
|
+
MenuSearchInputProps,
|
|
7
|
+
MenuSearchProps
|
|
8
|
+
} from '@patternfly/react-core';
|
|
3
9
|
import { BellIcon, CalendarAltIcon, ClipboardIcon, CodeIcon } from '@patternfly/react-icons';
|
|
4
10
|
import { render, screen } from '@testing-library/react';
|
|
5
11
|
import userEvent from '@testing-library/user-event';
|
|
@@ -218,6 +224,71 @@ describe('Message bar', () => {
|
|
|
218
224
|
await userEvent.click(attachButton);
|
|
219
225
|
expect(attachToggleClickSpy).toHaveBeenCalledTimes(1);
|
|
220
226
|
});
|
|
227
|
+
it('can pass searchInputProps to search input in AttachMenu', () => {
|
|
228
|
+
render(
|
|
229
|
+
<MessageBar
|
|
230
|
+
onSendMessage={jest.fn}
|
|
231
|
+
value="test"
|
|
232
|
+
attachMenuProps={{
|
|
233
|
+
isAttachMenuOpen: true,
|
|
234
|
+
setIsAttachMenuOpen: jest.fn(),
|
|
235
|
+
onAttachMenuToggleClick: jest.fn(),
|
|
236
|
+
onAttachMenuInputChange: jest.fn(),
|
|
237
|
+
attachMenuItems: ATTACH_MENU_ITEMS,
|
|
238
|
+
searchInputProps: { isDisabled: true }
|
|
239
|
+
}}
|
|
240
|
+
/>
|
|
241
|
+
);
|
|
242
|
+
expect(screen.getByRole('textbox', { name: /Filter menu items/i })).toBeDisabled();
|
|
243
|
+
});
|
|
244
|
+
it('can pass menuSearchProps to search input in AttachMenu', () => {
|
|
245
|
+
render(
|
|
246
|
+
<MessageBar
|
|
247
|
+
onSendMessage={jest.fn}
|
|
248
|
+
value="test"
|
|
249
|
+
attachMenuProps={{
|
|
250
|
+
isAttachMenuOpen: true,
|
|
251
|
+
setIsAttachMenuOpen: jest.fn(),
|
|
252
|
+
onAttachMenuToggleClick: jest.fn(),
|
|
253
|
+
onAttachMenuInputChange: jest.fn(),
|
|
254
|
+
attachMenuItems: ATTACH_MENU_ITEMS,
|
|
255
|
+
menuSearchProps: { 'data-testid': 'menu-search' } as MenuSearchProps
|
|
256
|
+
}}
|
|
257
|
+
/>
|
|
258
|
+
);
|
|
259
|
+
expect(screen.getByTestId('menu-search')).toBeTruthy();
|
|
260
|
+
});
|
|
261
|
+
it('can pass menuSearchInputProps to search input in AttachMenu', () => {
|
|
262
|
+
render(
|
|
263
|
+
<MessageBar
|
|
264
|
+
onSendMessage={jest.fn}
|
|
265
|
+
value="test"
|
|
266
|
+
attachMenuProps={{
|
|
267
|
+
isAttachMenuOpen: true,
|
|
268
|
+
setIsAttachMenuOpen: jest.fn(),
|
|
269
|
+
onAttachMenuToggleClick: jest.fn(),
|
|
270
|
+
onAttachMenuInputChange: jest.fn(),
|
|
271
|
+
attachMenuItems: ATTACH_MENU_ITEMS,
|
|
272
|
+
menuSearchInputProps: { 'data-testid': 'menu-search-input' } as MenuSearchInputProps
|
|
273
|
+
}}
|
|
274
|
+
/>
|
|
275
|
+
);
|
|
276
|
+
expect(screen.getByTestId('menu-search-input')).toBeTruthy();
|
|
277
|
+
});
|
|
278
|
+
it('can remove input from attach menu', async () => {
|
|
279
|
+
render(
|
|
280
|
+
<MessageBar
|
|
281
|
+
onSendMessage={jest.fn}
|
|
282
|
+
attachMenuProps={{
|
|
283
|
+
isAttachMenuOpen: true,
|
|
284
|
+
setIsAttachMenuOpen: jest.fn(),
|
|
285
|
+
onAttachMenuToggleClick: jest.fn(),
|
|
286
|
+
attachMenuItems: ATTACH_MENU_ITEMS
|
|
287
|
+
}}
|
|
288
|
+
/>
|
|
289
|
+
);
|
|
290
|
+
expect(screen.queryByRole('textbox', { name: /Filter menu items/i })).not.toBeInTheDocument();
|
|
291
|
+
});
|
|
221
292
|
it('can hide attach button', () => {
|
|
222
293
|
render(<MessageBar onSendMessage={jest.fn} hasAttachButton={false} />);
|
|
223
294
|
expect(screen.queryByRole('button', { name: 'Attach' })).toBeFalsy();
|
|
@@ -268,6 +339,20 @@ describe('Message bar', () => {
|
|
|
268
339
|
);
|
|
269
340
|
await userEvent.click(screen.getByRole('button', { name: 'Test' }));
|
|
270
341
|
});
|
|
342
|
+
it('can change attach button icon', () => {
|
|
343
|
+
render(
|
|
344
|
+
<MessageBar
|
|
345
|
+
onSendMessage={jest.fn}
|
|
346
|
+
hasAttachButton
|
|
347
|
+
buttonProps={{
|
|
348
|
+
attach: {
|
|
349
|
+
icon: <img alt="" src="" />
|
|
350
|
+
}
|
|
351
|
+
}}
|
|
352
|
+
/>
|
|
353
|
+
);
|
|
354
|
+
expect(screen.getByRole('img')).toBeVisible();
|
|
355
|
+
});
|
|
271
356
|
|
|
272
357
|
// Stop button
|
|
273
358
|
// --------------------------------------------------------------------------
|
|
@@ -387,4 +472,47 @@ describe('Message bar', () => {
|
|
|
387
472
|
ref.current?.focus();
|
|
388
473
|
expect(document.activeElement).toBe(screen.getByRole('textbox'));
|
|
389
474
|
});
|
|
475
|
+
it('should handle isPrimary', () => {
|
|
476
|
+
const { container } = render(<MessageBar isPrimary onSendMessage={jest.fn} />);
|
|
477
|
+
expect(container.querySelector('.pf-m-primary')).toBeTruthy();
|
|
478
|
+
});
|
|
479
|
+
|
|
480
|
+
it('Renders with class pf-v6-m-ai-indicator when hasAiIndicator is true', () => {
|
|
481
|
+
render(<MessageBar onSendMessage={jest.fn} hasAiIndicator />);
|
|
482
|
+
|
|
483
|
+
expect(screen.getByRole('textbox').closest('.pf-chatbot__message-bar')).toHaveClass('pf-v6-m-ai-indicator');
|
|
484
|
+
});
|
|
485
|
+
|
|
486
|
+
it('Renders with class pf-v6-m-thinking when isThinking is true', () => {
|
|
487
|
+
render(<MessageBar onSendMessage={jest.fn} isThinking />);
|
|
488
|
+
|
|
489
|
+
expect(screen.getByRole('textbox').closest('.pf-chatbot__message-bar')).toHaveClass('pf-v6-m-thinking');
|
|
490
|
+
});
|
|
491
|
+
|
|
492
|
+
it('Renders with flex-basis of auto by default', () => {
|
|
493
|
+
render(<MessageBar onSendMessage={jest.fn} />);
|
|
494
|
+
|
|
495
|
+
expect(screen.getByRole('textbox').closest('.pf-chatbot__message-bar-input')).toHaveAttribute(
|
|
496
|
+
'style',
|
|
497
|
+
'flex-basis: auto;'
|
|
498
|
+
);
|
|
499
|
+
});
|
|
500
|
+
|
|
501
|
+
it('Renders with flex-basis of 100% when forceMultilineLayout is true', () => {
|
|
502
|
+
render(<MessageBar forceMultilineLayout onSendMessage={jest.fn} />);
|
|
503
|
+
|
|
504
|
+
expect(screen.getByRole('textbox').closest('.pf-chatbot__message-bar-input')).toHaveAttribute(
|
|
505
|
+
'style',
|
|
506
|
+
'flex-basis: 100%;'
|
|
507
|
+
);
|
|
508
|
+
});
|
|
509
|
+
|
|
510
|
+
it('Renders with flex-basis of 100% when additionalActions is truthy', () => {
|
|
511
|
+
render(<MessageBar additionalActions="actions" onSendMessage={jest.fn} />);
|
|
512
|
+
|
|
513
|
+
expect(screen.getByRole('textbox').closest('.pf-chatbot__message-bar-input')).toHaveAttribute(
|
|
514
|
+
'style',
|
|
515
|
+
'flex-basis: 100%;'
|
|
516
|
+
);
|
|
517
|
+
});
|
|
390
518
|
});
|
|
@@ -1,12 +1,21 @@
|
|
|
1
1
|
import type { ChangeEvent, FunctionComponent, KeyboardEvent as ReactKeyboardEvent, Ref } from 'react';
|
|
2
2
|
import { forwardRef, useCallback, useEffect, useRef, useState } from 'react';
|
|
3
3
|
import { Accept, DropEvent, DropzoneOptions, FileError, FileRejection } from 'react-dropzone';
|
|
4
|
-
import {
|
|
4
|
+
import {
|
|
5
|
+
ButtonProps,
|
|
6
|
+
MenuSearchInputProps,
|
|
7
|
+
MenuSearchProps,
|
|
8
|
+
SearchInputProps,
|
|
9
|
+
TextArea,
|
|
10
|
+
TextAreaProps,
|
|
11
|
+
TooltipProps
|
|
12
|
+
} from '@patternfly/react-core';
|
|
13
|
+
import { css } from '@patternfly/react-styles';
|
|
5
14
|
|
|
6
15
|
// Import Chatbot components
|
|
7
16
|
import SendButton from './SendButton';
|
|
8
17
|
import MicrophoneButton from './MicrophoneButton';
|
|
9
|
-
import { AttachButton } from './AttachButton';
|
|
18
|
+
import { AttachButton, AttachButtonProps } from './AttachButton';
|
|
10
19
|
import AttachMenu from '../AttachMenu';
|
|
11
20
|
import StopButton from './StopButton';
|
|
12
21
|
import { ChatbotDisplayMode } from '../Chatbot';
|
|
@@ -21,7 +30,7 @@ export interface MessageBarWithAttachMenuProps {
|
|
|
21
30
|
/** A callback for when the attachment menu toggle is clicked */
|
|
22
31
|
onAttachMenuToggleClick: () => void;
|
|
23
32
|
/** A callback for when the input value in the menu changes. */
|
|
24
|
-
onAttachMenuInputChange
|
|
33
|
+
onAttachMenuInputChange?: (value: string) => void;
|
|
25
34
|
/** Function callback called when user selects item in menu. */
|
|
26
35
|
onAttachMenuSelect?: (event?: React.MouseEvent<Element, MouseEvent>, value?: string | number) => void;
|
|
27
36
|
/** Placeholder for search input */
|
|
@@ -30,6 +39,12 @@ export interface MessageBarWithAttachMenuProps {
|
|
|
30
39
|
onAttachMenuOnOpenChangeKeys?: string[];
|
|
31
40
|
/** Callback to change the open state of the menu. Triggered by clicking outside of the menu. */
|
|
32
41
|
onAttachMenuOpenChange?: (isOpen: boolean) => void;
|
|
42
|
+
/** Additional props passed to MenuSearch component in attach menu */
|
|
43
|
+
menuSearchProps?: Omit<MenuSearchProps, 'ref'>;
|
|
44
|
+
/** Additional props passed to MenuSearchInput component in attach menu */
|
|
45
|
+
menuSearchInputProps?: Omit<MenuSearchInputProps, 'ref'>;
|
|
46
|
+
/** Additional props passed to SearchInput component in attach menu */
|
|
47
|
+
searchInputProps?: SearchInputProps;
|
|
33
48
|
}
|
|
34
49
|
|
|
35
50
|
export interface MessageBarProps extends Omit<TextAreaProps, 'innerRef'> {
|
|
@@ -43,6 +58,8 @@ export interface MessageBarProps extends Omit<TextAreaProps, 'innerRef'> {
|
|
|
43
58
|
placeholder?: string;
|
|
44
59
|
/** Flag to disable/enable the Attach button */
|
|
45
60
|
hasAttachButton?: boolean;
|
|
61
|
+
/** Whether the attach button is rendered before or after the message input. */
|
|
62
|
+
attachButtonPosition?: 'start' | 'end';
|
|
46
63
|
/** Flag to enable the Microphone button */
|
|
47
64
|
hasMicrophoneButton?: boolean;
|
|
48
65
|
/** Placeholder text when listening */
|
|
@@ -81,12 +98,7 @@ export interface MessageBarProps extends Omit<TextAreaProps, 'innerRef'> {
|
|
|
81
98
|
isSendButtonDisabled?: boolean;
|
|
82
99
|
/** Prop to allow passage of additional props to buttons */
|
|
83
100
|
buttonProps?: {
|
|
84
|
-
attach?: {
|
|
85
|
-
tooltipContent?: string;
|
|
86
|
-
props?: ButtonProps;
|
|
87
|
-
inputTestId?: string;
|
|
88
|
-
tooltipProps?: Omit<TooltipProps, 'content'>;
|
|
89
|
-
};
|
|
101
|
+
attach?: AttachButtonProps & { props?: ButtonProps };
|
|
90
102
|
stop?: { tooltipContent?: string; props?: ButtonProps; tooltipProps?: Omit<TooltipProps, 'content'> };
|
|
91
103
|
send?: { tooltipContent?: string; props?: ButtonProps; tooltipProps?: Omit<TooltipProps, 'content'> };
|
|
92
104
|
microphone?: {
|
|
@@ -104,6 +116,16 @@ export interface MessageBarProps extends Omit<TextAreaProps, 'innerRef'> {
|
|
|
104
116
|
isCompact?: boolean;
|
|
105
117
|
/** Ref applied to message bar textarea, for use with focus or other custom behaviors */
|
|
106
118
|
innerRef?: React.Ref<HTMLTextAreaElement>;
|
|
119
|
+
/** Sets background color to primary */
|
|
120
|
+
isPrimary?: boolean;
|
|
121
|
+
/** Additional actions to render for the message bar. This will force a multiline layout, and the actions will render at the start of the container. */
|
|
122
|
+
additionalActions?: React.ReactNode;
|
|
123
|
+
/** Flag indicating whether a multiline layout for the message input and actions should be forced. This can be used to always render actions below the message input. */
|
|
124
|
+
forceMultilineLayout?: boolean;
|
|
125
|
+
/** @beta Flag indicating whether the message bar has an AI indicator border. */
|
|
126
|
+
hasAiIndicator?: boolean;
|
|
127
|
+
/** @beta Flag indicating whether the chatbot is thinking in response to a query, adding an animation to the message bar. */
|
|
128
|
+
isThinking?: boolean;
|
|
107
129
|
}
|
|
108
130
|
|
|
109
131
|
export const MessageBarBase: FunctionComponent<MessageBarProps> = ({
|
|
@@ -112,6 +134,7 @@ export const MessageBarBase: FunctionComponent<MessageBarProps> = ({
|
|
|
112
134
|
alwayShowSendButton,
|
|
113
135
|
placeholder = 'Send a message...',
|
|
114
136
|
hasAttachButton = true,
|
|
137
|
+
attachButtonPosition = 'end',
|
|
115
138
|
hasMicrophoneButton,
|
|
116
139
|
listeningText = 'Listening',
|
|
117
140
|
handleAttach,
|
|
@@ -134,6 +157,11 @@ export const MessageBarBase: FunctionComponent<MessageBarProps> = ({
|
|
|
134
157
|
validator,
|
|
135
158
|
dropzoneProps,
|
|
136
159
|
innerRef,
|
|
160
|
+
isPrimary,
|
|
161
|
+
additionalActions,
|
|
162
|
+
forceMultilineLayout = false,
|
|
163
|
+
hasAiIndicator,
|
|
164
|
+
isThinking,
|
|
137
165
|
...props
|
|
138
166
|
}: MessageBarProps) => {
|
|
139
167
|
// Text Input
|
|
@@ -142,12 +170,21 @@ export const MessageBarBase: FunctionComponent<MessageBarProps> = ({
|
|
|
142
170
|
const [isListeningMessage, setIsListeningMessage] = useState<boolean>(false);
|
|
143
171
|
const [hasSentMessage, setHasSentMessage] = useState(false);
|
|
144
172
|
const [isComposing, setIsComposing] = useState(false);
|
|
173
|
+
|
|
174
|
+
const shouldForceMultiline = forceMultilineLayout || additionalActions;
|
|
175
|
+
const [isMultiline, setIsMultiline] = useState(shouldForceMultiline);
|
|
145
176
|
const inputRef = useRef<HTMLTextAreaElement>(null);
|
|
146
177
|
const textareaRef = (innerRef as React.RefObject<HTMLTextAreaElement>) ?? inputRef;
|
|
147
178
|
const attachButtonRef = useRef<HTMLButtonElement>(null);
|
|
148
179
|
|
|
149
180
|
const topMargin = '1rem';
|
|
150
181
|
|
|
182
|
+
useEffect(() => {
|
|
183
|
+
if (value !== undefined && value !== message) {
|
|
184
|
+
setMessage(value);
|
|
185
|
+
}
|
|
186
|
+
}, [value, message]);
|
|
187
|
+
|
|
151
188
|
const setInitialLineHeight = (field: HTMLTextAreaElement) => {
|
|
152
189
|
field.style.setProperty('line-height', '1rem');
|
|
153
190
|
const parent = field.parentElement;
|
|
@@ -158,7 +195,7 @@ export const MessageBarBase: FunctionComponent<MessageBarProps> = ({
|
|
|
158
195
|
|
|
159
196
|
const grandparent = parent.parentElement;
|
|
160
197
|
if (grandparent) {
|
|
161
|
-
grandparent.style.setProperty('flex-basis', 'auto');
|
|
198
|
+
grandparent.style.setProperty('flex-basis', shouldForceMultiline ? '100%' : 'auto');
|
|
162
199
|
}
|
|
163
200
|
}
|
|
164
201
|
};
|
|
@@ -190,11 +227,24 @@ export const MessageBarBase: FunctionComponent<MessageBarProps> = ({
|
|
|
190
227
|
return lines > 2;
|
|
191
228
|
};
|
|
192
229
|
|
|
230
|
+
const checkIfMultiline = useCallback(
|
|
231
|
+
(field: HTMLTextAreaElement) => {
|
|
232
|
+
const parent = field.parentElement;
|
|
233
|
+
const grandparent = parent?.parentElement;
|
|
234
|
+
if (grandparent) {
|
|
235
|
+
const containerHeight = grandparent.offsetHeight;
|
|
236
|
+
const threshold = isCompact ? 56 : 70;
|
|
237
|
+
setIsMultiline(containerHeight > threshold);
|
|
238
|
+
}
|
|
239
|
+
},
|
|
240
|
+
[isCompact]
|
|
241
|
+
);
|
|
242
|
+
|
|
193
243
|
const setAutoWidth = useCallback((field: HTMLTextAreaElement) => {
|
|
194
244
|
const parent = field.parentElement;
|
|
195
245
|
if (parent) {
|
|
196
246
|
const grandparent = parent.parentElement;
|
|
197
|
-
if (textIsLongerThan2Lines(field) && grandparent) {
|
|
247
|
+
if ((textIsLongerThan2Lines(field) || shouldForceMultiline) && grandparent) {
|
|
198
248
|
grandparent.style.setProperty('flex-basis', `100%`);
|
|
199
249
|
}
|
|
200
250
|
}
|
|
@@ -244,12 +294,14 @@ export const MessageBarBase: FunctionComponent<MessageBarProps> = ({
|
|
|
244
294
|
if (field) {
|
|
245
295
|
if (field.value === '') {
|
|
246
296
|
setInitialLineHeight(field);
|
|
297
|
+
!shouldForceMultiline && setIsMultiline(false);
|
|
247
298
|
} else {
|
|
248
299
|
setAutoHeight(field);
|
|
249
300
|
setAutoWidth(field);
|
|
301
|
+
!shouldForceMultiline && checkIfMultiline(field);
|
|
250
302
|
}
|
|
251
303
|
}
|
|
252
|
-
}, [displayMode, message, setAutoWidth]);
|
|
304
|
+
}, [displayMode, message, setAutoWidth, shouldForceMultiline, checkIfMultiline]);
|
|
253
305
|
|
|
254
306
|
useEffect(() => {
|
|
255
307
|
const field = textareaRef.current;
|
|
@@ -265,13 +317,15 @@ export const MessageBarBase: FunctionComponent<MessageBarProps> = ({
|
|
|
265
317
|
if (textareaRef.current) {
|
|
266
318
|
if (event.target.value === '') {
|
|
267
319
|
setInitialLineHeight(textareaRef.current);
|
|
320
|
+
!shouldForceMultiline && setIsMultiline(false);
|
|
268
321
|
} else {
|
|
269
322
|
setAutoHeight(textareaRef.current);
|
|
323
|
+
!shouldForceMultiline && checkIfMultiline(textareaRef.current);
|
|
270
324
|
}
|
|
271
325
|
}
|
|
272
326
|
setMessage(event.target.value);
|
|
273
327
|
},
|
|
274
|
-
[onChange]
|
|
328
|
+
[onChange, checkIfMultiline]
|
|
275
329
|
);
|
|
276
330
|
|
|
277
331
|
// Handle sending message
|
|
@@ -328,6 +382,55 @@ export const MessageBarBase: FunctionComponent<MessageBarProps> = ({
|
|
|
328
382
|
onChange && onChange({} as ChangeEvent<HTMLTextAreaElement>, message);
|
|
329
383
|
};
|
|
330
384
|
|
|
385
|
+
const renderAttachButton = () => {
|
|
386
|
+
if (!attachMenuProps && hasAttachButton) {
|
|
387
|
+
return (
|
|
388
|
+
<AttachButton
|
|
389
|
+
onAttachAccepted={handleAttach}
|
|
390
|
+
isDisabled={isListeningMessage}
|
|
391
|
+
tooltipContent={buttonProps?.attach?.tooltipContent}
|
|
392
|
+
inputTestId={buttonProps?.attach?.inputTestId}
|
|
393
|
+
isCompact={isCompact}
|
|
394
|
+
tooltipProps={buttonProps?.attach?.tooltipProps}
|
|
395
|
+
allowedFileTypes={allowedFileTypes}
|
|
396
|
+
minSize={minSize}
|
|
397
|
+
maxSize={maxSize}
|
|
398
|
+
maxFiles={maxFiles}
|
|
399
|
+
isAttachmentDisabled={isAttachmentDisabled}
|
|
400
|
+
onAttach={onAttach}
|
|
401
|
+
onAttachRejected={onAttachRejected}
|
|
402
|
+
validator={validator}
|
|
403
|
+
dropzoneProps={dropzoneProps}
|
|
404
|
+
{...buttonProps?.attach}
|
|
405
|
+
{...buttonProps?.attach?.props}
|
|
406
|
+
/>
|
|
407
|
+
);
|
|
408
|
+
}
|
|
409
|
+
if (attachMenuProps) {
|
|
410
|
+
return (
|
|
411
|
+
<AttachButton
|
|
412
|
+
ref={attachButtonRef}
|
|
413
|
+
onClick={handleAttachMenuToggle}
|
|
414
|
+
isDisabled={isListeningMessage}
|
|
415
|
+
tooltipContent={buttonProps?.attach?.tooltipContent}
|
|
416
|
+
isCompact={isCompact}
|
|
417
|
+
tooltipProps={buttonProps?.attach?.tooltipProps}
|
|
418
|
+
allowedFileTypes={allowedFileTypes}
|
|
419
|
+
minSize={minSize}
|
|
420
|
+
maxSize={maxSize}
|
|
421
|
+
maxFiles={maxFiles}
|
|
422
|
+
isAttachmentDisabled={isAttachmentDisabled}
|
|
423
|
+
onAttach={onAttach}
|
|
424
|
+
onAttachRejected={onAttachRejected}
|
|
425
|
+
validator={validator}
|
|
426
|
+
dropzoneProps={dropzoneProps}
|
|
427
|
+
{...buttonProps?.attach}
|
|
428
|
+
/>
|
|
429
|
+
);
|
|
430
|
+
}
|
|
431
|
+
};
|
|
432
|
+
|
|
433
|
+
const isAttachButtonAtStart = attachButtonPosition === 'start';
|
|
331
434
|
const renderButtons = () => {
|
|
332
435
|
if (hasStopButton && handleStopButton) {
|
|
333
436
|
return (
|
|
@@ -342,46 +445,7 @@ export const MessageBarBase: FunctionComponent<MessageBarProps> = ({
|
|
|
342
445
|
}
|
|
343
446
|
return (
|
|
344
447
|
<>
|
|
345
|
-
{
|
|
346
|
-
<AttachButton
|
|
347
|
-
ref={attachButtonRef}
|
|
348
|
-
onClick={handleAttachMenuToggle}
|
|
349
|
-
isDisabled={isListeningMessage}
|
|
350
|
-
tooltipContent={buttonProps?.attach?.tooltipContent}
|
|
351
|
-
isCompact={isCompact}
|
|
352
|
-
tooltipProps={buttonProps?.attach?.tooltipProps}
|
|
353
|
-
allowedFileTypes={allowedFileTypes}
|
|
354
|
-
minSize={minSize}
|
|
355
|
-
maxSize={maxSize}
|
|
356
|
-
maxFiles={maxFiles}
|
|
357
|
-
isAttachmentDisabled={isAttachmentDisabled}
|
|
358
|
-
onAttach={onAttach}
|
|
359
|
-
onAttachRejected={onAttachRejected}
|
|
360
|
-
validator={validator}
|
|
361
|
-
dropzoneProps={dropzoneProps}
|
|
362
|
-
{...buttonProps?.attach?.props}
|
|
363
|
-
/>
|
|
364
|
-
)}
|
|
365
|
-
{!attachMenuProps && hasAttachButton && (
|
|
366
|
-
<AttachButton
|
|
367
|
-
onAttachAccepted={handleAttach}
|
|
368
|
-
isDisabled={isListeningMessage}
|
|
369
|
-
tooltipContent={buttonProps?.attach?.tooltipContent}
|
|
370
|
-
inputTestId={buttonProps?.attach?.inputTestId}
|
|
371
|
-
isCompact={isCompact}
|
|
372
|
-
tooltipProps={buttonProps?.attach?.tooltipProps}
|
|
373
|
-
allowedFileTypes={allowedFileTypes}
|
|
374
|
-
minSize={minSize}
|
|
375
|
-
maxSize={maxSize}
|
|
376
|
-
maxFiles={maxFiles}
|
|
377
|
-
isAttachmentDisabled={isAttachmentDisabled}
|
|
378
|
-
onAttach={onAttach}
|
|
379
|
-
onAttachRejected={onAttachRejected}
|
|
380
|
-
validator={validator}
|
|
381
|
-
dropzoneProps={dropzoneProps}
|
|
382
|
-
{...buttonProps?.attach?.props}
|
|
383
|
-
/>
|
|
384
|
-
)}
|
|
448
|
+
{!isAttachButtonAtStart && renderAttachButton()}
|
|
385
449
|
{hasMicrophoneButton && (
|
|
386
450
|
<MicrophoneButton
|
|
387
451
|
isListening={isListeningMessage}
|
|
@@ -409,8 +473,12 @@ export const MessageBarBase: FunctionComponent<MessageBarProps> = ({
|
|
|
409
473
|
);
|
|
410
474
|
};
|
|
411
475
|
|
|
476
|
+
const hasGroupedActions = additionalActions || (isAttachButtonAtStart && isMultiline);
|
|
412
477
|
const messageBarContents = (
|
|
413
478
|
<>
|
|
479
|
+
{isAttachButtonAtStart && !isMultiline && (
|
|
480
|
+
<div className="pf-chatbot__message-bar-actions test">{renderAttachButton()}</div>
|
|
481
|
+
)}
|
|
414
482
|
<div className={`pf-chatbot__message-bar-input ${isCompact ? 'pf-m-compact' : ''}`}>
|
|
415
483
|
<TextArea
|
|
416
484
|
className="pf-chatbot__message-textarea"
|
|
@@ -425,7 +493,19 @@ export const MessageBarBase: FunctionComponent<MessageBarProps> = ({
|
|
|
425
493
|
{...props}
|
|
426
494
|
/>
|
|
427
495
|
</div>
|
|
428
|
-
<div className=
|
|
496
|
+
<div className={css('pf-chatbot__message-bar-actions', hasGroupedActions && 'pf-m-grouped')}>
|
|
497
|
+
{hasGroupedActions ? (
|
|
498
|
+
<>
|
|
499
|
+
<div className={css('pf-chatbot__message-bar-actions-group')}>
|
|
500
|
+
{isAttachButtonAtStart && renderAttachButton()}
|
|
501
|
+
{additionalActions}
|
|
502
|
+
</div>
|
|
503
|
+
<div className={css('pf-chatbot__message-bar-actions-group')}>{renderButtons()}</div>
|
|
504
|
+
</>
|
|
505
|
+
) : (
|
|
506
|
+
renderButtons()
|
|
507
|
+
)}
|
|
508
|
+
</div>
|
|
429
509
|
</>
|
|
430
510
|
);
|
|
431
511
|
|
|
@@ -433,7 +513,7 @@ export const MessageBarBase: FunctionComponent<MessageBarProps> = ({
|
|
|
433
513
|
return (
|
|
434
514
|
<AttachMenu
|
|
435
515
|
toggle={(toggleRef) => (
|
|
436
|
-
<div ref={toggleRef} className={
|
|
516
|
+
<div ref={toggleRef} className={css('pf-chatbot__message-bar', isMultiline && 'pf-m-multiline', className)}>
|
|
437
517
|
{messageBarContents}
|
|
438
518
|
</div>
|
|
439
519
|
)}
|
|
@@ -449,11 +529,25 @@ export const MessageBarBase: FunctionComponent<MessageBarProps> = ({
|
|
|
449
529
|
{...(attachMenuProps && { handleTextInputChange: attachMenuProps.onAttachMenuInputChange })}
|
|
450
530
|
popperProps={{ direction: 'up', distance: 8 }}
|
|
451
531
|
searchInputPlaceholder={attachMenuProps?.attachMenuInputPlaceholder}
|
|
532
|
+
{...attachMenuProps}
|
|
452
533
|
/>
|
|
453
534
|
);
|
|
454
535
|
}
|
|
455
536
|
|
|
456
|
-
return
|
|
537
|
+
return (
|
|
538
|
+
<div
|
|
539
|
+
className={css(
|
|
540
|
+
'pf-chatbot__message-bar',
|
|
541
|
+
isPrimary && 'pf-m-primary',
|
|
542
|
+
hasAiIndicator && 'pf-v6-m-ai-indicator',
|
|
543
|
+
isThinking && 'pf-v6-m-thinking',
|
|
544
|
+
isMultiline && 'pf-m-multiline',
|
|
545
|
+
className
|
|
546
|
+
)}
|
|
547
|
+
>
|
|
548
|
+
{messageBarContents}
|
|
549
|
+
</div>
|
|
550
|
+
);
|
|
457
551
|
};
|
|
458
552
|
|
|
459
553
|
const MessageBar = forwardRef((props: MessageBarProps, ref: Ref<HTMLTextAreaElement>) => (
|