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