@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.
- package/dist/cjs/Message/Message.d.ts +3 -0
- package/dist/cjs/Message/Message.js +22 -5
- package/dist/cjs/Message/Message.test.js +94 -0
- package/dist/cjs/Message/TableMessage/TableMessage.d.ts +20 -0
- package/dist/cjs/Message/TableMessage/TableMessage.js +67 -0
- package/dist/cjs/Message/TableMessage/TbodyMessage.d.ts +7 -0
- package/dist/cjs/Message/TableMessage/TbodyMessage.js +33 -0
- package/dist/cjs/Message/TableMessage/TdMessage.d.ts +5 -0
- package/dist/cjs/Message/TableMessage/TdMessage.js +26 -0
- package/dist/cjs/Message/TableMessage/ThMessage.d.ts +5 -0
- package/dist/cjs/Message/TableMessage/ThMessage.js +26 -0
- package/dist/cjs/Message/TableMessage/TheadMessage.d.ts +5 -0
- package/dist/cjs/Message/TableMessage/TheadMessage.js +26 -0
- package/dist/cjs/Message/TableMessage/TrMessage.d.ts +7 -0
- package/dist/cjs/Message/TableMessage/TrMessage.js +37 -0
- package/dist/css/main.css +28 -0
- package/dist/css/main.css.map +1 -1
- package/dist/esm/Message/Message.d.ts +3 -0
- package/dist/esm/Message/Message.js +22 -5
- package/dist/esm/Message/Message.test.js +94 -0
- package/dist/esm/Message/TableMessage/TableMessage.d.ts +20 -0
- package/dist/esm/Message/TableMessage/TableMessage.js +62 -0
- package/dist/esm/Message/TableMessage/TbodyMessage.d.ts +7 -0
- package/dist/esm/Message/TableMessage/TbodyMessage.js +28 -0
- package/dist/esm/Message/TableMessage/TdMessage.d.ts +5 -0
- package/dist/esm/Message/TableMessage/TdMessage.js +21 -0
- package/dist/esm/Message/TableMessage/ThMessage.d.ts +5 -0
- package/dist/esm/Message/TableMessage/ThMessage.js +21 -0
- package/dist/esm/Message/TableMessage/TheadMessage.d.ts +5 -0
- package/dist/esm/Message/TableMessage/TheadMessage.js +21 -0
- package/dist/esm/Message/TableMessage/TrMessage.d.ts +7 -0
- package/dist/esm/Message/TableMessage/TrMessage.js +32 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/patternfly-docs/content/extensions/chatbot/examples/Messages/BotMessage.tsx +27 -1
- package/patternfly-docs/content/extensions/chatbot/examples/Messages/UserMessage.tsx +27 -1
- package/src/Message/Message.test.tsx +99 -0
- package/src/Message/Message.tsx +25 -4
- package/src/Message/TableMessage/TableMessage.scss +23 -0
- package/src/Message/TableMessage/TableMessage.tsx +83 -0
- package/src/Message/TableMessage/TbodyMessage.tsx +20 -0
- package/src/Message/TableMessage/TdMessage.tsx +11 -0
- package/src/Message/TableMessage/ThMessage.tsx +11 -0
- package/src/Message/TableMessage/TheadMessage.tsx +11 -0
- package/src/Message/TableMessage/TrMessage.tsx +27 -0
- package/src/Message/TextMessage/TextMessage.scss +5 -0
- package/src/main.scss +1 -0
package/src/Message/Message.tsx
CHANGED
@@ -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';
|