@patternfly/chatbot 6.3.0-prerelease.1 → 6.3.0-prerelease.11

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 (259) hide show
  1. package/dist/cjs/AttachmentEdit/AttachmentEdit.d.ts +2 -0
  2. package/dist/cjs/AttachmentEdit/AttachmentEdit.js +2 -2
  3. package/dist/cjs/Chatbot/Chatbot.d.ts +2 -0
  4. package/dist/cjs/Chatbot/Chatbot.js +2 -2
  5. package/dist/cjs/Chatbot/Chatbot.test.js +4 -0
  6. package/dist/cjs/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.d.ts +2 -0
  7. package/dist/cjs/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.js +3 -3
  8. package/dist/cjs/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.test.js +4 -0
  9. package/dist/cjs/ChatbotFooter/ChatbotFooter.d.ts +1 -0
  10. package/dist/cjs/ChatbotFooter/ChatbotFooter.js +2 -2
  11. package/dist/cjs/ChatbotFooter/ChatbotFooter.test.d.ts +1 -1
  12. package/dist/cjs/ChatbotFooter/ChatbotFooter.test.js +5 -0
  13. package/dist/cjs/ChatbotHeader/ChatbotHeader.js +1 -1
  14. package/dist/cjs/ChatbotHeader/ChatbotHeaderCloseButton.d.ts +4 -2
  15. package/dist/cjs/ChatbotHeader/ChatbotHeaderCloseButton.js +20 -6
  16. package/dist/cjs/ChatbotHeader/ChatbotHeaderCloseButton.test.d.ts +1 -1
  17. package/dist/cjs/ChatbotHeader/ChatbotHeaderCloseButton.test.js +5 -0
  18. package/dist/cjs/ChatbotHeader/ChatbotHeaderMain.js +1 -1
  19. package/dist/cjs/ChatbotHeader/ChatbotHeaderMenu.d.ts +3 -2
  20. package/dist/cjs/ChatbotHeader/ChatbotHeaderMenu.js +20 -6
  21. package/dist/cjs/ChatbotHeader/ChatbotHeaderMenu.test.d.ts +1 -1
  22. package/dist/cjs/ChatbotHeader/ChatbotHeaderMenu.test.js +5 -0
  23. package/dist/cjs/ChatbotHeader/ChatbotHeaderOptionsDropdown.d.ts +1 -0
  24. package/dist/cjs/ChatbotHeader/ChatbotHeaderOptionsDropdown.js +3 -3
  25. package/dist/cjs/ChatbotHeader/ChatbotHeaderOptionsDropdown.test.d.ts +1 -1
  26. package/dist/cjs/ChatbotHeader/ChatbotHeaderOptionsDropdown.test.js +5 -0
  27. package/dist/cjs/ChatbotHeader/ChatbotHeaderSelectorDropdown.d.ts +1 -0
  28. package/dist/cjs/ChatbotHeader/ChatbotHeaderSelectorDropdown.js +2 -2
  29. package/dist/cjs/ChatbotHeader/ChatbotHeaderSelectorDropdown.test.d.ts +1 -1
  30. package/dist/cjs/ChatbotHeader/ChatbotHeaderSelectorDropdown.test.js +5 -0
  31. package/dist/cjs/ChatbotModal/ChatbotModal.d.ts +3 -0
  32. package/dist/cjs/ChatbotModal/ChatbotModal.js +2 -2
  33. package/dist/cjs/ChatbotModal/ChatbotModal.test.d.ts +1 -0
  34. package/dist/cjs/ChatbotModal/ChatbotModal.test.js +28 -0
  35. package/dist/cjs/ChatbotPopover/ChatbotPopover.js +1 -1
  36. package/dist/cjs/ChatbotWelcomePrompt/ChatbotWelcomePrompt.d.ts +1 -0
  37. package/dist/cjs/ChatbotWelcomePrompt/ChatbotWelcomePrompt.js +3 -3
  38. package/dist/cjs/ChatbotWelcomePrompt/ChatbotWelcomePrompt.test.js +4 -0
  39. package/dist/cjs/CodeModal/CodeModal.d.ts +2 -0
  40. package/dist/cjs/CodeModal/CodeModal.js +3 -3
  41. package/dist/cjs/CodeModal/CodeModal.test.d.ts +1 -0
  42. package/dist/cjs/CodeModal/CodeModal.test.js +15 -0
  43. package/dist/cjs/FileDetails/FileDetails.js +1 -1
  44. package/dist/cjs/Message/CodeBlockMessage/CodeBlockMessage.js +1 -1
  45. package/dist/cjs/Message/Message.d.ts +2 -0
  46. package/dist/cjs/Message/Message.js +6 -6
  47. package/dist/cjs/Message/Message.test.js +15 -3
  48. package/dist/cjs/Message/QuickResponse/QuickResponse.d.ts +2 -0
  49. package/dist/cjs/Message/QuickResponse/QuickResponse.js +2 -2
  50. package/dist/cjs/Message/QuickStarts/QuickStartTile.d.ts +2 -0
  51. package/dist/cjs/Message/QuickStarts/QuickStartTile.js +2 -2
  52. package/dist/cjs/Message/UserFeedback/UserFeedback.js +4 -4
  53. package/dist/cjs/Message/UserFeedback/UserFeedback.test.js +4 -0
  54. package/dist/cjs/Message/UserFeedback/UserFeedbackComplete.js +4 -4
  55. package/dist/cjs/Message/UserFeedback/UserFeedbackComplete.test.js +4 -0
  56. package/dist/cjs/MessageBar/AttachButton.d.ts +1 -0
  57. package/dist/cjs/MessageBar/AttachButton.js +3 -3
  58. package/dist/cjs/MessageBar/AttachButton.test.js +11 -7
  59. package/dist/cjs/MessageBar/MessageBar.d.ts +5 -0
  60. package/dist/cjs/MessageBar/MessageBar.js +14 -13
  61. package/dist/cjs/MessageBar/MessageBar.test.js +41 -28
  62. package/dist/cjs/MessageBar/MicrophoneButton.d.ts +1 -0
  63. package/dist/cjs/MessageBar/MicrophoneButton.js +3 -3
  64. package/dist/cjs/MessageBar/SendButton.d.ts +1 -0
  65. package/dist/cjs/MessageBar/SendButton.js +3 -3
  66. package/dist/cjs/MessageBar/SendButton.test.js +9 -5
  67. package/dist/cjs/MessageBar/StopButton.d.ts +1 -0
  68. package/dist/cjs/MessageBar/StopButton.js +3 -3
  69. package/dist/cjs/MessageBar/StopButton.test.js +9 -5
  70. package/dist/cjs/MessageBox/JumpButton.js +1 -1
  71. package/dist/cjs/MessageBox/JumpButton.test.js +4 -4
  72. package/dist/cjs/MessageBox/MessageBox.d.ts +4 -0
  73. package/dist/cjs/MessageBox/MessageBox.js +16 -2
  74. package/dist/cjs/MessageBox/MessageBox.test.js +43 -0
  75. package/dist/cjs/PreviewAttachment/PreviewAttachment.d.ts +2 -0
  76. package/dist/cjs/PreviewAttachment/PreviewAttachment.js +2 -2
  77. package/dist/cjs/Settings/SettingsForm.d.ts +2 -0
  78. package/dist/cjs/Settings/SettingsForm.js +2 -2
  79. package/dist/cjs/Settings/SettingsForm.test.d.ts +1 -1
  80. package/dist/cjs/Settings/SettingsForm.test.js +12 -0
  81. package/dist/cjs/SourcesCard/SourcesCard.js +2 -2
  82. package/dist/cjs/TermsOfUse/TermsOfUse.d.ts +2 -0
  83. package/dist/cjs/TermsOfUse/TermsOfUse.js +5 -5
  84. package/dist/css/main.css +218 -15
  85. package/dist/css/main.css.map +1 -1
  86. package/dist/esm/AttachmentEdit/AttachmentEdit.d.ts +2 -0
  87. package/dist/esm/AttachmentEdit/AttachmentEdit.js +2 -2
  88. package/dist/esm/Chatbot/Chatbot.d.ts +2 -0
  89. package/dist/esm/Chatbot/Chatbot.js +2 -2
  90. package/dist/esm/Chatbot/Chatbot.test.js +4 -0
  91. package/dist/esm/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.d.ts +2 -0
  92. package/dist/esm/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.js +3 -3
  93. package/dist/esm/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.test.js +4 -0
  94. package/dist/esm/ChatbotFooter/ChatbotFooter.d.ts +1 -0
  95. package/dist/esm/ChatbotFooter/ChatbotFooter.js +2 -2
  96. package/dist/esm/ChatbotFooter/ChatbotFooter.test.d.ts +1 -1
  97. package/dist/esm/ChatbotFooter/ChatbotFooter.test.js +5 -0
  98. package/dist/esm/ChatbotHeader/ChatbotHeader.js +1 -1
  99. package/dist/esm/ChatbotHeader/ChatbotHeaderCloseButton.d.ts +4 -2
  100. package/dist/esm/ChatbotHeader/ChatbotHeaderCloseButton.js +20 -6
  101. package/dist/esm/ChatbotHeader/ChatbotHeaderCloseButton.test.d.ts +1 -1
  102. package/dist/esm/ChatbotHeader/ChatbotHeaderCloseButton.test.js +5 -0
  103. package/dist/esm/ChatbotHeader/ChatbotHeaderMain.js +1 -1
  104. package/dist/esm/ChatbotHeader/ChatbotHeaderMenu.d.ts +3 -2
  105. package/dist/esm/ChatbotHeader/ChatbotHeaderMenu.js +20 -6
  106. package/dist/esm/ChatbotHeader/ChatbotHeaderMenu.test.d.ts +1 -1
  107. package/dist/esm/ChatbotHeader/ChatbotHeaderMenu.test.js +5 -0
  108. package/dist/esm/ChatbotHeader/ChatbotHeaderOptionsDropdown.d.ts +1 -0
  109. package/dist/esm/ChatbotHeader/ChatbotHeaderOptionsDropdown.js +3 -3
  110. package/dist/esm/ChatbotHeader/ChatbotHeaderOptionsDropdown.test.d.ts +1 -1
  111. package/dist/esm/ChatbotHeader/ChatbotHeaderOptionsDropdown.test.js +5 -0
  112. package/dist/esm/ChatbotHeader/ChatbotHeaderSelectorDropdown.d.ts +1 -0
  113. package/dist/esm/ChatbotHeader/ChatbotHeaderSelectorDropdown.js +2 -2
  114. package/dist/esm/ChatbotHeader/ChatbotHeaderSelectorDropdown.test.d.ts +1 -1
  115. package/dist/esm/ChatbotHeader/ChatbotHeaderSelectorDropdown.test.js +5 -0
  116. package/dist/esm/ChatbotModal/ChatbotModal.d.ts +3 -0
  117. package/dist/esm/ChatbotModal/ChatbotModal.js +2 -2
  118. package/dist/esm/ChatbotModal/ChatbotModal.test.d.ts +1 -0
  119. package/dist/esm/ChatbotModal/ChatbotModal.test.js +23 -0
  120. package/dist/esm/ChatbotPopover/ChatbotPopover.js +1 -1
  121. package/dist/esm/ChatbotWelcomePrompt/ChatbotWelcomePrompt.d.ts +1 -0
  122. package/dist/esm/ChatbotWelcomePrompt/ChatbotWelcomePrompt.js +3 -3
  123. package/dist/esm/ChatbotWelcomePrompt/ChatbotWelcomePrompt.test.js +4 -0
  124. package/dist/esm/CodeModal/CodeModal.d.ts +2 -0
  125. package/dist/esm/CodeModal/CodeModal.js +3 -3
  126. package/dist/esm/CodeModal/CodeModal.test.d.ts +1 -0
  127. package/dist/esm/CodeModal/CodeModal.test.js +10 -0
  128. package/dist/esm/FileDetails/FileDetails.js +1 -1
  129. package/dist/esm/Message/CodeBlockMessage/CodeBlockMessage.js +1 -1
  130. package/dist/esm/Message/Message.d.ts +2 -0
  131. package/dist/esm/Message/Message.js +6 -6
  132. package/dist/esm/Message/Message.test.js +15 -3
  133. package/dist/esm/Message/QuickResponse/QuickResponse.d.ts +2 -0
  134. package/dist/esm/Message/QuickResponse/QuickResponse.js +2 -2
  135. package/dist/esm/Message/QuickStarts/QuickStartTile.d.ts +2 -0
  136. package/dist/esm/Message/QuickStarts/QuickStartTile.js +2 -2
  137. package/dist/esm/Message/UserFeedback/UserFeedback.js +4 -4
  138. package/dist/esm/Message/UserFeedback/UserFeedback.test.js +4 -0
  139. package/dist/esm/Message/UserFeedback/UserFeedbackComplete.js +4 -4
  140. package/dist/esm/Message/UserFeedback/UserFeedbackComplete.test.js +4 -0
  141. package/dist/esm/MessageBar/AttachButton.d.ts +1 -0
  142. package/dist/esm/MessageBar/AttachButton.js +3 -3
  143. package/dist/esm/MessageBar/AttachButton.test.js +11 -7
  144. package/dist/esm/MessageBar/MessageBar.d.ts +5 -0
  145. package/dist/esm/MessageBar/MessageBar.js +14 -13
  146. package/dist/esm/MessageBar/MessageBar.test.js +41 -28
  147. package/dist/esm/MessageBar/MicrophoneButton.d.ts +1 -0
  148. package/dist/esm/MessageBar/MicrophoneButton.js +3 -3
  149. package/dist/esm/MessageBar/SendButton.d.ts +1 -0
  150. package/dist/esm/MessageBar/SendButton.js +3 -3
  151. package/dist/esm/MessageBar/SendButton.test.js +9 -5
  152. package/dist/esm/MessageBar/StopButton.d.ts +1 -0
  153. package/dist/esm/MessageBar/StopButton.js +3 -3
  154. package/dist/esm/MessageBar/StopButton.test.js +9 -5
  155. package/dist/esm/MessageBox/JumpButton.js +1 -1
  156. package/dist/esm/MessageBox/JumpButton.test.js +4 -4
  157. package/dist/esm/MessageBox/MessageBox.d.ts +4 -0
  158. package/dist/esm/MessageBox/MessageBox.js +16 -2
  159. package/dist/esm/MessageBox/MessageBox.test.js +44 -1
  160. package/dist/esm/PreviewAttachment/PreviewAttachment.d.ts +2 -0
  161. package/dist/esm/PreviewAttachment/PreviewAttachment.js +2 -2
  162. package/dist/esm/Settings/SettingsForm.d.ts +2 -0
  163. package/dist/esm/Settings/SettingsForm.js +2 -2
  164. package/dist/esm/Settings/SettingsForm.test.d.ts +1 -1
  165. package/dist/esm/Settings/SettingsForm.test.js +12 -0
  166. package/dist/esm/SourcesCard/SourcesCard.js +2 -2
  167. package/dist/esm/TermsOfUse/TermsOfUse.d.ts +2 -0
  168. package/dist/esm/TermsOfUse/TermsOfUse.js +5 -5
  169. package/dist/tsconfig.tsbuildinfo +1 -1
  170. package/package.json +1 -1
  171. package/patternfly-docs/content/extensions/chatbot/examples/Messages/AttachmentEdit.tsx +10 -1
  172. package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithFeedback.tsx +33 -0
  173. package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithQuickResponses.tsx +24 -0
  174. package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithQuickStart.tsx +11 -0
  175. package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithSources.tsx +21 -0
  176. package/patternfly-docs/content/extensions/chatbot/examples/Messages/PreviewAttachment.tsx +10 -1
  177. package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotHeaderDrawer.tsx +9 -0
  178. package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotHeaderDrawerWithActions.tsx +9 -0
  179. package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotHeaderDrawerWithSelection.tsx +11 -2
  180. package/patternfly-docs/content/extensions/chatbot/examples/UI/CompactSettings.tsx +289 -0
  181. package/patternfly-docs/content/extensions/chatbot/examples/UI/TermsOfUseCompact.tsx +136 -0
  182. package/patternfly-docs/content/extensions/chatbot/examples/UI/UI.md +14 -0
  183. package/patternfly-docs/content/extensions/chatbot/examples/demos/Chatbot.md +8 -1
  184. package/patternfly-docs/content/extensions/chatbot/examples/demos/ChatbotCompact.tsx +481 -0
  185. package/src/AttachmentEdit/AttachmentEdit.tsx +5 -1
  186. package/src/Chatbot/Chatbot.scss +7 -0
  187. package/src/Chatbot/Chatbot.test.tsx +9 -0
  188. package/src/Chatbot/Chatbot.tsx +4 -1
  189. package/src/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.scss +38 -3
  190. package/src/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.test.tsx +18 -0
  191. package/src/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.tsx +9 -2
  192. package/src/ChatbotFooter/ChatbotFooter.scss +5 -0
  193. package/src/ChatbotFooter/ChatbotFooter.test.tsx +10 -0
  194. package/src/ChatbotFooter/ChatbotFooter.tsx +3 -1
  195. package/src/ChatbotHeader/ChatbotHeader.scss +25 -0
  196. package/src/ChatbotHeader/ChatbotHeader.tsx +1 -1
  197. package/src/ChatbotHeader/ChatbotHeaderCloseButton.test.tsx +6 -0
  198. package/src/ChatbotHeader/ChatbotHeaderCloseButton.tsx +12 -6
  199. package/src/ChatbotHeader/ChatbotHeaderMain.tsx +3 -1
  200. package/src/ChatbotHeader/ChatbotHeaderMenu.test.tsx +8 -0
  201. package/src/ChatbotHeader/ChatbotHeaderMenu.tsx +10 -5
  202. package/src/ChatbotHeader/ChatbotHeaderOptionsDropdown.test.tsx +6 -0
  203. package/src/ChatbotHeader/ChatbotHeaderOptionsDropdown.tsx +5 -2
  204. package/src/ChatbotHeader/ChatbotHeaderSelectorDropdown.test.tsx +10 -0
  205. package/src/ChatbotHeader/ChatbotHeaderSelectorDropdown.tsx +4 -0
  206. package/src/ChatbotModal/ChatbotModal.scss +15 -4
  207. package/src/ChatbotModal/ChatbotModal.test.tsx +59 -0
  208. package/src/ChatbotModal/ChatbotModal.tsx +5 -1
  209. package/src/ChatbotPopover/ChatbotPopover.scss +9 -5
  210. package/src/ChatbotPopover/ChatbotPopover.tsx +1 -1
  211. package/src/ChatbotWelcomePrompt/ChatbotWelcomePrompt.scss +9 -1
  212. package/src/ChatbotWelcomePrompt/ChatbotWelcomePrompt.test.tsx +13 -0
  213. package/src/ChatbotWelcomePrompt/ChatbotWelcomePrompt.tsx +13 -2
  214. package/src/ChatbotWelcomePrompt/__snapshots__/ChatbotWelcomePrompt.test.tsx.snap +1 -1
  215. package/src/CodeModal/CodeModal.scss +11 -3
  216. package/src/CodeModal/CodeModal.test.tsx +24 -0
  217. package/src/CodeModal/CodeModal.tsx +6 -2
  218. package/src/FileDetails/FileDetails.tsx +1 -1
  219. package/src/FileDetails/__snapshots__/FileDetails.test.tsx.snap +1 -1
  220. package/src/FileDetailsLabel/__snapshots__/FileDetailsLabel.test.tsx.snap +1 -1
  221. package/src/Message/CodeBlockMessage/CodeBlockMessage.tsx +1 -1
  222. package/src/Message/Message.scss +27 -0
  223. package/src/Message/Message.test.tsx +24 -3
  224. package/src/Message/Message.tsx +10 -3
  225. package/src/Message/QuickResponse/QuickResponse.tsx +5 -1
  226. package/src/Message/QuickStarts/QuickStartTile.tsx +5 -1
  227. package/src/Message/TextMessage/TextMessage.scss +25 -0
  228. package/src/Message/UserFeedback/UserFeedback.scss +24 -3
  229. package/src/Message/UserFeedback/UserFeedback.test.tsx +13 -0
  230. package/src/Message/UserFeedback/UserFeedback.tsx +4 -2
  231. package/src/Message/UserFeedback/UserFeedbackComplete.test.tsx +4 -0
  232. package/src/Message/UserFeedback/UserFeedbackComplete.tsx +10 -2
  233. package/src/MessageBar/AttachButton.scss +10 -0
  234. package/src/MessageBar/AttachButton.test.tsx +11 -7
  235. package/src/MessageBar/AttachButton.tsx +6 -3
  236. package/src/MessageBar/MessageBar.scss +17 -0
  237. package/src/MessageBar/MessageBar.test.tsx +41 -28
  238. package/src/MessageBar/MessageBar.tsx +23 -8
  239. package/src/MessageBar/MicrophoneButton.scss +10 -0
  240. package/src/MessageBar/MicrophoneButton.tsx +7 -3
  241. package/src/MessageBar/SendButton.scss +10 -0
  242. package/src/MessageBar/SendButton.test.tsx +10 -6
  243. package/src/MessageBar/SendButton.tsx +6 -3
  244. package/src/MessageBar/StopButton.scss +10 -0
  245. package/src/MessageBar/StopButton.test.tsx +10 -6
  246. package/src/MessageBar/StopButton.tsx +6 -3
  247. package/src/MessageBox/JumpButton.test.tsx +4 -4
  248. package/src/MessageBox/JumpButton.tsx +1 -1
  249. package/src/MessageBox/MessageBox.scss +6 -0
  250. package/src/MessageBox/MessageBox.test.tsx +45 -1
  251. package/src/MessageBox/MessageBox.tsx +11 -1
  252. package/src/PreviewAttachment/PreviewAttachment.tsx +5 -1
  253. package/src/Settings/Settings.scss +11 -0
  254. package/src/Settings/SettingsForm.test.tsx +17 -0
  255. package/src/Settings/SettingsForm.tsx +12 -2
  256. package/src/SourcesCard/SourcesCard.scss +8 -0
  257. package/src/SourcesCard/SourcesCard.tsx +2 -1
  258. package/src/TermsOfUse/TermsOfUse.scss +20 -0
  259. package/src/TermsOfUse/TermsOfUse.tsx +9 -4
@@ -53,9 +53,9 @@ describe('Message bar', () => {
53
53
  });
54
54
  it('should render correctly', () => {
55
55
  (0, react_2.render)(react_1.default.createElement(MessageBar_1.MessageBar, { onSendMessage: jest.fn }));
56
- expect(react_2.screen.getByRole('button', { name: 'Attach button' })).toBeTruthy();
57
- expect(react_2.screen.queryByRole('button', { name: 'Send button' })).toBeFalsy();
58
- expect(react_2.screen.queryByRole('button', { name: 'Microphone button' })).toBeFalsy();
56
+ expect(react_2.screen.getByRole('button', { name: 'Attach' })).toBeTruthy();
57
+ expect(react_2.screen.queryByRole('button', { name: 'Send' })).toBeFalsy();
58
+ expect(react_2.screen.queryByRole('button', { name: 'Use microphone' })).toBeFalsy();
59
59
  expect(react_2.screen.getByRole('textbox', { name: /Send a message.../i })).toBeTruthy();
60
60
  });
61
61
  it('can send via enter key', () => __awaiter(void 0, void 0, void 0, function* () {
@@ -76,6 +76,12 @@ describe('Message bar', () => {
76
76
  expect(spy).toHaveBeenCalledTimes(1);
77
77
  expect(spy).toHaveBeenCalledWith(expect.any(Object), 'A');
78
78
  }));
79
+ it('can use specified placeholder text', () => __awaiter(void 0, void 0, void 0, function* () {
80
+ (0, react_2.render)(react_1.default.createElement(MessageBar_1.MessageBar, { onSendMessage: jest.fn, placeholder: "test placeholder" }));
81
+ const input = react_2.screen.getByRole('textbox', { name: /test placeholder/i });
82
+ yield user_event_1.default.type(input, 'Hello world');
83
+ expect(input).toHaveTextContent('Hello world');
84
+ }));
79
85
  // Send button
80
86
  // --------------------------------------------------------------------------
81
87
  it('shows send button when text is input', () => __awaiter(void 0, void 0, void 0, function* () {
@@ -83,15 +89,15 @@ describe('Message bar', () => {
83
89
  const input = react_2.screen.getByRole('textbox', { name: /Send a message.../i });
84
90
  yield user_event_1.default.type(input, 'Hello world');
85
91
  expect(input).toHaveTextContent('Hello world');
86
- expect(react_2.screen.getByRole('button', { name: 'Send button' })).toBeTruthy();
92
+ expect(react_2.screen.getByRole('button', { name: 'Send' })).toBeTruthy();
87
93
  }));
88
94
  it('can disable send button shown when text is input', () => __awaiter(void 0, void 0, void 0, function* () {
89
95
  (0, react_2.render)(react_1.default.createElement(MessageBar_1.MessageBar, { onSendMessage: jest.fn, isSendButtonDisabled: true }));
90
96
  const input = react_2.screen.getByRole('textbox', { name: /Send a message.../i });
91
97
  yield user_event_1.default.type(input, 'Hello world');
92
98
  expect(input).toHaveTextContent('Hello world');
93
- expect(react_2.screen.getByRole('button', { name: 'Send button' })).toBeTruthy();
94
- expect(react_2.screen.getByRole('button', { name: 'Send button' })).toBeDisabled();
99
+ expect(react_2.screen.getByRole('button', { name: 'Send' })).toBeTruthy();
100
+ expect(react_2.screen.getByRole('button', { name: 'Send' })).toBeDisabled();
95
101
  }));
96
102
  it('can click send button', () => __awaiter(void 0, void 0, void 0, function* () {
97
103
  const spy = jest.fn();
@@ -99,24 +105,24 @@ describe('Message bar', () => {
99
105
  const input = react_2.screen.getByRole('textbox', { name: /Send a message.../i });
100
106
  yield user_event_1.default.type(input, 'Hello world');
101
107
  expect(input).toHaveTextContent('Hello world');
102
- const sendButton = react_2.screen.getByRole('button', { name: 'Send button' });
108
+ const sendButton = react_2.screen.getByRole('button', { name: 'Send' });
103
109
  expect(sendButton).toBeTruthy();
104
110
  yield user_event_1.default.click(sendButton);
105
111
  expect(spy).toHaveBeenCalledTimes(1);
106
112
  }));
107
113
  it('can always show send button', () => {
108
114
  (0, react_2.render)(react_1.default.createElement(MessageBar_1.MessageBar, { onSendMessage: jest.fn, alwayShowSendButton: true }));
109
- expect(react_2.screen.getByRole('button', { name: 'Send button' })).toBeTruthy();
110
- expect(react_2.screen.getByRole('button', { name: 'Send button' })).toBeEnabled();
115
+ expect(react_2.screen.getByRole('button', { name: 'Send' })).toBeTruthy();
116
+ expect(react_2.screen.getByRole('button', { name: 'Send' })).toBeEnabled();
111
117
  });
112
118
  it('can disable send button if always showing', () => {
113
119
  (0, react_2.render)(react_1.default.createElement(MessageBar_1.MessageBar, { onSendMessage: jest.fn, alwayShowSendButton: true, isSendButtonDisabled: true }));
114
- expect(react_2.screen.getByRole('button', { name: 'Send button' })).toBeTruthy();
115
- expect(react_2.screen.getByRole('button', { name: 'Send button' })).toBeDisabled();
120
+ expect(react_2.screen.getByRole('button', { name: 'Send' })).toBeTruthy();
121
+ expect(react_2.screen.getByRole('button', { name: 'Send' })).toBeDisabled();
116
122
  });
117
123
  it('can handle buttonProps tooltipContent appropriately for send', () => __awaiter(void 0, void 0, void 0, function* () {
118
124
  (0, react_2.render)(react_1.default.createElement(MessageBar_1.MessageBar, { onSendMessage: jest.fn, alwayShowSendButton: true, buttonProps: { send: { tooltipContent: 'Test' } } }));
119
- yield user_event_1.default.click(react_2.screen.getByRole('button', { name: 'Send button' }));
125
+ yield user_event_1.default.click(react_2.screen.getByRole('button', { name: 'Send' }));
120
126
  expect(react_2.screen.getByRole('tooltip', { name: 'Test' })).toBeTruthy();
121
127
  }));
122
128
  it('can handle buttonProps props appropriately for send', () => __awaiter(void 0, void 0, void 0, function* () {
@@ -157,30 +163,30 @@ describe('Message bar', () => {
157
163
  expect(react_2.screen.queryByRole('menuitem', { name: /Logs/i })).toBeFalsy();
158
164
  expect(react_2.screen.queryByRole('menuitem', { name: /YAML - Status/i })).toBeFalsy();
159
165
  expect(react_2.screen.queryByRole('menuitem', { name: /YAML - All contents/i })).toBeFalsy();
160
- const attachButton = react_2.screen.getByRole('button', { name: 'Attach button' });
166
+ const attachButton = react_2.screen.getByRole('button', { name: 'Attach' });
161
167
  yield user_event_1.default.click(attachButton);
162
168
  expect(attachToggleClickSpy).toHaveBeenCalledTimes(1);
163
169
  }));
164
170
  it('can hide attach button', () => {
165
171
  (0, react_2.render)(react_1.default.createElement(MessageBar_1.MessageBar, { onSendMessage: jest.fn, hasAttachButton: false }));
166
- expect(react_2.screen.queryByRole('button', { name: 'Attach button' })).toBeFalsy();
172
+ expect(react_2.screen.queryByRole('button', { name: 'Attach' })).toBeFalsy();
167
173
  });
168
174
  // Based on this because I had no idea how to do this and was looking around: https://stackoverflow.com/a/75562651
169
175
  // See also https://developer.mozilla.org/en-US/docs/Web/API/File/File for what that file variable is doing
170
176
  it('can handle handleAttach', () => __awaiter(void 0, void 0, void 0, function* () {
171
177
  const spy = jest.fn();
172
178
  (0, react_2.render)(react_1.default.createElement(MessageBar_1.MessageBar, { onSendMessage: jest.fn, hasAttachButton: true, handleAttach: spy, buttonProps: { attach: { inputTestId: 'input' } } }));
173
- expect(react_2.screen.getByRole('button', { name: 'Attach button' })).toBeTruthy();
174
- yield user_event_1.default.click(react_2.screen.getByRole('button', { name: 'Attach button' }));
179
+ expect(react_2.screen.getByRole('button', { name: 'Attach' })).toBeTruthy();
180
+ yield user_event_1.default.click(react_2.screen.getByRole('button', { name: 'Attach' }));
175
181
  const file = new File(['test'], 'test.json');
176
182
  const input = react_2.screen.getByTestId('input');
177
183
  yield user_event_1.default.upload(input, file);
178
184
  expect(input.files).toHaveLength(1);
179
185
  expect(spy).toHaveBeenCalledTimes(1);
180
186
  }));
181
- it('can handle buttonProps tooltipContent appropriately for attach', () => __awaiter(void 0, void 0, void 0, function* () {
187
+ it('can handle buttonProps tooltipContent appropriately for attach', () => __awaiter(void 0, void 0, void 0, function* () {
182
188
  (0, react_2.render)(react_1.default.createElement(MessageBar_1.MessageBar, { onSendMessage: jest.fn, hasAttachButton: true, buttonProps: { attach: { tooltipContent: 'Test' } } }));
183
- yield user_event_1.default.click(react_2.screen.getByRole('button', { name: 'Attach button' }));
189
+ yield user_event_1.default.click(react_2.screen.getByRole('button', { name: 'Attach' }));
184
190
  expect(react_2.screen.getByRole('tooltip', { name: 'Test' })).toBeTruthy();
185
191
  }));
186
192
  it('can handle buttonProps props appropriately for attach', () => __awaiter(void 0, void 0, void 0, function* () {
@@ -191,17 +197,17 @@ describe('Message bar', () => {
191
197
  // --------------------------------------------------------------------------
192
198
  it('can show stop button', () => {
193
199
  (0, react_2.render)(react_1.default.createElement(MessageBar_1.MessageBar, { onSendMessage: jest.fn, hasStopButton: true, handleStopButton: jest.fn }));
194
- expect(react_2.screen.getByRole('button', { name: 'Stop button' })).toBeTruthy();
200
+ expect(react_2.screen.getByRole('button', { name: 'Stop' })).toBeTruthy();
195
201
  });
196
202
  it('can call handleStopButton', () => __awaiter(void 0, void 0, void 0, function* () {
197
203
  const spy = jest.fn();
198
204
  (0, react_2.render)(react_1.default.createElement(MessageBar_1.MessageBar, { onSendMessage: jest.fn, hasStopButton: true, handleStopButton: spy }));
199
- yield user_event_1.default.click(react_2.screen.getByRole('button', { name: 'Stop button' }));
205
+ yield user_event_1.default.click(react_2.screen.getByRole('button', { name: 'Stop' }));
200
206
  expect(spy).toHaveBeenCalledTimes(1);
201
207
  }));
202
208
  it('can handle buttonProps tooltipContent appropriately for stop', () => __awaiter(void 0, void 0, void 0, function* () {
203
209
  (0, react_2.render)(react_1.default.createElement(MessageBar_1.MessageBar, { onSendMessage: jest.fn, hasStopButton: true, handleStopButton: jest.fn, buttonProps: { stop: { tooltipContent: 'Test' } } }));
204
- yield user_event_1.default.click(react_2.screen.getByRole('button', { name: 'Stop button' }));
210
+ yield user_event_1.default.click(react_2.screen.getByRole('button', { name: 'Stop' }));
205
211
  expect(react_2.screen.getByRole('tooltip', { name: 'Test' })).toBeTruthy();
206
212
  }));
207
213
  it('can handle buttonProps props appropriately for stop', () => __awaiter(void 0, void 0, void 0, function* () {
@@ -212,23 +218,30 @@ describe('Message bar', () => {
212
218
  // --------------------------------------------------------------------------
213
219
  it('can hide microphone button when window.SpeechRecognition is not there', () => {
214
220
  (0, react_2.render)(react_1.default.createElement(MessageBar_1.MessageBar, { onSendMessage: jest.fn, hasMicrophoneButton: true }));
215
- expect(react_2.screen.queryByRole('button', { name: 'Microphone button' })).toBeFalsy();
221
+ expect(react_2.screen.queryByRole('button', { name: 'Use microphone' })).toBeFalsy();
216
222
  });
217
223
  it('can show microphone button', () => {
218
224
  mockSpeechRecognition();
219
225
  (0, react_2.render)(react_1.default.createElement(MessageBar_1.MessageBar, { onSendMessage: jest.fn, hasMicrophoneButton: true }));
220
- expect(react_2.screen.getByRole('button', { name: 'Microphone button' })).toBeTruthy();
226
+ expect(react_2.screen.getByRole('button', { name: 'Use microphone' })).toBeTruthy();
221
227
  });
222
228
  it('can handle buttonProps appropriately for microphone', () => __awaiter(void 0, void 0, void 0, function* () {
223
229
  mockSpeechRecognition();
224
230
  (0, react_2.render)(react_1.default.createElement(MessageBar_1.MessageBar, { onSendMessage: jest.fn, hasMicrophoneButton: true, buttonProps: {
225
231
  microphone: { tooltipContent: { active: 'Currently listening', inactive: 'Not currently listening' } }
226
232
  } }));
227
- yield user_event_1.default.click(react_2.screen.getByRole('button', { name: 'Microphone button' }));
233
+ yield user_event_1.default.click(react_2.screen.getByRole('button', { name: 'Use microphone' }));
228
234
  expect(react_2.screen.getByRole('tooltip', { name: 'Currently listening' })).toBeTruthy();
229
- yield user_event_1.default.click(react_2.screen.getByRole('button', { name: 'Microphone button' }));
235
+ yield user_event_1.default.click(react_2.screen.getByRole('button', { name: 'Stop listening' }));
230
236
  expect(react_2.screen.getByRole('tooltip', { name: 'Not currently listening' })).toBeTruthy();
231
237
  }));
238
+ it('can customize the listening placeholder', () => __awaiter(void 0, void 0, void 0, function* () {
239
+ mockSpeechRecognition();
240
+ (0, react_2.render)(react_1.default.createElement(MessageBar_1.MessageBar, { onSendMessage: jest.fn, hasMicrophoneButton: true, listeningText: "I am listening" }));
241
+ yield user_event_1.default.click(react_2.screen.getByRole('button', { name: 'Use microphone' }));
242
+ const input = react_2.screen.getByRole('textbox', { name: /I am listening/i });
243
+ expect(input).toBeTruthy();
244
+ }));
232
245
  it('can handle buttonProps props appropriately for microphone', () => __awaiter(void 0, void 0, void 0, function* () {
233
246
  mockSpeechRecognition();
234
247
  (0, react_2.render)(react_1.default.createElement(MessageBar_1.MessageBar, { onSendMessage: jest.fn, hasMicrophoneButton: true, buttonProps: { microphone: { props: { 'aria-label': 'Test' } } } }));
@@ -236,9 +249,9 @@ describe('Message bar', () => {
236
249
  }));
237
250
  it('can be controlled', () => {
238
251
  (0, react_2.render)(react_1.default.createElement(MessageBar_1.MessageBar, { onSendMessage: jest.fn, value: "test" }));
239
- expect(react_2.screen.getByRole('button', { name: 'Attach button' })).toBeTruthy();
240
- expect(react_2.screen.getByRole('button', { name: 'Send button' })).toBeTruthy();
241
- expect(react_2.screen.queryByRole('button', { name: 'Microphone button' })).toBeFalsy();
252
+ expect(react_2.screen.getByRole('button', { name: 'Attach' })).toBeTruthy();
253
+ expect(react_2.screen.getByRole('button', { name: 'Send' })).toBeTruthy();
254
+ expect(react_2.screen.queryByRole('button', { name: 'Use microphone' })).toBeFalsy();
242
255
  expect(react_2.screen.getByRole('textbox', { name: /Send a message.../i })).toBeTruthy();
243
256
  expect(react_2.screen.getByRole('textbox', { name: /Send a message.../i })).toHaveValue('test');
244
257
  });
@@ -18,6 +18,7 @@ export interface MicrophoneButtonProps extends ButtonProps {
18
18
  };
19
19
  /** Locale code for language speech recognition is conducted in. This should be in the format 'en-US', a.k.a. the ISO 639-1 code, a dash, and the ISO_3166-1 code. */
20
20
  language?: string;
21
+ isCompact?: boolean;
21
22
  }
22
23
  export declare const MicrophoneButton: React.FunctionComponent<MicrophoneButtonProps>;
23
24
  export default MicrophoneButton;
@@ -24,7 +24,7 @@ const react_core_1 = require("@patternfly/react-core");
24
24
  // Import FontAwesome icons
25
25
  const microphone_icon_1 = require("@patternfly/react-icons/dist/esm/icons/microphone-icon");
26
26
  const MicrophoneButton = (_a) => {
27
- var { isListening, onIsListeningChange, onSpeechRecognition, className, tooltipProps, tooltipContent = { active: 'Stop listening', inactive: 'Use microphone' }, language = 'en-US' } = _a, props = __rest(_a, ["isListening", "onIsListeningChange", "onSpeechRecognition", "className", "tooltipProps", "tooltipContent", "language"]);
27
+ var { isListening, onIsListeningChange, onSpeechRecognition, className, tooltipProps, tooltipContent = { active: 'Stop listening', inactive: 'Use microphone' }, language = 'en-US', isCompact } = _a, props = __rest(_a, ["isListening", "onIsListeningChange", "onSpeechRecognition", "className", "tooltipProps", "tooltipContent", "language", "isCompact"]);
28
28
  // Microphone
29
29
  // --------------------------------------------------------------------------
30
30
  const [speechRecognition, setSpeechRecognition] = react_1.default.useState();
@@ -69,8 +69,8 @@ const MicrophoneButton = (_a) => {
69
69
  return null;
70
70
  }
71
71
  return (react_1.default.createElement(react_core_1.Tooltip, Object.assign({ aria: "none", "aria-live": "polite", id: "pf-chatbot__tooltip--use-microphone", content: isListening ? tooltipContent.active : tooltipContent.inactive, position: (tooltipProps === null || tooltipProps === void 0 ? void 0 : tooltipProps.position) || 'top', entryDelay: (tooltipProps === null || tooltipProps === void 0 ? void 0 : tooltipProps.entryDelay) || 0, exitDelay: (tooltipProps === null || tooltipProps === void 0 ? void 0 : tooltipProps.exitDelay) || 0, distance: (tooltipProps === null || tooltipProps === void 0 ? void 0 : tooltipProps.distance) || 8, animationDuration: (tooltipProps === null || tooltipProps === void 0 ? void 0 : tooltipProps.animationDuration) || 0 }, tooltipProps),
72
- react_1.default.createElement(react_core_1.Button, Object.assign({ variant: "plain", className: `pf-chatbot__button--microphone ${isListening ? 'pf-chatbot__button--microphone--active' : ''} ${className !== null && className !== void 0 ? className : ''}`, "aria-label": props['aria-label'] || 'Microphone button', onClick: isListening ? stopListening : startListening, icon: react_1.default.createElement(react_core_1.Icon, { iconSize: "xl", isInline: true },
73
- react_1.default.createElement(microphone_icon_1.MicrophoneIcon, null)) }, props))));
72
+ react_1.default.createElement(react_core_1.Button, Object.assign({ variant: "plain", className: `pf-chatbot__button--microphone ${isListening ? 'pf-chatbot__button--microphone--active' : ''} ${isCompact ? 'pf-m-compact' : ''} ${className !== null && className !== void 0 ? className : ''}`, "aria-label": props['aria-label'] || (isListening ? 'Stop listening' : 'Use microphone'), "aria-pressed": isListening, onClick: isListening ? stopListening : startListening, icon: react_1.default.createElement(react_core_1.Icon, { iconSize: isCompact ? 'lg' : 'xl', isInline: true },
73
+ react_1.default.createElement(microphone_icon_1.MicrophoneIcon, null)), size: isCompact ? 'sm' : undefined }, props))));
74
74
  };
75
75
  exports.MicrophoneButton = MicrophoneButton;
76
76
  exports.default = exports.MicrophoneButton;
@@ -9,6 +9,7 @@ export interface SendButtonProps extends ButtonProps {
9
9
  tooltipProps?: Omit<TooltipProps, 'content'>;
10
10
  /** English text "Send" used in the tooltip */
11
11
  tooltipContent?: string;
12
+ isCompact?: boolean;
12
13
  }
13
14
  export declare const SendButton: React.FunctionComponent<SendButtonProps>;
14
15
  export default SendButton;
@@ -23,12 +23,12 @@ const react_1 = __importDefault(require("react"));
23
23
  const react_core_1 = require("@patternfly/react-core");
24
24
  const paper_plane_icon_1 = require("@patternfly/react-icons/dist/esm/icons/paper-plane-icon");
25
25
  const SendButton = (_a) => {
26
- var { className, onClick, tooltipProps, tooltipContent = 'Send' } = _a, props = __rest(_a, ["className", "onClick", "tooltipProps", "tooltipContent"]);
26
+ var { className, onClick, tooltipProps, tooltipContent = 'Send', isCompact } = _a, props = __rest(_a, ["className", "onClick", "tooltipProps", "tooltipContent", "isCompact"]);
27
27
  return (react_1.default.createElement(react_core_1.Tooltip, Object.assign({ id: "pf-chatbot__tooltip--send", content: tooltipContent, position: (tooltipProps === null || tooltipProps === void 0 ? void 0 : tooltipProps.position) || 'top', entryDelay: (tooltipProps === null || tooltipProps === void 0 ? void 0 : tooltipProps.entryDelay) || 0, exitDelay: (tooltipProps === null || tooltipProps === void 0 ? void 0 : tooltipProps.exitDelay) || 0, distance: (tooltipProps === null || tooltipProps === void 0 ? void 0 : tooltipProps.distance) || 8, animationDuration: (tooltipProps === null || tooltipProps === void 0 ? void 0 : tooltipProps.animationDuration) || 0,
28
28
  // prevents VO announcements of both aria label and tooltip
29
29
  aria: "none" }, tooltipProps),
30
- react_1.default.createElement(react_core_1.Button, Object.assign({ variant: "plain", className: `pf-chatbot__button--send ${className !== null && className !== void 0 ? className : ''}`, "aria-label": props['aria-label'] || 'Send button', onClick: onClick, icon: react_1.default.createElement(react_core_1.Icon, { iconSize: "xl", isInline: true },
31
- react_1.default.createElement(paper_plane_icon_1.PaperPlaneIcon, null)) }, props))));
30
+ react_1.default.createElement(react_core_1.Button, Object.assign({ variant: "plain", className: `pf-chatbot__button--send ${isCompact ? 'pf-m-compact' : ''} ${className !== null && className !== void 0 ? className : ''}`, "aria-label": props['aria-label'] || 'Send', onClick: onClick, icon: react_1.default.createElement(react_core_1.Icon, { iconSize: isCompact ? 'lg' : 'xl', isInline: true },
31
+ react_1.default.createElement(paper_plane_icon_1.PaperPlaneIcon, null)), size: isCompact ? 'sm' : undefined }, props))));
32
32
  };
33
33
  exports.SendButton = SendButton;
34
34
  exports.default = exports.SendButton;
@@ -24,23 +24,23 @@ const renderSend = (props) => {
24
24
  describe('Send button', () => {
25
25
  it('should render button correctly', () => {
26
26
  renderSend();
27
- expect(react_2.screen.getByRole('button', { name: 'Send button' })).toBeTruthy();
27
+ expect(react_2.screen.getByRole('button', { name: 'Send' })).toBeTruthy();
28
28
  });
29
29
  it('should handle onClick correctly', () => __awaiter(void 0, void 0, void 0, function* () {
30
30
  const spy = jest.fn();
31
31
  (0, react_2.render)(react_1.default.createElement(SendButton_1.SendButton, { onClick: spy }));
32
- yield user_event_1.default.click(react_2.screen.getByRole('button', { name: 'Send button' }));
32
+ yield user_event_1.default.click(react_2.screen.getByRole('button', { name: 'Send' }));
33
33
  expect(react_2.screen.getByRole('tooltip', { name: 'Send' })).toBeTruthy();
34
34
  expect(spy).toHaveBeenCalledTimes(1);
35
35
  }));
36
36
  it('should handle custom tooltip correctly', () => __awaiter(void 0, void 0, void 0, function* () {
37
37
  (0, react_2.render)(react_1.default.createElement(SendButton_1.SendButton, { onClick: jest.fn, tooltipContent: "Test" }));
38
- yield user_event_1.default.click(react_2.screen.getByRole('button', { name: 'Send button' }));
38
+ yield user_event_1.default.click(react_2.screen.getByRole('button', { name: 'Send' }));
39
39
  expect(react_2.screen.getByRole('tooltip', { name: 'Test' })).toBeTruthy();
40
40
  }));
41
41
  it('should handle className prop', () => {
42
42
  renderSend({ className: 'test' });
43
- expect(react_2.screen.getByRole('button', { name: 'Send button' })).toHaveClass('test');
43
+ expect(react_2.screen.getByRole('button', { name: 'Send' })).toHaveClass('test');
44
44
  });
45
45
  it('should handle spread props, including aria-label', () => {
46
46
  renderSend({ 'aria-label': 'test' });
@@ -48,7 +48,11 @@ describe('Send button', () => {
48
48
  });
49
49
  it('should handle tooltipProps prop', () => __awaiter(void 0, void 0, void 0, function* () {
50
50
  renderSend({ tooltipProps: { id: 'test' } });
51
- yield user_event_1.default.click(react_2.screen.getByRole('button', { name: 'Send button' }));
51
+ yield user_event_1.default.click(react_2.screen.getByRole('button', { name: 'Send' }));
52
52
  expect(react_2.screen.getByRole('tooltip', { name: 'Send' })).toHaveAttribute('id', 'test');
53
53
  }));
54
+ it('should handle isCompact', () => {
55
+ renderSend({ 'data-testid': 'button', isCompact: true });
56
+ expect(react_2.screen.getByTestId('button')).toHaveClass('pf-m-compact');
57
+ });
54
58
  });
@@ -9,6 +9,7 @@ export interface StopButtonProps extends ButtonProps {
9
9
  tooltipProps?: Omit<TooltipProps, 'content'>;
10
10
  /** English text "Stop" used in the tooltip */
11
11
  tooltipContent?: string;
12
+ isCompact?: boolean;
12
13
  }
13
14
  export declare const StopButton: React.FunctionComponent<StopButtonProps>;
14
15
  export default StopButton;
@@ -22,13 +22,13 @@ const react_1 = __importDefault(require("react"));
22
22
  // Import PatternFly components
23
23
  const react_core_1 = require("@patternfly/react-core");
24
24
  const StopButton = (_a) => {
25
- var { className, onClick, tooltipProps, tooltipContent = 'Stop' } = _a, props = __rest(_a, ["className", "onClick", "tooltipProps", "tooltipContent"]);
25
+ var { className, onClick, tooltipProps, tooltipContent = 'Stop', isCompact } = _a, props = __rest(_a, ["className", "onClick", "tooltipProps", "tooltipContent", "isCompact"]);
26
26
  return (react_1.default.createElement(react_core_1.Tooltip, Object.assign({ id: "pf-chatbot__tooltip--stop", content: tooltipContent, position: (tooltipProps === null || tooltipProps === void 0 ? void 0 : tooltipProps.position) || 'top', entryDelay: (tooltipProps === null || tooltipProps === void 0 ? void 0 : tooltipProps.entryDelay) || 0, exitDelay: (tooltipProps === null || tooltipProps === void 0 ? void 0 : tooltipProps.exitDelay) || 0, distance: (tooltipProps === null || tooltipProps === void 0 ? void 0 : tooltipProps.distance) || 8, animationDuration: (tooltipProps === null || tooltipProps === void 0 ? void 0 : tooltipProps.animationDuration) || 0,
27
27
  // prevents VO announcements of both aria label and tooltip
28
28
  aria: "none" }, tooltipProps),
29
- react_1.default.createElement(react_core_1.Button, Object.assign({ className: `pf-chatbot__button--stop ${className !== null && className !== void 0 ? className : ''}`, variant: "link", "aria-label": props['aria-label'] || 'Stop button', onClick: onClick, icon: react_1.default.createElement(react_core_1.Icon, { iconSize: "xl", isInline: true },
29
+ react_1.default.createElement(react_core_1.Button, Object.assign({ className: `pf-chatbot__button--stop ${isCompact ? 'pf-m-compact' : ''} ${className !== null && className !== void 0 ? className : ''}`, variant: "link", "aria-label": props['aria-label'] || 'Stop', onClick: onClick, icon: react_1.default.createElement(react_core_1.Icon, { iconSize: isCompact ? 'lg' : 'xl', isInline: true },
30
30
  react_1.default.createElement("svg", { width: "16", height: "16", viewBox: "0 0 16 16", fill: "none", xmlns: "http://www.w3.org/2000/svg" },
31
- react_1.default.createElement("path", { d: "M0.5 3C0.5 1.62109 1.62109 0.5 3 0.5H13C14.3789 0.5 15.5 1.62109 15.5 3V13C15.5 14.3789 14.3789 15.5 13 15.5H3C1.62109 15.5 0.5 14.3789 0.5 13V3Z", fill: "currentColor" }))) }, props))));
31
+ react_1.default.createElement("path", { d: "M0.5 3C0.5 1.62109 1.62109 0.5 3 0.5H13C14.3789 0.5 15.5 1.62109 15.5 3V13C15.5 14.3789 14.3789 15.5 13 15.5H3C1.62109 15.5 0.5 14.3789 0.5 13V3Z", fill: "currentColor" }))), size: isCompact ? 'sm' : undefined }, props))));
32
32
  };
33
33
  exports.StopButton = StopButton;
34
34
  exports.default = exports.StopButton;
@@ -24,23 +24,23 @@ const renderStop = (props) => {
24
24
  describe('Stop button', () => {
25
25
  it('should render button correctly', () => {
26
26
  renderStop();
27
- expect(react_2.screen.getByRole('button', { name: 'Stop button' })).toBeTruthy();
27
+ expect(react_2.screen.getByRole('button', { name: 'Stop' })).toBeTruthy();
28
28
  });
29
29
  it('should handle onClick correctly', () => __awaiter(void 0, void 0, void 0, function* () {
30
30
  const spy = jest.fn();
31
31
  (0, react_2.render)(react_1.default.createElement(StopButton_1.StopButton, { onClick: spy }));
32
- yield user_event_1.default.click(react_2.screen.getByRole('button', { name: 'Stop button' }));
32
+ yield user_event_1.default.click(react_2.screen.getByRole('button', { name: 'Stop' }));
33
33
  expect(react_2.screen.getByRole('tooltip', { name: 'Stop' })).toBeTruthy();
34
34
  expect(spy).toHaveBeenCalledTimes(1);
35
35
  }));
36
36
  it('should handle custom tooltip correctly', () => __awaiter(void 0, void 0, void 0, function* () {
37
37
  (0, react_2.render)(react_1.default.createElement(StopButton_1.StopButton, { onClick: jest.fn, tooltipContent: "Test" }));
38
- yield user_event_1.default.click(react_2.screen.getByRole('button', { name: 'Stop button' }));
38
+ yield user_event_1.default.click(react_2.screen.getByRole('button', { name: 'Stop' }));
39
39
  expect(react_2.screen.getByRole('tooltip', { name: 'Test' })).toBeTruthy();
40
40
  }));
41
41
  it('should handle className prop', () => {
42
42
  renderStop({ className: 'test' });
43
- expect(react_2.screen.getByRole('button', { name: 'Stop button' })).toHaveClass('test');
43
+ expect(react_2.screen.getByRole('button', { name: 'Stop' })).toHaveClass('test');
44
44
  });
45
45
  it('should handle spread props, including aria-label', () => {
46
46
  renderStop({ 'aria-label': 'test' });
@@ -48,7 +48,11 @@ describe('Stop button', () => {
48
48
  });
49
49
  it('should handle tooltipProps prop', () => __awaiter(void 0, void 0, void 0, function* () {
50
50
  renderStop({ tooltipProps: { id: 'test' } });
51
- yield user_event_1.default.click(react_2.screen.getByRole('button', { name: 'Stop button' }));
51
+ yield user_event_1.default.click(react_2.screen.getByRole('button', { name: 'Stop' }));
52
52
  expect(react_2.screen.getByRole('tooltip', { name: 'Stop' })).toHaveAttribute('id', 'test');
53
53
  }));
54
+ it('should handle isCompact', () => {
55
+ renderStop({ 'data-testid': 'button', isCompact: true });
56
+ expect(react_2.screen.getByTestId('button')).toHaveClass('pf-m-compact');
57
+ });
54
58
  });
@@ -12,6 +12,6 @@ const react_core_1 = require("@patternfly/react-core");
12
12
  const arrow_up_icon_1 = require("@patternfly/react-icons/dist/esm/icons/arrow-up-icon");
13
13
  const arrow_down_icon_1 = require("@patternfly/react-icons/dist/esm/icons/arrow-down-icon");
14
14
  const JumpButton = ({ position, isHidden, onClick }) => isHidden ? null : (react_1.default.createElement(react_core_1.Tooltip, { id: `pf-chatbot__tooltip--jump-${position}`, content: `Back to ${position}`, position: "top" },
15
- react_1.default.createElement(react_core_1.Button, { variant: "plain", className: `pf-chatbot__jump pf-chatbot__jump--${position}`, "aria-label": `Jump ${position} button`, onClick: onClick },
15
+ react_1.default.createElement(react_core_1.Button, { variant: "plain", className: `pf-chatbot__jump pf-chatbot__jump--${position}`, "aria-label": `Jump ${position}`, onClick: onClick },
16
16
  react_1.default.createElement(react_core_1.Icon, { iconSize: "lg", isInline: true }, position === 'top' ? react_1.default.createElement(arrow_up_icon_1.ArrowUpIcon, null) : react_1.default.createElement(arrow_down_icon_1.ArrowDownIcon, null)))));
17
17
  exports.default = JumpButton;
@@ -20,20 +20,20 @@ const user_event_1 = __importDefault(require("@testing-library/user-event"));
20
20
  describe('JumpButton', () => {
21
21
  it('should render top button correctly', () => {
22
22
  (0, react_2.render)(react_1.default.createElement(JumpButton_1.default, { position: "top", onClick: jest.fn() }));
23
- expect(react_2.screen.getByRole('button', { name: /Jump top button/i })).toBeTruthy();
23
+ expect(react_2.screen.getByRole('button', { name: /Jump top/i })).toBeTruthy();
24
24
  });
25
25
  it('should render bottom button correctly', () => {
26
26
  (0, react_2.render)(react_1.default.createElement(JumpButton_1.default, { position: "bottom", onClick: jest.fn() }));
27
- expect(react_2.screen.getByRole('button', { name: /Jump bottom button/i })).toBeTruthy();
27
+ expect(react_2.screen.getByRole('button', { name: /Jump bottom/i })).toBeTruthy();
28
28
  });
29
29
  it('should call onClick appropriately', () => __awaiter(void 0, void 0, void 0, function* () {
30
30
  const spy = jest.fn();
31
31
  (0, react_2.render)(react_1.default.createElement(JumpButton_1.default, { position: "bottom", onClick: spy }));
32
- yield user_event_1.default.click(react_2.screen.getByRole('button', { name: /Jump bottom button/i }));
32
+ yield user_event_1.default.click(react_2.screen.getByRole('button', { name: /Jump bottom/i }));
33
33
  expect(spy).toHaveBeenCalledTimes(1);
34
34
  }));
35
35
  it('should be hidden if isHidden prop is used', () => __awaiter(void 0, void 0, void 0, function* () {
36
36
  (0, react_2.render)(react_1.default.createElement(JumpButton_1.default, { position: "bottom", onClick: jest.fn(), isHidden: true }));
37
- expect(react_2.screen.queryByRole('button', { name: /Jump bottom button/i })).toBeFalsy();
37
+ expect(react_2.screen.queryByRole('button', { name: /Jump bottom/i })).toBeFalsy();
38
38
  }));
39
39
  });
@@ -12,6 +12,10 @@ export interface MessageBoxProps extends React.HTMLProps<HTMLDivElement> {
12
12
  innerRef?: React.Ref<HTMLDivElement>;
13
13
  /** Modifier that controls how content in MessageBox is positioned within the container */
14
14
  position?: 'top' | 'bottom';
15
+ /** Click handler for additional logic for when scroll to top jump button is clicked */
16
+ onScrollToTopClick?: () => void;
17
+ /** Click handler for additional logic for when scroll to bottom jump button is clicked */
18
+ onScrollToBottomClick?: () => void;
15
19
  }
16
20
  export declare const MessageBox: React.ForwardRefExoticComponent<Omit<MessageBoxProps, "ref"> & React.RefAttributes<any>>;
17
21
  export default MessageBox;
@@ -1,4 +1,15 @@
1
1
  "use strict";
2
+ var __rest = (this && this.__rest) || function (s, e) {
3
+ var t = {};
4
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
5
+ t[p] = s[p];
6
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
7
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
8
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
9
+ t[p[i]] = s[p[i]];
10
+ }
11
+ return t;
12
+ };
2
13
  var __importDefault = (this && this.__importDefault) || function (mod) {
3
14
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
15
  };
@@ -9,7 +20,8 @@ exports.MessageBox = void 0;
9
20
  // ============================================================================
10
21
  const react_1 = __importDefault(require("react"));
11
22
  const JumpButton_1 = __importDefault(require("./JumpButton"));
12
- const MessageBoxBase = ({ announcement, ariaLabel = 'Scrollable message log', children, innerRef, className, position = 'top' }) => {
23
+ const MessageBoxBase = (_a) => {
24
+ var { announcement, ariaLabel = 'Scrollable message log', children, innerRef, className, position = 'top', onScrollToTopClick, onScrollToBottomClick } = _a, props = __rest(_a, ["announcement", "ariaLabel", "children", "innerRef", "className", "position", "onScrollToTopClick", "onScrollToBottomClick"]);
13
25
  const [atTop, setAtTop] = react_1.default.useState(false);
14
26
  const [atBottom, setAtBottom] = react_1.default.useState(true);
15
27
  const [isOverflowing, setIsOverflowing] = react_1.default.useState(false);
@@ -42,12 +54,14 @@ const MessageBoxBase = ({ announcement, ariaLabel = 'Scrollable message log', ch
42
54
  if (element) {
43
55
  element.scrollTo({ top: 0, behavior: 'smooth' });
44
56
  }
57
+ onScrollToTopClick && onScrollToTopClick();
45
58
  }, [messageBoxRef]);
46
59
  const scrollToBottom = react_1.default.useCallback(() => {
47
60
  const element = messageBoxRef.current;
48
61
  if (element) {
49
62
  element.scrollTo({ top: element.scrollHeight, behavior: 'smooth' });
50
63
  }
64
+ onScrollToBottomClick && onScrollToBottomClick();
51
65
  }, [messageBoxRef]);
52
66
  // Detect scroll position
53
67
  react_1.default.useEffect(() => {
@@ -65,7 +79,7 @@ const MessageBoxBase = ({ announcement, ariaLabel = 'Scrollable message log', ch
65
79
  }, [checkOverflow, handleScroll, messageBoxRef]);
66
80
  return (react_1.default.createElement(react_1.default.Fragment, null,
67
81
  react_1.default.createElement(JumpButton_1.default, { position: "top", isHidden: isOverflowing && atTop, onClick: scrollToTop }),
68
- react_1.default.createElement("div", { role: "region", tabIndex: 0, "aria-label": ariaLabel, className: `pf-chatbot__messagebox ${position === 'bottom' && 'pf-chatbot__messagebox--bottom'} ${className !== null && className !== void 0 ? className : ''}`, ref: innerRef !== null && innerRef !== void 0 ? innerRef : messageBoxRef },
82
+ react_1.default.createElement("div", Object.assign({ role: "region", tabIndex: 0, "aria-label": ariaLabel, className: `pf-chatbot__messagebox ${position === 'bottom' && 'pf-chatbot__messagebox--bottom'} ${className !== null && className !== void 0 ? className : ''}`, ref: innerRef !== null && innerRef !== void 0 ? innerRef : messageBoxRef }, props),
69
83
  children,
70
84
  react_1.default.createElement("div", { className: "pf-chatbot__messagebox-announcement", "aria-live": "polite" }, announcement)),
71
85
  react_1.default.createElement(JumpButton_1.default, { position: "bottom", isHidden: isOverflowing && atBottom, onClick: scrollToBottom })));
@@ -1,4 +1,13 @@
1
1
  "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
2
11
  var __importDefault = (this && this.__importDefault) || function (mod) {
3
12
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
13
  };
@@ -6,6 +15,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
15
  const react_1 = __importDefault(require("react"));
7
16
  const react_2 = require("@testing-library/react");
8
17
  const MessageBox_1 = require("./MessageBox");
18
+ const user_event_1 = __importDefault(require("@testing-library/user-event"));
9
19
  describe('MessageBox', () => {
10
20
  it('should render Message box', () => {
11
21
  (0, react_2.render)(react_1.default.createElement(MessageBox_1.MessageBox, null,
@@ -19,4 +29,37 @@ describe('MessageBox', () => {
19
29
  expect(ref.current).not.toBeNull();
20
30
  expect(ref.current).toBeInstanceOf(HTMLDivElement);
21
31
  });
32
+ it('should call onScrollToBottomClick when scroll to top button is clicked', () => __awaiter(void 0, void 0, void 0, function* () {
33
+ const spy = jest.fn();
34
+ (0, react_2.render)(react_1.default.createElement(MessageBox_1.MessageBox, { onScrollToBottomClick: spy },
35
+ react_1.default.createElement("div", null, "Test message content")));
36
+ // this forces button to show
37
+ const region = react_2.screen.getByRole('region');
38
+ Object.defineProperty(region, 'scrollHeight', { configurable: true, value: 1000 });
39
+ Object.defineProperty(region, 'clientHeight', { configurable: true, value: 500 });
40
+ Object.defineProperty(region, 'scrollTop', { configurable: true, value: 0 });
41
+ region.dispatchEvent(new Event('scroll'));
42
+ yield (0, react_2.waitFor)(() => {
43
+ user_event_1.default.click(react_2.screen.getByRole('button', { name: /Jump bottom/i }));
44
+ expect(spy).toHaveBeenCalled();
45
+ });
46
+ }));
47
+ it('should call onScrollToTopClick when scroll to top button is clicked', () => __awaiter(void 0, void 0, void 0, function* () {
48
+ const spy = jest.fn();
49
+ (0, react_2.render)(react_1.default.createElement(MessageBox_1.MessageBox, { onScrollToTopClick: spy },
50
+ react_1.default.createElement("div", null, "Test message content")));
51
+ // this forces button to show
52
+ const region = react_2.screen.getByRole('region');
53
+ Object.defineProperty(region, 'scrollHeight', { configurable: true, value: 1000 });
54
+ Object.defineProperty(region, 'clientHeight', { configurable: true, value: 500 });
55
+ Object.defineProperty(region, 'scrollTop', {
56
+ configurable: true,
57
+ value: 500
58
+ });
59
+ region.dispatchEvent(new Event('scroll'));
60
+ yield (0, react_2.waitFor)(() => {
61
+ user_event_1.default.click(react_2.screen.getByRole('button', { name: /Jump top/i }));
62
+ expect(spy).toHaveBeenCalled();
63
+ });
64
+ }));
22
65
  });
@@ -17,6 +17,8 @@ export interface PreviewAttachmentProps {
17
17
  title?: string;
18
18
  /** Display mode for the Chatbot parent; this influences the styles applied */
19
19
  displayMode?: ChatbotDisplayMode;
20
+ /** Sets modal to compact styling. */
21
+ isCompact?: boolean;
20
22
  }
21
23
  export declare const PreviewAttachment: React.FunctionComponent<PreviewAttachmentProps>;
22
24
  export default PreviewAttachment;
@@ -10,7 +10,7 @@ exports.PreviewAttachment = void 0;
10
10
  const react_1 = __importDefault(require("react"));
11
11
  const CodeModal_1 = __importDefault(require("../CodeModal"));
12
12
  const Chatbot_1 = require("../Chatbot");
13
- const PreviewAttachment = ({ fileName, code, handleModalToggle, isModalOpen, onDismiss = undefined, onEdit, title = 'Preview attachment', displayMode = Chatbot_1.ChatbotDisplayMode.default }) => {
13
+ const PreviewAttachment = ({ fileName, code, handleModalToggle, isModalOpen, onDismiss = undefined, onEdit, title = 'Preview attachment', displayMode = Chatbot_1.ChatbotDisplayMode.default, isCompact }) => {
14
14
  const handleEdit = (_event) => {
15
15
  handleModalToggle(_event);
16
16
  onEdit(_event);
@@ -19,7 +19,7 @@ const PreviewAttachment = ({ fileName, code, handleModalToggle, isModalOpen, onD
19
19
  handleModalToggle(_event);
20
20
  onDismiss && onDismiss(_event);
21
21
  };
22
- return (react_1.default.createElement(CodeModal_1.default, { codeEditorControlClassName: "pf-chatbot__code-modal--controls", code: code, fileName: fileName, handleModalToggle: handleModalToggle, isCopyEnabled: true, isLineNumbersVisible: false, isModalOpen: isModalOpen, onPrimaryAction: handleEdit, onSecondaryAction: handleDismiss, primaryActionBtn: "Edit", secondaryActionBtn: "Dismiss", title: title, isReadOnly: true, displayMode: displayMode }));
22
+ return (react_1.default.createElement(CodeModal_1.default, { codeEditorControlClassName: "pf-chatbot__code-modal--controls", code: code, fileName: fileName, handleModalToggle: handleModalToggle, isCopyEnabled: true, isLineNumbersVisible: false, isModalOpen: isModalOpen, onPrimaryAction: handleEdit, onSecondaryAction: handleDismiss, primaryActionBtn: "Edit", secondaryActionBtn: "Dismiss", title: title, isReadOnly: true, displayMode: displayMode, isCompact: isCompact }));
23
23
  };
24
24
  exports.PreviewAttachment = PreviewAttachment;
25
25
  exports.default = exports.PreviewAttachment;
@@ -8,6 +8,8 @@ export interface SettingsFormProps {
8
8
  label: string;
9
9
  field: React.ReactElement;
10
10
  }[];
11
+ /** Sets form to compact styling. */
12
+ isCompact?: boolean;
11
13
  }
12
14
  export declare const SettingsForm: React.FunctionComponent<SettingsFormProps>;
13
15
  export default SettingsForm;
@@ -17,8 +17,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
17
17
  exports.SettingsForm = void 0;
18
18
  const react_1 = __importDefault(require("react"));
19
19
  const SettingsForm = (_a) => {
20
- var { className, fields = [] } = _a, props = __rest(_a, ["className", "fields"]);
21
- return (react_1.default.createElement("div", Object.assign({ className: `pf-chatbot__settings-form-container ${className}` }, props),
20
+ var { className, fields = [], isCompact } = _a, props = __rest(_a, ["className", "fields", "isCompact"]);
21
+ return (react_1.default.createElement("div", Object.assign({ className: `pf-chatbot__settings-form-container ${isCompact ? 'pf-m-compact' : ''} ${className ? ` ${className}` : ''}` }, props),
22
22
  react_1.default.createElement("form", { className: "pf-chatbot__settings-form" }, fields.map((field) => (react_1.default.createElement("div", { className: "pf-chatbot__settings-form-row", key: field.label },
23
23
  react_1.default.createElement("label", { className: "pf-chatbot__settings-label", htmlFor: field.id }, field.label),
24
24
  field.field))))));
@@ -1 +1 @@
1
- export {};
1
+ import '@testing-library/jest-dom';
@@ -7,6 +7,7 @@ const react_1 = __importDefault(require("react"));
7
7
  const react_core_1 = require("@patternfly/react-core");
8
8
  const react_2 = require("@testing-library/react");
9
9
  const SettingsForm_1 = require("./SettingsForm");
10
+ require("@testing-library/jest-dom");
10
11
  describe('SettingsForm', () => {
11
12
  it('should render settingsForm with custom classname', () => {
12
13
  const { container } = (0, react_2.render)(react_1.default.createElement(SettingsForm_1.SettingsForm, { className: "custom-settings" }));
@@ -23,4 +24,15 @@ describe('SettingsForm', () => {
23
24
  (0, react_2.render)(react_1.default.createElement(SettingsForm_1.SettingsForm, { fields: fields }));
24
25
  expect(react_2.screen.getByRole('button', { name: 'Archive chat' })).toBeTruthy();
25
26
  });
27
+ it('should render settingsForm with isCompact', () => {
28
+ const fields = [
29
+ {
30
+ id: 'archived-chat',
31
+ label: 'Archive chat',
32
+ field: (react_1.default.createElement(react_core_1.Button, { id: "archived-chat", variant: "secondary" }, "Archive chat"))
33
+ }
34
+ ];
35
+ (0, react_2.render)(react_1.default.createElement(SettingsForm_1.SettingsForm, { "data-testid": "settings-form", fields: fields, isCompact: true }));
36
+ expect(react_2.screen.getByTestId('settings-form')).toHaveClass('pf-m-compact');
37
+ });
26
38
  });