@patternfly/chatbot 6.4.0-prerelease.20 → 6.4.0-prerelease.22
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.js +1 -1
- package/dist/cjs/FileDetails/FileDetails.d.ts +22 -3
- package/dist/cjs/FileDetails/FileDetails.js +27 -912
- package/dist/cjs/FileDetails/FileDetails.test.js +16 -0
- package/dist/cjs/FileDetailsLabel/FileDetailsLabel.d.ts +8 -2
- package/dist/cjs/FileDetailsLabel/FileDetailsLabel.js +14 -2
- package/dist/cjs/FileDetailsLabel/FileDetailsLabel.test.js +19 -1
- package/dist/cjs/ImagePreview/ImagePreview.d.ts +53 -0
- package/dist/cjs/ImagePreview/ImagePreview.js +47 -0
- package/dist/cjs/ImagePreview/ImagePreview.test.d.ts +1 -0
- package/dist/cjs/ImagePreview/ImagePreview.test.js +225 -0
- package/dist/cjs/ImagePreview/index.d.ts +2 -0
- package/dist/cjs/ImagePreview/index.js +23 -0
- package/dist/cjs/Message/Message.d.ts +3 -0
- package/dist/cjs/Message/Message.js +3 -2
- package/dist/cjs/MessageBox/MessageBox.js +1 -1
- package/dist/cjs/ToolCall/ToolCall.d.ts +44 -0
- package/dist/cjs/ToolCall/ToolCall.js +14 -0
- package/dist/cjs/ToolCall/ToolCall.test.d.ts +1 -0
- package/dist/cjs/ToolCall/ToolCall.test.js +144 -0
- package/dist/cjs/ToolCall/index.d.ts +2 -0
- package/dist/cjs/ToolCall/index.js +23 -0
- package/dist/cjs/index.d.ts +4 -0
- package/dist/cjs/index.js +7 -1
- package/dist/css/main.css +104 -19
- package/dist/css/main.css.map +1 -1
- package/dist/dynamic/ImagePreview/package.json +1 -0
- package/dist/dynamic/ToolCall/package.json +1 -0
- package/dist/esm/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.js +1 -1
- package/dist/esm/FileDetails/FileDetails.d.ts +22 -3
- package/dist/esm/FileDetails/FileDetails.js +27 -912
- package/dist/esm/FileDetails/FileDetails.test.js +16 -0
- package/dist/esm/FileDetailsLabel/FileDetailsLabel.d.ts +8 -2
- package/dist/esm/FileDetailsLabel/FileDetailsLabel.js +14 -2
- package/dist/esm/FileDetailsLabel/FileDetailsLabel.test.js +19 -1
- package/dist/esm/ImagePreview/ImagePreview.d.ts +53 -0
- package/dist/esm/ImagePreview/ImagePreview.js +42 -0
- package/dist/esm/ImagePreview/ImagePreview.test.d.ts +1 -0
- package/dist/esm/ImagePreview/ImagePreview.test.js +220 -0
- package/dist/esm/ImagePreview/index.d.ts +2 -0
- package/dist/esm/ImagePreview/index.js +2 -0
- package/dist/esm/Message/Message.d.ts +3 -0
- package/dist/esm/Message/Message.js +3 -2
- package/dist/esm/MessageBox/MessageBox.js +1 -1
- package/dist/esm/ToolCall/ToolCall.d.ts +44 -0
- package/dist/esm/ToolCall/ToolCall.js +10 -0
- package/dist/esm/ToolCall/ToolCall.test.d.ts +1 -0
- package/dist/esm/ToolCall/ToolCall.test.js +139 -0
- package/dist/esm/ToolCall/index.d.ts +2 -0
- package/dist/esm/ToolCall/index.js +2 -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 +1 -1
- package/patternfly-docs/content/extensions/chatbot/examples/Messages/AttachmentEdit.tsx +1 -1
- package/patternfly-docs/content/extensions/chatbot/examples/Messages/ImagePreview.tsx +53 -0
- package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithToolCall.tsx +45 -0
- package/patternfly-docs/content/extensions/chatbot/examples/Messages/Messages.md +21 -1
- package/patternfly-docs/content/extensions/chatbot/examples/Messages/PreviewAttachment.tsx +1 -1
- package/patternfly-docs/content/extensions/chatbot/examples/Messages/file-preview.svg +9 -0
- package/patternfly-docs/content/extensions/chatbot/examples/demos/Chatbot.md +1 -1
- package/src/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.scss +0 -12
- package/src/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.tsx +1 -1
- package/src/FileDetails/FileDetails.scss +10 -0
- package/src/FileDetails/FileDetails.test.tsx +16 -0
- package/src/FileDetails/FileDetails.tsx +89 -32
- package/src/FileDetails/__snapshots__/FileDetails.test.tsx.snap +25 -16
- package/src/FileDetailsLabel/FileDetailsLabel.test.tsx +21 -1
- package/src/FileDetailsLabel/FileDetailsLabel.tsx +16 -3
- package/src/FileDetailsLabel/__snapshots__/FileDetailsLabel.test.tsx.snap +25 -16
- package/src/ImagePreview/ImagePreview.scss +61 -0
- package/src/ImagePreview/ImagePreview.test.tsx +253 -0
- package/src/ImagePreview/ImagePreview.tsx +200 -0
- package/src/ImagePreview/index.ts +3 -0
- package/src/Message/Message.tsx +5 -0
- package/src/MessageBox/MessageBox.scss +0 -12
- package/src/MessageBox/MessageBox.tsx +1 -1
- package/src/ToolCall/ToolCall.scss +37 -0
- package/src/ToolCall/ToolCall.test.tsx +184 -0
- package/src/ToolCall/ToolCall.tsx +147 -0
- package/src/ToolCall/index.ts +3 -0
- package/src/index.ts +6 -0
- package/src/main.scss +14 -0
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
11
|
+
import { render, screen } from '@testing-library/react';
|
|
12
|
+
import userEvent from '@testing-library/user-event';
|
|
13
|
+
import '@testing-library/jest-dom';
|
|
14
|
+
import ToolCall from './ToolCall';
|
|
15
|
+
describe('ToolCall', () => {
|
|
16
|
+
const defaultProps = {
|
|
17
|
+
titleText: 'ToolCall Title',
|
|
18
|
+
loadingText: 'Loading ToolCall'
|
|
19
|
+
};
|
|
20
|
+
it('Renders with passed in titleText', () => {
|
|
21
|
+
render(_jsx(ToolCall, Object.assign({}, defaultProps)));
|
|
22
|
+
expect(screen.getByText(defaultProps.titleText)).toBeVisible();
|
|
23
|
+
});
|
|
24
|
+
it('Does not render with passed in loadingText when isLoading is false', () => {
|
|
25
|
+
render(_jsx(ToolCall, Object.assign({}, defaultProps)));
|
|
26
|
+
expect(screen.queryByText(defaultProps.loadingText)).not.toBeInTheDocument();
|
|
27
|
+
});
|
|
28
|
+
it('Renders with passed in loadingText when isLoading is true', () => {
|
|
29
|
+
render(_jsx(ToolCall, Object.assign({}, defaultProps, { isLoading: true })));
|
|
30
|
+
expect(screen.getByText(defaultProps.loadingText)).toBeVisible();
|
|
31
|
+
});
|
|
32
|
+
it('Does not render titleText when isLoading is true', () => {
|
|
33
|
+
render(_jsx(ToolCall, Object.assign({}, defaultProps, { isLoading: true })));
|
|
34
|
+
expect(screen.queryByText(defaultProps.titleText)).not.toBeInTheDocument();
|
|
35
|
+
});
|
|
36
|
+
it('Passes spinnerProps to Spinner', () => {
|
|
37
|
+
render(_jsx(ToolCall, Object.assign({}, defaultProps, { isLoading: true, spinnerProps: { id: 'spinner-test-id' } })));
|
|
38
|
+
expect(screen.getByRole('progressbar')).toHaveAttribute('id', 'spinner-test-id');
|
|
39
|
+
});
|
|
40
|
+
it('Does not render expandable toggle by default', () => {
|
|
41
|
+
render(_jsx(ToolCall, Object.assign({}, defaultProps)));
|
|
42
|
+
expect(screen.queryByRole('button', { name: defaultProps.titleText })).not.toBeInTheDocument();
|
|
43
|
+
});
|
|
44
|
+
it('Renders titleText inside expandable toggle when expandableContent is passed', () => {
|
|
45
|
+
render(_jsx(ToolCall, Object.assign({}, defaultProps, { expandableContent: "Expandable Content" })));
|
|
46
|
+
expect(screen.getByRole('button', { name: defaultProps.titleText })).toBeVisible();
|
|
47
|
+
});
|
|
48
|
+
it('Does not render expandable content when expandableContent is passed by default', () => {
|
|
49
|
+
render(_jsx(ToolCall, Object.assign({}, defaultProps, { expandableContent: "Expandable Content" })));
|
|
50
|
+
expect(screen.queryByText('Expandable Content')).not.toBeVisible();
|
|
51
|
+
});
|
|
52
|
+
it('Renders expandable content when expandableContent is passed and toggle is clicked', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
53
|
+
const user = userEvent.setup();
|
|
54
|
+
render(_jsx(ToolCall, Object.assign({}, defaultProps, { expandableContent: "Expandable Content" })));
|
|
55
|
+
yield user.click(screen.getByRole('button', { name: defaultProps.titleText }));
|
|
56
|
+
expect(screen.getByText('Expandable Content')).toBeVisible();
|
|
57
|
+
}));
|
|
58
|
+
it('Passes expandableSectionProps to ExpandableSection', () => {
|
|
59
|
+
render(_jsx(ToolCall, Object.assign({}, defaultProps, { expandableContent: "Expandable Content", expandableSectionProps: { id: 'expandable-section-test-id', isExpanded: true } })));
|
|
60
|
+
expect(screen.getByRole('region').parentElement).toHaveAttribute('id', 'expandable-section-test-id');
|
|
61
|
+
});
|
|
62
|
+
it('Renders "run" action button by default', () => {
|
|
63
|
+
render(_jsx(ToolCall, Object.assign({}, defaultProps)));
|
|
64
|
+
expect(screen.getByRole('button', { name: 'Run tool' })).toBeVisible();
|
|
65
|
+
});
|
|
66
|
+
it('Renders "cancel" action button by default', () => {
|
|
67
|
+
render(_jsx(ToolCall, Object.assign({}, defaultProps)));
|
|
68
|
+
expect(screen.getByRole('button', { name: 'Cancel' })).toBeVisible();
|
|
69
|
+
});
|
|
70
|
+
it('Does not render "run" action button when isLoading is true', () => {
|
|
71
|
+
render(_jsx(ToolCall, Object.assign({}, defaultProps, { isLoading: true })));
|
|
72
|
+
expect(screen.queryByRole('button', { name: 'Run tool' })).not.toBeInTheDocument();
|
|
73
|
+
});
|
|
74
|
+
it('Does not render "cancel" action button when isLoading is true', () => {
|
|
75
|
+
render(_jsx(ToolCall, Object.assign({}, defaultProps, { isLoading: true })));
|
|
76
|
+
expect(screen.queryByRole('button', { name: 'Cancel' })).not.toBeInTheDocument();
|
|
77
|
+
});
|
|
78
|
+
it('Renders runButtonText when passed', () => {
|
|
79
|
+
render(_jsx(ToolCall, Object.assign({}, defaultProps, { runButtonText: "Run my custom tool" })));
|
|
80
|
+
expect(screen.getByRole('button', { name: 'Run my custom tool' })).toBeVisible();
|
|
81
|
+
});
|
|
82
|
+
it('Renders cancelButtonText when passed', () => {
|
|
83
|
+
render(_jsx(ToolCall, Object.assign({}, defaultProps, { cancelButtonText: "Cancel my custom tool" })));
|
|
84
|
+
expect(screen.getByRole('button', { name: 'Cancel my custom tool' })).toBeVisible();
|
|
85
|
+
});
|
|
86
|
+
it('Passes runButtonProps to Button', () => {
|
|
87
|
+
render(_jsx(ToolCall, Object.assign({}, defaultProps, { runButtonProps: { id: 'run-button-test-id' } })));
|
|
88
|
+
expect(screen.getByRole('button', { name: 'Run tool' })).toHaveAttribute('id', 'run-button-test-id');
|
|
89
|
+
});
|
|
90
|
+
it('Passes cancelButtonProps to Button', () => {
|
|
91
|
+
render(_jsx(ToolCall, Object.assign({}, defaultProps, { cancelButtonProps: { id: 'cancel-button-test-id' } })));
|
|
92
|
+
expect(screen.getByRole('button', { name: 'Cancel' })).toHaveAttribute('id', 'cancel-button-test-id');
|
|
93
|
+
});
|
|
94
|
+
it('Passes runActionItemProps to ActionListItem', () => {
|
|
95
|
+
render(_jsx(ToolCall, Object.assign({}, defaultProps, { runActionItemProps: { id: 'run-action-item-test-id' } })));
|
|
96
|
+
expect(screen.getByRole('button', { name: 'Run tool' }).parentElement).toHaveAttribute('id', 'run-action-item-test-id');
|
|
97
|
+
});
|
|
98
|
+
it('Passes cancelActionItemProps to ActionListItem', () => {
|
|
99
|
+
render(_jsx(ToolCall, Object.assign({}, defaultProps, { cancelActionItemProps: { id: 'cancel-action-item-test-id' } })));
|
|
100
|
+
expect(screen.getByRole('button', { name: 'Cancel' }).parentElement).toHaveAttribute('id', 'cancel-action-item-test-id');
|
|
101
|
+
});
|
|
102
|
+
it('Passes actionListProps to ActionList', () => {
|
|
103
|
+
render(_jsx(ToolCall, Object.assign({}, defaultProps, { actionListProps: { id: 'action-list-test-id' } })));
|
|
104
|
+
expect(screen.getByRole('button', { name: 'Run tool' }).closest('#action-list-test-id')).toBeVisible();
|
|
105
|
+
});
|
|
106
|
+
it('Passes actionListGroupProps to ActionListGroup', () => {
|
|
107
|
+
render(_jsx(ToolCall, Object.assign({}, defaultProps, { actionListGroupProps: { id: 'action-list-group-test-id' } })));
|
|
108
|
+
expect(screen.getByRole('button', { name: 'Run tool' }).closest('#action-list-group-test-id')).toBeVisible();
|
|
109
|
+
});
|
|
110
|
+
it('Passes actionListItemProps to ActionListItem for default actions', () => {
|
|
111
|
+
render(_jsx(ToolCall, Object.assign({}, defaultProps, { actionListItemProps: { className: 'action-list-item-test-class' } })));
|
|
112
|
+
expect(screen.getByRole('button', { name: 'Run tool' }).parentElement).toHaveClass('action-list-item-test-class');
|
|
113
|
+
expect(screen.getByRole('button', { name: 'Cancel' }).parentElement).toHaveClass('action-list-item-test-class');
|
|
114
|
+
});
|
|
115
|
+
it('Renders custom actions instead of default actions when actions are passed', () => {
|
|
116
|
+
render(_jsx(ToolCall, Object.assign({}, defaultProps, { actions: [_jsx("div", { children: "Custom action 1" }, "custom-action-1"), _jsx("div", { children: "Custom action 2" }, "custom-action-2")] })));
|
|
117
|
+
expect(screen.getByText('Custom action 1')).toBeVisible();
|
|
118
|
+
expect(screen.getByText('Custom action 2')).toBeVisible();
|
|
119
|
+
expect(screen.queryByRole('button', { name: 'Run tool' })).not.toBeInTheDocument();
|
|
120
|
+
expect(screen.queryByRole('button', { name: 'Cancel' })).not.toBeInTheDocument();
|
|
121
|
+
});
|
|
122
|
+
it('Passes actionListItemProps to ActionListItem for custom actions', () => {
|
|
123
|
+
render(_jsx(ToolCall, Object.assign({}, defaultProps, { actions: [_jsx("div", { children: "Custom action 1" }, "custom-action-1"), _jsx("div", { children: "Custom action 2" }, "custom-action-2")], actionListItemProps: { className: 'action-list-item-test-class' } })));
|
|
124
|
+
expect(screen.getByText('Custom action 1').parentElement).toHaveClass('action-list-item-test-class');
|
|
125
|
+
expect(screen.getByText('Custom action 2').parentElement).toHaveClass('action-list-item-test-class');
|
|
126
|
+
});
|
|
127
|
+
it('Passes cardProps to Card', () => {
|
|
128
|
+
render(_jsx(ToolCall, Object.assign({}, defaultProps, { cardProps: { id: 'card-test-id' } })));
|
|
129
|
+
expect(screen.getByRole('button', { name: 'Run tool' }).closest('#card-test-id')).toBeVisible();
|
|
130
|
+
});
|
|
131
|
+
it('Passes cardBodyProps to CardBody', () => {
|
|
132
|
+
render(_jsx(ToolCall, Object.assign({}, defaultProps, { cardBodyProps: { id: 'card-body-test-id' } })));
|
|
133
|
+
expect(screen.getByText(defaultProps.titleText).closest('#card-body-test-id')).toBeVisible();
|
|
134
|
+
});
|
|
135
|
+
it('Passes cardFooterProps to CardFooter', () => {
|
|
136
|
+
render(_jsx(ToolCall, Object.assign({}, defaultProps, { cardFooterProps: { id: 'card-footer-test-id' } })));
|
|
137
|
+
expect(screen.getByRole('button', { name: 'Run tool' }).closest('#card-footer-test-id')).toBeVisible();
|
|
138
|
+
});
|
|
139
|
+
});
|
package/dist/esm/index.d.ts
CHANGED
|
@@ -36,6 +36,8 @@ export { default as FileDropZone } from './FileDropZone';
|
|
|
36
36
|
export * from './FileDropZone';
|
|
37
37
|
export { default as FilePreview } from './FilePreview';
|
|
38
38
|
export * from './FilePreview';
|
|
39
|
+
export { default as ImagePreview } from './ImagePreview';
|
|
40
|
+
export * from './ImagePreview';
|
|
39
41
|
export { default as LoadingMessage } from './LoadingMessage';
|
|
40
42
|
export * from './LoadingMessage';
|
|
41
43
|
export { default as Message } from './Message';
|
|
@@ -58,6 +60,8 @@ export { default as SourcesCard } from './SourcesCard';
|
|
|
58
60
|
export * from './SourcesCard';
|
|
59
61
|
export { default as TermsOfUse } from './TermsOfUse';
|
|
60
62
|
export * from './TermsOfUse';
|
|
63
|
+
export { default as ToolCall } from './ToolCall';
|
|
64
|
+
export * from './ToolCall';
|
|
61
65
|
export { default as ToolResponse } from './ToolResponse';
|
|
62
66
|
export * from './ToolResponse';
|
|
63
67
|
export { default as tracking } from './tracking';
|
package/dist/esm/index.js
CHANGED
|
@@ -37,6 +37,8 @@ export { default as FileDropZone } from './FileDropZone';
|
|
|
37
37
|
export * from './FileDropZone';
|
|
38
38
|
export { default as FilePreview } from './FilePreview';
|
|
39
39
|
export * from './FilePreview';
|
|
40
|
+
export { default as ImagePreview } from './ImagePreview';
|
|
41
|
+
export * from './ImagePreview';
|
|
40
42
|
export { default as LoadingMessage } from './LoadingMessage';
|
|
41
43
|
export * from './LoadingMessage';
|
|
42
44
|
export { default as Message } from './Message';
|
|
@@ -59,6 +61,8 @@ export { default as SourcesCard } from './SourcesCard';
|
|
|
59
61
|
export * from './SourcesCard';
|
|
60
62
|
export { default as TermsOfUse } from './TermsOfUse';
|
|
61
63
|
export * from './TermsOfUse';
|
|
64
|
+
export { default as ToolCall } from './ToolCall';
|
|
65
|
+
export * from './ToolCall';
|
|
62
66
|
export { default as ToolResponse } from './ToolResponse';
|
|
63
67
|
export * from './ToolResponse';
|
|
64
68
|
export { default as tracking } from './tracking';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"root":["../src/index.ts","../src/AttachMenu/AttachMenu.tsx","../src/AttachMenu/index.ts","../src/AttachmentEdit/AttachmentEdit.test.tsx","../src/AttachmentEdit/AttachmentEdit.tsx","../src/AttachmentEdit/index.ts","../src/Chatbot/Chatbot.test.tsx","../src/Chatbot/Chatbot.tsx","../src/Chatbot/index.ts","../src/ChatbotAlert/ChatbotAlert.test.tsx","../src/ChatbotAlert/ChatbotAlert.tsx","../src/ChatbotAlert/index.ts","../src/ChatbotContent/ChatbotContent.test.tsx","../src/ChatbotContent/ChatbotContent.tsx","../src/ChatbotContent/index.ts","../src/ChatbotConversationHistoryNav/ChatbotConversationHistoryDropdown.test.tsx","../src/ChatbotConversationHistoryNav/ChatbotConversationHistoryDropdown.tsx","../src/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.test.tsx","../src/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.tsx","../src/ChatbotConversationHistoryNav/EmptyState.tsx","../src/ChatbotConversationHistoryNav/LoadingState.tsx","../src/ChatbotConversationHistoryNav/index.ts","../src/ChatbotFooter/ChatbotFooter.test.tsx","../src/ChatbotFooter/ChatbotFooter.tsx","../src/ChatbotFooter/ChatbotFooternote.test.tsx","../src/ChatbotFooter/ChatbotFootnote.tsx","../src/ChatbotFooter/index.ts","../src/ChatbotHeader/ChatbotHeader.test.tsx","../src/ChatbotHeader/ChatbotHeader.tsx","../src/ChatbotHeader/ChatbotHeaderActions.test.tsx","../src/ChatbotHeader/ChatbotHeaderActions.tsx","../src/ChatbotHeader/ChatbotHeaderCloseButton.test.tsx","../src/ChatbotHeader/ChatbotHeaderCloseButton.tsx","../src/ChatbotHeader/ChatbotHeaderMain.test.tsx","../src/ChatbotHeader/ChatbotHeaderMain.tsx","../src/ChatbotHeader/ChatbotHeaderMenu.test.tsx","../src/ChatbotHeader/ChatbotHeaderMenu.tsx","../src/ChatbotHeader/ChatbotHeaderNewChatButton.test.tsx","../src/ChatbotHeader/ChatbotHeaderNewChatButton.tsx","../src/ChatbotHeader/ChatbotHeaderOptionsDropdown.test.tsx","../src/ChatbotHeader/ChatbotHeaderOptionsDropdown.tsx","../src/ChatbotHeader/ChatbotHeaderSelectorDropdown.test.tsx","../src/ChatbotHeader/ChatbotHeaderSelectorDropdown.tsx","../src/ChatbotHeader/ChatbotHeaderTitle.test.tsx","../src/ChatbotHeader/ChatbotHeaderTitle.tsx","../src/ChatbotHeader/index.ts","../src/ChatbotModal/ChatbotModal.test.tsx","../src/ChatbotModal/ChatbotModal.tsx","../src/ChatbotModal/index.ts","../src/ChatbotPopover/ChatbotPopover.tsx","../src/ChatbotPopover/index.ts","../src/ChatbotToggle/ChatbotToggle.test.tsx","../src/ChatbotToggle/ChatbotToggle.tsx","../src/ChatbotToggle/index.ts","../src/ChatbotWelcomePrompt/ChatbotWelcomePrompt.test.tsx","../src/ChatbotWelcomePrompt/ChatbotWelcomePrompt.tsx","../src/ChatbotWelcomePrompt/index.ts","../src/CodeModal/CodeModal.test.tsx","../src/CodeModal/CodeModal.tsx","../src/CodeModal/index.ts","../src/Compare/Compare.test.tsx","../src/Compare/Compare.tsx","../src/Compare/index.ts","../src/DeepThinking/DeepThinking.test.tsx","../src/DeepThinking/DeepThinking.tsx","../src/DeepThinking/index.ts","../src/FileDetails/FileDetails.test.tsx","../src/FileDetails/FileDetails.tsx","../src/FileDetails/index.ts","../src/FileDetailsLabel/FileDetailsLabel.test.tsx","../src/FileDetailsLabel/FileDetailsLabel.tsx","../src/FileDetailsLabel/index.ts","../src/FileDropZone/FileDropZone.test.tsx","../src/FileDropZone/FileDropZone.tsx","../src/FileDropZone/index.ts","../src/FilePreview/FilePreview.test.tsx","../src/FilePreview/FilePreview.tsx","../src/FilePreview/index.ts","../src/LoadingMessage/LoadingMessage.test.tsx","../src/LoadingMessage/LoadingMessage.tsx","../src/LoadingMessage/index.ts","../src/Message/Message.test.tsx","../src/Message/Message.tsx","../src/Message/MessageInput.tsx","../src/Message/MessageLoading.tsx","../src/Message/index.ts","../src/Message/CodeBlockMessage/CodeBlockMessage.tsx","../src/Message/ErrorMessage/ErrorMessage.tsx","../src/Message/ImageMessage/ImageMessage.tsx","../src/Message/LinkMessage/LinkMessage.tsx","../src/Message/ListMessage/ListItemMessage.tsx","../src/Message/ListMessage/OrderedListMessage.tsx","../src/Message/ListMessage/UnorderedListMessage.tsx","../src/Message/Plugins/index.ts","../src/Message/Plugins/rehypeCodeBlockToggle.ts","../src/Message/Plugins/rehypeMoveImagesOutOfParagraphs.ts","../src/Message/QuickResponse/QuickResponse.tsx","../src/Message/QuickStarts/FallbackImg.tsx","../src/Message/QuickStarts/QuickStartTile.tsx","../src/Message/QuickStarts/QuickStartTileDescription.test.tsx","../src/Message/QuickStarts/QuickStartTileDescription.tsx","../src/Message/QuickStarts/QuickStartTileHeader.tsx","../src/Message/QuickStarts/monitor-sampleapp-quickstart-with-image.ts","../src/Message/QuickStarts/monitor-sampleapp-quickstart.ts","../src/Message/QuickStarts/types.ts","../src/Message/SuperscriptMessage/SuperscriptMessage.tsx","../src/Message/TableMessage/TableMessage.tsx","../src/Message/TableMessage/TbodyMessage.tsx","../src/Message/TableMessage/TdMessage.tsx","../src/Message/TableMessage/ThMessage.tsx","../src/Message/TableMessage/TheadMessage.tsx","../src/Message/TableMessage/TrMessage.tsx","../src/Message/TextMessage/TextMessage.tsx","../src/Message/UserFeedback/CloseButton.tsx","../src/Message/UserFeedback/UserFeedback.test.tsx","../src/Message/UserFeedback/UserFeedback.tsx","../src/Message/UserFeedback/UserFeedbackComplete.test.tsx","../src/Message/UserFeedback/UserFeedbackComplete.tsx","../src/MessageBar/AttachButton.test.tsx","../src/MessageBar/AttachButton.tsx","../src/MessageBar/MessageBar.test.tsx","../src/MessageBar/MessageBar.tsx","../src/MessageBar/MicrophoneButton.tsx","../src/MessageBar/SendButton.test.tsx","../src/MessageBar/SendButton.tsx","../src/MessageBar/StopButton.test.tsx","../src/MessageBar/StopButton.tsx","../src/MessageBar/index.ts","../src/MessageBox/JumpButton.test.tsx","../src/MessageBox/JumpButton.tsx","../src/MessageBox/MessageBox.test.tsx","../src/MessageBox/MessageBox.tsx","../src/MessageBox/index.ts","../src/MessageDivider/MessageDivider.test.tsx","../src/MessageDivider/MessageDivider.tsx","../src/MessageDivider/index.ts","../src/PreviewAttachment/PreviewAttachment.test.tsx","../src/PreviewAttachment/PreviewAttachment.tsx","../src/PreviewAttachment/index.ts","../src/ResponseActions/ResponseActionButton.test.tsx","../src/ResponseActions/ResponseActionButton.tsx","../src/ResponseActions/ResponseActions.test.tsx","../src/ResponseActions/ResponseActions.tsx","../src/ResponseActions/index.ts","../src/Settings/SettingsForm.test.tsx","../src/Settings/SettingsForm.tsx","../src/Settings/index.ts","../src/SourceDetailsMenuItem/SourceDetailsMenuItem.tsx","../src/SourceDetailsMenuItem/index.ts","../src/SourcesCard/SourcesCard.test.tsx","../src/SourcesCard/SourcesCard.tsx","../src/SourcesCard/index.ts","../src/TermsOfUse/TermsOfUse.test.tsx","../src/TermsOfUse/TermsOfUse.tsx","../src/TermsOfUse/index.ts","../src/ToolResponse/ToolResponse.test.tsx","../src/ToolResponse/ToolResponse.tsx","../src/ToolResponse/index.ts","../src/__mocks__/rehype-external-links.ts","../src/__mocks__/rehype-sanitize.ts","../src/__mocks__/rehype-unwrap-images.tsx","../src/tracking/console_tracking_provider.ts","../src/tracking/index.ts","../src/tracking/posthog_tracking_provider.ts","../src/tracking/segment_tracking_provider.ts","../src/tracking/trackingProviderProxy.ts","../src/tracking/tracking_api.ts","../src/tracking/tracking_registry.ts","../src/tracking/tracking_spi.ts","../src/tracking/umami_tracking_provider.ts"],"version":"5.6.3"}
|
|
1
|
+
{"root":["../src/index.ts","../src/AttachMenu/AttachMenu.tsx","../src/AttachMenu/index.ts","../src/AttachmentEdit/AttachmentEdit.test.tsx","../src/AttachmentEdit/AttachmentEdit.tsx","../src/AttachmentEdit/index.ts","../src/Chatbot/Chatbot.test.tsx","../src/Chatbot/Chatbot.tsx","../src/Chatbot/index.ts","../src/ChatbotAlert/ChatbotAlert.test.tsx","../src/ChatbotAlert/ChatbotAlert.tsx","../src/ChatbotAlert/index.ts","../src/ChatbotContent/ChatbotContent.test.tsx","../src/ChatbotContent/ChatbotContent.tsx","../src/ChatbotContent/index.ts","../src/ChatbotConversationHistoryNav/ChatbotConversationHistoryDropdown.test.tsx","../src/ChatbotConversationHistoryNav/ChatbotConversationHistoryDropdown.tsx","../src/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.test.tsx","../src/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.tsx","../src/ChatbotConversationHistoryNav/EmptyState.tsx","../src/ChatbotConversationHistoryNav/LoadingState.tsx","../src/ChatbotConversationHistoryNav/index.ts","../src/ChatbotFooter/ChatbotFooter.test.tsx","../src/ChatbotFooter/ChatbotFooter.tsx","../src/ChatbotFooter/ChatbotFooternote.test.tsx","../src/ChatbotFooter/ChatbotFootnote.tsx","../src/ChatbotFooter/index.ts","../src/ChatbotHeader/ChatbotHeader.test.tsx","../src/ChatbotHeader/ChatbotHeader.tsx","../src/ChatbotHeader/ChatbotHeaderActions.test.tsx","../src/ChatbotHeader/ChatbotHeaderActions.tsx","../src/ChatbotHeader/ChatbotHeaderCloseButton.test.tsx","../src/ChatbotHeader/ChatbotHeaderCloseButton.tsx","../src/ChatbotHeader/ChatbotHeaderMain.test.tsx","../src/ChatbotHeader/ChatbotHeaderMain.tsx","../src/ChatbotHeader/ChatbotHeaderMenu.test.tsx","../src/ChatbotHeader/ChatbotHeaderMenu.tsx","../src/ChatbotHeader/ChatbotHeaderNewChatButton.test.tsx","../src/ChatbotHeader/ChatbotHeaderNewChatButton.tsx","../src/ChatbotHeader/ChatbotHeaderOptionsDropdown.test.tsx","../src/ChatbotHeader/ChatbotHeaderOptionsDropdown.tsx","../src/ChatbotHeader/ChatbotHeaderSelectorDropdown.test.tsx","../src/ChatbotHeader/ChatbotHeaderSelectorDropdown.tsx","../src/ChatbotHeader/ChatbotHeaderTitle.test.tsx","../src/ChatbotHeader/ChatbotHeaderTitle.tsx","../src/ChatbotHeader/index.ts","../src/ChatbotModal/ChatbotModal.test.tsx","../src/ChatbotModal/ChatbotModal.tsx","../src/ChatbotModal/index.ts","../src/ChatbotPopover/ChatbotPopover.tsx","../src/ChatbotPopover/index.ts","../src/ChatbotToggle/ChatbotToggle.test.tsx","../src/ChatbotToggle/ChatbotToggle.tsx","../src/ChatbotToggle/index.ts","../src/ChatbotWelcomePrompt/ChatbotWelcomePrompt.test.tsx","../src/ChatbotWelcomePrompt/ChatbotWelcomePrompt.tsx","../src/ChatbotWelcomePrompt/index.ts","../src/CodeModal/CodeModal.test.tsx","../src/CodeModal/CodeModal.tsx","../src/CodeModal/index.ts","../src/Compare/Compare.test.tsx","../src/Compare/Compare.tsx","../src/Compare/index.ts","../src/DeepThinking/DeepThinking.test.tsx","../src/DeepThinking/DeepThinking.tsx","../src/DeepThinking/index.ts","../src/FileDetails/FileDetails.test.tsx","../src/FileDetails/FileDetails.tsx","../src/FileDetails/index.ts","../src/FileDetailsLabel/FileDetailsLabel.test.tsx","../src/FileDetailsLabel/FileDetailsLabel.tsx","../src/FileDetailsLabel/index.ts","../src/FileDropZone/FileDropZone.test.tsx","../src/FileDropZone/FileDropZone.tsx","../src/FileDropZone/index.ts","../src/FilePreview/FilePreview.test.tsx","../src/FilePreview/FilePreview.tsx","../src/FilePreview/index.ts","../src/ImagePreview/ImagePreview.test.tsx","../src/ImagePreview/ImagePreview.tsx","../src/ImagePreview/index.ts","../src/LoadingMessage/LoadingMessage.test.tsx","../src/LoadingMessage/LoadingMessage.tsx","../src/LoadingMessage/index.ts","../src/Message/Message.test.tsx","../src/Message/Message.tsx","../src/Message/MessageInput.tsx","../src/Message/MessageLoading.tsx","../src/Message/index.ts","../src/Message/CodeBlockMessage/CodeBlockMessage.tsx","../src/Message/ErrorMessage/ErrorMessage.tsx","../src/Message/ImageMessage/ImageMessage.tsx","../src/Message/LinkMessage/LinkMessage.tsx","../src/Message/ListMessage/ListItemMessage.tsx","../src/Message/ListMessage/OrderedListMessage.tsx","../src/Message/ListMessage/UnorderedListMessage.tsx","../src/Message/Plugins/index.ts","../src/Message/Plugins/rehypeCodeBlockToggle.ts","../src/Message/Plugins/rehypeMoveImagesOutOfParagraphs.ts","../src/Message/QuickResponse/QuickResponse.tsx","../src/Message/QuickStarts/FallbackImg.tsx","../src/Message/QuickStarts/QuickStartTile.tsx","../src/Message/QuickStarts/QuickStartTileDescription.test.tsx","../src/Message/QuickStarts/QuickStartTileDescription.tsx","../src/Message/QuickStarts/QuickStartTileHeader.tsx","../src/Message/QuickStarts/monitor-sampleapp-quickstart-with-image.ts","../src/Message/QuickStarts/monitor-sampleapp-quickstart.ts","../src/Message/QuickStarts/types.ts","../src/Message/SuperscriptMessage/SuperscriptMessage.tsx","../src/Message/TableMessage/TableMessage.tsx","../src/Message/TableMessage/TbodyMessage.tsx","../src/Message/TableMessage/TdMessage.tsx","../src/Message/TableMessage/ThMessage.tsx","../src/Message/TableMessage/TheadMessage.tsx","../src/Message/TableMessage/TrMessage.tsx","../src/Message/TextMessage/TextMessage.tsx","../src/Message/UserFeedback/CloseButton.tsx","../src/Message/UserFeedback/UserFeedback.test.tsx","../src/Message/UserFeedback/UserFeedback.tsx","../src/Message/UserFeedback/UserFeedbackComplete.test.tsx","../src/Message/UserFeedback/UserFeedbackComplete.tsx","../src/MessageBar/AttachButton.test.tsx","../src/MessageBar/AttachButton.tsx","../src/MessageBar/MessageBar.test.tsx","../src/MessageBar/MessageBar.tsx","../src/MessageBar/MicrophoneButton.tsx","../src/MessageBar/SendButton.test.tsx","../src/MessageBar/SendButton.tsx","../src/MessageBar/StopButton.test.tsx","../src/MessageBar/StopButton.tsx","../src/MessageBar/index.ts","../src/MessageBox/JumpButton.test.tsx","../src/MessageBox/JumpButton.tsx","../src/MessageBox/MessageBox.test.tsx","../src/MessageBox/MessageBox.tsx","../src/MessageBox/index.ts","../src/MessageDivider/MessageDivider.test.tsx","../src/MessageDivider/MessageDivider.tsx","../src/MessageDivider/index.ts","../src/PreviewAttachment/PreviewAttachment.test.tsx","../src/PreviewAttachment/PreviewAttachment.tsx","../src/PreviewAttachment/index.ts","../src/ResponseActions/ResponseActionButton.test.tsx","../src/ResponseActions/ResponseActionButton.tsx","../src/ResponseActions/ResponseActions.test.tsx","../src/ResponseActions/ResponseActions.tsx","../src/ResponseActions/index.ts","../src/Settings/SettingsForm.test.tsx","../src/Settings/SettingsForm.tsx","../src/Settings/index.ts","../src/SourceDetailsMenuItem/SourceDetailsMenuItem.tsx","../src/SourceDetailsMenuItem/index.ts","../src/SourcesCard/SourcesCard.test.tsx","../src/SourcesCard/SourcesCard.tsx","../src/SourcesCard/index.ts","../src/TermsOfUse/TermsOfUse.test.tsx","../src/TermsOfUse/TermsOfUse.tsx","../src/TermsOfUse/index.ts","../src/ToolCall/ToolCall.test.tsx","../src/ToolCall/ToolCall.tsx","../src/ToolCall/index.ts","../src/ToolResponse/ToolResponse.test.tsx","../src/ToolResponse/ToolResponse.tsx","../src/ToolResponse/index.ts","../src/__mocks__/rehype-external-links.ts","../src/__mocks__/rehype-sanitize.ts","../src/__mocks__/rehype-unwrap-images.tsx","../src/tracking/console_tracking_provider.ts","../src/tracking/index.ts","../src/tracking/posthog_tracking_provider.ts","../src/tracking/segment_tracking_provider.ts","../src/tracking/trackingProviderProxy.ts","../src/tracking/tracking_api.ts","../src/tracking/tracking_registry.ts","../src/tracking/tracking_spi.ts","../src/tracking/umami_tracking_provider.ts"],"version":"5.6.3"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@patternfly/chatbot",
|
|
3
|
-
"version": "6.4.0-prerelease.
|
|
3
|
+
"version": "6.4.0-prerelease.22",
|
|
4
4
|
"description": "This library provides React components based on PatternFly 6 that can be used to build chatbots.",
|
|
5
5
|
"main": "dist/cjs/index.js",
|
|
6
6
|
"module": "dist/esm/index.js",
|
|
@@ -19,7 +19,7 @@ export const AttachmentEditModalExample: FunctionComponent = () => {
|
|
|
19
19
|
id="modal-compact-edit"
|
|
20
20
|
name="modal-compact-edit"
|
|
21
21
|
></Checkbox>
|
|
22
|
-
<Button onClick={handleModalToggle}>Launch modal</Button>
|
|
22
|
+
<Button onClick={handleModalToggle}>Launch attachment edit modal</Button>
|
|
23
23
|
<AttachmentEdit
|
|
24
24
|
code="I am a code snippet"
|
|
25
25
|
fileName="test.yaml"
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { useState, FunctionComponent, MouseEvent as ReactMouseEvent } from 'react';
|
|
2
|
+
import { Button, Checkbox } from '@patternfly/react-core';
|
|
3
|
+
import ImagePreview from '@patternfly/chatbot/dist/dynamic/ImagePreview';
|
|
4
|
+
import filePreview from './file-preview.svg';
|
|
5
|
+
|
|
6
|
+
export const AttachmentEditModalExample: FunctionComponent = () => {
|
|
7
|
+
const [isModalOpen, setIsModalOpen] = useState(false);
|
|
8
|
+
const [isCompact, setIsCompact] = useState(false);
|
|
9
|
+
const [hasNav, setHasNav] = useState(false);
|
|
10
|
+
|
|
11
|
+
const handleModalToggle = (_event: ReactMouseEvent | MouseEvent | KeyboardEvent) => {
|
|
12
|
+
setIsModalOpen(!isModalOpen);
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
return (
|
|
16
|
+
<>
|
|
17
|
+
<Checkbox
|
|
18
|
+
label="Show multiple images"
|
|
19
|
+
isChecked={hasNav}
|
|
20
|
+
onChange={() => setHasNav(!hasNav)}
|
|
21
|
+
id="modal-compact-image-has-nav"
|
|
22
|
+
name="modal-compact-image-has-nav"
|
|
23
|
+
></Checkbox>
|
|
24
|
+
<Checkbox
|
|
25
|
+
label="Show compact version"
|
|
26
|
+
isChecked={isCompact}
|
|
27
|
+
onChange={() => setIsCompact(!isCompact)}
|
|
28
|
+
id="modal-compact-image-preview"
|
|
29
|
+
name="modal-compact-image-preview"
|
|
30
|
+
></Checkbox>
|
|
31
|
+
<Button onClick={handleModalToggle}>Launch image preview modal</Button>
|
|
32
|
+
<ImagePreview
|
|
33
|
+
isModalOpen={isModalOpen}
|
|
34
|
+
handleModalToggle={handleModalToggle}
|
|
35
|
+
isCompact={isCompact}
|
|
36
|
+
onCloseFileDetailsLabel={() => {
|
|
37
|
+
// eslint-disable-next-line no-console
|
|
38
|
+
console.log('Clicked close button');
|
|
39
|
+
}}
|
|
40
|
+
images={
|
|
41
|
+
hasNav
|
|
42
|
+
? /* eslint-disable indent */
|
|
43
|
+
[
|
|
44
|
+
{ fileName: 'image1.png', fileSize: '134KB', image: <img src={filePreview} alt="Preview one" /> },
|
|
45
|
+
{ fileName: 'image2.png', fileSize: '134KB', image: <img src={filePreview} alt="Preview two" /> }
|
|
46
|
+
]
|
|
47
|
+
: [{ fileName: 'image.png', fileSize: '134KB', image: <img src={filePreview} alt="One" /> }]
|
|
48
|
+
/* eslint-enable indent */
|
|
49
|
+
}
|
|
50
|
+
></ImagePreview>
|
|
51
|
+
</>
|
|
52
|
+
);
|
|
53
|
+
};
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { FunctionComponent, useState } from 'react';
|
|
2
|
+
import Message from '@patternfly/chatbot/dist/dynamic/Message';
|
|
3
|
+
import patternflyAvatar from './patternfly_avatar.jpg';
|
|
4
|
+
import { Checkbox, Flex, FlexItem } from '@patternfly/react-core';
|
|
5
|
+
|
|
6
|
+
export const MessageWithToolCallExample: FunctionComponent = () => {
|
|
7
|
+
const [toolCallsAreLoading, setToolCallsAreLoading] = useState(false);
|
|
8
|
+
return (
|
|
9
|
+
<Flex direction={{ default: 'column' }} spaceItems={{ default: 'spaceItemsXl' }}>
|
|
10
|
+
<Checkbox
|
|
11
|
+
label="Tool calls are loading"
|
|
12
|
+
id="tool-calls-are-loading"
|
|
13
|
+
isChecked={toolCallsAreLoading}
|
|
14
|
+
onChange={() => {
|
|
15
|
+
setToolCallsAreLoading(!toolCallsAreLoading);
|
|
16
|
+
}}
|
|
17
|
+
/>
|
|
18
|
+
<FlexItem>
|
|
19
|
+
<Message
|
|
20
|
+
name="Bot"
|
|
21
|
+
role="bot"
|
|
22
|
+
avatar={patternflyAvatar}
|
|
23
|
+
content="This example has a static tool call title:"
|
|
24
|
+
toolCall={{
|
|
25
|
+
titleText: "Calling 'awesome_tool'",
|
|
26
|
+
loadingText: "Loading 'awesome_tool'",
|
|
27
|
+
isLoading: toolCallsAreLoading
|
|
28
|
+
}}
|
|
29
|
+
/>
|
|
30
|
+
<Message
|
|
31
|
+
name="Bot"
|
|
32
|
+
role="bot"
|
|
33
|
+
avatar={patternflyAvatar}
|
|
34
|
+
content="This example has an expandable tool call title, with an additional description::"
|
|
35
|
+
toolCall={{
|
|
36
|
+
titleText: "Calling 'awesome_tool_expansion'",
|
|
37
|
+
expandableContent: 'This is the expandable content for the tool call.',
|
|
38
|
+
isLoading: toolCallsAreLoading,
|
|
39
|
+
loadingText: "Loading 'awesome_tool_expansion'"
|
|
40
|
+
}}
|
|
41
|
+
/>
|
|
42
|
+
</FlexItem>
|
|
43
|
+
</Flex>
|
|
44
|
+
);
|
|
45
|
+
};
|
|
@@ -48,6 +48,8 @@ import userAvatar from './user_avatar.svg';
|
|
|
48
48
|
import squareImg from './PF-social-color-square.svg';
|
|
49
49
|
import { CSSProperties, useState, Fragment, FunctionComponent, MouseEvent as ReactMouseEvent, KeyboardEvent as ReactKeyboardEvent, Ref, isValidElement, cloneElement, Children, ReactNode, useRef, useEffect } from 'react';
|
|
50
50
|
import FilePreview from '@patternfly/chatbot/dist/dynamic/FilePreview';
|
|
51
|
+
import ImagePreview from '@patternfly/chatbot/dist/dynamic/ImagePreview';
|
|
52
|
+
import filePreview from './file-preview.svg';
|
|
51
53
|
|
|
52
54
|
The `content` prop of the `<Message>` component is passed to a `<Markdown>` component (from [react-markdown](https://remarkjs.github.io/react-markdown/)), which is configured to translate plain text strings into PatternFly [`<Content>` components](/components/content) and code blocks into PatternFly [`<CodeBlock>` components.](/components/code-block)
|
|
53
55
|
|
|
@@ -189,7 +191,7 @@ If you are using [model context protocol (MCP)](https://www.redhat.com/en/blog/m
|
|
|
189
191
|
|
|
190
192
|
### Messages with deep thinking
|
|
191
193
|
|
|
192
|
-
You can share details about the "thought process" behind an LLM's response, also known as deep thinking. To display a customizable, expandable card with these details, pass `deepThinking` to `<Message>` and provide a subheading (optional) and content body.
|
|
194
|
+
You can share details about the "thought process" behind an LLM's response, also known as deep thinking. To display a customizable, expandable card with these details, pass `deepThinking` to `<Message>` and provide a subheading (optional) and content body.
|
|
193
195
|
|
|
194
196
|
Because this is an evolving area, this card content is currently fully customizable.
|
|
195
197
|
|
|
@@ -197,6 +199,16 @@ Because this is an evolving area, this card content is currently fully customiza
|
|
|
197
199
|
|
|
198
200
|
```
|
|
199
201
|
|
|
202
|
+
### Messages with tool calls
|
|
203
|
+
|
|
204
|
+
If you are using [model context protocol (MCP)](https://www.redhat.com/en/blog/model-context-protocol-discover-missing-link-ai-integration), you can share tool call information with users as part of a message. To display a tool card card, pass `toolCalls` to `<Message>`. This card contains a title, actions for running the tool and cancelling, and optional descriptive text.
|
|
205
|
+
|
|
206
|
+
You can also display a loading animation until the tool call can be run. To visualize loading behavior in this example, select the "Tool calls are loading" checkbox.
|
|
207
|
+
|
|
208
|
+
```js file="./MessageWithToolCall.tsx"
|
|
209
|
+
|
|
210
|
+
```
|
|
211
|
+
|
|
200
212
|
### Messages with quick start tiles
|
|
201
213
|
|
|
202
214
|
[Quick start](/extensions/quick-starts/) tiles can be added to messages via the `quickStarts` prop. Users can initiate the quick start from a link within the message tile.
|
|
@@ -274,6 +286,14 @@ To allow users to edit an attached file, load a new code editor within the ChatB
|
|
|
274
286
|
|
|
275
287
|
```
|
|
276
288
|
|
|
289
|
+
### Image preview
|
|
290
|
+
|
|
291
|
+
To allow users to preview images, load a modal that contains a view of the file name, file size, and the image. Users can toggle between multiple images by using pagination controls at the bottom of the modal. Return users to the main ChatBot window once they close the modal.
|
|
292
|
+
|
|
293
|
+
```js file="./ImagePreview.tsx"
|
|
294
|
+
|
|
295
|
+
```
|
|
296
|
+
|
|
277
297
|
### File preview
|
|
278
298
|
|
|
279
299
|
If the contents of an attachment cannot be previewed, load a file preview modal with a view of the file name and an unavailable message. When users close the modal, return to the main ChatBot window.
|
|
@@ -19,7 +19,7 @@ export const PreviewAttachmentExample: FunctionComponent = () => {
|
|
|
19
19
|
id="modal-compact-preview"
|
|
20
20
|
name="modal-compact-preview"
|
|
21
21
|
></Checkbox>
|
|
22
|
-
<Button onClick={handleModalToggle}>Launch modal</Button>
|
|
22
|
+
<Button onClick={handleModalToggle}>Launch attachment preview modal</Button>
|
|
23
23
|
<PreviewAttachment
|
|
24
24
|
code="I am a code snippet"
|
|
25
25
|
fileName="test.yaml"
|