@patternfly/chatbot 2.1.0-prerelease.17 → 2.1.0-prerelease.19

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.
Files changed (48) hide show
  1. package/dist/cjs/ChatbotToggle/ChatbotToggle.d.ts +7 -1
  2. package/dist/cjs/ChatbotToggle/ChatbotToggle.js +4 -4
  3. package/dist/cjs/ChatbotToggle/ChatbotToggle.test.d.ts +1 -0
  4. package/dist/cjs/ChatbotToggle/ChatbotToggle.test.js +60 -0
  5. package/dist/cjs/Message/Message.d.ts +5 -1
  6. package/dist/cjs/Message/Message.js +8 -2
  7. package/dist/cjs/Message/Message.test.js +100 -4
  8. package/dist/cjs/ResponseActions/ResponseActions.test.js +38 -0
  9. package/dist/css/main.css +19 -12
  10. package/dist/css/main.css.map +1 -1
  11. package/dist/esm/ChatbotToggle/ChatbotToggle.d.ts +7 -1
  12. package/dist/esm/ChatbotToggle/ChatbotToggle.js +4 -4
  13. package/dist/esm/ChatbotToggle/ChatbotToggle.test.d.ts +1 -0
  14. package/dist/esm/ChatbotToggle/ChatbotToggle.test.js +55 -0
  15. package/dist/esm/Message/Message.d.ts +5 -1
  16. package/dist/esm/Message/Message.js +8 -2
  17. package/dist/esm/Message/Message.test.js +100 -4
  18. package/dist/esm/ResponseActions/ResponseActions.test.js +38 -0
  19. package/dist/tsconfig.tsbuildinfo +1 -1
  20. package/package.json +5 -1
  21. package/patternfly-docs/content/extensions/chatbot/examples/Messages/BotMessage.tsx +8 -0
  22. package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithAttachment.tsx +1 -1
  23. package/patternfly-docs/content/extensions/chatbot/examples/Messages/Messages.md +8 -2
  24. package/patternfly-docs/content/extensions/chatbot/examples/Messages/PF-social-color-square.svg +19 -0
  25. package/patternfly-docs/content/extensions/chatbot/examples/Messages/PF-social-dark-square.svg +19 -0
  26. package/patternfly-docs/content/extensions/chatbot/examples/Messages/UserMessage.tsx +8 -1
  27. package/patternfly-docs/content/extensions/chatbot/examples/Messages/user_avatar.svg +18 -0
  28. package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotToggleBasic.tsx +1 -1
  29. package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotWelcomeInteraction.tsx +3 -2
  30. package/patternfly-docs/content/extensions/chatbot/examples/UI/CustomClosedIcon.tsx +1 -1
  31. package/patternfly-docs/content/extensions/chatbot/examples/UI/SkipToContent.tsx +1 -1
  32. package/patternfly-docs/content/extensions/chatbot/examples/UI/SquareChatbotToggle.tsx +14 -0
  33. package/patternfly-docs/content/extensions/chatbot/examples/UI/UI.md +9 -1
  34. package/patternfly-docs/content/extensions/chatbot/examples/demos/AttachmentDemos.md +1 -1
  35. package/patternfly-docs/content/extensions/chatbot/examples/demos/Chatbot.md +1 -1
  36. package/patternfly-docs/content/extensions/chatbot/examples/demos/Chatbot.tsx +6 -4
  37. package/patternfly-docs/content/extensions/chatbot/examples/demos/ChatbotAttachment.tsx +3 -2
  38. package/patternfly-docs/content/extensions/chatbot/examples/demos/ChatbotAttachmentMenu.tsx +4 -3
  39. package/patternfly-docs/content/extensions/chatbot/examples/demos/EmbeddedChatbot.tsx +5 -3
  40. package/src/ChatbotToggle/ChatbotToggle.scss +11 -5
  41. package/src/ChatbotToggle/ChatbotToggle.test.tsx +47 -0
  42. package/src/ChatbotToggle/ChatbotToggle.tsx +15 -6
  43. package/src/Message/Message.scss +15 -9
  44. package/src/Message/Message.test.tsx +141 -4
  45. package/src/Message/Message.tsx +28 -3
  46. package/src/MessageBox/MessageBox.scss +2 -2
  47. package/src/ResponseActions/ResponseActions.test.tsx +44 -0
  48. package/patternfly-docs/content/extensions/chatbot/examples/Messages/user_avatar.jpg +0 -0
@@ -69,7 +69,12 @@ describe('Message', () => {
69
69
  expect(screen.getByText('User')).toBeTruthy();
70
70
  expect(screen.getByText('Hi')).toBeTruthy();
71
71
  const date = new Date();
72
- expect(screen.getByText(`${date.toLocaleDateString()}, ${date.toLocaleTimeString()}`)).toBeTruthy();
72
+ const formattedDate = date.toLocaleDateString();
73
+ expect(screen.getByText((content, element) => {
74
+ const hasText = content.includes(formattedDate);
75
+ const isVisible = (element === null || element === void 0 ? void 0 : element.tagName.toLowerCase()) !== 'script' && (element === null || element === void 0 ? void 0 : element.tagName.toLowerCase()) !== 'style';
76
+ return hasText && isVisible;
77
+ })).toBeInTheDocument();
73
78
  expect(screen.queryByText('Loading message')).toBeFalsy();
74
79
  expect(screen.getByRole('img')).toHaveAttribute('src', './img');
75
80
  });
@@ -79,7 +84,12 @@ describe('Message', () => {
79
84
  expect(screen.getByText('AI')).toBeTruthy();
80
85
  expect(screen.getByText('Hi')).toBeTruthy();
81
86
  const date = new Date();
82
- expect(screen.getByText(`${date.toLocaleDateString()}, ${date.toLocaleTimeString()}`)).toBeTruthy();
87
+ const formattedDate = date.toLocaleDateString();
88
+ expect(screen.getByText((content, element) => {
89
+ const hasText = content.includes(formattedDate);
90
+ const isVisible = (element === null || element === void 0 ? void 0 : element.tagName.toLowerCase()) !== 'script' && (element === null || element === void 0 ? void 0 : element.tagName.toLowerCase()) !== 'style';
91
+ return hasText && isVisible;
92
+ })).toBeInTheDocument();
83
93
  });
84
94
  it('should render avatar correctly', () => {
85
95
  render(React.createElement(Message, { avatar: "./testImg", role: "bot", name: "Bot", content: "Hi" }));
@@ -99,7 +109,12 @@ describe('Message', () => {
99
109
  expect(screen.getByText('Hi')).toBeTruthy();
100
110
  expect(screen.getByText('2 hours ago')).toBeTruthy();
101
111
  const date = new Date();
102
- expect(screen.queryByText(`${date.toLocaleDateString()}, ${date.toLocaleTimeString()}`)).toBeFalsy();
112
+ const formattedDate = date.toLocaleDateString();
113
+ expect(screen.queryByText((content, element) => {
114
+ const hasText = content.includes(formattedDate);
115
+ const isVisible = (element === null || element === void 0 ? void 0 : element.tagName.toLowerCase()) !== 'script' && (element === null || element === void 0 ? void 0 : element.tagName.toLowerCase()) !== 'style';
116
+ return hasText && isVisible;
117
+ })).not.toBeInTheDocument();
103
118
  });
104
119
  it('should render attachments', () => {
105
120
  render(React.createElement(Message, { avatar: "./img", role: "user", content: "Hi", attachments: [{ name: 'testAttachment' }] }));
@@ -129,7 +144,12 @@ describe('Message', () => {
129
144
  expect(screen.getByText('AI')).toBeTruthy();
130
145
  expect(screen.queryByText('Hi')).toBeFalsy();
131
146
  const date = new Date();
132
- expect(screen.getByText(`${date.toLocaleDateString()}, ${date.toLocaleTimeString()}`)).toBeTruthy();
147
+ const formattedDate = date.toLocaleDateString();
148
+ expect(screen.getByText((content, element) => {
149
+ const hasText = content.includes(formattedDate);
150
+ const isVisible = (element === null || element === void 0 ? void 0 : element.tagName.toLowerCase()) !== 'script' && (element === null || element === void 0 ? void 0 : element.tagName.toLowerCase()) !== 'style';
151
+ return hasText && isVisible;
152
+ })).toBeInTheDocument();
133
153
  expect(screen.getByText('Loading message')).toBeTruthy();
134
154
  });
135
155
  it('should be able to show sources', () => __awaiter(void 0, void 0, void 0, function* () {
@@ -157,6 +177,59 @@ describe('Message', () => {
157
177
  expect(screen.getByText('Loading message')).toBeTruthy();
158
178
  expect(screen.queryByText('Getting started with Red Hat OpenShift')).toBeFalsy();
159
179
  });
180
+ it('should be able to show quick response', () => __awaiter(void 0, void 0, void 0, function* () {
181
+ const spy = jest.fn();
182
+ render(React.createElement(Message, { avatar: "./img", role: "bot", name: "Bot", content: "Hi", quickResponses: [
183
+ {
184
+ id: '1',
185
+ content: 'Yes',
186
+ onClick: spy,
187
+ className: 'test'
188
+ }
189
+ ] }));
190
+ const quickResponse = screen.getByRole('button', { name: /Yes/i });
191
+ expect(quickResponse).toBeTruthy();
192
+ yield userEvent.click(quickResponse);
193
+ expect(spy).toHaveBeenCalledTimes(1);
194
+ }));
195
+ it('should be able to show more than 1 quick response', () => __awaiter(void 0, void 0, void 0, function* () {
196
+ const spy = jest.fn();
197
+ render(React.createElement(Message, { avatar: "./img", role: "bot", name: "Bot", content: "Hi", quickResponses: [
198
+ {
199
+ id: '1',
200
+ content: 'Yes',
201
+ onClick: spy
202
+ },
203
+ {
204
+ id: '2',
205
+ content: 'No',
206
+ onClick: spy
207
+ }
208
+ ] }));
209
+ expect(screen.getByRole('button', { name: /Yes/i })).toBeTruthy();
210
+ expect(screen.getByRole('button', { name: /No/i })).toBeTruthy();
211
+ }));
212
+ it('should be able to spread quickResponseContainerProps', () => __awaiter(void 0, void 0, void 0, function* () {
213
+ const spy = jest.fn();
214
+ render(React.createElement(Message, { avatar: "./img", role: "bot", name: "Bot", content: "Hi", quickResponses: [
215
+ {
216
+ id: '1',
217
+ content: 'Yes',
218
+ onClick: spy
219
+ },
220
+ {
221
+ id: '2',
222
+ content: 'No',
223
+ onClick: spy
224
+ }
225
+ ],
226
+ // this is a LabelGroup prop that changes the default number shown
227
+ // to be different than what we use in ChatBot
228
+ quickResponseContainerProps: { numLabels: 1 } }));
229
+ expect(screen.getByRole('button', { name: /Yes/i })).toBeTruthy();
230
+ expect(screen.queryByRole('button', { name: /No/i })).toBeFalsy();
231
+ expect(screen.getByRole('button', { name: /1 more/i }));
232
+ }));
160
233
  it('should be able to show actions', () => __awaiter(void 0, void 0, void 0, function* () {
161
234
  render(React.createElement(Message, { avatar: "./img", role: "bot", name: "Bot", content: "Hi", actions: {
162
235
  // eslint-disable-next-line no-console
@@ -231,4 +304,27 @@ describe('Message', () => {
231
304
  render(React.createElement(Message, { avatar: "./img", role: "user", name: "User", content: CODE_MESSAGE, codeBlockProps: { 'aria-label': 'test' } }));
232
305
  expect(screen.getByRole('button', { name: 'test' })).toBeTruthy();
233
306
  });
307
+ it('should handle hasRoundAvatar correctly when it is true', () => {
308
+ render(React.createElement(Message, { avatar: "./img", role: "user", name: "User", content: "Hi", hasRoundAvatar: true }));
309
+ expect(screen.getByRole('img')).toBeTruthy();
310
+ expect(screen.getByRole('img')).toHaveClass('pf-chatbot__message-avatar');
311
+ expect(screen.getByRole('img')).toHaveClass('pf-chatbot__message-avatar--round');
312
+ });
313
+ it('should handle hasRoundAvatar correctly when it is false', () => {
314
+ render(React.createElement(Message, { avatar: "./img", role: "user", name: "User", content: "Hi", hasRoundAvatar: false }));
315
+ expect(screen.getByRole('img')).toBeTruthy();
316
+ expect(screen.getByRole('img')).toHaveClass('pf-chatbot__message-avatar');
317
+ expect(screen.getByRole('img')).not.toHaveClass('pf-chatbot__message-avatar--round');
318
+ });
319
+ it('should handle avatarProps correctly by spreading it onto the Message Avatar', () => {
320
+ render(React.createElement(Message, { avatar: "./img", role: "user", name: "User", content: "Hi", avatarProps: { className: 'test' } }));
321
+ expect(screen.getByRole('img')).toBeTruthy();
322
+ expect(screen.getByRole('img')).toHaveClass('test');
323
+ });
324
+ it('should handle avatarProps and hasRoundAvatar correctly', () => {
325
+ render(React.createElement(Message, { avatar: "./img", role: "user", name: "User", content: "Hi", avatarProps: { className: 'test' }, hasRoundAvatar: false }));
326
+ expect(screen.getByRole('img')).toBeTruthy();
327
+ expect(screen.getByRole('img')).toHaveClass('test');
328
+ expect(screen.getByRole('img')).toHaveClass('pf-chatbot__message-avatar');
329
+ });
234
330
  });
@@ -12,6 +12,7 @@ import { render, screen } from '@testing-library/react';
12
12
  import '@testing-library/jest-dom';
13
13
  import ResponseActions from './ResponseActions';
14
14
  import userEvent from '@testing-library/user-event';
15
+ import { DownloadIcon, InfoCircleIcon, RedoIcon } from '@patternfly/react-icons';
15
16
  const ALL_ACTIONS = [
16
17
  { type: 'positive', label: 'Good response' },
17
18
  { type: 'negative', label: 'Bad response' },
@@ -19,6 +20,28 @@ const ALL_ACTIONS = [
19
20
  { type: 'share', label: 'Share' },
20
21
  { type: 'listen', label: 'Listen' }
21
22
  ];
23
+ const CUSTOM_ACTIONS = [
24
+ {
25
+ regenerate: {
26
+ ariaLabel: 'Regenerate',
27
+ onClick: jest.fn(),
28
+ tooltipContent: 'Regenerate',
29
+ icon: React.createElement(RedoIcon, null)
30
+ },
31
+ download: {
32
+ ariaLabel: 'Download',
33
+ onClick: jest.fn(),
34
+ tooltipContent: 'Download',
35
+ icon: React.createElement(DownloadIcon, null)
36
+ },
37
+ info: {
38
+ ariaLabel: 'Info',
39
+ onClick: jest.fn(),
40
+ tooltipContent: 'Info',
41
+ icon: React.createElement(InfoCircleIcon, null)
42
+ }
43
+ }
44
+ ];
22
45
  describe('ResponseActions', () => {
23
46
  it('should render buttons correctly', () => {
24
47
  ALL_ACTIONS.forEach(({ type, label }) => {
@@ -59,4 +82,19 @@ describe('ResponseActions', () => {
59
82
  expect(screen.getByRole('button', { name: label })).toHaveClass('test');
60
83
  });
61
84
  });
85
+ it('should be able to add custom actions', () => {
86
+ CUSTOM_ACTIONS.forEach((action) => {
87
+ const key = Object.keys(action)[0];
88
+ render(React.createElement(ResponseActions, { actions: {
89
+ [key]: {
90
+ tooltipContent: action[key].tooltipContent,
91
+ onClick: action[key].onClick,
92
+ // doing this just because it's easier to test without a regex for the button name
93
+ ariaLabel: action[key].ariaLabel.toLowerCase(),
94
+ icon: action[key].icon
95
+ }
96
+ } }));
97
+ expect(screen.getByRole('button', { name: key })).toBeTruthy();
98
+ });
99
+ });
62
100
  });
@@ -1 +1 @@
1
- {"root":["../src/index.ts","../src/AttachMenu/AttachMenu.tsx","../src/AttachMenu/index.ts","../src/AttachmentEdit/AttachmentEdit.tsx","../src/AttachmentEdit/index.ts","../src/Chatbot/Chatbot.tsx","../src/Chatbot/index.ts","../src/ChatbotAlert/ChatbotAlert.tsx","../src/ChatbotAlert/index.ts","../src/ChatbotContent/ChatbotContent.tsx","../src/ChatbotContent/index.ts","../src/ChatbotConversationHistoryNav/ChatbotConversationHistoryDropdown.tsx","../src/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.tsx","../src/ChatbotConversationHistoryNav/index.ts","../src/ChatbotFooter/ChatbotFooter.tsx","../src/ChatbotFooter/ChatbotFootnote.tsx","../src/ChatbotFooter/index.ts","../src/ChatbotHeader/ChatbotHeader.tsx","../src/ChatbotHeader/ChatbotHeaderActions.tsx","../src/ChatbotHeader/ChatbotHeaderMain.tsx","../src/ChatbotHeader/ChatbotHeaderMenu.tsx","../src/ChatbotHeader/ChatbotHeaderOptionsDropdown.tsx","../src/ChatbotHeader/ChatbotHeaderSelectorDropdown.tsx","../src/ChatbotHeader/ChatbotHeaderTitle.tsx","../src/ChatbotHeader/index.ts","../src/ChatbotModal/ChatbotModal.tsx","../src/ChatbotModal/index.ts","../src/ChatbotPopover/ChatbotPopover.tsx","../src/ChatbotPopover/index.ts","../src/ChatbotToggle/ChatbotToggle.tsx","../src/ChatbotToggle/index.ts","../src/ChatbotWelcomePrompt/ChatbotWelcomePrompt.test.tsx","../src/ChatbotWelcomePrompt/ChatbotWelcomePrompt.tsx","../src/ChatbotWelcomePrompt/index.ts","../src/CodeModal/CodeModal.tsx","../src/CodeModal/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/LoadingMessage/LoadingMessage.test.tsx","../src/LoadingMessage/LoadingMessage.tsx","../src/LoadingMessage/index.ts","../src/Message/Message.test.tsx","../src/Message/Message.tsx","../src/Message/MessageLoading.tsx","../src/Message/index.ts","../src/Message/CodeBlockMessage/CodeBlockMessage.tsx","../src/Message/ListMessage/ListItemMessage.tsx","../src/Message/ListMessage/OrderedListMessage.tsx","../src/Message/ListMessage/UnorderedListMessage.tsx","../src/Message/TextMessage/TextMessage.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.tsx","../src/MessageBox/index.ts","../src/PreviewAttachment/PreviewAttachment.tsx","../src/PreviewAttachment/index.ts","../src/ResponseActions/ResponseActionButton.tsx","../src/ResponseActions/ResponseActions.test.tsx","../src/ResponseActions/ResponseActions.tsx","../src/ResponseActions/index.ts","../src/SourceDetailsMenuItem/SourceDetailsMenuItem.tsx","../src/SourceDetailsMenuItem/index.ts","../src/SourcesCard/SourcesCard.test.tsx","../src/SourcesCard/SourcesCard.tsx","../src/SourcesCard/index.ts"],"version":"5.6.3"}
1
+ {"root":["../src/index.ts","../src/AttachMenu/AttachMenu.tsx","../src/AttachMenu/index.ts","../src/AttachmentEdit/AttachmentEdit.tsx","../src/AttachmentEdit/index.ts","../src/Chatbot/Chatbot.tsx","../src/Chatbot/index.ts","../src/ChatbotAlert/ChatbotAlert.tsx","../src/ChatbotAlert/index.ts","../src/ChatbotContent/ChatbotContent.tsx","../src/ChatbotContent/index.ts","../src/ChatbotConversationHistoryNav/ChatbotConversationHistoryDropdown.tsx","../src/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.tsx","../src/ChatbotConversationHistoryNav/index.ts","../src/ChatbotFooter/ChatbotFooter.tsx","../src/ChatbotFooter/ChatbotFootnote.tsx","../src/ChatbotFooter/index.ts","../src/ChatbotHeader/ChatbotHeader.tsx","../src/ChatbotHeader/ChatbotHeaderActions.tsx","../src/ChatbotHeader/ChatbotHeaderMain.tsx","../src/ChatbotHeader/ChatbotHeaderMenu.tsx","../src/ChatbotHeader/ChatbotHeaderOptionsDropdown.tsx","../src/ChatbotHeader/ChatbotHeaderSelectorDropdown.tsx","../src/ChatbotHeader/ChatbotHeaderTitle.tsx","../src/ChatbotHeader/index.ts","../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.tsx","../src/CodeModal/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/LoadingMessage/LoadingMessage.test.tsx","../src/LoadingMessage/LoadingMessage.tsx","../src/LoadingMessage/index.ts","../src/Message/Message.test.tsx","../src/Message/Message.tsx","../src/Message/MessageLoading.tsx","../src/Message/index.ts","../src/Message/CodeBlockMessage/CodeBlockMessage.tsx","../src/Message/ListMessage/ListItemMessage.tsx","../src/Message/ListMessage/OrderedListMessage.tsx","../src/Message/ListMessage/UnorderedListMessage.tsx","../src/Message/TextMessage/TextMessage.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.tsx","../src/MessageBox/index.ts","../src/PreviewAttachment/PreviewAttachment.tsx","../src/PreviewAttachment/index.ts","../src/ResponseActions/ResponseActionButton.tsx","../src/ResponseActions/ResponseActions.test.tsx","../src/ResponseActions/ResponseActions.tsx","../src/ResponseActions/index.ts","../src/SourceDetailsMenuItem/SourceDetailsMenuItem.tsx","../src/SourceDetailsMenuItem/index.ts","../src/SourcesCard/SourcesCard.test.tsx","../src/SourcesCard/SourcesCard.tsx","../src/SourcesCard/index.ts"],"version":"5.6.3"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@patternfly/chatbot",
3
- "version": "2.1.0-prerelease.17",
3
+ "version": "2.1.0-prerelease.19",
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",
@@ -75,5 +75,9 @@
75
75
  "victory-cursor-container": "^37.1.1",
76
76
  "victory-tooltip": "^37.1.1",
77
77
  "victory-bar": "^37.1.1"
78
+ },
79
+ "overrides": {
80
+ "puppeteer": "^23.6.1",
81
+ "puppeteer-cluster": "^0.24.0"
78
82
  }
79
83
  }
@@ -1,6 +1,7 @@
1
1
  import React from 'react';
2
2
  import Message from '@patternfly/chatbot/dist/dynamic/Message';
3
3
  import patternflyAvatar from './patternfly_avatar.jpg';
4
+ import squareImg from './PF-social-color-square.svg';
4
5
 
5
6
  export const BotMessageExample: React.FunctionComponent = () => {
6
7
  const markdown = `
@@ -82,6 +83,13 @@ export default MessageLoading;
82
83
  avatar={patternflyAvatar}
83
84
  content="Text-based message, where the bot's name is truncated"
84
85
  />
86
+ <Message
87
+ name="Bot"
88
+ role="bot"
89
+ avatar={squareImg}
90
+ content="Text-based message from a bot with a square avatar. You can further customize the avatar by applying an additional class or passing [PatternFly avatar props](/components/avatar) to the `<Message>` component via `avatarProps`."
91
+ hasRoundAvatar={false}
92
+ />
85
93
  </>
86
94
  );
87
95
  };
@@ -3,7 +3,7 @@ import React from 'react';
3
3
  import Message from '@patternfly/chatbot/dist/dynamic/Message';
4
4
  import PreviewAttachment from '@patternfly/chatbot/dist/dynamic/PreviewAttachment';
5
5
  import AttachmentEdit from '@patternfly/chatbot/dist/dynamic/AttachmentEdit';
6
- import userAvatar from './user_avatar.jpg';
6
+ import userAvatar from './user_avatar.svg';
7
7
 
8
8
  interface ModalData {
9
9
  code: string;
@@ -33,7 +33,6 @@ import InfoCircleIcon from '@patternfly/react-icons/dist/esm/icons/info-circle-i
33
33
  import DownloadIcon from '@patternfly/react-icons/dist/esm/icons/download-icon';
34
34
  import RedoIcon from '@patternfly/react-icons/dist/esm/icons/redo-icon';
35
35
  import patternflyAvatar from './patternfly_avatar.jpg';
36
- import userAvatar from './user_avatar.jpg';
37
36
  import AttachmentEdit from '@patternfly/chatbot/dist/dynamic/AttachmentEdit';
38
37
  import FileDetails from '@patternfly/chatbot/dist/dynamic/FileDetails';
39
38
  import FileDetailsLabel from '@patternfly/chatbot/dist/dynamic/FileDetailsLabel';
@@ -41,6 +40,9 @@ import FileDropZone from '@patternfly/chatbot/dist/dynamic/FileDropZone';
41
40
  import { PreviewAttachment } from '@patternfly/chatbot/dist/dynamic/PreviewAttachment';
42
41
  import ChatbotAlert from '@patternfly/chatbot/dist/dynamic/ChatbotAlert';
43
42
 
43
+ import userAvatar from './user_avatar.svg';
44
+ import squareImg from './PF-social-color-square.svg';
45
+
44
46
  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)
45
47
 
46
48
  ## Messages
@@ -53,6 +55,10 @@ Messages from the chatbot will be marked with an "AI" label to clearly communica
53
55
 
54
56
  By default, a date and timestamp is displayed with each message. We recommend using the `timestamp` prop in real chatbots, since it will allow you to set persistent dates and times on messages, even if the messages re-render. You can update `timestamp` with a different [date and time format](/ux-writing/numerics) as needed.
55
57
 
58
+ <br />
59
+
60
+ You can further customize the avatar by applying an additional class or passing [PatternFly avatar props](/components/avatar) to the `<Message>` component via `avatarProps`.
61
+
56
62
  ```js file="./BotMessage.tsx"
57
63
 
58
64
  ```
@@ -101,7 +107,7 @@ The API for a source requires a link at minimum, but we strongly recommend provi
101
107
 
102
108
  ### User messages
103
109
 
104
- Messages from users have a different background color to differentiate them from bot messages. You can also display a custom avatar that is uploaded by the user.
110
+ Messages from users have a different background color to differentiate them from bot messages. You can also display a custom avatar that is uploaded by the user. You can further customize the avatar by applying an additional class or passing [PatternFly avatar props](/components/avatar) to the `<Message>` component via `avatarProps`.
105
111
 
106
112
  ```js file="./UserMessage.tsx"
107
113
 
@@ -0,0 +1,19 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <svg width="228px" height="228px" viewBox="0 0 228 228" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
3
+ <title>PF-social-color-square </title>
4
+ <defs>
5
+ <linearGradient x1="100%" y1="1.31838984e-13%" x2="40.4021492%" y2="59.4473677%" id="linearGradient-1">
6
+ <stop stop-color="#FFFFFF" offset="0%"></stop>
7
+ <stop stop-color="#FFFFFF" stop-opacity="0.498497596" offset="100%"></stop>
8
+ </linearGradient>
9
+ </defs>
10
+ <g id="PF-social-color-square" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
11
+ <g id="Group-2">
12
+ <rect id="Rectangle" fill="#0066CC" x="0" y="0" width="228" height="228" rx="8"></rect>
13
+ <g id="Group" transform="translate(27, 27)">
14
+ <path d="M69,0 L175,0 L175,106 C116.457817,106 69,58.5421835 69,0 L69,0 L69,0 Z" id="Rectangle-Copy-15" fill="#FFFFFF" opacity="0.4"></path>
15
+ <path d="M175,2.04658255 L175,152.848101 C175,165.082257 165.082257,175 152.848101,175 L73.5063044,175 L175,2.04658255 Z M172.953417,4.68958206e-13 L1.98951966e-13,101.493696 L1.98951966e-13,22.1518987 C1.98951966e-13,9.91774288 9.91774288,4.68958206e-13 22.1518987,4.54747351e-13 L172.953417,4.68958206e-13 Z" id="Combined-Shape-Copy-4" fill="url(#linearGradient-1)"></path>
16
+ </g>
17
+ </g>
18
+ </g>
19
+ </svg>
@@ -0,0 +1,19 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <svg width="228px" height="228px" viewBox="0 0 228 228" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
3
+ <title>PF-social-dark-square </title>
4
+ <defs>
5
+ <linearGradient x1="100%" y1="1.31838984e-13%" x2="40.4021492%" y2="59.4473677%" id="linearGradient-1">
6
+ <stop stop-color="#FFFFFF" offset="0%"></stop>
7
+ <stop stop-color="#FFFFFF" stop-opacity="0.498497596" offset="100%"></stop>
8
+ </linearGradient>
9
+ </defs>
10
+ <g id="PF-social-dark-square" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
11
+ <g id="Group-2">
12
+ <rect id="Rectangle" fill="#212427" x="0" y="0" width="228" height="228" rx="8"></rect>
13
+ <g id="Group" transform="translate(27, 27)">
14
+ <path d="M69,0 L175,0 L175,106 C116.457817,106 69,58.5421835 69,0 L69,0 L69,0 Z" id="Rectangle-Copy-15" fill="#FFFFFF" opacity="0.4"></path>
15
+ <path d="M175,2.04658255 L175,152.848101 C175,165.082257 165.082257,175 152.848101,175 L73.5063044,175 L175,2.04658255 Z M172.953417,1.42108547e-14 L1.98951966e-13,101.493696 L1.98951966e-13,22.1518987 C1.98951966e-13,9.91774288 9.91774288,1.42108547e-14 22.1518987,0 L172.953417,1.42108547e-14 Z" id="Combined-Shape-Copy-4" fill="url(#linearGradient-1)"></path>
16
+ </g>
17
+ </g>
18
+ </g>
19
+ </svg>
@@ -1,7 +1,7 @@
1
1
  import React from 'react';
2
2
 
3
3
  import Message from '@patternfly/chatbot/dist/dynamic/Message';
4
- import userAvatar from './user_avatar.jpg';
4
+ import userAvatar from './user_avatar.svg';
5
5
 
6
6
  export const UserMessageExample: React.FunctionComponent = () => {
7
7
  const markdown = `A paragraph with *emphasis* and **strong importance**.
@@ -32,6 +32,13 @@ Here is an unordered list:
32
32
  avatar={userAvatar}
33
33
  />
34
34
  <Message name="User" role="user" content={markdown} avatar={userAvatar} />
35
+ <Message
36
+ name="User"
37
+ role="user"
38
+ content="Example user message with `avatarProps` set to add a border"
39
+ avatar={userAvatar}
40
+ avatarProps={{ isBordered: true }}
41
+ />
35
42
  </>
36
43
  );
37
44
  };
@@ -0,0 +1,18 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <!-- Generator: Adobe Illustrator 24.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
3
+ <svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
4
+ viewBox="0 0 36 36" style="enable-background:new 0 0 36 36;" xml:space="preserve">
5
+ <style type="text/css">
6
+ .st0{fill-rule:evenodd;clip-rule:evenodd;fill:#F0F0F0;}
7
+ .st1{fill-rule:evenodd;clip-rule:evenodd;fill:#D2D2D2;}
8
+ .st2{fill:#B8BBBE;}
9
+ .st3{fill:#D2D2D2;}
10
+ </style>
11
+ <rect class="st0" width="36" height="36"/>
12
+ <path class="st1" d="M17.7,20.1c-3.5,0-6.4-2.9-6.4-6.4s2.9-6.4,6.4-6.4s6.4,2.9,6.4,6.4S21.3,20.1,17.7,20.1z"/>
13
+ <path class="st2" d="M13.3,36l0-6.7c-2,0.4-2.9,1.4-3.1,3.5L10.1,36H13.3z"/>
14
+ <path class="st3" d="M10.1,36l0.1-3.2c0.2-2.1,1.1-3.1,3.1-3.5l0,6.7h9.4l0-6.7c2,0.4,2.9,1.4,3.1,3.5l0.1,3.2h4.7
15
+ c-0.4-3.9-1.3-9-2.9-11c-1.1-1.4-2.3-2.2-3.5-2.6s-1.8-0.6-6.3-0.6s-6.1,0.7-6.1,0.7c-1.2,0.4-2.4,1.2-3.4,2.6
16
+ C6.7,27,5.8,32.2,5.4,36H10.1z"/>
17
+ <path class="st2" d="M25.9,36l-0.1-3.2c-0.2-2.1-1.1-3.1-3.1-3.5l0,6.7H25.9z"/>
18
+ </svg>
@@ -5,7 +5,7 @@ export const BasicDemo: React.FunctionComponent = () => {
5
5
  const [chatbotVisible, setChatbotVisible] = React.useState<boolean>(false);
6
6
  return (
7
7
  <ChatbotToggle
8
- toolTipLabel="Chatbot"
8
+ tooltipLabel="Chatbot"
9
9
  isChatbotVisible={chatbotVisible}
10
10
  onToggleChatbot={() => setChatbotVisible(!chatbotVisible)}
11
11
  />
@@ -7,7 +7,7 @@ import ChatbotFooter from '@patternfly/chatbot/dist/dynamic/ChatbotFooter';
7
7
  import MessageBar from '@patternfly/chatbot/dist/dynamic/MessageBar';
8
8
  import MessageBox from '@patternfly/chatbot/dist/dynamic/MessageBox';
9
9
  import Message, { MessageProps } from '@patternfly/chatbot/dist/dynamic/Message';
10
- import userAvatar from '../Messages/user_avatar.jpg';
10
+ import userAvatar from '../Messages/user_avatar.svg';
11
11
  import patternflyAvatar from '../Messages/patternfly_avatar.jpg';
12
12
  import { FormGroup, Radio } from '@patternfly/react-core';
13
13
 
@@ -41,7 +41,8 @@ export const ChatbotWelcomeInteractionDemo: React.FunctionComponent = () => {
41
41
  content: message,
42
42
  name: 'User',
43
43
  avatar: userAvatar,
44
- timestamp: date.toLocaleString()
44
+ timestamp: date.toLocaleString(),
45
+ avatarProps: { isBordered: true }
45
46
  });
46
47
  newMessages.push({
47
48
  id: generateId(),
@@ -80,7 +80,7 @@ export const BasicDemo: React.FunctionComponent = () => {
80
80
 
81
81
  return (
82
82
  <ChatbotToggle
83
- toolTipLabel="Virtual assistant"
83
+ tooltipLabel="Virtual assistant"
84
84
  isChatbotVisible={chatbotVisible}
85
85
  onToggleChatbot={() => setChatbotVisible(!chatbotVisible)}
86
86
  closedToggleIcon={closedToggleIcon}
@@ -26,7 +26,7 @@ export const ChatbotDemo: React.FunctionComponent = () => {
26
26
  Skip to chatbot
27
27
  </SkipToContent>
28
28
  <ChatbotToggle
29
- toolTipLabel="Chatbot"
29
+ tooltipLabel="Chatbot"
30
30
  isChatbotVisible={chatbotVisible}
31
31
  onToggleChatbot={() => setChatbotVisible(!chatbotVisible)}
32
32
  id="chatbot-toggle"
@@ -0,0 +1,14 @@
1
+ import React from 'react';
2
+ import ChatbotToggle from '@patternfly/virtual-assistant/dist/dynamic/ChatbotToggle';
3
+
4
+ export const SquareChatbotToggle: React.FunctionComponent = () => {
5
+ const [chatbotVisible, setChatbotVisible] = React.useState<boolean>(false);
6
+ return (
7
+ <ChatbotToggle
8
+ tooltipLabel="Chatbot"
9
+ isChatbotVisible={chatbotVisible}
10
+ onToggleChatbot={() => setChatbotVisible(!chatbotVisible)}
11
+ isRound={false}
12
+ />
13
+ );
14
+ };
@@ -76,7 +76,7 @@ import ExpandIcon from '@patternfly/react-icons/dist/esm/icons/expand-icon';
76
76
  import OpenDrawerRightIcon from '@patternfly/react-icons/dist/esm/icons/open-drawer-right-icon';
77
77
  import PFHorizontalLogoColor from './PF-HorizontalLogo-Color.svg';
78
78
  import PFHorizontalLogoReverse from './PF-HorizontalLogo-Reverse.svg';
79
- import userAvatar from '../Messages/user_avatar.jpg';
79
+ import userAvatar from '../Messages/user_avatar.svg';
80
80
  import patternflyAvatar from '../Messages/patternfly_avatar.jpg';
81
81
 
82
82
  ## Structure
@@ -164,6 +164,14 @@ A custom icon can be passed to the toggle. To ensure the icon is visible in both
164
164
 
165
165
  ```
166
166
 
167
+ ### Custom toggle shape
168
+
169
+ A custom shape can be set for the toggle. To override the default circle shape, set `isRound` to `false`. This will set the toggle to a square shape, but you can pass in additional classes to further customize the shape.
170
+
171
+ ```js file="./SquareChatbotToggle.tsx" isFullscreen
172
+
173
+ ```
174
+
167
175
  ## Header
168
176
 
169
177
  ### Header sections
@@ -42,7 +42,7 @@ import OpenDrawerRightIcon from '@patternfly/react-icons/dist/esm/icons/open-dra
42
42
  import OutlinedWindowRestoreIcon from '@patternfly/react-icons/dist/esm/icons/outlined-window-restore-icon';
43
43
  import PFIconLogoColor from '../UI/PF-IconLogo-Color.svg';
44
44
  import PFIconLogoReverse from '../UI/PF-IconLogo-Reverse.svg';
45
- import userAvatar from '../Messages/user_avatar.jpg';
45
+ import userAvatar from '../Messages/user_avatar.svg';
46
46
  import patternflyAvatar from '../Messages/patternfly_avatar.jpg';
47
47
 
48
48
  ## Demos
@@ -53,7 +53,7 @@ import PFHorizontalLogoColor from '../UI/PF-HorizontalLogo-Color.svg';
53
53
  import PFHorizontalLogoReverse from '../UI/PF-HorizontalLogo-Reverse.svg';
54
54
  import PFIconLogoColor from '../UI/PF-IconLogo-Color.svg';
55
55
  import PFIconLogoReverse from '../UI/PF-IconLogo-Reverse.svg';
56
- import userAvatar from '../Messages/user_avatar.jpg';
56
+ import userAvatar from '../Messages/user_avatar.svg';
57
57
  import patternflyAvatar from '../Messages/patternfly_avatar.jpg';
58
58
 
59
59
  ### Basic chatbot
@@ -30,7 +30,7 @@ import PFHorizontalLogoColor from '../UI/PF-HorizontalLogo-Color.svg';
30
30
  import PFHorizontalLogoReverse from '../UI/PF-HorizontalLogo-Reverse.svg';
31
31
  import PFIconLogoColor from '../UI/PF-IconLogo-Color.svg';
32
32
  import PFIconLogoReverse from '../UI/PF-IconLogo-Reverse.svg';
33
- import userAvatar from '../Messages/user_avatar.jpg';
33
+ import userAvatar from '../Messages/user_avatar.svg';
34
34
  import patternflyAvatar from '../Messages/patternfly_avatar.jpg';
35
35
 
36
36
  const footnoteProps = {
@@ -102,7 +102,8 @@ const initialMessages: MessageProps[] = [
102
102
  content: 'Hello, can you give me an example of what you can do?',
103
103
  name: 'User',
104
104
  avatar: userAvatar,
105
- timestamp: date.toLocaleString()
105
+ timestamp: date.toLocaleString(),
106
+ avatarProps: { isBordered: true }
106
107
  },
107
108
  {
108
109
  id: '2',
@@ -222,7 +223,8 @@ export const ChatbotDemo: React.FunctionComponent = () => {
222
223
  content: message,
223
224
  name: 'User',
224
225
  avatar: userAvatar,
225
- timestamp: date.toLocaleString()
226
+ timestamp: date.toLocaleString(),
227
+ avatarProps: { isBordered: true }
226
228
  });
227
229
  newMessages.push({
228
230
  id: generateId(),
@@ -335,7 +337,7 @@ export const ChatbotDemo: React.FunctionComponent = () => {
335
337
  Skip to chatbot
336
338
  </SkipToContent>
337
339
  <ChatbotToggle
338
- toolTipLabel="Chatbot"
340
+ tooltipLabel="Chatbot"
339
341
  isChatbotVisible={chatbotVisible}
340
342
  onToggleChatbot={() => setChatbotVisible(!chatbotVisible)}
341
343
  id="chatbot-toggle"
@@ -27,7 +27,7 @@ import PFHorizontalLogoColor from '../UI/PF-HorizontalLogo-Color.svg';
27
27
  import PFHorizontalLogoReverse from '../UI/PF-HorizontalLogo-Reverse.svg';
28
28
  import PFIconLogoColor from '../UI/PF-IconLogo-Color.svg';
29
29
  import PFIconLogoReverse from '../UI/PF-IconLogo-Reverse.svg';
30
- import userAvatar from '../Messages/user_avatar.jpg';
30
+ import userAvatar from '../Messages/user_avatar.svg';
31
31
  import patternflyAvatar from '../Messages/patternfly_avatar.jpg';
32
32
 
33
33
  interface ModalData {
@@ -54,6 +54,7 @@ export const BasicDemo: React.FunctionComponent = () => {
54
54
  content: "I'm referring to this attachment for added context in our conversation.",
55
55
  name: 'User',
56
56
  avatar: userAvatar,
57
+ avatarProps: { isBordered: true },
57
58
  attachmentName: 'auth-operator.yml',
58
59
  attachmentId: '1',
59
60
  onAttachmentClose,
@@ -167,7 +168,7 @@ export const BasicDemo: React.FunctionComponent = () => {
167
168
  return (
168
169
  <>
169
170
  <ChatbotToggle
170
- toolTipLabel="Chatbot"
171
+ tooltipLabel="Chatbot"
171
172
  isChatbotVisible={chatbotVisible}
172
173
  onToggleChatbot={() => {
173
174
  setChatbotVisible(!chatbotVisible);
@@ -14,7 +14,7 @@ import { Divider, DropdownGroup, DropdownItem, DropdownList, DropEvent } from '@
14
14
  import FileDetailsLabel from '@patternfly/chatbot/dist/dynamic/FileDetailsLabel';
15
15
  import { BellIcon, CalendarAltIcon, ClipboardIcon, CodeIcon, UploadIcon } from '@patternfly/react-icons';
16
16
  import { useDropzone } from 'react-dropzone';
17
- import userAvatar from '../Messages/user_avatar.jpg';
17
+ import userAvatar from '../Messages/user_avatar.svg';
18
18
  import patternflyAvatar from '../Messages/patternfly_avatar.jpg';
19
19
 
20
20
  const initialMenuItems = [
@@ -71,7 +71,8 @@ const messages: MessageProps[] = [
71
71
  role: 'user',
72
72
  content: 'Hello, can you give me an example of what you can do?',
73
73
  name: 'User',
74
- avatar: userAvatar
74
+ avatar: userAvatar,
75
+ avatarProps: { isBordered: true }
75
76
  },
76
77
  {
77
78
  role: 'bot',
@@ -210,7 +211,7 @@ export const AttachmentMenuDemo: React.FunctionComponent = () => {
210
211
  {/* this is required for react-dropzone to work in Safari and Firefox */}
211
212
  <input {...getInputProps()} />
212
213
  <ChatbotToggle
213
- toolTipLabel="Chatbot"
214
+ tooltipLabel="Chatbot"
214
215
  isChatbotVisible={chatbotVisible}
215
216
  onToggleChatbot={() => setChatbotVisible(!chatbotVisible)}
216
217
  />
@@ -38,7 +38,7 @@ import ChatbotHeader, {
38
38
  import PFHorizontalLogoColor from '../UI/PF-HorizontalLogo-Color.svg';
39
39
  import PFHorizontalLogoReverse from '../UI/PF-HorizontalLogo-Reverse.svg';
40
40
  import { BarsIcon } from '@patternfly/react-icons';
41
- import userAvatar from '../Messages/user_avatar.jpg';
41
+ import userAvatar from '../Messages/user_avatar.svg';
42
42
  import patternflyAvatar from '../Messages/patternfly_avatar.jpg';
43
43
 
44
44
  const footnoteProps = {
@@ -110,7 +110,8 @@ const initialMessages: MessageProps[] = [
110
110
  content: 'Hello, can you give me an example of what you can do?',
111
111
  name: 'User',
112
112
  avatar: userAvatar,
113
- timestamp: date.toLocaleString()
113
+ timestamp: date.toLocaleString(),
114
+ avatarProps: { isBordered: true }
114
115
  },
115
116
  {
116
117
  id: '2',
@@ -221,7 +222,8 @@ export const EmbeddedChatbotDemo: React.FunctionComponent = () => {
221
222
  content: message,
222
223
  name: 'User',
223
224
  avatar: userAvatar,
224
- timestamp: date.toLocaleString()
225
+ timestamp: date.toLocaleString(),
226
+ avatarProps: { isBordered: true }
225
227
  });
226
228
  newMessages.push({
227
229
  id: generateId(),