@patternfly/chatbot 2.2.0-prerelease.9 → 2.2.1
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/AttachmentEdit/AttachmentEdit.test.d.ts +1 -0
- package/dist/cjs/AttachmentEdit/AttachmentEdit.test.js +52 -0
- package/dist/cjs/Chatbot/Chatbot.d.ts +2 -1
- package/dist/cjs/Chatbot/Chatbot.js +1 -0
- package/dist/cjs/Chatbot/Chatbot.test.d.ts +1 -0
- package/dist/cjs/Chatbot/Chatbot.test.js +28 -0
- package/dist/cjs/ChatbotAlert/ChatbotAlert.test.d.ts +1 -0
- package/dist/cjs/ChatbotAlert/ChatbotAlert.test.js +27 -0
- package/dist/cjs/ChatbotContent/ChatbotContent.test.d.ts +1 -0
- package/dist/cjs/ChatbotContent/ChatbotContent.test.js +18 -0
- package/dist/cjs/ChatbotConversationHistoryNav/ChatbotConversationHistoryDropdown.d.ts +3 -3
- package/dist/cjs/ChatbotConversationHistoryNav/ChatbotConversationHistoryDropdown.js +3 -1
- package/dist/cjs/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.d.ts +27 -4
- package/dist/cjs/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.js +24 -12
- package/dist/cjs/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.test.js +99 -3
- package/dist/cjs/ChatbotConversationHistoryNav/EmptyState.d.ts +11 -0
- package/dist/cjs/ChatbotConversationHistoryNav/EmptyState.js +29 -0
- package/dist/cjs/ChatbotConversationHistoryNav/LoadingState.d.ts +4 -0
- package/dist/cjs/ChatbotConversationHistoryNav/LoadingState.js +45 -0
- package/dist/cjs/ChatbotFooter/ChatbotFooter.test.d.ts +1 -0
- package/dist/cjs/ChatbotFooter/ChatbotFooter.test.js +18 -0
- package/dist/cjs/ChatbotFooter/ChatbotFooternote.test.d.ts +1 -0
- package/dist/cjs/ChatbotFooter/ChatbotFooternote.test.js +87 -0
- package/dist/cjs/ChatbotFooter/ChatbotFootnote.d.ts +1 -1
- package/dist/cjs/ChatbotFooter/ChatbotFootnote.js +1 -1
- package/dist/cjs/ChatbotHeader/ChatbotHeader.test.d.ts +1 -0
- package/dist/cjs/ChatbotHeader/ChatbotHeader.test.js +18 -0
- package/dist/cjs/ChatbotHeader/ChatbotHeaderActions.test.d.ts +1 -0
- package/dist/cjs/ChatbotHeader/ChatbotHeaderActions.test.js +18 -0
- package/dist/cjs/ChatbotHeader/ChatbotHeaderCloseButton.js +3 -1
- package/dist/cjs/ChatbotHeader/ChatbotHeaderCloseButton.test.d.ts +1 -0
- package/dist/cjs/ChatbotHeader/ChatbotHeaderCloseButton.test.js +20 -0
- package/dist/cjs/ChatbotHeader/ChatbotHeaderMain.test.d.ts +1 -0
- package/dist/cjs/ChatbotHeader/ChatbotHeaderMain.test.js +18 -0
- package/dist/cjs/ChatbotHeader/ChatbotHeaderMenu.js +3 -1
- package/dist/cjs/ChatbotHeader/ChatbotHeaderMenu.test.d.ts +1 -0
- package/dist/cjs/ChatbotHeader/ChatbotHeaderMenu.test.js +20 -0
- package/dist/cjs/ChatbotHeader/ChatbotHeaderOptionsDropdown.js +3 -1
- package/dist/cjs/ChatbotHeader/ChatbotHeaderOptionsDropdown.test.d.ts +1 -0
- package/dist/cjs/ChatbotHeader/ChatbotHeaderOptionsDropdown.test.js +43 -0
- package/dist/cjs/ChatbotHeader/ChatbotHeaderSelectorDropdown.js +6 -4
- package/dist/cjs/ChatbotHeader/ChatbotHeaderSelectorDropdown.test.d.ts +1 -0
- package/dist/cjs/ChatbotHeader/ChatbotHeaderSelectorDropdown.test.js +41 -0
- package/dist/cjs/ChatbotHeader/ChatbotHeaderTitle.d.ts +3 -1
- package/dist/cjs/ChatbotHeader/ChatbotHeaderTitle.js +4 -2
- package/dist/cjs/ChatbotHeader/ChatbotHeaderTitle.test.d.ts +1 -0
- package/dist/cjs/ChatbotHeader/ChatbotHeaderTitle.test.js +55 -0
- package/dist/cjs/ChatbotToggle/ChatbotToggle.js +3 -1
- package/dist/cjs/ChatbotWelcomePrompt/ChatbotWelcomePrompt.test.js +19 -11
- package/dist/cjs/Compare/Compare.d.ts +17 -0
- package/dist/cjs/Compare/Compare.js +50 -0
- package/dist/cjs/Compare/Compare.test.d.ts +1 -0
- package/dist/cjs/Compare/Compare.test.js +20 -0
- package/dist/cjs/Compare/index.d.ts +2 -0
- package/dist/cjs/Compare/index.js +23 -0
- package/dist/cjs/Message/ErrorMessage/ErrorMessage.d.ts +4 -0
- package/dist/cjs/Message/ErrorMessage/ErrorMessage.js +26 -0
- package/dist/cjs/Message/ImageMessage/ImageMessage.d.ts +4 -0
- package/dist/cjs/Message/ImageMessage/ImageMessage.js +25 -0
- package/dist/cjs/Message/LinkMessage/LinkMessage.d.ts +4 -0
- package/dist/cjs/Message/LinkMessage/LinkMessage.js +30 -0
- package/dist/cjs/Message/Message.d.ts +35 -8
- package/dist/cjs/Message/Message.js +68 -18
- package/dist/cjs/Message/Message.test.js +239 -3
- package/dist/cjs/Message/QuickResponse/QuickResponse.d.ts +17 -0
- package/dist/cjs/Message/QuickResponse/QuickResponse.js +34 -0
- package/dist/cjs/Message/TableMessage/TableMessage.d.ts +20 -0
- package/dist/cjs/Message/TableMessage/TableMessage.js +67 -0
- package/dist/cjs/Message/TableMessage/TbodyMessage.d.ts +7 -0
- package/dist/cjs/Message/TableMessage/TbodyMessage.js +33 -0
- package/dist/cjs/Message/TableMessage/TdMessage.d.ts +5 -0
- package/dist/cjs/Message/TableMessage/TdMessage.js +26 -0
- package/dist/cjs/Message/TableMessage/ThMessage.d.ts +5 -0
- package/dist/cjs/Message/TableMessage/ThMessage.js +26 -0
- package/dist/cjs/Message/TableMessage/TheadMessage.d.ts +5 -0
- package/dist/cjs/Message/TableMessage/TheadMessage.js +26 -0
- package/dist/cjs/Message/TableMessage/TrMessage.d.ts +7 -0
- package/dist/cjs/Message/TableMessage/TrMessage.js +37 -0
- package/dist/cjs/Message/TextMessage/TextMessage.d.ts +2 -1
- package/dist/cjs/Message/TextMessage/TextMessage.js +2 -2
- package/dist/cjs/Message/UserFeedback/CloseButton.d.ts +10 -0
- package/dist/cjs/Message/UserFeedback/CloseButton.js +14 -0
- package/dist/cjs/Message/UserFeedback/UserFeedback.d.ts +39 -0
- package/dist/cjs/Message/UserFeedback/UserFeedback.js +54 -0
- package/dist/cjs/Message/UserFeedback/UserFeedback.test.d.ts +1 -0
- package/dist/cjs/Message/UserFeedback/UserFeedback.test.js +133 -0
- package/dist/cjs/Message/UserFeedback/UserFeedbackComplete.d.ts +42 -0
- package/dist/cjs/Message/UserFeedback/UserFeedbackComplete.js +117 -0
- package/dist/cjs/Message/UserFeedback/UserFeedbackComplete.test.d.ts +1 -0
- package/dist/cjs/Message/UserFeedback/UserFeedbackComplete.test.js +249 -0
- package/dist/cjs/MessageBar/AttachButton.js +4 -2
- package/dist/cjs/MessageBar/MessageBar.d.ts +11 -4
- package/dist/cjs/MessageBar/MessageBar.js +127 -46
- package/dist/cjs/MessageBar/MessageBar.test.js +12 -4
- package/dist/cjs/MessageBar/MicrophoneButton.d.ts +1 -1
- package/dist/cjs/MessageBar/SendButton.js +3 -1
- package/dist/cjs/MessageBar/StopButton.js +3 -1
- package/dist/cjs/MessageBox/MessageBox.test.d.ts +1 -0
- package/dist/cjs/MessageBox/MessageBox.test.js +22 -0
- package/dist/cjs/PreviewAttachment/PreviewAttachment.test.d.ts +1 -0
- package/dist/cjs/PreviewAttachment/PreviewAttachment.test.js +28 -0
- package/dist/cjs/ResponseActions/ResponseActionButton.d.ts +4 -1
- package/dist/cjs/ResponseActions/ResponseActionButton.js +21 -6
- package/dist/cjs/ResponseActions/ResponseActions.d.ts +8 -2
- package/dist/cjs/ResponseActions/ResponseActions.js +7 -7
- package/dist/cjs/ResponseActions/ResponseActions.test.js +2 -2
- package/dist/cjs/Settings/SettingsForm.test.d.ts +1 -0
- package/dist/cjs/Settings/SettingsForm.test.js +26 -0
- package/dist/cjs/__mocks__/rehype-external-links.d.ts +2 -0
- package/dist/cjs/__mocks__/rehype-external-links.js +4 -0
- package/dist/cjs/__mocks__/rehype-sanitize.d.ts +2 -0
- package/dist/cjs/__mocks__/rehype-sanitize.js +4 -0
- package/dist/cjs/__mocks__/rehype-unwrap-images.d.ts +2 -0
- package/dist/cjs/__mocks__/rehype-unwrap-images.js +4 -0
- package/dist/cjs/index.d.ts +4 -0
- package/dist/cjs/index.js +7 -1
- package/dist/cjs/tracking/console_tracking_provider.d.ts +10 -0
- package/dist/cjs/tracking/console_tracking_provider.js +27 -0
- package/dist/cjs/tracking/index.d.ts +2 -0
- package/dist/cjs/tracking/index.js +23 -0
- package/dist/cjs/tracking/posthog_tracking_provider.d.ts +9 -0
- package/dist/cjs/tracking/posthog_tracking_provider.js +37 -0
- package/dist/cjs/tracking/segment_tracking_provider.d.ts +10 -0
- package/dist/cjs/tracking/segment_tracking_provider.js +50 -0
- package/dist/cjs/tracking/trackingProviderProxy.d.ts +9 -0
- package/dist/cjs/tracking/trackingProviderProxy.js +24 -0
- package/dist/cjs/tracking/tracking_api.d.ts +8 -0
- package/dist/cjs/tracking/tracking_api.js +2 -0
- package/dist/cjs/tracking/tracking_registry.d.ts +4 -0
- package/dist/cjs/tracking/tracking_registry.js +33 -0
- package/dist/cjs/tracking/tracking_spi.d.ts +9 -0
- package/dist/cjs/tracking/tracking_spi.js +2 -0
- package/dist/cjs/tracking/umami_tracking_provider.d.ts +14 -0
- package/dist/cjs/tracking/umami_tracking_provider.js +44 -0
- package/dist/css/main.css +420 -148
- package/dist/css/main.css.map +1 -1
- package/dist/dynamic/Compare/package.json +1 -0
- package/dist/dynamic/tracking/package.json +1 -0
- package/dist/esm/AttachmentEdit/AttachmentEdit.test.d.ts +1 -0
- package/dist/esm/AttachmentEdit/AttachmentEdit.test.js +47 -0
- package/dist/esm/Chatbot/Chatbot.d.ts +2 -1
- package/dist/esm/Chatbot/Chatbot.js +1 -0
- package/dist/esm/Chatbot/Chatbot.test.d.ts +1 -0
- package/dist/esm/Chatbot/Chatbot.test.js +23 -0
- package/dist/esm/ChatbotAlert/ChatbotAlert.test.d.ts +1 -0
- package/dist/esm/ChatbotAlert/ChatbotAlert.test.js +22 -0
- package/dist/esm/ChatbotContent/ChatbotContent.test.d.ts +1 -0
- package/dist/esm/ChatbotContent/ChatbotContent.test.js +13 -0
- package/dist/esm/ChatbotConversationHistoryNav/ChatbotConversationHistoryDropdown.d.ts +3 -3
- package/dist/esm/ChatbotConversationHistoryNav/ChatbotConversationHistoryDropdown.js +3 -1
- package/dist/esm/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.d.ts +27 -4
- package/dist/esm/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.js +24 -12
- package/dist/esm/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.test.js +99 -3
- package/dist/esm/ChatbotConversationHistoryNav/EmptyState.d.ts +11 -0
- package/dist/esm/ChatbotConversationHistoryNav/EmptyState.js +22 -0
- package/dist/esm/ChatbotConversationHistoryNav/LoadingState.d.ts +4 -0
- package/dist/esm/ChatbotConversationHistoryNav/LoadingState.js +38 -0
- package/dist/esm/ChatbotFooter/ChatbotFooter.test.d.ts +1 -0
- package/dist/esm/ChatbotFooter/ChatbotFooter.test.js +13 -0
- package/dist/esm/ChatbotFooter/ChatbotFooternote.test.d.ts +1 -0
- package/dist/esm/ChatbotFooter/ChatbotFooternote.test.js +82 -0
- package/dist/esm/ChatbotFooter/ChatbotFootnote.d.ts +1 -1
- package/dist/esm/ChatbotFooter/ChatbotFootnote.js +1 -1
- package/dist/esm/ChatbotHeader/ChatbotHeader.test.d.ts +1 -0
- package/dist/esm/ChatbotHeader/ChatbotHeader.test.js +13 -0
- package/dist/esm/ChatbotHeader/ChatbotHeaderActions.test.d.ts +1 -0
- package/dist/esm/ChatbotHeader/ChatbotHeaderActions.test.js +13 -0
- package/dist/esm/ChatbotHeader/ChatbotHeaderCloseButton.js +3 -1
- package/dist/esm/ChatbotHeader/ChatbotHeaderCloseButton.test.d.ts +1 -0
- package/dist/esm/ChatbotHeader/ChatbotHeaderCloseButton.test.js +15 -0
- package/dist/esm/ChatbotHeader/ChatbotHeaderMain.test.d.ts +1 -0
- package/dist/esm/ChatbotHeader/ChatbotHeaderMain.test.js +13 -0
- package/dist/esm/ChatbotHeader/ChatbotHeaderMenu.js +3 -1
- package/dist/esm/ChatbotHeader/ChatbotHeaderMenu.test.d.ts +1 -0
- package/dist/esm/ChatbotHeader/ChatbotHeaderMenu.test.js +15 -0
- package/dist/esm/ChatbotHeader/ChatbotHeaderOptionsDropdown.js +3 -1
- package/dist/esm/ChatbotHeader/ChatbotHeaderOptionsDropdown.test.d.ts +1 -0
- package/dist/esm/ChatbotHeader/ChatbotHeaderOptionsDropdown.test.js +38 -0
- package/dist/esm/ChatbotHeader/ChatbotHeaderSelectorDropdown.js +6 -4
- package/dist/esm/ChatbotHeader/ChatbotHeaderSelectorDropdown.test.d.ts +1 -0
- package/dist/esm/ChatbotHeader/ChatbotHeaderSelectorDropdown.test.js +36 -0
- package/dist/esm/ChatbotHeader/ChatbotHeaderTitle.d.ts +3 -1
- package/dist/esm/ChatbotHeader/ChatbotHeaderTitle.js +4 -2
- package/dist/esm/ChatbotHeader/ChatbotHeaderTitle.test.d.ts +1 -0
- package/dist/esm/ChatbotHeader/ChatbotHeaderTitle.test.js +50 -0
- package/dist/esm/ChatbotToggle/ChatbotToggle.js +3 -1
- package/dist/esm/ChatbotWelcomePrompt/ChatbotWelcomePrompt.test.js +19 -11
- package/dist/esm/Compare/Compare.d.ts +17 -0
- package/dist/esm/Compare/Compare.js +43 -0
- package/dist/esm/Compare/Compare.test.d.ts +1 -0
- package/dist/esm/Compare/Compare.test.js +15 -0
- package/dist/esm/Compare/index.d.ts +2 -0
- package/dist/esm/Compare/index.js +2 -0
- package/dist/esm/Message/ErrorMessage/ErrorMessage.d.ts +4 -0
- package/dist/esm/Message/ErrorMessage/ErrorMessage.js +21 -0
- package/dist/esm/Message/ImageMessage/ImageMessage.d.ts +4 -0
- package/dist/esm/Message/ImageMessage/ImageMessage.js +20 -0
- package/dist/esm/Message/LinkMessage/LinkMessage.d.ts +4 -0
- package/dist/esm/Message/LinkMessage/LinkMessage.js +25 -0
- package/dist/esm/Message/Message.d.ts +35 -8
- package/dist/esm/Message/Message.js +66 -16
- package/dist/esm/Message/Message.test.js +239 -3
- package/dist/esm/Message/QuickResponse/QuickResponse.d.ts +17 -0
- package/dist/esm/Message/QuickResponse/QuickResponse.js +27 -0
- package/dist/esm/Message/TableMessage/TableMessage.d.ts +20 -0
- package/dist/esm/Message/TableMessage/TableMessage.js +62 -0
- package/dist/esm/Message/TableMessage/TbodyMessage.d.ts +7 -0
- package/dist/esm/Message/TableMessage/TbodyMessage.js +28 -0
- package/dist/esm/Message/TableMessage/TdMessage.d.ts +5 -0
- package/dist/esm/Message/TableMessage/TdMessage.js +21 -0
- package/dist/esm/Message/TableMessage/ThMessage.d.ts +5 -0
- package/dist/esm/Message/TableMessage/ThMessage.js +21 -0
- package/dist/esm/Message/TableMessage/TheadMessage.d.ts +5 -0
- package/dist/esm/Message/TableMessage/TheadMessage.js +21 -0
- package/dist/esm/Message/TableMessage/TrMessage.d.ts +7 -0
- package/dist/esm/Message/TableMessage/TrMessage.js +32 -0
- package/dist/esm/Message/TextMessage/TextMessage.d.ts +2 -1
- package/dist/esm/Message/TextMessage/TextMessage.js +3 -3
- package/dist/esm/Message/UserFeedback/CloseButton.d.ts +10 -0
- package/dist/esm/Message/UserFeedback/CloseButton.js +9 -0
- package/dist/esm/Message/UserFeedback/UserFeedback.d.ts +39 -0
- package/dist/esm/Message/UserFeedback/UserFeedback.js +49 -0
- package/dist/esm/Message/UserFeedback/UserFeedback.test.d.ts +1 -0
- package/dist/esm/Message/UserFeedback/UserFeedback.test.js +128 -0
- package/dist/esm/Message/UserFeedback/UserFeedbackComplete.d.ts +42 -0
- package/dist/esm/Message/UserFeedback/UserFeedbackComplete.js +112 -0
- package/dist/esm/Message/UserFeedback/UserFeedbackComplete.test.d.ts +1 -0
- package/dist/esm/Message/UserFeedback/UserFeedbackComplete.test.js +244 -0
- package/dist/esm/MessageBar/AttachButton.js +4 -2
- package/dist/esm/MessageBar/MessageBar.d.ts +11 -4
- package/dist/esm/MessageBar/MessageBar.js +127 -46
- package/dist/esm/MessageBar/MessageBar.test.js +12 -4
- package/dist/esm/MessageBar/MicrophoneButton.d.ts +1 -1
- package/dist/esm/MessageBar/SendButton.js +3 -1
- package/dist/esm/MessageBar/StopButton.js +3 -1
- package/dist/esm/MessageBox/MessageBox.test.d.ts +1 -0
- package/dist/esm/MessageBox/MessageBox.test.js +17 -0
- package/dist/esm/PreviewAttachment/PreviewAttachment.test.d.ts +1 -0
- package/dist/esm/PreviewAttachment/PreviewAttachment.test.js +23 -0
- package/dist/esm/ResponseActions/ResponseActionButton.d.ts +4 -1
- package/dist/esm/ResponseActions/ResponseActionButton.js +18 -3
- package/dist/esm/ResponseActions/ResponseActions.d.ts +8 -2
- package/dist/esm/ResponseActions/ResponseActions.js +7 -7
- package/dist/esm/ResponseActions/ResponseActions.test.js +2 -2
- package/dist/esm/Settings/SettingsForm.test.d.ts +1 -0
- package/dist/esm/Settings/SettingsForm.test.js +21 -0
- package/dist/esm/__mocks__/rehype-external-links.d.ts +2 -0
- package/dist/esm/__mocks__/rehype-external-links.js +2 -0
- package/dist/esm/__mocks__/rehype-sanitize.d.ts +2 -0
- package/dist/esm/__mocks__/rehype-sanitize.js +2 -0
- package/dist/esm/__mocks__/rehype-unwrap-images.d.ts +2 -0
- package/dist/esm/__mocks__/rehype-unwrap-images.js +2 -0
- package/dist/esm/index.d.ts +4 -0
- package/dist/esm/index.js +4 -0
- package/dist/esm/tracking/console_tracking_provider.d.ts +10 -0
- package/dist/esm/tracking/console_tracking_provider.js +23 -0
- package/dist/esm/tracking/index.d.ts +2 -0
- package/dist/esm/tracking/index.js +2 -0
- package/dist/esm/tracking/posthog_tracking_provider.d.ts +9 -0
- package/dist/esm/tracking/posthog_tracking_provider.js +33 -0
- package/dist/esm/tracking/segment_tracking_provider.d.ts +10 -0
- package/dist/esm/tracking/segment_tracking_provider.js +46 -0
- package/dist/esm/tracking/trackingProviderProxy.d.ts +9 -0
- package/dist/esm/tracking/trackingProviderProxy.js +22 -0
- package/dist/esm/tracking/tracking_api.d.ts +8 -0
- package/dist/esm/tracking/tracking_api.js +1 -0
- package/dist/esm/tracking/tracking_registry.d.ts +4 -0
- package/dist/esm/tracking/tracking_registry.js +26 -0
- package/dist/esm/tracking/tracking_spi.d.ts +9 -0
- package/dist/esm/tracking/tracking_spi.js +1 -0
- package/dist/esm/tracking/umami_tracking_provider.d.ts +14 -0
- package/dist/esm/tracking/umami_tracking_provider.js +40 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +8 -3
- package/patternfly-docs/content/extensions/chatbot/about-chatbot.md +8 -2
- package/patternfly-docs/content/extensions/chatbot/design-guidelines.md +192 -15
- package/patternfly-docs/content/extensions/chatbot/examples/Analytics/Analytics.md +219 -0
- package/patternfly-docs/content/extensions/chatbot/examples/Messages/AttachmentError.tsx +2 -2
- package/patternfly-docs/content/extensions/chatbot/examples/Messages/BotMessage.tsx +214 -12
- package/patternfly-docs/content/extensions/chatbot/examples/Messages/FileDropZone.tsx +2 -1
- package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithAttachment.tsx +2 -2
- package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithCustomResponseActions.tsx +1 -1
- package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithFeedback.tsx +71 -0
- package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithFeedbackTimeout.tsx +27 -0
- package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithQuickResponses.tsx +1 -1
- package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithQuickStart.tsx +2 -2
- package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithResponseActions.tsx +1 -1
- package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithSources.tsx +1 -1
- package/patternfly-docs/content/extensions/chatbot/examples/Messages/Messages.md +49 -8
- package/patternfly-docs/content/extensions/chatbot/examples/Messages/UserMessage.tsx +244 -14
- package/patternfly-docs/content/extensions/chatbot/examples/Messages/UserMessageWithExtraContent.tsx +54 -0
- package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotFooter.tsx +1 -1
- package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotFootnote.tsx +5 -5
- package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotHeaderBasic.tsx +1 -1
- package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotHeaderDrawer.tsx +36 -3
- package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotHeaderDrawerNavigation.tsx +67 -0
- package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotHeaderDrawerResizable.tsx +94 -0
- package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotMessageBarAttach.tsx +1 -1
- package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotWelcomeInteraction.tsx +1 -1
- package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotWelcomePrompt.tsx +7 -7
- package/patternfly-docs/content/extensions/chatbot/examples/UI/UI.md +21 -6
- package/patternfly-docs/content/extensions/chatbot/examples/demos/AttachmentDemos.md +14 -0
- package/patternfly-docs/content/extensions/chatbot/examples/demos/Chatbot.md +39 -1
- package/patternfly-docs/content/extensions/chatbot/examples/demos/Chatbot.tsx +48 -35
- package/patternfly-docs/content/extensions/chatbot/examples/demos/ChatbotAttachment.tsx +2 -2
- package/patternfly-docs/content/extensions/chatbot/examples/demos/ChatbotAttachmentMenu.tsx +3 -3
- package/patternfly-docs/content/extensions/chatbot/examples/demos/ChatbotInDrawer.tsx +453 -0
- package/patternfly-docs/content/extensions/chatbot/examples/demos/EmbeddedChatbot.tsx +11 -11
- package/patternfly-docs/content/extensions/chatbot/examples/demos/EmbeddedComparisonChatbot.tsx +206 -0
- package/patternfly-docs/content/extensions/chatbot/examples/demos/Feedback.tsx +104 -0
- package/patternfly-docs/content/extensions/chatbot/img/ai-action-inpage.svg +85 -0
- package/patternfly-docs/content/extensions/chatbot/img/ai-action-message.svg +63 -0
- package/patternfly-docs/content/extensions/chatbot/img/analytics-example.svg +127 -0
- package/patternfly-docs/content/extensions/chatbot/img/attached-file.svg +24 -29
- package/patternfly-docs/content/extensions/chatbot/img/attachment-menu.svg +4 -4
- package/patternfly-docs/content/extensions/chatbot/img/attachment-unsent.svg +30 -58
- package/patternfly-docs/content/extensions/chatbot/img/chatbot-analytics.svg +51 -0
- package/patternfly-docs/content/extensions/chatbot/img/chatbot-elements.svg +11 -12
- package/patternfly-docs/content/extensions/chatbot/img/chatbot-quickstarts-tile.svg +58 -0
- package/patternfly-docs/content/extensions/chatbot/img/chatbot-settings.svg +83 -0
- package/patternfly-docs/content/extensions/chatbot/img/comparison.svg +45 -0
- package/patternfly-docs/content/extensions/chatbot/img/conversation-history.svg +6 -29
- package/patternfly-docs/content/extensions/chatbot/img/docked.svg +259 -241
- package/patternfly-docs/content/extensions/chatbot/img/drawer.svg +255 -0
- package/patternfly-docs/content/extensions/chatbot/img/error-state.svg +30 -0
- package/patternfly-docs/content/extensions/chatbot/img/feedback-form.svg +88 -0
- package/patternfly-docs/content/extensions/chatbot/img/footnote.svg +1 -1
- package/patternfly-docs/content/extensions/chatbot/img/fullscreen.svg +25 -16
- package/patternfly-docs/content/extensions/chatbot/img/listening-pulse.svg +22 -0
- package/patternfly-docs/content/extensions/chatbot/img/listening.svg +1 -1
- package/patternfly-docs/content/extensions/chatbot/img/loading-state.svg +28 -0
- package/patternfly-docs/content/extensions/chatbot/img/masthead-toggle-notification.svg +49 -0
- package/patternfly-docs/content/extensions/chatbot/img/masthead-toggle.svg +75 -0
- package/patternfly-docs/content/extensions/chatbot/img/message-bar-elements.svg +3 -3
- package/patternfly-docs/content/extensions/chatbot/img/message-elements.svg +84 -142
- package/patternfly-docs/content/extensions/chatbot/img/message-feedback.svg +52 -0
- package/patternfly-docs/content/extensions/chatbot/img/message-responses.svg +54 -0
- package/patternfly-docs/content/extensions/chatbot/img/new-chat-emptystate.svg +27 -0
- package/patternfly-docs/content/extensions/chatbot/img/no-results-emptystate.svg +27 -0
- package/patternfly-docs/content/extensions/chatbot/img/overlay.svg +54 -39
- package/patternfly-docs/content/extensions/chatbot/img/posthog.svg +30 -0
- package/patternfly-docs/content/extensions/chatbot/img/segment.svg +36 -0
- package/patternfly-docs/content/extensions/chatbot/img/settings-menu.svg +122 -0
- package/patternfly-docs/content/extensions/chatbot/img/source-tile.svg +62 -0
- package/patternfly-docs/content/extensions/chatbot/img/thank-you-card.svg +81 -0
- package/patternfly-docs/content/extensions/chatbot/img/toggle-customizations.svg +12 -0
- package/patternfly-docs/content/extensions/chatbot/img/toggle-tooltips.svg +38 -0
- package/patternfly-docs/content/extensions/chatbot/img/umami.svg +30 -0
- package/patternfly-docs/content/extensions/chatbot/img/welcome-elements.svg +82 -0
- package/patternfly-docs/content/extensions/chatbot/img/welcome-message.svg +94 -0
- package/src/AttachMenu/AttachMenu.scss +1 -1
- package/src/AttachmentEdit/AttachmentEdit.test.tsx +55 -0
- package/src/Chatbot/Chatbot.scss +20 -1
- package/src/Chatbot/Chatbot.test.tsx +31 -0
- package/src/Chatbot/Chatbot.tsx +2 -1
- package/src/ChatbotAlert/ChatbotAlert.test.tsx +31 -0
- package/src/ChatbotContent/ChatbotContent.scss +1 -0
- package/src/ChatbotContent/ChatbotContent.test.tsx +15 -0
- package/src/ChatbotConversationHistoryNav/ChatbotConversationHistoryDropdown.tsx +10 -4
- package/src/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.scss +24 -1
- package/src/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.test.tsx +242 -3
- package/src/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.tsx +94 -26
- package/src/ChatbotConversationHistoryNav/EmptyState.tsx +44 -0
- package/src/ChatbotConversationHistoryNav/LoadingState.tsx +38 -0
- package/src/ChatbotFooter/ChatbotFooter.scss +8 -4
- package/src/ChatbotFooter/ChatbotFooter.test.tsx +15 -0
- package/src/ChatbotFooter/ChatbotFooternote.test.tsx +84 -0
- package/src/ChatbotFooter/ChatbotFootnote.tsx +2 -2
- package/src/ChatbotHeader/ChatbotHeader.scss +5 -6
- package/src/ChatbotHeader/ChatbotHeader.test.tsx +15 -0
- package/src/ChatbotHeader/ChatbotHeaderActions.test.tsx +17 -0
- package/src/ChatbotHeader/ChatbotHeaderCloseButton.test.tsx +20 -0
- package/src/ChatbotHeader/ChatbotHeaderCloseButton.tsx +7 -1
- package/src/ChatbotHeader/ChatbotHeaderMain.test.tsx +17 -0
- package/src/ChatbotHeader/ChatbotHeaderMenu.test.tsx +19 -0
- package/src/ChatbotHeader/ChatbotHeaderMenu.tsx +7 -1
- package/src/ChatbotHeader/ChatbotHeaderOptionsDropdown.test.tsx +45 -0
- package/src/ChatbotHeader/ChatbotHeaderOptionsDropdown.tsx +8 -1
- package/src/ChatbotHeader/ChatbotHeaderSelectorDropdown.test.tsx +43 -0
- package/src/ChatbotHeader/ChatbotHeaderSelectorDropdown.tsx +11 -4
- package/src/ChatbotHeader/ChatbotHeaderTitle.test.tsx +75 -0
- package/src/ChatbotHeader/ChatbotHeaderTitle.tsx +7 -2
- package/src/ChatbotModal/ChatbotModal.scss +12 -12
- package/src/ChatbotToggle/ChatbotToggle.tsx +6 -1
- package/src/ChatbotWelcomePrompt/ChatbotWelcomePrompt.scss +2 -0
- package/src/ChatbotWelcomePrompt/ChatbotWelcomePrompt.test.tsx +26 -18
- package/src/ChatbotWelcomePrompt/__snapshots__/ChatbotWelcomePrompt.test.tsx.snap +2 -2
- package/src/CodeModal/CodeModal.scss +7 -4
- package/src/Compare/Compare.scss +72 -0
- package/src/Compare/Compare.test.tsx +31 -0
- package/src/Compare/Compare.tsx +98 -0
- package/src/Compare/index.ts +2 -0
- package/src/FileDetails/FileDetails.scss +1 -1
- package/src/FileDetailsLabel/FileDetailsLabel.scss +2 -2
- package/src/FileDropZone/__snapshots__/FileDropZone.test.tsx.snap +1 -0
- package/src/Message/CodeBlockMessage/CodeBlockMessage.scss +4 -4
- package/src/Message/ErrorMessage/ErrorMessage.tsx +14 -0
- package/src/Message/ImageMessage/ImageMessage.scss +9 -0
- package/src/Message/ImageMessage/ImageMessage.tsx +14 -0
- package/src/Message/LinkMessage/LinkMessage.tsx +34 -0
- package/src/Message/ListMessage/ListMessage.scss +6 -6
- package/src/Message/Message.scss +4 -26
- package/src/Message/Message.test.tsx +313 -3
- package/src/Message/Message.tsx +130 -31
- package/src/Message/MessageLoading.scss +2 -2
- package/src/Message/QuickResponse/QuickResponse.scss +33 -0
- package/src/Message/QuickResponse/QuickResponse.tsx +54 -0
- package/src/Message/QuickStarts/QuickStartTile.scss +0 -1
- package/src/Message/TableMessage/TableMessage.scss +23 -0
- package/src/Message/TableMessage/TableMessage.tsx +83 -0
- package/src/Message/TableMessage/TbodyMessage.tsx +20 -0
- package/src/Message/TableMessage/TdMessage.tsx +11 -0
- package/src/Message/TableMessage/ThMessage.tsx +11 -0
- package/src/Message/TableMessage/TheadMessage.tsx +11 -0
- package/src/Message/TableMessage/TrMessage.tsx +27 -0
- package/src/Message/TextMessage/TextMessage.scss +21 -12
- package/src/Message/TextMessage/TextMessage.tsx +3 -3
- package/src/Message/UserFeedback/CloseButton.tsx +21 -0
- package/src/Message/UserFeedback/UserFeedback.scss +53 -0
- package/src/Message/UserFeedback/UserFeedback.test.tsx +236 -0
- package/src/Message/UserFeedback/UserFeedback.tsx +128 -0
- package/src/Message/UserFeedback/UserFeedbackComplete.test.tsx +255 -0
- package/src/Message/UserFeedback/UserFeedbackComplete.tsx +211 -0
- package/src/MessageBar/AttachButton.scss +19 -3
- package/src/MessageBar/AttachButton.tsx +3 -1
- package/src/MessageBar/MessageBar.scss +58 -24
- package/src/MessageBar/MessageBar.test.tsx +12 -4
- package/src/MessageBar/MessageBar.tsx +164 -65
- package/src/MessageBar/MicrophoneButton.scss +8 -8
- package/src/MessageBar/MicrophoneButton.tsx +1 -1
- package/src/MessageBar/SendButton.tsx +2 -0
- package/src/MessageBar/StopButton.scss +17 -3
- package/src/MessageBar/StopButton.tsx +2 -0
- package/src/MessageBox/JumpButton.scss +6 -6
- package/src/MessageBox/MessageBox.scss +1 -0
- package/src/MessageBox/MessageBox.test.tsx +26 -0
- package/src/PreviewAttachment/PreviewAttachment.test.tsx +51 -0
- package/src/ResponseActions/ResponseActionButton.tsx +14 -2
- package/src/ResponseActions/ResponseActions.scss +2 -2
- package/src/ResponseActions/ResponseActions.test.tsx +4 -2
- package/src/ResponseActions/ResponseActions.tsx +26 -2
- package/src/Settings/Settings.scss +2 -2
- package/src/Settings/SettingsForm.test.tsx +28 -0
- package/src/SourceDetailsMenuItem/SourceDetailsMenuItem.scss +2 -2
- package/src/SourcesCard/SourcesCard.scss +9 -3
- package/src/TermsOfUse/TermsOfUse.scss +1 -1
- package/src/__mocks__/rehype-external-links.ts +3 -0
- package/src/__mocks__/rehype-sanitize.ts +3 -0
- package/src/__mocks__/rehype-unwrap-images.tsx +3 -0
- package/src/index.ts +6 -0
- package/src/main.scss +5 -6
- package/src/tracking/console_tracking_provider.ts +30 -0
- package/src/tracking/index.ts +3 -0
- package/src/tracking/posthog_tracking_provider.ts +42 -0
- package/src/tracking/segment_tracking_provider.ts +62 -0
- package/src/tracking/trackingProviderProxy.ts +28 -0
- package/src/tracking/tracking_api.ts +11 -0
- package/src/tracking/tracking_registry.ts +33 -0
- package/src/tracking/tracking_spi.ts +14 -0
- package/src/tracking/umami_tracking_provider.ts +54 -0
@@ -0,0 +1,21 @@
|
|
1
|
+
// ============================================================================
|
2
|
+
// Chatbot Main - Message - Content - Error
|
3
|
+
// ============================================================================
|
4
|
+
var __rest = (this && this.__rest) || function (s, e) {
|
5
|
+
var t = {};
|
6
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
7
|
+
t[p] = s[p];
|
8
|
+
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
9
|
+
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
10
|
+
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
11
|
+
t[p[i]] = s[p[i]];
|
12
|
+
}
|
13
|
+
return t;
|
14
|
+
};
|
15
|
+
import React from 'react';
|
16
|
+
import { Alert } from '@patternfly/react-core';
|
17
|
+
const ErrorMessage = (_a) => {
|
18
|
+
var { title, actionLinks, children } = _a, props = __rest(_a, ["title", "actionLinks", "children"]);
|
19
|
+
return (React.createElement(Alert, Object.assign({ isInline: true, variant: "danger", title: title, actionLinks: actionLinks }, props), children));
|
20
|
+
};
|
21
|
+
export default ErrorMessage;
|
@@ -0,0 +1,20 @@
|
|
1
|
+
// ============================================================================
|
2
|
+
// Chatbot Main - Message - Content - Image
|
3
|
+
// ============================================================================
|
4
|
+
var __rest = (this && this.__rest) || function (s, e) {
|
5
|
+
var t = {};
|
6
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
7
|
+
t[p] = s[p];
|
8
|
+
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
9
|
+
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
10
|
+
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
11
|
+
t[p[i]] = s[p[i]];
|
12
|
+
}
|
13
|
+
return t;
|
14
|
+
};
|
15
|
+
import React from 'react';
|
16
|
+
const ImageMessage = (_a) => {
|
17
|
+
var { children } = _a, props = __rest(_a, ["children"]);
|
18
|
+
return (React.createElement("img", Object.assign({ className: "pf-chatbot__message-image" }, props), children));
|
19
|
+
};
|
20
|
+
export default ImageMessage;
|
@@ -0,0 +1,25 @@
|
|
1
|
+
// ============================================================================
|
2
|
+
// Chatbot Main - Message - Content - Link
|
3
|
+
// ============================================================================
|
4
|
+
var __rest = (this && this.__rest) || function (s, e) {
|
5
|
+
var t = {};
|
6
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
7
|
+
t[p] = s[p];
|
8
|
+
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
9
|
+
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
10
|
+
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
11
|
+
t[p[i]] = s[p[i]];
|
12
|
+
}
|
13
|
+
return t;
|
14
|
+
};
|
15
|
+
import React from 'react';
|
16
|
+
import { Button } from '@patternfly/react-core';
|
17
|
+
import { ExternalLinkSquareAltIcon } from '@patternfly/react-icons';
|
18
|
+
const LinkMessage = (_a) => {
|
19
|
+
var { children, target, href } = _a, props = __rest(_a, ["children", "target", "href"]);
|
20
|
+
if (target === '_blank') {
|
21
|
+
return (React.createElement(Button, Object.assign({ component: "a", variant: "link", href: href, icon: React.createElement(ExternalLinkSquareAltIcon, null), iconPosition: "end", isInline: true, target: target }, props), children));
|
22
|
+
}
|
23
|
+
return (React.createElement(Button, Object.assign({ isInline: true, component: "a", href: href, variant: "link" }, props), children));
|
24
|
+
};
|
25
|
+
export default LinkMessage;
|
@@ -1,13 +1,13 @@
|
|
1
|
-
import React from 'react';
|
2
|
-
import { AvatarProps, LabelGroupProps
|
1
|
+
import React, { ReactNode } from 'react';
|
2
|
+
import { AlertProps, AvatarProps, LabelGroupProps } from '@patternfly/react-core';
|
3
3
|
import { ActionProps } from '../ResponseActions/ResponseActions';
|
4
4
|
import { SourcesCardProps } from '../SourcesCard';
|
5
5
|
import { QuickStart, QuickstartAction } from './QuickStarts/types';
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
}
|
6
|
+
import QuickResponse from './QuickResponse/QuickResponse';
|
7
|
+
import { UserFeedbackProps } from './UserFeedback/UserFeedback';
|
8
|
+
import { UserFeedbackCompleteProps } from './UserFeedback/UserFeedbackComplete';
|
9
|
+
import { TableProps } from '@patternfly/react-table';
|
10
|
+
import { PluggableList } from 'react-markdown/lib';
|
11
11
|
export interface MessageAttachment {
|
12
12
|
/** Name of file attached to the message */
|
13
13
|
name: string;
|
@@ -26,6 +26,14 @@ export interface MessageAttachment {
|
|
26
26
|
/** Custom test id for the loading spinner in the attachment component */
|
27
27
|
spinnerTestId?: string;
|
28
28
|
}
|
29
|
+
export interface MessageExtraContent {
|
30
|
+
/** Content to display before the main content */
|
31
|
+
beforeMainContent?: ReactNode;
|
32
|
+
/** Content to display after the main content */
|
33
|
+
afterMainContent?: ReactNode;
|
34
|
+
/** Content to display at the end */
|
35
|
+
endContent?: ReactNode;
|
36
|
+
}
|
29
37
|
export interface MessageProps extends Omit<React.HTMLProps<HTMLDivElement>, 'role'> {
|
30
38
|
/** Unique id for message */
|
31
39
|
id?: string;
|
@@ -33,6 +41,8 @@ export interface MessageProps extends Omit<React.HTMLProps<HTMLDivElement>, 'rol
|
|
33
41
|
role: 'user' | 'bot';
|
34
42
|
/** Message content */
|
35
43
|
content?: string;
|
44
|
+
/** Extra Message content */
|
45
|
+
extraContent?: MessageExtraContent;
|
36
46
|
/** Name of the user */
|
37
47
|
name?: string;
|
38
48
|
/** Avatar src for the user */
|
@@ -61,6 +71,10 @@ export interface MessageProps extends Omit<React.HTMLProps<HTMLDivElement>, 'rol
|
|
61
71
|
quickResponses?: QuickResponse[];
|
62
72
|
/** Props for quick responses container */
|
63
73
|
quickResponseContainerProps?: Omit<LabelGroupProps, 'ref'>;
|
74
|
+
/** Props for user feedback card */
|
75
|
+
userFeedbackForm?: Omit<UserFeedbackProps, 'ref'>;
|
76
|
+
/** Props for user feedback response */
|
77
|
+
userFeedbackComplete?: Omit<UserFeedbackCompleteProps, 'ref'>;
|
64
78
|
/** Whether avatar is round */
|
65
79
|
hasRoundAvatar?: boolean;
|
66
80
|
/** Any additional props applied to the avatar, for additional customization */
|
@@ -78,6 +92,19 @@ export interface MessageProps extends Omit<React.HTMLProps<HTMLDivElement>, 'rol
|
|
78
92
|
onClick?: () => void;
|
79
93
|
action?: QuickstartAction;
|
80
94
|
};
|
95
|
+
/** Turns the container into a live region so that changes to content within the Message, such as appending a feedback card, are reliably announced to assistive technology. */
|
96
|
+
isLiveRegion?: boolean;
|
97
|
+
/** Ref applied to message */
|
98
|
+
innerRef?: React.Ref<HTMLDivElement>;
|
99
|
+
/** Props for table message. It is important to include a detailed aria-label that describes the purpose of the table. */
|
100
|
+
tableProps?: Required<Pick<TableProps, 'aria-label'>> & TableProps;
|
101
|
+
/** Additional rehype plugins passed from the consumer */
|
102
|
+
additionalRehypePlugins?: PluggableList;
|
103
|
+
/** Whether to open links in message in new tab. */
|
104
|
+
openLinkInNewTab?: boolean;
|
105
|
+
/** Optional inline error message that can be displayed in the message */
|
106
|
+
error?: AlertProps;
|
81
107
|
}
|
82
|
-
export declare const
|
108
|
+
export declare const MessageBase: React.FunctionComponent<MessageProps>;
|
109
|
+
declare const Message: React.ForwardRefExoticComponent<Omit<MessageProps, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
83
110
|
export default Message;
|
@@ -15,7 +15,7 @@ var __rest = (this && this.__rest) || function (s, e) {
|
|
15
15
|
import React from 'react';
|
16
16
|
import Markdown from 'react-markdown';
|
17
17
|
import remarkGfm from 'remark-gfm';
|
18
|
-
import { Avatar,
|
18
|
+
import { Avatar, ContentVariants, Label, Timestamp, Truncate } from '@patternfly/react-core';
|
19
19
|
import MessageLoading from './MessageLoading';
|
20
20
|
import CodeBlockMessage from './CodeBlockMessage/CodeBlockMessage';
|
21
21
|
import TextMessage from './TextMessage/TextMessage';
|
@@ -26,8 +26,31 @@ import ListItemMessage from './ListMessage/ListItemMessage';
|
|
26
26
|
import UnorderedListMessage from './ListMessage/UnorderedListMessage';
|
27
27
|
import OrderedListMessage from './ListMessage/OrderedListMessage';
|
28
28
|
import QuickStartTile from './QuickStarts/QuickStartTile';
|
29
|
-
|
30
|
-
|
29
|
+
import QuickResponse from './QuickResponse/QuickResponse';
|
30
|
+
import UserFeedback from './UserFeedback/UserFeedback';
|
31
|
+
import UserFeedbackComplete from './UserFeedback/UserFeedbackComplete';
|
32
|
+
import TableMessage from './TableMessage/TableMessage';
|
33
|
+
import TrMessage from './TableMessage/TrMessage';
|
34
|
+
import TdMessage from './TableMessage/TdMessage';
|
35
|
+
import TbodyMessage from './TableMessage/TbodyMessage';
|
36
|
+
import TheadMessage from './TableMessage/TheadMessage';
|
37
|
+
import ThMessage from './TableMessage/ThMessage';
|
38
|
+
import ImageMessage from './ImageMessage/ImageMessage';
|
39
|
+
import rehypeUnwrapImages from 'rehype-unwrap-images';
|
40
|
+
import rehypeExternalLinks from 'rehype-external-links';
|
41
|
+
import rehypeSanitize from 'rehype-sanitize';
|
42
|
+
import LinkMessage from './LinkMessage/LinkMessage';
|
43
|
+
import ErrorMessage from './ErrorMessage/ErrorMessage';
|
44
|
+
export const MessageBase = (_a) => {
|
45
|
+
var { role, content, extraContent, name, avatar, timestamp, isLoading, actions, sources, botWord = 'AI', loadingWord = 'Loading message', codeBlockProps, quickResponses, quickResponseContainerProps = { numLabels: 5 }, attachments, hasRoundAvatar = true, avatarProps, quickStarts, userFeedbackForm, userFeedbackComplete, isLiveRegion = true, innerRef, tableProps, openLinkInNewTab = true, additionalRehypePlugins = [], error } = _a, props = __rest(_a, ["role", "content", "extraContent", "name", "avatar", "timestamp", "isLoading", "actions", "sources", "botWord", "loadingWord", "codeBlockProps", "quickResponses", "quickResponseContainerProps", "attachments", "hasRoundAvatar", "avatarProps", "quickStarts", "userFeedbackForm", "userFeedbackComplete", "isLiveRegion", "innerRef", "tableProps", "openLinkInNewTab", "additionalRehypePlugins", "error"]);
|
46
|
+
const { beforeMainContent, afterMainContent, endContent } = extraContent || {};
|
47
|
+
let rehypePlugins = [rehypeUnwrapImages];
|
48
|
+
if (openLinkInNewTab) {
|
49
|
+
rehypePlugins = rehypePlugins.concat([[rehypeExternalLinks, { target: '_blank' }, rehypeSanitize]]);
|
50
|
+
}
|
51
|
+
if (additionalRehypePlugins) {
|
52
|
+
rehypePlugins.push(...additionalRehypePlugins);
|
53
|
+
}
|
31
54
|
let avatarClassName;
|
32
55
|
if (avatarProps && 'className' in avatarProps) {
|
33
56
|
const { className } = avatarProps, rest = __rest(avatarProps, ["className"]);
|
@@ -37,7 +60,7 @@ export const Message = (_a) => {
|
|
37
60
|
// Keep timestamps consistent between Timestamp component and aria-label
|
38
61
|
const date = new Date();
|
39
62
|
const dateString = timestamp !== null && timestamp !== void 0 ? timestamp : `${date.toLocaleDateString()} ${date.toLocaleTimeString()}`;
|
40
|
-
return (React.createElement("section", Object.assign({ "aria-label": `Message from ${role} - ${dateString}`, className: `pf-chatbot__message pf-chatbot__message--${role}
|
63
|
+
return (React.createElement("section", Object.assign({ "aria-label": `Message from ${role} - ${dateString}`, className: `pf-chatbot__message pf-chatbot__message--${role}`, "aria-live": isLiveRegion ? 'polite' : undefined, "aria-atomic": isLiveRegion ? false : undefined, ref: innerRef }, props),
|
41
64
|
React.createElement(Avatar, Object.assign({ className: `pf-chatbot__message-avatar ${hasRoundAvatar ? 'pf-chatbot__message-avatar--round' : ''} ${avatarClassName ? avatarClassName : ''}`, src: avatar, alt: "" }, avatarProps)),
|
42
65
|
React.createElement("div", { className: "pf-chatbot__message-contents" },
|
43
66
|
React.createElement("div", { className: "pf-chatbot__message-meta" },
|
@@ -47,24 +70,51 @@ export const Message = (_a) => {
|
|
47
70
|
React.createElement(Timestamp, { date: date }, timestamp)),
|
48
71
|
React.createElement("div", { className: "pf-chatbot__message-response" },
|
49
72
|
React.createElement("div", { className: "pf-chatbot__message-and-actions" },
|
50
|
-
isLoading ? (React.createElement(MessageLoading, { loadingWord: loadingWord })) : (React.createElement(
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
73
|
+
isLoading ? (React.createElement(MessageLoading, { loadingWord: loadingWord })) : (React.createElement(React.Fragment, null,
|
74
|
+
beforeMainContent && React.createElement(React.Fragment, null, beforeMainContent),
|
75
|
+
error ? (React.createElement(ErrorMessage, Object.assign({}, error))) : (React.createElement(Markdown, { components: {
|
76
|
+
p: (props) => React.createElement(TextMessage, Object.assign({ component: ContentVariants.p }, props)),
|
77
|
+
code: (_a) => {
|
78
|
+
var { children } = _a, props = __rest(_a, ["children"]);
|
79
|
+
return (React.createElement(CodeBlockMessage, Object.assign({}, props, codeBlockProps), children));
|
80
|
+
},
|
81
|
+
h1: (props) => React.createElement(TextMessage, Object.assign({ component: ContentVariants.h1 }, props)),
|
82
|
+
h2: (props) => React.createElement(TextMessage, Object.assign({ component: ContentVariants.h2 }, props)),
|
83
|
+
h3: (props) => React.createElement(TextMessage, Object.assign({ component: ContentVariants.h3 }, props)),
|
84
|
+
h4: (props) => React.createElement(TextMessage, Object.assign({ component: ContentVariants.h4 }, props)),
|
85
|
+
h5: (props) => React.createElement(TextMessage, Object.assign({ component: ContentVariants.h5 }, props)),
|
86
|
+
h6: (props) => React.createElement(TextMessage, Object.assign({ component: ContentVariants.h6 }, props)),
|
87
|
+
blockquote: (props) => React.createElement(TextMessage, Object.assign({ component: ContentVariants.blockquote }, props)),
|
88
|
+
ul: (props) => React.createElement(UnorderedListMessage, Object.assign({}, props)),
|
89
|
+
ol: (props) => React.createElement(OrderedListMessage, Object.assign({}, props)),
|
90
|
+
li: (props) => React.createElement(ListItemMessage, Object.assign({}, props)),
|
91
|
+
table: (props) => React.createElement(TableMessage, Object.assign({}, props, tableProps)),
|
92
|
+
tbody: (props) => React.createElement(TbodyMessage, Object.assign({}, props)),
|
93
|
+
thead: (props) => React.createElement(TheadMessage, Object.assign({}, props)),
|
94
|
+
tr: (props) => React.createElement(TrMessage, Object.assign({}, props)),
|
95
|
+
td: (props) => {
|
96
|
+
// Conflicts with Td type
|
97
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
98
|
+
const { width } = props, rest = __rest(props, ["width"]);
|
99
|
+
return React.createElement(TdMessage, Object.assign({}, rest));
|
100
|
+
},
|
101
|
+
th: (props) => React.createElement(ThMessage, Object.assign({}, props)),
|
102
|
+
img: (props) => React.createElement(ImageMessage, Object.assign({}, props)),
|
103
|
+
a: (props) => (React.createElement(LinkMessage, { href: props.href, rel: props.rel, target: props.target }, props.children))
|
104
|
+
}, remarkPlugins: [remarkGfm], rehypePlugins: rehypePlugins }, content)),
|
105
|
+
afterMainContent && React.createElement(React.Fragment, null, afterMainContent))),
|
57
106
|
!isLoading && sources && React.createElement(SourcesCard, Object.assign({}, sources)),
|
58
107
|
quickStarts && quickStarts.quickStart && (React.createElement(QuickStartTile, { quickStart: quickStarts.quickStart, onSelectQuickStart: quickStarts.onSelectQuickStart, minuteWord: quickStarts.minuteWord, minuteWordPlural: quickStarts.minuteWordPlural, prerequisiteWord: quickStarts.prerequisiteWord, prerequisiteWordPlural: quickStarts.prerequisiteWordPlural, quickStartButtonAriaLabel: quickStarts.quickStartButtonAriaLabel })),
|
59
108
|
!isLoading && actions && React.createElement(ResponseActions, { actions: actions }),
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
})))),
|
109
|
+
userFeedbackForm && React.createElement(UserFeedback, Object.assign({}, userFeedbackForm, { timestamp: dateString })),
|
110
|
+
userFeedbackComplete && React.createElement(UserFeedbackComplete, Object.assign({}, userFeedbackComplete, { timestamp: dateString })),
|
111
|
+
!isLoading && quickResponses && (React.createElement(QuickResponse, { quickResponses: quickResponses, quickResponseContainerProps: quickResponseContainerProps }))),
|
64
112
|
attachments && (React.createElement("div", { className: "pf-chatbot__message-attachments-container" }, attachments.map((attachment) => {
|
65
113
|
var _a;
|
66
114
|
return (React.createElement("div", { key: (_a = attachment.id) !== null && _a !== void 0 ? _a : attachment.name, className: "pf-chatbot__message-attachment" },
|
67
115
|
React.createElement(FileDetailsLabel, { fileName: attachment.name, fileId: attachment.id, onClose: attachment.onClose, onClick: attachment.onClick, isLoading: attachment.isLoading, closeButtonAriaLabel: attachment.closeButtonAriaLabel, languageTestId: attachment.languageTestId, spinnerTestId: attachment.spinnerTestId })));
|
68
|
-
})))
|
116
|
+
}))),
|
117
|
+
!isLoading && endContent && React.createElement(React.Fragment, null, endContent)))));
|
69
118
|
};
|
119
|
+
const Message = React.forwardRef((props, ref) => (React.createElement(MessageBase, Object.assign({ innerRef: ref }, props))));
|
70
120
|
export default Message;
|
@@ -14,6 +14,8 @@ import Message from './Message';
|
|
14
14
|
import userEvent from '@testing-library/user-event';
|
15
15
|
import { monitorSampleAppQuickStart } from './QuickStarts/monitor-sampleapp-quickstart';
|
16
16
|
import { monitorSampleAppQuickStartWithImage } from './QuickStarts/monitor-sampleapp-quickstart-with-image';
|
17
|
+
import rehypeExternalLinks from '../__mocks__/rehype-external-links';
|
18
|
+
import { AlertActionLink } from '@patternfly/react-core';
|
17
19
|
const ALL_ACTIONS = [
|
18
20
|
{ label: /Good response/i },
|
19
21
|
{ label: /Bad response/i },
|
@@ -72,6 +74,74 @@ const ORDERED_LIST_WITH_CODE = `
|
|
72
74
|
|
73
75
|
3. Item 3
|
74
76
|
`;
|
77
|
+
const HEADING = `
|
78
|
+
# h1 Heading
|
79
|
+
|
80
|
+
## h2 Heading
|
81
|
+
|
82
|
+
### h3 Heading
|
83
|
+
|
84
|
+
#### h4 Heading
|
85
|
+
|
86
|
+
##### h5 Heading
|
87
|
+
|
88
|
+
###### h6 Heading
|
89
|
+
`;
|
90
|
+
const BLOCK_QUOTES = `> Blockquotes can also be nested...
|
91
|
+
>> ...by using additional greater-than signs (>) right next to each other...
|
92
|
+
> > > ...or with spaces between each sign.`;
|
93
|
+
const TABLE = `
|
94
|
+
|
95
|
+
| Column 1 | Column 2 |
|
96
|
+
|-|-|
|
97
|
+
| Cell 1 | Cell 2 |
|
98
|
+
| Cell 3 | Cell 4 |
|
99
|
+
|
100
|
+
`;
|
101
|
+
const ONE_COLUMN_TABLE = `
|
102
|
+
|
103
|
+
| Column 1 |
|
104
|
+
|-|
|
105
|
+
| Cell 1 |
|
106
|
+
| Cell 2 |
|
107
|
+
|
108
|
+
`;
|
109
|
+
const ONE_CELL_TABLE = `
|
110
|
+
|
111
|
+
| Column 1 |
|
112
|
+
|-|
|
113
|
+
| Cell 1 |
|
114
|
+
|
115
|
+
`;
|
116
|
+
const HEADERLESS_TABLE = `
|
117
|
+
|
118
|
+
| |
|
119
|
+
|-|
|
120
|
+
| Cell 1 |
|
121
|
+
|
122
|
+
`;
|
123
|
+
const CHILDLESS_TABLE = `
|
124
|
+
|
125
|
+
| Column 1 |
|
126
|
+
|-|
|
127
|
+
| |
|
128
|
+
|
129
|
+
`;
|
130
|
+
const EMPTY_TABLE = `
|
131
|
+
|
132
|
+
| |
|
133
|
+
|-|
|
134
|
+
| |
|
135
|
+
|
136
|
+
`;
|
137
|
+
const IMAGE = ``;
|
138
|
+
const ERROR = {
|
139
|
+
title: 'Could not load chat',
|
140
|
+
children: 'Wait a few minutes and check your network settings. If the issue persists: ',
|
141
|
+
actionLinks: (React.createElement(React.Fragment, null,
|
142
|
+
React.createElement(AlertActionLink, { component: "a", href: "#" }, "Start a new chat"),
|
143
|
+
React.createElement(AlertActionLink, { component: "a", href: "#" }, "Contact support")))
|
144
|
+
};
|
75
145
|
const checkListItemsRendered = () => {
|
76
146
|
const items = ['Item 1', 'Item 2', 'Item 3'];
|
77
147
|
expect(screen.getAllByRole('listitem')).toHaveLength(3);
|
@@ -81,6 +151,9 @@ const checkListItemsRendered = () => {
|
|
81
151
|
});
|
82
152
|
};
|
83
153
|
describe('Message', () => {
|
154
|
+
beforeEach(() => {
|
155
|
+
jest.clearAllMocks();
|
156
|
+
});
|
84
157
|
it('should render user messages correctly', () => {
|
85
158
|
render(React.createElement(Message, { avatar: "./img", role: "user", name: "User", content: "Hi" }));
|
86
159
|
expect(screen.getByText('User')).toBeTruthy();
|
@@ -307,12 +380,16 @@ describe('Message', () => {
|
|
307
380
|
render(React.createElement(Message, { avatar: "./img", role: "user", name: "User", content: CODE_MESSAGE }));
|
308
381
|
expect(screen.getByText('Here is some YAML code:')).toBeTruthy();
|
309
382
|
expect(screen.getByRole('button', { name: 'Copy code button' })).toBeTruthy();
|
310
|
-
expect(screen.getByText(/
|
383
|
+
expect(screen.getByText(/yaml/)).toBeTruthy();
|
384
|
+
expect(screen.getByText(/apiVersion:/i)).toBeTruthy();
|
385
|
+
expect(screen.getByText(/helm.openshift.io\/v1beta1/i)).toBeTruthy();
|
311
386
|
expect(screen.getByText(/metadata:/i)).toBeTruthy();
|
312
|
-
expect(screen.getByText(/name
|
387
|
+
expect(screen.getByText(/name:/i)).toBeTruthy();
|
388
|
+
expect(screen.getByText(/azure-sample-repo0oooo00ooo/i)).toBeTruthy();
|
313
389
|
expect(screen.getByText(/spec/i)).toBeTruthy();
|
314
390
|
expect(screen.getByText(/connectionConfig:/i)).toBeTruthy();
|
315
|
-
expect(screen.getByText(/url
|
391
|
+
expect(screen.getByText(/url:/i)).toBeTruthy();
|
392
|
+
expect(screen.getByText(/https:\/\/raw.githubusercontent.com\/Azure-Samples\/helm-charts\/master\/docs/i)).toBeTruthy();
|
316
393
|
});
|
317
394
|
it('can click copy code button', () => __awaiter(void 0, void 0, void 0, function* () {
|
318
395
|
// need explicit setup since RTL stubs clipboard if you do this
|
@@ -378,4 +455,163 @@ describe('Message', () => {
|
|
378
455
|
} }));
|
379
456
|
expect(screen.getAllByRole('img')[1]).toHaveAttribute('src', 'test.png');
|
380
457
|
}));
|
458
|
+
it('should handle block quote correctly', () => {
|
459
|
+
render(React.createElement(Message, { avatar: "./img", role: "user", name: "User", content: BLOCK_QUOTES }));
|
460
|
+
expect(screen.getByText(/Blockquotes can also be nested.../)).toBeTruthy();
|
461
|
+
expect(screen.getByText('...by using additional greater-than signs (>) right next to each other...')).toBeTruthy();
|
462
|
+
expect(screen.getByText(/...or with spaces between each sign./)).toBeTruthy();
|
463
|
+
});
|
464
|
+
it('should handle heading correctly', () => {
|
465
|
+
render(React.createElement(Message, { avatar: "./img", role: "user", name: "User", content: HEADING }));
|
466
|
+
expect(screen.getByRole('heading', { name: /h1 Heading/i })).toBeTruthy();
|
467
|
+
expect(screen.getByRole('heading', { name: /h2 Heading/i })).toBeTruthy();
|
468
|
+
expect(screen.getByRole('heading', { name: /h3 Heading/i })).toBeTruthy();
|
469
|
+
expect(screen.getByRole('heading', { name: /h4 Heading/i })).toBeTruthy();
|
470
|
+
expect(screen.getByRole('heading', { name: /h5 Heading/i })).toBeTruthy();
|
471
|
+
expect(screen.getByRole('heading', { name: /h6 Heading/i })).toBeTruthy();
|
472
|
+
});
|
473
|
+
it('should render table correctly', () => {
|
474
|
+
render(React.createElement(Message, { avatar: "./img", role: "user", name: "User", content: TABLE }));
|
475
|
+
expect(screen.getByRole('row', { name: /Column 1 Column 2/i })).toBeTruthy();
|
476
|
+
expect(screen.getByRole('row', { name: /Cell 1 Cell 2/i })).toBeTruthy();
|
477
|
+
expect(screen.getByRole('row', { name: /Cell 3 Cell 4/i })).toBeTruthy();
|
478
|
+
expect(screen.getByRole('columnheader', { name: /Column 1/i })).toBeTruthy();
|
479
|
+
expect(screen.getByRole('columnheader', { name: /Column 2/i })).toBeTruthy();
|
480
|
+
expect(screen.getByRole('cell', { name: /Cell 1/i })).toBeTruthy();
|
481
|
+
expect(screen.getByRole('cell', { name: /Cell 2/i })).toBeTruthy();
|
482
|
+
expect(screen.getByRole('cell', { name: /Cell 3/i })).toBeTruthy();
|
483
|
+
expect(screen.getByRole('cell', { name: /Cell 4/i })).toBeTruthy();
|
484
|
+
});
|
485
|
+
it('should render table data labels correctly for mobile breakpoint', () => {
|
486
|
+
render(React.createElement(Message, { avatar: "./img", role: "user", name: "User", content: TABLE }));
|
487
|
+
expect(screen.getByRole('row', { name: /Cell 1 Cell 2/i })).toHaveAttribute('extraHeaders', 'Column 1,Column 2');
|
488
|
+
expect(screen.getByRole('row', { name: /Cell 3 Cell 4/i })).toHaveAttribute('extraHeaders', 'Column 1,Column 2');
|
489
|
+
expect(screen.getByRole('cell', { name: /Cell 1/i })).toHaveAttribute('data-label', 'Column 1');
|
490
|
+
expect(screen.getByRole('cell', { name: /Cell 2/i })).toHaveAttribute('data-label', 'Column 2');
|
491
|
+
expect(screen.getByRole('cell', { name: /Cell 3/i })).toHaveAttribute('data-label', 'Column 1');
|
492
|
+
expect(screen.getByRole('cell', { name: /Cell 4/i })).toHaveAttribute('data-label', 'Column 2');
|
493
|
+
});
|
494
|
+
it('should render table data labels correctly for mobile breakpoint for one column table', () => {
|
495
|
+
render(React.createElement(Message, { avatar: "./img", role: "user", name: "User", content: ONE_COLUMN_TABLE }));
|
496
|
+
expect(screen.getByRole('row', { name: /Cell 1/i })).toHaveAttribute('extraHeaders', 'Column 1');
|
497
|
+
expect(screen.getByRole('row', { name: /Cell 2/i })).toHaveAttribute('extraHeaders', 'Column 1');
|
498
|
+
expect(screen.getByRole('cell', { name: /Cell 1/i })).toHaveAttribute('data-label', 'Column 1');
|
499
|
+
expect(screen.getByRole('cell', { name: /Cell 2/i })).toHaveAttribute('data-label', 'Column 1');
|
500
|
+
});
|
501
|
+
it('should render table data labels correctly for mobile breakpoint for one cell table', () => {
|
502
|
+
render(React.createElement(Message, { avatar: "./img", role: "user", name: "User", content: ONE_CELL_TABLE }));
|
503
|
+
expect(screen.getByRole('row', { name: /Cell 1/i })).toHaveAttribute('extraHeaders', 'Column 1');
|
504
|
+
expect(screen.getByRole('cell', { name: /Cell 1/i })).toHaveAttribute('data-label', 'Column 1');
|
505
|
+
});
|
506
|
+
it('should render table data labels correctly for mobile breakpoint for headerless', () => {
|
507
|
+
render(React.createElement(Message, { avatar: "./img", role: "user", name: "User", content: HEADERLESS_TABLE }));
|
508
|
+
expect(screen.getByRole('row', { name: /Cell 1/i })).toHaveAttribute('extraHeaders', '');
|
509
|
+
expect(screen.getByRole('cell', { name: /Cell 1/i })).not.toHaveAttribute('data-label');
|
510
|
+
});
|
511
|
+
it('should render table data labels correctly for mobile breakpoint for childless', () => {
|
512
|
+
render(React.createElement(Message, { avatar: "./img", role: "user", name: "User", content: CHILDLESS_TABLE }));
|
513
|
+
expect(screen.getByRole('cell')).not.toHaveAttribute('extraHeaders', 'Column 1');
|
514
|
+
});
|
515
|
+
it('should render table data labels correctly for mobile breakpoint for empty', () => {
|
516
|
+
render(React.createElement(Message, { avatar: "./img", role: "user", name: "User", content: EMPTY_TABLE }));
|
517
|
+
expect(screen.getByRole('cell')).not.toHaveAttribute('extraHeaders', '');
|
518
|
+
});
|
519
|
+
it('should render custom table aria label correctly', () => {
|
520
|
+
render(React.createElement(Message, { avatar: "./img", role: "user", name: "User", content: TABLE, tableProps: { 'aria-label': 'Test' } }));
|
521
|
+
expect(screen.getByRole('grid', { name: /Test/i })).toBeTruthy();
|
522
|
+
});
|
523
|
+
it('should render beforeMainContent with main content', () => {
|
524
|
+
const mainContent = 'Main message content';
|
525
|
+
const beforeMainContentText = 'Before main content';
|
526
|
+
const beforeMainContent = React.createElement("div", null, beforeMainContentText);
|
527
|
+
render(React.createElement(Message, { avatar: "./img", role: "user", name: "User", content: mainContent, extraContent: { beforeMainContent } }));
|
528
|
+
expect(screen.getByText(beforeMainContentText)).toBeTruthy();
|
529
|
+
expect(screen.getByText(mainContent)).toBeTruthy();
|
530
|
+
});
|
531
|
+
it('should render afterMainContent with main content', () => {
|
532
|
+
const mainContent = 'Main message content';
|
533
|
+
const afterMainContentText = 'After main content';
|
534
|
+
const afterMainContent = React.createElement("div", null, afterMainContentText);
|
535
|
+
render(React.createElement(Message, { avatar: "./img", role: "user", name: "User", content: mainContent, extraContent: { afterMainContent } }));
|
536
|
+
expect(screen.getByText(afterMainContentText)).toBeTruthy();
|
537
|
+
expect(screen.getByText(mainContent)).toBeTruthy();
|
538
|
+
});
|
539
|
+
it('should render endContent with main content', () => {
|
540
|
+
const mainContent = 'Main message content';
|
541
|
+
const endMainContentText = 'End content';
|
542
|
+
const endContent = React.createElement("div", null, endMainContentText);
|
543
|
+
render(React.createElement(Message, { avatar: "./img", role: "user", name: "User", content: mainContent, extraContent: { endContent } }));
|
544
|
+
expect(screen.getByText(endMainContentText)).toBeTruthy();
|
545
|
+
expect(screen.getByText(mainContent)).toBeTruthy();
|
546
|
+
});
|
547
|
+
it('should render all parts of extraContent with main content', () => {
|
548
|
+
const beforeMainContent = React.createElement("div", null, "Before main content");
|
549
|
+
const afterMainContent = React.createElement("div", null, "After main content");
|
550
|
+
const endContent = React.createElement("div", null, "End content");
|
551
|
+
render(React.createElement(Message, { avatar: "./img", role: "user", name: "User", content: "Main message content", extraContent: { beforeMainContent, afterMainContent, endContent } }));
|
552
|
+
expect(screen.getByText('Before main content')).toBeTruthy();
|
553
|
+
expect(screen.getByText('Main message content')).toBeTruthy();
|
554
|
+
expect(screen.getByText('After main content')).toBeTruthy();
|
555
|
+
expect(screen.getByText('End content')).toBeTruthy();
|
556
|
+
});
|
557
|
+
it('should not render extraContent when not provided', () => {
|
558
|
+
render(React.createElement(Message, { avatar: "./img", role: "user", name: "User", content: "Main message content" }));
|
559
|
+
// Ensure no extraContent is rendered
|
560
|
+
expect(screen.getByText('Main message content')).toBeTruthy();
|
561
|
+
expect(screen.queryByText('Before main content')).toBeFalsy();
|
562
|
+
expect(screen.queryByText('After main content')).toBeFalsy();
|
563
|
+
expect(screen.queryByText('end message content')).toBeFalsy();
|
564
|
+
});
|
565
|
+
it('should handle undefined or null values in extraContent gracefully', () => {
|
566
|
+
render(React.createElement(Message, { avatar: "./img", role: "user", name: "User", content: "Main message content", extraContent: { beforeMainContent: null, afterMainContent: undefined, endContent: null } }));
|
567
|
+
// Ensure that no extraContent is rendered if they are null or undefined
|
568
|
+
expect(screen.getByText('Main message content')).toBeTruthy();
|
569
|
+
expect(screen.queryByText('Before main content')).toBeFalsy();
|
570
|
+
expect(screen.queryByText('After main content')).toBeFalsy();
|
571
|
+
expect(screen.queryByText('end message content')).toBeFalsy();
|
572
|
+
});
|
573
|
+
it('should render JSX in extraContent correctly', () => {
|
574
|
+
const beforeMainContent = (React.createElement("div", { "data-testid": "before-main-content" },
|
575
|
+
React.createElement("strong", null, "Bold before content")));
|
576
|
+
const afterMainContent = (React.createElement("div", { "data-testid": "after-main-content" },
|
577
|
+
React.createElement("strong", null, "Bold after content")));
|
578
|
+
const endContent = (React.createElement("div", { "data-testid": "end-main-content" },
|
579
|
+
React.createElement("strong", null, "Bold end content")));
|
580
|
+
render(React.createElement(Message, { avatar: "./img", role: "user", name: "User", content: "Main message content", extraContent: { beforeMainContent, afterMainContent, endContent } }));
|
581
|
+
// Check that the JSX is correctly rendered
|
582
|
+
expect(screen.getByTestId('before-main-content')).toContainHTML('<strong>Bold before content</strong>');
|
583
|
+
expect(screen.getByTestId('after-main-content')).toContainHTML('<strong>Bold after content</strong>');
|
584
|
+
expect(screen.getByTestId('end-main-content')).toContainHTML('<strong>Bold end content</strong>');
|
585
|
+
});
|
586
|
+
it('should handle image correctly', () => {
|
587
|
+
render(React.createElement(Message, { avatar: "./img", role: "user", name: "User", content: IMAGE }));
|
588
|
+
expect(screen.getByRole('img', { name: /Multi-colored wavy lines on a black background/i })).toBeTruthy();
|
589
|
+
});
|
590
|
+
it('should handle external links correctly', () => {
|
591
|
+
render(React.createElement(Message, { avatar: "./img", role: "user", name: "User", content: `[PatternFly](https://www.patternfly.org/)` }));
|
592
|
+
// we are mocking rehype libraries, so we can't test target _blank addition on links directly with RTL
|
593
|
+
expect(rehypeExternalLinks).toHaveBeenCalledTimes(1);
|
594
|
+
});
|
595
|
+
it('should handle external links correctly', () => {
|
596
|
+
render(React.createElement(Message, { avatar: "./img", role: "user", name: "User", content: `[PatternFly](https://www.patternfly.org/)`, openLinkInNewTab: false }));
|
597
|
+
// we are mocking rehype libraries, so we can't test target _blank addition on links directly with RTL
|
598
|
+
expect(rehypeExternalLinks).not.toHaveBeenCalled();
|
599
|
+
});
|
600
|
+
it('should handle error correctly', () => {
|
601
|
+
render(React.createElement(Message, { avatar: "./img", role: "user", name: "User", error: ERROR }));
|
602
|
+
expect(screen.getByRole('heading', { name: /Could not load chat/i })).toBeTruthy();
|
603
|
+
expect(screen.getByRole('link', { name: /Start a new chat/i })).toBeTruthy();
|
604
|
+
expect(screen.getByRole('link', { name: /Contact support/i })).toBeTruthy();
|
605
|
+
expect(screen.getByText('Wait a few minutes and check your network settings. If the issue persists:')).toBeTruthy();
|
606
|
+
});
|
607
|
+
it('should handle error correctly when loading', () => {
|
608
|
+
render(React.createElement(Message, { avatar: "./img", role: "user", name: "User", error: ERROR, isLoading: true }));
|
609
|
+
expect(screen.queryByRole('heading', { name: /Could not load chat/i })).toBeFalsy();
|
610
|
+
expect(screen.getByText('Loading message')).toBeTruthy();
|
611
|
+
});
|
612
|
+
it('should handle error correctly when these is content', () => {
|
613
|
+
render(React.createElement(Message, { avatar: "./img", role: "user", name: "User", error: ERROR, content: "Test" }));
|
614
|
+
expect(screen.getByRole('heading', { name: /Could not load chat/i })).toBeTruthy();
|
615
|
+
expect(screen.queryByText('Test')).toBeFalsy();
|
616
|
+
});
|
381
617
|
});
|
@@ -0,0 +1,17 @@
|
|
1
|
+
import React from 'react';
|
2
|
+
import { LabelGroupProps, LabelProps } from '@patternfly/react-core';
|
3
|
+
export interface QuickResponse extends Omit<LabelProps, 'children'> {
|
4
|
+
content: string;
|
5
|
+
id: string;
|
6
|
+
onClick?: () => void;
|
7
|
+
}
|
8
|
+
export interface QuickResponseProps {
|
9
|
+
/** Props for quick responses */
|
10
|
+
quickResponses: QuickResponse[];
|
11
|
+
/** Props for quick responses container */
|
12
|
+
quickResponseContainerProps?: Omit<LabelGroupProps, 'ref'>;
|
13
|
+
/** Callback when a response is clicked; used in feedback cards */
|
14
|
+
onSelect?: (id: string) => void;
|
15
|
+
}
|
16
|
+
export declare const QuickResponse: React.FunctionComponent<QuickResponseProps>;
|
17
|
+
export default QuickResponse;
|
@@ -0,0 +1,27 @@
|
|
1
|
+
var __rest = (this && this.__rest) || function (s, e) {
|
2
|
+
var t = {};
|
3
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
4
|
+
t[p] = s[p];
|
5
|
+
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
6
|
+
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
7
|
+
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
8
|
+
t[p[i]] = s[p[i]];
|
9
|
+
}
|
10
|
+
return t;
|
11
|
+
};
|
12
|
+
import React from 'react';
|
13
|
+
import { Label, LabelGroup } from '@patternfly/react-core';
|
14
|
+
import { CheckIcon } from '@patternfly/react-icons';
|
15
|
+
export const QuickResponse = ({ quickResponses, quickResponseContainerProps = { numLabels: 5 }, onSelect }) => {
|
16
|
+
const [selectedQuickResponse, setSelectedQuickResponse] = React.useState();
|
17
|
+
const handleQuickResponseClick = (id, onClick) => {
|
18
|
+
setSelectedQuickResponse(id);
|
19
|
+
onClick && onClick();
|
20
|
+
onSelect && onSelect(id);
|
21
|
+
};
|
22
|
+
return (React.createElement(LabelGroup, Object.assign({ className: `pf-chatbot__message-quick-response ${(quickResponseContainerProps === null || quickResponseContainerProps === void 0 ? void 0 : quickResponseContainerProps.className) ? quickResponseContainerProps === null || quickResponseContainerProps === void 0 ? void 0 : quickResponseContainerProps.className : ''}` }, quickResponseContainerProps), quickResponses.map((_a) => {
|
23
|
+
var { id, onClick, content, className } = _a, props = __rest(_a, ["id", "onClick", "content", "className"]);
|
24
|
+
return (React.createElement(Label, Object.assign({ variant: id === selectedQuickResponse ? undefined : 'outline', icon: id === selectedQuickResponse ? React.createElement(CheckIcon, null) : undefined, color: "blue", key: id, onClick: () => handleQuickResponseClick(id, onClick), className: `${id === selectedQuickResponse ? 'pf-chatbot__message-quick-response--selected' : ''} ${className ? className : ''}` }, props), content));
|
25
|
+
})));
|
26
|
+
};
|
27
|
+
export default QuickResponse;
|
@@ -0,0 +1,20 @@
|
|
1
|
+
import React from 'react';
|
2
|
+
import { ExtraProps } from 'react-markdown';
|
3
|
+
import { TableProps } from '@patternfly/react-table';
|
4
|
+
interface Properties {
|
5
|
+
line: number;
|
6
|
+
column: number;
|
7
|
+
offset: number;
|
8
|
+
}
|
9
|
+
export interface TableNode {
|
10
|
+
children?: TableNode[];
|
11
|
+
value?: string;
|
12
|
+
position: {
|
13
|
+
start: Properties;
|
14
|
+
end: Properties;
|
15
|
+
};
|
16
|
+
tagName: string;
|
17
|
+
type: string;
|
18
|
+
}
|
19
|
+
declare const TableMessage: ({ children, ...props }: TableProps & ExtraProps) => React.JSX.Element;
|
20
|
+
export default TableMessage;
|