@patternfly/chatbot 2.2.0-prerelease.8 → 2.2.0

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 (501) hide show
  1. package/dist/cjs/AttachmentEdit/AttachmentEdit.test.d.ts +1 -0
  2. package/dist/cjs/AttachmentEdit/AttachmentEdit.test.js +52 -0
  3. package/dist/cjs/Chatbot/Chatbot.d.ts +2 -1
  4. package/dist/cjs/Chatbot/Chatbot.js +1 -0
  5. package/dist/cjs/Chatbot/Chatbot.test.d.ts +1 -0
  6. package/dist/cjs/Chatbot/Chatbot.test.js +28 -0
  7. package/dist/cjs/ChatbotAlert/ChatbotAlert.test.d.ts +1 -0
  8. package/dist/cjs/ChatbotAlert/ChatbotAlert.test.js +27 -0
  9. package/dist/cjs/ChatbotContent/ChatbotContent.test.d.ts +1 -0
  10. package/dist/cjs/ChatbotContent/ChatbotContent.test.js +18 -0
  11. package/dist/cjs/ChatbotConversationHistoryNav/ChatbotConversationHistoryDropdown.d.ts +3 -3
  12. package/dist/cjs/ChatbotConversationHistoryNav/ChatbotConversationHistoryDropdown.js +3 -1
  13. package/dist/cjs/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.d.ts +27 -4
  14. package/dist/cjs/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.js +24 -12
  15. package/dist/cjs/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.test.js +99 -3
  16. package/dist/cjs/ChatbotConversationHistoryNav/EmptyState.d.ts +11 -0
  17. package/dist/cjs/ChatbotConversationHistoryNav/EmptyState.js +29 -0
  18. package/dist/cjs/ChatbotConversationHistoryNav/LoadingState.d.ts +4 -0
  19. package/dist/cjs/ChatbotConversationHistoryNav/LoadingState.js +45 -0
  20. package/dist/cjs/ChatbotFooter/ChatbotFooter.test.d.ts +1 -0
  21. package/dist/cjs/ChatbotFooter/ChatbotFooter.test.js +18 -0
  22. package/dist/cjs/ChatbotFooter/ChatbotFooternote.test.d.ts +1 -0
  23. package/dist/cjs/ChatbotFooter/ChatbotFooternote.test.js +87 -0
  24. package/dist/cjs/ChatbotFooter/ChatbotFootnote.d.ts +1 -1
  25. package/dist/cjs/ChatbotFooter/ChatbotFootnote.js +1 -1
  26. package/dist/cjs/ChatbotHeader/ChatbotHeader.test.d.ts +1 -0
  27. package/dist/cjs/ChatbotHeader/ChatbotHeader.test.js +18 -0
  28. package/dist/cjs/ChatbotHeader/ChatbotHeaderActions.test.d.ts +1 -0
  29. package/dist/cjs/ChatbotHeader/ChatbotHeaderActions.test.js +18 -0
  30. package/dist/cjs/ChatbotHeader/ChatbotHeaderCloseButton.js +3 -1
  31. package/dist/cjs/ChatbotHeader/ChatbotHeaderCloseButton.test.d.ts +1 -0
  32. package/dist/cjs/ChatbotHeader/ChatbotHeaderCloseButton.test.js +20 -0
  33. package/dist/cjs/ChatbotHeader/ChatbotHeaderMain.test.d.ts +1 -0
  34. package/dist/cjs/ChatbotHeader/ChatbotHeaderMain.test.js +18 -0
  35. package/dist/cjs/ChatbotHeader/ChatbotHeaderMenu.js +3 -1
  36. package/dist/cjs/ChatbotHeader/ChatbotHeaderMenu.test.d.ts +1 -0
  37. package/dist/cjs/ChatbotHeader/ChatbotHeaderMenu.test.js +20 -0
  38. package/dist/cjs/ChatbotHeader/ChatbotHeaderOptionsDropdown.js +3 -1
  39. package/dist/cjs/ChatbotHeader/ChatbotHeaderOptionsDropdown.test.d.ts +1 -0
  40. package/dist/cjs/ChatbotHeader/ChatbotHeaderOptionsDropdown.test.js +43 -0
  41. package/dist/cjs/ChatbotHeader/ChatbotHeaderSelectorDropdown.js +6 -4
  42. package/dist/cjs/ChatbotHeader/ChatbotHeaderSelectorDropdown.test.d.ts +1 -0
  43. package/dist/cjs/ChatbotHeader/ChatbotHeaderSelectorDropdown.test.js +41 -0
  44. package/dist/cjs/ChatbotHeader/ChatbotHeaderTitle.d.ts +3 -1
  45. package/dist/cjs/ChatbotHeader/ChatbotHeaderTitle.js +4 -2
  46. package/dist/cjs/ChatbotHeader/ChatbotHeaderTitle.test.d.ts +1 -0
  47. package/dist/cjs/ChatbotHeader/ChatbotHeaderTitle.test.js +55 -0
  48. package/dist/cjs/ChatbotToggle/ChatbotToggle.js +3 -1
  49. package/dist/cjs/ChatbotWelcomePrompt/ChatbotWelcomePrompt.test.js +19 -11
  50. package/dist/cjs/Compare/Compare.d.ts +17 -0
  51. package/dist/cjs/Compare/Compare.js +50 -0
  52. package/dist/cjs/Compare/Compare.test.d.ts +1 -0
  53. package/dist/cjs/Compare/Compare.test.js +20 -0
  54. package/dist/cjs/Compare/index.d.ts +2 -0
  55. package/dist/cjs/Compare/index.js +23 -0
  56. package/dist/cjs/Message/ErrorMessage/ErrorMessage.d.ts +4 -0
  57. package/dist/cjs/Message/ErrorMessage/ErrorMessage.js +26 -0
  58. package/dist/cjs/Message/ImageMessage/ImageMessage.d.ts +4 -0
  59. package/dist/cjs/Message/ImageMessage/ImageMessage.js +25 -0
  60. package/dist/cjs/Message/LinkMessage/LinkMessage.d.ts +4 -0
  61. package/dist/cjs/Message/LinkMessage/LinkMessage.js +30 -0
  62. package/dist/cjs/Message/Message.d.ts +49 -8
  63. package/dist/cjs/Message/Message.js +70 -18
  64. package/dist/cjs/Message/Message.test.js +269 -3
  65. package/dist/cjs/Message/QuickResponse/QuickResponse.d.ts +17 -0
  66. package/dist/cjs/Message/QuickResponse/QuickResponse.js +34 -0
  67. package/dist/cjs/Message/QuickStarts/FallbackImg.d.ts +13 -0
  68. package/dist/cjs/Message/QuickStarts/FallbackImg.js +34 -0
  69. package/dist/cjs/Message/QuickStarts/QuickStartTile.d.ts +27 -0
  70. package/dist/cjs/Message/QuickStarts/QuickStartTile.js +82 -0
  71. package/dist/cjs/Message/QuickStarts/QuickStartTileDescription.d.ts +23 -0
  72. package/dist/cjs/Message/QuickStarts/QuickStartTileDescription.js +64 -0
  73. package/dist/cjs/Message/QuickStarts/QuickStartTileDescription.test.d.ts +1 -0
  74. package/dist/cjs/Message/QuickStarts/QuickStartTileDescription.test.js +76 -0
  75. package/dist/cjs/Message/QuickStarts/QuickStartTileHeader.d.ts +11 -0
  76. package/dist/cjs/Message/QuickStarts/QuickStartTileHeader.js +30 -0
  77. package/dist/cjs/Message/QuickStarts/monitor-sampleapp-quickstart-with-image.d.ts +30 -0
  78. package/dist/cjs/Message/QuickStarts/monitor-sampleapp-quickstart-with-image.js +77 -0
  79. package/dist/cjs/Message/QuickStarts/monitor-sampleapp-quickstart.d.ts +30 -0
  80. package/dist/cjs/Message/QuickStarts/monitor-sampleapp-quickstart.js +77 -0
  81. package/dist/cjs/Message/QuickStarts/types.d.ts +132 -0
  82. package/dist/cjs/Message/QuickStarts/types.js +17 -0
  83. package/dist/cjs/Message/TableMessage/TableMessage.d.ts +20 -0
  84. package/dist/cjs/Message/TableMessage/TableMessage.js +67 -0
  85. package/dist/cjs/Message/TableMessage/TbodyMessage.d.ts +7 -0
  86. package/dist/cjs/Message/TableMessage/TbodyMessage.js +33 -0
  87. package/dist/cjs/Message/TableMessage/TdMessage.d.ts +5 -0
  88. package/dist/cjs/Message/TableMessage/TdMessage.js +26 -0
  89. package/dist/cjs/Message/TableMessage/ThMessage.d.ts +5 -0
  90. package/dist/cjs/Message/TableMessage/ThMessage.js +26 -0
  91. package/dist/cjs/Message/TableMessage/TheadMessage.d.ts +5 -0
  92. package/dist/cjs/Message/TableMessage/TheadMessage.js +26 -0
  93. package/dist/cjs/Message/TableMessage/TrMessage.d.ts +7 -0
  94. package/dist/cjs/Message/TableMessage/TrMessage.js +37 -0
  95. package/dist/cjs/Message/TextMessage/TextMessage.d.ts +2 -1
  96. package/dist/cjs/Message/TextMessage/TextMessage.js +2 -2
  97. package/dist/cjs/Message/UserFeedback/CloseButton.d.ts +10 -0
  98. package/dist/cjs/Message/UserFeedback/CloseButton.js +14 -0
  99. package/dist/cjs/Message/UserFeedback/UserFeedback.d.ts +39 -0
  100. package/dist/cjs/Message/UserFeedback/UserFeedback.js +54 -0
  101. package/dist/cjs/Message/UserFeedback/UserFeedback.test.d.ts +1 -0
  102. package/dist/cjs/Message/UserFeedback/UserFeedback.test.js +133 -0
  103. package/dist/cjs/Message/UserFeedback/UserFeedbackComplete.d.ts +42 -0
  104. package/dist/cjs/Message/UserFeedback/UserFeedbackComplete.js +117 -0
  105. package/dist/cjs/Message/UserFeedback/UserFeedbackComplete.test.d.ts +1 -0
  106. package/dist/cjs/Message/UserFeedback/UserFeedbackComplete.test.js +249 -0
  107. package/dist/cjs/MessageBar/AttachButton.js +4 -2
  108. package/dist/cjs/MessageBar/MessageBar.d.ts +11 -4
  109. package/dist/cjs/MessageBar/MessageBar.js +127 -46
  110. package/dist/cjs/MessageBar/MessageBar.test.js +12 -4
  111. package/dist/cjs/MessageBar/MicrophoneButton.d.ts +1 -1
  112. package/dist/cjs/MessageBar/SendButton.js +3 -1
  113. package/dist/cjs/MessageBar/StopButton.js +3 -1
  114. package/dist/cjs/MessageBox/MessageBox.test.d.ts +1 -0
  115. package/dist/cjs/MessageBox/MessageBox.test.js +22 -0
  116. package/dist/cjs/PreviewAttachment/PreviewAttachment.test.d.ts +1 -0
  117. package/dist/cjs/PreviewAttachment/PreviewAttachment.test.js +28 -0
  118. package/dist/cjs/ResponseActions/ResponseActionButton.d.ts +4 -1
  119. package/dist/cjs/ResponseActions/ResponseActionButton.js +21 -6
  120. package/dist/cjs/ResponseActions/ResponseActions.d.ts +8 -2
  121. package/dist/cjs/ResponseActions/ResponseActions.js +7 -7
  122. package/dist/cjs/ResponseActions/ResponseActions.test.js +2 -2
  123. package/dist/cjs/Settings/SettingsForm.test.d.ts +1 -0
  124. package/dist/cjs/Settings/SettingsForm.test.js +26 -0
  125. package/dist/cjs/__mocks__/rehype-external-links.d.ts +2 -0
  126. package/dist/cjs/__mocks__/rehype-external-links.js +4 -0
  127. package/dist/cjs/__mocks__/rehype-sanitize.d.ts +2 -0
  128. package/dist/cjs/__mocks__/rehype-sanitize.js +4 -0
  129. package/dist/cjs/__mocks__/rehype-unwrap-images.d.ts +2 -0
  130. package/dist/cjs/__mocks__/rehype-unwrap-images.js +4 -0
  131. package/dist/cjs/index.d.ts +4 -0
  132. package/dist/cjs/index.js +7 -1
  133. package/dist/cjs/tracking/console_tracking_provider.d.ts +10 -0
  134. package/dist/cjs/tracking/console_tracking_provider.js +27 -0
  135. package/dist/cjs/tracking/index.d.ts +2 -0
  136. package/dist/cjs/tracking/index.js +23 -0
  137. package/dist/cjs/tracking/posthog_tracking_provider.d.ts +9 -0
  138. package/dist/cjs/tracking/posthog_tracking_provider.js +37 -0
  139. package/dist/cjs/tracking/segment_tracking_provider.d.ts +10 -0
  140. package/dist/cjs/tracking/segment_tracking_provider.js +50 -0
  141. package/dist/cjs/tracking/trackingProviderProxy.d.ts +9 -0
  142. package/dist/cjs/tracking/trackingProviderProxy.js +24 -0
  143. package/dist/cjs/tracking/tracking_api.d.ts +8 -0
  144. package/dist/cjs/tracking/tracking_api.js +2 -0
  145. package/dist/cjs/tracking/tracking_registry.d.ts +4 -0
  146. package/dist/cjs/tracking/tracking_registry.js +33 -0
  147. package/dist/cjs/tracking/tracking_spi.d.ts +9 -0
  148. package/dist/cjs/tracking/tracking_spi.js +2 -0
  149. package/dist/cjs/tracking/umami_tracking_provider.d.ts +14 -0
  150. package/dist/cjs/tracking/umami_tracking_provider.js +44 -0
  151. package/dist/css/main.css +438 -147
  152. package/dist/css/main.css.map +1 -1
  153. package/dist/dynamic/Compare/package.json +1 -0
  154. package/dist/dynamic/tracking/package.json +1 -0
  155. package/dist/esm/AttachmentEdit/AttachmentEdit.test.d.ts +1 -0
  156. package/dist/esm/AttachmentEdit/AttachmentEdit.test.js +47 -0
  157. package/dist/esm/Chatbot/Chatbot.d.ts +2 -1
  158. package/dist/esm/Chatbot/Chatbot.js +1 -0
  159. package/dist/esm/Chatbot/Chatbot.test.d.ts +1 -0
  160. package/dist/esm/Chatbot/Chatbot.test.js +23 -0
  161. package/dist/esm/ChatbotAlert/ChatbotAlert.test.d.ts +1 -0
  162. package/dist/esm/ChatbotAlert/ChatbotAlert.test.js +22 -0
  163. package/dist/esm/ChatbotContent/ChatbotContent.test.d.ts +1 -0
  164. package/dist/esm/ChatbotContent/ChatbotContent.test.js +13 -0
  165. package/dist/esm/ChatbotConversationHistoryNav/ChatbotConversationHistoryDropdown.d.ts +3 -3
  166. package/dist/esm/ChatbotConversationHistoryNav/ChatbotConversationHistoryDropdown.js +3 -1
  167. package/dist/esm/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.d.ts +27 -4
  168. package/dist/esm/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.js +24 -12
  169. package/dist/esm/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.test.js +99 -3
  170. package/dist/esm/ChatbotConversationHistoryNav/EmptyState.d.ts +11 -0
  171. package/dist/esm/ChatbotConversationHistoryNav/EmptyState.js +22 -0
  172. package/dist/esm/ChatbotConversationHistoryNav/LoadingState.d.ts +4 -0
  173. package/dist/esm/ChatbotConversationHistoryNav/LoadingState.js +38 -0
  174. package/dist/esm/ChatbotFooter/ChatbotFooter.test.d.ts +1 -0
  175. package/dist/esm/ChatbotFooter/ChatbotFooter.test.js +13 -0
  176. package/dist/esm/ChatbotFooter/ChatbotFooternote.test.d.ts +1 -0
  177. package/dist/esm/ChatbotFooter/ChatbotFooternote.test.js +82 -0
  178. package/dist/esm/ChatbotFooter/ChatbotFootnote.d.ts +1 -1
  179. package/dist/esm/ChatbotFooter/ChatbotFootnote.js +1 -1
  180. package/dist/esm/ChatbotHeader/ChatbotHeader.test.d.ts +1 -0
  181. package/dist/esm/ChatbotHeader/ChatbotHeader.test.js +13 -0
  182. package/dist/esm/ChatbotHeader/ChatbotHeaderActions.test.d.ts +1 -0
  183. package/dist/esm/ChatbotHeader/ChatbotHeaderActions.test.js +13 -0
  184. package/dist/esm/ChatbotHeader/ChatbotHeaderCloseButton.js +3 -1
  185. package/dist/esm/ChatbotHeader/ChatbotHeaderCloseButton.test.d.ts +1 -0
  186. package/dist/esm/ChatbotHeader/ChatbotHeaderCloseButton.test.js +15 -0
  187. package/dist/esm/ChatbotHeader/ChatbotHeaderMain.test.d.ts +1 -0
  188. package/dist/esm/ChatbotHeader/ChatbotHeaderMain.test.js +13 -0
  189. package/dist/esm/ChatbotHeader/ChatbotHeaderMenu.js +3 -1
  190. package/dist/esm/ChatbotHeader/ChatbotHeaderMenu.test.d.ts +1 -0
  191. package/dist/esm/ChatbotHeader/ChatbotHeaderMenu.test.js +15 -0
  192. package/dist/esm/ChatbotHeader/ChatbotHeaderOptionsDropdown.js +3 -1
  193. package/dist/esm/ChatbotHeader/ChatbotHeaderOptionsDropdown.test.d.ts +1 -0
  194. package/dist/esm/ChatbotHeader/ChatbotHeaderOptionsDropdown.test.js +38 -0
  195. package/dist/esm/ChatbotHeader/ChatbotHeaderSelectorDropdown.js +6 -4
  196. package/dist/esm/ChatbotHeader/ChatbotHeaderSelectorDropdown.test.d.ts +1 -0
  197. package/dist/esm/ChatbotHeader/ChatbotHeaderSelectorDropdown.test.js +36 -0
  198. package/dist/esm/ChatbotHeader/ChatbotHeaderTitle.d.ts +3 -1
  199. package/dist/esm/ChatbotHeader/ChatbotHeaderTitle.js +4 -2
  200. package/dist/esm/ChatbotHeader/ChatbotHeaderTitle.test.d.ts +1 -0
  201. package/dist/esm/ChatbotHeader/ChatbotHeaderTitle.test.js +50 -0
  202. package/dist/esm/ChatbotToggle/ChatbotToggle.js +3 -1
  203. package/dist/esm/ChatbotWelcomePrompt/ChatbotWelcomePrompt.test.js +19 -11
  204. package/dist/esm/Compare/Compare.d.ts +17 -0
  205. package/dist/esm/Compare/Compare.js +43 -0
  206. package/dist/esm/Compare/Compare.test.d.ts +1 -0
  207. package/dist/esm/Compare/Compare.test.js +15 -0
  208. package/dist/esm/Compare/index.d.ts +2 -0
  209. package/dist/esm/Compare/index.js +2 -0
  210. package/dist/esm/Message/ErrorMessage/ErrorMessage.d.ts +4 -0
  211. package/dist/esm/Message/ErrorMessage/ErrorMessage.js +21 -0
  212. package/dist/esm/Message/ImageMessage/ImageMessage.d.ts +4 -0
  213. package/dist/esm/Message/ImageMessage/ImageMessage.js +20 -0
  214. package/dist/esm/Message/LinkMessage/LinkMessage.d.ts +4 -0
  215. package/dist/esm/Message/LinkMessage/LinkMessage.js +25 -0
  216. package/dist/esm/Message/Message.d.ts +49 -8
  217. package/dist/esm/Message/Message.js +68 -16
  218. package/dist/esm/Message/Message.test.js +269 -3
  219. package/dist/esm/Message/QuickResponse/QuickResponse.d.ts +17 -0
  220. package/dist/esm/Message/QuickResponse/QuickResponse.js +27 -0
  221. package/dist/esm/Message/QuickStarts/FallbackImg.d.ts +13 -0
  222. package/dist/esm/Message/QuickStarts/FallbackImg.js +9 -0
  223. package/dist/esm/Message/QuickStarts/QuickStartTile.d.ts +27 -0
  224. package/dist/esm/Message/QuickStarts/QuickStartTile.js +52 -0
  225. package/dist/esm/Message/QuickStarts/QuickStartTileDescription.d.ts +23 -0
  226. package/dist/esm/Message/QuickStarts/QuickStartTileDescription.js +35 -0
  227. package/dist/esm/Message/QuickStarts/QuickStartTileDescription.test.d.ts +1 -0
  228. package/dist/esm/Message/QuickStarts/QuickStartTileDescription.test.js +48 -0
  229. package/dist/esm/Message/QuickStarts/QuickStartTileHeader.d.ts +11 -0
  230. package/dist/esm/Message/QuickStarts/QuickStartTileHeader.js +5 -0
  231. package/dist/esm/Message/QuickStarts/monitor-sampleapp-quickstart-with-image.d.ts +30 -0
  232. package/dist/esm/Message/QuickStarts/monitor-sampleapp-quickstart-with-image.js +74 -0
  233. package/dist/esm/Message/QuickStarts/monitor-sampleapp-quickstart.d.ts +30 -0
  234. package/dist/esm/Message/QuickStarts/monitor-sampleapp-quickstart.js +74 -0
  235. package/dist/esm/Message/QuickStarts/types.d.ts +132 -0
  236. package/dist/esm/Message/QuickStarts/types.js +14 -0
  237. package/dist/esm/Message/TableMessage/TableMessage.d.ts +20 -0
  238. package/dist/esm/Message/TableMessage/TableMessage.js +62 -0
  239. package/dist/esm/Message/TableMessage/TbodyMessage.d.ts +7 -0
  240. package/dist/esm/Message/TableMessage/TbodyMessage.js +28 -0
  241. package/dist/esm/Message/TableMessage/TdMessage.d.ts +5 -0
  242. package/dist/esm/Message/TableMessage/TdMessage.js +21 -0
  243. package/dist/esm/Message/TableMessage/ThMessage.d.ts +5 -0
  244. package/dist/esm/Message/TableMessage/ThMessage.js +21 -0
  245. package/dist/esm/Message/TableMessage/TheadMessage.d.ts +5 -0
  246. package/dist/esm/Message/TableMessage/TheadMessage.js +21 -0
  247. package/dist/esm/Message/TableMessage/TrMessage.d.ts +7 -0
  248. package/dist/esm/Message/TableMessage/TrMessage.js +32 -0
  249. package/dist/esm/Message/TextMessage/TextMessage.d.ts +2 -1
  250. package/dist/esm/Message/TextMessage/TextMessage.js +3 -3
  251. package/dist/esm/Message/UserFeedback/CloseButton.d.ts +10 -0
  252. package/dist/esm/Message/UserFeedback/CloseButton.js +9 -0
  253. package/dist/esm/Message/UserFeedback/UserFeedback.d.ts +39 -0
  254. package/dist/esm/Message/UserFeedback/UserFeedback.js +49 -0
  255. package/dist/esm/Message/UserFeedback/UserFeedback.test.d.ts +1 -0
  256. package/dist/esm/Message/UserFeedback/UserFeedback.test.js +128 -0
  257. package/dist/esm/Message/UserFeedback/UserFeedbackComplete.d.ts +42 -0
  258. package/dist/esm/Message/UserFeedback/UserFeedbackComplete.js +112 -0
  259. package/dist/esm/Message/UserFeedback/UserFeedbackComplete.test.d.ts +1 -0
  260. package/dist/esm/Message/UserFeedback/UserFeedbackComplete.test.js +244 -0
  261. package/dist/esm/MessageBar/AttachButton.js +4 -2
  262. package/dist/esm/MessageBar/MessageBar.d.ts +11 -4
  263. package/dist/esm/MessageBar/MessageBar.js +127 -46
  264. package/dist/esm/MessageBar/MessageBar.test.js +12 -4
  265. package/dist/esm/MessageBar/MicrophoneButton.d.ts +1 -1
  266. package/dist/esm/MessageBar/SendButton.js +3 -1
  267. package/dist/esm/MessageBar/StopButton.js +3 -1
  268. package/dist/esm/MessageBox/MessageBox.test.d.ts +1 -0
  269. package/dist/esm/MessageBox/MessageBox.test.js +17 -0
  270. package/dist/esm/PreviewAttachment/PreviewAttachment.test.d.ts +1 -0
  271. package/dist/esm/PreviewAttachment/PreviewAttachment.test.js +23 -0
  272. package/dist/esm/ResponseActions/ResponseActionButton.d.ts +4 -1
  273. package/dist/esm/ResponseActions/ResponseActionButton.js +18 -3
  274. package/dist/esm/ResponseActions/ResponseActions.d.ts +8 -2
  275. package/dist/esm/ResponseActions/ResponseActions.js +7 -7
  276. package/dist/esm/ResponseActions/ResponseActions.test.js +2 -2
  277. package/dist/esm/Settings/SettingsForm.test.d.ts +1 -0
  278. package/dist/esm/Settings/SettingsForm.test.js +21 -0
  279. package/dist/esm/__mocks__/rehype-external-links.d.ts +2 -0
  280. package/dist/esm/__mocks__/rehype-external-links.js +2 -0
  281. package/dist/esm/__mocks__/rehype-sanitize.d.ts +2 -0
  282. package/dist/esm/__mocks__/rehype-sanitize.js +2 -0
  283. package/dist/esm/__mocks__/rehype-unwrap-images.d.ts +2 -0
  284. package/dist/esm/__mocks__/rehype-unwrap-images.js +2 -0
  285. package/dist/esm/index.d.ts +4 -0
  286. package/dist/esm/index.js +4 -0
  287. package/dist/esm/tracking/console_tracking_provider.d.ts +10 -0
  288. package/dist/esm/tracking/console_tracking_provider.js +23 -0
  289. package/dist/esm/tracking/index.d.ts +2 -0
  290. package/dist/esm/tracking/index.js +2 -0
  291. package/dist/esm/tracking/posthog_tracking_provider.d.ts +9 -0
  292. package/dist/esm/tracking/posthog_tracking_provider.js +33 -0
  293. package/dist/esm/tracking/segment_tracking_provider.d.ts +10 -0
  294. package/dist/esm/tracking/segment_tracking_provider.js +46 -0
  295. package/dist/esm/tracking/trackingProviderProxy.d.ts +9 -0
  296. package/dist/esm/tracking/trackingProviderProxy.js +22 -0
  297. package/dist/esm/tracking/tracking_api.d.ts +8 -0
  298. package/dist/esm/tracking/tracking_api.js +1 -0
  299. package/dist/esm/tracking/tracking_registry.d.ts +4 -0
  300. package/dist/esm/tracking/tracking_registry.js +26 -0
  301. package/dist/esm/tracking/tracking_spi.d.ts +9 -0
  302. package/dist/esm/tracking/tracking_spi.js +1 -0
  303. package/dist/esm/tracking/umami_tracking_provider.d.ts +14 -0
  304. package/dist/esm/tracking/umami_tracking_provider.js +40 -0
  305. package/dist/tsconfig.tsbuildinfo +1 -1
  306. package/package.json +8 -9
  307. package/patternfly-docs/content/extensions/chatbot/about-chatbot.md +8 -2
  308. package/patternfly-docs/content/extensions/chatbot/design-guidelines.md +192 -15
  309. package/patternfly-docs/content/extensions/chatbot/examples/Analytics/Analytics.md +219 -0
  310. package/patternfly-docs/content/extensions/chatbot/examples/Messages/AttachmentError.tsx +2 -2
  311. package/patternfly-docs/content/extensions/chatbot/examples/Messages/BotMessage.tsx +214 -12
  312. package/patternfly-docs/content/extensions/chatbot/examples/Messages/FileDropZone.tsx +2 -1
  313. package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithAttachment.tsx +2 -2
  314. package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithCustomResponseActions.tsx +1 -1
  315. package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithFeedback.tsx +71 -0
  316. package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithFeedbackTimeout.tsx +27 -0
  317. package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithQuickResponses.tsx +1 -1
  318. package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithQuickStart.tsx +31 -0
  319. package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithResponseActions.tsx +1 -1
  320. package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithSources.tsx +1 -1
  321. package/patternfly-docs/content/extensions/chatbot/examples/Messages/Messages.md +61 -9
  322. package/patternfly-docs/content/extensions/chatbot/examples/Messages/UserMessage.tsx +244 -14
  323. package/patternfly-docs/content/extensions/chatbot/examples/Messages/UserMessageWithExtraContent.tsx +54 -0
  324. package/patternfly-docs/content/extensions/chatbot/examples/Messages/explore-pipeline-quickstart.ts +65 -0
  325. package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotFooter.tsx +1 -1
  326. package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotFootnote.tsx +5 -5
  327. package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotHeaderBasic.tsx +1 -1
  328. package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotHeaderDrawer.tsx +36 -3
  329. package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotHeaderDrawerNavigation.tsx +67 -0
  330. package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotHeaderDrawerResizable.tsx +94 -0
  331. package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotMessageBarAttach.tsx +1 -1
  332. package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotWelcomeInteraction.tsx +1 -1
  333. package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotWelcomePrompt.tsx +7 -7
  334. package/patternfly-docs/content/extensions/chatbot/examples/UI/SquareChatbotToggle.tsx +1 -1
  335. package/patternfly-docs/content/extensions/chatbot/examples/UI/UI.md +21 -6
  336. package/patternfly-docs/content/extensions/chatbot/examples/demos/AttachmentDemos.md +14 -0
  337. package/patternfly-docs/content/extensions/chatbot/examples/demos/Chatbot.md +39 -1
  338. package/patternfly-docs/content/extensions/chatbot/examples/demos/Chatbot.tsx +48 -35
  339. package/patternfly-docs/content/extensions/chatbot/examples/demos/ChatbotAttachment.tsx +2 -2
  340. package/patternfly-docs/content/extensions/chatbot/examples/demos/ChatbotAttachmentMenu.tsx +3 -3
  341. package/patternfly-docs/content/extensions/chatbot/examples/demos/ChatbotInDrawer.tsx +453 -0
  342. package/patternfly-docs/content/extensions/chatbot/examples/demos/EmbeddedChatbot.tsx +11 -11
  343. package/patternfly-docs/content/extensions/chatbot/examples/demos/EmbeddedComparisonChatbot.tsx +206 -0
  344. package/patternfly-docs/content/extensions/chatbot/examples/demos/Feedback.tsx +104 -0
  345. package/patternfly-docs/content/extensions/chatbot/img/ai-action-inpage.svg +85 -0
  346. package/patternfly-docs/content/extensions/chatbot/img/ai-action-message.svg +63 -0
  347. package/patternfly-docs/content/extensions/chatbot/img/analytics-example.svg +127 -0
  348. package/patternfly-docs/content/extensions/chatbot/img/attached-file.svg +24 -29
  349. package/patternfly-docs/content/extensions/chatbot/img/attachment-menu.svg +4 -4
  350. package/patternfly-docs/content/extensions/chatbot/img/attachment-unsent.svg +30 -58
  351. package/patternfly-docs/content/extensions/chatbot/img/chatbot-analytics.svg +51 -0
  352. package/patternfly-docs/content/extensions/chatbot/img/chatbot-elements.svg +11 -12
  353. package/patternfly-docs/content/extensions/chatbot/img/chatbot-quickstarts-tile.svg +58 -0
  354. package/patternfly-docs/content/extensions/chatbot/img/chatbot-settings.svg +83 -0
  355. package/patternfly-docs/content/extensions/chatbot/img/comparison.svg +45 -0
  356. package/patternfly-docs/content/extensions/chatbot/img/conversation-history.svg +6 -29
  357. package/patternfly-docs/content/extensions/chatbot/img/docked.svg +259 -241
  358. package/patternfly-docs/content/extensions/chatbot/img/drawer.svg +255 -0
  359. package/patternfly-docs/content/extensions/chatbot/img/error-state.svg +30 -0
  360. package/patternfly-docs/content/extensions/chatbot/img/feedback-form.svg +88 -0
  361. package/patternfly-docs/content/extensions/chatbot/img/footnote.svg +1 -1
  362. package/patternfly-docs/content/extensions/chatbot/img/fullscreen.svg +25 -16
  363. package/patternfly-docs/content/extensions/chatbot/img/listening-pulse.svg +22 -0
  364. package/patternfly-docs/content/extensions/chatbot/img/listening.svg +1 -1
  365. package/patternfly-docs/content/extensions/chatbot/img/loading-state.svg +28 -0
  366. package/patternfly-docs/content/extensions/chatbot/img/masthead-toggle-notification.svg +49 -0
  367. package/patternfly-docs/content/extensions/chatbot/img/masthead-toggle.svg +75 -0
  368. package/patternfly-docs/content/extensions/chatbot/img/message-bar-elements.svg +3 -3
  369. package/patternfly-docs/content/extensions/chatbot/img/message-elements.svg +84 -142
  370. package/patternfly-docs/content/extensions/chatbot/img/message-feedback.svg +52 -0
  371. package/patternfly-docs/content/extensions/chatbot/img/message-responses.svg +54 -0
  372. package/patternfly-docs/content/extensions/chatbot/img/new-chat-emptystate.svg +27 -0
  373. package/patternfly-docs/content/extensions/chatbot/img/no-results-emptystate.svg +27 -0
  374. package/patternfly-docs/content/extensions/chatbot/img/overlay.svg +54 -39
  375. package/patternfly-docs/content/extensions/chatbot/img/posthog.svg +30 -0
  376. package/patternfly-docs/content/extensions/chatbot/img/segment.svg +36 -0
  377. package/patternfly-docs/content/extensions/chatbot/img/settings-menu.svg +122 -0
  378. package/patternfly-docs/content/extensions/chatbot/img/source-tile.svg +62 -0
  379. package/patternfly-docs/content/extensions/chatbot/img/thank-you-card.svg +81 -0
  380. package/patternfly-docs/content/extensions/chatbot/img/toggle-customizations.svg +12 -0
  381. package/patternfly-docs/content/extensions/chatbot/img/toggle-tooltips.svg +38 -0
  382. package/patternfly-docs/content/extensions/chatbot/img/umami.svg +30 -0
  383. package/patternfly-docs/content/extensions/chatbot/img/welcome-elements.svg +82 -0
  384. package/patternfly-docs/content/extensions/chatbot/img/welcome-message.svg +94 -0
  385. package/src/AttachMenu/AttachMenu.scss +1 -1
  386. package/src/AttachmentEdit/AttachmentEdit.test.tsx +55 -0
  387. package/src/Chatbot/Chatbot.scss +20 -1
  388. package/src/Chatbot/Chatbot.test.tsx +31 -0
  389. package/src/Chatbot/Chatbot.tsx +2 -1
  390. package/src/ChatbotAlert/ChatbotAlert.test.tsx +31 -0
  391. package/src/ChatbotContent/ChatbotContent.scss +1 -0
  392. package/src/ChatbotContent/ChatbotContent.test.tsx +15 -0
  393. package/src/ChatbotConversationHistoryNav/ChatbotConversationHistoryDropdown.tsx +10 -4
  394. package/src/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.scss +24 -1
  395. package/src/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.test.tsx +242 -3
  396. package/src/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.tsx +94 -26
  397. package/src/ChatbotConversationHistoryNav/EmptyState.tsx +44 -0
  398. package/src/ChatbotConversationHistoryNav/LoadingState.tsx +38 -0
  399. package/src/ChatbotFooter/ChatbotFooter.scss +8 -4
  400. package/src/ChatbotFooter/ChatbotFooter.test.tsx +15 -0
  401. package/src/ChatbotFooter/ChatbotFooternote.test.tsx +84 -0
  402. package/src/ChatbotFooter/ChatbotFootnote.tsx +2 -2
  403. package/src/ChatbotHeader/ChatbotHeader.scss +5 -6
  404. package/src/ChatbotHeader/ChatbotHeader.test.tsx +15 -0
  405. package/src/ChatbotHeader/ChatbotHeaderActions.test.tsx +17 -0
  406. package/src/ChatbotHeader/ChatbotHeaderCloseButton.test.tsx +20 -0
  407. package/src/ChatbotHeader/ChatbotHeaderCloseButton.tsx +7 -1
  408. package/src/ChatbotHeader/ChatbotHeaderMain.test.tsx +17 -0
  409. package/src/ChatbotHeader/ChatbotHeaderMenu.test.tsx +19 -0
  410. package/src/ChatbotHeader/ChatbotHeaderMenu.tsx +7 -1
  411. package/src/ChatbotHeader/ChatbotHeaderOptionsDropdown.test.tsx +45 -0
  412. package/src/ChatbotHeader/ChatbotHeaderOptionsDropdown.tsx +8 -1
  413. package/src/ChatbotHeader/ChatbotHeaderSelectorDropdown.test.tsx +43 -0
  414. package/src/ChatbotHeader/ChatbotHeaderSelectorDropdown.tsx +11 -4
  415. package/src/ChatbotHeader/ChatbotHeaderTitle.test.tsx +75 -0
  416. package/src/ChatbotHeader/ChatbotHeaderTitle.tsx +7 -2
  417. package/src/ChatbotModal/ChatbotModal.scss +12 -12
  418. package/src/ChatbotToggle/ChatbotToggle.tsx +6 -1
  419. package/src/ChatbotWelcomePrompt/ChatbotWelcomePrompt.scss +2 -0
  420. package/src/ChatbotWelcomePrompt/ChatbotWelcomePrompt.test.tsx +26 -18
  421. package/src/ChatbotWelcomePrompt/__snapshots__/ChatbotWelcomePrompt.test.tsx.snap +2 -2
  422. package/src/CodeModal/CodeModal.scss +7 -4
  423. package/src/Compare/Compare.scss +72 -0
  424. package/src/Compare/Compare.test.tsx +31 -0
  425. package/src/Compare/Compare.tsx +98 -0
  426. package/src/Compare/index.ts +2 -0
  427. package/src/FileDetails/FileDetails.scss +1 -1
  428. package/src/FileDetailsLabel/FileDetailsLabel.scss +2 -2
  429. package/src/Message/CodeBlockMessage/CodeBlockMessage.scss +4 -4
  430. package/src/Message/ErrorMessage/ErrorMessage.tsx +14 -0
  431. package/src/Message/ImageMessage/ImageMessage.scss +9 -0
  432. package/src/Message/ImageMessage/ImageMessage.tsx +14 -0
  433. package/src/Message/LinkMessage/LinkMessage.tsx +34 -0
  434. package/src/Message/ListMessage/ListMessage.scss +6 -6
  435. package/src/Message/Message.scss +4 -26
  436. package/src/Message/Message.test.tsx +367 -3
  437. package/src/Message/Message.tsx +157 -31
  438. package/src/Message/MessageLoading.scss +2 -2
  439. package/src/Message/QuickResponse/QuickResponse.scss +33 -0
  440. package/src/Message/QuickResponse/QuickResponse.tsx +54 -0
  441. package/src/Message/QuickStarts/FallbackImg.tsx +24 -0
  442. package/src/Message/QuickStarts/QuickStartTile.scss +24 -0
  443. package/src/Message/QuickStarts/QuickStartTile.tsx +147 -0
  444. package/src/Message/QuickStarts/QuickStartTileDescription.test.tsx +57 -0
  445. package/src/Message/QuickStarts/QuickStartTileDescription.tsx +81 -0
  446. package/src/Message/QuickStarts/QuickStartTileHeader.tsx +21 -0
  447. package/src/Message/QuickStarts/monitor-sampleapp-quickstart-with-image.ts +75 -0
  448. package/src/Message/QuickStarts/monitor-sampleapp-quickstart.ts +75 -0
  449. package/src/Message/QuickStarts/types.ts +154 -0
  450. package/src/Message/TableMessage/TableMessage.scss +23 -0
  451. package/src/Message/TableMessage/TableMessage.tsx +83 -0
  452. package/src/Message/TableMessage/TbodyMessage.tsx +20 -0
  453. package/src/Message/TableMessage/TdMessage.tsx +11 -0
  454. package/src/Message/TableMessage/ThMessage.tsx +11 -0
  455. package/src/Message/TableMessage/TheadMessage.tsx +11 -0
  456. package/src/Message/TableMessage/TrMessage.tsx +27 -0
  457. package/src/Message/TextMessage/TextMessage.scss +21 -12
  458. package/src/Message/TextMessage/TextMessage.tsx +3 -3
  459. package/src/Message/UserFeedback/CloseButton.tsx +21 -0
  460. package/src/Message/UserFeedback/UserFeedback.scss +53 -0
  461. package/src/Message/UserFeedback/UserFeedback.test.tsx +236 -0
  462. package/src/Message/UserFeedback/UserFeedback.tsx +128 -0
  463. package/src/Message/UserFeedback/UserFeedbackComplete.test.tsx +255 -0
  464. package/src/Message/UserFeedback/UserFeedbackComplete.tsx +211 -0
  465. package/src/MessageBar/AttachButton.scss +19 -3
  466. package/src/MessageBar/AttachButton.tsx +3 -1
  467. package/src/MessageBar/MessageBar.scss +58 -24
  468. package/src/MessageBar/MessageBar.test.tsx +12 -4
  469. package/src/MessageBar/MessageBar.tsx +164 -65
  470. package/src/MessageBar/MicrophoneButton.scss +8 -8
  471. package/src/MessageBar/MicrophoneButton.tsx +1 -1
  472. package/src/MessageBar/SendButton.tsx +2 -0
  473. package/src/MessageBar/StopButton.scss +17 -3
  474. package/src/MessageBar/StopButton.tsx +2 -0
  475. package/src/MessageBox/JumpButton.scss +6 -6
  476. package/src/MessageBox/MessageBox.scss +1 -0
  477. package/src/MessageBox/MessageBox.test.tsx +26 -0
  478. package/src/PreviewAttachment/PreviewAttachment.test.tsx +51 -0
  479. package/src/ResponseActions/ResponseActionButton.tsx +14 -2
  480. package/src/ResponseActions/ResponseActions.scss +2 -2
  481. package/src/ResponseActions/ResponseActions.test.tsx +4 -2
  482. package/src/ResponseActions/ResponseActions.tsx +26 -2
  483. package/src/Settings/Settings.scss +2 -2
  484. package/src/Settings/SettingsForm.test.tsx +28 -0
  485. package/src/SourceDetailsMenuItem/SourceDetailsMenuItem.scss +2 -2
  486. package/src/SourcesCard/SourcesCard.scss +9 -3
  487. package/src/TermsOfUse/TermsOfUse.scss +1 -1
  488. package/src/__mocks__/rehype-external-links.ts +3 -0
  489. package/src/__mocks__/rehype-sanitize.ts +3 -0
  490. package/src/__mocks__/rehype-unwrap-images.tsx +3 -0
  491. package/src/index.ts +6 -0
  492. package/src/main.scss +6 -6
  493. package/src/tracking/console_tracking_provider.ts +30 -0
  494. package/src/tracking/index.ts +3 -0
  495. package/src/tracking/posthog_tracking_provider.ts +42 -0
  496. package/src/tracking/segment_tracking_provider.ts +62 -0
  497. package/src/tracking/trackingProviderProxy.ts +28 -0
  498. package/src/tracking/tracking_api.ts +11 -0
  499. package/src/tracking/tracking_registry.ts +33 -0
  500. package/src/tracking/tracking_spi.ts +14 -0
  501. package/src/tracking/umami_tracking_provider.ts +54 -0
@@ -0,0 +1,236 @@
1
+ import React from 'react';
2
+ import { render, screen } from '@testing-library/react';
3
+ import '@testing-library/jest-dom';
4
+ import userEvent from '@testing-library/user-event';
5
+ import UserFeedback from './UserFeedback';
6
+
7
+ const MOCK_RESPONSES = [
8
+ { id: '1', content: 'Helpful information', onClick: () => alert('Clicked helpful information') },
9
+ { id: '2', content: 'Easy to understand', onClick: () => alert('Clicked easy to understand') },
10
+ { id: '3', content: 'Resolved my issue', onClick: () => alert('Clicked resolved my issue') }
11
+ ];
12
+
13
+ describe('UserFeedback', () => {
14
+ it('should render correctly', () => {
15
+ render(<UserFeedback onClose={jest.fn} onSubmit={jest.fn} quickResponses={MOCK_RESPONSES} timestamp="12/12/12" />);
16
+ expect(screen.getByRole('heading', { name: /Why did you choose this rating?/i })).toBeTruthy();
17
+ expect(screen.getByRole('list', { name: 'Quick feedback for message received at 12/12/12' })).toBeTruthy();
18
+ expect(screen.getByRole('button', { name: /Helpful information/i })).toBeTruthy();
19
+ expect(screen.getByRole('button', { name: /Easy to understand/i })).toBeTruthy();
20
+ expect(screen.getByRole('button', { name: /Resolved my issue/i })).toBeTruthy();
21
+ expect(screen.getByRole('button', { name: /Submit/i })).toBeTruthy();
22
+ expect(screen.getByRole('button', { name: 'Close feedback for message received at 12/12/12' })).toBeTruthy();
23
+ expect(screen.queryByRole('textbox', { name: /Provide optional additional feedback/i })).toBeFalsy();
24
+ });
25
+ it('should render different title correctly', () => {
26
+ render(
27
+ <UserFeedback
28
+ timestamp="12/12/12"
29
+ onClose={jest.fn}
30
+ onSubmit={jest.fn}
31
+ quickResponses={MOCK_RESPONSES}
32
+ title="Thanks! Why?"
33
+ />
34
+ );
35
+ expect(screen.getByText('Thanks! Why?')).toBeTruthy();
36
+ });
37
+ it('should render different submit button text correctly', () => {
38
+ render(
39
+ <UserFeedback
40
+ timestamp="12/12/12"
41
+ onClose={jest.fn}
42
+ onSubmit={jest.fn}
43
+ quickResponses={MOCK_RESPONSES}
44
+ submitWord="Give feedback"
45
+ />
46
+ );
47
+ expect(screen.getByRole('button', { name: /Give feedback/i })).toBeTruthy();
48
+ });
49
+ it('should render text area correctly', () => {
50
+ render(
51
+ <UserFeedback
52
+ timestamp="12/12/12"
53
+ onClose={jest.fn}
54
+ onSubmit={jest.fn}
55
+ quickResponses={MOCK_RESPONSES}
56
+ hasTextArea
57
+ />
58
+ );
59
+ expect(screen.getByRole('textbox', { name: /Provide optional additional feedback/i })).toBeTruthy();
60
+ });
61
+ it('should call onTextAreaChange correctly', async () => {
62
+ const spy = jest.fn();
63
+ render(
64
+ <UserFeedback
65
+ timestamp="12/12/12"
66
+ onClose={jest.fn}
67
+ onSubmit={jest.fn}
68
+ quickResponses={MOCK_RESPONSES}
69
+ hasTextArea
70
+ onTextAreaChange={spy}
71
+ />
72
+ );
73
+ const textbox = screen.getByRole('textbox', { name: /Provide optional additional feedback/i });
74
+ await userEvent.type(textbox, 'test');
75
+ expect(spy).toHaveBeenCalledTimes(4);
76
+ });
77
+ it('should render different placeholder correctly', () => {
78
+ render(
79
+ <UserFeedback
80
+ timestamp="12/12/12"
81
+ onClose={jest.fn}
82
+ onSubmit={jest.fn}
83
+ quickResponses={MOCK_RESPONSES}
84
+ hasTextArea
85
+ textAreaPlaceholder="Provide any other information"
86
+ />
87
+ );
88
+ expect(screen.getByRole('textbox', { name: /Provide optional additional feedback/i })).toHaveAttribute(
89
+ 'placeholder',
90
+ 'Provide any other information'
91
+ );
92
+ });
93
+ it('should render different text area label correctly', () => {
94
+ render(
95
+ <UserFeedback
96
+ timestamp="12/12/12"
97
+ onClose={jest.fn}
98
+ onSubmit={jest.fn}
99
+ quickResponses={MOCK_RESPONSES}
100
+ hasTextArea
101
+ textAreaAriaLabel="Provide more details"
102
+ />
103
+ );
104
+ expect(screen.getByRole('textbox', { name: /Provide more details/i })).toBeTruthy();
105
+ });
106
+ it('should handle onClose correctly when close button is clicked', async () => {
107
+ const spy = jest.fn();
108
+ render(<UserFeedback onSubmit={jest.fn} quickResponses={MOCK_RESPONSES} onClose={spy} timestamp="12/12/12" />);
109
+ const closeButton = screen.getByRole('button', { name: 'Close feedback for message received at 12/12/12' });
110
+ expect(closeButton).toBeTruthy();
111
+ await userEvent.click(closeButton);
112
+ expect(spy).toHaveBeenCalledTimes(1);
113
+ });
114
+ it('should be able to change close button aria label', () => {
115
+ const spy = jest.fn();
116
+ render(
117
+ <UserFeedback
118
+ timestamp="12/12/12"
119
+ onSubmit={jest.fn}
120
+ quickResponses={MOCK_RESPONSES}
121
+ onClose={spy}
122
+ closeButtonAriaLabel="Ima button"
123
+ />
124
+ );
125
+ expect(screen.getByRole('button', { name: /Ima button/i })).toBeTruthy();
126
+ });
127
+ it('should handle className', async () => {
128
+ render(
129
+ <UserFeedback
130
+ timestamp="12/12/12"
131
+ onClose={jest.fn}
132
+ onSubmit={jest.fn}
133
+ quickResponses={MOCK_RESPONSES}
134
+ className="test"
135
+ data-testid="card"
136
+ />
137
+ );
138
+ expect(screen.getByTestId('card')).toHaveClass('test');
139
+ });
140
+ it('should apply id', async () => {
141
+ render(
142
+ <UserFeedback
143
+ timestamp="12/12/12"
144
+ onClose={jest.fn}
145
+ onSubmit={jest.fn}
146
+ quickResponses={MOCK_RESPONSES}
147
+ id="test"
148
+ data-testid="card"
149
+ />
150
+ );
151
+ expect(screen.getByTestId('card').parentElement).toHaveAttribute('id', 'test');
152
+ });
153
+ it('should handle submit correctly when nothing is selected', async () => {
154
+ const spy = jest.fn();
155
+ render(<UserFeedback timestamp="12/12/12" onClose={jest.fn} onSubmit={spy} quickResponses={MOCK_RESPONSES} />);
156
+ await userEvent.click(screen.getByRole('button', { name: /Submit/i }));
157
+ expect(spy).toHaveBeenCalledTimes(1);
158
+ expect(spy).toHaveBeenCalledWith(undefined, '');
159
+ });
160
+ it('should handle submit correctly when item is selected', async () => {
161
+ const spy = jest.fn();
162
+ render(<UserFeedback timestamp="12/12/12" onClose={jest.fn} onSubmit={spy} quickResponses={MOCK_RESPONSES} />);
163
+ await userEvent.click(screen.getByRole('button', { name: /Easy to understand/i }));
164
+ await userEvent.click(screen.getByRole('button', { name: /Submit/i }));
165
+ expect(spy).toHaveBeenCalledTimes(1);
166
+ expect(spy).toHaveBeenCalledWith('2', '');
167
+ });
168
+ it('should handle submit correctly when there is just text input', async () => {
169
+ const spy = jest.fn();
170
+ render(
171
+ <UserFeedback timestamp="12/12/12" onClose={jest.fn} onSubmit={spy} quickResponses={MOCK_RESPONSES} hasTextArea />
172
+ );
173
+ await userEvent.type(
174
+ screen.getByRole('textbox', { name: /Provide optional additional feedback/i }),
175
+ 'What a great experience!'
176
+ );
177
+ await userEvent.click(screen.getByRole('button', { name: /Submit/i }));
178
+ expect(spy).toHaveBeenCalledTimes(1);
179
+ expect(spy).toHaveBeenCalledWith(undefined, 'What a great experience!');
180
+ });
181
+ it('should handle submit correctly when item is selected and there is text input', async () => {
182
+ const spy = jest.fn();
183
+ render(
184
+ <UserFeedback timestamp="12/12/12" onClose={jest.fn} onSubmit={spy} quickResponses={MOCK_RESPONSES} hasTextArea />
185
+ );
186
+ await userEvent.click(screen.getByRole('button', { name: /Easy to understand/i }));
187
+ await userEvent.type(
188
+ screen.getByRole('textbox', { name: /Provide optional additional feedback/i }),
189
+ 'What a great experience!'
190
+ );
191
+ await userEvent.click(screen.getByRole('button', { name: /Submit/i }));
192
+ expect(spy).toHaveBeenCalledTimes(1);
193
+ expect(spy).toHaveBeenCalledWith('2', 'What a great experience!');
194
+ });
195
+ it('should default title heading level to h1', () => {
196
+ render(<UserFeedback timestamp="12/12/12" onClose={jest.fn} onSubmit={jest.fn} quickResponses={MOCK_RESPONSES} />);
197
+ expect(screen.getByRole('heading', { level: 1, name: /Why did you choose this rating?/i })).toBeTruthy();
198
+ });
199
+ it('should be able to change title heading level', () => {
200
+ render(
201
+ <UserFeedback
202
+ timestamp="12/12/12"
203
+ onClose={jest.fn}
204
+ onSubmit={jest.fn}
205
+ quickResponses={MOCK_RESPONSES}
206
+ headingLevel="h6"
207
+ />
208
+ );
209
+ expect(screen.getByRole('heading', { level: 6, name: /Why did you choose this rating?/i })).toBeTruthy();
210
+ });
211
+ it('should focus on load by default', () => {
212
+ render(
213
+ <UserFeedback
214
+ timestamp="12/12/12"
215
+ onClose={jest.fn}
216
+ onSubmit={jest.fn}
217
+ quickResponses={MOCK_RESPONSES}
218
+ data-testid="card"
219
+ />
220
+ );
221
+ expect(screen.getByTestId('card').parentElement).toHaveFocus();
222
+ });
223
+ it('should not focus on load if focusOnLoad = false', () => {
224
+ render(
225
+ <UserFeedback
226
+ timestamp="12/12/12"
227
+ onClose={jest.fn}
228
+ onSubmit={jest.fn}
229
+ quickResponses={MOCK_RESPONSES}
230
+ data-testid="card"
231
+ focusOnLoad={false}
232
+ />
233
+ );
234
+ expect(screen.getByTestId('card').parentElement).not.toHaveFocus();
235
+ });
236
+ });
@@ -0,0 +1,128 @@
1
+ // ============================================================================
2
+ // Chatbot Main - Messages - Feedback Card
3
+ // ============================================================================
4
+ import React from 'react';
5
+
6
+ // Import PatternFly components
7
+ import {
8
+ ActionGroup,
9
+ Button,
10
+ Card,
11
+ CardBody,
12
+ CardHeader,
13
+ CardProps,
14
+ Form,
15
+ LabelGroupProps,
16
+ OUIAProps,
17
+ TextArea
18
+ } from '@patternfly/react-core';
19
+ import QuickResponse from '../QuickResponse/QuickResponse';
20
+ import CloseButton from './CloseButton';
21
+
22
+ export interface UserFeedbackProps extends Omit<CardProps, 'onSubmit'>, OUIAProps {
23
+ /** Additional classes for the pagination navigation container. */
24
+ className?: string;
25
+ /** Quick responses a user can select */
26
+ quickResponses?: QuickResponse[];
27
+ /** Props for quick responses container */
28
+ quickResponseContainerProps?: Omit<LabelGroupProps, 'ref'>;
29
+ /** Whether form includes text area */
30
+ hasTextArea?: boolean;
31
+ /** Placeholder of text area */
32
+ textAreaPlaceholder?: string;
33
+ /** Aria label for text area */
34
+ textAreaAriaLabel?: string;
35
+ /** Callback function for when text area changes */
36
+ onTextAreaChange?: (event: React.ChangeEvent<HTMLTextAreaElement>, value: string) => void;
37
+ /** Callback function for when form is submitted */
38
+ onSubmit: (selectedResponse?: string, additionalFeedback?: string) => void;
39
+ /** Callback function for when close button is clicked */
40
+ onClose: () => void;
41
+ /** Aria label for close button */
42
+ closeButtonAriaLabel?: string;
43
+ /** Label for the English word "Submit." */
44
+ submitWord?: string;
45
+ /** @deprecated Cancel button has been deprecated. Use the close button instead. Label for the English word "Cancel." */
46
+ cancelWord?: string;
47
+ /** Uniquely identifies the card. */
48
+ id?: string;
49
+ /** The heading level to use, default is h1 */
50
+ headingLevel?: 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6';
51
+ /** Whether to focus card on load */
52
+ focusOnLoad?: boolean;
53
+ /** Timestamp passed in by Message for more context in aria announcements */
54
+ timestamp?: string;
55
+ }
56
+
57
+ const UserFeedback: React.FunctionComponent<UserFeedbackProps> = ({
58
+ className,
59
+ timestamp,
60
+ title = 'Why did you choose this rating?',
61
+ hasTextArea,
62
+ textAreaAriaLabel = `Provide optional additional feedback for message received at ${timestamp}`,
63
+ textAreaPlaceholder = 'Provide optional additional feedback',
64
+ onTextAreaChange,
65
+ submitWord = 'Submit',
66
+ quickResponses,
67
+ quickResponseContainerProps = { 'aria-label': `Quick feedback for message received at ${timestamp}` },
68
+ onSubmit,
69
+ onClose,
70
+ closeButtonAriaLabel = `Close feedback for message received at ${timestamp}`,
71
+ id,
72
+ headingLevel: HeadingLevel = 'h1',
73
+ focusOnLoad = true,
74
+ ...props
75
+ }: UserFeedbackProps) => {
76
+ const [selectedResponse, setSelectedResponse] = React.useState<string>();
77
+ const [value, setValue] = React.useState('');
78
+ const divRef = React.useRef<HTMLDivElement>(null);
79
+
80
+ React.useEffect(() => {
81
+ if (focusOnLoad) {
82
+ divRef.current?.focus();
83
+ }
84
+ }, []);
85
+
86
+ return (
87
+ /* card does not have ref forwarding; hence wrapper div */
88
+ <div ref={divRef} id={id} tabIndex={0} aria-label={title}>
89
+ <Card className={`pf-chatbot__feedback-card ${className ? className : ''}`} {...props}>
90
+ <CardHeader
91
+ actions={{
92
+ actions: <CloseButton onClose={onClose} ariaLabel={closeButtonAriaLabel} />
93
+ }}
94
+ >
95
+ <HeadingLevel className="pf-chatbot__feedback-card-title">{title}</HeadingLevel>
96
+ </CardHeader>
97
+ <CardBody>
98
+ <Form className="pf-chatbot__feedback-card-form">
99
+ {quickResponses && (
100
+ <QuickResponse
101
+ quickResponses={quickResponses}
102
+ quickResponseContainerProps={quickResponseContainerProps}
103
+ onSelect={(id) => setSelectedResponse(id)}
104
+ />
105
+ )}
106
+ {hasTextArea && (
107
+ <TextArea
108
+ value={value}
109
+ onChange={(_event, value) => {
110
+ setValue(value);
111
+ onTextAreaChange && onTextAreaChange(_event, value);
112
+ }}
113
+ placeholder={textAreaPlaceholder}
114
+ aria-label={textAreaAriaLabel}
115
+ resizeOrientation="vertical"
116
+ />
117
+ )}
118
+ <ActionGroup>
119
+ <Button onClick={() => onSubmit(selectedResponse, value)}>{submitWord}</Button>
120
+ </ActionGroup>
121
+ </Form>
122
+ </CardBody>
123
+ </Card>
124
+ </div>
125
+ );
126
+ };
127
+
128
+ export default UserFeedback;
@@ -0,0 +1,255 @@
1
+ import React from 'react';
2
+ import { act, render, screen } from '@testing-library/react';
3
+ import '@testing-library/jest-dom';
4
+ import userEvent from '@testing-library/user-event';
5
+ import UserFeedbackComplete from './UserFeedbackComplete';
6
+
7
+ describe('UserFeedbackComplete', () => {
8
+ it('should render correctly', () => {
9
+ render(<UserFeedbackComplete timestamp="12/12/12" />);
10
+ expect(screen.getByText('Feedback submitted')).toBeTruthy();
11
+ screen.getByText(/We've received your response. Thank you for sharing your feedback!/i);
12
+ expect(screen.queryByRole('button', { name: /Close/i })).toBeFalsy();
13
+ });
14
+ it('should render different title correctly', () => {
15
+ render(<UserFeedbackComplete timestamp="12/12/12" title="Thanks!" />);
16
+ expect(screen.getByText('Thanks!')).toBeTruthy();
17
+ screen.getByText(/We've received your response. Thank you for sharing your feedback!/i);
18
+ });
19
+ it('should render different string body correctly', () => {
20
+ render(<UserFeedbackComplete timestamp="12/12/12" body="Thanks!" />);
21
+ expect(screen.getByText('Feedback submitted')).toBeTruthy();
22
+ expect(screen.getByText('Thanks!')).toBeTruthy();
23
+ });
24
+ it('should render different node body correctly', () => {
25
+ render(<UserFeedbackComplete timestamp="12/12/12" body={<div>Thanks!</div>} />);
26
+ expect(screen.getByText('Feedback submitted')).toBeTruthy();
27
+ expect(screen.getByText('Thanks!')).toBeTruthy();
28
+ });
29
+ it('should handle onClose correctly', async () => {
30
+ const spy = jest.fn();
31
+ render(<UserFeedbackComplete timestamp="12/12/12" onClose={spy} />);
32
+ const closeButton = screen.getByRole('button', { name: 'Close feedback for message received at 12/12/12' });
33
+ expect(closeButton).toBeTruthy();
34
+ await userEvent.click(closeButton);
35
+ expect(spy).toHaveBeenCalledTimes(1);
36
+ });
37
+ it('should be able to change close button aria label', () => {
38
+ const spy = jest.fn();
39
+ render(<UserFeedbackComplete timestamp="12/12/12" onClose={spy} closeButtonAriaLabel="Ima button" />);
40
+ expect(screen.getByRole('button', { name: /Ima button/i })).toBeTruthy();
41
+ });
42
+ it('should handle className', async () => {
43
+ render(<UserFeedbackComplete timestamp="12/12/12" className="test" data-testid="card" />);
44
+ expect(screen.getByTestId('card')).toHaveClass('test');
45
+ });
46
+ it('should apply id', async () => {
47
+ render(<UserFeedbackComplete timestamp="12/12/12" id="test" data-testid="card" />);
48
+ expect(screen.getByTestId('card').parentElement).toHaveAttribute('id', 'test');
49
+ });
50
+ it('renders with no timeout by default', () => {
51
+ jest.useFakeTimers();
52
+ render(<UserFeedbackComplete timestamp="12/12/12" />);
53
+ act(() => {
54
+ jest.advanceTimersByTime(8000);
55
+ });
56
+ expect(screen.getByText('Feedback submitted')).toBeVisible();
57
+ jest.useRealTimers();
58
+ });
59
+ it('should handle timeout correctly after 8000ms when timeout = true', async () => {
60
+ jest.useFakeTimers();
61
+ render(<UserFeedbackComplete timestamp="12/12/12" timeout />);
62
+ act(() => {
63
+ jest.advanceTimersByTime(7999);
64
+ });
65
+ expect(screen.getByText('Feedback submitted')).toBeVisible();
66
+ act(() => {
67
+ jest.advanceTimersByTime(1);
68
+ });
69
+ expect(screen.queryByText('Feedback submitted')).not.toBeInTheDocument();
70
+ jest.useRealTimers();
71
+ });
72
+ it('should handle timeout correctly when timeout = numeric value', async () => {
73
+ jest.useFakeTimers();
74
+ render(<UserFeedbackComplete timestamp="12/12/12" timeout={300} />);
75
+ act(() => {
76
+ jest.advanceTimersByTime(299);
77
+ });
78
+ expect(screen.getByText('Feedback submitted')).toBeVisible();
79
+ act(() => {
80
+ jest.advanceTimersByTime(1);
81
+ });
82
+ expect(screen.queryByText('Feedback submitted')).not.toBeInTheDocument();
83
+ jest.useRealTimers();
84
+ });
85
+ it('does not get removed on timeout if the user is focused on the card', async () => {
86
+ const user = userEvent.setup({
87
+ advanceTimers: (delay) => jest.advanceTimersByTime(delay)
88
+ });
89
+ jest.useFakeTimers();
90
+ render(<UserFeedbackComplete timestamp="12/12/12" timeout data-testid="card" />);
91
+ expect(screen.getByText('Feedback submitted')).toBeTruthy();
92
+ await user.click(screen.getByTestId('card'));
93
+ act(() => {
94
+ jest.advanceTimersByTime(8000);
95
+ });
96
+ expect(screen.getByText('Feedback submitted')).toBeTruthy();
97
+ jest.useRealTimers();
98
+ });
99
+ it('does not remove the card on timeout if the user is hovered over it', async () => {
100
+ const user = userEvent.setup({
101
+ advanceTimers: (delay) => jest.advanceTimersByTime(delay)
102
+ });
103
+ jest.useFakeTimers();
104
+ render(<UserFeedbackComplete timestamp="12/12/12" timeout data-testid="card" />);
105
+ const card = screen.getByTestId('card');
106
+ await user.hover(card);
107
+ act(() => {
108
+ jest.advanceTimersByTime(8000);
109
+ });
110
+ expect(card).toBeVisible();
111
+ jest.useRealTimers();
112
+ });
113
+ it('removes the card after the user removes focus from the card and 3000ms have passed', async () => {
114
+ const user = userEvent.setup({
115
+ advanceTimers: (delay) => jest.advanceTimersByTime(delay)
116
+ });
117
+ jest.useFakeTimers();
118
+ render(
119
+ <div>
120
+ <input />
121
+ <UserFeedbackComplete timestamp="12/12/12" timeout data-testid="card" />
122
+ </div>
123
+ );
124
+ const card = screen.getByTestId('card');
125
+ await user.click(card);
126
+ act(() => {
127
+ jest.advanceTimersByTime(8000);
128
+ });
129
+ await user.click(screen.getByRole('textbox'));
130
+ act(() => {
131
+ jest.advanceTimersByTime(3000);
132
+ });
133
+ expect(screen.queryByText('Feedback submitted')).not.toBeInTheDocument();
134
+ jest.useRealTimers();
135
+ });
136
+
137
+ it('removes the card after the user removes hover from the card and 3000ms have passed', async () => {
138
+ const user = userEvent.setup({
139
+ advanceTimers: (delay) => jest.advanceTimersByTime(delay)
140
+ });
141
+ jest.useFakeTimers();
142
+ render(
143
+ <div>
144
+ <input />
145
+ <UserFeedbackComplete timestamp="12/12/12" timeout data-testid="card" />
146
+ </div>
147
+ );
148
+ const card = screen.getByTestId('card');
149
+ await user.hover(card);
150
+ act(() => {
151
+ jest.advanceTimersByTime(8000);
152
+ });
153
+ await user.hover(screen.getByRole('textbox'));
154
+ act(() => {
155
+ jest.advanceTimersByTime(3000);
156
+ });
157
+ expect(screen.queryByText('Feedback submitted')).not.toBeInTheDocument();
158
+ jest.useRealTimers();
159
+ });
160
+
161
+ it('removes the card after the user removes hover from the card and timeoutAnimation time has passed', async () => {
162
+ const user = userEvent.setup({
163
+ advanceTimers: (delay) => jest.advanceTimersByTime(delay)
164
+ });
165
+ jest.useFakeTimers();
166
+ render(
167
+ <div>
168
+ <input />
169
+ <UserFeedbackComplete timestamp="12/12/12" timeout data-testid="card" timeoutAnimation={1000} />
170
+ </div>
171
+ );
172
+ const card = screen.getByTestId('card');
173
+ await user.hover(card);
174
+ act(() => {
175
+ jest.advanceTimersByTime(8000);
176
+ });
177
+ await user.hover(screen.getByRole('textbox'));
178
+ act(() => {
179
+ jest.advanceTimersByTime(1000);
180
+ });
181
+ expect(screen.queryByText('Feedback submitted')).not.toBeInTheDocument();
182
+ jest.useRealTimers();
183
+ });
184
+ it('does not call the onTimeout callback before the timeout period has expired', () => {
185
+ const spy = jest.fn();
186
+ jest.useFakeTimers();
187
+ render(<UserFeedbackComplete timestamp="12/12/12" timeout data-testid="card" onTimeout={spy} />);
188
+ act(() => {
189
+ jest.advanceTimersByTime(7999);
190
+ });
191
+ expect(spy).not.toHaveBeenCalled();
192
+ jest.useRealTimers();
193
+ });
194
+ it('calls the onTimeout callback after the timeout period has expired', () => {
195
+ jest.useFakeTimers();
196
+ const spy = jest.fn();
197
+ render(<UserFeedbackComplete timestamp="12/12/12" timeout data-testid="card" onTimeout={spy} />);
198
+ act(() => {
199
+ jest.advanceTimersByTime(8000);
200
+ });
201
+ expect(spy).toHaveBeenCalledTimes(1);
202
+ jest.useRealTimers();
203
+ });
204
+
205
+ it('renders without aria-live and aria-atomic attributes by default', () => {
206
+ render(<UserFeedbackComplete timestamp="12/12/12" timeout data-testid="card" />);
207
+ const card = screen.getByTestId('card').parentElement;
208
+ expect(card).not.toHaveAttribute('aria-live');
209
+ expect(card).not.toHaveAttribute('aria-atomic');
210
+ });
211
+
212
+ it('has an aria-live value of polite and aria-atomic value of false when isLiveRegion = true', () => {
213
+ render(<UserFeedbackComplete timestamp="12/12/12" timeout data-testid="card" isLiveRegion />);
214
+ const card = screen.getByTestId('card').parentElement;
215
+ expect(card).toHaveAttribute('aria-live', 'polite');
216
+ expect(card).toHaveAttribute('aria-atomic', 'false');
217
+ });
218
+ it('calls onMouseEnter appropriately', async () => {
219
+ const spy = jest.fn();
220
+ const user = userEvent.setup();
221
+ render(
222
+ <div>
223
+ <input />
224
+ <UserFeedbackComplete timestamp="12/12/12" data-testid="card" onMouseEnter={spy} />
225
+ </div>
226
+ );
227
+ const card = screen.getByTestId('card');
228
+ expect(spy).toHaveBeenCalledTimes(0);
229
+ await user.hover(card);
230
+ expect(spy).toHaveBeenCalledTimes(1);
231
+ });
232
+ it('calls onMouseLeave appropriately', async () => {
233
+ const spy = jest.fn();
234
+ const user = userEvent.setup();
235
+ render(
236
+ <div>
237
+ <input />
238
+ <UserFeedbackComplete timestamp="12/12/12" data-testid="card" onMouseLeave={spy} />
239
+ </div>
240
+ );
241
+ const card = screen.getByTestId('card');
242
+ expect(spy).toHaveBeenCalledTimes(0);
243
+ await user.hover(card);
244
+ await user.hover(screen.getByRole('textbox'));
245
+ expect(spy).toHaveBeenCalledTimes(1);
246
+ });
247
+ it('should focus on load by default', () => {
248
+ render(<UserFeedbackComplete timestamp="12/12/12" data-testid="card" />);
249
+ expect(screen.getByTestId('card').parentElement).toHaveFocus();
250
+ });
251
+ it('should not focus on load if focusOnLoad = false', () => {
252
+ render(<UserFeedbackComplete timestamp="12/12/12" data-testid="card" focusOnLoad={false} />);
253
+ expect(screen.getByTestId('card').parentElement).not.toHaveFocus();
254
+ });
255
+ });