@patternfly/chatbot 6.4.0-prerelease.2 → 6.4.0-prerelease.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/Chatbot/Chatbot.js +1 -7
- package/dist/cjs/ChatbotConversationHistoryNav/ChatbotConversationHistoryDropdown.d.ts +2 -0
- package/dist/cjs/ChatbotConversationHistoryNav/ChatbotConversationHistoryDropdown.js +2 -2
- package/dist/cjs/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.d.ts +22 -2
- package/dist/cjs/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.js +15 -9
- package/dist/cjs/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.test.js +40 -2
- package/dist/cjs/ChatbotHeader/ChatbotHeaderMenu.js +1 -1
- package/dist/cjs/ChatbotHeader/ChatbotHeaderMenu.test.js +1 -1
- package/dist/cjs/ChatbotHeader/ChatbotHeaderNewChatButton.d.ts +18 -0
- package/dist/cjs/ChatbotHeader/ChatbotHeaderNewChatButton.js +25 -0
- package/dist/cjs/ChatbotHeader/ChatbotHeaderNewChatButton.test.d.ts +1 -0
- package/dist/cjs/ChatbotHeader/ChatbotHeaderNewChatButton.test.js +22 -0
- package/dist/cjs/ChatbotHeader/index.d.ts +1 -0
- package/dist/cjs/ChatbotHeader/index.js +1 -0
- package/dist/cjs/DeepThinking/DeepThinking.d.ts +18 -0
- package/dist/cjs/DeepThinking/DeepThinking.js +18 -0
- package/dist/cjs/DeepThinking/DeepThinking.test.d.ts +1 -0
- package/dist/cjs/DeepThinking/DeepThinking.test.js +48 -0
- package/dist/cjs/DeepThinking/index.d.ts +2 -0
- package/dist/cjs/DeepThinking/index.js +23 -0
- package/dist/cjs/FileDetails/FileDetails.d.ts +22 -3
- package/dist/cjs/FileDetails/FileDetails.js +27 -912
- package/dist/cjs/FileDetails/FileDetails.test.js +16 -0
- package/dist/cjs/FileDetailsLabel/FileDetailsLabel.d.ts +8 -2
- package/dist/cjs/FileDetailsLabel/FileDetailsLabel.js +14 -2
- package/dist/cjs/FileDetailsLabel/FileDetailsLabel.test.js +19 -1
- package/dist/cjs/FilePreview/FilePreview.d.ts +26 -0
- package/dist/cjs/FilePreview/FilePreview.js +26 -0
- package/dist/cjs/FilePreview/FilePreview.test.d.ts +1 -0
- package/dist/cjs/FilePreview/FilePreview.test.js +97 -0
- package/dist/cjs/FilePreview/index.d.ts +2 -0
- package/dist/cjs/FilePreview/index.js +23 -0
- package/dist/cjs/ImagePreview/ImagePreview.d.ts +53 -0
- package/dist/cjs/ImagePreview/ImagePreview.js +47 -0
- package/dist/cjs/ImagePreview/ImagePreview.test.d.ts +1 -0
- package/dist/cjs/ImagePreview/ImagePreview.test.js +225 -0
- package/dist/cjs/ImagePreview/index.d.ts +2 -0
- package/dist/cjs/ImagePreview/index.js +23 -0
- package/dist/cjs/Message/CodeBlockMessage/CodeBlockMessage.js +3 -3
- package/dist/cjs/Message/LinkMessage/LinkMessage.d.ts +2 -1
- package/dist/cjs/Message/LinkMessage/LinkMessage.js +7 -3
- package/dist/cjs/Message/ListMessage/ListItemMessage.d.ts +1 -1
- package/dist/cjs/Message/ListMessage/ListItemMessage.js +16 -1
- package/dist/cjs/Message/Message.d.ts +15 -0
- package/dist/cjs/Message/Message.js +129 -32
- package/dist/cjs/Message/Message.test.js +71 -0
- package/dist/cjs/Message/SuperscriptMessage/SuperscriptMessage.d.ts +3 -0
- package/dist/cjs/Message/SuperscriptMessage/SuperscriptMessage.js +5 -0
- package/dist/cjs/Message/UserFeedback/UserFeedback.d.ts +15 -1
- package/dist/cjs/Message/UserFeedback/UserFeedback.js +4 -4
- package/dist/cjs/Message/UserFeedback/UserFeedback.test.js +44 -0
- package/dist/cjs/MessageBar/MessageBar.js +19 -4
- package/dist/cjs/MessageBox/JumpButton.d.ts +5 -0
- package/dist/cjs/MessageBox/JumpButton.js +1 -1
- package/dist/cjs/MessageBox/JumpButton.test.js +4 -4
- package/dist/cjs/MessageBox/MessageBox.d.ts +9 -0
- package/dist/cjs/MessageBox/MessageBox.js +2 -2
- package/dist/cjs/MessageBox/MessageBox.test.js +2 -2
- package/dist/cjs/SourcesCard/SourcesCard.d.ts +13 -1
- package/dist/cjs/SourcesCard/SourcesCard.js +6 -6
- package/dist/cjs/SourcesCard/SourcesCard.test.js +49 -0
- package/dist/cjs/ToolResponse/ToolResponse.d.ts +30 -0
- package/dist/cjs/ToolResponse/ToolResponse.js +18 -0
- package/dist/cjs/ToolResponse/ToolResponse.test.d.ts +1 -0
- package/dist/cjs/ToolResponse/ToolResponse.test.js +60 -0
- package/dist/cjs/ToolResponse/index.d.ts +2 -0
- package/dist/cjs/ToolResponse/index.js +23 -0
- package/dist/cjs/index.d.ts +8 -0
- package/dist/cjs/index.js +13 -1
- package/dist/css/main.css +339 -27
- package/dist/css/main.css.map +1 -1
- package/dist/dynamic/DeepThinking/package.json +1 -0
- package/dist/dynamic/FilePreview/package.json +1 -0
- package/dist/dynamic/ImagePreview/package.json +1 -0
- package/dist/dynamic/ToolResponse/package.json +1 -0
- package/dist/esm/Chatbot/Chatbot.js +1 -7
- package/dist/esm/ChatbotConversationHistoryNav/ChatbotConversationHistoryDropdown.d.ts +2 -0
- package/dist/esm/ChatbotConversationHistoryNav/ChatbotConversationHistoryDropdown.js +2 -2
- package/dist/esm/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.d.ts +22 -2
- package/dist/esm/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.js +17 -11
- package/dist/esm/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.test.js +41 -3
- package/dist/esm/ChatbotHeader/ChatbotHeaderMenu.js +1 -1
- package/dist/esm/ChatbotHeader/ChatbotHeaderMenu.test.js +1 -1
- package/dist/esm/ChatbotHeader/ChatbotHeaderNewChatButton.d.ts +18 -0
- package/dist/esm/ChatbotHeader/ChatbotHeaderNewChatButton.js +22 -0
- package/dist/esm/ChatbotHeader/ChatbotHeaderNewChatButton.test.d.ts +1 -0
- package/dist/esm/ChatbotHeader/ChatbotHeaderNewChatButton.test.js +20 -0
- package/dist/esm/ChatbotHeader/index.d.ts +1 -0
- package/dist/esm/ChatbotHeader/index.js +1 -0
- package/dist/esm/DeepThinking/DeepThinking.d.ts +18 -0
- package/dist/esm/DeepThinking/DeepThinking.js +14 -0
- package/dist/esm/DeepThinking/DeepThinking.test.d.ts +1 -0
- package/dist/esm/DeepThinking/DeepThinking.test.js +43 -0
- package/dist/esm/DeepThinking/index.d.ts +2 -0
- package/dist/esm/DeepThinking/index.js +2 -0
- package/dist/esm/FileDetails/FileDetails.d.ts +22 -3
- package/dist/esm/FileDetails/FileDetails.js +27 -912
- package/dist/esm/FileDetails/FileDetails.test.js +16 -0
- package/dist/esm/FileDetailsLabel/FileDetailsLabel.d.ts +8 -2
- package/dist/esm/FileDetailsLabel/FileDetailsLabel.js +14 -2
- package/dist/esm/FileDetailsLabel/FileDetailsLabel.test.js +19 -1
- package/dist/esm/FilePreview/FilePreview.d.ts +26 -0
- package/dist/esm/FilePreview/FilePreview.js +21 -0
- package/dist/esm/FilePreview/FilePreview.test.d.ts +1 -0
- package/dist/esm/FilePreview/FilePreview.test.js +92 -0
- package/dist/esm/FilePreview/index.d.ts +2 -0
- package/dist/esm/FilePreview/index.js +2 -0
- package/dist/esm/ImagePreview/ImagePreview.d.ts +53 -0
- package/dist/esm/ImagePreview/ImagePreview.js +42 -0
- package/dist/esm/ImagePreview/ImagePreview.test.d.ts +1 -0
- package/dist/esm/ImagePreview/ImagePreview.test.js +220 -0
- package/dist/esm/ImagePreview/index.d.ts +2 -0
- package/dist/esm/ImagePreview/index.js +2 -0
- package/dist/esm/Message/CodeBlockMessage/CodeBlockMessage.js +5 -5
- package/dist/esm/Message/LinkMessage/LinkMessage.d.ts +2 -1
- package/dist/esm/Message/LinkMessage/LinkMessage.js +7 -3
- package/dist/esm/Message/ListMessage/ListItemMessage.d.ts +1 -1
- package/dist/esm/Message/ListMessage/ListItemMessage.js +16 -1
- package/dist/esm/Message/Message.d.ts +15 -0
- package/dist/esm/Message/Message.js +129 -32
- package/dist/esm/Message/Message.test.js +71 -0
- package/dist/esm/Message/SuperscriptMessage/SuperscriptMessage.d.ts +3 -0
- package/dist/esm/Message/SuperscriptMessage/SuperscriptMessage.js +3 -0
- package/dist/esm/Message/UserFeedback/UserFeedback.d.ts +15 -1
- package/dist/esm/Message/UserFeedback/UserFeedback.js +4 -4
- package/dist/esm/Message/UserFeedback/UserFeedback.test.js +45 -1
- package/dist/esm/MessageBar/MessageBar.js +19 -4
- package/dist/esm/MessageBox/JumpButton.d.ts +5 -0
- package/dist/esm/MessageBox/JumpButton.js +1 -1
- package/dist/esm/MessageBox/JumpButton.test.js +4 -4
- package/dist/esm/MessageBox/MessageBox.d.ts +9 -0
- package/dist/esm/MessageBox/MessageBox.js +2 -2
- package/dist/esm/MessageBox/MessageBox.test.js +2 -2
- package/dist/esm/SourcesCard/SourcesCard.d.ts +13 -1
- package/dist/esm/SourcesCard/SourcesCard.js +6 -6
- package/dist/esm/SourcesCard/SourcesCard.test.js +50 -1
- package/dist/esm/ToolResponse/ToolResponse.d.ts +30 -0
- package/dist/esm/ToolResponse/ToolResponse.js +14 -0
- package/dist/esm/ToolResponse/ToolResponse.test.d.ts +1 -0
- package/dist/esm/ToolResponse/ToolResponse.test.js +55 -0
- package/dist/esm/ToolResponse/index.d.ts +2 -0
- package/dist/esm/ToolResponse/index.js +2 -0
- package/dist/esm/index.d.ts +8 -0
- package/dist/esm/index.js +8 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +7 -6
- package/patternfly-docs/content/extensions/chatbot/examples/Messages/AttachmentEdit.tsx +1 -1
- package/patternfly-docs/content/extensions/chatbot/examples/Messages/BotMessage.tsx +101 -3
- package/patternfly-docs/content/extensions/chatbot/examples/Messages/FilePreview.tsx +33 -0
- package/patternfly-docs/content/extensions/chatbot/examples/Messages/ImagePreview.tsx +53 -0
- package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithDeepThinking.tsx +17 -0
- package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithFeedback.tsx +111 -85
- package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithSources.tsx +70 -0
- package/patternfly-docs/content/extensions/chatbot/examples/Messages/MessageWithToolResponse.tsx +135 -0
- package/patternfly-docs/content/extensions/chatbot/examples/Messages/Messages.md +38 -4
- package/patternfly-docs/content/extensions/chatbot/examples/Messages/PreviewAttachment.tsx +1 -1
- package/patternfly-docs/content/extensions/chatbot/examples/Messages/UserMessage.tsx +107 -2
- package/patternfly-docs/content/extensions/chatbot/examples/Messages/UserMessageWithExtraContent.tsx +616 -3
- package/patternfly-docs/content/extensions/chatbot/examples/Messages/file-preview.svg +9 -0
- package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotConversationEditing.tsx +202 -0
- package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotHeaderBasic.tsx +17 -3
- package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotHeaderDrawer.tsx +36 -5
- package/patternfly-docs/content/extensions/chatbot/examples/UI/ChatbotHeaderDrawerWithPin.tsx +12 -2
- package/patternfly-docs/content/extensions/chatbot/examples/UI/UI.md +22 -3
- package/patternfly-docs/content/extensions/chatbot/examples/demos/Chatbot.md +1 -1
- package/patternfly-docs/patternfly-docs.config.js +1 -1
- package/src/Chatbot/Chatbot.scss +9 -2
- package/src/Chatbot/Chatbot.tsx +18 -31
- package/src/ChatbotConversationHistoryNav/ChatbotConversationHistoryDropdown.tsx +5 -1
- package/src/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.scss +16 -10
- package/src/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.test.tsx +132 -3
- package/src/ChatbotConversationHistoryNav/ChatbotConversationHistoryNav.tsx +80 -33
- package/src/ChatbotHeader/ChatbotHeaderMenu.test.tsx +1 -1
- package/src/ChatbotHeader/ChatbotHeaderMenu.tsx +2 -2
- package/src/ChatbotHeader/ChatbotHeaderNewChatButton.test.tsx +25 -0
- package/src/ChatbotHeader/ChatbotHeaderNewChatButton.tsx +64 -0
- package/src/ChatbotHeader/index.ts +1 -0
- package/src/ChatbotModal/ChatbotModal.scss +1 -1
- package/src/DeepThinking/DeepThinking.scss +24 -0
- package/src/DeepThinking/DeepThinking.test.tsx +61 -0
- package/src/DeepThinking/DeepThinking.tsx +68 -0
- package/src/DeepThinking/index.ts +3 -0
- package/src/FileDetails/FileDetails.scss +10 -0
- package/src/FileDetails/FileDetails.test.tsx +16 -0
- package/src/FileDetails/FileDetails.tsx +89 -32
- package/src/FileDetails/__snapshots__/FileDetails.test.tsx.snap +20 -14
- package/src/FileDetailsLabel/FileDetailsLabel.test.tsx +21 -1
- package/src/FileDetailsLabel/FileDetailsLabel.tsx +16 -3
- package/src/FileDetailsLabel/__snapshots__/FileDetailsLabel.test.tsx.snap +20 -14
- package/src/FilePreview/FilePreview.scss +22 -0
- package/src/FilePreview/FilePreview.test.tsx +112 -0
- package/src/FilePreview/FilePreview.tsx +58 -0
- package/src/FilePreview/index.ts +3 -0
- package/src/ImagePreview/ImagePreview.scss +61 -0
- package/src/ImagePreview/ImagePreview.test.tsx +253 -0
- package/src/ImagePreview/ImagePreview.tsx +200 -0
- package/src/ImagePreview/index.ts +3 -0
- package/src/Message/CodeBlockMessage/CodeBlockMessage.scss +2 -1
- package/src/Message/CodeBlockMessage/CodeBlockMessage.tsx +6 -5
- package/src/Message/LinkMessage/LinkMessage.tsx +6 -2
- package/src/Message/ListMessage/ListItemMessage.tsx +5 -1
- package/src/Message/ListMessage/ListMessage.scss +17 -0
- package/src/Message/Message.scss +44 -0
- package/src/Message/Message.test.tsx +90 -0
- package/src/Message/Message.tsx +171 -46
- package/src/Message/SuperscriptMessage/SuperscriptMessage.scss +8 -0
- package/src/Message/SuperscriptMessage/SuperscriptMessage.tsx +13 -0
- package/src/Message/TextMessage/TextMessage.scss +46 -5
- package/src/Message/UserFeedback/UserFeedback.test.tsx +107 -0
- package/src/Message/UserFeedback/UserFeedback.tsx +41 -6
- package/src/MessageBar/MessageBar.tsx +23 -3
- package/src/MessageBox/JumpButton.test.tsx +4 -4
- package/src/MessageBox/JumpButton.tsx +20 -4
- package/src/MessageBox/MessageBox.scss +0 -12
- package/src/MessageBox/MessageBox.test.tsx +2 -2
- package/src/MessageBox/MessageBox.tsx +23 -2
- package/src/SourcesCard/SourcesCard.scss +17 -0
- package/src/SourcesCard/SourcesCard.test.tsx +93 -0
- package/src/SourcesCard/SourcesCard.tsx +116 -80
- package/src/ToolResponse/ToolResponse.scss +36 -0
- package/src/ToolResponse/ToolResponse.test.tsx +78 -0
- package/src/ToolResponse/ToolResponse.tsx +95 -0
- package/src/ToolResponse/index.ts +3 -0
- package/src/index.ts +12 -0
- package/src/main.scss +16 -0
|
@@ -15,6 +15,7 @@ describe('FileDetails', () => {
|
|
|
15
15
|
it('should render file details correctly if an extension we support is passed in', () => {
|
|
16
16
|
(0, react_1.render)((0, jsx_runtime_1.jsx)(FileDetails_1.default, { fileName: "test.txt", languageTestId: "language" }));
|
|
17
17
|
expect(react_1.screen.getByText('test')).toBeTruthy();
|
|
18
|
+
expect(react_1.screen.queryByText('test.txt')).toBeFalsy();
|
|
18
19
|
expect(react_1.screen.getByText('TEXT')).toBeTruthy();
|
|
19
20
|
expect(react_1.screen.getByTestId('language')).toBeTruthy();
|
|
20
21
|
});
|
|
@@ -23,4 +24,19 @@ describe('FileDetails', () => {
|
|
|
23
24
|
expect(react_1.screen.getByText('test')).toBeTruthy();
|
|
24
25
|
expect(react_1.screen.queryByTestId('language')).toBeFalsy();
|
|
25
26
|
});
|
|
27
|
+
it('should support image formats by rendering extension differently', () => {
|
|
28
|
+
(0, react_1.render)((0, jsx_runtime_1.jsx)(FileDetails_1.default, { fileName: "test.svg", languageTestId: "language" }));
|
|
29
|
+
expect(react_1.screen.getByText('test')).toBeTruthy();
|
|
30
|
+
expect(react_1.screen.queryByText('test.svg')).toBeFalsy();
|
|
31
|
+
expect(react_1.screen.queryByTestId('language')).toBeFalsy();
|
|
32
|
+
});
|
|
33
|
+
it('should handle truncation differently', () => {
|
|
34
|
+
(0, react_1.render)((0, jsx_runtime_1.jsx)(FileDetails_1.default, { fileName: "test.svg", languageTestId: "language", hasTruncation: false }));
|
|
35
|
+
expect(react_1.screen.getByText('test.svg')).toBeTruthy();
|
|
36
|
+
expect(react_1.screen.queryByTestId('language')).toBeFalsy();
|
|
37
|
+
});
|
|
38
|
+
it('should include file size if prop passed in', () => {
|
|
39
|
+
(0, react_1.render)((0, jsx_runtime_1.jsx)(FileDetails_1.default, { fileName: "test.joke", languageTestId: "language", fileSize: "100MB" }));
|
|
40
|
+
expect(react_1.screen.getByText('100MB')).toBeTruthy();
|
|
41
|
+
});
|
|
26
42
|
});
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { PropsWithChildren } from 'react';
|
|
2
|
-
interface FileDetailsLabelProps {
|
|
2
|
+
export interface FileDetailsLabelProps {
|
|
3
3
|
/** Name of file, including extension */
|
|
4
4
|
fileName: string;
|
|
5
5
|
/** Unique id of file */
|
|
@@ -16,6 +16,12 @@ interface FileDetailsLabelProps {
|
|
|
16
16
|
languageTestId?: string;
|
|
17
17
|
/** Custom test id for the loading spinner in the component */
|
|
18
18
|
spinnerTestId?: string;
|
|
19
|
+
/** File size */
|
|
20
|
+
fileSize?: string;
|
|
21
|
+
/** Whether to truncate file name */
|
|
22
|
+
hasTruncation?: boolean;
|
|
23
|
+
/** Icon used for close button */
|
|
24
|
+
closeButtonIcon?: React.ReactNode;
|
|
19
25
|
}
|
|
20
|
-
export declare const FileDetailsLabel: ({ fileName, fileId, isLoading, onClick, onClose, closeButtonAriaLabel, languageTestId, spinnerTestId }: PropsWithChildren<FileDetailsLabelProps>) => import("react/jsx-runtime").JSX.Element;
|
|
26
|
+
export declare const FileDetailsLabel: ({ fileName, fileId, isLoading, onClick, onClose, closeButtonAriaLabel, languageTestId, spinnerTestId, fileSize, hasTruncation, closeButtonIcon, ...props }: PropsWithChildren<FileDetailsLabelProps>) => import("react/jsx-runtime").JSX.Element;
|
|
21
27
|
export default FileDetailsLabel;
|
|
@@ -1,4 +1,15 @@
|
|
|
1
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
|
+
};
|
|
2
13
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
14
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
15
|
};
|
|
@@ -9,11 +20,12 @@ const react_core_1 = require("@patternfly/react-core");
|
|
|
9
20
|
const FileDetails_1 = __importDefault(require("../FileDetails"));
|
|
10
21
|
const react_core_2 = require("@patternfly/react-core");
|
|
11
22
|
const react_icons_1 = require("@patternfly/react-icons");
|
|
12
|
-
const FileDetailsLabel = (
|
|
23
|
+
const FileDetailsLabel = (_a) => {
|
|
24
|
+
var { fileName, fileId, isLoading, onClick, onClose, closeButtonAriaLabel, languageTestId, spinnerTestId, fileSize, hasTruncation = true, closeButtonIcon = (0, jsx_runtime_1.jsx)(react_icons_1.TimesIcon, {}) } = _a, props = __rest(_a, ["fileName", "fileId", "isLoading", "onClick", "onClose", "closeButtonAriaLabel", "languageTestId", "spinnerTestId", "fileSize", "hasTruncation", "closeButtonIcon"]);
|
|
13
25
|
const handleClose = (event) => {
|
|
14
26
|
onClose && onClose(event, fileName, fileId);
|
|
15
27
|
};
|
|
16
|
-
return ((0, jsx_runtime_1.jsx)(react_core_1.Label, Object.assign({ className: "pf-chatbot__file-label" }, (onClose && { onClose: (event) => onClose(event, fileName, fileId) }), { closeBtn: (0, jsx_runtime_1.jsx)(react_core_1.Button, { type: "button", variant: "plain", "aria-label": closeButtonAriaLabel !== null && closeButtonAriaLabel !== void 0 ? closeButtonAriaLabel : `Close ${fileName}`, icon:
|
|
28
|
+
return ((0, jsx_runtime_1.jsx)(react_core_1.Label, Object.assign({ className: "pf-chatbot__file-label" }, (onClose && { onClose: (event) => onClose(event, fileName, fileId) }), { closeBtn: (0, jsx_runtime_1.jsx)(react_core_1.Button, { type: "button", variant: "plain", "aria-label": closeButtonAriaLabel !== null && closeButtonAriaLabel !== void 0 ? closeButtonAriaLabel : `Close ${fileName}`, icon: closeButtonIcon, onClick: handleClose }) }, (onClick && { onClick: (event) => onClick(event, fileName, fileId) }), props, { children: (0, jsx_runtime_1.jsxs)("div", { className: "pf-chatbot__file-label-contents", children: [(0, jsx_runtime_1.jsx)(FileDetails_1.default, { className: isLoading ? 'pf-chatbot__file-label-loading' : undefined, fileName: fileName, languageTestId: languageTestId, fileSize: fileSize, hasTruncation: hasTruncation }), isLoading && (0, jsx_runtime_1.jsx)(react_core_2.Spinner, { "data-testid": spinnerTestId, size: "sm" })] }) })));
|
|
17
29
|
};
|
|
18
30
|
exports.FileDetailsLabel = FileDetailsLabel;
|
|
19
31
|
exports.default = exports.FileDetailsLabel;
|
|
@@ -17,6 +17,7 @@ const react_1 = require("@testing-library/react");
|
|
|
17
17
|
require("@testing-library/jest-dom");
|
|
18
18
|
const FileDetailsLabel_1 = __importDefault(require("./FileDetailsLabel"));
|
|
19
19
|
const user_event_1 = __importDefault(require("@testing-library/user-event"));
|
|
20
|
+
const react_icons_1 = require("@patternfly/react-icons");
|
|
20
21
|
describe('FileDetailsLabel', () => {
|
|
21
22
|
it('should render file details label', () => {
|
|
22
23
|
const { container } = (0, react_1.render)((0, jsx_runtime_1.jsx)(FileDetailsLabel_1.default, { fileName: "test.txt" }));
|
|
@@ -32,6 +33,19 @@ describe('FileDetailsLabel', () => {
|
|
|
32
33
|
expect(react_1.screen.getByText('test')).toBeTruthy();
|
|
33
34
|
expect(react_1.screen.queryByTestId('language')).toBeFalsy();
|
|
34
35
|
});
|
|
36
|
+
it('should pass file size down', () => {
|
|
37
|
+
(0, react_1.render)((0, jsx_runtime_1.jsx)(FileDetailsLabel_1.default, { fileName: "test.svg", fileSize: "100MB" }));
|
|
38
|
+
expect(react_1.screen.getByText('100MB')).toBeTruthy();
|
|
39
|
+
});
|
|
40
|
+
it('should pass truncation prop down as true by default', () => {
|
|
41
|
+
(0, react_1.render)((0, jsx_runtime_1.jsx)(FileDetailsLabel_1.default, { fileName: "test.svg" }));
|
|
42
|
+
expect(react_1.screen.getByText('test')).toBeTruthy();
|
|
43
|
+
expect(react_1.screen.queryByText('test.svg')).toBeFalsy();
|
|
44
|
+
});
|
|
45
|
+
it('should pass truncation prop down when false', () => {
|
|
46
|
+
(0, react_1.render)((0, jsx_runtime_1.jsx)(FileDetailsLabel_1.default, { fileName: "test.svg", hasTruncation: false }));
|
|
47
|
+
expect(react_1.screen.getByText('test.svg')).toBeTruthy();
|
|
48
|
+
});
|
|
35
49
|
it('should not show spinner by default', () => {
|
|
36
50
|
(0, react_1.render)((0, jsx_runtime_1.jsx)(FileDetailsLabel_1.default, { fileName: "test.txt", spinnerTestId: "spinner" }));
|
|
37
51
|
expect(react_1.screen.queryByTestId('spinner')).toBeFalsy();
|
|
@@ -56,6 +70,10 @@ describe('FileDetailsLabel', () => {
|
|
|
56
70
|
}));
|
|
57
71
|
it('should use closeButtonAriaLabel prop appropriately', () => {
|
|
58
72
|
(0, react_1.render)((0, jsx_runtime_1.jsx)(FileDetailsLabel_1.default, { fileName: "test.txt", onClose: jest.fn(), closeButtonAriaLabel: "Delete file" }));
|
|
59
|
-
react_1.screen.getByRole('button', { name: /Delete file/i });
|
|
73
|
+
expect(react_1.screen.getByRole('button', { name: /Delete file/i })).toBeTruthy();
|
|
74
|
+
});
|
|
75
|
+
it('should support custom close icon', () => {
|
|
76
|
+
(0, react_1.render)((0, jsx_runtime_1.jsx)(FileDetailsLabel_1.default, { fileName: "test.txt", onClose: jest.fn(), closeButtonIcon: (0, jsx_runtime_1.jsx)(react_icons_1.BellIcon, { "data-testid": "bell" }) }));
|
|
77
|
+
expect(react_1.screen.getByTestId('bell')).toBeTruthy();
|
|
60
78
|
});
|
|
61
79
|
});
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { ModalBodyProps, ModalHeaderProps } from '@patternfly/react-core';
|
|
2
|
+
import type { FunctionComponent } from 'react';
|
|
3
|
+
import { ChatbotDisplayMode } from '../Chatbot';
|
|
4
|
+
import { ChatbotModalProps } from '../ChatbotModal';
|
|
5
|
+
export interface FilePreviewProps extends ChatbotModalProps {
|
|
6
|
+
/** Class applied to modal */
|
|
7
|
+
className?: string;
|
|
8
|
+
/** Function that handles modal toggle */
|
|
9
|
+
handleModalToggle: (event: React.MouseEvent | MouseEvent | KeyboardEvent) => void;
|
|
10
|
+
/** Whether modal is open */
|
|
11
|
+
isModalOpen: boolean;
|
|
12
|
+
/** Title of modal */
|
|
13
|
+
title?: string;
|
|
14
|
+
/** Display mode for the Chatbot parent; this influences the styles applied */
|
|
15
|
+
displayMode?: ChatbotDisplayMode;
|
|
16
|
+
/** File name */
|
|
17
|
+
fileName: string;
|
|
18
|
+
/** Sets modal to compact styling. */
|
|
19
|
+
isCompact?: boolean;
|
|
20
|
+
/** Additional props passed to modal header */
|
|
21
|
+
modalHeaderProps?: ModalHeaderProps;
|
|
22
|
+
/** Additional props passed to modal body */
|
|
23
|
+
modalBodyProps?: ModalBodyProps;
|
|
24
|
+
}
|
|
25
|
+
declare const FilePreview: FunctionComponent<FilePreviewProps>;
|
|
26
|
+
export default FilePreview;
|
|
@@ -0,0 +1,26 @@
|
|
|
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
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
18
|
+
const react_core_1 = require("@patternfly/react-core");
|
|
19
|
+
const Chatbot_1 = require("../Chatbot");
|
|
20
|
+
const ChatbotModal_1 = __importDefault(require("../ChatbotModal"));
|
|
21
|
+
const react_icons_1 = require("@patternfly/react-icons");
|
|
22
|
+
const FilePreview = (_a) => {
|
|
23
|
+
var { isModalOpen, displayMode = Chatbot_1.ChatbotDisplayMode.default, children, fileName, isCompact, className, handleModalToggle, title = 'File preview', modalHeaderProps, modalBodyProps } = _a, props = __rest(_a, ["isModalOpen", "displayMode", "children", "fileName", "isCompact", "className", "handleModalToggle", "title", "modalHeaderProps", "modalBodyProps"]);
|
|
24
|
+
return ((0, jsx_runtime_1.jsxs)(ChatbotModal_1.default, Object.assign({ isOpen: isModalOpen, className: `pf-chatbot__file-preview-modal pf-chatbot__file-preview-modal--${displayMode} ${isCompact ? 'pf-m-compact' : ''} ${className ? className : ''}`, displayMode: displayMode, onClose: handleModalToggle, isCompact: isCompact }, props, { children: [(0, jsx_runtime_1.jsx)(react_core_1.ModalHeader, Object.assign({ title: title }, modalHeaderProps)), (0, jsx_runtime_1.jsxs)(react_core_1.ModalBody, Object.assign({ className: "pf-chatbot__file-preview-body" }, modalBodyProps, { children: [(0, jsx_runtime_1.jsx)(react_icons_1.FileIcon, { className: "pf-chatbot__file-preview-icon" }), (0, jsx_runtime_1.jsx)("h2", { className: "pf-chatbot__file-preview-name", children: fileName }), children && (0, jsx_runtime_1.jsx)("div", { className: "pf-chatbot__file-preview-body", children: children })] }))] })));
|
|
25
|
+
};
|
|
26
|
+
exports.default = FilePreview;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import '@testing-library/jest-dom';
|
|
@@ -0,0 +1,97 @@
|
|
|
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 jsx_runtime_1 = require("react/jsx-runtime");
|
|
7
|
+
const react_1 = require("@testing-library/react");
|
|
8
|
+
require("@testing-library/jest-dom");
|
|
9
|
+
const FilePreview_1 = __importDefault(require("./FilePreview"));
|
|
10
|
+
const Chatbot_1 = require("../Chatbot");
|
|
11
|
+
const react_core_1 = require("@patternfly/react-core");
|
|
12
|
+
describe('FilePreview', () => {
|
|
13
|
+
const defaultProps = {
|
|
14
|
+
isModalOpen: true,
|
|
15
|
+
handleModalToggle: jest.fn(),
|
|
16
|
+
fileName: 'test-file.txt',
|
|
17
|
+
children: 'File content preview'
|
|
18
|
+
};
|
|
19
|
+
beforeEach(() => {
|
|
20
|
+
jest.clearAllMocks();
|
|
21
|
+
});
|
|
22
|
+
it('should render with basic props', () => {
|
|
23
|
+
(0, react_1.render)((0, jsx_runtime_1.jsx)(FilePreview_1.default, Object.assign({}, defaultProps)));
|
|
24
|
+
expect(react_1.screen.getByText('File preview')).toBeInTheDocument();
|
|
25
|
+
expect(react_1.screen.getByText('test-file.txt')).toBeInTheDocument();
|
|
26
|
+
});
|
|
27
|
+
it('should render with custom title', () => {
|
|
28
|
+
const customTitle = 'Custom file preview title';
|
|
29
|
+
(0, react_1.render)((0, jsx_runtime_1.jsx)(FilePreview_1.default, Object.assign({}, defaultProps, { title: customTitle })));
|
|
30
|
+
expect(react_1.screen.getByRole('heading', { name: customTitle })).toBeTruthy();
|
|
31
|
+
});
|
|
32
|
+
it('should handle modal toggle when closed', () => {
|
|
33
|
+
const mockToggle = jest.fn();
|
|
34
|
+
(0, react_1.render)((0, jsx_runtime_1.jsx)(FilePreview_1.default, Object.assign({}, defaultProps, { isModalOpen: false, handleModalToggle: mockToggle })));
|
|
35
|
+
expect(react_1.screen.queryByRole('dialog')).not.toBeInTheDocument();
|
|
36
|
+
});
|
|
37
|
+
it('should apply default display mode class', () => {
|
|
38
|
+
(0, react_1.render)((0, jsx_runtime_1.jsx)(FilePreview_1.default, Object.assign({}, defaultProps)));
|
|
39
|
+
const modal = react_1.screen.getByRole('dialog');
|
|
40
|
+
expect(modal).toHaveClass('pf-chatbot__file-preview-modal--default');
|
|
41
|
+
});
|
|
42
|
+
it('should apply custom display mode class', () => {
|
|
43
|
+
(0, react_1.render)((0, jsx_runtime_1.jsx)(FilePreview_1.default, Object.assign({}, defaultProps, { displayMode: Chatbot_1.ChatbotDisplayMode.fullscreen })));
|
|
44
|
+
const modal = react_1.screen.getByRole('dialog');
|
|
45
|
+
expect(modal).toHaveClass('pf-chatbot__file-preview-modal--fullscreen');
|
|
46
|
+
});
|
|
47
|
+
it('should apply compact styling when isCompact is true', () => {
|
|
48
|
+
(0, react_1.render)((0, jsx_runtime_1.jsx)(FilePreview_1.default, Object.assign({}, defaultProps, { isCompact: true })));
|
|
49
|
+
const modal = react_1.screen.getByRole('dialog');
|
|
50
|
+
expect(modal).toHaveClass('pf-m-compact');
|
|
51
|
+
});
|
|
52
|
+
it('should not apply compact styling when isCompact is false', () => {
|
|
53
|
+
(0, react_1.render)((0, jsx_runtime_1.jsx)(FilePreview_1.default, Object.assign({}, defaultProps, { isCompact: false })));
|
|
54
|
+
const modal = react_1.screen.getByRole('dialog');
|
|
55
|
+
expect(modal).not.toHaveClass('pf-m-compact');
|
|
56
|
+
});
|
|
57
|
+
it('should apply custom className', () => {
|
|
58
|
+
const customClass = 'custom-file-preview';
|
|
59
|
+
(0, react_1.render)((0, jsx_runtime_1.jsx)(FilePreview_1.default, Object.assign({}, defaultProps, { className: customClass })));
|
|
60
|
+
const modal = react_1.screen.getByRole('dialog');
|
|
61
|
+
expect(modal).toHaveClass(customClass);
|
|
62
|
+
});
|
|
63
|
+
it('should pass through additional props to ChatbotModal', () => {
|
|
64
|
+
(0, react_1.render)((0, jsx_runtime_1.jsx)(FilePreview_1.default, Object.assign({}, defaultProps, { "data-testid": "file-preview-modal" })));
|
|
65
|
+
const modal = react_1.screen.getByTestId('file-preview-modal');
|
|
66
|
+
expect(modal).toBeInTheDocument();
|
|
67
|
+
});
|
|
68
|
+
it('should pass modalHeaderProps to ModalHeader', () => {
|
|
69
|
+
const modalHeaderProps = {
|
|
70
|
+
'data-testid': 'custom-header'
|
|
71
|
+
};
|
|
72
|
+
(0, react_1.render)((0, jsx_runtime_1.jsx)(FilePreview_1.default, Object.assign({}, defaultProps, { modalHeaderProps: modalHeaderProps })));
|
|
73
|
+
const header = react_1.screen.getByTestId('custom-header');
|
|
74
|
+
expect(header).toBeInTheDocument();
|
|
75
|
+
});
|
|
76
|
+
it('should pass modalBodyProps to ModalBody', () => {
|
|
77
|
+
const modalBodyProps = {
|
|
78
|
+
'data-testid': 'custom-body'
|
|
79
|
+
};
|
|
80
|
+
(0, react_1.render)((0, jsx_runtime_1.jsx)(FilePreview_1.default, Object.assign({}, defaultProps, { modalBodyProps: modalBodyProps })));
|
|
81
|
+
const body = react_1.screen.getByTestId('custom-body');
|
|
82
|
+
expect(body).toBeInTheDocument();
|
|
83
|
+
});
|
|
84
|
+
it('should pass ouiaId to ChatbotModal', () => {
|
|
85
|
+
const ouiaId = 'file-preview-ouia-id';
|
|
86
|
+
(0, react_1.render)((0, jsx_runtime_1.jsx)(FilePreview_1.default, Object.assign({}, defaultProps, { ouiaId: ouiaId })));
|
|
87
|
+
const modal = react_1.screen.getByRole('dialog');
|
|
88
|
+
expect(modal).toHaveAttribute('data-ouia-component-id', ouiaId);
|
|
89
|
+
});
|
|
90
|
+
it('should handle complex children', () => {
|
|
91
|
+
const complexChildren = ((0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)("h3", { children: "File details" }), (0, jsx_runtime_1.jsx)("p", { children: "Size: 1.2 MB" }), (0, jsx_runtime_1.jsx)(react_core_1.Button, { children: "Download" })] }));
|
|
92
|
+
(0, react_1.render)((0, jsx_runtime_1.jsx)(FilePreview_1.default, Object.assign({}, defaultProps, { children: complexChildren })));
|
|
93
|
+
expect(react_1.screen.getByRole('heading', { name: /File details/i })).toBeTruthy();
|
|
94
|
+
expect(react_1.screen.getByText('Size: 1.2 MB')).toBeTruthy();
|
|
95
|
+
expect(react_1.screen.getByRole('button', { name: /Download/i })).toBeTruthy();
|
|
96
|
+
});
|
|
97
|
+
});
|
|
@@ -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 FilePreview_1 = require("./FilePreview");
|
|
22
|
+
Object.defineProperty(exports, "default", { enumerable: true, get: function () { return __importDefault(FilePreview_1).default; } });
|
|
23
|
+
__exportStar(require("./FilePreview"), exports);
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { ModalBodyProps, ModalHeaderProps } from '@patternfly/react-core';
|
|
2
|
+
import { type FunctionComponent } from 'react';
|
|
3
|
+
import { ChatbotDisplayMode } from '../Chatbot';
|
|
4
|
+
import { ChatbotModalProps } from '../ChatbotModal';
|
|
5
|
+
import { FileDetailsLabelProps } from '../FileDetailsLabel';
|
|
6
|
+
export interface ImagePreviewProps extends Omit<ChatbotModalProps, 'children'> {
|
|
7
|
+
/** Class applied to modal */
|
|
8
|
+
className?: string;
|
|
9
|
+
/** Function that handles modal toggle */
|
|
10
|
+
handleModalToggle: (event: React.MouseEvent | MouseEvent | KeyboardEvent) => void;
|
|
11
|
+
/** Whether modal is open */
|
|
12
|
+
isModalOpen: boolean;
|
|
13
|
+
/** Title of modal */
|
|
14
|
+
title?: string;
|
|
15
|
+
/** Display mode for the Chatbot parent; this influences the styles applied */
|
|
16
|
+
displayMode?: ChatbotDisplayMode;
|
|
17
|
+
/** Sets modal to compact styling. */
|
|
18
|
+
isCompact?: boolean;
|
|
19
|
+
/** Additional props passed to modal header */
|
|
20
|
+
modalHeaderProps?: ModalHeaderProps;
|
|
21
|
+
/** Additional props passed to modal body */
|
|
22
|
+
modalBodyProps?: ModalBodyProps;
|
|
23
|
+
/** Images displayed in modal */
|
|
24
|
+
images: {
|
|
25
|
+
fileName: string;
|
|
26
|
+
fileSize?: string;
|
|
27
|
+
image: React.ReactNode;
|
|
28
|
+
}[];
|
|
29
|
+
/** Flag indicating if the pagination is disabled. */
|
|
30
|
+
isDisabled?: boolean;
|
|
31
|
+
/** Accessible label for the pagination component. */
|
|
32
|
+
paginationAriaLabel?: string;
|
|
33
|
+
/** Accessible label for the button which moves to the next page. */
|
|
34
|
+
toNextPageAriaLabel?: string;
|
|
35
|
+
/** Accessible label for the button which moves to the previous page. */
|
|
36
|
+
toPreviousPageAriaLabel?: string;
|
|
37
|
+
/** Function called when user clicks to navigate to next page. */
|
|
38
|
+
onNextClick?: (event: React.SyntheticEvent<HTMLButtonElement>, page: number) => void;
|
|
39
|
+
/** Function called when user clicks to navigate to previous page. */
|
|
40
|
+
onPreviousClick?: (event: React.SyntheticEvent<HTMLButtonElement>, page: number) => void;
|
|
41
|
+
/** Function called when page is changed. */
|
|
42
|
+
onSetPage?: (event: React.MouseEvent | React.KeyboardEvent | MouseEvent, newPage: number) => void;
|
|
43
|
+
/** Callback function for when file details label close button is clicked */
|
|
44
|
+
onCloseFileDetailsLabel?: (event: React.MouseEvent, fileName: string, fileId?: string | number) => void;
|
|
45
|
+
/** Props passed to file details label */
|
|
46
|
+
fileDetailsLabelProps?: Omit<FileDetailsLabelProps, 'fileName'>;
|
|
47
|
+
/** Text shown in navigation */
|
|
48
|
+
paginationContent?: string;
|
|
49
|
+
/** Navigation progress announced to assistive devices. Should state the current page/image. */
|
|
50
|
+
screenreaderText?: string;
|
|
51
|
+
}
|
|
52
|
+
declare const ImagePreview: FunctionComponent<ImagePreviewProps>;
|
|
53
|
+
export default ImagePreview;
|
|
@@ -0,0 +1,47 @@
|
|
|
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
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
18
|
+
const react_core_1 = require("@patternfly/react-core");
|
|
19
|
+
const react_1 = require("react");
|
|
20
|
+
const Chatbot_1 = require("../Chatbot");
|
|
21
|
+
const ChatbotModal_1 = __importDefault(require("../ChatbotModal"));
|
|
22
|
+
const FileDetailsLabel_1 = __importDefault(require("../FileDetailsLabel"));
|
|
23
|
+
const react_icons_1 = require("@patternfly/react-icons");
|
|
24
|
+
const ImagePreview = (_a) => {
|
|
25
|
+
var { isModalOpen, displayMode = Chatbot_1.ChatbotDisplayMode.default, isCompact, className, handleModalToggle, title = 'Preview images', modalHeaderProps, modalBodyProps, images, isDisabled, onSetPage, onPreviousClick, toNextPageAriaLabel = 'Go to next image', toPreviousPageAriaLabel = 'Go to previous image', onNextClick, paginationAriaLabel, onCloseFileDetailsLabel, fileDetailsLabelProps, paginationContent, screenreaderText } = _a, props = __rest(_a, ["isModalOpen", "displayMode", "isCompact", "className", "handleModalToggle", "title", "modalHeaderProps", "modalBodyProps", "images", "isDisabled", "onSetPage", "onPreviousClick", "toNextPageAriaLabel", "toPreviousPageAriaLabel", "onNextClick", "paginationAriaLabel", "onCloseFileDetailsLabel", "fileDetailsLabelProps", "paginationContent", "screenreaderText"]);
|
|
26
|
+
const [page, setPage] = (0, react_1.useState)(1);
|
|
27
|
+
const paginationText = paginationContent || `${page}/${images.length}`;
|
|
28
|
+
(0, react_1.useEffect)(() => {
|
|
29
|
+
if (images.length === 0 || page > images.length) {
|
|
30
|
+
setPage(1);
|
|
31
|
+
}
|
|
32
|
+
}, [images.length, page]);
|
|
33
|
+
const handleNewPage = (_evt, newPage) => {
|
|
34
|
+
setPage(newPage);
|
|
35
|
+
onSetPage && onSetPage(_evt, newPage);
|
|
36
|
+
};
|
|
37
|
+
return ((0, jsx_runtime_1.jsxs)(ChatbotModal_1.default, Object.assign({ isOpen: isModalOpen, className: `pf-chatbot__image-preview-modal pf-chatbot__image-preview-modal--${displayMode} ${isCompact ? 'pf-m-compact' : ''} ${className ? className : ''}`, displayMode: displayMode, onClose: handleModalToggle, isCompact: isCompact }, props, { children: [(0, jsx_runtime_1.jsx)(react_core_1.ModalHeader, Object.assign({ title: title }, modalHeaderProps)), (0, jsx_runtime_1.jsx)(react_core_1.ModalBody, Object.assign({ className: "pf-chatbot__image-preview-body" }, modalBodyProps, { children: images.length > 0 && images[page - 1] && ((0, jsx_runtime_1.jsxs)(react_core_1.Stack, { hasGutter: true, className: "pf-chatbot__image-preview-stack", children: [(0, jsx_runtime_1.jsx)(react_core_1.StackItem, { children: (0, jsx_runtime_1.jsx)(FileDetailsLabel_1.default, Object.assign({ fileName: images[page - 1].fileName, fileSize: images[page - 1].fileSize, hasTruncation: false, onClose: onCloseFileDetailsLabel, closeButtonIcon: (0, jsx_runtime_1.jsx)(react_icons_1.TrashIcon, {}) }, fileDetailsLabelProps)) }), (0, jsx_runtime_1.jsx)(react_core_1.StackItem, { children: (0, jsx_runtime_1.jsx)("div", { className: "pf-chatbot__image-preview-body", children: images[page - 1].image }) })] })) })), images.length > 1 && ((0, jsx_runtime_1.jsx)(react_core_1.ModalFooter, { className: "pf-chatbot__image-preview-footer", children: (0, jsx_runtime_1.jsxs)("nav", { className: `pf-chatbot__image-preview-footer-buttons`, "aria-label": paginationAriaLabel, children: [(0, jsx_runtime_1.jsx)(react_core_1.Button, { variant: react_core_1.ButtonVariant.plain, isDisabled: isDisabled || page === 1, "data-action": "previous", onClick: (event) => {
|
|
38
|
+
const newPage = page > 1 ? page - 1 : 1;
|
|
39
|
+
handleNewPage(event, newPage);
|
|
40
|
+
onPreviousClick && onPreviousClick(event, newPage);
|
|
41
|
+
}, "aria-label": toPreviousPageAriaLabel, children: (0, jsx_runtime_1.jsx)(react_core_1.Icon, { iconSize: "lg", children: (0, jsx_runtime_1.jsx)("svg", { className: "pf-v6-svg", viewBox: "0 0 280 500", fill: "currentColor", "aria-hidden": "true", role: "img", width: "1em", height: "1em", children: (0, jsx_runtime_1.jsx)("path", { d: "M31.7 239l136-136c9.4-9.4 24.6-9.4 33.9 0l22.6 22.6c9.4 9.4 9.4 24.6 0 33.9L127.9 256l96.4 96.4c9.4 9.4 9.4 24.6 0 33.9L201.7 409c-9.4 9.4-24.6 9.4-33.9 0l-136-136c-9.5-9.4-9.5-24.6-.1-34z" }) }) }) }), (0, jsx_runtime_1.jsx)("span", { children: paginationText }), (0, jsx_runtime_1.jsx)("div", { className: "pf-chatbot-m-hidden", "aria-live": "polite", children: screenreaderText !== null && screenreaderText !== void 0 ? screenreaderText : `Image ${page} of ${images.length}` }), (0, jsx_runtime_1.jsx)(react_core_1.Button, { variant: react_core_1.ButtonVariant.plain, isDisabled: isDisabled || page === images.length, "aria-label": toNextPageAriaLabel, "data-action": "next", onClick: (event) => {
|
|
42
|
+
const newPage = page + 1 <= images.length ? page + 1 : images.length;
|
|
43
|
+
handleNewPage(event, newPage);
|
|
44
|
+
onNextClick && onNextClick(event, newPage);
|
|
45
|
+
}, children: (0, jsx_runtime_1.jsx)(react_core_1.Icon, { isInline: true, iconSize: "lg", children: (0, jsx_runtime_1.jsx)("svg", { className: "pf-v6-svg", viewBox: "0 0 180 500", fill: "currentColor", "aria-hidden": "true", role: "img", width: "1em", height: "1em", children: (0, jsx_runtime_1.jsx)("path", { d: "M224.3 273l-136 136c-9.4 9.4-24.6 9.4-33.9 0l-22.6-22.6c-9.4-9.4-9.4-24.6 0-33.9l96.4-96.4-96.4-96.4c-9.4-9.4-9.4-24.6 0-33.9L54.3 103c9.4-9.4 24.6-9.4 33.9 0l136 136c9.5 9.4 9.5 24.6.1 34z" }) }) }) })] }) }))] })));
|
|
46
|
+
};
|
|
47
|
+
exports.default = ImagePreview;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import '@testing-library/jest-dom';
|