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

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 (47) 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/css/main.css +28 -0
  17. package/dist/css/main.css.map +1 -1
  18. package/dist/esm/Message/Message.d.ts +3 -0
  19. package/dist/esm/Message/Message.js +22 -5
  20. package/dist/esm/Message/Message.test.js +94 -0
  21. package/dist/esm/Message/TableMessage/TableMessage.d.ts +20 -0
  22. package/dist/esm/Message/TableMessage/TableMessage.js +62 -0
  23. package/dist/esm/Message/TableMessage/TbodyMessage.d.ts +7 -0
  24. package/dist/esm/Message/TableMessage/TbodyMessage.js +28 -0
  25. package/dist/esm/Message/TableMessage/TdMessage.d.ts +5 -0
  26. package/dist/esm/Message/TableMessage/TdMessage.js +21 -0
  27. package/dist/esm/Message/TableMessage/ThMessage.d.ts +5 -0
  28. package/dist/esm/Message/TableMessage/ThMessage.js +21 -0
  29. package/dist/esm/Message/TableMessage/TheadMessage.d.ts +5 -0
  30. package/dist/esm/Message/TableMessage/TheadMessage.js +21 -0
  31. package/dist/esm/Message/TableMessage/TrMessage.d.ts +7 -0
  32. package/dist/esm/Message/TableMessage/TrMessage.js +32 -0
  33. package/dist/tsconfig.tsbuildinfo +1 -1
  34. package/package.json +1 -1
  35. package/patternfly-docs/content/extensions/chatbot/examples/Messages/BotMessage.tsx +27 -1
  36. package/patternfly-docs/content/extensions/chatbot/examples/Messages/UserMessage.tsx +27 -1
  37. package/src/Message/Message.test.tsx +99 -0
  38. package/src/Message/Message.tsx +25 -4
  39. package/src/Message/TableMessage/TableMessage.scss +23 -0
  40. package/src/Message/TableMessage/TableMessage.tsx +83 -0
  41. package/src/Message/TableMessage/TbodyMessage.tsx +20 -0
  42. package/src/Message/TableMessage/TdMessage.tsx +11 -0
  43. package/src/Message/TableMessage/ThMessage.tsx +11 -0
  44. package/src/Message/TableMessage/TheadMessage.tsx +11 -0
  45. package/src/Message/TableMessage/TrMessage.tsx +27 -0
  46. package/src/Message/TextMessage/TextMessage.scss +5 -0
  47. package/src/main.scss +1 -0
@@ -29,6 +29,13 @@ import { QuickStart, QuickstartAction } from './QuickStarts/types';
29
29
  import QuickResponse from './QuickResponse/QuickResponse';
30
30
  import UserFeedback, { UserFeedbackProps } from './UserFeedback/UserFeedback';
31
31
  import UserFeedbackComplete, { UserFeedbackCompleteProps } from './UserFeedback/UserFeedbackComplete';
32
+ import TableMessage from './TableMessage/TableMessage';
33
+ import TrMessage from './TableMessage/TrMessage';
34
+ import TdMessage from './TableMessage/TdMessage';
35
+ import TbodyMessage from './TableMessage/TbodyMessage';
36
+ import TheadMessage from './TableMessage/TheadMessage';
37
+ import ThMessage from './TableMessage/ThMessage';
38
+ import { TableProps } from '@patternfly/react-table';
32
39
 
33
40
  export interface MessageAttachment {
34
41
  /** Name of file attached to the message */
@@ -109,6 +116,8 @@ export interface MessageProps extends Omit<React.HTMLProps<HTMLDivElement>, 'rol
109
116
  isLiveRegion?: boolean;
110
117
  /** Ref applied to message */
111
118
  innerRef?: React.Ref<HTMLDivElement>;
119
+ /** Props for table message. It is important to include a detailed aria-label that describes the purpose of the table. */
120
+ tableProps?: Required<Pick<TableProps, 'aria-label'>> & TableProps;
112
121
  }
113
122
 
114
123
  export const MessageBase: React.FunctionComponent<MessageProps> = ({
@@ -133,6 +142,7 @@ export const MessageBase: React.FunctionComponent<MessageProps> = ({
133
142
  userFeedbackComplete,
134
143
  isLiveRegion = true,
135
144
  innerRef,
145
+ tableProps,
136
146
  ...props
137
147
  }: MessageProps) => {
138
148
  let avatarClassName;
@@ -187,16 +197,27 @@ export const MessageBase: React.FunctionComponent<MessageProps> = ({
187
197
  {children}
188
198
  </CodeBlockMessage>
189
199
  ),
190
- ul: UnorderedListMessage,
191
- ol: (props) => <OrderedListMessage {...props} />,
192
- li: ListItemMessage,
193
200
  h1: (props) => <TextMessage component={ContentVariants.h1} {...props} />,
194
201
  h2: (props) => <TextMessage component={ContentVariants.h2} {...props} />,
195
202
  h3: (props) => <TextMessage component={ContentVariants.h3} {...props} />,
196
203
  h4: (props) => <TextMessage component={ContentVariants.h4} {...props} />,
197
204
  h5: (props) => <TextMessage component={ContentVariants.h5} {...props} />,
198
205
  h6: (props) => <TextMessage component={ContentVariants.h6} {...props} />,
199
- blockquote: (props) => <TextMessage component={ContentVariants.blockquote} {...props} />
206
+ blockquote: (props) => <TextMessage component={ContentVariants.blockquote} {...props} />,
207
+ ul: (props) => <UnorderedListMessage {...props} />,
208
+ ol: (props) => <OrderedListMessage {...props} />,
209
+ li: (props) => <ListItemMessage {...props} />,
210
+ table: (props) => <TableMessage {...props} {...tableProps} />,
211
+ tbody: (props) => <TbodyMessage {...props} />,
212
+ thead: (props) => <TheadMessage {...props} />,
213
+ tr: (props) => <TrMessage {...props} />,
214
+ td: (props) => {
215
+ // Conflicts with Td type
216
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
217
+ const { width, ...rest } = props;
218
+ return <TdMessage {...rest} />;
219
+ },
220
+ th: (props) => <ThMessage {...props} />
200
221
  }}
201
222
  remarkPlugins={[remarkGfm]}
202
223
  >
@@ -0,0 +1,23 @@
1
+ .pf-chatbot__message-table {
2
+ border-radius: var(--pf-t--global--border--radius--small);
3
+ --pf-v6-c-table--BackgroundColor: var(--pf-t--global--background--color--tertiary--default);
4
+ --pf-v6-c-table--BorderColor: var(--pf-t--global--border--color--default);
5
+ padding: 0 var(--pf-t--global--spacer--lg) 0 var(--pf-t--global--spacer--lg);
6
+
7
+ &.pf-m-grid.pf-v6-c-table tbody:where(.pf-v6-c-table__tbody):first-of-type {
8
+ border-block-start: 0;
9
+ }
10
+
11
+ tbody {
12
+ border-radius: var(--pf-t--global--border--radius--small);
13
+ }
14
+
15
+ tr {
16
+ --pf-v6-c-table__tr--responsive--PaddingInlineEnd: 0;
17
+ --pf-v6-c-table__tr--responsive--PaddingInlineStart: 0;
18
+ }
19
+
20
+ .pf-v6-c-table__tr:last-of-type {
21
+ border-block-end: 0;
22
+ }
23
+ }
@@ -0,0 +1,83 @@
1
+ // ============================================================================
2
+ // Chatbot Main - Message - Content - Table
3
+ // ============================================================================
4
+
5
+ import React from 'react';
6
+ import { ExtraProps } from 'react-markdown';
7
+ import { Table, TableProps } from '@patternfly/react-table';
8
+
9
+ interface Properties {
10
+ line: number;
11
+ column: number;
12
+ offset: number;
13
+ }
14
+ export interface TableNode {
15
+ children?: TableNode[];
16
+ value?: string;
17
+ position: { start: Properties; end: Properties };
18
+ tagName: string;
19
+ type: string;
20
+ }
21
+
22
+ const TableMessage = ({ children, ...props }: TableProps & ExtraProps) => {
23
+ const { className, ...rest } = props;
24
+
25
+ // This allows us to parse the nested data we get back from the 3rd party Markdown parser
26
+ // Open to feedback here if there is a better way to do this
27
+ // This looks for ths and spits them all out so we can filter them later, looking for text values
28
+ const findHeaders = (array?: TableNode[]) => {
29
+ const headers: TableNode[] = [];
30
+ if (!array) {
31
+ return headers;
32
+ }
33
+ const traverse = (items: TableNode[]) => {
34
+ for (const item of items) {
35
+ if (item.tagName === 'th') {
36
+ headers.push(item);
37
+ }
38
+ if (item.children) {
39
+ traverse(item.children);
40
+ }
41
+ }
42
+ };
43
+
44
+ traverse(array);
45
+ return headers;
46
+ };
47
+
48
+ const headers = findHeaders(rest.node?.children as TableNode[] | undefined);
49
+ const headerTextValues = headers.map((header) => header?.children?.filter((c) => c?.type === 'text')[0]?.value);
50
+
51
+ // We are sending these header text values down to child tds by passing them through children, since mobile view for tables expects a dataLabel prop
52
+ // The data structure does not otherwise know this information at that level
53
+ // This is somewhat opinionated and may break if 3rd party library changes
54
+ // See Tr and Tbody for other usage
55
+ const modifyChildren = (children) =>
56
+ React.Children.map(children, (child) => {
57
+ if (child && headerTextValues?.length > 0) {
58
+ return React.cloneElement(child, { extraHeaders: headerTextValues });
59
+ }
60
+ return child;
61
+ });
62
+
63
+ if (!props['aria-label']) {
64
+ // eslint-disable-next-line no-console
65
+ console.warn(
66
+ 'For accessibility reasons an aria-label should be specified for the Table via the <Message /> tableProps prop'
67
+ );
68
+ }
69
+
70
+ return (
71
+ // gridBreakPoint is so we show mobile-styled-PF table
72
+ <Table
73
+ aria-label={props['aria-label']}
74
+ gridBreakPoint="grid"
75
+ className={`pf-chatbot__message-table ${className ? className : ''}`}
76
+ {...rest}
77
+ >
78
+ {modifyChildren(children)}
79
+ </Table>
80
+ );
81
+ };
82
+
83
+ export default TableMessage;
@@ -0,0 +1,20 @@
1
+ // ============================================================================
2
+ // Chatbot Main - Message - Content - Table
3
+ // ============================================================================
4
+
5
+ import React from 'react';
6
+ import { ExtraProps } from 'react-markdown';
7
+ import { Tbody, TbodyProps } from '@patternfly/react-table';
8
+
9
+ const TbodyProps = ({ children, ...props }: TbodyProps & ExtraProps & { extraHeaders?: string[] }) => {
10
+ // passthrough so we can place dataLabel on tds
11
+ const modifyChildren = (children) => {
12
+ if (children && props.extraHeaders) {
13
+ return React.Children.map(children, (child) => React.cloneElement(child, { extraHeaders: props.extraHeaders }));
14
+ }
15
+ return children;
16
+ };
17
+
18
+ return <Tbody {...props}>{modifyChildren(children)}</Tbody>;
19
+ };
20
+ export default TbodyProps;
@@ -0,0 +1,11 @@
1
+ // ============================================================================
2
+ // Chatbot Main - Message - Content - Table
3
+ // ============================================================================
4
+
5
+ import React from 'react';
6
+ import { ExtraProps } from 'react-markdown';
7
+ import { Td, TdProps } from '@patternfly/react-table';
8
+
9
+ const TdMessage = ({ children, ...props }: TdProps & ExtraProps) => <Td {...props}>{children}</Td>;
10
+
11
+ export default TdMessage;
@@ -0,0 +1,11 @@
1
+ // ============================================================================
2
+ // Chatbot Main - Message - Content - Table
3
+ // ============================================================================
4
+
5
+ import React from 'react';
6
+ import { ExtraProps } from 'react-markdown';
7
+ import { Th, ThProps } from '@patternfly/react-table';
8
+
9
+ const ThMessage = ({ children, ...props }: ThProps & ExtraProps) => <Th {...props}>{children}</Th>;
10
+
11
+ export default ThMessage;
@@ -0,0 +1,11 @@
1
+ // ============================================================================
2
+ // Chatbot Main - Message - Content - Table
3
+ // ============================================================================
4
+
5
+ import React from 'react';
6
+ import { ExtraProps } from 'react-markdown';
7
+ import { Thead, TheadProps } from '@patternfly/react-table';
8
+
9
+ const TheadMessage = ({ children, ...props }: TheadProps & ExtraProps) => <Thead {...props}>{children}</Thead>;
10
+
11
+ export default TheadMessage;
@@ -0,0 +1,27 @@
1
+ // ============================================================================
2
+ // Chatbot Main - Message - Content - Table
3
+ // ============================================================================
4
+
5
+ import React from 'react';
6
+ import { ExtraProps } from 'react-markdown';
7
+ import { Tr, TrProps } from '@patternfly/react-table';
8
+
9
+ const TrMessage = ({ children, ...props }: TrProps & ExtraProps & { extraHeaders?: string[] }) => {
10
+ let tdIndex = 0;
11
+
12
+ // passthrough so we can place dataLabel on tds
13
+ // places column name on correct child
14
+ const modifyChildren = (children) =>
15
+ React.Children.map(children, (child) => {
16
+ if (child.type.name === 'td' && props.extraHeaders) {
17
+ const clonedChild = React.cloneElement(child, { dataLabel: props.extraHeaders[tdIndex] });
18
+ tdIndex = tdIndex + 1;
19
+ return clonedChild;
20
+ }
21
+ return child;
22
+ });
23
+
24
+ return <Tr {...props}>{modifyChildren(children)}</Tr>;
25
+ };
26
+
27
+ export default TrMessage;
@@ -10,6 +10,11 @@
10
10
  }
11
11
  }
12
12
 
13
+ // make it full width when there's a table, so the table can grow as needed
14
+ .pf-chatbot__message-and-actions:has(.pf-chatbot__message-table) {
15
+ width: 100%;
16
+ }
17
+
13
18
  // Need to inline shorter text
14
19
  .pf-chatbot__message-text {
15
20
  width: fit-content;
package/src/main.scss CHANGED
@@ -18,6 +18,7 @@
18
18
  @import './Message/CodeBlockMessage/CodeBlockMessage';
19
19
  @import './Message/TextMessage/TextMessage';
20
20
  @import './Message/ListMessage/ListMessage';
21
+ @import './Message/TableMessage/TableMessage';
21
22
  @import './Message/MessageLoading';
22
23
  @import './Message/QuickStarts/QuickStartTile';
23
24
  @import './Message/QuickResponse/QuickResponse';