@patternfly/chatbot 2.1.0 → 2.2.0-prerelease.10

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 (177) hide show
  1. package/dist/cjs/Chatbot/Chatbot.js +0 -9
  2. package/dist/cjs/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.d.ts +5 -1
  3. package/dist/cjs/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.js +4 -4
  4. package/dist/cjs/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.test.js +3 -3
  5. package/dist/cjs/ChatbotHeader/ChatbotHeaderCloseButton.d.ts +17 -0
  6. package/dist/cjs/ChatbotHeader/ChatbotHeaderCloseButton.js +14 -0
  7. package/dist/cjs/ChatbotHeader/ChatbotHeaderMenu.d.ts +2 -0
  8. package/dist/cjs/ChatbotHeader/ChatbotHeaderMenu.js +2 -2
  9. package/dist/cjs/ChatbotHeader/index.d.ts +1 -0
  10. package/dist/cjs/ChatbotHeader/index.js +1 -0
  11. package/dist/cjs/CodeModal/CodeModal.js +2 -12
  12. package/dist/cjs/Message/ListMessage/OrderedListMessage.d.ts +1 -1
  13. package/dist/cjs/Message/ListMessage/OrderedListMessage.js +2 -2
  14. package/dist/cjs/Message/Message.d.ts +16 -6
  15. package/dist/cjs/Message/Message.js +6 -6
  16. package/dist/cjs/Message/Message.test.js +51 -0
  17. package/dist/cjs/Message/QuickResponse/QuickResponse.d.ts +15 -0
  18. package/dist/cjs/Message/QuickResponse/QuickResponse.js +33 -0
  19. package/dist/cjs/Message/QuickStarts/FallbackImg.d.ts +13 -0
  20. package/dist/cjs/Message/QuickStarts/FallbackImg.js +34 -0
  21. package/dist/cjs/Message/QuickStarts/QuickStartTile.d.ts +27 -0
  22. package/dist/cjs/Message/QuickStarts/QuickStartTile.js +82 -0
  23. package/dist/cjs/Message/QuickStarts/QuickStartTileDescription.d.ts +23 -0
  24. package/dist/cjs/Message/QuickStarts/QuickStartTileDescription.js +64 -0
  25. package/dist/cjs/Message/QuickStarts/QuickStartTileDescription.test.d.ts +1 -0
  26. package/dist/cjs/Message/QuickStarts/QuickStartTileDescription.test.js +76 -0
  27. package/dist/cjs/Message/QuickStarts/QuickStartTileHeader.d.ts +11 -0
  28. package/dist/cjs/Message/QuickStarts/QuickStartTileHeader.js +30 -0
  29. package/dist/cjs/Message/QuickStarts/monitor-sampleapp-quickstart-with-image.d.ts +30 -0
  30. package/dist/cjs/Message/QuickStarts/monitor-sampleapp-quickstart-with-image.js +77 -0
  31. package/dist/cjs/Message/QuickStarts/monitor-sampleapp-quickstart.d.ts +30 -0
  32. package/dist/cjs/Message/QuickStarts/monitor-sampleapp-quickstart.js +77 -0
  33. package/dist/cjs/Message/QuickStarts/types.d.ts +132 -0
  34. package/dist/cjs/Message/QuickStarts/types.js +17 -0
  35. package/dist/cjs/MessageBar/SendButton.js +1 -1
  36. package/dist/cjs/ResponseActions/ResponseActionButton.d.ts +6 -0
  37. package/dist/cjs/ResponseActions/ResponseActionButton.js +10 -2
  38. package/dist/cjs/ResponseActions/ResponseActionButton.test.d.ts +1 -0
  39. package/dist/cjs/ResponseActions/ResponseActionButton.test.js +54 -0
  40. package/dist/cjs/ResponseActions/ResponseActions.d.ts +4 -0
  41. package/dist/cjs/ResponseActions/ResponseActions.js +26 -9
  42. package/dist/cjs/ResponseActions/ResponseActions.test.js +79 -5
  43. package/dist/cjs/Settings/SettingsForm.d.ts +13 -0
  44. package/dist/cjs/Settings/SettingsForm.js +27 -0
  45. package/dist/cjs/Settings/index.d.ts +2 -0
  46. package/dist/cjs/Settings/index.js +23 -0
  47. package/dist/cjs/TermsOfUse/TermsOfUse.d.ts +34 -0
  48. package/dist/cjs/TermsOfUse/TermsOfUse.js +49 -0
  49. package/dist/cjs/TermsOfUse/TermsOfUse.test.d.ts +1 -0
  50. package/dist/cjs/TermsOfUse/TermsOfUse.test.js +79 -0
  51. package/dist/cjs/TermsOfUse/index.d.ts +2 -0
  52. package/dist/cjs/TermsOfUse/index.js +23 -0
  53. package/dist/cjs/index.d.ts +4 -0
  54. package/dist/cjs/index.js +7 -1
  55. package/dist/css/main.css +191 -30
  56. package/dist/css/main.css.map +1 -1
  57. package/dist/dynamic/Settings/package.json +1 -0
  58. package/dist/dynamic/TermsOfUse/package.json +1 -0
  59. package/dist/esm/Chatbot/Chatbot.js +0 -9
  60. package/dist/esm/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.d.ts +5 -1
  61. package/dist/esm/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.js +4 -4
  62. package/dist/esm/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.test.js +3 -3
  63. package/dist/esm/ChatbotHeader/ChatbotHeaderCloseButton.d.ts +17 -0
  64. package/dist/esm/ChatbotHeader/ChatbotHeaderCloseButton.js +8 -0
  65. package/dist/esm/ChatbotHeader/ChatbotHeaderMenu.d.ts +2 -0
  66. package/dist/esm/ChatbotHeader/ChatbotHeaderMenu.js +2 -2
  67. package/dist/esm/ChatbotHeader/index.d.ts +1 -0
  68. package/dist/esm/ChatbotHeader/index.js +1 -0
  69. package/dist/esm/CodeModal/CodeModal.js +2 -12
  70. package/dist/esm/Message/ListMessage/OrderedListMessage.d.ts +1 -1
  71. package/dist/esm/Message/ListMessage/OrderedListMessage.js +2 -2
  72. package/dist/esm/Message/Message.d.ts +16 -6
  73. package/dist/esm/Message/Message.js +7 -7
  74. package/dist/esm/Message/Message.test.js +51 -0
  75. package/dist/esm/Message/QuickResponse/QuickResponse.d.ts +15 -0
  76. package/dist/esm/Message/QuickResponse/QuickResponse.js +26 -0
  77. package/dist/esm/Message/QuickStarts/FallbackImg.d.ts +13 -0
  78. package/dist/esm/Message/QuickStarts/FallbackImg.js +9 -0
  79. package/dist/esm/Message/QuickStarts/QuickStartTile.d.ts +27 -0
  80. package/dist/esm/Message/QuickStarts/QuickStartTile.js +52 -0
  81. package/dist/esm/Message/QuickStarts/QuickStartTileDescription.d.ts +23 -0
  82. package/dist/esm/Message/QuickStarts/QuickStartTileDescription.js +35 -0
  83. package/dist/esm/Message/QuickStarts/QuickStartTileDescription.test.d.ts +1 -0
  84. package/dist/esm/Message/QuickStarts/QuickStartTileDescription.test.js +48 -0
  85. package/dist/esm/Message/QuickStarts/QuickStartTileHeader.d.ts +11 -0
  86. package/dist/esm/Message/QuickStarts/QuickStartTileHeader.js +5 -0
  87. package/dist/esm/Message/QuickStarts/monitor-sampleapp-quickstart-with-image.d.ts +30 -0
  88. package/dist/esm/Message/QuickStarts/monitor-sampleapp-quickstart-with-image.js +74 -0
  89. package/dist/esm/Message/QuickStarts/monitor-sampleapp-quickstart.d.ts +30 -0
  90. package/dist/esm/Message/QuickStarts/monitor-sampleapp-quickstart.js +74 -0
  91. package/dist/esm/Message/QuickStarts/types.d.ts +132 -0
  92. package/dist/esm/Message/QuickStarts/types.js +14 -0
  93. package/dist/esm/MessageBar/SendButton.js +1 -1
  94. package/dist/esm/ResponseActions/ResponseActionButton.d.ts +6 -0
  95. package/dist/esm/ResponseActions/ResponseActionButton.js +10 -2
  96. package/dist/esm/ResponseActions/ResponseActionButton.test.d.ts +1 -0
  97. package/dist/esm/ResponseActions/ResponseActionButton.test.js +49 -0
  98. package/dist/esm/ResponseActions/ResponseActions.d.ts +4 -0
  99. package/dist/esm/ResponseActions/ResponseActions.js +26 -9
  100. package/dist/esm/ResponseActions/ResponseActions.test.js +79 -5
  101. package/dist/esm/Settings/SettingsForm.d.ts +13 -0
  102. package/dist/esm/Settings/SettingsForm.js +20 -0
  103. package/dist/esm/Settings/index.d.ts +2 -0
  104. package/dist/esm/Settings/index.js +2 -0
  105. package/dist/esm/TermsOfUse/TermsOfUse.d.ts +34 -0
  106. package/dist/esm/TermsOfUse/TermsOfUse.js +42 -0
  107. package/dist/esm/TermsOfUse/TermsOfUse.test.d.ts +1 -0
  108. package/dist/esm/TermsOfUse/TermsOfUse.test.js +74 -0
  109. package/dist/esm/TermsOfUse/index.d.ts +2 -0
  110. package/dist/esm/TermsOfUse/index.js +2 -0
  111. package/dist/esm/index.d.ts +4 -0
  112. package/dist/esm/index.js +4 -0
  113. package/dist/tsconfig.tsbuildinfo +1 -1
  114. package/package.json +7 -13
  115. package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithCustomResponseActions.tsx +4 -0
  116. package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithQuickStart.tsx +31 -0
  117. package/patternfly-docs/content/extensions/chatbot/examples/Messages/Messages.md +26 -4
  118. package/patternfly-docs/content/extensions/chatbot/examples/Messages/explore-pipeline-quickstart.ts +65 -0
  119. package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotFooter.tsx +1 -1
  120. package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotFootnote.tsx +2 -2
  121. package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotHeaderDrawer.tsx +2 -2
  122. package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotHeaderDrawerNavigation.tsx +67 -0
  123. package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotHeaderDrawerWithSelection.tsx +78 -0
  124. package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotMessageBarDisabled.tsx +26 -0
  125. package/patternfly-docs/content/extensions/chatbot/examples/UI/PF-TermsAndConditionsHeader.svg +148 -0
  126. package/patternfly-docs/content/extensions/chatbot/examples/UI/Settings.tsx +289 -0
  127. package/patternfly-docs/content/extensions/chatbot/examples/UI/SquareChatbotToggle.tsx +1 -1
  128. package/patternfly-docs/content/extensions/chatbot/examples/UI/TermsOfUse.tsx +147 -0
  129. package/patternfly-docs/content/extensions/chatbot/examples/UI/UI.md +56 -0
  130. package/patternfly-docs/content/extensions/chatbot/examples/demos/Chatbot.md +2 -2
  131. package/patternfly-docs/content/extensions/chatbot/examples/demos/Chatbot.tsx +2 -2
  132. package/patternfly-docs/content/extensions/chatbot/examples/demos/ChatbotAttachment.tsx +20 -19
  133. package/patternfly-docs/content/extensions/chatbot/examples/demos/ChatbotAttachmentMenu.tsx +1 -1
  134. package/patternfly-docs/content/extensions/chatbot/examples/demos/EmbeddedChatbot.tsx +2 -2
  135. package/src/Chatbot/Chatbot.scss +0 -10
  136. package/src/Chatbot/Chatbot.tsx +0 -9
  137. package/src/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.scss +14 -0
  138. package/src/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.test.tsx +3 -3
  139. package/src/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.tsx +11 -3
  140. package/src/ChatbotFooter/ChatbotFooter.scss +2 -1
  141. package/src/ChatbotHeader/ChatbotHeaderCloseButton.tsx +51 -0
  142. package/src/ChatbotHeader/ChatbotHeaderMenu.tsx +5 -2
  143. package/src/ChatbotHeader/index.ts +1 -0
  144. package/src/CodeModal/CodeModal.scss +8 -0
  145. package/src/CodeModal/CodeModal.tsx +2 -13
  146. package/src/FileDropZone/__snapshots__/FileDropZone.test.tsx.snap +1 -1
  147. package/src/Message/ListMessage/OrderedListMessage.tsx +2 -2
  148. package/src/Message/Message.scss +0 -14
  149. package/src/Message/Message.test.tsx +76 -0
  150. package/src/Message/Message.tsx +35 -26
  151. package/src/Message/QuickResponse/QuickResponse.scss +33 -0
  152. package/src/Message/QuickResponse/QuickResponse.tsx +50 -0
  153. package/src/Message/QuickStarts/FallbackImg.tsx +24 -0
  154. package/src/Message/QuickStarts/QuickStartTile.scss +25 -0
  155. package/src/Message/QuickStarts/QuickStartTile.tsx +147 -0
  156. package/src/Message/QuickStarts/QuickStartTileDescription.test.tsx +57 -0
  157. package/src/Message/QuickStarts/QuickStartTileDescription.tsx +81 -0
  158. package/src/Message/QuickStarts/QuickStartTileHeader.tsx +21 -0
  159. package/src/Message/QuickStarts/monitor-sampleapp-quickstart-with-image.ts +75 -0
  160. package/src/Message/QuickStarts/monitor-sampleapp-quickstart.ts +75 -0
  161. package/src/Message/QuickStarts/types.ts +154 -0
  162. package/src/MessageBar/SendButton.scss +24 -0
  163. package/src/MessageBar/SendButton.tsx +1 -1
  164. package/src/ResponseActions/ResponseActionButton.test.tsx +52 -0
  165. package/src/ResponseActions/ResponseActionButton.tsx +46 -27
  166. package/src/ResponseActions/ResponseActions.scss +10 -8
  167. package/src/ResponseActions/ResponseActions.test.tsx +103 -5
  168. package/src/ResponseActions/ResponseActions.tsx +54 -7
  169. package/src/Settings/Settings.scss +34 -0
  170. package/src/Settings/SettingsForm.tsx +25 -0
  171. package/src/Settings/index.ts +3 -0
  172. package/src/TermsOfUse/TermsOfUse.scss +66 -0
  173. package/src/TermsOfUse/TermsOfUse.test.tsx +138 -0
  174. package/src/TermsOfUse/TermsOfUse.tsx +117 -0
  175. package/src/TermsOfUse/index.ts +3 -0
  176. package/src/index.ts +6 -0
  177. package/src/main.scss +7 -3
@@ -0,0 +1,54 @@
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
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ const react_1 = __importDefault(require("react"));
16
+ const react_2 = require("@testing-library/react");
17
+ require("@testing-library/jest-dom");
18
+ const user_event_1 = __importDefault(require("@testing-library/user-event"));
19
+ const react_icons_1 = require("@patternfly/react-icons");
20
+ const ResponseActionButton_1 = __importDefault(require("./ResponseActionButton"));
21
+ describe('ResponseActionButton', () => {
22
+ it('renders aria-label correctly if not clicked', () => {
23
+ (0, react_2.render)(react_1.default.createElement(ResponseActionButton_1.default, { icon: react_1.default.createElement(react_icons_1.DownloadIcon, null), ariaLabel: "Download", clickedAriaLabel: "Downloaded" }));
24
+ expect(react_2.screen.getByRole('button', { name: 'Download' })).toBeTruthy();
25
+ });
26
+ it('renders aria-label correctly if clicked', () => {
27
+ (0, react_2.render)(react_1.default.createElement(ResponseActionButton_1.default, { icon: react_1.default.createElement(react_icons_1.DownloadIcon, null), ariaLabel: "Download", clickedAriaLabel: "Downloaded", isClicked: true }));
28
+ expect(react_2.screen.getByRole('button', { name: 'Downloaded' })).toBeTruthy();
29
+ });
30
+ it('renders tooltip correctly if not clicked', () => __awaiter(void 0, void 0, void 0, function* () {
31
+ (0, react_2.render)(react_1.default.createElement(ResponseActionButton_1.default, { icon: react_1.default.createElement(react_icons_1.DownloadIcon, null), tooltipContent: "Download", clickedTooltipContent: "Downloaded" }));
32
+ expect(react_2.screen.getByRole('button', { name: 'Download' })).toBeTruthy();
33
+ // clicking here just triggers the tooltip; in this button, the logic is divorced from whether it is actually clicked
34
+ yield user_event_1.default.click(react_2.screen.getByRole('button', { name: 'Download' }));
35
+ expect(react_2.screen.getByRole('tooltip', { name: 'Download' })).toBeTruthy();
36
+ }));
37
+ it('renders tooltip correctly if clicked', () => __awaiter(void 0, void 0, void 0, function* () {
38
+ (0, react_2.render)(react_1.default.createElement(ResponseActionButton_1.default, { icon: react_1.default.createElement(react_icons_1.DownloadIcon, null), tooltipContent: "Download", clickedTooltipContent: "Downloaded", isClicked: true }));
39
+ expect(react_2.screen.getByRole('button', { name: 'Downloaded' })).toBeTruthy();
40
+ // clicking here just triggers the tooltip; in this button, the logic is divorced from whether it is actually clicked
41
+ yield user_event_1.default.click(react_2.screen.getByRole('button', { name: 'Downloaded' }));
42
+ expect(react_2.screen.getByRole('tooltip', { name: 'Downloaded' })).toBeTruthy();
43
+ }));
44
+ it('if clicked variant for tooltip is not supplied, it uses the default', () => __awaiter(void 0, void 0, void 0, function* () {
45
+ (0, react_2.render)(react_1.default.createElement(ResponseActionButton_1.default, { icon: react_1.default.createElement(react_icons_1.DownloadIcon, null), tooltipContent: "Download", isClicked: true }));
46
+ // clicking here just triggers the tooltip; in this button, the logic is divorced from whether it is actually clicked
47
+ yield user_event_1.default.click(react_2.screen.getByRole('button', { name: 'Download' }));
48
+ expect(react_2.screen.getByRole('button', { name: 'Download' })).toBeTruthy();
49
+ }));
50
+ it('if clicked variant for aria label is not supplied, it uses the default', () => __awaiter(void 0, void 0, void 0, function* () {
51
+ (0, react_2.render)(react_1.default.createElement(ResponseActionButton_1.default, { icon: react_1.default.createElement(react_icons_1.DownloadIcon, null), ariaLabel: "Download", isClicked: true }));
52
+ expect(react_2.screen.getByRole('button', { name: 'Download' })).toBeTruthy();
53
+ }));
54
+ });
@@ -3,6 +3,8 @@ import { TooltipProps } from '@patternfly/react-core';
3
3
  export interface ActionProps {
4
4
  /** Aria-label for the button */
5
5
  ariaLabel?: string;
6
+ /** Aria-label for the button, shown when the button is clicked. */
7
+ clickedAriaLabel?: string;
6
8
  /** On-click handler for the button */
7
9
  onClick?: ((event: MouseEvent | React.MouseEvent<Element, MouseEvent> | KeyboardEvent) => void) | undefined;
8
10
  /** Class name for the button */
@@ -11,6 +13,8 @@ export interface ActionProps {
11
13
  isDisabled?: boolean;
12
14
  /** Content shown in the tooltip */
13
15
  tooltipContent?: string;
16
+ /** Content shown in the tooltip when the button is clicked. */
17
+ clickedTooltipContent?: string;
14
18
  /** Props to control the PF Tooltip component */
15
19
  tooltipProps?: TooltipProps;
16
20
  /** Icon for custom response action */
@@ -19,17 +19,34 @@ const react_1 = __importDefault(require("react"));
19
19
  const react_icons_1 = require("@patternfly/react-icons");
20
20
  const ResponseActionButton_1 = __importDefault(require("./ResponseActionButton"));
21
21
  const ResponseActions = ({ actions }) => {
22
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
22
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v;
23
+ const [activeButton, setActiveButton] = react_1.default.useState();
23
24
  const { positive, negative, copy, share, listen } = actions, additionalActions = __rest(actions, ["positive", "negative", "copy", "share", "listen"]);
24
- return (react_1.default.createElement("div", { className: "pf-chatbot__response-actions" },
25
- positive && (react_1.default.createElement(ResponseActionButton_1.default, { ariaLabel: (_a = positive.ariaLabel) !== null && _a !== void 0 ? _a : 'Good response', onClick: positive.onClick, className: positive.className, isDisabled: positive.isDisabled, tooltipContent: (_b = positive.tooltipContent) !== null && _b !== void 0 ? _b : 'Good response', tooltipProps: positive.tooltipProps, icon: react_1.default.createElement(react_icons_1.OutlinedThumbsUpIcon, null) })),
26
- negative && (react_1.default.createElement(ResponseActionButton_1.default, { ariaLabel: (_c = negative.ariaLabel) !== null && _c !== void 0 ? _c : 'Bad response', onClick: negative.onClick, className: negative.className, isDisabled: negative.isDisabled, tooltipContent: (_d = negative.tooltipContent) !== null && _d !== void 0 ? _d : 'Bad response', tooltipProps: negative.tooltipProps, icon: react_1.default.createElement(react_icons_1.OutlinedThumbsDownIcon, null) })),
27
- copy && (react_1.default.createElement(ResponseActionButton_1.default, { ariaLabel: (_e = copy.ariaLabel) !== null && _e !== void 0 ? _e : 'Copy', onClick: copy.onClick, className: copy.className, isDisabled: copy.isDisabled, tooltipContent: (_f = copy.tooltipContent) !== null && _f !== void 0 ? _f : 'Copy', tooltipProps: copy.tooltipProps, icon: react_1.default.createElement(react_icons_1.OutlinedCopyIcon, null) })),
28
- share && (react_1.default.createElement(ResponseActionButton_1.default, { ariaLabel: (_g = share.ariaLabel) !== null && _g !== void 0 ? _g : 'Share', onClick: share.onClick, className: share.className, isDisabled: share.isDisabled, tooltipContent: (_h = share.tooltipContent) !== null && _h !== void 0 ? _h : 'Share', tooltipProps: share.tooltipProps, icon: react_1.default.createElement(react_icons_1.ExternalLinkAltIcon, null) })),
29
- listen && (react_1.default.createElement(ResponseActionButton_1.default, { ariaLabel: (_j = listen.ariaLabel) !== null && _j !== void 0 ? _j : 'Listen', onClick: listen.onClick, className: listen.className, isDisabled: listen.isDisabled, tooltipContent: (_k = listen.tooltipContent) !== null && _k !== void 0 ? _k : 'Listen', tooltipProps: listen.tooltipProps, icon: react_1.default.createElement(react_icons_1.VolumeUpIcon, null) })),
25
+ const responseActions = react_1.default.useRef(null);
26
+ react_1.default.useEffect(() => {
27
+ const handleClickOutside = (e) => {
28
+ if (responseActions.current && !responseActions.current.contains(e.target)) {
29
+ setActiveButton(undefined);
30
+ }
31
+ };
32
+ window.addEventListener('click', handleClickOutside);
33
+ return () => {
34
+ window.removeEventListener('click', handleClickOutside);
35
+ };
36
+ }, []);
37
+ const handleClick = (e, id, onClick) => {
38
+ setActiveButton(id);
39
+ onClick && onClick(e);
40
+ };
41
+ return (react_1.default.createElement("div", { ref: responseActions, className: "pf-chatbot__response-actions" },
42
+ positive && (react_1.default.createElement(ResponseActionButton_1.default, { ariaLabel: (_a = positive.ariaLabel) !== null && _a !== void 0 ? _a : 'Good response', clickedAriaLabel: (_b = positive.ariaLabel) !== null && _b !== void 0 ? _b : 'Response recorded', onClick: (e) => handleClick(e, 'positive', positive.onClick), className: positive.className, isDisabled: positive.isDisabled, tooltipContent: (_c = positive.tooltipContent) !== null && _c !== void 0 ? _c : 'Good response', clickedTooltipContent: (_d = positive.clickedTooltipContent) !== null && _d !== void 0 ? _d : 'Response recorded', tooltipProps: positive.tooltipProps, icon: react_1.default.createElement(react_icons_1.OutlinedThumbsUpIcon, null), isClicked: activeButton === 'positive' })),
43
+ negative && (react_1.default.createElement(ResponseActionButton_1.default, { ariaLabel: (_e = negative.ariaLabel) !== null && _e !== void 0 ? _e : 'Bad response', clickedAriaLabel: (_f = negative.ariaLabel) !== null && _f !== void 0 ? _f : 'Response recorded', onClick: (e) => handleClick(e, 'negative', negative.onClick), className: negative.className, isDisabled: negative.isDisabled, tooltipContent: (_g = negative.tooltipContent) !== null && _g !== void 0 ? _g : 'Bad response', clickedTooltipContent: (_h = negative.clickedTooltipContent) !== null && _h !== void 0 ? _h : 'Response recorded', tooltipProps: negative.tooltipProps, icon: react_1.default.createElement(react_icons_1.OutlinedThumbsDownIcon, null), isClicked: activeButton === 'negative' })),
44
+ copy && (react_1.default.createElement(ResponseActionButton_1.default, { ariaLabel: (_j = copy.ariaLabel) !== null && _j !== void 0 ? _j : 'Copy', clickedAriaLabel: (_k = copy.ariaLabel) !== null && _k !== void 0 ? _k : 'Copied', onClick: (e) => handleClick(e, 'copy', copy.onClick), className: copy.className, isDisabled: copy.isDisabled, tooltipContent: (_l = copy.tooltipContent) !== null && _l !== void 0 ? _l : 'Copy', clickedTooltipContent: (_m = copy.clickedTooltipContent) !== null && _m !== void 0 ? _m : 'Copied', tooltipProps: copy.tooltipProps, icon: react_1.default.createElement(react_icons_1.OutlinedCopyIcon, null), isClicked: activeButton === 'copy' })),
45
+ share && (react_1.default.createElement(ResponseActionButton_1.default, { ariaLabel: (_o = share.ariaLabel) !== null && _o !== void 0 ? _o : 'Share', clickedAriaLabel: (_p = share.ariaLabel) !== null && _p !== void 0 ? _p : 'Shared', onClick: (e) => handleClick(e, 'share', share.onClick), className: share.className, isDisabled: share.isDisabled, tooltipContent: (_q = share.tooltipContent) !== null && _q !== void 0 ? _q : 'Share', clickedTooltipContent: (_r = share.clickedTooltipContent) !== null && _r !== void 0 ? _r : 'Shared', tooltipProps: share.tooltipProps, icon: react_1.default.createElement(react_icons_1.ExternalLinkAltIcon, null), isClicked: activeButton === 'share' })),
46
+ listen && (react_1.default.createElement(ResponseActionButton_1.default, { ariaLabel: (_s = listen.ariaLabel) !== null && _s !== void 0 ? _s : 'Listen', clickedAriaLabel: (_t = listen.ariaLabel) !== null && _t !== void 0 ? _t : 'Listening', onClick: (e) => handleClick(e, 'listen', listen.onClick), className: listen.className, isDisabled: listen.isDisabled, tooltipContent: (_u = listen.tooltipContent) !== null && _u !== void 0 ? _u : 'Listen', clickedTooltipContent: (_v = listen.clickedTooltipContent) !== null && _v !== void 0 ? _v : 'Listening', tooltipProps: listen.tooltipProps, icon: react_1.default.createElement(react_icons_1.VolumeUpIcon, null), isClicked: activeButton === 'listen' })),
30
47
  Object.keys(additionalActions).map((action) => {
31
- var _a, _b, _c, _d, _e, _f, _g;
32
- return (react_1.default.createElement(ResponseActionButton_1.default, { key: action, ariaLabel: (_a = additionalActions[action]) === null || _a === void 0 ? void 0 : _a.ariaLabel, onClick: (_b = additionalActions[action]) === null || _b === void 0 ? void 0 : _b.onClick, className: (_c = additionalActions[action]) === null || _c === void 0 ? void 0 : _c.className, isDisabled: (_d = additionalActions[action]) === null || _d === void 0 ? void 0 : _d.isDisabled, tooltipContent: (_e = additionalActions[action]) === null || _e === void 0 ? void 0 : _e.tooltipContent, tooltipProps: (_f = additionalActions[action]) === null || _f === void 0 ? void 0 : _f.tooltipProps, icon: (_g = additionalActions[action]) === null || _g === void 0 ? void 0 : _g.icon }));
48
+ var _a, _b, _c, _d, _e, _f, _g, _h;
49
+ return (react_1.default.createElement(ResponseActionButton_1.default, { key: action, ariaLabel: (_a = additionalActions[action]) === null || _a === void 0 ? void 0 : _a.ariaLabel, clickedAriaLabel: (_b = additionalActions[action]) === null || _b === void 0 ? void 0 : _b.clickedAriaLabel, onClick: (e) => { var _a; return handleClick(e, action, (_a = additionalActions[action]) === null || _a === void 0 ? void 0 : _a.onClick); }, className: (_c = additionalActions[action]) === null || _c === void 0 ? void 0 : _c.className, isDisabled: (_d = additionalActions[action]) === null || _d === void 0 ? void 0 : _d.isDisabled, tooltipContent: (_e = additionalActions[action]) === null || _e === void 0 ? void 0 : _e.tooltipContent, tooltipProps: (_f = additionalActions[action]) === null || _f === void 0 ? void 0 : _f.tooltipProps, clickedTooltipContent: (_g = additionalActions[action]) === null || _g === void 0 ? void 0 : _g.clickedTooltipContent, icon: (_h = additionalActions[action]) === null || _h === void 0 ? void 0 : _h.icon, isClicked: activeButton === action }));
33
50
  })));
34
51
  };
35
52
  exports.ResponseActions = ResponseActions;
@@ -18,25 +18,30 @@ require("@testing-library/jest-dom");
18
18
  const ResponseActions_1 = __importDefault(require("./ResponseActions"));
19
19
  const user_event_1 = __importDefault(require("@testing-library/user-event"));
20
20
  const react_icons_1 = require("@patternfly/react-icons");
21
+ const Message_1 = __importDefault(require("../Message"));
21
22
  const ALL_ACTIONS = [
22
- { type: 'positive', label: 'Good response' },
23
- { type: 'negative', label: 'Bad response' },
24
- { type: 'copy', label: 'Copy' },
25
- { type: 'share', label: 'Share' },
26
- { type: 'listen', label: 'Listen' }
23
+ { type: 'positive', label: 'Good response', clickedLabel: 'Response recorded' },
24
+ { type: 'negative', label: 'Bad response', clickedLabel: 'Response recorded' },
25
+ { type: 'copy', label: 'Copy', clickedLabel: 'Copied' },
26
+ { type: 'share', label: 'Share', clickedLabel: 'Shared' },
27
+ { type: 'listen', label: 'Listen', clickedLabel: 'Listening' }
27
28
  ];
28
29
  const CUSTOM_ACTIONS = [
29
30
  {
30
31
  regenerate: {
31
32
  ariaLabel: 'Regenerate',
33
+ clickedAriaLabel: 'Regenerated',
32
34
  onClick: jest.fn(),
33
35
  tooltipContent: 'Regenerate',
36
+ clickedTooltipContent: 'Regenerated',
34
37
  icon: react_1.default.createElement(react_icons_1.RedoIcon, null)
35
38
  },
36
39
  download: {
37
40
  ariaLabel: 'Download',
41
+ clickedAriaLabel: 'Downloaded',
38
42
  onClick: jest.fn(),
39
43
  tooltipContent: 'Download',
44
+ clickedTooltipContent: 'Downloaded',
40
45
  icon: react_1.default.createElement(react_icons_1.DownloadIcon, null)
41
46
  },
42
47
  info: {
@@ -48,6 +53,59 @@ const CUSTOM_ACTIONS = [
48
53
  }
49
54
  ];
50
55
  describe('ResponseActions', () => {
56
+ afterEach(() => {
57
+ jest.clearAllMocks();
58
+ });
59
+ it('should handle click within group of buttons correctly', () => __awaiter(void 0, void 0, void 0, function* () {
60
+ (0, react_2.render)(react_1.default.createElement(ResponseActions_1.default, { actions: {
61
+ positive: { onClick: jest.fn() },
62
+ negative: { onClick: jest.fn() },
63
+ copy: { onClick: jest.fn() },
64
+ share: { onClick: jest.fn() },
65
+ listen: { onClick: jest.fn() }
66
+ } }));
67
+ const goodBtn = react_2.screen.getByRole('button', { name: 'Good response' });
68
+ const badBtn = react_2.screen.getByRole('button', { name: 'Bad response' });
69
+ const copyBtn = react_2.screen.getByRole('button', { name: 'Copy' });
70
+ const shareBtn = react_2.screen.getByRole('button', { name: 'Share' });
71
+ const listenBtn = react_2.screen.getByRole('button', { name: 'Listen' });
72
+ const buttons = [goodBtn, badBtn, copyBtn, shareBtn, listenBtn];
73
+ buttons.forEach((button) => {
74
+ expect(button).toBeTruthy();
75
+ });
76
+ yield user_event_1.default.click(goodBtn);
77
+ expect(react_2.screen.getByRole('button', { name: 'Response recorded' })).toHaveClass('pf-chatbot__button--response-action-clicked');
78
+ let unclickedButtons = buttons.filter((button) => button !== goodBtn);
79
+ unclickedButtons.forEach((button) => {
80
+ expect(button).not.toHaveClass('pf-chatbot__button--response-action-clicked');
81
+ });
82
+ yield user_event_1.default.click(badBtn);
83
+ expect(react_2.screen.getByRole('button', { name: 'Response recorded' })).toHaveClass('pf-chatbot__button--response-action-clicked');
84
+ unclickedButtons = buttons.filter((button) => button !== badBtn);
85
+ unclickedButtons.forEach((button) => {
86
+ expect(button).not.toHaveClass('pf-chatbot__button--response-action-clicked');
87
+ });
88
+ }));
89
+ it('should handle click outside of group of buttons correctly', () => __awaiter(void 0, void 0, void 0, function* () {
90
+ // using message just so we have something outside the group that's rendered
91
+ (0, react_2.render)(react_1.default.createElement(Message_1.default, { name: "Bot", role: "bot", avatar: "", content: "Example with all prebuilt actions", actions: {
92
+ positive: {},
93
+ negative: {}
94
+ } }));
95
+ const goodBtn = react_2.screen.getByRole('button', { name: 'Good response' });
96
+ const badBtn = react_2.screen.getByRole('button', { name: 'Bad response' });
97
+ expect(goodBtn).toBeTruthy();
98
+ expect(badBtn).toBeTruthy();
99
+ yield user_event_1.default.click(goodBtn);
100
+ expect(react_2.screen.getByRole('button', { name: 'Response recorded' })).toHaveClass('pf-chatbot__button--response-action-clicked');
101
+ expect(badBtn).not.toHaveClass('pf-chatbot__button--response-action-clicked');
102
+ yield user_event_1.default.click(badBtn);
103
+ expect(react_2.screen.getByRole('button', { name: 'Response recorded' })).toHaveClass('pf-chatbot__button--response-action-clicked');
104
+ expect(goodBtn).not.toHaveClass('pf-chatbot__button--response-action-clicked');
105
+ yield user_event_1.default.click(react_2.screen.getByText('Example with all prebuilt actions'));
106
+ expect(goodBtn).not.toHaveClass('pf-chatbot__button--response-action-clicked');
107
+ expect(badBtn).not.toHaveClass('pf-chatbot__button--response-action-clicked');
108
+ }));
51
109
  it('should render buttons correctly', () => {
52
110
  ALL_ACTIONS.forEach(({ type, label }) => {
53
111
  (0, react_2.render)(react_1.default.createElement(ResponseActions_1.default, { actions: { [type]: { onClick: jest.fn() } } }));
@@ -62,6 +120,22 @@ describe('ResponseActions', () => {
62
120
  expect(spy).toHaveBeenCalledTimes(1);
63
121
  }));
64
122
  }));
123
+ it('should swap clicked and non-clicked aria labels on click', () => __awaiter(void 0, void 0, void 0, function* () {
124
+ ALL_ACTIONS.forEach((_a) => __awaiter(void 0, [_a], void 0, function* ({ type, label, clickedLabel }) {
125
+ (0, react_2.render)(react_1.default.createElement(ResponseActions_1.default, { actions: { [type]: { onClick: jest.fn() } } }));
126
+ expect(react_2.screen.getByRole('button', { name: label })).toBeTruthy();
127
+ yield user_event_1.default.click(react_2.screen.getByRole('button', { name: label }));
128
+ expect(react_2.screen.getByRole('button', { name: clickedLabel })).toBeTruthy();
129
+ }));
130
+ }));
131
+ it('should swap clicked and non-clicked tooltips on click', () => __awaiter(void 0, void 0, void 0, function* () {
132
+ ALL_ACTIONS.forEach((_a) => __awaiter(void 0, [_a], void 0, function* ({ type, label, clickedLabel }) {
133
+ (0, react_2.render)(react_1.default.createElement(ResponseActions_1.default, { actions: { [type]: { onClick: jest.fn() } } }));
134
+ expect(react_2.screen.getByRole('button', { name: label })).toBeTruthy();
135
+ yield user_event_1.default.click(react_2.screen.getByRole('button', { name: label }));
136
+ expect(react_2.screen.getByRole('tooltip', { name: clickedLabel })).toBeTruthy();
137
+ }));
138
+ }));
65
139
  it('should be able to change aria labels', () => {
66
140
  const actions = [
67
141
  { type: 'positive', ariaLabel: 'Thumbs up' },
@@ -0,0 +1,13 @@
1
+ import React from 'react';
2
+ export interface SettingsFormProps {
3
+ /** Class applied to form container */
4
+ className?: string;
5
+ /** Array of fields to display in the settings layout */
6
+ fields?: {
7
+ id: string;
8
+ label: string;
9
+ field: React.ReactElement;
10
+ }[];
11
+ }
12
+ export declare const SettingsForm: React.FunctionComponent<SettingsFormProps>;
13
+ export default SettingsForm;
@@ -0,0 +1,27 @@
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
+ };
13
+ var __importDefault = (this && this.__importDefault) || function (mod) {
14
+ return (mod && mod.__esModule) ? mod : { "default": mod };
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.SettingsForm = void 0;
18
+ const react_1 = __importDefault(require("react"));
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),
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
+ react_1.default.createElement("label", { className: "pf-chatbot__settings-label", htmlFor: field.id }, field.label),
24
+ field.field))))));
25
+ };
26
+ exports.SettingsForm = SettingsForm;
27
+ exports.default = exports.SettingsForm;
@@ -0,0 +1,2 @@
1
+ export { default } from './SettingsForm';
2
+ export * from './SettingsForm';
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ var __importDefault = (this && this.__importDefault) || function (mod) {
17
+ return (mod && mod.__esModule) ? mod : { "default": mod };
18
+ };
19
+ Object.defineProperty(exports, "__esModule", { value: true });
20
+ exports.default = void 0;
21
+ var SettingsForm_1 = require("./SettingsForm");
22
+ Object.defineProperty(exports, "default", { enumerable: true, get: function () { return __importDefault(SettingsForm_1).default; } });
23
+ __exportStar(require("./SettingsForm"), exports);
@@ -0,0 +1,34 @@
1
+ import React from 'react';
2
+ import { ModalProps } from '@patternfly/react-core';
3
+ import { ChatbotDisplayMode } from '../Chatbot';
4
+ export interface TermsOfUseProps extends ModalProps {
5
+ /** Class applied to modal */
6
+ className?: string;
7
+ /** Action assigned to primary modal button */
8
+ onPrimaryAction?: (event: React.MouseEvent | MouseEvent | KeyboardEvent) => void;
9
+ /** Action assigned to secondary modal button */
10
+ onSecondaryAction: (event: React.MouseEvent | MouseEvent | KeyboardEvent) => void;
11
+ /** Name of primary modal button */
12
+ primaryActionBtn?: string;
13
+ /** Name of secondary modal button */
14
+ secondaryActionBtn?: string;
15
+ /** Function that handles modal toggle */
16
+ handleModalToggle: (event: React.MouseEvent | MouseEvent | KeyboardEvent) => void;
17
+ /** Whether modal is open */
18
+ isModalOpen: boolean;
19
+ /** Title of modal */
20
+ title?: string;
21
+ /** Display mode for the Chatbot parent; this influences the styles applied */
22
+ displayMode?: ChatbotDisplayMode;
23
+ /** Optional image displayed in header */
24
+ image?: string;
25
+ /** Alt text for optional image displayed in header */
26
+ altText?: string;
27
+ /** Ref applied to modal */
28
+ innerRef?: React.Ref<HTMLDivElement>;
29
+ /** OuiaID applied to modal */
30
+ ouiaId?: string;
31
+ }
32
+ export declare const TermsOfUseBase: React.FunctionComponent<TermsOfUseProps>;
33
+ declare const TermsOfUse: React.ForwardRefExoticComponent<Omit<TermsOfUseProps, "ref"> & React.RefAttributes<HTMLDivElement>>;
34
+ export default TermsOfUse;
@@ -0,0 +1,49 @@
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
+ };
13
+ var __importDefault = (this && this.__importDefault) || function (mod) {
14
+ return (mod && mod.__esModule) ? mod : { "default": mod };
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.TermsOfUseBase = void 0;
18
+ // ============================================================================
19
+ // Terms of Use Modal - Chatbot Modal Extension
20
+ // ============================================================================
21
+ const react_1 = __importDefault(require("react"));
22
+ const react_core_1 = require("@patternfly/react-core");
23
+ const Chatbot_1 = require("../Chatbot");
24
+ const ChatbotModal_1 = __importDefault(require("../ChatbotModal/ChatbotModal"));
25
+ const TermsOfUseBase = (_a) => {
26
+ var { handleModalToggle, isModalOpen, onPrimaryAction, onSecondaryAction, primaryActionBtn = 'Accept', secondaryActionBtn = 'Decline', title = 'Terms of use', image, altText, displayMode = Chatbot_1.ChatbotDisplayMode.default, className, children, innerRef, ouiaId = 'TermsOfUse' } = _a, props = __rest(_a, ["handleModalToggle", "isModalOpen", "onPrimaryAction", "onSecondaryAction", "primaryActionBtn", "secondaryActionBtn", "title", "image", "altText", "displayMode", "className", "children", "innerRef", "ouiaId"]);
27
+ const handlePrimaryAction = (_event) => {
28
+ handleModalToggle(_event);
29
+ onPrimaryAction && onPrimaryAction(_event);
30
+ };
31
+ const handleSecondaryAction = (_event) => {
32
+ onSecondaryAction(_event);
33
+ };
34
+ const modal = (react_1.default.createElement(ChatbotModal_1.default, Object.assign({ isOpen: isModalOpen, ouiaId: ouiaId, "aria-labelledby": "terms-of-use-title", "aria-describedby": "terms-of-use-modal", className: `pf-chatbot__terms-of-use-modal pf-chatbot__terms-of-use-modal--${displayMode} ${className ? className : ''}`, displayMode: displayMode }, props),
35
+ react_1.default.createElement("section", { className: `pf-chatbot__terms-of-use--section`, "aria-label": title, tabIndex: -1, ref: innerRef },
36
+ react_1.default.createElement(react_core_1.ModalHeader, null,
37
+ react_1.default.createElement("div", { className: "pf-chatbot__terms-of-use--header" },
38
+ image && altText && react_1.default.createElement("img", { src: image, className: "pf-chatbot__terms-of-use--image", alt: altText }),
39
+ react_1.default.createElement("h1", { className: "pf-chatbot__terms-of-use--title" }, title))),
40
+ react_1.default.createElement(react_core_1.ModalBody, null,
41
+ react_1.default.createElement(react_core_1.Content, null, children)),
42
+ react_1.default.createElement(react_core_1.ModalFooter, { className: "pf-chatbot__terms-of-use--footer" },
43
+ react_1.default.createElement(react_core_1.Button, { isBlock: true, key: "terms-of-use-modal-primary", variant: "primary", onClick: handlePrimaryAction, form: "terms-of-use-form", size: "lg" }, primaryActionBtn),
44
+ react_1.default.createElement(react_core_1.Button, { isBlock: true, key: "terms-of-use-modal-secondary", variant: "secondary", onClick: handleSecondaryAction, size: "lg" }, secondaryActionBtn)))));
45
+ return modal;
46
+ };
47
+ exports.TermsOfUseBase = TermsOfUseBase;
48
+ const TermsOfUse = react_1.default.forwardRef((props, ref) => (react_1.default.createElement(exports.TermsOfUseBase, Object.assign({ innerRef: ref }, props))));
49
+ exports.default = TermsOfUse;
@@ -0,0 +1 @@
1
+ import '@testing-library/jest-dom';
@@ -0,0 +1,79 @@
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
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ const react_1 = __importDefault(require("react"));
16
+ const react_2 = require("@testing-library/react");
17
+ require("@testing-library/jest-dom");
18
+ const user_event_1 = __importDefault(require("@testing-library/user-event"));
19
+ const TermsOfUse_1 = __importDefault(require("./TermsOfUse"));
20
+ const react_core_1 = require("@patternfly/react-core");
21
+ const handleModalToggle = jest.fn();
22
+ const onPrimaryAction = jest.fn();
23
+ const onSecondaryAction = jest.fn();
24
+ const body = (react_1.default.createElement(react_core_1.Content, null,
25
+ react_1.default.createElement("h1", null, "Heading 1"),
26
+ react_1.default.createElement("p", null, "Legal text")));
27
+ describe('TermsOfUse', () => {
28
+ afterEach(() => {
29
+ jest.clearAllMocks();
30
+ });
31
+ it('should render modal correctly', () => {
32
+ (0, react_2.render)(react_1.default.createElement(TermsOfUse_1.default, { isModalOpen: true, onSecondaryAction: onSecondaryAction, handleModalToggle: handleModalToggle, ouiaId: "Terms" }, body));
33
+ expect(react_2.screen.getByRole('heading', { name: /Terms of use/i })).toBeTruthy();
34
+ expect(react_2.screen.getByRole('button', { name: /Accept/i })).toBeTruthy();
35
+ expect(react_2.screen.getByRole('button', { name: /Decline/i })).toBeTruthy();
36
+ expect(react_2.screen.getByRole('heading', { name: /Heading 1/i })).toBeTruthy();
37
+ expect(react_2.screen.getByText(/Legal text/i)).toBeTruthy();
38
+ expect(react_2.screen.getByRole('dialog')).toHaveClass('pf-chatbot__terms-of-use-modal');
39
+ expect(react_2.screen.getByRole('dialog')).toHaveClass('pf-chatbot__terms-of-use-modal--default');
40
+ });
41
+ it('should handle image and altText props', () => {
42
+ (0, react_2.render)(react_1.default.createElement(TermsOfUse_1.default, { isModalOpen: true, onSecondaryAction: onSecondaryAction, handleModalToggle: handleModalToggle, image: "./image.png", altText: "Test image" }, body));
43
+ expect(react_2.screen.getByRole('img')).toBeTruthy();
44
+ expect(react_2.screen.getByRole('img')).toHaveAttribute('alt', 'Test image');
45
+ });
46
+ it('should handle className prop', () => {
47
+ (0, react_2.render)(react_1.default.createElement(TermsOfUse_1.default, { isModalOpen: true, onSecondaryAction: onSecondaryAction, handleModalToggle: handleModalToggle, className: "test" }, body));
48
+ expect(react_2.screen.getByRole('dialog')).toHaveClass('pf-chatbot__terms-of-use-modal');
49
+ expect(react_2.screen.getByRole('dialog')).toHaveClass('pf-chatbot__terms-of-use-modal--default');
50
+ expect(react_2.screen.getByRole('dialog')).toHaveClass('test');
51
+ });
52
+ it('should handle title prop', () => {
53
+ (0, react_2.render)(react_1.default.createElement(TermsOfUse_1.default, { isModalOpen: true, onSecondaryAction: onSecondaryAction, handleModalToggle: handleModalToggle, title: "Updated title" }, body));
54
+ expect(react_2.screen.getByRole('heading', { name: /Updated title/i })).toBeTruthy();
55
+ expect(react_2.screen.queryByRole('heading', { name: /Terms of use/i })).toBeFalsy();
56
+ });
57
+ it('should handle primary button prop', () => {
58
+ (0, react_2.render)(react_1.default.createElement(TermsOfUse_1.default, { isModalOpen: true, onSecondaryAction: onSecondaryAction, handleModalToggle: handleModalToggle, primaryActionBtn: "First" }, body));
59
+ expect(react_2.screen.getByRole('button', { name: /First/i })).toBeTruthy();
60
+ expect(react_2.screen.queryByRole('button', { name: /Accept/i })).toBeFalsy();
61
+ });
62
+ it('should handle secondary button prop', () => {
63
+ (0, react_2.render)(react_1.default.createElement(TermsOfUse_1.default, { isModalOpen: true, onSecondaryAction: onSecondaryAction, handleModalToggle: handleModalToggle, secondaryActionBtn: "Second" }, body));
64
+ expect(react_2.screen.getByRole('button', { name: /Second/i })).toBeTruthy();
65
+ expect(react_2.screen.queryByRole('button', { name: /Deny/i })).toBeFalsy();
66
+ });
67
+ it('should handle primary button click', () => __awaiter(void 0, void 0, void 0, function* () {
68
+ (0, react_2.render)(react_1.default.createElement(TermsOfUse_1.default, { isModalOpen: true, onPrimaryAction: onPrimaryAction, onSecondaryAction: onSecondaryAction, handleModalToggle: handleModalToggle }, body));
69
+ yield user_event_1.default.click(react_2.screen.getByRole('button', { name: /Accept/i }));
70
+ expect(onPrimaryAction).toHaveBeenCalledTimes(1);
71
+ expect(handleModalToggle).toHaveBeenCalledTimes(1);
72
+ }));
73
+ it('should handle secondary button click', () => __awaiter(void 0, void 0, void 0, function* () {
74
+ (0, react_2.render)(react_1.default.createElement(TermsOfUse_1.default, { isModalOpen: true, onSecondaryAction: onSecondaryAction, handleModalToggle: handleModalToggle }, body));
75
+ yield user_event_1.default.click(react_2.screen.getByRole('button', { name: /Decline/i }));
76
+ expect(onSecondaryAction).toHaveBeenCalledTimes(1);
77
+ expect(handleModalToggle).not.toHaveBeenCalled();
78
+ }));
79
+ });
@@ -0,0 +1,2 @@
1
+ export { default } from './TermsOfUse';
2
+ export * from './TermsOfUse';
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ var __importDefault = (this && this.__importDefault) || function (mod) {
17
+ return (mod && mod.__esModule) ? mod : { "default": mod };
18
+ };
19
+ Object.defineProperty(exports, "__esModule", { value: true });
20
+ exports.default = void 0;
21
+ var TermsOfUse_1 = require("./TermsOfUse");
22
+ Object.defineProperty(exports, "default", { enumerable: true, get: function () { return __importDefault(TermsOfUse_1).default; } });
23
+ __exportStar(require("./TermsOfUse"), exports);
@@ -42,7 +42,11 @@ export { default as PreviewAttachment } from './PreviewAttachment';
42
42
  export * from './PreviewAttachment';
43
43
  export { default as ResponseActions } from './ResponseActions';
44
44
  export * from './ResponseActions';
45
+ export { default as Settings } from './Settings';
46
+ export * from './Settings';
45
47
  export { default as SourceDetailsMenuItem } from './SourceDetailsMenuItem';
46
48
  export * from './SourceDetailsMenuItem';
47
49
  export { default as SourcesCard } from './SourcesCard';
48
50
  export * from './SourcesCard';
51
+ export { default as TermsOfUse } from './TermsOfUse';
52
+ export * from './TermsOfUse';
package/dist/cjs/index.js CHANGED
@@ -18,7 +18,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
18
18
  return (mod && mod.__esModule) ? mod : { "default": mod };
19
19
  };
20
20
  Object.defineProperty(exports, "__esModule", { value: true });
21
- exports.SourcesCard = exports.SourceDetailsMenuItem = exports.ResponseActions = exports.PreviewAttachment = exports.MessageBox = exports.MessageBar = exports.Message = exports.LoadingMessage = exports.FileDropZone = exports.FileDetailsLabel = exports.FileDetails = exports.CodeModal = exports.ChatbotWelcomePrompt = exports.ChatbotToggle = exports.ChatbotPopover = exports.ChatbotModal = exports.ChatbotHeader = exports.ChatbotFooter = exports.ChatbotConversationHistoryNav = exports.ChatbotContent = exports.ChatbotAlert = exports.Chatbot = exports.AttachMenu = exports.AttachmentEdit = void 0;
21
+ exports.TermsOfUse = exports.SourcesCard = exports.SourceDetailsMenuItem = exports.Settings = exports.ResponseActions = exports.PreviewAttachment = exports.MessageBox = exports.MessageBar = exports.Message = exports.LoadingMessage = exports.FileDropZone = exports.FileDetailsLabel = exports.FileDetails = exports.CodeModal = exports.ChatbotWelcomePrompt = exports.ChatbotToggle = exports.ChatbotPopover = exports.ChatbotModal = exports.ChatbotHeader = exports.ChatbotFooter = exports.ChatbotConversationHistoryNav = exports.ChatbotContent = exports.ChatbotAlert = exports.Chatbot = exports.AttachMenu = exports.AttachmentEdit = void 0;
22
22
  var AttachmentEdit_1 = require("./AttachmentEdit");
23
23
  Object.defineProperty(exports, "AttachmentEdit", { enumerable: true, get: function () { return __importDefault(AttachmentEdit_1).default; } });
24
24
  __exportStar(require("./AttachmentEdit"), exports);
@@ -85,9 +85,15 @@ __exportStar(require("./PreviewAttachment"), exports);
85
85
  var ResponseActions_1 = require("./ResponseActions");
86
86
  Object.defineProperty(exports, "ResponseActions", { enumerable: true, get: function () { return __importDefault(ResponseActions_1).default; } });
87
87
  __exportStar(require("./ResponseActions"), exports);
88
+ var Settings_1 = require("./Settings");
89
+ Object.defineProperty(exports, "Settings", { enumerable: true, get: function () { return __importDefault(Settings_1).default; } });
90
+ __exportStar(require("./Settings"), exports);
88
91
  var SourceDetailsMenuItem_1 = require("./SourceDetailsMenuItem");
89
92
  Object.defineProperty(exports, "SourceDetailsMenuItem", { enumerable: true, get: function () { return __importDefault(SourceDetailsMenuItem_1).default; } });
90
93
  __exportStar(require("./SourceDetailsMenuItem"), exports);
91
94
  var SourcesCard_1 = require("./SourcesCard");
92
95
  Object.defineProperty(exports, "SourcesCard", { enumerable: true, get: function () { return __importDefault(SourcesCard_1).default; } });
93
96
  __exportStar(require("./SourcesCard"), exports);
97
+ var TermsOfUse_1 = require("./TermsOfUse");
98
+ Object.defineProperty(exports, "TermsOfUse", { enumerable: true, get: function () { return __importDefault(TermsOfUse_1).default; } });
99
+ __exportStar(require("./TermsOfUse"), exports);