@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.
- package/dist/cjs/MarkdownContent/MarkdownContent.d.ts +7 -2
- package/dist/cjs/Message/ErrorMessage/ErrorMessage.d.ts +15 -1
- package/dist/cjs/Message/ErrorMessage/ErrorMessage.js +5 -3
- package/dist/cjs/Message/ErrorMessage/ErrorMessage.test.d.ts +1 -0
- package/dist/cjs/Message/ErrorMessage/ErrorMessage.test.js +30 -0
- package/dist/cjs/Message/Message.d.ts +2 -0
- package/dist/cjs/Message/Message.js +5 -5
- package/dist/cjs/Message/MessageAndActions/MessageAndActions.d.ts +14 -0
- package/dist/cjs/Message/MessageAndActions/MessageAndActions.js +22 -0
- package/dist/cjs/Message/MessageAndActions/MessageAndActions.test.d.ts +1 -0
- package/dist/cjs/Message/MessageAndActions/MessageAndActions.test.js +25 -0
- package/dist/cjs/Message/MessageAndActions/index.d.ts +1 -0
- package/dist/cjs/Message/MessageAndActions/index.js +17 -0
- package/dist/cjs/Message/MessageAttachments/MessageAttachmentItem.d.ts +13 -0
- package/dist/cjs/Message/MessageAttachments/MessageAttachmentItem.js +22 -0
- package/dist/cjs/Message/MessageAttachments/MessageAttachmentItem.test.d.ts +1 -0
- package/dist/cjs/Message/MessageAttachments/MessageAttachmentItem.test.js +25 -0
- package/dist/cjs/Message/MessageAttachments/MessageAttachmentsContainer.d.ts +13 -0
- package/dist/cjs/Message/MessageAttachments/MessageAttachmentsContainer.js +22 -0
- package/dist/cjs/Message/MessageAttachments/MessageAttachmentsContainer.test.d.ts +1 -0
- package/dist/cjs/Message/MessageAttachments/MessageAttachmentsContainer.test.js +25 -0
- package/dist/cjs/Message/MessageAttachments/index.d.ts +2 -0
- package/dist/cjs/Message/MessageAttachments/index.js +18 -0
- package/dist/cjs/Message/MessageInput.d.ts +1 -1
- package/dist/cjs/Message/MessageInput.js +3 -1
- package/dist/cjs/Message/MessageLoading.d.ts +13 -4
- package/dist/cjs/Message/MessageLoading.js +19 -5
- package/dist/cjs/Message/MessageLoading.test.d.ts +1 -0
- package/dist/cjs/Message/MessageLoading.test.js +25 -0
- package/dist/cjs/Message/QuickResponse/QuickResponse.js +3 -2
- package/dist/cjs/Message/QuickResponse/QuickResponse.test.d.ts +1 -0
- package/dist/cjs/Message/QuickResponse/QuickResponse.test.js +109 -0
- package/dist/cjs/Message/QuickResponse/index.d.ts +1 -0
- package/dist/cjs/Message/QuickResponse/index.js +17 -0
- package/dist/cjs/Message/QuickStarts/QuickStartTile.d.ts +1 -1
- package/dist/cjs/Message/QuickStarts/QuickStartTile.js +3 -2
- package/dist/cjs/Message/QuickStarts/index.d.ts +2 -0
- package/dist/cjs/Message/QuickStarts/index.js +18 -0
- package/dist/cjs/Message/UserFeedback/UserFeedback.d.ts +1 -1
- package/dist/cjs/Message/UserFeedback/UserFeedback.js +3 -1
- package/dist/cjs/Message/UserFeedback/UserFeedbackComplete.d.ts +1 -1
- package/dist/cjs/Message/UserFeedback/UserFeedbackComplete.js +3 -2
- package/dist/cjs/Message/UserFeedback/index.d.ts +2 -0
- package/dist/cjs/Message/UserFeedback/index.js +18 -0
- package/dist/cjs/Message/index.d.ts +8 -0
- package/dist/cjs/Message/index.js +8 -0
- package/dist/cjs/MessageBar/MessageBar.d.ts +6 -0
- package/dist/cjs/MessageBar/MessageBar.js +24 -12
- package/dist/cjs/MessageBar/MessageBar.test.js +12 -0
- package/dist/cjs/ResponseActions/ResponseActions.d.ts +4 -0
- package/dist/cjs/ResponseActions/ResponseActionsGroups.d.ts +13 -0
- package/dist/cjs/ResponseActions/ResponseActionsGroups.js +22 -0
- package/dist/cjs/ResponseActions/ResponseActionsGroups.test.d.ts +1 -0
- package/dist/cjs/ResponseActions/ResponseActionsGroups.test.js +25 -0
- package/dist/cjs/ResponseActions/index.d.ts +1 -0
- package/dist/cjs/ResponseActions/index.js +1 -0
- package/dist/css/main.css +13 -1
- package/dist/css/main.css.map +1 -1
- package/dist/esm/MarkdownContent/MarkdownContent.d.ts +7 -2
- package/dist/esm/Message/ErrorMessage/ErrorMessage.d.ts +15 -1
- package/dist/esm/Message/ErrorMessage/ErrorMessage.js +3 -3
- package/dist/esm/Message/ErrorMessage/ErrorMessage.test.d.ts +1 -0
- package/dist/esm/Message/ErrorMessage/ErrorMessage.test.js +25 -0
- package/dist/esm/Message/Message.d.ts +2 -0
- package/dist/esm/Message/Message.js +5 -5
- package/dist/esm/Message/MessageAndActions/MessageAndActions.d.ts +14 -0
- package/dist/esm/Message/MessageAndActions/MessageAndActions.js +18 -0
- package/dist/esm/Message/MessageAndActions/MessageAndActions.test.d.ts +1 -0
- package/dist/esm/Message/MessageAndActions/MessageAndActions.test.js +20 -0
- package/dist/esm/Message/MessageAndActions/index.d.ts +1 -0
- package/dist/esm/Message/MessageAndActions/index.js +1 -0
- package/dist/esm/Message/MessageAttachments/MessageAttachmentItem.d.ts +13 -0
- package/dist/esm/Message/MessageAttachments/MessageAttachmentItem.js +18 -0
- package/dist/esm/Message/MessageAttachments/MessageAttachmentItem.test.d.ts +1 -0
- package/dist/esm/Message/MessageAttachments/MessageAttachmentItem.test.js +20 -0
- package/dist/esm/Message/MessageAttachments/MessageAttachmentsContainer.d.ts +13 -0
- package/dist/esm/Message/MessageAttachments/MessageAttachmentsContainer.js +18 -0
- package/dist/esm/Message/MessageAttachments/MessageAttachmentsContainer.test.d.ts +1 -0
- package/dist/esm/Message/MessageAttachments/MessageAttachmentsContainer.test.js +20 -0
- package/dist/esm/Message/MessageAttachments/index.d.ts +2 -0
- package/dist/esm/Message/MessageAttachments/index.js +2 -0
- package/dist/esm/Message/MessageInput.d.ts +1 -1
- package/dist/esm/Message/MessageInput.js +1 -1
- package/dist/esm/Message/MessageLoading.d.ts +13 -4
- package/dist/esm/Message/MessageLoading.js +16 -4
- package/dist/esm/Message/MessageLoading.test.d.ts +1 -0
- package/dist/esm/Message/MessageLoading.test.js +20 -0
- package/dist/esm/Message/QuickResponse/QuickResponse.js +3 -2
- package/dist/esm/Message/QuickResponse/QuickResponse.test.d.ts +1 -0
- package/dist/esm/Message/QuickResponse/QuickResponse.test.js +104 -0
- package/dist/esm/Message/QuickResponse/index.d.ts +1 -0
- package/dist/esm/Message/QuickResponse/index.js +1 -0
- package/dist/esm/Message/QuickStarts/QuickStartTile.d.ts +1 -1
- package/dist/esm/Message/QuickStarts/QuickStartTile.js +1 -1
- package/dist/esm/Message/QuickStarts/index.d.ts +2 -0
- package/dist/esm/Message/QuickStarts/index.js +2 -0
- package/dist/esm/Message/UserFeedback/UserFeedback.d.ts +1 -1
- package/dist/esm/Message/UserFeedback/UserFeedback.js +1 -1
- package/dist/esm/Message/UserFeedback/UserFeedbackComplete.d.ts +1 -1
- package/dist/esm/Message/UserFeedback/UserFeedbackComplete.js +1 -2
- package/dist/esm/Message/UserFeedback/index.d.ts +2 -0
- package/dist/esm/Message/UserFeedback/index.js +2 -0
- package/dist/esm/Message/index.d.ts +8 -0
- package/dist/esm/Message/index.js +8 -0
- package/dist/esm/MessageBar/MessageBar.d.ts +6 -0
- package/dist/esm/MessageBar/MessageBar.js +24 -12
- package/dist/esm/MessageBar/MessageBar.test.js +12 -0
- package/dist/esm/ResponseActions/ResponseActions.d.ts +4 -0
- package/dist/esm/ResponseActions/ResponseActionsGroups.d.ts +13 -0
- package/dist/esm/ResponseActions/ResponseActionsGroups.js +18 -0
- package/dist/esm/ResponseActions/ResponseActionsGroups.test.d.ts +1 -0
- package/dist/esm/ResponseActions/ResponseActionsGroups.test.js +20 -0
- package/dist/esm/ResponseActions/index.d.ts +1 -0
- package/dist/esm/ResponseActions/index.js +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithCustomStructure.tsx +102 -0
- package/patternfly-docs/content/extensions/chatbot/examples/Messages/Messages.md +55 -10
- package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotMessageBarCustomActions.tsx +190 -0
- package/patternfly-docs/content/extensions/chatbot/examples/UI/UI.md +15 -2
- package/src/MarkdownContent/MarkdownContent.tsx +7 -2
- package/src/Message/ErrorMessage/ErrorMessage.test.tsx +38 -0
- package/src/Message/ErrorMessage/ErrorMessage.tsx +17 -2
- package/src/Message/Message.tsx +75 -64
- package/src/Message/MessageAndActions/MessageAndActions.test.tsx +23 -0
- package/src/Message/MessageAndActions/MessageAndActions.tsx +22 -0
- package/src/Message/MessageAndActions/index.ts +1 -0
- package/src/Message/MessageAttachments/MessageAttachmentItem.test.tsx +23 -0
- package/src/Message/MessageAttachments/MessageAttachmentItem.tsx +25 -0
- package/src/Message/MessageAttachments/MessageAttachmentsContainer.test.tsx +23 -0
- package/src/Message/MessageAttachments/MessageAttachmentsContainer.tsx +25 -0
- package/src/Message/MessageAttachments/index.ts +2 -0
- package/src/Message/MessageInput.tsx +1 -1
- package/src/Message/MessageLoading.test.tsx +23 -0
- package/src/Message/MessageLoading.tsx +17 -2
- package/src/Message/QuickResponse/QuickResponse.test.tsx +131 -0
- package/src/Message/QuickResponse/QuickResponse.tsx +3 -2
- package/src/Message/QuickResponse/index.ts +1 -0
- package/src/Message/QuickStarts/QuickStartTile.tsx +1 -1
- package/src/Message/QuickStarts/index.ts +2 -0
- package/src/Message/UserFeedback/UserFeedback.tsx +1 -1
- package/src/Message/UserFeedback/UserFeedbackComplete.tsx +1 -4
- package/src/Message/UserFeedback/index.ts +2 -0
- package/src/Message/index.ts +8 -0
- package/src/MessageBar/MessageBar.scss +15 -1
- package/src/MessageBar/MessageBar.test.tsx +27 -0
- package/src/MessageBar/MessageBar.tsx +86 -50
- package/src/ResponseActions/ResponseActions.tsx +6 -0
- package/src/ResponseActions/ResponseActionsGroups.test.tsx +23 -0
- package/src/ResponseActions/ResponseActionsGroups.tsx +28 -0
- 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
|
-
|
|
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
|
-
{
|
|
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=
|
|
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;
|