@patternfly/chatbot 2.2.0-prerelease.1 → 2.2.0-prerelease.11
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/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.d.ts +19 -1
- package/dist/cjs/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.js +11 -11
- package/dist/cjs/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.test.js +39 -3
- package/dist/cjs/ChatbotHeader/ChatbotHeaderCloseButton.d.ts +17 -0
- package/dist/cjs/ChatbotHeader/ChatbotHeaderCloseButton.js +14 -0
- package/dist/cjs/ChatbotHeader/ChatbotHeaderMenu.d.ts +2 -0
- package/dist/cjs/ChatbotHeader/ChatbotHeaderMenu.js +2 -2
- package/dist/cjs/ChatbotHeader/index.d.ts +1 -0
- package/dist/cjs/ChatbotHeader/index.js +1 -0
- package/dist/cjs/CodeModal/CodeModal.js +2 -12
- package/dist/cjs/Compare/Compare.d.ts +17 -0
- package/dist/cjs/Compare/Compare.js +50 -0
- package/dist/cjs/Compare/Compare.test.d.ts +1 -0
- package/dist/cjs/Compare/Compare.test.js +20 -0
- package/dist/cjs/Compare/index.d.ts +2 -0
- package/dist/cjs/Compare/index.js +23 -0
- package/dist/cjs/Message/ListMessage/OrderedListMessage.d.ts +1 -1
- package/dist/cjs/Message/ListMessage/OrderedListMessage.js +2 -2
- package/dist/cjs/Message/Message.d.ts +16 -6
- package/dist/cjs/Message/Message.js +6 -6
- package/dist/cjs/Message/Message.test.js +51 -0
- package/dist/cjs/Message/QuickResponse/QuickResponse.d.ts +15 -0
- package/dist/cjs/Message/QuickResponse/QuickResponse.js +33 -0
- package/dist/cjs/Message/QuickStarts/FallbackImg.d.ts +13 -0
- package/dist/cjs/Message/QuickStarts/FallbackImg.js +34 -0
- package/dist/cjs/Message/QuickStarts/QuickStartTile.d.ts +27 -0
- package/dist/cjs/Message/QuickStarts/QuickStartTile.js +82 -0
- package/dist/cjs/Message/QuickStarts/QuickStartTileDescription.d.ts +23 -0
- package/dist/cjs/Message/QuickStarts/QuickStartTileDescription.js +64 -0
- package/dist/cjs/Message/QuickStarts/QuickStartTileDescription.test.d.ts +1 -0
- package/dist/cjs/Message/QuickStarts/QuickStartTileDescription.test.js +76 -0
- package/dist/cjs/Message/QuickStarts/QuickStartTileHeader.d.ts +11 -0
- package/dist/cjs/Message/QuickStarts/QuickStartTileHeader.js +30 -0
- package/dist/cjs/Message/QuickStarts/monitor-sampleapp-quickstart-with-image.d.ts +30 -0
- package/dist/cjs/Message/QuickStarts/monitor-sampleapp-quickstart-with-image.js +77 -0
- package/dist/cjs/Message/QuickStarts/monitor-sampleapp-quickstart.d.ts +30 -0
- package/dist/cjs/Message/QuickStarts/monitor-sampleapp-quickstart.js +77 -0
- package/dist/cjs/Message/QuickStarts/types.d.ts +132 -0
- package/dist/cjs/Message/QuickStarts/types.js +17 -0
- package/dist/cjs/ResponseActions/ResponseActionButton.d.ts +6 -0
- package/dist/cjs/ResponseActions/ResponseActionButton.js +10 -2
- package/dist/cjs/ResponseActions/ResponseActionButton.test.d.ts +1 -0
- package/dist/cjs/ResponseActions/ResponseActionButton.test.js +54 -0
- package/dist/cjs/ResponseActions/ResponseActions.d.ts +4 -0
- package/dist/cjs/ResponseActions/ResponseActions.js +26 -9
- package/dist/cjs/ResponseActions/ResponseActions.test.js +79 -5
- package/dist/cjs/Settings/SettingsForm.d.ts +13 -0
- package/dist/cjs/Settings/SettingsForm.js +27 -0
- package/dist/cjs/Settings/index.d.ts +2 -0
- package/dist/cjs/Settings/index.js +23 -0
- package/dist/cjs/TermsOfUse/TermsOfUse.d.ts +34 -0
- package/dist/cjs/TermsOfUse/TermsOfUse.js +49 -0
- package/dist/cjs/TermsOfUse/TermsOfUse.test.d.ts +1 -0
- package/dist/cjs/TermsOfUse/TermsOfUse.test.js +79 -0
- package/dist/cjs/TermsOfUse/index.d.ts +2 -0
- package/dist/cjs/TermsOfUse/index.js +23 -0
- package/dist/cjs/index.d.ts +6 -0
- package/dist/cjs/index.js +10 -1
- package/dist/css/main.css +244 -18
- package/dist/css/main.css.map +1 -1
- package/dist/dynamic/Compare/package.json +1 -0
- package/dist/dynamic/Settings/package.json +1 -0
- package/dist/dynamic/TermsOfUse/package.json +1 -0
- package/dist/esm/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.d.ts +19 -1
- package/dist/esm/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.js +11 -11
- package/dist/esm/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.test.js +39 -3
- package/dist/esm/ChatbotHeader/ChatbotHeaderCloseButton.d.ts +17 -0
- package/dist/esm/ChatbotHeader/ChatbotHeaderCloseButton.js +8 -0
- package/dist/esm/ChatbotHeader/ChatbotHeaderMenu.d.ts +2 -0
- package/dist/esm/ChatbotHeader/ChatbotHeaderMenu.js +2 -2
- package/dist/esm/ChatbotHeader/index.d.ts +1 -0
- package/dist/esm/ChatbotHeader/index.js +1 -0
- package/dist/esm/CodeModal/CodeModal.js +2 -12
- package/dist/esm/Compare/Compare.d.ts +17 -0
- package/dist/esm/Compare/Compare.js +43 -0
- package/dist/esm/Compare/Compare.test.d.ts +1 -0
- package/dist/esm/Compare/Compare.test.js +15 -0
- package/dist/esm/Compare/index.d.ts +2 -0
- package/dist/esm/Compare/index.js +2 -0
- package/dist/esm/Message/ListMessage/OrderedListMessage.d.ts +1 -1
- package/dist/esm/Message/ListMessage/OrderedListMessage.js +2 -2
- package/dist/esm/Message/Message.d.ts +16 -6
- package/dist/esm/Message/Message.js +7 -7
- package/dist/esm/Message/Message.test.js +51 -0
- package/dist/esm/Message/QuickResponse/QuickResponse.d.ts +15 -0
- package/dist/esm/Message/QuickResponse/QuickResponse.js +26 -0
- package/dist/esm/Message/QuickStarts/FallbackImg.d.ts +13 -0
- package/dist/esm/Message/QuickStarts/FallbackImg.js +9 -0
- package/dist/esm/Message/QuickStarts/QuickStartTile.d.ts +27 -0
- package/dist/esm/Message/QuickStarts/QuickStartTile.js +52 -0
- package/dist/esm/Message/QuickStarts/QuickStartTileDescription.d.ts +23 -0
- package/dist/esm/Message/QuickStarts/QuickStartTileDescription.js +35 -0
- package/dist/esm/Message/QuickStarts/QuickStartTileDescription.test.d.ts +1 -0
- package/dist/esm/Message/QuickStarts/QuickStartTileDescription.test.js +48 -0
- package/dist/esm/Message/QuickStarts/QuickStartTileHeader.d.ts +11 -0
- package/dist/esm/Message/QuickStarts/QuickStartTileHeader.js +5 -0
- package/dist/esm/Message/QuickStarts/monitor-sampleapp-quickstart-with-image.d.ts +30 -0
- package/dist/esm/Message/QuickStarts/monitor-sampleapp-quickstart-with-image.js +74 -0
- package/dist/esm/Message/QuickStarts/monitor-sampleapp-quickstart.d.ts +30 -0
- package/dist/esm/Message/QuickStarts/monitor-sampleapp-quickstart.js +74 -0
- package/dist/esm/Message/QuickStarts/types.d.ts +132 -0
- package/dist/esm/Message/QuickStarts/types.js +14 -0
- package/dist/esm/ResponseActions/ResponseActionButton.d.ts +6 -0
- package/dist/esm/ResponseActions/ResponseActionButton.js +10 -2
- package/dist/esm/ResponseActions/ResponseActionButton.test.d.ts +1 -0
- package/dist/esm/ResponseActions/ResponseActionButton.test.js +49 -0
- package/dist/esm/ResponseActions/ResponseActions.d.ts +4 -0
- package/dist/esm/ResponseActions/ResponseActions.js +26 -9
- package/dist/esm/ResponseActions/ResponseActions.test.js +79 -5
- package/dist/esm/Settings/SettingsForm.d.ts +13 -0
- package/dist/esm/Settings/SettingsForm.js +20 -0
- package/dist/esm/Settings/index.d.ts +2 -0
- package/dist/esm/Settings/index.js +2 -0
- package/dist/esm/TermsOfUse/TermsOfUse.d.ts +34 -0
- package/dist/esm/TermsOfUse/TermsOfUse.js +42 -0
- package/dist/esm/TermsOfUse/TermsOfUse.test.d.ts +1 -0
- package/dist/esm/TermsOfUse/TermsOfUse.test.js +74 -0
- package/dist/esm/TermsOfUse/index.d.ts +2 -0
- package/dist/esm/TermsOfUse/index.js +2 -0
- package/dist/esm/index.d.ts +6 -0
- package/dist/esm/index.js +6 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +7 -13
- package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithCustomResponseActions.tsx +4 -0
- package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithQuickStart.tsx +31 -0
- package/patternfly-docs/content/extensions/chatbot/examples/Messages/Messages.md +26 -4
- package/patternfly-docs/content/extensions/chatbot/examples/Messages/explore-pipeline-quickstart.ts +65 -0
- package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotFooter.tsx +1 -1
- package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotFootnote.tsx +2 -2
- package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotHeaderDrawer.tsx +2 -2
- package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotHeaderDrawerNavigation.tsx +67 -0
- package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotHeaderDrawerResizable.tsx +94 -0
- package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotHeaderDrawerWithSelection.tsx +78 -0
- package/patternfly-docs/content/extensions/chatbot/examples/UI/PF-TermsAndConditionsHeader.svg +148 -0
- package/patternfly-docs/content/extensions/chatbot/examples/UI/Settings.tsx +289 -0
- package/patternfly-docs/content/extensions/chatbot/examples/UI/SquareChatbotToggle.tsx +1 -1
- package/patternfly-docs/content/extensions/chatbot/examples/UI/TermsOfUse.tsx +147 -0
- package/patternfly-docs/content/extensions/chatbot/examples/UI/UI.md +54 -0
- package/patternfly-docs/content/extensions/chatbot/examples/demos/Chatbot.md +26 -3
- package/patternfly-docs/content/extensions/chatbot/examples/demos/Chatbot.tsx +2 -2
- package/patternfly-docs/content/extensions/chatbot/examples/demos/ChatbotAttachment.tsx +20 -19
- package/patternfly-docs/content/extensions/chatbot/examples/demos/ChatbotAttachmentMenu.tsx +1 -1
- package/patternfly-docs/content/extensions/chatbot/examples/demos/EmbeddedChatbot.tsx +2 -2
- package/patternfly-docs/content/extensions/chatbot/examples/demos/EmbeddedComparisonChatbot.tsx +206 -0
- package/src/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.scss +14 -0
- package/src/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.test.tsx +112 -3
- package/src/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.tsx +46 -9
- package/src/ChatbotFooter/ChatbotFooter.scss +2 -1
- package/src/ChatbotHeader/ChatbotHeaderCloseButton.tsx +51 -0
- package/src/ChatbotHeader/ChatbotHeaderMenu.tsx +5 -2
- package/src/ChatbotHeader/index.ts +1 -0
- package/src/CodeModal/CodeModal.scss +8 -0
- package/src/CodeModal/CodeModal.tsx +2 -13
- package/src/Compare/Compare.scss +72 -0
- package/src/Compare/Compare.test.tsx +31 -0
- package/src/Compare/Compare.tsx +98 -0
- package/src/Compare/index.ts +2 -0
- package/src/FileDropZone/__snapshots__/FileDropZone.test.tsx.snap +1 -1
- package/src/Message/ListMessage/OrderedListMessage.tsx +2 -2
- package/src/Message/Message.scss +0 -14
- package/src/Message/Message.test.tsx +76 -0
- package/src/Message/Message.tsx +35 -26
- package/src/Message/QuickResponse/QuickResponse.scss +33 -0
- package/src/Message/QuickResponse/QuickResponse.tsx +50 -0
- package/src/Message/QuickStarts/FallbackImg.tsx +24 -0
- package/src/Message/QuickStarts/QuickStartTile.scss +25 -0
- package/src/Message/QuickStarts/QuickStartTile.tsx +147 -0
- package/src/Message/QuickStarts/QuickStartTileDescription.test.tsx +57 -0
- package/src/Message/QuickStarts/QuickStartTileDescription.tsx +81 -0
- package/src/Message/QuickStarts/QuickStartTileHeader.tsx +21 -0
- package/src/Message/QuickStarts/monitor-sampleapp-quickstart-with-image.ts +75 -0
- package/src/Message/QuickStarts/monitor-sampleapp-quickstart.ts +75 -0
- package/src/Message/QuickStarts/types.ts +154 -0
- package/src/ResponseActions/ResponseActionButton.test.tsx +52 -0
- package/src/ResponseActions/ResponseActionButton.tsx +46 -27
- package/src/ResponseActions/ResponseActions.scss +10 -8
- package/src/ResponseActions/ResponseActions.test.tsx +103 -5
- package/src/ResponseActions/ResponseActions.tsx +54 -7
- package/src/Settings/Settings.scss +34 -0
- package/src/Settings/SettingsForm.tsx +25 -0
- package/src/Settings/index.ts +3 -0
- package/src/TermsOfUse/TermsOfUse.scss +66 -0
- package/src/TermsOfUse/TermsOfUse.test.tsx +138 -0
- package/src/TermsOfUse/TermsOfUse.tsx +117 -0
- package/src/TermsOfUse/index.ts +3 -0
- package/src/index.ts +9 -0
- package/src/main.scss +5 -0
@@ -1,5 +1,5 @@
|
|
1
1
|
import React from 'react';
|
2
|
-
import { DrawerProps } from '@patternfly/react-core';
|
2
|
+
import { DrawerProps, MenuItemProps, MenuProps, DrawerPanelContentProps, DrawerContentProps, DrawerContentBodyProps, DrawerHeadProps, DrawerActionsProps, DrawerCloseButtonProps, DrawerPanelBodyProps } from '@patternfly/react-core';
|
3
3
|
import { ChatbotDisplayMode } from '../Chatbot/Chatbot';
|
4
4
|
export interface Conversation {
|
5
5
|
/** Conversation id */
|
@@ -18,6 +18,8 @@ export interface Conversation {
|
|
18
18
|
label?: string;
|
19
19
|
/** Callback for when user selects item. */
|
20
20
|
onSelect?: (event?: React.MouseEvent, value?: string | number) => void;
|
21
|
+
/** Additional props passed to conversation menu item */
|
22
|
+
additionalProps?: MenuItemProps;
|
21
23
|
}
|
22
24
|
export interface ChatbotConversationHistoryNavProps extends DrawerProps {
|
23
25
|
/** Function called to toggle drawer */
|
@@ -51,6 +53,22 @@ export interface ChatbotConversationHistoryNavProps extends DrawerProps {
|
|
51
53
|
reverseButtonOrder?: boolean;
|
52
54
|
/** Custom test id for the drawer actions */
|
53
55
|
drawerActionsTestId?: string;
|
56
|
+
/** Additional props applied to menu */
|
57
|
+
menuProps?: MenuProps;
|
58
|
+
/** Additional props applied to panel */
|
59
|
+
drawerPanelContentProps?: DrawerPanelContentProps;
|
60
|
+
/** Additional props applied to drawer content */
|
61
|
+
drawerContentProps?: Omit<DrawerContentProps, 'panelContent'>;
|
62
|
+
/** Additional props applied to drawer content body */
|
63
|
+
drawerContentBodyProps?: DrawerContentBodyProps;
|
64
|
+
/** Additional props applied to drawer head */
|
65
|
+
drawerHeadProps?: DrawerHeadProps;
|
66
|
+
/** Additional props applied to drawer actions */
|
67
|
+
drawerActionsProps?: DrawerActionsProps;
|
68
|
+
/** Additional props applied to drawer close button */
|
69
|
+
drawerCloseButtonProps?: DrawerCloseButtonProps;
|
70
|
+
/** Additional props appleid to drawer panel body */
|
71
|
+
drawerPanelBodyProps?: DrawerPanelBodyProps;
|
54
72
|
}
|
55
73
|
export declare const ChatbotConversationHistoryNav: React.FunctionComponent<ChatbotConversationHistoryNavProps>;
|
56
74
|
export default ChatbotConversationHistoryNav;
|
@@ -25,18 +25,18 @@ const react_icons_1 = require("@patternfly/react-icons");
|
|
25
25
|
const Chatbot_1 = require("../Chatbot/Chatbot");
|
26
26
|
const ChatbotConversationHistoryDropdown_1 = __importDefault(require("./ChatbotConversationHistoryDropdown"));
|
27
27
|
const ChatbotConversationHistoryNav = (_a) => {
|
28
|
-
var { onDrawerToggle, isDrawerOpen, setIsDrawerOpen, activeItemId, onSelectActiveItem, conversations, newChatButtonText = 'New chat', drawerContent, onNewChat, searchInputPlaceholder = 'Search...', searchInputAriaLabel = 'Filter menu items', handleTextInputChange, displayMode, reverseButtonOrder = false, drawerActionsTestId = 'chatbot-nav-drawer-actions' } = _a, props = __rest(_a, ["onDrawerToggle", "isDrawerOpen", "setIsDrawerOpen", "activeItemId", "onSelectActiveItem", "conversations", "newChatButtonText", "drawerContent", "onNewChat", "searchInputPlaceholder", "searchInputAriaLabel", "handleTextInputChange", "displayMode", "reverseButtonOrder", "drawerActionsTestId"]);
|
28
|
+
var { onDrawerToggle, isDrawerOpen, setIsDrawerOpen, activeItemId, onSelectActiveItem, conversations, newChatButtonText = 'New chat', drawerContent, onNewChat, searchInputPlaceholder = 'Search...', searchInputAriaLabel = 'Filter menu items', handleTextInputChange, displayMode, reverseButtonOrder = false, drawerActionsTestId = 'chatbot-nav-drawer-actions', menuProps, drawerPanelContentProps, drawerContentProps, drawerContentBodyProps, drawerHeadProps, drawerActionsProps, drawerCloseButtonProps, drawerPanelBodyProps } = _a, props = __rest(_a, ["onDrawerToggle", "isDrawerOpen", "setIsDrawerOpen", "activeItemId", "onSelectActiveItem", "conversations", "newChatButtonText", "drawerContent", "onNewChat", "searchInputPlaceholder", "searchInputAriaLabel", "handleTextInputChange", "displayMode", "reverseButtonOrder", "drawerActionsTestId", "menuProps", "drawerPanelContentProps", "drawerContentProps", "drawerContentBodyProps", "drawerHeadProps", "drawerActionsProps", "drawerCloseButtonProps", "drawerPanelBodyProps"]);
|
29
29
|
const drawerRef = react_1.default.useRef(null);
|
30
30
|
const onExpand = () => {
|
31
31
|
drawerRef.current && drawerRef.current.focus();
|
32
32
|
};
|
33
33
|
const getNavItem = (conversation) => {
|
34
34
|
var _a;
|
35
|
-
return (react_1.default.createElement(react_core_1.MenuItem, Object.assign({ className:
|
35
|
+
return (react_1.default.createElement(react_core_1.MenuItem, Object.assign({ className: `pf-chatbot__menu-item ${activeItemId && activeItemId === conversation.id ? 'pf-chatbot__menu-item--active' : ''}`, itemId: conversation.id, key: conversation.id }, (conversation.noIcon ? {} : { icon: (_a = conversation.icon) !== null && _a !== void 0 ? _a : react_1.default.createElement(react_icons_1.OutlinedCommentAltIcon, null) }), (conversation.menuItems
|
36
36
|
? {
|
37
37
|
actions: (react_1.default.createElement(ChatbotConversationHistoryDropdown_1.default, { menuClassName: conversation.menuClassName, onSelect: conversation.onSelect, menuItems: conversation.menuItems, label: conversation.label }))
|
38
38
|
}
|
39
|
-
: {})), conversation.text));
|
39
|
+
: {}), conversation.additionalProps), conversation.text));
|
40
40
|
};
|
41
41
|
const buildMenu = () => {
|
42
42
|
if (Array.isArray(conversations)) {
|
@@ -52,16 +52,16 @@ const ChatbotConversationHistoryNav = (_a) => {
|
|
52
52
|
// Menu Content
|
53
53
|
// - Consumers should pass an array to <Chatbot> of the list of conversations
|
54
54
|
// - Groups could be optional, but items need to be ordered by date
|
55
|
-
const menuContent = (react_1.default.createElement(react_core_1.Menu, { isPlain: true, onSelect: onSelectActiveItem, activeItemId: activeItemId },
|
55
|
+
const menuContent = (react_1.default.createElement(react_core_1.Menu, Object.assign({ isPlain: true, onSelect: onSelectActiveItem, activeItemId: activeItemId }, menuProps),
|
56
56
|
react_1.default.createElement(react_core_1.MenuContent, null, buildMenu())));
|
57
|
-
const panelContent = (react_1.default.createElement(react_core_1.DrawerPanelContent, { focusTrap: { enabled: true },
|
58
|
-
react_1.default.createElement(react_core_1.DrawerHead,
|
59
|
-
react_1.default.createElement(react_core_1.DrawerActions, { "data-testid": drawerActionsTestId, className: reverseButtonOrder ? 'pf-v6-c-drawer__actions--reversed' : '' },
|
60
|
-
react_1.default.createElement(react_core_1.DrawerCloseButton, { onClick: onDrawerToggle }),
|
57
|
+
const panelContent = (react_1.default.createElement(react_core_1.DrawerPanelContent, Object.assign({ focusTrap: { enabled: true }, defaultSize: "384px" }, drawerPanelContentProps),
|
58
|
+
react_1.default.createElement(react_core_1.DrawerHead, Object.assign({}, drawerHeadProps),
|
59
|
+
react_1.default.createElement(react_core_1.DrawerActions, Object.assign({ "data-testid": drawerActionsTestId, className: reverseButtonOrder ? 'pf-v6-c-drawer__actions--reversed' : '' }, drawerActionsProps),
|
60
|
+
react_1.default.createElement(react_core_1.DrawerCloseButton, Object.assign({ onClick: onDrawerToggle }, drawerCloseButtonProps)),
|
61
61
|
onNewChat && react_1.default.createElement(react_core_1.Button, { onClick: onNewChat }, newChatButtonText))),
|
62
62
|
handleTextInputChange && (react_1.default.createElement("div", { className: "pf-chatbot__input" },
|
63
63
|
react_1.default.createElement(react_core_1.SearchInput, { "aria-label": searchInputAriaLabel, onChange: (_event, value) => handleTextInputChange(value), placeholder: searchInputPlaceholder }))),
|
64
|
-
react_1.default.createElement(react_core_1.DrawerPanelBody,
|
64
|
+
react_1.default.createElement(react_core_1.DrawerPanelBody, Object.assign({}, drawerPanelBodyProps), menuContent)));
|
65
65
|
// An onKeyDown property must be passed to the Drawer component to handle closing
|
66
66
|
// the drawer panel and deactivating the focus trap via the Escape key.
|
67
67
|
const onEscape = (event) => {
|
@@ -73,8 +73,8 @@ const ChatbotConversationHistoryNav = (_a) => {
|
|
73
73
|
}
|
74
74
|
};
|
75
75
|
return (react_1.default.createElement(react_core_1.Drawer, Object.assign({ className: "pf-chatbot__history", isExpanded: isDrawerOpen, onExpand: onExpand, position: "start", onKeyDown: onEscape, isInline: displayMode === Chatbot_1.ChatbotDisplayMode.fullscreen || displayMode === Chatbot_1.ChatbotDisplayMode.embedded }, props),
|
76
|
-
react_1.default.createElement(react_core_1.DrawerContent, { panelContent: panelContent },
|
77
|
-
react_1.default.createElement(react_core_1.DrawerContentBody,
|
76
|
+
react_1.default.createElement(react_core_1.DrawerContent, Object.assign({ panelContent: panelContent }, drawerContentProps),
|
77
|
+
react_1.default.createElement(react_core_1.DrawerContentBody, Object.assign({}, drawerContentBodyProps),
|
78
78
|
react_1.default.createElement(react_1.default.Fragment, null,
|
79
79
|
react_1.default.createElement("div", { className: `${isDrawerOpen && (displayMode === Chatbot_1.ChatbotDisplayMode.default || displayMode === Chatbot_1.ChatbotDisplayMode.docked) ? 'pf-v6-c-backdrop pf-chatbot__drawer-backdrop' : undefined} ` }),
|
80
80
|
drawerContent)))));
|
@@ -22,12 +22,12 @@ describe('ChatbotConversationHistoryNav', () => {
|
|
22
22
|
const initialConversations = [
|
23
23
|
{
|
24
24
|
id: '1',
|
25
|
-
text: '
|
25
|
+
text: 'ChatBot documentation'
|
26
26
|
}
|
27
27
|
];
|
28
28
|
it('should open the conversation history navigation drawer', () => {
|
29
29
|
(0, react_2.render)(react_1.default.createElement(ChatbotConversationHistoryNav_1.default, { onDrawerToggle: onDrawerToggle, isDrawerOpen: true, displayMode: Chatbot_1.ChatbotDisplayMode.fullscreen, setIsDrawerOpen: jest.fn(), conversations: initialConversations }));
|
30
|
-
expect(react_2.screen.queryByText('
|
30
|
+
expect(react_2.screen.queryByText('ChatBot documentation')).toBeInTheDocument();
|
31
31
|
});
|
32
32
|
it('should display the conversations for grouped conversations', () => {
|
33
33
|
const groupedConversations = {
|
@@ -63,7 +63,43 @@ describe('ChatbotConversationHistoryNav', () => {
|
|
63
63
|
charCode: 27
|
64
64
|
});
|
65
65
|
(0, react_2.waitFor)(() => {
|
66
|
-
expect(react_2.screen.queryByText('
|
66
|
+
expect(react_2.screen.queryByText('ChatBot documentation')).not.toBeInTheDocument();
|
67
67
|
});
|
68
68
|
}));
|
69
|
+
it('should be resizable', () => {
|
70
|
+
(0, react_2.render)(react_1.default.createElement(ChatbotConversationHistoryNav_1.default, { onDrawerToggle: onDrawerToggle, isDrawerOpen: true, displayMode: Chatbot_1.ChatbotDisplayMode.fullscreen, setIsDrawerOpen: jest.fn(), conversations: initialConversations, drawerPanelContentProps: { isResizable: true, minSize: '200px' } }));
|
71
|
+
expect(react_2.screen.getByRole('dialog', { name: /Resize/i })).toBeTruthy();
|
72
|
+
expect(react_2.screen.getByRole('separator', { name: /Resize/i })).toBeTruthy();
|
73
|
+
expect(react_2.screen.getByRole('dialog', { name: /Resize/i })).toHaveAttribute('style', '--pf-v6-c-drawer__panel--md--FlexBasis: 384px; --pf-v6-c-drawer__panel--md--FlexBasis--min: 200px;');
|
74
|
+
});
|
75
|
+
it('should accept drawerContentProps', () => {
|
76
|
+
const { container } = (0, react_2.render)(react_1.default.createElement(ChatbotConversationHistoryNav_1.default, { onDrawerToggle: onDrawerToggle, isDrawerOpen: true, displayMode: Chatbot_1.ChatbotDisplayMode.fullscreen, setIsDrawerOpen: jest.fn(), conversations: initialConversations, drawerContentProps: { className: 'test' } }));
|
77
|
+
const element = container.querySelector('.test');
|
78
|
+
expect(element).toBeInTheDocument();
|
79
|
+
});
|
80
|
+
it('should accept drawerContentBodyProps', () => {
|
81
|
+
const { container } = (0, react_2.render)(react_1.default.createElement(ChatbotConversationHistoryNav_1.default, { onDrawerToggle: onDrawerToggle, isDrawerOpen: true, displayMode: Chatbot_1.ChatbotDisplayMode.fullscreen, setIsDrawerOpen: jest.fn(), conversations: initialConversations, drawerContentBodyProps: { className: 'test' } }));
|
82
|
+
const element = container.querySelector('.test');
|
83
|
+
expect(element).toBeInTheDocument();
|
84
|
+
});
|
85
|
+
it('should accept drawerHeadProps', () => {
|
86
|
+
const { container } = (0, react_2.render)(react_1.default.createElement(ChatbotConversationHistoryNav_1.default, { onDrawerToggle: onDrawerToggle, isDrawerOpen: true, displayMode: Chatbot_1.ChatbotDisplayMode.fullscreen, setIsDrawerOpen: jest.fn(), conversations: initialConversations, drawerHeadProps: { className: 'test' } }));
|
87
|
+
const element = container.querySelector('.test');
|
88
|
+
expect(element).toBeInTheDocument();
|
89
|
+
});
|
90
|
+
it('should accept drawerActionsProps', () => {
|
91
|
+
const { container } = (0, react_2.render)(react_1.default.createElement(ChatbotConversationHistoryNav_1.default, { onDrawerToggle: onDrawerToggle, isDrawerOpen: true, displayMode: Chatbot_1.ChatbotDisplayMode.fullscreen, setIsDrawerOpen: jest.fn(), conversations: initialConversations, drawerActionsProps: { className: 'test' } }));
|
92
|
+
const element = container.querySelector('.test');
|
93
|
+
expect(element).toBeInTheDocument();
|
94
|
+
});
|
95
|
+
it('should accept drawerCloseButtonProps', () => {
|
96
|
+
const { container } = (0, react_2.render)(react_1.default.createElement(ChatbotConversationHistoryNav_1.default, { onDrawerToggle: onDrawerToggle, isDrawerOpen: true, displayMode: Chatbot_1.ChatbotDisplayMode.fullscreen, setIsDrawerOpen: jest.fn(), conversations: initialConversations, drawerCloseButtonProps: { className: 'test' } }));
|
97
|
+
const element = container.querySelector('.test');
|
98
|
+
expect(element).toBeInTheDocument();
|
99
|
+
});
|
100
|
+
it('should accept drawerPanelBodyProps', () => {
|
101
|
+
const { container } = (0, react_2.render)(react_1.default.createElement(ChatbotConversationHistoryNav_1.default, { onDrawerToggle: onDrawerToggle, isDrawerOpen: true, displayMode: Chatbot_1.ChatbotDisplayMode.fullscreen, setIsDrawerOpen: jest.fn(), conversations: initialConversations, drawerPanelBodyProps: { className: 'test' } }));
|
102
|
+
const element = container.querySelector('.test');
|
103
|
+
expect(element).toBeInTheDocument();
|
104
|
+
});
|
69
105
|
});
|
@@ -0,0 +1,17 @@
|
|
1
|
+
import React from 'react';
|
2
|
+
import { TooltipProps } from '@patternfly/react-core';
|
3
|
+
export interface ChatbotHeaderCloseButtonProps {
|
4
|
+
/** Callback function for when button is clicked */
|
5
|
+
onClick: () => void;
|
6
|
+
/** Custom classname for the header component */
|
7
|
+
className?: string;
|
8
|
+
/** Props spread to the PF Tooltip component wrapping the display mode dropdown */
|
9
|
+
tooltipProps?: TooltipProps;
|
10
|
+
/** Aria label for menu */
|
11
|
+
menuAriaLabel?: string;
|
12
|
+
/** Ref applied to menu */
|
13
|
+
innerRef?: React.Ref<HTMLButtonElement>;
|
14
|
+
/** Content used in tooltip */
|
15
|
+
tooltipContent?: string;
|
16
|
+
}
|
17
|
+
export declare const ChatbotHeaderCloseButton: React.ForwardRefExoticComponent<ChatbotHeaderCloseButtonProps & React.RefAttributes<HTMLButtonElement>>;
|
@@ -0,0 +1,14 @@
|
|
1
|
+
"use strict";
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
4
|
+
};
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
6
|
+
exports.ChatbotHeaderCloseButton = void 0;
|
7
|
+
const react_1 = __importDefault(require("react"));
|
8
|
+
const react_core_1 = require("@patternfly/react-core");
|
9
|
+
const react_icons_1 = require("@patternfly/react-icons");
|
10
|
+
const ChatbotHeaderCloseButtonBase = ({ className, onClick, tooltipProps, menuAriaLabel = 'Close', innerRef, tooltipContent = 'Close' }) => (react_1.default.createElement("div", { className: `pf-chatbot__menu ${className}` },
|
11
|
+
react_1.default.createElement(react_core_1.Tooltip, Object.assign({ content: tooltipContent, position: "bottom" }, tooltipProps),
|
12
|
+
react_1.default.createElement(react_core_1.Button, { className: "pf-chatbot__button--toggle-menu", variant: "plain", onClick: onClick, "aria-label": menuAriaLabel, ref: innerRef, icon: react_1.default.createElement(react_core_1.Icon, { size: "xl", isInline: true },
|
13
|
+
react_1.default.createElement(react_icons_1.CloseIcon, null)) }))));
|
14
|
+
exports.ChatbotHeaderCloseButton = react_1.default.forwardRef((props, ref) => (react_1.default.createElement(ChatbotHeaderCloseButtonBase, Object.assign({ innerRef: ref }, props))));
|
@@ -11,5 +11,7 @@ export interface ChatbotHeaderMenuProps {
|
|
11
11
|
menuAriaLabel?: string;
|
12
12
|
/** Ref applied to menu */
|
13
13
|
innerRef?: React.Ref<HTMLButtonElement>;
|
14
|
+
/** Content used in tooltip */
|
15
|
+
tooltipContent?: string;
|
14
16
|
}
|
15
17
|
export declare const ChatbotHeaderMenu: React.ForwardRefExoticComponent<ChatbotHeaderMenuProps & React.RefAttributes<HTMLButtonElement>>;
|
@@ -7,8 +7,8 @@ exports.ChatbotHeaderMenu = void 0;
|
|
7
7
|
const react_1 = __importDefault(require("react"));
|
8
8
|
const react_core_1 = require("@patternfly/react-core");
|
9
9
|
const bars_icon_1 = __importDefault(require("@patternfly/react-icons/dist/esm/icons/bars-icon"));
|
10
|
-
const ChatbotHeaderMenuBase = ({ className, onMenuToggle, tooltipProps, menuAriaLabel = 'Toggle menu', innerRef }) => (react_1.default.createElement("div", { className: `pf-chatbot__menu ${className}` },
|
11
|
-
react_1.default.createElement(react_core_1.Tooltip, Object.assign({ content:
|
10
|
+
const ChatbotHeaderMenuBase = ({ className, onMenuToggle, tooltipProps, menuAriaLabel = 'Toggle menu', innerRef, tooltipContent = 'Menu' }) => (react_1.default.createElement("div", { className: `pf-chatbot__menu ${className}` },
|
11
|
+
react_1.default.createElement(react_core_1.Tooltip, Object.assign({ content: tooltipContent, position: "bottom" }, tooltipProps),
|
12
12
|
react_1.default.createElement(react_core_1.Button, { className: "pf-chatbot__button--toggle-menu", variant: "plain", onClick: onMenuToggle, "aria-label": menuAriaLabel, ref: innerRef, icon: react_1.default.createElement(react_core_1.Icon, { size: "xl", isInline: true },
|
13
13
|
react_1.default.createElement(bars_icon_1.default, null)) }))));
|
14
14
|
exports.ChatbotHeaderMenu = react_1.default.forwardRef((props, ref) => (react_1.default.createElement(ChatbotHeaderMenuBase, Object.assign({ innerRef: ref }, props))));
|
@@ -27,3 +27,4 @@ __exportStar(require("./ChatbotHeaderMenu"), exports);
|
|
27
27
|
__exportStar(require("./ChatbotHeaderTitle"), exports);
|
28
28
|
__exportStar(require("./ChatbotHeaderOptionsDropdown"), exports);
|
29
29
|
__exportStar(require("./ChatbotHeaderSelectorDropdown"), exports);
|
30
|
+
__exportStar(require("./ChatbotHeaderCloseButton"), exports);
|
@@ -75,24 +75,14 @@ const CodeModal = (_a) => {
|
|
75
75
|
setNewCode(value);
|
76
76
|
}
|
77
77
|
};
|
78
|
-
/* eslint-disable indent */
|
79
|
-
const getHeight = (displayMode) => {
|
80
|
-
switch (displayMode) {
|
81
|
-
case Chatbot_1.ChatbotDisplayMode.docked:
|
82
|
-
return '100vh';
|
83
|
-
default:
|
84
|
-
return '45vh';
|
85
|
-
}
|
86
|
-
};
|
87
|
-
/* eslint-enable indent */
|
88
78
|
const modal = (react_1.default.createElement(ChatbotModal_1.default, { isOpen: isModalOpen, onClose: handleModalToggle, ouiaId: "CodeModal", "aria-labelledby": "code-modal-title", "aria-describedby": "code-modal", className: `pf-chatbot__code-modal pf-chatbot__code-modal--${displayMode}`, displayMode: displayMode },
|
89
79
|
react_1.default.createElement(react_core_1.ModalHeader, { title: title, labelId: "code-modal-title" }),
|
90
80
|
react_1.default.createElement(react_core_1.ModalBody, { id: "code-modal-body" },
|
91
81
|
react_1.default.createElement(react_core_1.Stack, { className: "pf-chatbot__code-modal-body" },
|
92
82
|
react_1.default.createElement(react_core_1.StackItem, { className: "pf-chatbot__code-modal-file-details" },
|
93
83
|
react_1.default.createElement(FileDetails_1.default, { fileName: fileName })),
|
94
|
-
react_1.default.createElement(react_core_1.StackItem,
|
95
|
-
react_1.default.createElement(react_code_editor_1.CodeEditor, Object.assign({ isDarkTheme: true, isLineNumbersVisible: isLineNumbersVisible, isLanguageLabelVisible: true, isCopyEnabled: isCopyEnabled, isReadOnly: isReadOnly, code: newCode, language: FileDetails_1.extensionToLanguage[path_browserify_1.default.extname(fileName).slice(1)], onEditorDidMount: onEditorDidMount, onCodeChange: onCodeChange, className: codeEditorClassName,
|
84
|
+
react_1.default.createElement(react_core_1.StackItem, { className: "pf-chatbot__code-modal-body" },
|
85
|
+
react_1.default.createElement(react_code_editor_1.CodeEditor, Object.assign({ isDarkTheme: true, isLineNumbersVisible: isLineNumbersVisible, isLanguageLabelVisible: true, isCopyEnabled: isCopyEnabled, isReadOnly: isReadOnly, code: newCode, language: FileDetails_1.extensionToLanguage[path_browserify_1.default.extname(fileName).slice(1)], onEditorDidMount: onEditorDidMount, onCodeChange: onCodeChange, className: codeEditorClassName, isFullHeight: true, options: {
|
96
86
|
glyphMargin: false,
|
97
87
|
folding: false
|
98
88
|
} }, props))))),
|
@@ -0,0 +1,17 @@
|
|
1
|
+
import React, { PropsWithChildren } from 'react';
|
2
|
+
interface CompareProps {
|
3
|
+
/** First of two children to render */
|
4
|
+
firstChild: React.ReactNode;
|
5
|
+
/** Second of two children to render */
|
6
|
+
secondChild: React.ReactNode;
|
7
|
+
/** Display name for first child, used in mobile toggle */
|
8
|
+
firstChildDisplayName: string;
|
9
|
+
/** Display name for second child, used in mobile toggle */
|
10
|
+
secondChildDisplayName: string;
|
11
|
+
/** Aria label for mobile toggle group */
|
12
|
+
toggleGroupAriaLabel?: string;
|
13
|
+
/** Callback for when mobile toggle is used */
|
14
|
+
onToggleClick?: (event: MouseEvent | React.MouseEvent<any, MouseEvent> | React.KeyboardEvent<Element>) => void;
|
15
|
+
}
|
16
|
+
export declare const Compare: ({ firstChild, secondChild, firstChildDisplayName, secondChildDisplayName, onToggleClick, toggleGroupAriaLabel }: PropsWithChildren<CompareProps>) => React.JSX.Element;
|
17
|
+
export default Compare;
|
@@ -0,0 +1,50 @@
|
|
1
|
+
"use strict";
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
4
|
+
};
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
6
|
+
exports.Compare = void 0;
|
7
|
+
const react_1 = __importDefault(require("react"));
|
8
|
+
const react_core_1 = require("@patternfly/react-core");
|
9
|
+
const Compare = ({ firstChild, secondChild, firstChildDisplayName, secondChildDisplayName, onToggleClick, toggleGroupAriaLabel = 'Select which chatbot to display' }) => {
|
10
|
+
const [isSelected, setIsSelected] = react_1.default.useState('toggle-group-chatbot-1');
|
11
|
+
const [showFirstChatbot, setShowFirstChatbot] = react_1.default.useState(true);
|
12
|
+
const [showSecondChatbot, setShowSecondChatbot] = react_1.default.useState(false);
|
13
|
+
react_1.default.useEffect(() => {
|
14
|
+
// we want to show the first if we switch to the mobile toggle view
|
15
|
+
// and reset/switch back to normal otherwise
|
16
|
+
const updateChatbotVisibility = () => {
|
17
|
+
if (window.innerWidth >= 901) {
|
18
|
+
setShowFirstChatbot(true);
|
19
|
+
setShowSecondChatbot(true);
|
20
|
+
}
|
21
|
+
else {
|
22
|
+
setShowFirstChatbot(true);
|
23
|
+
setShowSecondChatbot(false);
|
24
|
+
setIsSelected('toggle-group-chatbot-1');
|
25
|
+
}
|
26
|
+
};
|
27
|
+
window.addEventListener('resize', updateChatbotVisibility);
|
28
|
+
return () => {
|
29
|
+
window.removeEventListener('resize', updateChatbotVisibility);
|
30
|
+
};
|
31
|
+
}, []);
|
32
|
+
// this only happens on mobile
|
33
|
+
const handleChildToggleClick = (event) => {
|
34
|
+
const id = event.currentTarget.id;
|
35
|
+
setIsSelected(id);
|
36
|
+
setShowSecondChatbot(!showSecondChatbot);
|
37
|
+
setShowFirstChatbot(!showFirstChatbot);
|
38
|
+
onToggleClick && onToggleClick(event);
|
39
|
+
};
|
40
|
+
return (react_1.default.createElement(react_1.default.Fragment, null,
|
41
|
+
react_1.default.createElement("div", { className: "pf-chatbot__compare-mobile-controls" },
|
42
|
+
react_1.default.createElement(react_core_1.ToggleGroup, { "aria-label": toggleGroupAriaLabel },
|
43
|
+
react_1.default.createElement(react_core_1.ToggleGroupItem, { className: "pf-chatbot__compare-toggle", text: firstChildDisplayName, buttonId: "toggle-group-chatbot-1", isSelected: isSelected === 'toggle-group-chatbot-1', onChange: handleChildToggleClick }),
|
44
|
+
react_1.default.createElement(react_core_1.ToggleGroupItem, { className: "pf-chatbot__compare-toggle", text: secondChildDisplayName, buttonId: "toggle-group-chatbot-2", isSelected: isSelected === 'toggle-group-chatbot-2', onChange: handleChildToggleClick }))),
|
45
|
+
react_1.default.createElement("div", { className: "pf-chatbot__compare" },
|
46
|
+
react_1.default.createElement("div", { className: `pf-chatbot__compare-item ${!showFirstChatbot ? 'pf-chatbot__compare-item-hidden' : undefined}` }, firstChild),
|
47
|
+
react_1.default.createElement("div", { className: `pf-chatbot__compare-item ${!showSecondChatbot ? 'pf-chatbot__compare-item-hidden' : undefined}` }, secondChild))));
|
48
|
+
};
|
49
|
+
exports.Compare = Compare;
|
50
|
+
exports.default = exports.Compare;
|
@@ -0,0 +1 @@
|
|
1
|
+
import '@testing-library/jest-dom';
|
@@ -0,0 +1,20 @@
|
|
1
|
+
"use strict";
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
4
|
+
};
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
6
|
+
const react_1 = __importDefault(require("react"));
|
7
|
+
const react_2 = require("@testing-library/react");
|
8
|
+
require("@testing-library/jest-dom");
|
9
|
+
const Compare_1 = __importDefault(require("./Compare"));
|
10
|
+
const firstChild = (react_1.default.createElement("div", null,
|
11
|
+
react_1.default.createElement("h1", null, "Child 1")));
|
12
|
+
const secondChild = (react_1.default.createElement("div", null,
|
13
|
+
react_1.default.createElement("h1", null, "Child 2")));
|
14
|
+
describe('Compare', () => {
|
15
|
+
it('should render compare correctly', () => {
|
16
|
+
(0, react_2.render)(react_1.default.createElement(Compare_1.default, { firstChildDisplayName: "Child 1", secondChildDisplayName: "Child 2", firstChild: firstChild, secondChild: secondChild }));
|
17
|
+
expect(react_2.screen.getByRole('heading', { name: /Child 1/i })).toBeTruthy();
|
18
|
+
expect(react_2.screen.getByRole('heading', { name: /Child 2/i })).toBeTruthy();
|
19
|
+
});
|
20
|
+
});
|
@@ -0,0 +1,23 @@
|
|
1
|
+
"use strict";
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
3
|
+
if (k2 === undefined) k2 = k;
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
7
|
+
}
|
8
|
+
Object.defineProperty(o, k2, desc);
|
9
|
+
}) : (function(o, m, k, k2) {
|
10
|
+
if (k2 === undefined) k2 = k;
|
11
|
+
o[k2] = m[k];
|
12
|
+
}));
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
15
|
+
};
|
16
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
17
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
18
|
+
};
|
19
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
20
|
+
exports.default = void 0;
|
21
|
+
var Compare_1 = require("./Compare");
|
22
|
+
Object.defineProperty(exports, "default", { enumerable: true, get: function () { return __importDefault(Compare_1).default; } });
|
23
|
+
__exportStar(require("./Compare"), exports);
|
@@ -1,4 +1,4 @@
|
|
1
1
|
import React from 'react';
|
2
2
|
import { ExtraProps } from 'react-markdown';
|
3
|
-
declare const OrderedListMessage: ({ children }: JSX.IntrinsicElements["ol"] & ExtraProps) => React.JSX.Element;
|
3
|
+
declare const OrderedListMessage: ({ children, start }: JSX.IntrinsicElements["ol"] & ExtraProps) => React.JSX.Element;
|
4
4
|
export default OrderedListMessage;
|
@@ -8,6 +8,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
8
8
|
Object.defineProperty(exports, "__esModule", { value: true });
|
9
9
|
const react_1 = __importDefault(require("react"));
|
10
10
|
const react_core_1 = require("@patternfly/react-core");
|
11
|
-
const OrderedListMessage = ({ children }) => (react_1.default.createElement("div", { className: "pf-chatbot__message-ordered-list" },
|
12
|
-
react_1.default.createElement(react_core_1.List, { component: react_core_1.ListComponent.ol, type: react_core_1.OrderType.number }, children)));
|
11
|
+
const OrderedListMessage = ({ children, start }) => (react_1.default.createElement("div", { className: "pf-chatbot__message-ordered-list" },
|
12
|
+
react_1.default.createElement(react_core_1.List, { component: react_core_1.ListComponent.ol, type: react_core_1.OrderType.number, start: start }, children)));
|
13
13
|
exports.default = OrderedListMessage;
|
@@ -1,12 +1,9 @@
|
|
1
1
|
import React from 'react';
|
2
|
-
import { AvatarProps, LabelGroupProps
|
2
|
+
import { AvatarProps, LabelGroupProps } from '@patternfly/react-core';
|
3
3
|
import { ActionProps } from '../ResponseActions/ResponseActions';
|
4
4
|
import { SourcesCardProps } from '../SourcesCard';
|
5
|
-
|
6
|
-
|
7
|
-
id: string;
|
8
|
-
onClick: () => void;
|
9
|
-
}
|
5
|
+
import { QuickStart, QuickstartAction } from './QuickStarts/types';
|
6
|
+
import QuickResponse from './QuickResponse/QuickResponse';
|
10
7
|
export interface MessageAttachment {
|
11
8
|
/** Name of file attached to the message */
|
12
9
|
name: string;
|
@@ -64,6 +61,19 @@ export interface MessageProps extends Omit<React.HTMLProps<HTMLDivElement>, 'rol
|
|
64
61
|
hasRoundAvatar?: boolean;
|
65
62
|
/** Any additional props applied to the avatar, for additional customization */
|
66
63
|
avatarProps?: Omit<AvatarProps, 'alt'>;
|
64
|
+
/** Props for QuickStart card */
|
65
|
+
quickStarts?: {
|
66
|
+
quickStart: QuickStart;
|
67
|
+
onSelectQuickStart: (id?: string) => void;
|
68
|
+
minuteWord?: string;
|
69
|
+
minuteWordPlural?: string;
|
70
|
+
prerequisiteWord?: string;
|
71
|
+
prerequisiteWordPlural?: string;
|
72
|
+
quickStartButtonAriaLabel?: string;
|
73
|
+
className?: string;
|
74
|
+
onClick?: () => void;
|
75
|
+
action?: QuickstartAction;
|
76
|
+
};
|
67
77
|
}
|
68
78
|
export declare const Message: React.FunctionComponent<MessageProps>;
|
69
79
|
export default Message;
|
@@ -31,8 +31,10 @@ const SourcesCard_1 = __importDefault(require("../SourcesCard"));
|
|
31
31
|
const ListItemMessage_1 = __importDefault(require("./ListMessage/ListItemMessage"));
|
32
32
|
const UnorderedListMessage_1 = __importDefault(require("./ListMessage/UnorderedListMessage"));
|
33
33
|
const OrderedListMessage_1 = __importDefault(require("./ListMessage/OrderedListMessage"));
|
34
|
+
const QuickStartTile_1 = __importDefault(require("./QuickStarts/QuickStartTile"));
|
35
|
+
const QuickResponse_1 = __importDefault(require("./QuickResponse/QuickResponse"));
|
34
36
|
const Message = (_a) => {
|
35
|
-
var { role, content, name, avatar, timestamp, isLoading, actions, sources, botWord = 'AI', loadingWord = 'Loading message', codeBlockProps, quickResponses, quickResponseContainerProps = { numLabels: 5 }, attachments, hasRoundAvatar = true, avatarProps } = _a, props = __rest(_a, ["role", "content", "name", "avatar", "timestamp", "isLoading", "actions", "sources", "botWord", "loadingWord", "codeBlockProps", "quickResponses", "quickResponseContainerProps", "attachments", "hasRoundAvatar", "avatarProps"]);
|
37
|
+
var { role, content, name, avatar, timestamp, isLoading, actions, sources, botWord = 'AI', loadingWord = 'Loading message', codeBlockProps, quickResponses, quickResponseContainerProps = { numLabels: 5 }, attachments, hasRoundAvatar = true, avatarProps, quickStarts } = _a, props = __rest(_a, ["role", "content", "name", "avatar", "timestamp", "isLoading", "actions", "sources", "botWord", "loadingWord", "codeBlockProps", "quickResponses", "quickResponseContainerProps", "attachments", "hasRoundAvatar", "avatarProps", "quickStarts"]);
|
36
38
|
let avatarClassName;
|
37
39
|
if (avatarProps && 'className' in avatarProps) {
|
38
40
|
const { className } = avatarProps, rest = __rest(avatarProps, ["className"]);
|
@@ -56,15 +58,13 @@ const Message = (_a) => {
|
|
56
58
|
p: TextMessage_1.default,
|
57
59
|
code: ({ children }) => react_1.default.createElement(CodeBlockMessage_1.default, Object.assign({}, codeBlockProps), children),
|
58
60
|
ul: UnorderedListMessage_1.default,
|
59
|
-
ol: OrderedListMessage_1.default,
|
61
|
+
ol: (props) => react_1.default.createElement(OrderedListMessage_1.default, Object.assign({}, props)),
|
60
62
|
li: ListItemMessage_1.default
|
61
63
|
}, remarkPlugins: [remark_gfm_1.default] }, content)),
|
62
64
|
!isLoading && sources && react_1.default.createElement(SourcesCard_1.default, Object.assign({}, sources)),
|
65
|
+
quickStarts && quickStarts.quickStart && (react_1.default.createElement(QuickStartTile_1.default, { quickStart: quickStarts.quickStart, onSelectQuickStart: quickStarts.onSelectQuickStart, minuteWord: quickStarts.minuteWord, minuteWordPlural: quickStarts.minuteWordPlural, prerequisiteWord: quickStarts.prerequisiteWord, prerequisiteWordPlural: quickStarts.prerequisiteWordPlural, quickStartButtonAriaLabel: quickStarts.quickStartButtonAriaLabel })),
|
63
66
|
!isLoading && actions && react_1.default.createElement(ResponseActions_1.default, { actions: actions }),
|
64
|
-
!isLoading && quickResponses && (react_1.default.createElement(
|
65
|
-
var { id, onClick, content } = _a, props = __rest(_a, ["id", "onClick", "content"]);
|
66
|
-
return (react_1.default.createElement(react_core_1.Label, Object.assign({ variant: "outline", color: "blue", key: id, onClick: onClick }, props), content));
|
67
|
-
})))),
|
67
|
+
!isLoading && quickResponses && (react_1.default.createElement(QuickResponse_1.default, { quickResponses: quickResponses, quickResponseContainerProps: quickResponseContainerProps }))),
|
68
68
|
attachments && (react_1.default.createElement("div", { className: "pf-chatbot__message-attachments-container" }, attachments.map((attachment) => {
|
69
69
|
var _a;
|
70
70
|
return (react_1.default.createElement("div", { key: (_a = attachment.id) !== null && _a !== void 0 ? _a : attachment.name, className: "pf-chatbot__message-attachment" },
|
@@ -17,6 +17,8 @@ const react_2 = require("@testing-library/react");
|
|
17
17
|
require("@testing-library/jest-dom");
|
18
18
|
const Message_1 = __importDefault(require("./Message"));
|
19
19
|
const user_event_1 = __importDefault(require("@testing-library/user-event"));
|
20
|
+
const monitor_sampleapp_quickstart_1 = require("./QuickStarts/monitor-sampleapp-quickstart");
|
21
|
+
const monitor_sampleapp_quickstart_with_image_1 = require("./QuickStarts/monitor-sampleapp-quickstart-with-image");
|
20
22
|
const ALL_ACTIONS = [
|
21
23
|
{ label: /Good response/i },
|
22
24
|
{ label: /Bad response/i },
|
@@ -60,6 +62,21 @@ spec:
|
|
60
62
|
url: https://raw.githubusercontent.com/Azure-Samples/helm-charts/master/docs
|
61
63
|
`;
|
62
64
|
const INLINE_CODE = `Here is an inline code - \`() => void\``;
|
65
|
+
const ORDERED_LIST_WITH_CODE = `
|
66
|
+
1. Item 1
|
67
|
+
2. Item 2
|
68
|
+
|
69
|
+
\`\`\`yaml
|
70
|
+
- name: Hello World Playbook
|
71
|
+
hosts: localhost
|
72
|
+
tasks:
|
73
|
+
- name: Print Hello World
|
74
|
+
ansible.builtin.debug:
|
75
|
+
msg: "Hello, World!"
|
76
|
+
\`\`\`
|
77
|
+
|
78
|
+
3. Item 3
|
79
|
+
`;
|
63
80
|
const checkListItemsRendered = () => {
|
64
81
|
const items = ['Item 1', 'Item 2', 'Item 3'];
|
65
82
|
expect(react_2.screen.getAllByRole('listitem')).toHaveLength(3);
|
@@ -280,6 +297,12 @@ describe('Message', () => {
|
|
280
297
|
expect(react_2.screen.getByText('Here is an ordered list:')).toBeTruthy();
|
281
298
|
checkListItemsRendered();
|
282
299
|
});
|
300
|
+
it('should render ordered lists correctly if there is interstitial content', () => {
|
301
|
+
(0, react_2.render)(react_1.default.createElement(Message_1.default, { avatar: "./img", role: "user", name: "User", content: ORDERED_LIST_WITH_CODE }));
|
302
|
+
checkListItemsRendered();
|
303
|
+
const list = react_2.screen.getAllByRole('list')[1];
|
304
|
+
expect(list).toHaveAttribute('start', '3');
|
305
|
+
});
|
283
306
|
it('should render inline code', () => {
|
284
307
|
(0, react_2.render)(react_1.default.createElement(Message_1.default, { avatar: "./img", role: "user", name: "User", content: INLINE_CODE }));
|
285
308
|
expect(react_2.screen.getByText(/() => void/i)).toBeTruthy();
|
@@ -332,4 +355,32 @@ describe('Message', () => {
|
|
332
355
|
expect(react_2.screen.getByRole('img')).toHaveClass('test');
|
333
356
|
expect(react_2.screen.getByRole('img')).toHaveClass('pf-chatbot__message-avatar');
|
334
357
|
});
|
358
|
+
it('should handle QuickStart tile correctly', () => {
|
359
|
+
(0, react_2.render)(react_1.default.createElement(Message_1.default, { avatar: "./img", role: "user", name: "User", content: "Hi", quickStarts: {
|
360
|
+
quickStart: monitor_sampleapp_quickstart_1.monitorSampleAppQuickStart,
|
361
|
+
onSelectQuickStart: (id) => alert(id)
|
362
|
+
} }));
|
363
|
+
expect(react_2.screen.getByRole('button', { name: 'Monitoring your sample application' })).toBeTruthy();
|
364
|
+
expect(react_2.screen.getByRole('heading', { name: '1 Prerequisite' })).toBeTruthy();
|
365
|
+
expect(react_2.screen.getByRole('button', { name: 'Show prerequisites' })).toBeTruthy();
|
366
|
+
expect(react_2.screen.getByRole('button', { name: 'Start' })).toBeTruthy();
|
367
|
+
});
|
368
|
+
it('should handle click on QuickStart tile correctly', () => __awaiter(void 0, void 0, void 0, function* () {
|
369
|
+
const spy = jest.fn();
|
370
|
+
(0, react_2.render)(react_1.default.createElement(Message_1.default, { avatar: "./img", role: "user", name: "User", content: "Hi", quickStarts: {
|
371
|
+
quickStart: monitor_sampleapp_quickstart_1.monitorSampleAppQuickStart,
|
372
|
+
onSelectQuickStart: (id) => spy(id)
|
373
|
+
} }));
|
374
|
+
yield user_event_1.default.click(react_2.screen.getByRole('button', { name: 'Monitoring your sample application' }));
|
375
|
+
expect(spy).toHaveBeenCalledTimes(1);
|
376
|
+
expect(spy).toHaveBeenCalledWith(monitor_sampleapp_quickstart_1.monitorSampleAppQuickStart.metadata.name);
|
377
|
+
}));
|
378
|
+
it('should handle QuickStart tile with image correctly', () => __awaiter(void 0, void 0, void 0, function* () {
|
379
|
+
const spy = jest.fn();
|
380
|
+
(0, react_2.render)(react_1.default.createElement(Message_1.default, { avatar: "./img", role: "user", name: "User", content: "Hi", quickStarts: {
|
381
|
+
quickStart: monitor_sampleapp_quickstart_with_image_1.monitorSampleAppQuickStartWithImage,
|
382
|
+
onSelectQuickStart: (id) => spy(id)
|
383
|
+
} }));
|
384
|
+
expect(react_2.screen.getAllByRole('img')[1]).toHaveAttribute('src', 'test.png');
|
385
|
+
}));
|
335
386
|
});
|
@@ -0,0 +1,15 @@
|
|
1
|
+
import React from 'react';
|
2
|
+
import { LabelGroupProps, LabelProps } from '@patternfly/react-core';
|
3
|
+
export interface QuickResponse extends Omit<LabelProps, 'children'> {
|
4
|
+
content: string;
|
5
|
+
id: string;
|
6
|
+
onClick: () => void;
|
7
|
+
}
|
8
|
+
export interface QuickResponseProps {
|
9
|
+
/** Props for quick responses */
|
10
|
+
quickResponses: QuickResponse[];
|
11
|
+
/** Props for quick responses container */
|
12
|
+
quickResponseContainerProps?: Omit<LabelGroupProps, 'ref'>;
|
13
|
+
}
|
14
|
+
export declare const QuickResponse: React.FunctionComponent<QuickResponseProps>;
|
15
|
+
export default QuickResponse;
|
@@ -0,0 +1,33 @@
|
|
1
|
+
"use strict";
|
2
|
+
var __rest = (this && this.__rest) || function (s, e) {
|
3
|
+
var t = {};
|
4
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
5
|
+
t[p] = s[p];
|
6
|
+
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
7
|
+
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
8
|
+
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
9
|
+
t[p[i]] = s[p[i]];
|
10
|
+
}
|
11
|
+
return t;
|
12
|
+
};
|
13
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
14
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
15
|
+
};
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
17
|
+
exports.QuickResponse = void 0;
|
18
|
+
const react_1 = __importDefault(require("react"));
|
19
|
+
const react_core_1 = require("@patternfly/react-core");
|
20
|
+
const react_icons_1 = require("@patternfly/react-icons");
|
21
|
+
const QuickResponse = ({ quickResponses, quickResponseContainerProps = { numLabels: 5 } }) => {
|
22
|
+
const [selectedQuickResponse, setSelectedQuickResponse] = react_1.default.useState();
|
23
|
+
const handleQuickResponseClick = (id, onClick) => {
|
24
|
+
setSelectedQuickResponse(id);
|
25
|
+
onClick && onClick();
|
26
|
+
};
|
27
|
+
return (react_1.default.createElement(react_core_1.LabelGroup, Object.assign({ className: `pf-chatbot__message-quick-response ${quickResponseContainerProps === null || quickResponseContainerProps === void 0 ? void 0 : quickResponseContainerProps.className}` }, quickResponseContainerProps), quickResponses.map((_a) => {
|
28
|
+
var { id, onClick, content, className } = _a, props = __rest(_a, ["id", "onClick", "content", "className"]);
|
29
|
+
return (react_1.default.createElement(react_core_1.Label, Object.assign({ variant: id === selectedQuickResponse ? undefined : 'outline', icon: id === selectedQuickResponse ? react_1.default.createElement(react_icons_1.CheckIcon, null) : undefined, color: "blue", key: id, onClick: () => handleQuickResponseClick(id, onClick), className: `${id === selectedQuickResponse ? 'pf-chatbot__message-quick-response--selected' : ''} ${className ? className : ''}` }, props), content));
|
30
|
+
})));
|
31
|
+
};
|
32
|
+
exports.QuickResponse = QuickResponse;
|
33
|
+
exports.default = exports.QuickResponse;
|
@@ -0,0 +1,13 @@
|
|
1
|
+
import * as React from 'react';
|
2
|
+
interface FallbackImgProps {
|
3
|
+
/** Image source */
|
4
|
+
src: string;
|
5
|
+
/** Alt text for image */
|
6
|
+
alt?: string;
|
7
|
+
/** ClassName applied to image */
|
8
|
+
className?: string;
|
9
|
+
/** Fallback */
|
10
|
+
fallback?: React.ReactNode;
|
11
|
+
}
|
12
|
+
declare const FallbackImg: React.FC<FallbackImgProps>;
|
13
|
+
export default FallbackImg;
|