@patternfly/chatbot 2.2.0-prerelease.20 → 2.2.0-prerelease.22

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 (53) hide show
  1. package/dist/cjs/Message/Message.d.ts +3 -0
  2. package/dist/cjs/Message/Message.js +22 -5
  3. package/dist/cjs/Message/Message.test.js +94 -0
  4. package/dist/cjs/Message/TableMessage/TableMessage.d.ts +20 -0
  5. package/dist/cjs/Message/TableMessage/TableMessage.js +67 -0
  6. package/dist/cjs/Message/TableMessage/TbodyMessage.d.ts +7 -0
  7. package/dist/cjs/Message/TableMessage/TbodyMessage.js +33 -0
  8. package/dist/cjs/Message/TableMessage/TdMessage.d.ts +5 -0
  9. package/dist/cjs/Message/TableMessage/TdMessage.js +26 -0
  10. package/dist/cjs/Message/TableMessage/ThMessage.d.ts +5 -0
  11. package/dist/cjs/Message/TableMessage/ThMessage.js +26 -0
  12. package/dist/cjs/Message/TableMessage/TheadMessage.d.ts +5 -0
  13. package/dist/cjs/Message/TableMessage/TheadMessage.js +26 -0
  14. package/dist/cjs/Message/TableMessage/TrMessage.d.ts +7 -0
  15. package/dist/cjs/Message/TableMessage/TrMessage.js +37 -0
  16. package/dist/cjs/MessageBar/MessageBar.d.ts +4 -1
  17. package/dist/cjs/MessageBar/MessageBar.js +125 -39
  18. package/dist/css/main.css +59 -17
  19. package/dist/css/main.css.map +1 -1
  20. package/dist/esm/Message/Message.d.ts +3 -0
  21. package/dist/esm/Message/Message.js +22 -5
  22. package/dist/esm/Message/Message.test.js +94 -0
  23. package/dist/esm/Message/TableMessage/TableMessage.d.ts +20 -0
  24. package/dist/esm/Message/TableMessage/TableMessage.js +62 -0
  25. package/dist/esm/Message/TableMessage/TbodyMessage.d.ts +7 -0
  26. package/dist/esm/Message/TableMessage/TbodyMessage.js +28 -0
  27. package/dist/esm/Message/TableMessage/TdMessage.d.ts +5 -0
  28. package/dist/esm/Message/TableMessage/TdMessage.js +21 -0
  29. package/dist/esm/Message/TableMessage/ThMessage.d.ts +5 -0
  30. package/dist/esm/Message/TableMessage/ThMessage.js +21 -0
  31. package/dist/esm/Message/TableMessage/TheadMessage.d.ts +5 -0
  32. package/dist/esm/Message/TableMessage/TheadMessage.js +21 -0
  33. package/dist/esm/Message/TableMessage/TrMessage.d.ts +7 -0
  34. package/dist/esm/Message/TableMessage/TrMessage.js +32 -0
  35. package/dist/esm/MessageBar/MessageBar.d.ts +4 -1
  36. package/dist/esm/MessageBar/MessageBar.js +125 -39
  37. package/dist/tsconfig.tsbuildinfo +1 -1
  38. package/package.json +1 -1
  39. package/patternfly-docs/content/extensions/chatbot/examples/Messages/BotMessage.tsx +27 -1
  40. package/patternfly-docs/content/extensions/chatbot/examples/Messages/UserMessage.tsx +27 -1
  41. package/src/Message/Message.test.tsx +99 -0
  42. package/src/Message/Message.tsx +25 -4
  43. package/src/Message/TableMessage/TableMessage.scss +23 -0
  44. package/src/Message/TableMessage/TableMessage.tsx +83 -0
  45. package/src/Message/TableMessage/TbodyMessage.tsx +20 -0
  46. package/src/Message/TableMessage/TdMessage.tsx +11 -0
  47. package/src/Message/TableMessage/ThMessage.tsx +11 -0
  48. package/src/Message/TableMessage/TheadMessage.tsx +11 -0
  49. package/src/Message/TableMessage/TrMessage.tsx +27 -0
  50. package/src/Message/TextMessage/TextMessage.scss +5 -0
  51. package/src/MessageBar/MessageBar.scss +35 -18
  52. package/src/MessageBar/MessageBar.tsx +144 -53
  53. package/src/main.scss +1 -0
@@ -0,0 +1,7 @@
1
+ import React from 'react';
2
+ import { ExtraProps } from 'react-markdown';
3
+ import { TbodyProps } from '@patternfly/react-table';
4
+ declare const TbodyProps: ({ children, ...props }: TbodyProps & ExtraProps & {
5
+ extraHeaders?: string[];
6
+ }) => React.JSX.Element;
7
+ export default TbodyProps;
@@ -0,0 +1,28 @@
1
+ // ============================================================================
2
+ // Chatbot Main - Message - Content - Table
3
+ // ============================================================================
4
+ var __rest = (this && this.__rest) || function (s, e) {
5
+ var t = {};
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
7
+ t[p] = s[p];
8
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
9
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
10
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
11
+ t[p[i]] = s[p[i]];
12
+ }
13
+ return t;
14
+ };
15
+ import React from 'react';
16
+ import { Tbody } from '@patternfly/react-table';
17
+ const TbodyProps = (_a) => {
18
+ var { children } = _a, props = __rest(_a, ["children"]);
19
+ // passthrough so we can place dataLabel on tds
20
+ const modifyChildren = (children) => {
21
+ if (children && props.extraHeaders) {
22
+ return React.Children.map(children, (child) => React.cloneElement(child, { extraHeaders: props.extraHeaders }));
23
+ }
24
+ return children;
25
+ };
26
+ return React.createElement(Tbody, Object.assign({}, props), modifyChildren(children));
27
+ };
28
+ export default TbodyProps;
@@ -0,0 +1,5 @@
1
+ import React from 'react';
2
+ import { ExtraProps } from 'react-markdown';
3
+ import { TdProps } from '@patternfly/react-table';
4
+ declare const TdMessage: ({ children, ...props }: TdProps & ExtraProps) => React.JSX.Element;
5
+ export default TdMessage;
@@ -0,0 +1,21 @@
1
+ // ============================================================================
2
+ // Chatbot Main - Message - Content - Table
3
+ // ============================================================================
4
+ var __rest = (this && this.__rest) || function (s, e) {
5
+ var t = {};
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
7
+ t[p] = s[p];
8
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
9
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
10
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
11
+ t[p[i]] = s[p[i]];
12
+ }
13
+ return t;
14
+ };
15
+ import React from 'react';
16
+ import { Td } from '@patternfly/react-table';
17
+ const TdMessage = (_a) => {
18
+ var { children } = _a, props = __rest(_a, ["children"]);
19
+ return React.createElement(Td, Object.assign({}, props), children);
20
+ };
21
+ export default TdMessage;
@@ -0,0 +1,5 @@
1
+ import React from 'react';
2
+ import { ExtraProps } from 'react-markdown';
3
+ import { ThProps } from '@patternfly/react-table';
4
+ declare const ThMessage: ({ children, ...props }: ThProps & ExtraProps) => React.JSX.Element;
5
+ export default ThMessage;
@@ -0,0 +1,21 @@
1
+ // ============================================================================
2
+ // Chatbot Main - Message - Content - Table
3
+ // ============================================================================
4
+ var __rest = (this && this.__rest) || function (s, e) {
5
+ var t = {};
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
7
+ t[p] = s[p];
8
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
9
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
10
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
11
+ t[p[i]] = s[p[i]];
12
+ }
13
+ return t;
14
+ };
15
+ import React from 'react';
16
+ import { Th } from '@patternfly/react-table';
17
+ const ThMessage = (_a) => {
18
+ var { children } = _a, props = __rest(_a, ["children"]);
19
+ return React.createElement(Th, Object.assign({}, props), children);
20
+ };
21
+ export default ThMessage;
@@ -0,0 +1,5 @@
1
+ import React from 'react';
2
+ import { ExtraProps } from 'react-markdown';
3
+ import { TheadProps } from '@patternfly/react-table';
4
+ declare const TheadMessage: ({ children, ...props }: TheadProps & ExtraProps) => React.JSX.Element;
5
+ export default TheadMessage;
@@ -0,0 +1,21 @@
1
+ // ============================================================================
2
+ // Chatbot Main - Message - Content - Table
3
+ // ============================================================================
4
+ var __rest = (this && this.__rest) || function (s, e) {
5
+ var t = {};
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
7
+ t[p] = s[p];
8
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
9
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
10
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
11
+ t[p[i]] = s[p[i]];
12
+ }
13
+ return t;
14
+ };
15
+ import React from 'react';
16
+ import { Thead } from '@patternfly/react-table';
17
+ const TheadMessage = (_a) => {
18
+ var { children } = _a, props = __rest(_a, ["children"]);
19
+ return React.createElement(Thead, Object.assign({}, props), children);
20
+ };
21
+ export default TheadMessage;
@@ -0,0 +1,7 @@
1
+ import React from 'react';
2
+ import { ExtraProps } from 'react-markdown';
3
+ import { TrProps } from '@patternfly/react-table';
4
+ declare const TrMessage: ({ children, ...props }: TrProps & ExtraProps & {
5
+ extraHeaders?: string[];
6
+ }) => React.JSX.Element;
7
+ export default TrMessage;
@@ -0,0 +1,32 @@
1
+ // ============================================================================
2
+ // Chatbot Main - Message - Content - Table
3
+ // ============================================================================
4
+ var __rest = (this && this.__rest) || function (s, e) {
5
+ var t = {};
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
7
+ t[p] = s[p];
8
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
9
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
10
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
11
+ t[p[i]] = s[p[i]];
12
+ }
13
+ return t;
14
+ };
15
+ import React from 'react';
16
+ import { Tr } from '@patternfly/react-table';
17
+ const TrMessage = (_a) => {
18
+ var { children } = _a, props = __rest(_a, ["children"]);
19
+ let tdIndex = 0;
20
+ // passthrough so we can place dataLabel on tds
21
+ // places column name on correct child
22
+ const modifyChildren = (children) => React.Children.map(children, (child) => {
23
+ if (child.type.name === 'td' && props.extraHeaders) {
24
+ const clonedChild = React.cloneElement(child, { dataLabel: props.extraHeaders[tdIndex] });
25
+ tdIndex = tdIndex + 1;
26
+ return clonedChild;
27
+ }
28
+ return child;
29
+ });
30
+ return React.createElement(Tr, Object.assign({}, props), modifyChildren(children));
31
+ };
32
+ export default TrMessage;
@@ -1,5 +1,6 @@
1
1
  import React from 'react';
2
2
  import { ButtonProps, DropEvent } from '@patternfly/react-core';
3
+ import { ChatbotDisplayMode } from '../Chatbot';
3
4
  export interface MessageBarWithAttachMenuProps {
4
5
  /** Flag to enable whether attach menu is open */
5
6
  isAttachMenuOpen: boolean;
@@ -66,7 +67,9 @@ export interface MessageBarProps {
66
67
  };
67
68
  };
68
69
  /** A callback for when the text area value changes. */
69
- onChange?: (event: React.ChangeEvent<HTMLDivElement>, value: string) => void;
70
+ onChange?: (event: React.ChangeEvent<HTMLTextAreaElement>, value: string) => void;
71
+ /** Display mode of chatbot, if you want to message bar to resize when the display mode changes */
72
+ displayMode?: ChatbotDisplayMode;
70
73
  }
71
74
  export declare const MessageBar: React.FunctionComponent<MessageBarProps>;
72
75
  export default MessageBar;
@@ -10,52 +10,144 @@ var __rest = (this && this.__rest) || function (s, e) {
10
10
  return t;
11
11
  };
12
12
  import React from 'react';
13
+ import { TextArea } from '@patternfly/react-core';
13
14
  // Import Chatbot components
14
15
  import SendButton from './SendButton';
15
16
  import MicrophoneButton from './MicrophoneButton';
16
17
  import { AttachButton } from './AttachButton';
17
18
  import AttachMenu from '../AttachMenu';
18
19
  import StopButton from './StopButton';
19
- import DOMPurify from 'dompurify';
20
20
  export const MessageBar = (_a) => {
21
- var { onSendMessage, className, alwayShowSendButton, hasAttachButton = true, hasMicrophoneButton, handleAttach, attachMenuProps, isSendButtonDisabled, handleStopButton, hasStopButton, buttonProps, onChange } = _a, props = __rest(_a, ["onSendMessage", "className", "alwayShowSendButton", "hasAttachButton", "hasMicrophoneButton", "handleAttach", "attachMenuProps", "isSendButtonDisabled", "handleStopButton", "hasStopButton", "buttonProps", "onChange"]);
21
+ var { onSendMessage, className, alwayShowSendButton, hasAttachButton = true, hasMicrophoneButton, handleAttach, attachMenuProps, isSendButtonDisabled, handleStopButton, hasStopButton, buttonProps, onChange, displayMode } = _a, props = __rest(_a, ["onSendMessage", "className", "alwayShowSendButton", "hasAttachButton", "hasMicrophoneButton", "handleAttach", "attachMenuProps", "isSendButtonDisabled", "handleStopButton", "hasStopButton", "buttonProps", "onChange", "displayMode"]);
22
22
  // Text Input
23
23
  // --------------------------------------------------------------------------
24
24
  const [message, setMessage] = React.useState('');
25
25
  const [isListeningMessage, setIsListeningMessage] = React.useState(false);
26
- const [showPlaceholder, setShowPlaceholder] = React.useState(true);
26
+ const [hasSentMessage, setHasSentMessage] = React.useState(false);
27
27
  const textareaRef = React.useRef(null);
28
28
  const attachButtonRef = React.useRef(null);
29
- const handleInput = (event) => {
30
- // newMessage === '' doesn't work unless we trim, which causes other problems
31
- // textContent seems to work, but doesn't allow for markdown, so we need both
32
- const messageText = DOMPurify.sanitize(event.target.textContent);
33
- if (messageText === '') {
34
- setShowPlaceholder(true);
35
- setMessage('');
36
- onChange && onChange(event, '');
29
+ const setInitialLineHeight = (field) => {
30
+ field.style.setProperty('line-height', '1rem');
31
+ const parent = field.parentElement;
32
+ if (parent) {
33
+ parent.style.setProperty('margin-top', `1rem`);
34
+ parent.style.setProperty('margin-bottom', `0rem`);
35
+ parent.style.setProperty('height', 'inherit');
36
+ const grandparent = parent.parentElement;
37
+ if (grandparent) {
38
+ grandparent.style.setProperty('flex-basis', 'auto');
39
+ }
37
40
  }
38
- else {
39
- setShowPlaceholder(false);
40
- // this is so that tests work; RTL doesn't seem to like event.target.innerText, but browsers don't pick up markdown without it
41
- let newMessage = messageText;
42
- if (event.target.innerText) {
43
- newMessage = DOMPurify.sanitize(event.target.innerText);
41
+ };
42
+ const setAutoHeight = (field) => {
43
+ const parent = field.parentElement;
44
+ if (parent) {
45
+ parent.style.setProperty('height', 'inherit');
46
+ const computed = window.getComputedStyle(field);
47
+ // Calculate the height
48
+ const height = parseInt(computed.getPropertyValue('border-top-width')) +
49
+ parseInt(computed.getPropertyValue('padding-top')) +
50
+ field.scrollHeight +
51
+ parseInt(computed.getPropertyValue('padding-bottom')) +
52
+ parseInt(computed.getPropertyValue('border-bottom-width'));
53
+ parent.style.setProperty('height', `${height}px`);
54
+ if (height > 32 || window.innerWidth <= 507) {
55
+ parent.style.setProperty('margin-bottom', `1rem`);
56
+ parent.style.setProperty('margin-top', `1rem`);
44
57
  }
45
- setMessage(newMessage);
46
- onChange && onChange(event, newMessage);
47
58
  }
48
59
  };
49
- // Handle sending message
50
- const handleSend = React.useCallback(() => {
51
- onSendMessage(message);
60
+ const textIsLongerThan2Lines = (field) => {
61
+ const lineHeight = parseFloat(window.getComputedStyle(field).lineHeight);
62
+ const lines = field.scrollHeight / lineHeight;
63
+ return lines > 2;
64
+ };
65
+ const setAutoWidth = (field) => {
66
+ const parent = field.parentElement;
67
+ if (parent) {
68
+ const grandparent = parent.parentElement;
69
+ if (textIsLongerThan2Lines(field) && grandparent) {
70
+ grandparent.style.setProperty('flex-basis', `100%`);
71
+ }
72
+ }
73
+ };
74
+ const handleNewLine = (field) => {
75
+ const parent = field.parentElement;
76
+ if (parent) {
77
+ parent.style.setProperty('margin-bottom', `1rem`);
78
+ parent.style.setProperty('margin-top', `1rem`);
79
+ }
80
+ };
81
+ React.useEffect(() => {
82
+ const field = textareaRef.current;
83
+ if (field) {
84
+ if (field.value === '') {
85
+ if (window.innerWidth > 507) {
86
+ setInitialLineHeight(field);
87
+ }
88
+ }
89
+ else {
90
+ setAutoHeight(field);
91
+ setAutoWidth(field);
92
+ }
93
+ }
94
+ const resetHeight = () => {
95
+ if (field) {
96
+ if (field.value === '') {
97
+ if (window.innerWidth > 507) {
98
+ setInitialLineHeight(field);
99
+ }
100
+ }
101
+ else {
102
+ setAutoHeight(field);
103
+ setAutoWidth(field);
104
+ }
105
+ }
106
+ };
107
+ window.addEventListener('resize', resetHeight);
108
+ return () => {
109
+ window.removeEventListener('resize', resetHeight);
110
+ };
111
+ }, []);
112
+ React.useEffect(() => {
113
+ const field = textareaRef.current;
114
+ if (field) {
115
+ if (field.value === '') {
116
+ setInitialLineHeight(textareaRef.current);
117
+ }
118
+ else {
119
+ setAutoHeight(textareaRef.current);
120
+ setAutoWidth(field);
121
+ }
122
+ }
123
+ }, [displayMode, message]);
124
+ React.useEffect(() => {
125
+ const field = textareaRef.current;
126
+ if (field) {
127
+ setInitialLineHeight(field);
128
+ setHasSentMessage(false);
129
+ }
130
+ }, [hasSentMessage]);
131
+ const handleChange = React.useCallback((event) => {
132
+ onChange && onChange(event, event.target.value);
52
133
  if (textareaRef.current) {
53
- textareaRef.current.innerText = '';
54
- setShowPlaceholder(true);
55
- textareaRef.current.blur();
134
+ if (event.target.value === '') {
135
+ setInitialLineHeight(textareaRef.current);
136
+ }
137
+ else {
138
+ setAutoHeight(textareaRef.current);
139
+ }
56
140
  }
57
- setMessage('');
58
- }, [onSendMessage, message]);
141
+ setMessage(event.target.value);
142
+ }, []);
143
+ // Handle sending message
144
+ const handleSend = React.useCallback(() => {
145
+ setMessage((m) => {
146
+ onSendMessage(m);
147
+ setHasSentMessage(true);
148
+ return '';
149
+ });
150
+ }, [onSendMessage]);
59
151
  const handleKeyDown = React.useCallback((event) => {
60
152
  if (event.key === 'Enter' && !event.shiftKey) {
61
153
  event.preventDefault();
@@ -63,6 +155,11 @@ export const MessageBar = (_a) => {
63
155
  handleSend();
64
156
  }
65
157
  }
158
+ if (event.key === 'Enter' && event.shiftKey) {
159
+ if (textareaRef.current) {
160
+ handleNewLine(textareaRef.current);
161
+ }
162
+ }
66
163
  }, [handleSend, isSendButtonDisabled, handleStopButton]);
67
164
  const handleAttachMenuToggle = () => {
68
165
  (attachMenuProps === null || attachMenuProps === void 0 ? void 0 : attachMenuProps.setIsAttachMenuOpen) && (attachMenuProps === null || attachMenuProps === void 0 ? void 0 : attachMenuProps.setIsAttachMenuOpen(!(attachMenuProps === null || attachMenuProps === void 0 ? void 0 : attachMenuProps.isAttachMenuOpen)));
@@ -70,11 +167,6 @@ export const MessageBar = (_a) => {
70
167
  };
71
168
  const handleSpeechRecognition = (message) => {
72
169
  setMessage(message);
73
- const textarea = textareaRef.current;
74
- if (textarea) {
75
- textarea.focus();
76
- textarea.textContent = DOMPurify.sanitize(message);
77
- }
78
170
  onChange && onChange({}, message);
79
171
  };
80
172
  const renderButtons = () => {
@@ -88,15 +180,9 @@ export const MessageBar = (_a) => {
88
180
  hasMicrophoneButton && (React.createElement(MicrophoneButton, Object.assign({ isListening: isListeningMessage, onIsListeningChange: setIsListeningMessage, onSpeechRecognition: handleSpeechRecognition, tooltipContent: (_h = buttonProps === null || buttonProps === void 0 ? void 0 : buttonProps.microphone) === null || _h === void 0 ? void 0 : _h.tooltipContent, language: (_j = buttonProps === null || buttonProps === void 0 ? void 0 : buttonProps.microphone) === null || _j === void 0 ? void 0 : _j.language }, (_k = buttonProps === null || buttonProps === void 0 ? void 0 : buttonProps.microphone) === null || _k === void 0 ? void 0 : _k.props))),
89
181
  (alwayShowSendButton || message) && (React.createElement(SendButton, Object.assign({ value: message, onClick: handleSend, isDisabled: isSendButtonDisabled, tooltipContent: (_l = buttonProps === null || buttonProps === void 0 ? void 0 : buttonProps.send) === null || _l === void 0 ? void 0 : _l.tooltipContent }, (_m = buttonProps === null || buttonProps === void 0 ? void 0 : buttonProps.send) === null || _m === void 0 ? void 0 : _m.props)))));
90
182
  };
91
- const placeholder = isListeningMessage ? 'Listening' : 'Send a message...';
92
183
  const messageBarContents = (React.createElement(React.Fragment, null,
93
184
  React.createElement("div", { className: "pf-chatbot__message-bar-input" },
94
- (showPlaceholder || message === '') && (React.createElement("div", { className: "pf-chatbot__message-bar-placeholder" }, placeholder)),
95
- React.createElement("div", Object.assign({ contentEditable: true, suppressContentEditableWarning: true, role: "textbox", "aria-multiline": "false", className: "pf-chatbot__message-textarea", onInput: handleInput, onFocus: () => setShowPlaceholder(false), onBlur: () => {
96
- if (message === '') {
97
- setShowPlaceholder(!showPlaceholder);
98
- }
99
- }, "aria-label": placeholder, ref: textareaRef, onKeyDown: handleKeyDown }, props))),
185
+ React.createElement(TextArea, Object.assign({ className: "pf-chatbot__message-textarea", value: message, onChange: handleChange, "aria-label": isListeningMessage ? 'Listening' : 'Send a message...', placeholder: isListeningMessage ? 'Listening' : 'Send a message...', ref: textareaRef, onKeyDown: handleKeyDown }, props))),
100
186
  React.createElement("div", { className: "pf-chatbot__message-bar-actions" }, renderButtons())));
101
187
  if (attachMenuProps) {
102
188
  return (React.createElement(AttachMenu, Object.assign({ toggle: (toggleRef) => (React.createElement("div", { ref: toggleRef, className: `pf-chatbot__message-bar ${className !== null && className !== void 0 ? className : ''}` }, messageBarContents)), filteredItems: attachMenuProps === null || attachMenuProps === void 0 ? void 0 : attachMenuProps.attachMenuItems }, (attachMenuProps && { isOpen: attachMenuProps.isAttachMenuOpen }), { onOpenChange: (isAttachMenuOpen) => {
@@ -1 +1 @@
1
- {"root":["../src/index.ts","../src/AttachMenu/AttachMenu.tsx","../src/AttachMenu/index.ts","../src/AttachmentEdit/AttachmentEdit.test.tsx","../src/AttachmentEdit/AttachmentEdit.tsx","../src/AttachmentEdit/index.ts","../src/Chatbot/Chatbot.test.tsx","../src/Chatbot/Chatbot.tsx","../src/Chatbot/index.ts","../src/ChatbotAlert/ChatbotAlert.test.tsx","../src/ChatbotAlert/ChatbotAlert.tsx","../src/ChatbotAlert/index.ts","../src/ChatbotContent/ChatbotContent.test.tsx","../src/ChatbotContent/ChatbotContent.tsx","../src/ChatbotContent/index.ts","../src/ChatbotConversationHistoryNav/ChatbotConversationHistoryDropdown.test.tsx","../src/ChatbotConversationHistoryNav/ChatbotConversationHistoryDropdown.tsx","../src/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.test.tsx","../src/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.tsx","../src/ChatbotConversationHistoryNav/index.ts","../src/ChatbotFooter/ChatbotFooter.test.tsx","../src/ChatbotFooter/ChatbotFooter.tsx","../src/ChatbotFooter/ChatbotFooternote.test.tsx","../src/ChatbotFooter/ChatbotFootnote.tsx","../src/ChatbotFooter/index.ts","../src/ChatbotHeader/ChatbotHeader.test.tsx","../src/ChatbotHeader/ChatbotHeader.tsx","../src/ChatbotHeader/ChatbotHeaderActions.test.tsx","../src/ChatbotHeader/ChatbotHeaderActions.tsx","../src/ChatbotHeader/ChatbotHeaderCloseButton.test.tsx","../src/ChatbotHeader/ChatbotHeaderCloseButton.tsx","../src/ChatbotHeader/ChatbotHeaderMain.test.tsx","../src/ChatbotHeader/ChatbotHeaderMain.tsx","../src/ChatbotHeader/ChatbotHeaderMenu.test.tsx","../src/ChatbotHeader/ChatbotHeaderMenu.tsx","../src/ChatbotHeader/ChatbotHeaderOptionsDropdown.test.tsx","../src/ChatbotHeader/ChatbotHeaderOptionsDropdown.tsx","../src/ChatbotHeader/ChatbotHeaderSelectorDropdown.test.tsx","../src/ChatbotHeader/ChatbotHeaderSelectorDropdown.tsx","../src/ChatbotHeader/ChatbotHeaderTitle.test.tsx","../src/ChatbotHeader/ChatbotHeaderTitle.tsx","../src/ChatbotHeader/index.ts","../src/ChatbotModal/ChatbotModal.tsx","../src/ChatbotModal/index.ts","../src/ChatbotPopover/ChatbotPopover.tsx","../src/ChatbotPopover/index.ts","../src/ChatbotToggle/ChatbotToggle.test.tsx","../src/ChatbotToggle/ChatbotToggle.tsx","../src/ChatbotToggle/index.ts","../src/ChatbotWelcomePrompt/ChatbotWelcomePrompt.test.tsx","../src/ChatbotWelcomePrompt/ChatbotWelcomePrompt.tsx","../src/ChatbotWelcomePrompt/index.ts","../src/CodeModal/CodeModal.tsx","../src/CodeModal/index.ts","../src/Compare/Compare.test.tsx","../src/Compare/Compare.tsx","../src/Compare/index.ts","../src/FileDetails/FileDetails.test.tsx","../src/FileDetails/FileDetails.tsx","../src/FileDetails/index.ts","../src/FileDetailsLabel/FileDetailsLabel.test.tsx","../src/FileDetailsLabel/FileDetailsLabel.tsx","../src/FileDetailsLabel/index.ts","../src/FileDropZone/FileDropZone.test.tsx","../src/FileDropZone/FileDropZone.tsx","../src/FileDropZone/index.ts","../src/LoadingMessage/LoadingMessage.test.tsx","../src/LoadingMessage/LoadingMessage.tsx","../src/LoadingMessage/index.ts","../src/Message/Message.test.tsx","../src/Message/Message.tsx","../src/Message/MessageLoading.tsx","../src/Message/index.ts","../src/Message/CodeBlockMessage/CodeBlockMessage.tsx","../src/Message/ListMessage/ListItemMessage.tsx","../src/Message/ListMessage/OrderedListMessage.tsx","../src/Message/ListMessage/UnorderedListMessage.tsx","../src/Message/QuickResponse/QuickResponse.tsx","../src/Message/QuickStarts/FallbackImg.tsx","../src/Message/QuickStarts/QuickStartTile.tsx","../src/Message/QuickStarts/QuickStartTileDescription.test.tsx","../src/Message/QuickStarts/QuickStartTileDescription.tsx","../src/Message/QuickStarts/QuickStartTileHeader.tsx","../src/Message/QuickStarts/monitor-sampleapp-quickstart-with-image.ts","../src/Message/QuickStarts/monitor-sampleapp-quickstart.ts","../src/Message/QuickStarts/types.ts","../src/Message/TextMessage/TextMessage.tsx","../src/Message/UserFeedback/CloseButton.tsx","../src/Message/UserFeedback/UserFeedback.test.tsx","../src/Message/UserFeedback/UserFeedback.tsx","../src/Message/UserFeedback/UserFeedbackComplete.test.tsx","../src/Message/UserFeedback/UserFeedbackComplete.tsx","../src/MessageBar/AttachButton.test.tsx","../src/MessageBar/AttachButton.tsx","../src/MessageBar/MessageBar.test.tsx","../src/MessageBar/MessageBar.tsx","../src/MessageBar/MicrophoneButton.tsx","../src/MessageBar/SendButton.test.tsx","../src/MessageBar/SendButton.tsx","../src/MessageBar/StopButton.test.tsx","../src/MessageBar/StopButton.tsx","../src/MessageBar/index.ts","../src/MessageBox/JumpButton.test.tsx","../src/MessageBox/JumpButton.tsx","../src/MessageBox/MessageBox.test.tsx","../src/MessageBox/MessageBox.tsx","../src/MessageBox/index.ts","../src/PreviewAttachment/PreviewAttachment.test.tsx","../src/PreviewAttachment/PreviewAttachment.tsx","../src/PreviewAttachment/index.ts","../src/ResponseActions/ResponseActionButton.test.tsx","../src/ResponseActions/ResponseActionButton.tsx","../src/ResponseActions/ResponseActions.test.tsx","../src/ResponseActions/ResponseActions.tsx","../src/ResponseActions/index.ts","../src/Settings/SettingsForm.test.tsx","../src/Settings/SettingsForm.tsx","../src/Settings/index.ts","../src/SourceDetailsMenuItem/SourceDetailsMenuItem.tsx","../src/SourceDetailsMenuItem/index.ts","../src/SourcesCard/SourcesCard.test.tsx","../src/SourcesCard/SourcesCard.tsx","../src/SourcesCard/index.ts","../src/TermsOfUse/TermsOfUse.test.tsx","../src/TermsOfUse/TermsOfUse.tsx","../src/TermsOfUse/index.ts"],"version":"5.6.3"}
1
+ {"root":["../src/index.ts","../src/AttachMenu/AttachMenu.tsx","../src/AttachMenu/index.ts","../src/AttachmentEdit/AttachmentEdit.test.tsx","../src/AttachmentEdit/AttachmentEdit.tsx","../src/AttachmentEdit/index.ts","../src/Chatbot/Chatbot.test.tsx","../src/Chatbot/Chatbot.tsx","../src/Chatbot/index.ts","../src/ChatbotAlert/ChatbotAlert.test.tsx","../src/ChatbotAlert/ChatbotAlert.tsx","../src/ChatbotAlert/index.ts","../src/ChatbotContent/ChatbotContent.test.tsx","../src/ChatbotContent/ChatbotContent.tsx","../src/ChatbotContent/index.ts","../src/ChatbotConversationHistoryNav/ChatbotConversationHistoryDropdown.test.tsx","../src/ChatbotConversationHistoryNav/ChatbotConversationHistoryDropdown.tsx","../src/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.test.tsx","../src/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.tsx","../src/ChatbotConversationHistoryNav/index.ts","../src/ChatbotFooter/ChatbotFooter.test.tsx","../src/ChatbotFooter/ChatbotFooter.tsx","../src/ChatbotFooter/ChatbotFooternote.test.tsx","../src/ChatbotFooter/ChatbotFootnote.tsx","../src/ChatbotFooter/index.ts","../src/ChatbotHeader/ChatbotHeader.test.tsx","../src/ChatbotHeader/ChatbotHeader.tsx","../src/ChatbotHeader/ChatbotHeaderActions.test.tsx","../src/ChatbotHeader/ChatbotHeaderActions.tsx","../src/ChatbotHeader/ChatbotHeaderCloseButton.test.tsx","../src/ChatbotHeader/ChatbotHeaderCloseButton.tsx","../src/ChatbotHeader/ChatbotHeaderMain.test.tsx","../src/ChatbotHeader/ChatbotHeaderMain.tsx","../src/ChatbotHeader/ChatbotHeaderMenu.test.tsx","../src/ChatbotHeader/ChatbotHeaderMenu.tsx","../src/ChatbotHeader/ChatbotHeaderOptionsDropdown.test.tsx","../src/ChatbotHeader/ChatbotHeaderOptionsDropdown.tsx","../src/ChatbotHeader/ChatbotHeaderSelectorDropdown.test.tsx","../src/ChatbotHeader/ChatbotHeaderSelectorDropdown.tsx","../src/ChatbotHeader/ChatbotHeaderTitle.test.tsx","../src/ChatbotHeader/ChatbotHeaderTitle.tsx","../src/ChatbotHeader/index.ts","../src/ChatbotModal/ChatbotModal.tsx","../src/ChatbotModal/index.ts","../src/ChatbotPopover/ChatbotPopover.tsx","../src/ChatbotPopover/index.ts","../src/ChatbotToggle/ChatbotToggle.test.tsx","../src/ChatbotToggle/ChatbotToggle.tsx","../src/ChatbotToggle/index.ts","../src/ChatbotWelcomePrompt/ChatbotWelcomePrompt.test.tsx","../src/ChatbotWelcomePrompt/ChatbotWelcomePrompt.tsx","../src/ChatbotWelcomePrompt/index.ts","../src/CodeModal/CodeModal.tsx","../src/CodeModal/index.ts","../src/Compare/Compare.test.tsx","../src/Compare/Compare.tsx","../src/Compare/index.ts","../src/FileDetails/FileDetails.test.tsx","../src/FileDetails/FileDetails.tsx","../src/FileDetails/index.ts","../src/FileDetailsLabel/FileDetailsLabel.test.tsx","../src/FileDetailsLabel/FileDetailsLabel.tsx","../src/FileDetailsLabel/index.ts","../src/FileDropZone/FileDropZone.test.tsx","../src/FileDropZone/FileDropZone.tsx","../src/FileDropZone/index.ts","../src/LoadingMessage/LoadingMessage.test.tsx","../src/LoadingMessage/LoadingMessage.tsx","../src/LoadingMessage/index.ts","../src/Message/Message.test.tsx","../src/Message/Message.tsx","../src/Message/MessageLoading.tsx","../src/Message/index.ts","../src/Message/CodeBlockMessage/CodeBlockMessage.tsx","../src/Message/ListMessage/ListItemMessage.tsx","../src/Message/ListMessage/OrderedListMessage.tsx","../src/Message/ListMessage/UnorderedListMessage.tsx","../src/Message/QuickResponse/QuickResponse.tsx","../src/Message/QuickStarts/FallbackImg.tsx","../src/Message/QuickStarts/QuickStartTile.tsx","../src/Message/QuickStarts/QuickStartTileDescription.test.tsx","../src/Message/QuickStarts/QuickStartTileDescription.tsx","../src/Message/QuickStarts/QuickStartTileHeader.tsx","../src/Message/QuickStarts/monitor-sampleapp-quickstart-with-image.ts","../src/Message/QuickStarts/monitor-sampleapp-quickstart.ts","../src/Message/QuickStarts/types.ts","../src/Message/TableMessage/TableMessage.tsx","../src/Message/TableMessage/TbodyMessage.tsx","../src/Message/TableMessage/TdMessage.tsx","../src/Message/TableMessage/ThMessage.tsx","../src/Message/TableMessage/TheadMessage.tsx","../src/Message/TableMessage/TrMessage.tsx","../src/Message/TextMessage/TextMessage.tsx","../src/Message/UserFeedback/CloseButton.tsx","../src/Message/UserFeedback/UserFeedback.test.tsx","../src/Message/UserFeedback/UserFeedback.tsx","../src/Message/UserFeedback/UserFeedbackComplete.test.tsx","../src/Message/UserFeedback/UserFeedbackComplete.tsx","../src/MessageBar/AttachButton.test.tsx","../src/MessageBar/AttachButton.tsx","../src/MessageBar/MessageBar.test.tsx","../src/MessageBar/MessageBar.tsx","../src/MessageBar/MicrophoneButton.tsx","../src/MessageBar/SendButton.test.tsx","../src/MessageBar/SendButton.tsx","../src/MessageBar/StopButton.test.tsx","../src/MessageBar/StopButton.tsx","../src/MessageBar/index.ts","../src/MessageBox/JumpButton.test.tsx","../src/MessageBox/JumpButton.tsx","../src/MessageBox/MessageBox.test.tsx","../src/MessageBox/MessageBox.tsx","../src/MessageBox/index.ts","../src/PreviewAttachment/PreviewAttachment.test.tsx","../src/PreviewAttachment/PreviewAttachment.tsx","../src/PreviewAttachment/index.ts","../src/ResponseActions/ResponseActionButton.test.tsx","../src/ResponseActions/ResponseActionButton.tsx","../src/ResponseActions/ResponseActions.test.tsx","../src/ResponseActions/ResponseActions.tsx","../src/ResponseActions/index.ts","../src/Settings/SettingsForm.test.tsx","../src/Settings/SettingsForm.tsx","../src/Settings/index.ts","../src/SourceDetailsMenuItem/SourceDetailsMenuItem.tsx","../src/SourceDetailsMenuItem/index.ts","../src/SourcesCard/SourcesCard.test.tsx","../src/SourcesCard/SourcesCard.tsx","../src/SourcesCard/index.ts","../src/TermsOfUse/TermsOfUse.test.tsx","../src/TermsOfUse/TermsOfUse.tsx","../src/TermsOfUse/index.ts"],"version":"5.6.3"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@patternfly/chatbot",
3
- "version": "2.2.0-prerelease.20",
3
+ "version": "2.2.0-prerelease.22",
4
4
  "description": "This library provides React components based on PatternFly 6 that can be used to build chatbots.",
5
5
  "main": "dist/cjs/index.js",
6
6
  "module": "dist/esm/index.js",
@@ -28,6 +28,8 @@ export const BotMessageExample: React.FunctionComponent = () => {
28
28
  return inlineCode;
29
29
  case 'link':
30
30
  return link;
31
+ case 'table':
32
+ return table;
31
33
  default:
32
34
  return;
33
35
  }
@@ -125,6 +127,15 @@ _Italic text, formatted with single underscores_
125
127
 
126
128
  const inlineCode = `Here is an inline code - \`() => void\``;
127
129
 
130
+ const table = `To customize your table, you can use [PatternFly TableProps](/components/table#table)
131
+
132
+ | Version | GA date | User role
133
+ |-|-|-|
134
+ | 2.5 | September 30, 2024 | Administrator |
135
+ | 2.5 | June 27, 2023 | Editor |
136
+ | 3.0 | April 1, 2025 | Administrator
137
+ `;
138
+
128
139
  return (
129
140
  <>
130
141
  <Message name="Bot" role="bot" avatar={patternflyAvatar} content={`Text-based message from a bot named "Bot"`} />
@@ -216,9 +227,24 @@ _Italic text, formatted with single underscores_
216
227
  label="More complex list"
217
228
  id="more-complex-list"
218
229
  />
230
+ <Radio
231
+ isChecked={variant === 'table'}
232
+ onChange={() => setVariant('table')}
233
+ name="bot-message-type"
234
+ label="Table"
235
+ id="table"
236
+ />
219
237
  </FormGroup>
220
238
  </Form>
221
- <Message name="Bot" role="bot" avatar={patternflyAvatar} content={renderContent()} />
239
+ <Message
240
+ name="Bot"
241
+ role="bot"
242
+ avatar={patternflyAvatar}
243
+ content={renderContent()}
244
+ tableProps={
245
+ variant === 'table' ? { 'aria-label': 'App information and user roles for bot messages' } : undefined
246
+ }
247
+ />
222
248
  </>
223
249
  );
224
250
  };
@@ -28,6 +28,8 @@ export const UserMessageExample: React.FunctionComponent = () => {
28
28
  return moreComplexList;
29
29
  case 'link':
30
30
  return link;
31
+ case 'table':
32
+ return table;
31
33
  default:
32
34
  return;
33
35
  }
@@ -125,6 +127,15 @@ _Italic text, formatted with single underscores_
125
127
 
126
128
  const inlineCode = `Here is an inline code - \`() => void\``;
127
129
 
130
+ const table = `To customize your table, you can use [PatternFly TableProps](/components/table#table)
131
+
132
+ | Version | GA date | User role
133
+ |-|-|-|
134
+ | 2.5 | September 30, 2024 | Administrator |
135
+ | 2.5 | June 27, 2023 | Editor |
136
+ | 3.0 | April 1, 2025 | Administrator
137
+ `;
138
+
128
139
  return (
129
140
  <>
130
141
  <Message
@@ -206,9 +217,24 @@ _Italic text, formatted with single underscores_
206
217
  label="More complex list"
207
218
  id="user-more-complex-list"
208
219
  />
220
+ <Radio
221
+ isChecked={variant === 'table'}
222
+ onChange={() => setVariant('table')}
223
+ name="user-message-type"
224
+ label="Table"
225
+ id="user-table"
226
+ />
209
227
  </FormGroup>
210
228
  </Form>
211
- <Message name="User" role="user" content={renderContent()} avatar={userAvatar} />
229
+ <Message
230
+ name="User"
231
+ role="user"
232
+ content={renderContent()}
233
+ avatar={userAvatar}
234
+ tableProps={
235
+ variant === 'table' ? { 'aria-label': 'App information and user roles for user messages' } : undefined
236
+ }
237
+ />
212
238
  </>
213
239
  );
214
240
  };