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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (187) hide show
  1. package/dist/cjs/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.d.ts +19 -1
  2. package/dist/cjs/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.js +11 -11
  3. package/dist/cjs/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.test.js +39 -3
  4. package/dist/cjs/ChatbotHeader/ChatbotHeaderCloseButton.d.ts +17 -0
  5. package/dist/cjs/ChatbotHeader/ChatbotHeaderCloseButton.js +14 -0
  6. package/dist/cjs/ChatbotHeader/ChatbotHeaderMenu.d.ts +2 -0
  7. package/dist/cjs/ChatbotHeader/ChatbotHeaderMenu.js +2 -2
  8. package/dist/cjs/ChatbotHeader/index.d.ts +1 -0
  9. package/dist/cjs/ChatbotHeader/index.js +1 -0
  10. package/dist/cjs/CodeModal/CodeModal.js +2 -12
  11. package/dist/cjs/Compare/Compare.d.ts +17 -0
  12. package/dist/cjs/Compare/Compare.js +50 -0
  13. package/dist/cjs/Compare/Compare.test.d.ts +1 -0
  14. package/dist/cjs/Compare/Compare.test.js +20 -0
  15. package/dist/cjs/Compare/index.d.ts +2 -0
  16. package/dist/cjs/Compare/index.js +23 -0
  17. package/dist/cjs/Message/ListMessage/OrderedListMessage.d.ts +1 -1
  18. package/dist/cjs/Message/ListMessage/OrderedListMessage.js +2 -2
  19. package/dist/cjs/Message/Message.d.ts +16 -6
  20. package/dist/cjs/Message/Message.js +6 -6
  21. package/dist/cjs/Message/Message.test.js +51 -0
  22. package/dist/cjs/Message/QuickResponse/QuickResponse.d.ts +15 -0
  23. package/dist/cjs/Message/QuickResponse/QuickResponse.js +33 -0
  24. package/dist/cjs/Message/QuickStarts/FallbackImg.d.ts +13 -0
  25. package/dist/cjs/Message/QuickStarts/FallbackImg.js +34 -0
  26. package/dist/cjs/Message/QuickStarts/QuickStartTile.d.ts +27 -0
  27. package/dist/cjs/Message/QuickStarts/QuickStartTile.js +82 -0
  28. package/dist/cjs/Message/QuickStarts/QuickStartTileDescription.d.ts +23 -0
  29. package/dist/cjs/Message/QuickStarts/QuickStartTileDescription.js +64 -0
  30. package/dist/cjs/Message/QuickStarts/QuickStartTileDescription.test.d.ts +1 -0
  31. package/dist/cjs/Message/QuickStarts/QuickStartTileDescription.test.js +76 -0
  32. package/dist/cjs/Message/QuickStarts/QuickStartTileHeader.d.ts +11 -0
  33. package/dist/cjs/Message/QuickStarts/QuickStartTileHeader.js +30 -0
  34. package/dist/cjs/Message/QuickStarts/monitor-sampleapp-quickstart-with-image.d.ts +30 -0
  35. package/dist/cjs/Message/QuickStarts/monitor-sampleapp-quickstart-with-image.js +77 -0
  36. package/dist/cjs/Message/QuickStarts/monitor-sampleapp-quickstart.d.ts +30 -0
  37. package/dist/cjs/Message/QuickStarts/monitor-sampleapp-quickstart.js +77 -0
  38. package/dist/cjs/Message/QuickStarts/types.d.ts +132 -0
  39. package/dist/cjs/Message/QuickStarts/types.js +17 -0
  40. package/dist/cjs/ResponseActions/ResponseActionButton.d.ts +6 -0
  41. package/dist/cjs/ResponseActions/ResponseActionButton.js +10 -2
  42. package/dist/cjs/ResponseActions/ResponseActionButton.test.d.ts +1 -0
  43. package/dist/cjs/ResponseActions/ResponseActionButton.test.js +54 -0
  44. package/dist/cjs/ResponseActions/ResponseActions.d.ts +4 -0
  45. package/dist/cjs/ResponseActions/ResponseActions.js +26 -9
  46. package/dist/cjs/ResponseActions/ResponseActions.test.js +79 -5
  47. package/dist/cjs/Settings/SettingsForm.d.ts +13 -0
  48. package/dist/cjs/Settings/SettingsForm.js +27 -0
  49. package/dist/cjs/Settings/index.d.ts +2 -0
  50. package/dist/cjs/Settings/index.js +23 -0
  51. package/dist/cjs/TermsOfUse/TermsOfUse.d.ts +34 -0
  52. package/dist/cjs/TermsOfUse/TermsOfUse.js +49 -0
  53. package/dist/cjs/TermsOfUse/TermsOfUse.test.d.ts +1 -0
  54. package/dist/cjs/TermsOfUse/TermsOfUse.test.js +79 -0
  55. package/dist/cjs/TermsOfUse/index.d.ts +2 -0
  56. package/dist/cjs/TermsOfUse/index.js +23 -0
  57. package/dist/cjs/index.d.ts +6 -0
  58. package/dist/cjs/index.js +10 -1
  59. package/dist/css/main.css +244 -18
  60. package/dist/css/main.css.map +1 -1
  61. package/dist/dynamic/Compare/package.json +1 -0
  62. package/dist/dynamic/Settings/package.json +1 -0
  63. package/dist/dynamic/TermsOfUse/package.json +1 -0
  64. package/dist/esm/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.d.ts +19 -1
  65. package/dist/esm/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.js +11 -11
  66. package/dist/esm/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.test.js +39 -3
  67. package/dist/esm/ChatbotHeader/ChatbotHeaderCloseButton.d.ts +17 -0
  68. package/dist/esm/ChatbotHeader/ChatbotHeaderCloseButton.js +8 -0
  69. package/dist/esm/ChatbotHeader/ChatbotHeaderMenu.d.ts +2 -0
  70. package/dist/esm/ChatbotHeader/ChatbotHeaderMenu.js +2 -2
  71. package/dist/esm/ChatbotHeader/index.d.ts +1 -0
  72. package/dist/esm/ChatbotHeader/index.js +1 -0
  73. package/dist/esm/CodeModal/CodeModal.js +2 -12
  74. package/dist/esm/Compare/Compare.d.ts +17 -0
  75. package/dist/esm/Compare/Compare.js +43 -0
  76. package/dist/esm/Compare/Compare.test.d.ts +1 -0
  77. package/dist/esm/Compare/Compare.test.js +15 -0
  78. package/dist/esm/Compare/index.d.ts +2 -0
  79. package/dist/esm/Compare/index.js +2 -0
  80. package/dist/esm/Message/ListMessage/OrderedListMessage.d.ts +1 -1
  81. package/dist/esm/Message/ListMessage/OrderedListMessage.js +2 -2
  82. package/dist/esm/Message/Message.d.ts +16 -6
  83. package/dist/esm/Message/Message.js +7 -7
  84. package/dist/esm/Message/Message.test.js +51 -0
  85. package/dist/esm/Message/QuickResponse/QuickResponse.d.ts +15 -0
  86. package/dist/esm/Message/QuickResponse/QuickResponse.js +26 -0
  87. package/dist/esm/Message/QuickStarts/FallbackImg.d.ts +13 -0
  88. package/dist/esm/Message/QuickStarts/FallbackImg.js +9 -0
  89. package/dist/esm/Message/QuickStarts/QuickStartTile.d.ts +27 -0
  90. package/dist/esm/Message/QuickStarts/QuickStartTile.js +52 -0
  91. package/dist/esm/Message/QuickStarts/QuickStartTileDescription.d.ts +23 -0
  92. package/dist/esm/Message/QuickStarts/QuickStartTileDescription.js +35 -0
  93. package/dist/esm/Message/QuickStarts/QuickStartTileDescription.test.d.ts +1 -0
  94. package/dist/esm/Message/QuickStarts/QuickStartTileDescription.test.js +48 -0
  95. package/dist/esm/Message/QuickStarts/QuickStartTileHeader.d.ts +11 -0
  96. package/dist/esm/Message/QuickStarts/QuickStartTileHeader.js +5 -0
  97. package/dist/esm/Message/QuickStarts/monitor-sampleapp-quickstart-with-image.d.ts +30 -0
  98. package/dist/esm/Message/QuickStarts/monitor-sampleapp-quickstart-with-image.js +74 -0
  99. package/dist/esm/Message/QuickStarts/monitor-sampleapp-quickstart.d.ts +30 -0
  100. package/dist/esm/Message/QuickStarts/monitor-sampleapp-quickstart.js +74 -0
  101. package/dist/esm/Message/QuickStarts/types.d.ts +132 -0
  102. package/dist/esm/Message/QuickStarts/types.js +14 -0
  103. package/dist/esm/ResponseActions/ResponseActionButton.d.ts +6 -0
  104. package/dist/esm/ResponseActions/ResponseActionButton.js +10 -2
  105. package/dist/esm/ResponseActions/ResponseActionButton.test.d.ts +1 -0
  106. package/dist/esm/ResponseActions/ResponseActionButton.test.js +49 -0
  107. package/dist/esm/ResponseActions/ResponseActions.d.ts +4 -0
  108. package/dist/esm/ResponseActions/ResponseActions.js +26 -9
  109. package/dist/esm/ResponseActions/ResponseActions.test.js +79 -5
  110. package/dist/esm/Settings/SettingsForm.d.ts +13 -0
  111. package/dist/esm/Settings/SettingsForm.js +20 -0
  112. package/dist/esm/Settings/index.d.ts +2 -0
  113. package/dist/esm/Settings/index.js +2 -0
  114. package/dist/esm/TermsOfUse/TermsOfUse.d.ts +34 -0
  115. package/dist/esm/TermsOfUse/TermsOfUse.js +42 -0
  116. package/dist/esm/TermsOfUse/TermsOfUse.test.d.ts +1 -0
  117. package/dist/esm/TermsOfUse/TermsOfUse.test.js +74 -0
  118. package/dist/esm/TermsOfUse/index.d.ts +2 -0
  119. package/dist/esm/TermsOfUse/index.js +2 -0
  120. package/dist/esm/index.d.ts +6 -0
  121. package/dist/esm/index.js +6 -0
  122. package/dist/tsconfig.tsbuildinfo +1 -1
  123. package/package.json +7 -13
  124. package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithCustomResponseActions.tsx +4 -0
  125. package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithQuickStart.tsx +31 -0
  126. package/patternfly-docs/content/extensions/chatbot/examples/Messages/Messages.md +26 -4
  127. package/patternfly-docs/content/extensions/chatbot/examples/Messages/explore-pipeline-quickstart.ts +65 -0
  128. package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotFooter.tsx +1 -1
  129. package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotFootnote.tsx +2 -2
  130. package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotHeaderDrawer.tsx +2 -2
  131. package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotHeaderDrawerNavigation.tsx +67 -0
  132. package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotHeaderDrawerResizable.tsx +94 -0
  133. package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotHeaderDrawerWithSelection.tsx +78 -0
  134. package/patternfly-docs/content/extensions/chatbot/examples/UI/PF-TermsAndConditionsHeader.svg +148 -0
  135. package/patternfly-docs/content/extensions/chatbot/examples/UI/Settings.tsx +289 -0
  136. package/patternfly-docs/content/extensions/chatbot/examples/UI/SquareChatbotToggle.tsx +1 -1
  137. package/patternfly-docs/content/extensions/chatbot/examples/UI/TermsOfUse.tsx +147 -0
  138. package/patternfly-docs/content/extensions/chatbot/examples/UI/UI.md +54 -0
  139. package/patternfly-docs/content/extensions/chatbot/examples/demos/Chatbot.md +26 -3
  140. package/patternfly-docs/content/extensions/chatbot/examples/demos/Chatbot.tsx +2 -2
  141. package/patternfly-docs/content/extensions/chatbot/examples/demos/ChatbotAttachment.tsx +20 -19
  142. package/patternfly-docs/content/extensions/chatbot/examples/demos/ChatbotAttachmentMenu.tsx +1 -1
  143. package/patternfly-docs/content/extensions/chatbot/examples/demos/EmbeddedChatbot.tsx +2 -2
  144. package/patternfly-docs/content/extensions/chatbot/examples/demos/EmbeddedComparisonChatbot.tsx +206 -0
  145. package/src/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.scss +14 -0
  146. package/src/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.test.tsx +112 -3
  147. package/src/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.tsx +46 -9
  148. package/src/ChatbotFooter/ChatbotFooter.scss +2 -1
  149. package/src/ChatbotHeader/ChatbotHeaderCloseButton.tsx +51 -0
  150. package/src/ChatbotHeader/ChatbotHeaderMenu.tsx +5 -2
  151. package/src/ChatbotHeader/index.ts +1 -0
  152. package/src/CodeModal/CodeModal.scss +8 -0
  153. package/src/CodeModal/CodeModal.tsx +2 -13
  154. package/src/Compare/Compare.scss +72 -0
  155. package/src/Compare/Compare.test.tsx +31 -0
  156. package/src/Compare/Compare.tsx +98 -0
  157. package/src/Compare/index.ts +2 -0
  158. package/src/FileDropZone/__snapshots__/FileDropZone.test.tsx.snap +1 -1
  159. package/src/Message/ListMessage/OrderedListMessage.tsx +2 -2
  160. package/src/Message/Message.scss +0 -14
  161. package/src/Message/Message.test.tsx +76 -0
  162. package/src/Message/Message.tsx +35 -26
  163. package/src/Message/QuickResponse/QuickResponse.scss +33 -0
  164. package/src/Message/QuickResponse/QuickResponse.tsx +50 -0
  165. package/src/Message/QuickStarts/FallbackImg.tsx +24 -0
  166. package/src/Message/QuickStarts/QuickStartTile.scss +25 -0
  167. package/src/Message/QuickStarts/QuickStartTile.tsx +147 -0
  168. package/src/Message/QuickStarts/QuickStartTileDescription.test.tsx +57 -0
  169. package/src/Message/QuickStarts/QuickStartTileDescription.tsx +81 -0
  170. package/src/Message/QuickStarts/QuickStartTileHeader.tsx +21 -0
  171. package/src/Message/QuickStarts/monitor-sampleapp-quickstart-with-image.ts +75 -0
  172. package/src/Message/QuickStarts/monitor-sampleapp-quickstart.ts +75 -0
  173. package/src/Message/QuickStarts/types.ts +154 -0
  174. package/src/ResponseActions/ResponseActionButton.test.tsx +52 -0
  175. package/src/ResponseActions/ResponseActionButton.tsx +46 -27
  176. package/src/ResponseActions/ResponseActions.scss +10 -8
  177. package/src/ResponseActions/ResponseActions.test.tsx +103 -5
  178. package/src/ResponseActions/ResponseActions.tsx +54 -7
  179. package/src/Settings/Settings.scss +34 -0
  180. package/src/Settings/SettingsForm.tsx +25 -0
  181. package/src/Settings/index.ts +3 -0
  182. package/src/TermsOfUse/TermsOfUse.scss +66 -0
  183. package/src/TermsOfUse/TermsOfUse.test.tsx +138 -0
  184. package/src/TermsOfUse/TermsOfUse.tsx +117 -0
  185. package/src/TermsOfUse/index.ts +3 -0
  186. package/src/index.ts +9 -0
  187. package/src/main.scss +5 -0
@@ -17,12 +17,12 @@ describe('ChatbotConversationHistoryNav', () => {
17
17
  const initialConversations = [
18
18
  {
19
19
  id: '1',
20
- text: 'Lightspeed documentation'
20
+ text: 'ChatBot documentation'
21
21
  }
22
22
  ];
23
23
  it('should open the conversation history navigation drawer', () => {
24
24
  render(React.createElement(ChatbotConversationHistoryNav, { onDrawerToggle: onDrawerToggle, isDrawerOpen: true, displayMode: ChatbotDisplayMode.fullscreen, setIsDrawerOpen: jest.fn(), conversations: initialConversations }));
25
- expect(screen.queryByText('Lightspeed documentation')).toBeInTheDocument();
25
+ expect(screen.queryByText('ChatBot documentation')).toBeInTheDocument();
26
26
  });
27
27
  it('should display the conversations for grouped conversations', () => {
28
28
  const groupedConversations = {
@@ -58,7 +58,43 @@ describe('ChatbotConversationHistoryNav', () => {
58
58
  charCode: 27
59
59
  });
60
60
  waitFor(() => {
61
- expect(screen.queryByText('Lightspeed documentation')).not.toBeInTheDocument();
61
+ expect(screen.queryByText('ChatBot documentation')).not.toBeInTheDocument();
62
62
  });
63
63
  }));
64
+ it('should be resizable', () => {
65
+ render(React.createElement(ChatbotConversationHistoryNav, { onDrawerToggle: onDrawerToggle, isDrawerOpen: true, displayMode: ChatbotDisplayMode.fullscreen, setIsDrawerOpen: jest.fn(), conversations: initialConversations, drawerPanelContentProps: { isResizable: true, minSize: '200px' } }));
66
+ expect(screen.getByRole('dialog', { name: /Resize/i })).toBeTruthy();
67
+ expect(screen.getByRole('separator', { name: /Resize/i })).toBeTruthy();
68
+ expect(screen.getByRole('dialog', { name: /Resize/i })).toHaveAttribute('style', '--pf-v6-c-drawer__panel--md--FlexBasis: 384px; --pf-v6-c-drawer__panel--md--FlexBasis--min: 200px;');
69
+ });
70
+ it('should accept drawerContentProps', () => {
71
+ const { container } = render(React.createElement(ChatbotConversationHistoryNav, { onDrawerToggle: onDrawerToggle, isDrawerOpen: true, displayMode: ChatbotDisplayMode.fullscreen, setIsDrawerOpen: jest.fn(), conversations: initialConversations, drawerContentProps: { className: 'test' } }));
72
+ const element = container.querySelector('.test');
73
+ expect(element).toBeInTheDocument();
74
+ });
75
+ it('should accept drawerContentBodyProps', () => {
76
+ const { container } = render(React.createElement(ChatbotConversationHistoryNav, { onDrawerToggle: onDrawerToggle, isDrawerOpen: true, displayMode: ChatbotDisplayMode.fullscreen, setIsDrawerOpen: jest.fn(), conversations: initialConversations, drawerContentBodyProps: { className: 'test' } }));
77
+ const element = container.querySelector('.test');
78
+ expect(element).toBeInTheDocument();
79
+ });
80
+ it('should accept drawerHeadProps', () => {
81
+ const { container } = render(React.createElement(ChatbotConversationHistoryNav, { onDrawerToggle: onDrawerToggle, isDrawerOpen: true, displayMode: ChatbotDisplayMode.fullscreen, setIsDrawerOpen: jest.fn(), conversations: initialConversations, drawerHeadProps: { className: 'test' } }));
82
+ const element = container.querySelector('.test');
83
+ expect(element).toBeInTheDocument();
84
+ });
85
+ it('should accept drawerActionsProps', () => {
86
+ const { container } = render(React.createElement(ChatbotConversationHistoryNav, { onDrawerToggle: onDrawerToggle, isDrawerOpen: true, displayMode: ChatbotDisplayMode.fullscreen, setIsDrawerOpen: jest.fn(), conversations: initialConversations, drawerActionsProps: { className: 'test' } }));
87
+ const element = container.querySelector('.test');
88
+ expect(element).toBeInTheDocument();
89
+ });
90
+ it('should accept drawerCloseButtonProps', () => {
91
+ const { container } = render(React.createElement(ChatbotConversationHistoryNav, { onDrawerToggle: onDrawerToggle, isDrawerOpen: true, displayMode: ChatbotDisplayMode.fullscreen, setIsDrawerOpen: jest.fn(), conversations: initialConversations, drawerCloseButtonProps: { className: 'test' } }));
92
+ const element = container.querySelector('.test');
93
+ expect(element).toBeInTheDocument();
94
+ });
95
+ it('should accept drawerPanelBodyProps', () => {
96
+ const { container } = render(React.createElement(ChatbotConversationHistoryNav, { onDrawerToggle: onDrawerToggle, isDrawerOpen: true, displayMode: ChatbotDisplayMode.fullscreen, setIsDrawerOpen: jest.fn(), conversations: initialConversations, drawerPanelBodyProps: { className: 'test' } }));
97
+ const element = container.querySelector('.test');
98
+ expect(element).toBeInTheDocument();
99
+ });
64
100
  });
@@ -0,0 +1,17 @@
1
+ import React from 'react';
2
+ import { TooltipProps } from '@patternfly/react-core';
3
+ export interface ChatbotHeaderCloseButtonProps {
4
+ /** Callback function for when button is clicked */
5
+ onClick: () => void;
6
+ /** Custom classname for the header component */
7
+ className?: string;
8
+ /** Props spread to the PF Tooltip component wrapping the display mode dropdown */
9
+ tooltipProps?: TooltipProps;
10
+ /** Aria label for menu */
11
+ menuAriaLabel?: string;
12
+ /** Ref applied to menu */
13
+ innerRef?: React.Ref<HTMLButtonElement>;
14
+ /** Content used in tooltip */
15
+ tooltipContent?: string;
16
+ }
17
+ export declare const ChatbotHeaderCloseButton: React.ForwardRefExoticComponent<ChatbotHeaderCloseButtonProps & React.RefAttributes<HTMLButtonElement>>;
@@ -0,0 +1,8 @@
1
+ import React from 'react';
2
+ import { Button, Icon, Tooltip } from '@patternfly/react-core';
3
+ import { CloseIcon } from '@patternfly/react-icons';
4
+ const ChatbotHeaderCloseButtonBase = ({ className, onClick, tooltipProps, menuAriaLabel = 'Close', innerRef, tooltipContent = 'Close' }) => (React.createElement("div", { className: `pf-chatbot__menu ${className}` },
5
+ React.createElement(Tooltip, Object.assign({ content: tooltipContent, position: "bottom" }, tooltipProps),
6
+ React.createElement(Button, { className: "pf-chatbot__button--toggle-menu", variant: "plain", onClick: onClick, "aria-label": menuAriaLabel, ref: innerRef, icon: React.createElement(Icon, { size: "xl", isInline: true },
7
+ React.createElement(CloseIcon, null)) }))));
8
+ export const ChatbotHeaderCloseButton = React.forwardRef((props, ref) => (React.createElement(ChatbotHeaderCloseButtonBase, Object.assign({ innerRef: ref }, props))));
@@ -11,5 +11,7 @@ export interface ChatbotHeaderMenuProps {
11
11
  menuAriaLabel?: string;
12
12
  /** Ref applied to menu */
13
13
  innerRef?: React.Ref<HTMLButtonElement>;
14
+ /** Content used in tooltip */
15
+ tooltipContent?: string;
14
16
  }
15
17
  export declare const ChatbotHeaderMenu: React.ForwardRefExoticComponent<ChatbotHeaderMenuProps & React.RefAttributes<HTMLButtonElement>>;
@@ -1,8 +1,8 @@
1
1
  import React from 'react';
2
2
  import { Button, Icon, Tooltip } from '@patternfly/react-core';
3
3
  import BarsIcon from '@patternfly/react-icons/dist/esm/icons/bars-icon';
4
- const ChatbotHeaderMenuBase = ({ className, onMenuToggle, tooltipProps, menuAriaLabel = 'Toggle menu', innerRef }) => (React.createElement("div", { className: `pf-chatbot__menu ${className}` },
5
- React.createElement(Tooltip, Object.assign({ content: "Menu", position: "bottom" }, tooltipProps),
4
+ const ChatbotHeaderMenuBase = ({ className, onMenuToggle, tooltipProps, menuAriaLabel = 'Toggle menu', innerRef, tooltipContent = 'Menu' }) => (React.createElement("div", { className: `pf-chatbot__menu ${className}` },
5
+ React.createElement(Tooltip, Object.assign({ content: tooltipContent, position: "bottom" }, tooltipProps),
6
6
  React.createElement(Button, { className: "pf-chatbot__button--toggle-menu", variant: "plain", onClick: onMenuToggle, "aria-label": menuAriaLabel, ref: innerRef, icon: React.createElement(Icon, { size: "xl", isInline: true },
7
7
  React.createElement(BarsIcon, null)) }))));
8
8
  export const ChatbotHeaderMenu = React.forwardRef((props, ref) => (React.createElement(ChatbotHeaderMenuBase, Object.assign({ innerRef: ref }, props))));
@@ -6,3 +6,4 @@ export * from './ChatbotHeaderMenu';
6
6
  export * from './ChatbotHeaderTitle';
7
7
  export * from './ChatbotHeaderOptionsDropdown';
8
8
  export * from './ChatbotHeaderSelectorDropdown';
9
+ export * from './ChatbotHeaderCloseButton';
@@ -6,3 +6,4 @@ export * from './ChatbotHeaderMenu';
6
6
  export * from './ChatbotHeaderTitle';
7
7
  export * from './ChatbotHeaderOptionsDropdown';
8
8
  export * from './ChatbotHeaderSelectorDropdown';
9
+ export * from './ChatbotHeaderCloseButton';
@@ -46,24 +46,14 @@ export const CodeModal = (_a) => {
46
46
  setNewCode(value);
47
47
  }
48
48
  };
49
- /* eslint-disable indent */
50
- const getHeight = (displayMode) => {
51
- switch (displayMode) {
52
- case ChatbotDisplayMode.docked:
53
- return '100vh';
54
- default:
55
- return '45vh';
56
- }
57
- };
58
- /* eslint-enable indent */
59
49
  const modal = (React.createElement(ChatbotModal, { isOpen: isModalOpen, onClose: handleModalToggle, ouiaId: "CodeModal", "aria-labelledby": "code-modal-title", "aria-describedby": "code-modal", className: `pf-chatbot__code-modal pf-chatbot__code-modal--${displayMode}`, displayMode: displayMode },
60
50
  React.createElement(ModalHeader, { title: title, labelId: "code-modal-title" }),
61
51
  React.createElement(ModalBody, { id: "code-modal-body" },
62
52
  React.createElement(Stack, { className: "pf-chatbot__code-modal-body" },
63
53
  React.createElement(StackItem, { className: "pf-chatbot__code-modal-file-details" },
64
54
  React.createElement(FileDetails, { fileName: fileName })),
65
- React.createElement(StackItem, null,
66
- React.createElement(CodeEditor, Object.assign({ isDarkTheme: true, isLineNumbersVisible: isLineNumbersVisible, isLanguageLabelVisible: true, isCopyEnabled: isCopyEnabled, isReadOnly: isReadOnly, code: newCode, language: extensionToLanguage[path.extname(fileName).slice(1)], onEditorDidMount: onEditorDidMount, onCodeChange: onCodeChange, className: codeEditorClassName, height: getHeight(displayMode), options: {
55
+ React.createElement(StackItem, { className: "pf-chatbot__code-modal-body" },
56
+ React.createElement(CodeEditor, Object.assign({ isDarkTheme: true, isLineNumbersVisible: isLineNumbersVisible, isLanguageLabelVisible: true, isCopyEnabled: isCopyEnabled, isReadOnly: isReadOnly, code: newCode, language: extensionToLanguage[path.extname(fileName).slice(1)], onEditorDidMount: onEditorDidMount, onCodeChange: onCodeChange, className: codeEditorClassName, isFullHeight: true, options: {
67
57
  glyphMargin: false,
68
58
  folding: false
69
59
  } }, props))))),
@@ -0,0 +1,17 @@
1
+ import React, { PropsWithChildren } from 'react';
2
+ interface CompareProps {
3
+ /** First of two children to render */
4
+ firstChild: React.ReactNode;
5
+ /** Second of two children to render */
6
+ secondChild: React.ReactNode;
7
+ /** Display name for first child, used in mobile toggle */
8
+ firstChildDisplayName: string;
9
+ /** Display name for second child, used in mobile toggle */
10
+ secondChildDisplayName: string;
11
+ /** Aria label for mobile toggle group */
12
+ toggleGroupAriaLabel?: string;
13
+ /** Callback for when mobile toggle is used */
14
+ onToggleClick?: (event: MouseEvent | React.MouseEvent<any, MouseEvent> | React.KeyboardEvent<Element>) => void;
15
+ }
16
+ export declare const Compare: ({ firstChild, secondChild, firstChildDisplayName, secondChildDisplayName, onToggleClick, toggleGroupAriaLabel }: PropsWithChildren<CompareProps>) => React.JSX.Element;
17
+ export default Compare;
@@ -0,0 +1,43 @@
1
+ import React from 'react';
2
+ import { ToggleGroup, ToggleGroupItem } from '@patternfly/react-core';
3
+ export const Compare = ({ firstChild, secondChild, firstChildDisplayName, secondChildDisplayName, onToggleClick, toggleGroupAriaLabel = 'Select which chatbot to display' }) => {
4
+ const [isSelected, setIsSelected] = React.useState('toggle-group-chatbot-1');
5
+ const [showFirstChatbot, setShowFirstChatbot] = React.useState(true);
6
+ const [showSecondChatbot, setShowSecondChatbot] = React.useState(false);
7
+ React.useEffect(() => {
8
+ // we want to show the first if we switch to the mobile toggle view
9
+ // and reset/switch back to normal otherwise
10
+ const updateChatbotVisibility = () => {
11
+ if (window.innerWidth >= 901) {
12
+ setShowFirstChatbot(true);
13
+ setShowSecondChatbot(true);
14
+ }
15
+ else {
16
+ setShowFirstChatbot(true);
17
+ setShowSecondChatbot(false);
18
+ setIsSelected('toggle-group-chatbot-1');
19
+ }
20
+ };
21
+ window.addEventListener('resize', updateChatbotVisibility);
22
+ return () => {
23
+ window.removeEventListener('resize', updateChatbotVisibility);
24
+ };
25
+ }, []);
26
+ // this only happens on mobile
27
+ const handleChildToggleClick = (event) => {
28
+ const id = event.currentTarget.id;
29
+ setIsSelected(id);
30
+ setShowSecondChatbot(!showSecondChatbot);
31
+ setShowFirstChatbot(!showFirstChatbot);
32
+ onToggleClick && onToggleClick(event);
33
+ };
34
+ return (React.createElement(React.Fragment, null,
35
+ React.createElement("div", { className: "pf-chatbot__compare-mobile-controls" },
36
+ React.createElement(ToggleGroup, { "aria-label": toggleGroupAriaLabel },
37
+ React.createElement(ToggleGroupItem, { className: "pf-chatbot__compare-toggle", text: firstChildDisplayName, buttonId: "toggle-group-chatbot-1", isSelected: isSelected === 'toggle-group-chatbot-1', onChange: handleChildToggleClick }),
38
+ React.createElement(ToggleGroupItem, { className: "pf-chatbot__compare-toggle", text: secondChildDisplayName, buttonId: "toggle-group-chatbot-2", isSelected: isSelected === 'toggle-group-chatbot-2', onChange: handleChildToggleClick }))),
39
+ React.createElement("div", { className: "pf-chatbot__compare" },
40
+ React.createElement("div", { className: `pf-chatbot__compare-item ${!showFirstChatbot ? 'pf-chatbot__compare-item-hidden' : undefined}` }, firstChild),
41
+ React.createElement("div", { className: `pf-chatbot__compare-item ${!showSecondChatbot ? 'pf-chatbot__compare-item-hidden' : undefined}` }, secondChild))));
42
+ };
43
+ export default Compare;
@@ -0,0 +1 @@
1
+ import '@testing-library/jest-dom';
@@ -0,0 +1,15 @@
1
+ import React from 'react';
2
+ import { render, screen } from '@testing-library/react';
3
+ import '@testing-library/jest-dom';
4
+ import Compare from './Compare';
5
+ const firstChild = (React.createElement("div", null,
6
+ React.createElement("h1", null, "Child 1")));
7
+ const secondChild = (React.createElement("div", null,
8
+ React.createElement("h1", null, "Child 2")));
9
+ describe('Compare', () => {
10
+ it('should render compare correctly', () => {
11
+ render(React.createElement(Compare, { firstChildDisplayName: "Child 1", secondChildDisplayName: "Child 2", firstChild: firstChild, secondChild: secondChild }));
12
+ expect(screen.getByRole('heading', { name: /Child 1/i })).toBeTruthy();
13
+ expect(screen.getByRole('heading', { name: /Child 2/i })).toBeTruthy();
14
+ });
15
+ });
@@ -0,0 +1,2 @@
1
+ export { default } from './Compare';
2
+ export * from './Compare';
@@ -0,0 +1,2 @@
1
+ export { default } from './Compare';
2
+ export * from './Compare';
@@ -1,4 +1,4 @@
1
1
  import React from 'react';
2
2
  import { ExtraProps } from 'react-markdown';
3
- declare const OrderedListMessage: ({ children }: JSX.IntrinsicElements["ol"] & ExtraProps) => React.JSX.Element;
3
+ declare const OrderedListMessage: ({ children, start }: JSX.IntrinsicElements["ol"] & ExtraProps) => React.JSX.Element;
4
4
  export default OrderedListMessage;
@@ -3,6 +3,6 @@
3
3
  // ============================================================================
4
4
  import React from 'react';
5
5
  import { List, ListComponent, OrderType } from '@patternfly/react-core';
6
- const OrderedListMessage = ({ children }) => (React.createElement("div", { className: "pf-chatbot__message-ordered-list" },
7
- React.createElement(List, { component: ListComponent.ol, type: OrderType.number }, children)));
6
+ const OrderedListMessage = ({ children, start }) => (React.createElement("div", { className: "pf-chatbot__message-ordered-list" },
7
+ React.createElement(List, { component: ListComponent.ol, type: OrderType.number, start: start }, children)));
8
8
  export default OrderedListMessage;
@@ -1,12 +1,9 @@
1
1
  import React from 'react';
2
- import { AvatarProps, LabelGroupProps, LabelProps } from '@patternfly/react-core';
2
+ import { AvatarProps, LabelGroupProps } from '@patternfly/react-core';
3
3
  import { ActionProps } from '../ResponseActions/ResponseActions';
4
4
  import { SourcesCardProps } from '../SourcesCard';
5
- export interface QuickResponse extends Omit<LabelProps, 'children'> {
6
- content: string;
7
- id: string;
8
- onClick: () => void;
9
- }
5
+ import { QuickStart, QuickstartAction } from './QuickStarts/types';
6
+ import QuickResponse from './QuickResponse/QuickResponse';
10
7
  export interface MessageAttachment {
11
8
  /** Name of file attached to the message */
12
9
  name: string;
@@ -64,6 +61,19 @@ export interface MessageProps extends Omit<React.HTMLProps<HTMLDivElement>, 'rol
64
61
  hasRoundAvatar?: boolean;
65
62
  /** Any additional props applied to the avatar, for additional customization */
66
63
  avatarProps?: Omit<AvatarProps, 'alt'>;
64
+ /** Props for QuickStart card */
65
+ quickStarts?: {
66
+ quickStart: QuickStart;
67
+ onSelectQuickStart: (id?: string) => void;
68
+ minuteWord?: string;
69
+ minuteWordPlural?: string;
70
+ prerequisiteWord?: string;
71
+ prerequisiteWordPlural?: string;
72
+ quickStartButtonAriaLabel?: string;
73
+ className?: string;
74
+ onClick?: () => void;
75
+ action?: QuickstartAction;
76
+ };
67
77
  }
68
78
  export declare const Message: React.FunctionComponent<MessageProps>;
69
79
  export default Message;
@@ -15,7 +15,7 @@ var __rest = (this && this.__rest) || function (s, e) {
15
15
  import React from 'react';
16
16
  import Markdown from 'react-markdown';
17
17
  import remarkGfm from 'remark-gfm';
18
- import { Avatar, Label, LabelGroup, Timestamp, Truncate } from '@patternfly/react-core';
18
+ import { Avatar, Label, Timestamp, Truncate } from '@patternfly/react-core';
19
19
  import MessageLoading from './MessageLoading';
20
20
  import CodeBlockMessage from './CodeBlockMessage/CodeBlockMessage';
21
21
  import TextMessage from './TextMessage/TextMessage';
@@ -25,8 +25,10 @@ import SourcesCard from '../SourcesCard';
25
25
  import ListItemMessage from './ListMessage/ListItemMessage';
26
26
  import UnorderedListMessage from './ListMessage/UnorderedListMessage';
27
27
  import OrderedListMessage from './ListMessage/OrderedListMessage';
28
+ import QuickStartTile from './QuickStarts/QuickStartTile';
29
+ import QuickResponse from './QuickResponse/QuickResponse';
28
30
  export const Message = (_a) => {
29
- var { role, content, name, avatar, timestamp, isLoading, actions, sources, botWord = 'AI', loadingWord = 'Loading message', codeBlockProps, quickResponses, quickResponseContainerProps = { numLabels: 5 }, attachments, hasRoundAvatar = true, avatarProps } = _a, props = __rest(_a, ["role", "content", "name", "avatar", "timestamp", "isLoading", "actions", "sources", "botWord", "loadingWord", "codeBlockProps", "quickResponses", "quickResponseContainerProps", "attachments", "hasRoundAvatar", "avatarProps"]);
31
+ var { role, content, name, avatar, timestamp, isLoading, actions, sources, botWord = 'AI', loadingWord = 'Loading message', codeBlockProps, quickResponses, quickResponseContainerProps = { numLabels: 5 }, attachments, hasRoundAvatar = true, avatarProps, quickStarts } = _a, props = __rest(_a, ["role", "content", "name", "avatar", "timestamp", "isLoading", "actions", "sources", "botWord", "loadingWord", "codeBlockProps", "quickResponses", "quickResponseContainerProps", "attachments", "hasRoundAvatar", "avatarProps", "quickStarts"]);
30
32
  let avatarClassName;
31
33
  if (avatarProps && 'className' in avatarProps) {
32
34
  const { className } = avatarProps, rest = __rest(avatarProps, ["className"]);
@@ -50,15 +52,13 @@ export const Message = (_a) => {
50
52
  p: TextMessage,
51
53
  code: ({ children }) => React.createElement(CodeBlockMessage, Object.assign({}, codeBlockProps), children),
52
54
  ul: UnorderedListMessage,
53
- ol: OrderedListMessage,
55
+ ol: (props) => React.createElement(OrderedListMessage, Object.assign({}, props)),
54
56
  li: ListItemMessage
55
57
  }, remarkPlugins: [remarkGfm] }, content)),
56
58
  !isLoading && sources && React.createElement(SourcesCard, Object.assign({}, sources)),
59
+ quickStarts && quickStarts.quickStart && (React.createElement(QuickStartTile, { quickStart: quickStarts.quickStart, onSelectQuickStart: quickStarts.onSelectQuickStart, minuteWord: quickStarts.minuteWord, minuteWordPlural: quickStarts.minuteWordPlural, prerequisiteWord: quickStarts.prerequisiteWord, prerequisiteWordPlural: quickStarts.prerequisiteWordPlural, quickStartButtonAriaLabel: quickStarts.quickStartButtonAriaLabel })),
57
60
  !isLoading && actions && React.createElement(ResponseActions, { actions: actions }),
58
- !isLoading && quickResponses && (React.createElement(LabelGroup, Object.assign({ className: `pf-chatbot__message-quick-response ${quickResponseContainerProps === null || quickResponseContainerProps === void 0 ? void 0 : quickResponseContainerProps.className}` }, quickResponseContainerProps), quickResponses.map((_a) => {
59
- var { id, onClick, content } = _a, props = __rest(_a, ["id", "onClick", "content"]);
60
- return (React.createElement(Label, Object.assign({ variant: "outline", color: "blue", key: id, onClick: onClick }, props), content));
61
- })))),
61
+ !isLoading && quickResponses && (React.createElement(QuickResponse, { quickResponses: quickResponses, quickResponseContainerProps: quickResponseContainerProps }))),
62
62
  attachments && (React.createElement("div", { className: "pf-chatbot__message-attachments-container" }, attachments.map((attachment) => {
63
63
  var _a;
64
64
  return (React.createElement("div", { key: (_a = attachment.id) !== null && _a !== void 0 ? _a : attachment.name, className: "pf-chatbot__message-attachment" },
@@ -12,6 +12,8 @@ import { render, screen } from '@testing-library/react';
12
12
  import '@testing-library/jest-dom';
13
13
  import Message from './Message';
14
14
  import userEvent from '@testing-library/user-event';
15
+ import { monitorSampleAppQuickStart } from './QuickStarts/monitor-sampleapp-quickstart';
16
+ import { monitorSampleAppQuickStartWithImage } from './QuickStarts/monitor-sampleapp-quickstart-with-image';
15
17
  const ALL_ACTIONS = [
16
18
  { label: /Good response/i },
17
19
  { label: /Bad response/i },
@@ -55,6 +57,21 @@ spec:
55
57
  url: https://raw.githubusercontent.com/Azure-Samples/helm-charts/master/docs
56
58
  `;
57
59
  const INLINE_CODE = `Here is an inline code - \`() => void\``;
60
+ const ORDERED_LIST_WITH_CODE = `
61
+ 1. Item 1
62
+ 2. Item 2
63
+
64
+ \`\`\`yaml
65
+ - name: Hello World Playbook
66
+ hosts: localhost
67
+ tasks:
68
+ - name: Print Hello World
69
+ ansible.builtin.debug:
70
+ msg: "Hello, World!"
71
+ \`\`\`
72
+
73
+ 3. Item 3
74
+ `;
58
75
  const checkListItemsRendered = () => {
59
76
  const items = ['Item 1', 'Item 2', 'Item 3'];
60
77
  expect(screen.getAllByRole('listitem')).toHaveLength(3);
@@ -275,6 +292,12 @@ describe('Message', () => {
275
292
  expect(screen.getByText('Here is an ordered list:')).toBeTruthy();
276
293
  checkListItemsRendered();
277
294
  });
295
+ it('should render ordered lists correctly if there is interstitial content', () => {
296
+ render(React.createElement(Message, { avatar: "./img", role: "user", name: "User", content: ORDERED_LIST_WITH_CODE }));
297
+ checkListItemsRendered();
298
+ const list = screen.getAllByRole('list')[1];
299
+ expect(list).toHaveAttribute('start', '3');
300
+ });
278
301
  it('should render inline code', () => {
279
302
  render(React.createElement(Message, { avatar: "./img", role: "user", name: "User", content: INLINE_CODE }));
280
303
  expect(screen.getByText(/() => void/i)).toBeTruthy();
@@ -327,4 +350,32 @@ describe('Message', () => {
327
350
  expect(screen.getByRole('img')).toHaveClass('test');
328
351
  expect(screen.getByRole('img')).toHaveClass('pf-chatbot__message-avatar');
329
352
  });
353
+ it('should handle QuickStart tile correctly', () => {
354
+ render(React.createElement(Message, { avatar: "./img", role: "user", name: "User", content: "Hi", quickStarts: {
355
+ quickStart: monitorSampleAppQuickStart,
356
+ onSelectQuickStart: (id) => alert(id)
357
+ } }));
358
+ expect(screen.getByRole('button', { name: 'Monitoring your sample application' })).toBeTruthy();
359
+ expect(screen.getByRole('heading', { name: '1 Prerequisite' })).toBeTruthy();
360
+ expect(screen.getByRole('button', { name: 'Show prerequisites' })).toBeTruthy();
361
+ expect(screen.getByRole('button', { name: 'Start' })).toBeTruthy();
362
+ });
363
+ it('should handle click on QuickStart tile correctly', () => __awaiter(void 0, void 0, void 0, function* () {
364
+ const spy = jest.fn();
365
+ render(React.createElement(Message, { avatar: "./img", role: "user", name: "User", content: "Hi", quickStarts: {
366
+ quickStart: monitorSampleAppQuickStart,
367
+ onSelectQuickStart: (id) => spy(id)
368
+ } }));
369
+ yield userEvent.click(screen.getByRole('button', { name: 'Monitoring your sample application' }));
370
+ expect(spy).toHaveBeenCalledTimes(1);
371
+ expect(spy).toHaveBeenCalledWith(monitorSampleAppQuickStart.metadata.name);
372
+ }));
373
+ it('should handle QuickStart tile with image correctly', () => __awaiter(void 0, void 0, void 0, function* () {
374
+ const spy = jest.fn();
375
+ render(React.createElement(Message, { avatar: "./img", role: "user", name: "User", content: "Hi", quickStarts: {
376
+ quickStart: monitorSampleAppQuickStartWithImage,
377
+ onSelectQuickStart: (id) => spy(id)
378
+ } }));
379
+ expect(screen.getAllByRole('img')[1]).toHaveAttribute('src', 'test.png');
380
+ }));
330
381
  });
@@ -0,0 +1,15 @@
1
+ import React from 'react';
2
+ import { LabelGroupProps, LabelProps } from '@patternfly/react-core';
3
+ export interface QuickResponse extends Omit<LabelProps, 'children'> {
4
+ content: string;
5
+ id: string;
6
+ onClick: () => void;
7
+ }
8
+ export interface QuickResponseProps {
9
+ /** Props for quick responses */
10
+ quickResponses: QuickResponse[];
11
+ /** Props for quick responses container */
12
+ quickResponseContainerProps?: Omit<LabelGroupProps, 'ref'>;
13
+ }
14
+ export declare const QuickResponse: React.FunctionComponent<QuickResponseProps>;
15
+ export default QuickResponse;
@@ -0,0 +1,26 @@
1
+ var __rest = (this && this.__rest) || function (s, e) {
2
+ var t = {};
3
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
4
+ t[p] = s[p];
5
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
6
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
7
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
8
+ t[p[i]] = s[p[i]];
9
+ }
10
+ return t;
11
+ };
12
+ import React from 'react';
13
+ import { Label, LabelGroup } from '@patternfly/react-core';
14
+ import { CheckIcon } from '@patternfly/react-icons';
15
+ export const QuickResponse = ({ quickResponses, quickResponseContainerProps = { numLabels: 5 } }) => {
16
+ const [selectedQuickResponse, setSelectedQuickResponse] = React.useState();
17
+ const handleQuickResponseClick = (id, onClick) => {
18
+ setSelectedQuickResponse(id);
19
+ onClick && onClick();
20
+ };
21
+ return (React.createElement(LabelGroup, Object.assign({ className: `pf-chatbot__message-quick-response ${quickResponseContainerProps === null || quickResponseContainerProps === void 0 ? void 0 : quickResponseContainerProps.className}` }, quickResponseContainerProps), quickResponses.map((_a) => {
22
+ var { id, onClick, content, className } = _a, props = __rest(_a, ["id", "onClick", "content", "className"]);
23
+ return (React.createElement(Label, Object.assign({ variant: id === selectedQuickResponse ? undefined : 'outline', icon: id === selectedQuickResponse ? React.createElement(CheckIcon, null) : undefined, color: "blue", key: id, onClick: () => handleQuickResponseClick(id, onClick), className: `${id === selectedQuickResponse ? 'pf-chatbot__message-quick-response--selected' : ''} ${className ? className : ''}` }, props), content));
24
+ })));
25
+ };
26
+ export default QuickResponse;
@@ -0,0 +1,13 @@
1
+ import * as React from 'react';
2
+ interface FallbackImgProps {
3
+ /** Image source */
4
+ src: string;
5
+ /** Alt text for image */
6
+ alt?: string;
7
+ /** ClassName applied to image */
8
+ className?: string;
9
+ /** Fallback */
10
+ fallback?: React.ReactNode;
11
+ }
12
+ declare const FallbackImg: React.FC<FallbackImgProps>;
13
+ export default FallbackImg;
@@ -0,0 +1,9 @@
1
+ import * as React from 'react';
2
+ const FallbackImg = ({ src, alt, className, fallback }) => {
3
+ const [isSrcValid, setIsSrcValid] = React.useState(true);
4
+ if (src && isSrcValid) {
5
+ return React.createElement("img", { className: className, src: src, alt: alt, onError: () => setIsSrcValid(false) });
6
+ }
7
+ return React.createElement(React.Fragment, null, fallback);
8
+ };
9
+ export default FallbackImg;
@@ -0,0 +1,27 @@
1
+ import * as React from 'react';
2
+ import { QuickStart, QuickstartAction } from './types';
3
+ export declare const camelize: (str: string) => string;
4
+ export interface QuickStartTileProps {
5
+ /** ClassName applied to the card */
6
+ className?: string;
7
+ /** The quickstart object triggered by this tile */
8
+ quickStart: QuickStart;
9
+ /** Event handler attached to the tile */
10
+ onClick?: () => void;
11
+ /** Action config for button rendered next to title */
12
+ action?: QuickstartAction;
13
+ /** Callback that returns active quick start value when clicked */
14
+ onSelectQuickStart: (id?: string) => void;
15
+ /** Label for the English word "minute". */
16
+ minuteWord?: string;
17
+ /** Label for the English word "minutes". */
18
+ minuteWordPlural?: string;
19
+ /** Label for the English word "Prerequisite" */
20
+ prerequisiteWord?: string;
21
+ /** Label for the English word "Prerequisites" */
22
+ prerequisiteWordPlural?: string;
23
+ /** Aria-label for the quick start description button */
24
+ quickStartButtonAriaLabel?: string;
25
+ }
26
+ declare const QuickStartTile: React.FC<QuickStartTileProps>;
27
+ export default QuickStartTile;
@@ -0,0 +1,52 @@
1
+ import * as React from 'react';
2
+ import RocketIcon from '@patternfly/react-icons/dist/js/icons/rocket-icon';
3
+ import OutlinedBookmarkIcon from '@patternfly/react-icons/dist/js/icons/outlined-bookmark-icon';
4
+ import { Card, CardBody, CardHeader, CardFooter, CardTitle, Icon, Button, Flex, Stack, Label, pluralize } from '@patternfly/react-core';
5
+ import OutlinedClockIcon from '@patternfly/react-icons/dist/js/icons/outlined-clock-icon';
6
+ import QuickStartTileHeader from './QuickStartTileHeader';
7
+ import QuickStartTileDescription from './QuickStartTileDescription';
8
+ import FallbackImg from './FallbackImg';
9
+ export const camelize = (str) => str.replace(/(?:^\w|[A-Z]|\b\w|\s+)/g, function (match, index) {
10
+ if (+match === 0) {
11
+ return '';
12
+ } // or if (/\s+/.test(match)) for white spaces
13
+ return index === 0 ? match.toLowerCase() : match.toUpperCase();
14
+ });
15
+ const QuickStartTile = ({ className, quickStart, onClick, onSelectQuickStart, minuteWord = 'minute', minuteWordPlural = 'minutes', prerequisiteWord, prerequisiteWordPlural, quickStartButtonAriaLabel, action }) => {
16
+ const { metadata: { name: id }, spec: { icon, displayName, description, durationMinutes, prerequisites, link, type } } = quickStart;
17
+ let quickStartIcon;
18
+ if (typeof icon === 'object') {
19
+ quickStartIcon = React.createElement(Icon, { size: "2xl" }, icon);
20
+ }
21
+ else {
22
+ quickStartIcon = (React.createElement(Icon, { size: "2xl" },
23
+ React.createElement(FallbackImg, { src: icon, alt: "", className: "pfext-catalog-item-icon__img", fallback: React.createElement(RocketIcon, null) })));
24
+ }
25
+ const onSelect = () => {
26
+ if (!link) {
27
+ onSelectQuickStart(id);
28
+ }
29
+ else {
30
+ window.open(link.href, '_blank', 'noopener,noreferrer');
31
+ }
32
+ onClick && onClick();
33
+ };
34
+ const ActionIcon = (action === null || action === void 0 ? void 0 : action.icon) || OutlinedBookmarkIcon;
35
+ const additionalAction = action ? (React.createElement(Button, Object.assign({ "aria-label": action['aria-label'], icon: React.createElement(ActionIcon, null), variant: "plain", onClick: action.onClick }, action.buttonProps))) : undefined;
36
+ return (React.createElement(Card, { className: `pf-chatbot__quickstarts-tile ${className ? className : ''}`, id: `${id}-chatbot-qs-tile`, style: { height: '100%' }, "data-testid": `chatbot-qs-card-${camelize(displayName)}` },
37
+ React.createElement(CardHeader, Object.assign({}, (action && {
38
+ actions: { actions: additionalAction }
39
+ })), quickStartIcon),
40
+ React.createElement(CardTitle, null,
41
+ React.createElement(QuickStartTileHeader, { name: displayName, onSelect: onSelect, quickStartId: id })),
42
+ React.createElement(CardBody, null,
43
+ React.createElement(Stack, { hasGutter: true },
44
+ React.createElement(Flex, { spaceItems: { default: 'spaceItemsSm' } },
45
+ type && React.createElement(Label, { color: type.color }, type.text),
46
+ durationMinutes && (React.createElement(Label, { variant: "outline", "data-test": "duration", icon: React.createElement(OutlinedClockIcon, null) }, pluralize(durationMinutes, minuteWord, minuteWordPlural)))),
47
+ React.createElement(QuickStartTileDescription, { description: description, prerequisites: prerequisites, prerequisiteWord: prerequisiteWord, prerequisiteWordPlural: prerequisiteWordPlural, quickStartButtonAriaLabel: quickStartButtonAriaLabel }))),
48
+ React.createElement(CardFooter, null,
49
+ React.createElement(Button, { variant: "link", isInline: true, onClick: onSelect },
50
+ React.createElement("span", { className: "pf-v6-c-button__text" }, "Start")))));
51
+ };
52
+ export default QuickStartTile;
@@ -0,0 +1,23 @@
1
+ import * as React from 'react';
2
+ interface QuickStartTileDescriptionProps {
3
+ /** QuickStart description */
4
+ description: string;
5
+ /** QuickStart prerequisites */
6
+ prerequisites?: string[];
7
+ /** Label for the English word "Prerequisite" */
8
+ prerequisiteWord?: string;
9
+ /** Label for the English word "Prerequisites" */
10
+ prerequisiteWordPlural?: string;
11
+ /** Aria-label for the quick start button */
12
+ quickStartButtonAriaLabel?: string;
13
+ }
14
+ /** This function is a helper for pluralizing strings stolen from React.
15
+ *
16
+ * @param {number} i The quantity of the string you want to pluralize
17
+ * @param {string} singular The singular version of the string
18
+ * @param {string} plural The change to the string that should occur if the quantity is not equal to 1.
19
+ * Defaults to adding an 's'.
20
+ */
21
+ export declare function pluralizeWord(i: number, singular: string, plural?: string): string;
22
+ declare const QuickStartTileDescription: React.FC<QuickStartTileDescriptionProps>;
23
+ export default QuickStartTileDescription;