@patternfly/chatbot 6.5.0-prerelease.17 → 6.5.0-prerelease.19
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/ChatbotHeader/ChatbotHeaderMenu.js +29 -2
- package/dist/cjs/CodeModal/CodeModal.d.ts +2 -0
- package/dist/cjs/CodeModal/CodeModal.js +53 -12
- package/dist/cjs/Onboarding/Onboarding.d.ts +36 -0
- package/dist/cjs/Onboarding/Onboarding.js +37 -0
- package/dist/cjs/Onboarding/Onboarding.test.d.ts +1 -0
- package/dist/cjs/Onboarding/Onboarding.test.js +80 -0
- package/dist/cjs/Onboarding/index.d.ts +2 -0
- package/dist/cjs/Onboarding/index.js +23 -0
- package/dist/cjs/index.d.ts +2 -0
- package/dist/cjs/index.js +4 -1
- package/dist/css/main.css +83 -0
- package/dist/css/main.css.map +1 -1
- package/dist/dynamic/Onboarding/package.json +1 -0
- package/dist/esm/ChatbotHeader/ChatbotHeaderMenu.js +30 -3
- package/dist/esm/CodeModal/CodeModal.d.ts +2 -0
- package/dist/esm/CodeModal/CodeModal.js +54 -13
- package/dist/esm/Onboarding/Onboarding.d.ts +36 -0
- package/dist/esm/Onboarding/Onboarding.js +30 -0
- package/dist/esm/Onboarding/Onboarding.test.d.ts +1 -0
- package/dist/esm/Onboarding/Onboarding.test.js +75 -0
- package/dist/esm/Onboarding/index.d.ts +2 -0
- package/dist/esm/Onboarding/index.js +2 -0
- package/dist/esm/index.d.ts +2 -0
- package/dist/esm/index.js +2 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +12 -3
- package/patternfly-docs/content/extensions/chatbot/about-chatbot.md +3 -3
- package/patternfly-docs/content/extensions/chatbot/design-guidelines.md +3 -3
- package/patternfly-docs/content/extensions/chatbot/examples/Analytics/Analytics.md +1 -1
- package/patternfly-docs/content/extensions/chatbot/examples/Customizing Messages/Customizing Messages.md +1 -1
- package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithQuickResponses.tsx +11 -0
- package/patternfly-docs/content/extensions/chatbot/examples/Messages/Messages.md +1 -1
- package/patternfly-docs/content/extensions/chatbot/examples/UI/CompactOnboarding.tsx +141 -0
- package/patternfly-docs/content/extensions/chatbot/examples/UI/Onboarding.tsx +151 -0
- package/patternfly-docs/content/extensions/chatbot/examples/UI/RH-Hat-Image.svg +9 -0
- package/patternfly-docs/content/extensions/chatbot/examples/UI/UI.md +38 -20
- package/patternfly-docs/content/extensions/chatbot/examples/demos/AttachmentDemos.md +1 -1
- package/patternfly-docs/content/extensions/chatbot/examples/demos/Chatbot.md +2 -2
- package/patternfly-docs/patternfly-docs.config.js +1 -1
- package/src/ChatbotHeader/ChatbotHeaderMenu.tsx +56 -14
- package/src/ChatbotModal/ChatbotModal.scss +3 -0
- package/src/CodeModal/CodeModal.tsx +71 -26
- package/src/Onboarding/Onboarding.scss +101 -0
- package/src/Onboarding/Onboarding.test.tsx +148 -0
- package/src/Onboarding/Onboarding.tsx +126 -0
- package/src/Onboarding/index.ts +3 -0
- package/src/index.ts +3 -0
- package/src/main.scss +1 -0
- package/tsconfig.json +1 -1
|
@@ -1,3 +1,12 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
1
10
|
var __rest = (this && this.__rest) || function (s, e) {
|
|
2
11
|
var t = {};
|
|
3
12
|
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
@@ -12,22 +21,45 @@ var __rest = (this && this.__rest) || function (s, e) {
|
|
|
12
21
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
13
22
|
import { useState, useEffect, useRef } from 'react';
|
|
14
23
|
import path from 'path-browserify';
|
|
15
|
-
import * as monaco from 'monaco-editor';
|
|
16
|
-
import { loader } from '@monaco-editor/react';
|
|
17
24
|
// Import PatternFly components
|
|
18
25
|
import { CodeEditor } from '@patternfly/react-code-editor';
|
|
19
|
-
import { Button, getResizeObserver, ModalBody, ModalFooter, ModalHeader, Stack, StackItem } from '@patternfly/react-core';
|
|
26
|
+
import { Bullseye, Button, getResizeObserver, ModalBody, ModalFooter, ModalHeader, Spinner, Stack, StackItem } from '@patternfly/react-core';
|
|
20
27
|
import FileDetails, { extensionToLanguage } from '../FileDetails';
|
|
21
28
|
import { ChatbotDisplayMode } from '../Chatbot';
|
|
22
29
|
import ChatbotModal from '../ChatbotModal/ChatbotModal';
|
|
23
|
-
//
|
|
24
|
-
|
|
30
|
+
// Try to lazy load - some consumers need to be below a certain bundle size, but can't use the CDN and don't have webpack
|
|
31
|
+
let monacoInstance = null;
|
|
32
|
+
const loadMonaco = () => __awaiter(void 0, void 0, void 0, function* () {
|
|
33
|
+
if (!monacoInstance) {
|
|
34
|
+
const [monaco, { loader }] = yield Promise.all([import('monaco-editor'), import('@monaco-editor/react')]);
|
|
35
|
+
monacoInstance = monaco;
|
|
36
|
+
loader.config({ monaco });
|
|
37
|
+
}
|
|
38
|
+
return monacoInstance;
|
|
39
|
+
});
|
|
25
40
|
export const CodeModal = (_a) => {
|
|
26
|
-
var { fileName, code, codeEditorControlClassName: codeEditorClassName, handleModalToggle, isCopyEnabled, isLineNumbersVisible, isModalOpen, isReadOnly, onPrimaryAction, onSecondaryAction, primaryActionBtn, secondaryActionBtn, title, displayMode = ChatbotDisplayMode.default, isCompact, modalHeaderClassName, modalBodyClassName, modalFooterClassName } = _a, props = __rest(_a, ["fileName", "code", "codeEditorControlClassName", "handleModalToggle", "isCopyEnabled", "isLineNumbersVisible", "isModalOpen", "isReadOnly", "onPrimaryAction", "onSecondaryAction", "primaryActionBtn", "secondaryActionBtn", "title", "displayMode", "isCompact", "modalHeaderClassName", "modalBodyClassName", "modalFooterClassName"]);
|
|
41
|
+
var { fileName, code, codeEditorControlClassName: codeEditorClassName, handleModalToggle, isCopyEnabled, isLineNumbersVisible, isModalOpen, isReadOnly, onPrimaryAction, onSecondaryAction, primaryActionBtn, secondaryActionBtn, title, displayMode = ChatbotDisplayMode.default, isCompact, modalHeaderClassName, modalBodyClassName, modalFooterClassName, spinnerAriaLabel = 'Loading' } = _a, props = __rest(_a, ["fileName", "code", "codeEditorControlClassName", "handleModalToggle", "isCopyEnabled", "isLineNumbersVisible", "isModalOpen", "isReadOnly", "onPrimaryAction", "onSecondaryAction", "primaryActionBtn", "secondaryActionBtn", "title", "displayMode", "isCompact", "modalHeaderClassName", "modalBodyClassName", "modalFooterClassName", "spinnerAriaLabel"]);
|
|
27
42
|
const [newCode, setNewCode] = useState(code);
|
|
28
43
|
const [editorInstance, setEditorInstance] = useState(null);
|
|
29
44
|
const [isEditorReady, setIsEditorReady] = useState(false);
|
|
45
|
+
const [isMonacoLoading, setIsMonacoLoading] = useState(false);
|
|
46
|
+
const [isMonacoLoaded, setIsMonacoLoaded] = useState(false);
|
|
30
47
|
const containerRef = useRef(null);
|
|
48
|
+
useEffect(() => {
|
|
49
|
+
if (isModalOpen && !isMonacoLoaded && !isMonacoLoading) {
|
|
50
|
+
setIsMonacoLoading(true);
|
|
51
|
+
loadMonaco()
|
|
52
|
+
.then(() => {
|
|
53
|
+
setIsMonacoLoaded(true);
|
|
54
|
+
setIsMonacoLoading(false);
|
|
55
|
+
})
|
|
56
|
+
.catch((error) => {
|
|
57
|
+
// eslint-disable-next-line no-console
|
|
58
|
+
console.error('Failed to load Monaco editor:', error);
|
|
59
|
+
setIsMonacoLoading(false);
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
}, [isModalOpen, isMonacoLoaded, isMonacoLoading]);
|
|
31
63
|
useEffect(() => {
|
|
32
64
|
if (!isModalOpen || !isEditorReady || !editorInstance || !containerRef.current) {
|
|
33
65
|
return;
|
|
@@ -77,13 +109,22 @@ export const CodeModal = (_a) => {
|
|
|
77
109
|
setNewCode(value);
|
|
78
110
|
}
|
|
79
111
|
};
|
|
80
|
-
const
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
112
|
+
const renderMonacoEditor = () => {
|
|
113
|
+
if (isMonacoLoading) {
|
|
114
|
+
return (_jsx(Bullseye, { children: _jsx(Spinner, { "aria-label": spinnerAriaLabel }) }));
|
|
115
|
+
}
|
|
116
|
+
if (isMonacoLoaded) {
|
|
117
|
+
return (_jsx(CodeEditor, Object.assign({ isDarkTheme: true, isLineNumbersVisible: isLineNumbersVisible, isLanguageLabelVisible: true, isCopyEnabled: isCopyEnabled, isReadOnly: isReadOnly, code: newCode, language: extensionToLanguage[path.extname(fileName).slice(1)], onEditorDidMount: onEditorDidMount, onCodeChange: onCodeChange, className: codeEditorClassName, isFullHeight: true, options: {
|
|
118
|
+
glyphMargin: false,
|
|
119
|
+
folding: false,
|
|
120
|
+
// prevents Monaco from handling resizing itself
|
|
121
|
+
// was causing ResizeObserver issues
|
|
122
|
+
automaticLayout: false
|
|
123
|
+
} }, props)));
|
|
124
|
+
}
|
|
125
|
+
return null;
|
|
126
|
+
};
|
|
127
|
+
const modal = (_jsxs(ChatbotModal, { isOpen: isModalOpen, onClose: handleModalToggle, ouiaId: "CodeModal", "aria-labelledby": "code-modal-title", "aria-describedby": "code-modal", className: `pf-chatbot__code-modal ${isCompact ? 'pf-m-compact' : ''} pf-chatbot__code-modal--${displayMode}`, displayMode: displayMode, isCompact: isCompact, children: [_jsx(ModalHeader, { className: modalHeaderClassName, title: title, labelId: "code-modal-title" }), _jsx(ModalBody, { className: modalBodyClassName, id: "code-modal-body", children: _jsxs(Stack, { className: "pf-chatbot__code-modal-body", children: [_jsx(StackItem, { className: "pf-chatbot__code-modal-file-details", children: _jsx(FileDetails, { fileName: fileName }) }), _jsx("div", { className: "pf-v6-l-stack__item pf-chatbot__code-modal-editor", ref: containerRef, children: renderMonacoEditor() })] }) }), _jsxs(ModalFooter, { className: modalFooterClassName, children: [_jsx(Button, { isBlock: true, variant: "primary", onClick: handlePrimaryAction, form: "code-modal-form", children: primaryActionBtn }, "code-modal-primary"), _jsx(Button, { isBlock: true, variant: "link", onClick: handleSecondaryAction, children: secondaryActionBtn }, "code-modal-secondary")] })] }));
|
|
87
128
|
return modal;
|
|
88
129
|
};
|
|
89
130
|
export default CodeModal;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { FunctionComponent } from 'react';
|
|
2
|
+
import { ModalProps } from '@patternfly/react-core';
|
|
3
|
+
import { ChatbotDisplayMode } from '../Chatbot';
|
|
4
|
+
export interface OnboardingProps extends ModalProps {
|
|
5
|
+
/** Class applied to modal */
|
|
6
|
+
className?: string;
|
|
7
|
+
/** Action assigned to primary modal button */
|
|
8
|
+
onPrimaryAction?: (event: React.MouseEvent | MouseEvent | KeyboardEvent) => void;
|
|
9
|
+
/** Action assigned to secondary modal button */
|
|
10
|
+
onSecondaryAction: (event: React.MouseEvent | MouseEvent | KeyboardEvent) => void;
|
|
11
|
+
/** Name of primary modal button */
|
|
12
|
+
primaryActionBtn?: string;
|
|
13
|
+
/** Name of secondary modal button */
|
|
14
|
+
secondaryActionBtn?: string;
|
|
15
|
+
/** Function that handles modal toggle */
|
|
16
|
+
handleModalToggle: (event: React.MouseEvent | MouseEvent | KeyboardEvent) => void;
|
|
17
|
+
/** Whether modal is open */
|
|
18
|
+
isModalOpen: boolean;
|
|
19
|
+
/** Title of modal */
|
|
20
|
+
title?: string;
|
|
21
|
+
/** Display mode for the Chatbot parent; this influences the styles applied */
|
|
22
|
+
displayMode?: ChatbotDisplayMode;
|
|
23
|
+
/** Optional image displayed in header */
|
|
24
|
+
headerImage?: string;
|
|
25
|
+
/** Alt text for optional image displayed in header */
|
|
26
|
+
headerImageAltText?: string;
|
|
27
|
+
/** Ref applied to modal */
|
|
28
|
+
innerRef?: React.Ref<HTMLDivElement>;
|
|
29
|
+
/** OuiaID applied to modal */
|
|
30
|
+
ouiaId?: string;
|
|
31
|
+
/** Sets modal to compact styling. */
|
|
32
|
+
isCompact?: boolean;
|
|
33
|
+
}
|
|
34
|
+
export declare const OnboardingBase: FunctionComponent<OnboardingProps>;
|
|
35
|
+
declare const Onboarding: import("react").ForwardRefExoticComponent<Omit<OnboardingProps, "ref"> & import("react").RefAttributes<HTMLDivElement>>;
|
|
36
|
+
export default Onboarding;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
var __rest = (this && this.__rest) || function (s, e) {
|
|
2
|
+
var t = {};
|
|
3
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
4
|
+
t[p] = s[p];
|
|
5
|
+
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
6
|
+
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
7
|
+
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
8
|
+
t[p[i]] = s[p[i]];
|
|
9
|
+
}
|
|
10
|
+
return t;
|
|
11
|
+
};
|
|
12
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
13
|
+
import { forwardRef } from 'react';
|
|
14
|
+
import { Button, Content, ModalBody, ModalFooter } from '@patternfly/react-core';
|
|
15
|
+
import { ChatbotDisplayMode } from '../Chatbot';
|
|
16
|
+
import ChatbotModal from '../ChatbotModal/ChatbotModal';
|
|
17
|
+
export const OnboardingBase = (_a) => {
|
|
18
|
+
var { handleModalToggle, isModalOpen, onPrimaryAction, onSecondaryAction, primaryActionBtn = 'Continue', secondaryActionBtn = 'Skip', title = 'Onboarding', headerImage, headerImageAltText = '', displayMode = ChatbotDisplayMode.default, className, children, innerRef, ouiaId = 'Onboarding', isCompact } = _a, props = __rest(_a, ["handleModalToggle", "isModalOpen", "onPrimaryAction", "onSecondaryAction", "primaryActionBtn", "secondaryActionBtn", "title", "headerImage", "headerImageAltText", "displayMode", "className", "children", "innerRef", "ouiaId", "isCompact"]);
|
|
19
|
+
const handlePrimaryAction = (_event) => {
|
|
20
|
+
handleModalToggle(_event);
|
|
21
|
+
onPrimaryAction && onPrimaryAction(_event);
|
|
22
|
+
};
|
|
23
|
+
const handleSecondaryAction = (_event) => {
|
|
24
|
+
onSecondaryAction(_event);
|
|
25
|
+
};
|
|
26
|
+
const modal = (_jsx(ChatbotModal, Object.assign({ isOpen: isModalOpen, ouiaId: ouiaId, "aria-labelledby": "onboarding-title", "aria-describedby": "onboarding-modal", className: `pf-chatbot__onboarding-modal pf-chatbot__onboarding-modal--${displayMode} ${isCompact ? 'pf-m-compact' : ''} ${className ? className : ''}`, displayMode: displayMode, onClose: handleModalToggle }, props, { children: _jsx("section", { className: `pf-chatbot__onboarding--section`, "aria-label": title, tabIndex: -1, ref: innerRef, children: _jsxs(_Fragment, { children: [_jsxs(ModalBody, { className: "pf-chatbot__onboarding--modal-body", children: [!isCompact && headerImage && (_jsx("div", { className: "pf-chatbot__onboarding--header", children: _jsx("img", { src: headerImage, className: "pf-chatbot__onboarding--image", alt: headerImageAltText }) })), _jsxs("div", { className: "pf-chatbot__onboarding--modal-text", children: [_jsx("h1", { className: "pf-chatbot__onboarding--title", children: title }), _jsx(Content, { children: children })] })] }), _jsxs(ModalFooter, { className: "pf-chatbot__onboarding--footer", children: [_jsx(Button, { isBlock: true, variant: "primary", onClick: handlePrimaryAction, form: "onboarding-form", size: "lg", children: primaryActionBtn }, "onboarding-modal-primary"), _jsx(Button, { isBlock: true, variant: "secondary", onClick: handleSecondaryAction, size: "lg", children: secondaryActionBtn }, "onboarding-modal-secondary")] })] }) }) })));
|
|
27
|
+
return modal;
|
|
28
|
+
};
|
|
29
|
+
const Onboarding = forwardRef((props, ref) => (_jsx(OnboardingBase, Object.assign({ innerRef: ref }, props))));
|
|
30
|
+
export default Onboarding;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import '@testing-library/jest-dom';
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
11
|
+
import { render, screen } from '@testing-library/react';
|
|
12
|
+
import '@testing-library/jest-dom';
|
|
13
|
+
import userEvent from '@testing-library/user-event';
|
|
14
|
+
import Onboarding from './Onboarding';
|
|
15
|
+
const handleModalToggle = jest.fn();
|
|
16
|
+
const onPrimaryAction = jest.fn();
|
|
17
|
+
const onSecondaryAction = jest.fn();
|
|
18
|
+
const body = 'Experience personalized assistance and seamless problem-solving, simplifying your journey with Red Hat every step of the way.';
|
|
19
|
+
describe('Onboarding', () => {
|
|
20
|
+
afterEach(() => {
|
|
21
|
+
jest.clearAllMocks();
|
|
22
|
+
});
|
|
23
|
+
it('should render modal correctly', () => {
|
|
24
|
+
render(_jsx(Onboarding, { isModalOpen: true, onSecondaryAction: onSecondaryAction, handleModalToggle: handleModalToggle, ouiaId: "Terms", children: body }));
|
|
25
|
+
expect(screen.getByRole('heading', { name: /Onboarding/i })).toBeTruthy();
|
|
26
|
+
expect(screen.getByRole('button', { name: /Continue/i })).toBeTruthy();
|
|
27
|
+
expect(screen.getByRole('button', { name: /Skip/i })).toBeTruthy();
|
|
28
|
+
expect(screen.getByText(body)).toBeTruthy();
|
|
29
|
+
expect(screen.getByRole('dialog')).toHaveClass('pf-chatbot__onboarding-modal');
|
|
30
|
+
expect(screen.getByRole('dialog')).toHaveClass('pf-chatbot__onboarding-modal--default');
|
|
31
|
+
});
|
|
32
|
+
it('should handle image and altText props', () => {
|
|
33
|
+
render(_jsx(Onboarding, { isModalOpen: true, onSecondaryAction: onSecondaryAction, handleModalToggle: handleModalToggle, headerImage: "./image.png", headerImageAltText: "Test image", children: body }));
|
|
34
|
+
expect(screen.getByRole('img')).toBeTruthy();
|
|
35
|
+
expect(screen.getByRole('img')).toHaveAttribute('alt', 'Test image');
|
|
36
|
+
});
|
|
37
|
+
it('should handle className prop', () => {
|
|
38
|
+
render(_jsx(Onboarding, { isModalOpen: true, onSecondaryAction: onSecondaryAction, handleModalToggle: handleModalToggle, className: "test", children: body }));
|
|
39
|
+
expect(screen.getByRole('dialog')).toHaveClass('pf-chatbot__onboarding-modal');
|
|
40
|
+
expect(screen.getByRole('dialog')).toHaveClass('pf-chatbot__onboarding-modal--default');
|
|
41
|
+
expect(screen.getByRole('dialog')).toHaveClass('test');
|
|
42
|
+
});
|
|
43
|
+
it('should handle title prop', () => {
|
|
44
|
+
render(_jsx(Onboarding, { isModalOpen: true, onSecondaryAction: onSecondaryAction, handleModalToggle: handleModalToggle, title: "Updated title", children: body }));
|
|
45
|
+
expect(screen.getByRole('heading', { name: /Updated title/i })).toBeTruthy();
|
|
46
|
+
expect(screen.queryByRole('heading', { name: /Onboarding/i })).toBeFalsy();
|
|
47
|
+
});
|
|
48
|
+
it('should handle primary button prop', () => {
|
|
49
|
+
render(_jsx(Onboarding, { isModalOpen: true, onSecondaryAction: onSecondaryAction, handleModalToggle: handleModalToggle, primaryActionBtn: "First", children: body }));
|
|
50
|
+
expect(screen.getByRole('button', { name: /First/i })).toBeTruthy();
|
|
51
|
+
expect(screen.queryByRole('button', { name: /Continue/i })).toBeFalsy();
|
|
52
|
+
});
|
|
53
|
+
it('should handle secondary button prop', () => {
|
|
54
|
+
render(_jsx(Onboarding, { isModalOpen: true, onSecondaryAction: onSecondaryAction, handleModalToggle: handleModalToggle, secondaryActionBtn: "Second", children: body }));
|
|
55
|
+
expect(screen.getByRole('button', { name: /Second/i })).toBeTruthy();
|
|
56
|
+
expect(screen.queryByRole('button', { name: /Skip/i })).toBeFalsy();
|
|
57
|
+
});
|
|
58
|
+
it('should handle primary button click', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
59
|
+
render(_jsx(Onboarding, { isModalOpen: true, onPrimaryAction: onPrimaryAction, onSecondaryAction: onSecondaryAction, handleModalToggle: handleModalToggle, children: body }));
|
|
60
|
+
yield userEvent.click(screen.getByRole('button', { name: /Continue/i }));
|
|
61
|
+
expect(onPrimaryAction).toHaveBeenCalledTimes(1);
|
|
62
|
+
expect(handleModalToggle).toHaveBeenCalledTimes(1);
|
|
63
|
+
}));
|
|
64
|
+
it('should handle secondary button click', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
65
|
+
render(_jsx(Onboarding, { isModalOpen: true, onSecondaryAction: onSecondaryAction, handleModalToggle: handleModalToggle, children: body }));
|
|
66
|
+
yield userEvent.click(screen.getByRole('button', { name: /Skip/i }));
|
|
67
|
+
expect(onSecondaryAction).toHaveBeenCalledTimes(1);
|
|
68
|
+
expect(handleModalToggle).not.toHaveBeenCalled();
|
|
69
|
+
}));
|
|
70
|
+
it('should handle isCompact prop', () => {
|
|
71
|
+
render(_jsx(Onboarding, { isModalOpen: true, onSecondaryAction: onSecondaryAction, handleModalToggle: handleModalToggle, isCompact: true, headerImage: "./image.png", headerImageAltText: "Test image", children: body }));
|
|
72
|
+
expect(screen.getByRole('dialog')).toHaveClass('pf-m-compact');
|
|
73
|
+
expect(screen.queryByRole('img')).toBeFalsy();
|
|
74
|
+
});
|
|
75
|
+
});
|
package/dist/esm/index.d.ts
CHANGED
|
@@ -48,6 +48,8 @@ export { default as MessageBox } from './MessageBox';
|
|
|
48
48
|
export * from './MessageBox';
|
|
49
49
|
export { default as MessageDivider } from './MessageDivider';
|
|
50
50
|
export * from './MessageDivider';
|
|
51
|
+
export { default as Onboarding } from './Onboarding';
|
|
52
|
+
export * from './Onboarding';
|
|
51
53
|
export { default as PreviewAttachment } from './PreviewAttachment';
|
|
52
54
|
export * from './PreviewAttachment';
|
|
53
55
|
export { default as ResponseActions } from './ResponseActions';
|
package/dist/esm/index.js
CHANGED
|
@@ -49,6 +49,8 @@ export { default as MessageBox } from './MessageBox';
|
|
|
49
49
|
export * from './MessageBox';
|
|
50
50
|
export { default as MessageDivider } from './MessageDivider';
|
|
51
51
|
export * from './MessageDivider';
|
|
52
|
+
export { default as Onboarding } from './Onboarding';
|
|
53
|
+
export * from './Onboarding';
|
|
52
54
|
export { default as PreviewAttachment } from './PreviewAttachment';
|
|
53
55
|
export * from './PreviewAttachment';
|
|
54
56
|
export { default as ResponseActions } from './ResponseActions';
|
|
@@ -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/EmptyState.tsx","../src/ChatbotConversationHistoryNav/LoadingState.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/ChatbotHeaderNewChatButton.test.tsx","../src/ChatbotHeader/ChatbotHeaderNewChatButton.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.test.tsx","../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.test.tsx","../src/CodeModal/CodeModal.tsx","../src/CodeModal/index.ts","../src/Compare/Compare.test.tsx","../src/Compare/Compare.tsx","../src/Compare/index.ts","../src/DeepThinking/DeepThinking.test.tsx","../src/DeepThinking/DeepThinking.tsx","../src/DeepThinking/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/FilePreview/FilePreview.test.tsx","../src/FilePreview/FilePreview.tsx","../src/FilePreview/index.ts","../src/ImagePreview/ImagePreview.test.tsx","../src/ImagePreview/ImagePreview.tsx","../src/ImagePreview/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/MessageInput.tsx","../src/Message/MessageLoading.tsx","../src/Message/index.ts","../src/Message/CodeBlockMessage/CodeBlockMessage.tsx","../src/Message/ErrorMessage/ErrorMessage.tsx","../src/Message/ImageMessage/ImageMessage.tsx","../src/Message/LinkMessage/LinkMessage.tsx","../src/Message/ListMessage/ListItemMessage.tsx","../src/Message/ListMessage/OrderedListMessage.tsx","../src/Message/ListMessage/UnorderedListMessage.tsx","../src/Message/Plugins/index.ts","../src/Message/Plugins/rehypeCodeBlockToggle.ts","../src/Message/Plugins/rehypeMoveImagesOutOfParagraphs.ts","../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/SuperscriptMessage/SuperscriptMessage.tsx","../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/MessageDivider/MessageDivider.test.tsx","../src/MessageDivider/MessageDivider.tsx","../src/MessageDivider/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/SourcesCardBase/SourcesCardBase.test.tsx","../src/SourcesCardBase/SourcesCardBase.tsx","../src/SourcesCardBase/index.ts","../src/TermsOfUse/TermsOfUse.test.tsx","../src/TermsOfUse/TermsOfUse.tsx","../src/TermsOfUse/index.ts","../src/ToolCall/ToolCall.test.tsx","../src/ToolCall/ToolCall.tsx","../src/ToolCall/index.ts","../src/ToolResponse/ToolResponse.test.tsx","../src/ToolResponse/ToolResponse.tsx","../src/ToolResponse/index.ts","../src/__mocks__/monaco-editor.ts","../src/__mocks__/rehype-external-links.ts","../src/__mocks__/rehype-highlight.ts","../src/__mocks__/rehype-sanitize.ts","../src/__mocks__/rehype-unwrap-images.tsx","../src/tracking/console_tracking_provider.ts","../src/tracking/index.ts","../src/tracking/posthog_tracking_provider.ts","../src/tracking/segment_tracking_provider.ts","../src/tracking/trackingProviderProxy.ts","../src/tracking/tracking_api.ts","../src/tracking/tracking_registry.ts","../src/tracking/tracking_spi.ts","../src/tracking/umami_tracking_provider.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/EmptyState.tsx","../src/ChatbotConversationHistoryNav/LoadingState.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/ChatbotHeaderNewChatButton.test.tsx","../src/ChatbotHeader/ChatbotHeaderNewChatButton.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.test.tsx","../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.test.tsx","../src/CodeModal/CodeModal.tsx","../src/CodeModal/index.ts","../src/Compare/Compare.test.tsx","../src/Compare/Compare.tsx","../src/Compare/index.ts","../src/DeepThinking/DeepThinking.test.tsx","../src/DeepThinking/DeepThinking.tsx","../src/DeepThinking/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/FilePreview/FilePreview.test.tsx","../src/FilePreview/FilePreview.tsx","../src/FilePreview/index.ts","../src/ImagePreview/ImagePreview.test.tsx","../src/ImagePreview/ImagePreview.tsx","../src/ImagePreview/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/MessageInput.tsx","../src/Message/MessageLoading.tsx","../src/Message/index.ts","../src/Message/CodeBlockMessage/CodeBlockMessage.tsx","../src/Message/ErrorMessage/ErrorMessage.tsx","../src/Message/ImageMessage/ImageMessage.tsx","../src/Message/LinkMessage/LinkMessage.tsx","../src/Message/ListMessage/ListItemMessage.tsx","../src/Message/ListMessage/OrderedListMessage.tsx","../src/Message/ListMessage/UnorderedListMessage.tsx","../src/Message/Plugins/index.ts","../src/Message/Plugins/rehypeCodeBlockToggle.ts","../src/Message/Plugins/rehypeMoveImagesOutOfParagraphs.ts","../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/SuperscriptMessage/SuperscriptMessage.tsx","../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/MessageDivider/MessageDivider.test.tsx","../src/MessageDivider/MessageDivider.tsx","../src/MessageDivider/index.ts","../src/Onboarding/Onboarding.test.tsx","../src/Onboarding/Onboarding.tsx","../src/Onboarding/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/SourcesCardBase/SourcesCardBase.test.tsx","../src/SourcesCardBase/SourcesCardBase.tsx","../src/SourcesCardBase/index.ts","../src/TermsOfUse/TermsOfUse.test.tsx","../src/TermsOfUse/TermsOfUse.tsx","../src/TermsOfUse/index.ts","../src/ToolCall/ToolCall.test.tsx","../src/ToolCall/ToolCall.tsx","../src/ToolCall/index.ts","../src/ToolResponse/ToolResponse.test.tsx","../src/ToolResponse/ToolResponse.tsx","../src/ToolResponse/index.ts","../src/__mocks__/monaco-editor.ts","../src/__mocks__/rehype-external-links.ts","../src/__mocks__/rehype-highlight.ts","../src/__mocks__/rehype-sanitize.ts","../src/__mocks__/rehype-unwrap-images.tsx","../src/tracking/console_tracking_provider.ts","../src/tracking/index.ts","../src/tracking/posthog_tracking_provider.ts","../src/tracking/segment_tracking_provider.ts","../src/tracking/trackingProviderProxy.ts","../src/tracking/tracking_api.ts","../src/tracking/tracking_registry.ts","../src/tracking/tracking_spi.ts","../src/tracking/umami_tracking_provider.ts"],"version":"5.6.3"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@patternfly/chatbot",
|
|
3
|
-
"version": "6.5.0-prerelease.
|
|
3
|
+
"version": "6.5.0-prerelease.19",
|
|
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",
|
|
@@ -36,11 +36,10 @@
|
|
|
36
36
|
"@patternfly/react-code-editor": "^6.1.0",
|
|
37
37
|
"@patternfly/react-core": "^6.1.0",
|
|
38
38
|
"@patternfly/react-icons": "^6.1.0",
|
|
39
|
-
"@patternfly/react-table": "^6.1.0",
|
|
40
39
|
"@patternfly/react-styles": "^6.1.0",
|
|
40
|
+
"@patternfly/react-table": "^6.1.0",
|
|
41
41
|
"@segment/analytics-next": "^1.76.0",
|
|
42
42
|
"clsx": "^2.1.0",
|
|
43
|
-
"monaco-editor": "^0.54.0",
|
|
44
43
|
"path-browserify": "^1.0.1",
|
|
45
44
|
"posthog-js": "^1.194.4",
|
|
46
45
|
"react-markdown": "^9.0.1",
|
|
@@ -52,9 +51,19 @@
|
|
|
52
51
|
"unist-util-visit": "^5.0.0"
|
|
53
52
|
},
|
|
54
53
|
"peerDependencies": {
|
|
54
|
+
"@monaco-editor/react": "^4.7.0",
|
|
55
|
+
"monaco-editor": "^0.54.0",
|
|
55
56
|
"react": "^18 || ^19",
|
|
56
57
|
"react-dom": "^18 || ^19"
|
|
57
58
|
},
|
|
59
|
+
"peerDependenciesMeta": {
|
|
60
|
+
"@monaco-editor/react": {
|
|
61
|
+
"optional": false
|
|
62
|
+
},
|
|
63
|
+
"monaco-editor": {
|
|
64
|
+
"optional": false
|
|
65
|
+
}
|
|
66
|
+
},
|
|
58
67
|
"devDependencies": {
|
|
59
68
|
"@octokit/rest": "^18.0.0",
|
|
60
69
|
"@patternfly/documentation-framework": "6.28.9",
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
section:
|
|
2
|
+
section: extensions
|
|
3
3
|
subsection: ChatBot
|
|
4
4
|
id: Overview
|
|
5
5
|
sortValue: 1
|
|
@@ -8,7 +8,7 @@ source: About
|
|
|
8
8
|
|
|
9
9
|
**Note:** The PatternFly ChatBot extension lives in its own package [`@patternfly/chatbot`](https://www.npmjs.com/package/@patternfly/chatbot)
|
|
10
10
|
|
|
11
|
-
It is important to leverage AI in a way that improves the experiences of your users. In alignment with our [AI principles](/
|
|
11
|
+
It is important to leverage AI in a way that improves the experiences of your users. In alignment with our [AI principles](/ai/about-ai#ai-principles) and [ethical design guidelines,](/ai/ai-guidelines) we've created this ChatBot extension. The PatternFly ChatBot contains a React implementation of an AI ChatBot, to provide your users with access to convenient and persistent help.
|
|
12
12
|
|
|
13
13
|
_Only use this ChatBot when it adds value to your users' experiences._ Don't use it simply for the sake of novelty—your users will only be excited to interact with a new ChatBot feature if it directly helps them reach their goals.
|
|
14
14
|
|
|
@@ -22,7 +22,7 @@ To illustrate the capabilities of the ChatBot, including more complex interactio
|
|
|
22
22
|
- [ChatBot attachments via file upload](/extensions/chatbot/messages/demo#attach-via-upload-button-in-message-bar)
|
|
23
23
|
- [ChatBot attachments via built-in menu](/extensions/chatbot/messages/demo#attach-via-menu-of-options-in-message-bar)
|
|
24
24
|
|
|
25
|
-
To learn how to write for ChatBot experiences, refer to our [conversation design guidelines](/
|
|
25
|
+
To learn how to write for ChatBot experiences, refer to our [conversation design guidelines](/ai/conversation-design/#writing-for-chatbots).
|
|
26
26
|
|
|
27
27
|
To learn how to design ChatBot experiences, [refer to the design guidelines](/extensions/chatbot/overview/design-guidelines).
|
|
28
28
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
section:
|
|
2
|
+
section: extensions
|
|
3
3
|
subsection: ChatBot
|
|
4
4
|
id: Overview
|
|
5
5
|
sortValue: 1
|
|
@@ -351,7 +351,7 @@ Choose the download action location that best works for your ChatBot:
|
|
|
351
351
|
|
|
352
352
|
#### Download via conversation history drawer
|
|
353
353
|
|
|
354
|
-
If your ChatBot uses a conversation history drawer, you can provide a download option in the [actions menu linked to a previous conversation](/
|
|
354
|
+
If your ChatBot uses a conversation history drawer, you can provide a download option in the [actions menu linked to a previous conversation](/extensions/chatbot/ui#drawer-with-conversation-actions).
|
|
355
355
|
|
|
356
356
|
<div class="ws-docs-content-img">
|
|
357
357
|

|
|
@@ -429,7 +429,7 @@ Refer to the additional guidelines for [accessing a ChatBot](#accessing-a-chatbo
|
|
|
429
429
|
|
|
430
430
|
## Content considerations
|
|
431
431
|
|
|
432
|
-
For guidance on writing ChatBot content, refer to our [conversation design guidelines](/
|
|
432
|
+
For guidance on writing ChatBot content, refer to our [conversation design guidelines](/ai/conversation-design).
|
|
433
433
|
|
|
434
434
|
## Accessibility
|
|
435
435
|
|
package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithQuickResponses.tsx
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { FunctionComponent } from 'react';
|
|
2
2
|
import Message from '@patternfly/chatbot/dist/dynamic/Message';
|
|
3
3
|
import patternflyAvatar from './patternfly_avatar.jpg';
|
|
4
|
+
import { CopyIcon, WrenchIcon } from '@patternfly/react-icons';
|
|
4
5
|
|
|
5
6
|
export const MessageWithQuickResponsesExample: FunctionComponent = () => (
|
|
6
7
|
<>
|
|
@@ -74,5 +75,15 @@ export const MessageWithQuickResponsesExample: FunctionComponent = () => (
|
|
|
74
75
|
]}
|
|
75
76
|
isCompact
|
|
76
77
|
/>
|
|
78
|
+
<Message
|
|
79
|
+
name="Bot"
|
|
80
|
+
role="bot"
|
|
81
|
+
avatar={patternflyAvatar}
|
|
82
|
+
content="Example with icons"
|
|
83
|
+
quickResponses={[
|
|
84
|
+
{ id: '1', content: 'Update your settings', onClick: () => alert('Clicked yes'), icon: <WrenchIcon /> },
|
|
85
|
+
{ id: '2', content: 'Copy', onClick: () => alert('Clicked no'), icon: <CopyIcon /> }
|
|
86
|
+
]}
|
|
87
|
+
/>
|
|
77
88
|
</>
|
|
78
89
|
);
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import {
|
|
2
|
+
useRef,
|
|
3
|
+
useState,
|
|
4
|
+
FunctionComponent,
|
|
5
|
+
MouseEvent,
|
|
6
|
+
CSSProperties,
|
|
7
|
+
Ref,
|
|
8
|
+
MouseEvent as ReactMouseEvent
|
|
9
|
+
} from 'react';
|
|
10
|
+
import {
|
|
11
|
+
Button,
|
|
12
|
+
SkipToContent,
|
|
13
|
+
MenuToggle,
|
|
14
|
+
MenuToggleElement,
|
|
15
|
+
Select,
|
|
16
|
+
SelectList,
|
|
17
|
+
SelectOption,
|
|
18
|
+
Stack
|
|
19
|
+
} from '@patternfly/react-core';
|
|
20
|
+
import Onboarding from '@patternfly/chatbot/dist/dynamic/Onboarding';
|
|
21
|
+
import Chatbot, { ChatbotDisplayMode } from '@patternfly/chatbot/dist/dynamic/Chatbot';
|
|
22
|
+
|
|
23
|
+
export const OnboardingExample: FunctionComponent = () => {
|
|
24
|
+
const [isModalOpen, setIsModalOpen] = useState(true);
|
|
25
|
+
const [displayMode, setDisplayMode] = useState(ChatbotDisplayMode.default);
|
|
26
|
+
const chatbotRef = useRef<HTMLDivElement>(null);
|
|
27
|
+
const termsRef = useRef<HTMLDivElement>(null);
|
|
28
|
+
const [isOpen, setIsOpen] = useState(false);
|
|
29
|
+
const [selected, setSelected] = useState<string>('Select display mode');
|
|
30
|
+
|
|
31
|
+
const handleSkipToContent = (e) => {
|
|
32
|
+
e.preventDefault();
|
|
33
|
+
if (!isModalOpen && chatbotRef.current) {
|
|
34
|
+
chatbotRef.current.focus();
|
|
35
|
+
}
|
|
36
|
+
if (isModalOpen && termsRef.current) {
|
|
37
|
+
termsRef.current.focus();
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
const handleModalToggle = (_event: MouseEvent | MouseEvent | KeyboardEvent) => {
|
|
42
|
+
setIsModalOpen(!isModalOpen);
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
const onPrimaryAction = () => {
|
|
46
|
+
// eslint-disable-next-line no-console
|
|
47
|
+
console.log('Clicked primary action');
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
const onSecondaryAction = () => {
|
|
51
|
+
// eslint-disable-next-line no-console
|
|
52
|
+
console.log('Clicked secondary action');
|
|
53
|
+
};
|
|
54
|
+
const onSelect = (_event: ReactMouseEvent<Element, MouseEvent> | undefined, value: string | number | undefined) => {
|
|
55
|
+
setSelected(value as string);
|
|
56
|
+
setIsOpen(false);
|
|
57
|
+
if (value === 'Default') {
|
|
58
|
+
setDisplayMode(ChatbotDisplayMode.default);
|
|
59
|
+
}
|
|
60
|
+
if (value === 'Docked') {
|
|
61
|
+
setDisplayMode(ChatbotDisplayMode.docked);
|
|
62
|
+
}
|
|
63
|
+
if (value === 'Fullscreen') {
|
|
64
|
+
setDisplayMode(ChatbotDisplayMode.fullscreen);
|
|
65
|
+
}
|
|
66
|
+
if (value === 'Embedded') {
|
|
67
|
+
setDisplayMode(ChatbotDisplayMode.embedded);
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
const onToggleClick = () => {
|
|
72
|
+
setIsOpen(!isOpen);
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
const toggle = (toggleRef: Ref<MenuToggleElement>) => (
|
|
76
|
+
<MenuToggle
|
|
77
|
+
ref={toggleRef}
|
|
78
|
+
onClick={onToggleClick}
|
|
79
|
+
isExpanded={isOpen}
|
|
80
|
+
style={
|
|
81
|
+
{
|
|
82
|
+
width: '200px'
|
|
83
|
+
} as CSSProperties
|
|
84
|
+
}
|
|
85
|
+
aria-label={selected === 'Select display mode' ? 'Select display mode' : `Display mode, ${selected}`}
|
|
86
|
+
>
|
|
87
|
+
{selected}
|
|
88
|
+
</MenuToggle>
|
|
89
|
+
);
|
|
90
|
+
|
|
91
|
+
const body = 'Simplify your Red Hat journey with personalized assistance and seamless problem-solving.';
|
|
92
|
+
|
|
93
|
+
return (
|
|
94
|
+
<>
|
|
95
|
+
<SkipToContent style={{ zIndex: '999' }} onClick={handleSkipToContent} href="#">
|
|
96
|
+
Skip to chatbot
|
|
97
|
+
</SkipToContent>
|
|
98
|
+
<div
|
|
99
|
+
style={{
|
|
100
|
+
position: 'fixed',
|
|
101
|
+
padding: 'var(--pf-t--global--spacer--lg)',
|
|
102
|
+
zIndex: '601',
|
|
103
|
+
boxShadow: 'var(--pf-t--global--box-shadow--lg)'
|
|
104
|
+
}}
|
|
105
|
+
>
|
|
106
|
+
<Stack hasGutter>
|
|
107
|
+
<Select
|
|
108
|
+
id="single-select"
|
|
109
|
+
isOpen={isOpen}
|
|
110
|
+
selected={selected}
|
|
111
|
+
onSelect={onSelect}
|
|
112
|
+
onOpenChange={(isOpen) => setIsOpen(isOpen)}
|
|
113
|
+
toggle={toggle}
|
|
114
|
+
shouldFocusToggleOnSelect
|
|
115
|
+
>
|
|
116
|
+
<SelectList>
|
|
117
|
+
<SelectOption value="Default">Default</SelectOption>
|
|
118
|
+
<SelectOption value="Docked">Docked</SelectOption>
|
|
119
|
+
<SelectOption value="Fullscreen">Fullscreen</SelectOption>
|
|
120
|
+
<SelectOption value="Embedded">Embedded</SelectOption>
|
|
121
|
+
</SelectList>
|
|
122
|
+
</Select>
|
|
123
|
+
<Button onClick={handleModalToggle}>Toggle modal</Button>
|
|
124
|
+
</Stack>
|
|
125
|
+
</div>
|
|
126
|
+
<Chatbot ref={chatbotRef} displayMode={displayMode} isVisible isCompact></Chatbot>
|
|
127
|
+
<Onboarding
|
|
128
|
+
ref={termsRef}
|
|
129
|
+
displayMode={displayMode}
|
|
130
|
+
isModalOpen={isModalOpen}
|
|
131
|
+
handleModalToggle={handleModalToggle}
|
|
132
|
+
onPrimaryAction={onPrimaryAction}
|
|
133
|
+
onSecondaryAction={onSecondaryAction}
|
|
134
|
+
title="Redefine work in the age of AI"
|
|
135
|
+
isCompact
|
|
136
|
+
>
|
|
137
|
+
{body}
|
|
138
|
+
</Onboarding>
|
|
139
|
+
</>
|
|
140
|
+
);
|
|
141
|
+
};
|