@patternfly/chatbot 6.5.0-prerelease.27 → 6.5.0-prerelease.29

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 (151) hide show
  1. package/dist/cjs/MarkdownContent/MarkdownContent.d.ts +7 -2
  2. package/dist/cjs/Message/ErrorMessage/ErrorMessage.d.ts +15 -1
  3. package/dist/cjs/Message/ErrorMessage/ErrorMessage.js +5 -3
  4. package/dist/cjs/Message/ErrorMessage/ErrorMessage.test.d.ts +1 -0
  5. package/dist/cjs/Message/ErrorMessage/ErrorMessage.test.js +30 -0
  6. package/dist/cjs/Message/Message.d.ts +2 -0
  7. package/dist/cjs/Message/Message.js +5 -5
  8. package/dist/cjs/Message/MessageAndActions/MessageAndActions.d.ts +14 -0
  9. package/dist/cjs/Message/MessageAndActions/MessageAndActions.js +22 -0
  10. package/dist/cjs/Message/MessageAndActions/MessageAndActions.test.d.ts +1 -0
  11. package/dist/cjs/Message/MessageAndActions/MessageAndActions.test.js +25 -0
  12. package/dist/cjs/Message/MessageAndActions/index.d.ts +1 -0
  13. package/dist/cjs/Message/MessageAndActions/index.js +17 -0
  14. package/dist/cjs/Message/MessageAttachments/MessageAttachmentItem.d.ts +13 -0
  15. package/dist/cjs/Message/MessageAttachments/MessageAttachmentItem.js +22 -0
  16. package/dist/cjs/Message/MessageAttachments/MessageAttachmentItem.test.d.ts +1 -0
  17. package/dist/cjs/Message/MessageAttachments/MessageAttachmentItem.test.js +25 -0
  18. package/dist/cjs/Message/MessageAttachments/MessageAttachmentsContainer.d.ts +13 -0
  19. package/dist/cjs/Message/MessageAttachments/MessageAttachmentsContainer.js +22 -0
  20. package/dist/cjs/Message/MessageAttachments/MessageAttachmentsContainer.test.d.ts +1 -0
  21. package/dist/cjs/Message/MessageAttachments/MessageAttachmentsContainer.test.js +25 -0
  22. package/dist/cjs/Message/MessageAttachments/index.d.ts +2 -0
  23. package/dist/cjs/Message/MessageAttachments/index.js +18 -0
  24. package/dist/cjs/Message/MessageInput.d.ts +1 -1
  25. package/dist/cjs/Message/MessageInput.js +3 -1
  26. package/dist/cjs/Message/MessageLoading.d.ts +13 -4
  27. package/dist/cjs/Message/MessageLoading.js +19 -5
  28. package/dist/cjs/Message/MessageLoading.test.d.ts +1 -0
  29. package/dist/cjs/Message/MessageLoading.test.js +25 -0
  30. package/dist/cjs/Message/QuickResponse/QuickResponse.js +3 -2
  31. package/dist/cjs/Message/QuickResponse/QuickResponse.test.d.ts +1 -0
  32. package/dist/cjs/Message/QuickResponse/QuickResponse.test.js +109 -0
  33. package/dist/cjs/Message/QuickResponse/index.d.ts +1 -0
  34. package/dist/cjs/Message/QuickResponse/index.js +17 -0
  35. package/dist/cjs/Message/QuickStarts/QuickStartTile.d.ts +1 -1
  36. package/dist/cjs/Message/QuickStarts/QuickStartTile.js +3 -2
  37. package/dist/cjs/Message/QuickStarts/index.d.ts +2 -0
  38. package/dist/cjs/Message/QuickStarts/index.js +18 -0
  39. package/dist/cjs/Message/UserFeedback/UserFeedback.d.ts +1 -1
  40. package/dist/cjs/Message/UserFeedback/UserFeedback.js +3 -1
  41. package/dist/cjs/Message/UserFeedback/UserFeedbackComplete.d.ts +1 -1
  42. package/dist/cjs/Message/UserFeedback/UserFeedbackComplete.js +3 -2
  43. package/dist/cjs/Message/UserFeedback/index.d.ts +2 -0
  44. package/dist/cjs/Message/UserFeedback/index.js +18 -0
  45. package/dist/cjs/Message/index.d.ts +8 -0
  46. package/dist/cjs/Message/index.js +8 -0
  47. package/dist/cjs/MessageBar/MessageBar.d.ts +6 -0
  48. package/dist/cjs/MessageBar/MessageBar.js +24 -12
  49. package/dist/cjs/MessageBar/MessageBar.test.js +12 -0
  50. package/dist/cjs/ResponseActions/ResponseActions.d.ts +4 -0
  51. package/dist/cjs/ResponseActions/ResponseActionsGroups.d.ts +13 -0
  52. package/dist/cjs/ResponseActions/ResponseActionsGroups.js +22 -0
  53. package/dist/cjs/ResponseActions/ResponseActionsGroups.test.d.ts +1 -0
  54. package/dist/cjs/ResponseActions/ResponseActionsGroups.test.js +25 -0
  55. package/dist/cjs/ResponseActions/index.d.ts +1 -0
  56. package/dist/cjs/ResponseActions/index.js +1 -0
  57. package/dist/css/main.css +13 -1
  58. package/dist/css/main.css.map +1 -1
  59. package/dist/esm/MarkdownContent/MarkdownContent.d.ts +7 -2
  60. package/dist/esm/Message/ErrorMessage/ErrorMessage.d.ts +15 -1
  61. package/dist/esm/Message/ErrorMessage/ErrorMessage.js +3 -3
  62. package/dist/esm/Message/ErrorMessage/ErrorMessage.test.d.ts +1 -0
  63. package/dist/esm/Message/ErrorMessage/ErrorMessage.test.js +25 -0
  64. package/dist/esm/Message/Message.d.ts +2 -0
  65. package/dist/esm/Message/Message.js +5 -5
  66. package/dist/esm/Message/MessageAndActions/MessageAndActions.d.ts +14 -0
  67. package/dist/esm/Message/MessageAndActions/MessageAndActions.js +18 -0
  68. package/dist/esm/Message/MessageAndActions/MessageAndActions.test.d.ts +1 -0
  69. package/dist/esm/Message/MessageAndActions/MessageAndActions.test.js +20 -0
  70. package/dist/esm/Message/MessageAndActions/index.d.ts +1 -0
  71. package/dist/esm/Message/MessageAndActions/index.js +1 -0
  72. package/dist/esm/Message/MessageAttachments/MessageAttachmentItem.d.ts +13 -0
  73. package/dist/esm/Message/MessageAttachments/MessageAttachmentItem.js +18 -0
  74. package/dist/esm/Message/MessageAttachments/MessageAttachmentItem.test.d.ts +1 -0
  75. package/dist/esm/Message/MessageAttachments/MessageAttachmentItem.test.js +20 -0
  76. package/dist/esm/Message/MessageAttachments/MessageAttachmentsContainer.d.ts +13 -0
  77. package/dist/esm/Message/MessageAttachments/MessageAttachmentsContainer.js +18 -0
  78. package/dist/esm/Message/MessageAttachments/MessageAttachmentsContainer.test.d.ts +1 -0
  79. package/dist/esm/Message/MessageAttachments/MessageAttachmentsContainer.test.js +20 -0
  80. package/dist/esm/Message/MessageAttachments/index.d.ts +2 -0
  81. package/dist/esm/Message/MessageAttachments/index.js +2 -0
  82. package/dist/esm/Message/MessageInput.d.ts +1 -1
  83. package/dist/esm/Message/MessageInput.js +1 -1
  84. package/dist/esm/Message/MessageLoading.d.ts +13 -4
  85. package/dist/esm/Message/MessageLoading.js +16 -4
  86. package/dist/esm/Message/MessageLoading.test.d.ts +1 -0
  87. package/dist/esm/Message/MessageLoading.test.js +20 -0
  88. package/dist/esm/Message/QuickResponse/QuickResponse.js +3 -2
  89. package/dist/esm/Message/QuickResponse/QuickResponse.test.d.ts +1 -0
  90. package/dist/esm/Message/QuickResponse/QuickResponse.test.js +104 -0
  91. package/dist/esm/Message/QuickResponse/index.d.ts +1 -0
  92. package/dist/esm/Message/QuickResponse/index.js +1 -0
  93. package/dist/esm/Message/QuickStarts/QuickStartTile.d.ts +1 -1
  94. package/dist/esm/Message/QuickStarts/QuickStartTile.js +1 -1
  95. package/dist/esm/Message/QuickStarts/index.d.ts +2 -0
  96. package/dist/esm/Message/QuickStarts/index.js +2 -0
  97. package/dist/esm/Message/UserFeedback/UserFeedback.d.ts +1 -1
  98. package/dist/esm/Message/UserFeedback/UserFeedback.js +1 -1
  99. package/dist/esm/Message/UserFeedback/UserFeedbackComplete.d.ts +1 -1
  100. package/dist/esm/Message/UserFeedback/UserFeedbackComplete.js +1 -2
  101. package/dist/esm/Message/UserFeedback/index.d.ts +2 -0
  102. package/dist/esm/Message/UserFeedback/index.js +2 -0
  103. package/dist/esm/Message/index.d.ts +8 -0
  104. package/dist/esm/Message/index.js +8 -0
  105. package/dist/esm/MessageBar/MessageBar.d.ts +6 -0
  106. package/dist/esm/MessageBar/MessageBar.js +24 -12
  107. package/dist/esm/MessageBar/MessageBar.test.js +12 -0
  108. package/dist/esm/ResponseActions/ResponseActions.d.ts +4 -0
  109. package/dist/esm/ResponseActions/ResponseActionsGroups.d.ts +13 -0
  110. package/dist/esm/ResponseActions/ResponseActionsGroups.js +18 -0
  111. package/dist/esm/ResponseActions/ResponseActionsGroups.test.d.ts +1 -0
  112. package/dist/esm/ResponseActions/ResponseActionsGroups.test.js +20 -0
  113. package/dist/esm/ResponseActions/index.d.ts +1 -0
  114. package/dist/esm/ResponseActions/index.js +1 -0
  115. package/dist/tsconfig.tsbuildinfo +1 -1
  116. package/package.json +1 -1
  117. package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithCustomStructure.tsx +102 -0
  118. package/patternfly-docs/content/extensions/chatbot/examples/Messages/Messages.md +55 -10
  119. package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotMessageBarCustomActions.tsx +190 -0
  120. package/patternfly-docs/content/extensions/chatbot/examples/UI/UI.md +15 -2
  121. package/src/MarkdownContent/MarkdownContent.tsx +7 -2
  122. package/src/Message/ErrorMessage/ErrorMessage.test.tsx +38 -0
  123. package/src/Message/ErrorMessage/ErrorMessage.tsx +17 -2
  124. package/src/Message/Message.tsx +75 -64
  125. package/src/Message/MessageAndActions/MessageAndActions.test.tsx +23 -0
  126. package/src/Message/MessageAndActions/MessageAndActions.tsx +22 -0
  127. package/src/Message/MessageAndActions/index.ts +1 -0
  128. package/src/Message/MessageAttachments/MessageAttachmentItem.test.tsx +23 -0
  129. package/src/Message/MessageAttachments/MessageAttachmentItem.tsx +25 -0
  130. package/src/Message/MessageAttachments/MessageAttachmentsContainer.test.tsx +23 -0
  131. package/src/Message/MessageAttachments/MessageAttachmentsContainer.tsx +25 -0
  132. package/src/Message/MessageAttachments/index.ts +2 -0
  133. package/src/Message/MessageInput.tsx +1 -1
  134. package/src/Message/MessageLoading.test.tsx +23 -0
  135. package/src/Message/MessageLoading.tsx +17 -2
  136. package/src/Message/QuickResponse/QuickResponse.test.tsx +131 -0
  137. package/src/Message/QuickResponse/QuickResponse.tsx +3 -2
  138. package/src/Message/QuickResponse/index.ts +1 -0
  139. package/src/Message/QuickStarts/QuickStartTile.tsx +1 -1
  140. package/src/Message/QuickStarts/index.ts +2 -0
  141. package/src/Message/UserFeedback/UserFeedback.tsx +1 -1
  142. package/src/Message/UserFeedback/UserFeedbackComplete.tsx +1 -4
  143. package/src/Message/UserFeedback/index.ts +2 -0
  144. package/src/Message/index.ts +8 -0
  145. package/src/MessageBar/MessageBar.scss +15 -1
  146. package/src/MessageBar/MessageBar.test.tsx +27 -0
  147. package/src/MessageBar/MessageBar.tsx +86 -50
  148. package/src/ResponseActions/ResponseActions.tsx +6 -0
  149. package/src/ResponseActions/ResponseActionsGroups.test.tsx +23 -0
  150. package/src/ResponseActions/ResponseActionsGroups.tsx +28 -0
  151. package/src/ResponseActions/index.ts +1 -0
@@ -58,6 +58,8 @@ export interface MessageBarProps extends Omit<TextAreaProps, 'innerRef'> {
58
58
  placeholder?: string;
59
59
  /** Flag to disable/enable the Attach button */
60
60
  hasAttachButton?: boolean;
61
+ /** Whether the attach button is rendered before or after the message input. */
62
+ attachButtonPosition?: 'start' | 'end';
61
63
  /** Flag to enable the Microphone button */
62
64
  hasMicrophoneButton?: boolean;
63
65
  /** Placeholder text when listening */
@@ -116,6 +118,10 @@ export interface MessageBarProps extends Omit<TextAreaProps, 'innerRef'> {
116
118
  innerRef?: React.Ref<HTMLTextAreaElement>;
117
119
  /** Sets background color to primary */
118
120
  isPrimary?: boolean;
121
+ /** Additional actions to render for the message bar. This will force a multiline layout, and the actions will render at the start of the container. */
122
+ additionalActions?: React.ReactNode;
123
+ /** Flag indicating whether a multiline layout for the message input and actions should be forced. This can be used to always render actions below the message input. */
124
+ forceMultilineLayout?: boolean;
119
125
  /** @beta Flag indicating whether the message bar has an AI indicator border. */
120
126
  hasAiIndicator?: boolean;
121
127
  /** @beta Flag indicating whether the chatbot is thinking in response to a query, adding an animation to the message bar. */
@@ -128,6 +134,7 @@ export const MessageBarBase: FunctionComponent<MessageBarProps> = ({
128
134
  alwayShowSendButton,
129
135
  placeholder = 'Send a message...',
130
136
  hasAttachButton = true,
137
+ attachButtonPosition = 'end',
131
138
  hasMicrophoneButton,
132
139
  listeningText = 'Listening',
133
140
  handleAttach,
@@ -151,6 +158,8 @@ export const MessageBarBase: FunctionComponent<MessageBarProps> = ({
151
158
  dropzoneProps,
152
159
  innerRef,
153
160
  isPrimary,
161
+ additionalActions,
162
+ forceMultilineLayout = false,
154
163
  hasAiIndicator,
155
164
  isThinking,
156
165
  ...props
@@ -161,7 +170,9 @@ export const MessageBarBase: FunctionComponent<MessageBarProps> = ({
161
170
  const [isListeningMessage, setIsListeningMessage] = useState<boolean>(false);
162
171
  const [hasSentMessage, setHasSentMessage] = useState(false);
163
172
  const [isComposing, setIsComposing] = useState(false);
164
- const [isMultiline, setIsMultiline] = useState(false);
173
+
174
+ const shouldForceMultiline = forceMultilineLayout || additionalActions;
175
+ const [isMultiline, setIsMultiline] = useState(shouldForceMultiline);
165
176
  const inputRef = useRef<HTMLTextAreaElement>(null);
166
177
  const textareaRef = (innerRef as React.RefObject<HTMLTextAreaElement>) ?? inputRef;
167
178
  const attachButtonRef = useRef<HTMLButtonElement>(null);
@@ -178,7 +189,7 @@ export const MessageBarBase: FunctionComponent<MessageBarProps> = ({
178
189
 
179
190
  const grandparent = parent.parentElement;
180
191
  if (grandparent) {
181
- grandparent.style.setProperty('flex-basis', 'auto');
192
+ grandparent.style.setProperty('flex-basis', shouldForceMultiline ? '100%' : 'auto');
182
193
  }
183
194
  }
184
195
  };
@@ -227,7 +238,7 @@ export const MessageBarBase: FunctionComponent<MessageBarProps> = ({
227
238
  const parent = field.parentElement;
228
239
  if (parent) {
229
240
  const grandparent = parent.parentElement;
230
- if (textIsLongerThan2Lines(field) && grandparent) {
241
+ if ((textIsLongerThan2Lines(field) || shouldForceMultiline) && grandparent) {
231
242
  grandparent.style.setProperty('flex-basis', `100%`);
232
243
  }
233
244
  }
@@ -277,14 +288,14 @@ export const MessageBarBase: FunctionComponent<MessageBarProps> = ({
277
288
  if (field) {
278
289
  if (field.value === '') {
279
290
  setInitialLineHeight(field);
280
- setIsMultiline(false);
291
+ !shouldForceMultiline && setIsMultiline(false);
281
292
  } else {
282
293
  setAutoHeight(field);
283
294
  setAutoWidth(field);
284
- checkIfMultiline(field);
295
+ !shouldForceMultiline && checkIfMultiline(field);
285
296
  }
286
297
  }
287
- }, [displayMode, message, setAutoWidth, checkIfMultiline]);
298
+ }, [displayMode, message, setAutoWidth, shouldForceMultiline, checkIfMultiline]);
288
299
 
289
300
  useEffect(() => {
290
301
  const field = textareaRef.current;
@@ -300,10 +311,10 @@ export const MessageBarBase: FunctionComponent<MessageBarProps> = ({
300
311
  if (textareaRef.current) {
301
312
  if (event.target.value === '') {
302
313
  setInitialLineHeight(textareaRef.current);
303
- setIsMultiline(false);
314
+ !shouldForceMultiline && setIsMultiline(false);
304
315
  } else {
305
316
  setAutoHeight(textareaRef.current);
306
- checkIfMultiline(textareaRef.current);
317
+ !shouldForceMultiline && checkIfMultiline(textareaRef.current);
307
318
  }
308
319
  }
309
320
  setMessage(event.target.value);
@@ -365,6 +376,55 @@ export const MessageBarBase: FunctionComponent<MessageBarProps> = ({
365
376
  onChange && onChange({} as ChangeEvent<HTMLTextAreaElement>, message);
366
377
  };
367
378
 
379
+ const renderAttachButton = () => {
380
+ if (!attachMenuProps && hasAttachButton) {
381
+ return (
382
+ <AttachButton
383
+ onAttachAccepted={handleAttach}
384
+ isDisabled={isListeningMessage}
385
+ tooltipContent={buttonProps?.attach?.tooltipContent}
386
+ inputTestId={buttonProps?.attach?.inputTestId}
387
+ isCompact={isCompact}
388
+ tooltipProps={buttonProps?.attach?.tooltipProps}
389
+ allowedFileTypes={allowedFileTypes}
390
+ minSize={minSize}
391
+ maxSize={maxSize}
392
+ maxFiles={maxFiles}
393
+ isAttachmentDisabled={isAttachmentDisabled}
394
+ onAttach={onAttach}
395
+ onAttachRejected={onAttachRejected}
396
+ validator={validator}
397
+ dropzoneProps={dropzoneProps}
398
+ {...buttonProps?.attach}
399
+ {...buttonProps?.attach?.props}
400
+ />
401
+ );
402
+ }
403
+ if (attachMenuProps) {
404
+ return (
405
+ <AttachButton
406
+ ref={attachButtonRef}
407
+ onClick={handleAttachMenuToggle}
408
+ isDisabled={isListeningMessage}
409
+ tooltipContent={buttonProps?.attach?.tooltipContent}
410
+ isCompact={isCompact}
411
+ tooltipProps={buttonProps?.attach?.tooltipProps}
412
+ allowedFileTypes={allowedFileTypes}
413
+ minSize={minSize}
414
+ maxSize={maxSize}
415
+ maxFiles={maxFiles}
416
+ isAttachmentDisabled={isAttachmentDisabled}
417
+ onAttach={onAttach}
418
+ onAttachRejected={onAttachRejected}
419
+ validator={validator}
420
+ dropzoneProps={dropzoneProps}
421
+ {...buttonProps?.attach}
422
+ />
423
+ );
424
+ }
425
+ };
426
+
427
+ const isAttachButtonAtStart = attachButtonPosition === 'start';
368
428
  const renderButtons = () => {
369
429
  if (hasStopButton && handleStopButton) {
370
430
  return (
@@ -379,47 +439,7 @@ export const MessageBarBase: FunctionComponent<MessageBarProps> = ({
379
439
  }
380
440
  return (
381
441
  <>
382
- {attachMenuProps && (
383
- <AttachButton
384
- ref={attachButtonRef}
385
- onClick={handleAttachMenuToggle}
386
- isDisabled={isListeningMessage}
387
- tooltipContent={buttonProps?.attach?.tooltipContent}
388
- isCompact={isCompact}
389
- tooltipProps={buttonProps?.attach?.tooltipProps}
390
- allowedFileTypes={allowedFileTypes}
391
- minSize={minSize}
392
- maxSize={maxSize}
393
- maxFiles={maxFiles}
394
- isAttachmentDisabled={isAttachmentDisabled}
395
- onAttach={onAttach}
396
- onAttachRejected={onAttachRejected}
397
- validator={validator}
398
- dropzoneProps={dropzoneProps}
399
- {...buttonProps?.attach}
400
- />
401
- )}
402
- {!attachMenuProps && hasAttachButton && (
403
- <AttachButton
404
- onAttachAccepted={handleAttach}
405
- isDisabled={isListeningMessage}
406
- tooltipContent={buttonProps?.attach?.tooltipContent}
407
- inputTestId={buttonProps?.attach?.inputTestId}
408
- isCompact={isCompact}
409
- tooltipProps={buttonProps?.attach?.tooltipProps}
410
- allowedFileTypes={allowedFileTypes}
411
- minSize={minSize}
412
- maxSize={maxSize}
413
- maxFiles={maxFiles}
414
- isAttachmentDisabled={isAttachmentDisabled}
415
- onAttach={onAttach}
416
- onAttachRejected={onAttachRejected}
417
- validator={validator}
418
- dropzoneProps={dropzoneProps}
419
- {...buttonProps?.attach}
420
- {...buttonProps?.attach?.props}
421
- />
422
- )}
442
+ {!isAttachButtonAtStart && renderAttachButton()}
423
443
  {hasMicrophoneButton && (
424
444
  <MicrophoneButton
425
445
  isListening={isListeningMessage}
@@ -447,8 +467,12 @@ export const MessageBarBase: FunctionComponent<MessageBarProps> = ({
447
467
  );
448
468
  };
449
469
 
470
+ const hasGroupedActions = additionalActions || (isAttachButtonAtStart && isMultiline);
450
471
  const messageBarContents = (
451
472
  <>
473
+ {isAttachButtonAtStart && !isMultiline && (
474
+ <div className="pf-chatbot__message-bar-actions test">{renderAttachButton()}</div>
475
+ )}
452
476
  <div className={`pf-chatbot__message-bar-input ${isCompact ? 'pf-m-compact' : ''}`}>
453
477
  <TextArea
454
478
  className="pf-chatbot__message-textarea"
@@ -463,7 +487,19 @@ export const MessageBarBase: FunctionComponent<MessageBarProps> = ({
463
487
  {...props}
464
488
  />
465
489
  </div>
466
- <div className="pf-chatbot__message-bar-actions">{renderButtons()}</div>
490
+ <div className={css('pf-chatbot__message-bar-actions', hasGroupedActions && 'pf-m-grouped')}>
491
+ {hasGroupedActions ? (
492
+ <>
493
+ <div className={css('pf-chatbot__message-bar-actions-group')}>
494
+ {isAttachButtonAtStart && renderAttachButton()}
495
+ {additionalActions}
496
+ </div>
497
+ <div className={css('pf-chatbot__message-bar-actions-group')}>{renderButtons()}</div>
498
+ </>
499
+ ) : (
500
+ renderButtons()
501
+ )}
502
+ </div>
467
503
  </>
468
504
  );
469
505
 
@@ -42,6 +42,12 @@ export interface ActionProps extends Omit<ButtonProps, 'ref'> {
42
42
  type ExtendedActionProps = ActionProps & {
43
43
  [key: string]: any;
44
44
  };
45
+
46
+ /**
47
+ * The various actions that can be attached to a bot message for users to interact with.
48
+ * Use this component when passing children to Message to customize its structure.
49
+ */
50
+
45
51
  export interface ResponseActionProps {
46
52
  /** Props for message actions, such as feedback (positive or negative), copy button, share, and listen */
47
53
  actions: Record<string, ExtendedActionProps | undefined> & {
@@ -0,0 +1,23 @@
1
+ import '@testing-library/jest-dom';
2
+ import { render, screen } from '@testing-library/react';
3
+ import ResponseActionsGroups from './ResponseActionsGroups';
4
+
5
+ test('Renders with children', () => {
6
+ render(<ResponseActionsGroups>Test content</ResponseActionsGroups>);
7
+ expect(screen.getByText('Test content')).toBeInTheDocument();
8
+ });
9
+
10
+ test('Renders with pf-chatbot__response-actions-groups class by default', () => {
11
+ render(<ResponseActionsGroups>Test content</ResponseActionsGroups>);
12
+ expect(screen.getByText('Test content')).toHaveClass('pf-chatbot__response-actions-groups', { exact: true });
13
+ });
14
+
15
+ test('Renders with custom className', () => {
16
+ render(<ResponseActionsGroups className="custom-class">Test content</ResponseActionsGroups>);
17
+ expect(screen.getByText('Test content')).toHaveClass('custom-class');
18
+ });
19
+
20
+ test('Spreads additional props', () => {
21
+ render(<ResponseActionsGroups id="test-id">Test content</ResponseActionsGroups>);
22
+ expect(screen.getByText('Test content')).toHaveAttribute('id', 'test-id');
23
+ });
@@ -0,0 +1,28 @@
1
+ // ============================================================================
2
+ // Response Actions Groups - Container for multiple action groups
3
+ // ============================================================================
4
+ import { FunctionComponent, HTMLProps, ReactNode } from 'react';
5
+ import { css } from '@patternfly/react-styles';
6
+
7
+ /**
8
+ * The container for grouping multiple related ResponseActions components, typically used for having different persistence states amongst groups.
9
+ * Use this component when passing children to Message to customize its structure.
10
+ */
11
+ export interface ResponseActionsGroupsProps extends HTMLProps<HTMLDivElement> {
12
+ /** Content to render inside the response actions groups container */
13
+ children: ReactNode;
14
+ /** Additional classes applied to the response actions groups container. */
15
+ className?: string;
16
+ }
17
+
18
+ export const ResponseActionsGroups: FunctionComponent<ResponseActionsGroupsProps> = ({
19
+ children,
20
+ className,
21
+ ...props
22
+ }) => (
23
+ <div className={css('pf-chatbot__response-actions-groups', className)} {...props}>
24
+ {children}
25
+ </div>
26
+ );
27
+
28
+ export default ResponseActionsGroups;
@@ -1,3 +1,4 @@
1
1
  export { default } from './ResponseActions';
2
2
 
3
3
  export * from './ResponseActions';
4
+ export * from './ResponseActionsGroups';