devexpress-reporting-react 24.1.7 → 24.2.2-beta
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/dx-report-viewer/components/reporting/AIPanel/AIPanel.d.ts +6 -0
- package/dx-report-viewer/components/reporting/AIPanel/AIPanel.js +73 -0
- package/dx-report-viewer/components/reporting/AIPanel/index.d.ts +2 -0
- package/dx-report-viewer/components/reporting/AIPanel/index.js +2 -0
- package/dx-report-viewer/components/reporting/DocumentMap/DocumentMap.js +1 -1
- package/dx-report-viewer/components/reporting/Editing/CharacterComb/CharacterComb.js +1 -1
- package/dx-report-viewer/components/reporting/Editing/PopupImageEditingField/PopupImageEditingField.js +1 -0
- package/dx-report-viewer/components/reporting/Editing/TextField/Container/EditingFieldContainer.js +3 -0
- package/dx-report-viewer/components/reporting/Mobile/Page/MobilePage.js +2 -1
- package/dx-report-viewer/components/reporting/ParametersPanel/DateRange/PopupContainer/PopupContainer.js +2 -2
- package/dx-report-viewer/components/reporting/ReportPreview/Breadcrumbs/Breadcrumbs.js +4 -4
- package/dx-report-viewer/components/reporting/ReportPreview/Page/Page.js +26 -7
- package/dx-report-viewer/components/reporting/ReportPreview/Surface/Surface.js +2 -2
- package/dx-report-viewer/components/reporting/Toolbar/ExportTo/ExportTo.js +1 -3
- package/dx-report-viewer/components/reporting/Widgets/PictureEditor/PictureEditor.js +1 -1
- package/dx-report-viewer/components/reporting/_templates.js +2 -0
- package/dx-report-viewer/hooks/dxMutationObserver.js +2 -2
- package/dx-report-viewer/hooks/dxPreviewPageRenderer.d.ts +4 -0
- package/dx-report-viewer/hooks/dxPreviewPageRenderer.js +6 -0
- package/package.json +9 -8
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import React, { useMemo } from 'react';
|
|
2
|
+
import { Button, CheckBox, LoadIndicator, SelectBox, TextArea, Popup } from 'devextreme-react';
|
|
3
|
+
import Template from '../../core/Template';
|
|
4
|
+
import { Position } from 'devextreme-react/cjs/popup';
|
|
5
|
+
import useDxForceRerender from '../../../hooks/dxForceRerender';
|
|
6
|
+
const AIPanel = ({ data }) => {
|
|
7
|
+
const GetVisible = () => {
|
|
8
|
+
return data.model?.tabInfo?.visible && data.model?.tabInfo?.active;
|
|
9
|
+
};
|
|
10
|
+
const getCopyTemplate = () => {
|
|
11
|
+
return data.model?.copyButtonTemplate;
|
|
12
|
+
};
|
|
13
|
+
const aiPanelHeaderLabel = data.model.getViewModel().aiPanelHeaderLabel;
|
|
14
|
+
const viewModel = data.model?.getViewModel();
|
|
15
|
+
const popupAttributes = useMemo(() => {
|
|
16
|
+
return {
|
|
17
|
+
class: 'dxrd-preview-ai-panel-warning-popup'
|
|
18
|
+
};
|
|
19
|
+
}, []);
|
|
20
|
+
const forceRerender = useDxForceRerender();
|
|
21
|
+
React.useEffect(() => {
|
|
22
|
+
forceRerender();
|
|
23
|
+
}, [Object.values(data.model.getViewModel())]);
|
|
24
|
+
return (React.createElement("div", { id: "dxrd-preview-ai-panel-id", className: "dxrd-preview-ai-panel", hidden: !(GetVisible()) },
|
|
25
|
+
React.createElement("div", { className: "dxrd-right-panel-header dxd-text-primary" },
|
|
26
|
+
React.createElement("span", null,
|
|
27
|
+
" ",
|
|
28
|
+
aiPanelHeaderLabel,
|
|
29
|
+
" ")),
|
|
30
|
+
!!viewModel && (React.createElement("div", null,
|
|
31
|
+
React.createElement("div", { className: "dxrd-preview-ai-panel-wrapper dx-editors" },
|
|
32
|
+
React.createElement("div", { className: "dx-fieldset" },
|
|
33
|
+
React.createElement("div", { className: "dx-field dxrd-preview-ai-select-box" },
|
|
34
|
+
React.createElement("label", { className: "dxrd-preview-ai-form-label", htmlFor: "dxrv-ai-target-select" },
|
|
35
|
+
" ",
|
|
36
|
+
viewModel.targetContentText),
|
|
37
|
+
React.createElement(SelectBox, { id: "dxrv-ai-target-select", className: "dxrd-preview-ai-form-input", dataSource: viewModel.targetSelecBoxOptions.dataSource, onValueChanged: viewModel.targetSelecBoxOptions.onValueChanged, value: viewModel.targetSelecBoxOptions.value, displayExpr: viewModel.targetSelecBoxOptions.displayExpr, valueExpr: viewModel.targetSelecBoxOptions.valueExpr, inputAttr: viewModel.targetSelecBoxOptions.inputAttr })),
|
|
38
|
+
React.createElement("div", { className: "dx-field dxrd-preview-ai-select-box" },
|
|
39
|
+
React.createElement("label", { className: "dxrd-preview-ai-form-label", htmlFor: "dxrv-ai-language-select" },
|
|
40
|
+
" ",
|
|
41
|
+
viewModel.targetLanguageText,
|
|
42
|
+
" "),
|
|
43
|
+
React.createElement(SelectBox, { id: "dxrv-ai-language-select", className: "dxrd-preview-ai-form-input", dataSource: viewModel.languageSelecBoxOptions.dataSource, onValueChanged: viewModel.languageSelecBoxOptions.onValueChanged, value: viewModel.languageSelecBoxOptions.value, displayExpr: viewModel.languageSelecBoxOptions.displayExpr, valueExpr: viewModel.languageSelecBoxOptions.valueExpr, showClearButton: viewModel.languageSelecBoxOptions.showClearButton, inputAttr: viewModel.languageSelecBoxOptions.inputAttr })),
|
|
44
|
+
viewModel.pageSelecBoxVisible && (React.createElement("div", { className: "dx-field dxrd-preview-ai-select-box" },
|
|
45
|
+
React.createElement("label", { className: "dxrd-preview-ai-form-label", htmlFor: "dxrv-ai-page-select" },
|
|
46
|
+
" ",
|
|
47
|
+
viewModel.pageSelectText),
|
|
48
|
+
React.createElement(SelectBox, { className: "dxrd-preview-ai-form-input", id: "dxrv-ai-page-select", dataSource: viewModel.pageSelecBoxOptions.dataSource, onValueChanged: viewModel.pageSelecBoxOptions.onValueChanged, value: viewModel.pageSelecBoxOptions.value, displayExpr: viewModel.pageSelecBoxOptions.displayExpr, valueExpr: viewModel.pageSelecBoxOptions.valueExpr, searchExpr: viewModel.pageSelecBoxOptions.searchExpr, searchEnabled: viewModel.pageSelecBoxOptions.searchEnabled, visible: viewModel.pageSelecBoxOptions.visible, inputAttr: viewModel.pageSelecBoxOptions.inputAttr }))),
|
|
49
|
+
React.createElement("div", { className: "dx-field" },
|
|
50
|
+
React.createElement("div", { className: "dxrd-preview-ai-buttons-wrapper" },
|
|
51
|
+
React.createElement(LoadIndicator, { className: "dxrd-preview-ai-buttons", visible: data.model.loading, height: 24, width: 24 }),
|
|
52
|
+
React.createElement(Button, { className: "dxrd-preview-ai-buttons dx-accessibility-focus-border-accented", text: viewModel.buttons.translateTextButton.text, disabled: viewModel.buttons.translateTextButton.disabled, onClick: viewModel.buttons.translateTextButton.onClick, width: viewModel.buttons.translateTextButton.width }),
|
|
53
|
+
React.createElement(Button, { className: "dxrd-preview-ai-buttons dx-accessibility-focus-border-accented", text: viewModel.buttons.summarizeTextButton.text, disabled: viewModel.buttons.summarizeTextButton.disabled, onClick: viewModel.buttons.summarizeTextButton.onClick, width: viewModel.buttons.summarizeTextButton.width })))),
|
|
54
|
+
viewModel.resultVisible && (React.createElement("div", { className: "dxrd-right-panel-header dxd-text-primary dxd-border-primary dxrd-ai-result-text" },
|
|
55
|
+
React.createElement("span", { className: "dxrd-right-panel-result-text" },
|
|
56
|
+
" ",
|
|
57
|
+
viewModel.textProcessingResultHeaderTest,
|
|
58
|
+
" "),
|
|
59
|
+
React.createElement("div", { role: "button", className: "dxrd-right-panel-copy-button dx-accessibility-focus-border-accented", tabIndex: 0, onKeyDown: (e) => viewModel.copyText(data, e) },
|
|
60
|
+
React.createElement(Template, { template: getCopyTemplate(), className: "dxd-icon-highlighted", onClick: (e) => viewModel.buttons.copyResultButton.onClick(e) })))),
|
|
61
|
+
React.createElement(TextArea, { id: "dxrd-ai-panel-text-area-id", tabIndex: 0, className: "dx-accessibility-focus-border-accented dxrd-preview-ai-panel-textarea dxd-back-primary2", value: viewModel.aiProcessingResultText, onInput: (e) => e.event.preventDefault(), onPaste: (e) => e.event.preventDefault(), onKeyDown: (e) => e.event.key !== 'Tab' && e.event.preventDefault(), hoverStateEnabled: false })),
|
|
62
|
+
React.createElement(Popup, { width: 350, height: 200, shading: false, focusStateEnabled: false, visible: viewModel.warningTextLimitPopupVisible, container: '#dxrd-preview-ai-panel-id', showCloseButton: false, showTitle: false, wrapperAttr: popupAttributes },
|
|
63
|
+
React.createElement(Position, { at: "top", my: "top", of: "#dxrd-preview-ai-panel-id", collision: "fit" }),
|
|
64
|
+
React.createElement("span", { className: "dxrd-preview-ai-panel-warning-popup-text" },
|
|
65
|
+
" ",
|
|
66
|
+
viewModel.limitExceededWarningMsg,
|
|
67
|
+
" "),
|
|
68
|
+
React.createElement(CheckBox, { className: "dxrd-preview-ai-panel-warning-popup-checkbox", text: viewModel.proceedForAllCheckBoxOptions.text, value: viewModel.proceedForAllCheckBoxOptions.value, onValueChanged: viewModel.proceedForAllCheckBoxOptions.onValueChanged }),
|
|
69
|
+
React.createElement("div", { className: "dxrd-preview-ai-panel-warning-popup-button-group" },
|
|
70
|
+
React.createElement(Button, { text: viewModel.proceedNextChunkButtonText, onClick: viewModel.proceedNextButtonClick, className: "dxrd-preview-ai-panel-warning-popup-button dx-button-default" }),
|
|
71
|
+
React.createElement(Button, { text: viewModel.cancelChunkedOperationButtonText, onClick: viewModel.cancelProcessButtonClick, className: "dxrd-preview-ai-panel-warning-popup-button" })))))));
|
|
72
|
+
};
|
|
73
|
+
export default AIPanel;
|
|
@@ -11,7 +11,7 @@ const DocumentMap = ({ data }) => {
|
|
|
11
11
|
React.useEffect(() => {
|
|
12
12
|
htmlRef.current = scrollViewRef.current?.instance().element();
|
|
13
13
|
setViewModel(data.model?.getViewModel());
|
|
14
|
-
}, []);
|
|
14
|
+
}, [scrollViewRef.current]);
|
|
15
15
|
useDxMutationObserver(htmlRef, data.keyboardHelper);
|
|
16
16
|
return (React.createElement("div", { className: "dxrd-preview-document-map dxrd-height-100 dxrd-overflow-hidden", hidden: !(data.active && data.visible) },
|
|
17
17
|
React.createElement("div", { className: "dxrd-right-panel-header dxd-text-primary" },
|
|
@@ -9,7 +9,7 @@ const CharacterComb = ({ data }) => {
|
|
|
9
9
|
setValue(newValue);
|
|
10
10
|
data.field.editorValue = newValue;
|
|
11
11
|
};
|
|
12
|
-
return (React.createElement("div", { ref: zoomRef, style: processStyles(data.containerStyle), onClick: event => data.activateEditor(data, event
|
|
12
|
+
return (React.createElement("div", { ref: zoomRef, style: processStyles(data.containerStyle), onClick: event => data.activateEditor(data, event), className: `dxrp-editing-field-charactercomb dx-accessibility-editing-field-item dx-accessibility-border-accented ${data.active ? 'active' : ''} ${data.field.readOnly ? 'readOnly' : ''}` },
|
|
13
13
|
(!data.active || data.field.readOnly) &&
|
|
14
14
|
data.cells.map((cell, index) => (React.createElement("div", { key: index, className: "dxrp-editing-field-charactercomb-cell", style: processStyles(cell.style) }, cell.text))),
|
|
15
15
|
data.active && !data.field.readOnly &&
|
|
@@ -17,6 +17,7 @@ const PopupImageEditingField = ({ data }) => {
|
|
|
17
17
|
},
|
|
18
18
|
container: container
|
|
19
19
|
});
|
|
20
|
+
data.setEditingFieldElement(popupContainerRef.current);
|
|
20
21
|
}, []);
|
|
21
22
|
return (React.createElement("div", { ref: elementRef, className: "dxrp-editing-field-container", style: data.containerStyle },
|
|
22
23
|
React.createElement("div", { ref: popupContainerRef, className: 'dx-accessibility-editing-field-item dx-accessibility-border-accented ' + data.parentPopupClass, onClick: event => data.activateEditor(data, event) },
|
package/dx-report-viewer/components/reporting/Editing/TextField/Container/EditingFieldContainer.js
CHANGED
|
@@ -4,6 +4,9 @@ import dxZoom from '../../../../../hooks/dxZoom';
|
|
|
4
4
|
import { processStyles } from '../../../../../core/processStyles';
|
|
5
5
|
const EditingFieldContainer = ({ data }) => {
|
|
6
6
|
const zoomRef = dxZoom(data.zoom);
|
|
7
|
+
React.useEffect(() => {
|
|
8
|
+
data.setEditingFieldElement(zoomRef.current);
|
|
9
|
+
}, []);
|
|
7
10
|
return (React.createElement("div", { ref: zoomRef, style: processStyles(data.containerStyle), className: `dxrp-editing-field-container dx-accessibility-editing-field-item dx-accessibility-border-accented ${data.active ? 'active' : ''} ${data.field.readOnly ? 'readonly' : ''}` },
|
|
8
11
|
React.createElement("div", { className: "dxrp-editing-field-borders", style: data.borderStyle }),
|
|
9
12
|
React.createElement("div", { className: "dxrp-editing-field-content", onClick: event => data.activateEditor(data, event) },
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import Template from '../../../core/Template';
|
|
3
3
|
import useDxMobileAutofit from '../hooks/mobileAutofit';
|
|
4
|
+
import useDxPreviewPageRenderer from '../../../../hooks/dxPreviewPageRenderer';
|
|
4
5
|
const MobilePage = ({ data }) => {
|
|
5
6
|
const ref = useDxMobileAutofit(data.autoFitOptions);
|
|
7
|
+
useDxPreviewPageRenderer(ref, data.imageOptions);
|
|
6
8
|
return (React.createElement("div", { className: "dxrdp-content", onClick: event => data.clickToBrick(data, event), style: { width: data.width + 'px', height: data.height + 'px' }, ref: ref },
|
|
7
9
|
React.createElement("div", { className: "dxrdp-loading-wrapper", style: {
|
|
8
10
|
width: data.width + 'px',
|
|
@@ -10,7 +12,6 @@ const MobilePage = ({ data }) => {
|
|
|
10
12
|
lineHeight: data.height + 'px',
|
|
11
13
|
backgroundColor: data.color
|
|
12
14
|
}, hidden: !data.pageLoading }, data.loadingText),
|
|
13
|
-
React.createElement("img", { className: "dxrd-width-100 dxrd-height-100", src: data.displayImageSrc, style: { backgroundColor: data.color } }),
|
|
14
15
|
React.createElement("div", { className: `dxrdp-active-border ${data.active && data.hasBricks ? 'dxrdp-active' : ''}`, hidden: data.readerMode }),
|
|
15
16
|
data.activeBricks.map(brick => React.createElement(Template, { key: brick.indexes, template: "dxrd-page-brick-mobile", data: brick })),
|
|
16
17
|
!data.brickLoading && data.editingFields &&
|
|
@@ -21,12 +21,12 @@ const DateRangePopupContainer = ({ data }) => {
|
|
|
21
21
|
const predefinedRangesRef = React.useRef();
|
|
22
22
|
React.useEffect(() => {
|
|
23
23
|
predefinedRangesRef.current = scrollViewRef.current?.instance().element();
|
|
24
|
-
}, []);
|
|
24
|
+
}, [scrollViewRef.current]);
|
|
25
25
|
useDxMutationObserver(predefinedRangesRef, data.predefinedRanges.accessibilityKeyboardHelper);
|
|
26
26
|
return (React.createElement(Popup, { width: popupOptions.width, height: popupOptions.height, wrapperAttr: popupOptions.wrapperAttr, position: popupOptions.position, container: popupOptions.container, showTitle: popupOptions.showTitle, showCloseButton: popupOptions.showCloseButton, hideOnOutsideClick: popupOptions.hideOnOutsideClick, onHidden: popupOptions.onHidden, animation: popupOptions.animation, shading: popupOptions.shading, visible: popupOptions.visible },
|
|
27
27
|
React.createElement(ScrollView, { elementAttr: { 'role': 'dialog', 'aria-modal': 'true' }, showScrollbar: data.scrollViewOptions.showScrollbar, direction: data.scrollViewOptions.direction, useNative: data.scrollViewOptions.useNative, onInitialized: data.scrollViewOptions.onInitialized },
|
|
28
28
|
React.createElement("div", { className: "dxrv-daterange-editor-popup-container", ref: ref },
|
|
29
|
-
React.createElement(ScrollView, { className: "dxrv-daterange-editor-list dxrv-daterange-editor-item dxd-border-primary dx-accessibility-daterange-item", elementAttr: { role: 'listbox' }, showScrollbar: data.predefinedRanges.scrollViewOptions.showScrollbar, scrollByContent: data.predefinedRanges.scrollViewOptions.scrollByContent, bounceEnabled: data.predefinedRanges.scrollViewOptions.bounceEnabled, useNative: data.predefinedRanges.scrollViewOptions.useNative, scrollByThumb: data.predefinedRanges.scrollViewOptions.scrollByThumb, onInitialized: data.predefinedRanges.scrollViewOptions.onInitialized },
|
|
29
|
+
React.createElement(ScrollView, { className: "dxrv-daterange-editor-list dxrv-daterange-editor-item dxd-border-primary dx-accessibility-daterange-item", elementAttr: { role: 'listbox' }, showScrollbar: data.predefinedRanges.scrollViewOptions.showScrollbar, scrollByContent: data.predefinedRanges.scrollViewOptions.scrollByContent, bounceEnabled: data.predefinedRanges.scrollViewOptions.bounceEnabled, useNative: data.predefinedRanges.scrollViewOptions.useNative, scrollByThumb: data.predefinedRanges.scrollViewOptions.scrollByThumb, onInitialized: data.predefinedRanges.scrollViewOptions.onInitialized, ref: scrollViewRef },
|
|
30
30
|
React.createElement("div", { className: "dx-accessibility-container-background dxd-back-accented" }),
|
|
31
31
|
data.predefinedRanges.items.map((item, index) => React.createElement(PredefinedItem, { key: index, item: item }))),
|
|
32
32
|
React.createElement("div", { className: "dxrv-daterange-editor-item" },
|
|
@@ -2,17 +2,17 @@ import React from 'react';
|
|
|
2
2
|
import Template from '../../../core/Template';
|
|
3
3
|
import useDxMutationObserver from '../../../../hooks/dxMutationObserver';
|
|
4
4
|
const ClickableCrumb = ({ item, handleClick }) => (React.createElement(React.Fragment, null,
|
|
5
|
-
React.createElement("a", { className: "breadcrump-link breadcrumb-item dxd-text-accented dx-accessibility-border-accented", onClick: handleClick },
|
|
5
|
+
React.createElement("a", { className: "dxrd-breadcrump-link dxrd-breadcrumb-item dxd-text-accented dx-accessibility-border-accented", onClick: handleClick },
|
|
6
6
|
React.createElement("span", null, item.displayText)),
|
|
7
|
-
React.createElement(Template, { className: "breadcrumb-item-seperator", template: "dxrd-svg-preview-breadcrumbs_seperator" })));
|
|
8
|
-
const CurrentCrumb = ({ item }) => (React.createElement("a", { className: "breadcrumb-item dxd-text-primary dx-accessibility-border-accented", "aria-current": "location" },
|
|
7
|
+
React.createElement(Template, { className: "dxrd-breadcrumb-item-seperator", template: "dxrd-svg-preview-breadcrumbs_seperator" })));
|
|
8
|
+
const CurrentCrumb = ({ item }) => (React.createElement("a", { className: "dxrd-breadcrumb-item dxd-text-primary dx-accessibility-border-accented", "aria-current": "location" },
|
|
9
9
|
React.createElement("span", null, item.displayText)));
|
|
10
10
|
const Breadcrumbs = ({ data }) => {
|
|
11
11
|
if (data.listItems.length <= 1)
|
|
12
12
|
return null;
|
|
13
13
|
const dxMutationObserverRef = React.useRef();
|
|
14
14
|
useDxMutationObserver(dxMutationObserverRef, data.keyboardHelper);
|
|
15
|
-
return (React.createElement("div", { className: "breadcrumbs-wrapper", ref: dxMutationObserverRef, "aria-label": "Breadcrumbs", role: "navigation" }, data.listItems.map((item, index) => data.listItems.length === (index + 1)
|
|
15
|
+
return (React.createElement("div", { className: "dxrd-breadcrumbs-wrapper", ref: dxMutationObserverRef, "aria-label": "Breadcrumbs", role: "navigation" }, data.listItems.map((item, index) => data.listItems.length === (index + 1)
|
|
16
16
|
? React.createElement(CurrentCrumb, { key: index, item: item })
|
|
17
17
|
: React.createElement(ClickableCrumb, { key: index, item: item, handleClick: () => data.onClick(item.position) }))));
|
|
18
18
|
};
|
|
@@ -2,24 +2,43 @@ import React from 'react';
|
|
|
2
2
|
import Template from '../../../core/Template';
|
|
3
3
|
import useDxMutationObserver from '../../../../hooks/dxMutationObserver';
|
|
4
4
|
import useDxBrickSelection from '../../../../hooks/dxBrickSelection';
|
|
5
|
+
import useDxPreviewPageRenderer from '../../../../hooks/dxPreviewPageRenderer';
|
|
6
|
+
import Menu from 'devextreme-react/menu';
|
|
5
7
|
const EditingFieldsHolder = ({ editingFields, editingFieldsKeyboardHelper }) => {
|
|
6
8
|
const mutationObserverRef = React.useRef();
|
|
7
9
|
useDxMutationObserver(mutationObserverRef, editingFieldsKeyboardHelper);
|
|
8
10
|
return (React.createElement("div", { ref: mutationObserverRef }, editingFields.map((editingField, index) => React.createElement(Template, { key: index, template: editingField.template, data: editingField }))));
|
|
9
11
|
};
|
|
12
|
+
const Image = ({ data }) => {
|
|
13
|
+
const pageRendererRef = React.useRef();
|
|
14
|
+
useDxPreviewPageRenderer(pageRendererRef, data.imageOptions);
|
|
15
|
+
return (React.createElement("div", null,
|
|
16
|
+
data.activeBricks.map(brick => React.createElement(Template, { key: brick.indexes, template: "dxrd-page-brick-mobile", data: brick })),
|
|
17
|
+
data.clickableBricks.map(brick => React.createElement(Template, { key: brick.indexes, template: "dxrd-page-brick-clickable", data: brick })),
|
|
18
|
+
!data.brickLoading
|
|
19
|
+
&& data.editingFields
|
|
20
|
+
&& React.createElement(EditingFieldsHolder, { editingFields: data.editingFields, editingFieldsKeyboardHelper: data.editingFieldsKeyboardHelper })));
|
|
21
|
+
};
|
|
10
22
|
const Page = ({ data }) => {
|
|
11
23
|
const brickSelectionRef = React.useRef();
|
|
12
24
|
useDxBrickSelection(brickSelectionRef, data.brickSelectionProg);
|
|
25
|
+
useDxPreviewPageRenderer(brickSelectionRef, data.imageOptions);
|
|
26
|
+
const renderMenuItemTemplate = (item) => {
|
|
27
|
+
return (React.createElement("div", { className: "dxrd-ai-floating-smart-tag-container" },
|
|
28
|
+
item.text && (React.createElement("div", { className: "dxrd-ai-floating-smart-tag-text" }, item.text)),
|
|
29
|
+
item.items && item.text.length > 0 && (React.createElement("div", { className: `dx-icon dxrd-ai-floating-smart-tag-items ${(data.getModel()?.reportPreview?.rtlViewer ?? false) ? 'dx-icon-spinleft' : 'dx-icon-spinright'}` })),
|
|
30
|
+
item.icon && (React.createElement("div", { className: "dxrd-ai-floating-smart-tag-icon" },
|
|
31
|
+
React.createElement(Template, { template: item.icon, data: null })))));
|
|
32
|
+
};
|
|
33
|
+
const menuAttributes = {
|
|
34
|
+
class: 'dxrd-control-ai-smart-tag dxd-icon-accented'
|
|
35
|
+
};
|
|
13
36
|
return (React.createElement("div", { role: "img", className: "dxrd-report-preview-content dxrd-position-relative dxrd-width-100 dxrd-height-100", "aria-label": data.currentPageAriaLabelImgAlt, onClick: e => data.clickToBrick(data, e), ref: brickSelectionRef },
|
|
14
37
|
React.createElement("div", { className: "dxrd-report-preview-content-loading-wrapper dxrd-background-white", style: { width: data.width + 2 + 'px', height: data.height + 2 + 'px' }, hidden: !data.pageLoading },
|
|
15
38
|
React.createElement("div", { className: "dxrd-report-preview-content-loading-panel dxrd-text-align-center", style: { paddingTop: data.height / 2.3 + 'px' } },
|
|
16
39
|
React.createElement("div", { className: "dxrd-report-preview-content-loading-panel-text" }, data.loadingText))),
|
|
17
|
-
React.createElement(
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
data.clickableBricks.map(brick => React.createElement(Template, { key: brick.indexes, template: "dxrd-page-brick-clickable", data: brick })),
|
|
21
|
-
!data.brickLoading
|
|
22
|
-
&& data.editingFields
|
|
23
|
-
&& React.createElement(EditingFieldsHolder, { editingFields: data.editingFields, editingFieldsKeyboardHelper: data.editingFieldsKeyboardHelper }))));
|
|
40
|
+
React.createElement(Image, { data: data }),
|
|
41
|
+
data.activeBricks.length > 0 && (React.createElement("div", { style: { position: 'absolute', top: data.smartTagAIMenuPosition.topP, left: data.smartTagAIMenuPosition.leftP, right: data.smartTagAIMenuPosition.rightP, height: data.smartTagAIMenuPosition.heightP, width: data.smartTagAIMenuPosition.widthP } },
|
|
42
|
+
React.createElement(Menu, { dataSource: data.smartTagAIMenu.dataSource, hideSubmenuOnMouseLeave: data.smartTagAIMenu.hideSubmenuOnMouseLeave, elementAttr: menuAttributes, visible: data.smartTagAIMenu.visible, itemRender: renderMenuItemTemplate, showFirstSubmenuMode: 'onHover', onItemClick: (e) => typeof data.smartTagAIMenu.onItemClick === 'function' && data.smartTagAIMenu.onItemClick(e) })))));
|
|
24
43
|
};
|
|
25
44
|
export default Page;
|
|
@@ -13,7 +13,7 @@ const MultiPageHolder = ({ lazyImagesOptions, pages }) => {
|
|
|
13
13
|
const MultiPageItem = ({ page }) => {
|
|
14
14
|
const toViewRef = React.useRef();
|
|
15
15
|
useDxToView(toViewRef, page);
|
|
16
|
-
const valid = page.pageLoading || (!page.pageLoading && page.
|
|
16
|
+
const valid = page.pageLoading || (!page.pageLoading && page.pageLoaded);
|
|
17
17
|
if (!valid)
|
|
18
18
|
return null;
|
|
19
19
|
return (React.createElement("div", { role: "listitem", className: `dxrd-report-preview dxrd-report-preview-multipage dx-accessibility-page-item dx-accessibility-border-accented ${page.active ? 'dxrd-report-preview-active' : ''}`, style: { width: page.width + 'px', height: page.height + 'px' }, ref: toViewRef },
|
|
@@ -29,7 +29,7 @@ const Surface = ({ data }) => {
|
|
|
29
29
|
React.createElement("div", { className: `dxrd-preview-wrapper ${data.rtlReport ? 'dx-rtl' : ''} ${data.editingFieldsHighlighted ? 'dxrp-editing-fields-hightlighted' : ''}`, "data-bind": "textCopier" },
|
|
30
30
|
React.createElement(Template, { template: "dxrd-preview-progress-bar", data: data.progressBar }),
|
|
31
31
|
React.createElement("div", { className: "dxrd-preview-surface", ref: dxMutationObserverRef },
|
|
32
|
-
!data.showMultipagePreview && (React.createElement("div", { className: "dxrd-report-preview-holder", role: "list" }, (!!data.currentPage && (data.currentPage.pageLoading || (!data.currentPage.pageLoading && data.currentPage.
|
|
32
|
+
!data.showMultipagePreview && (React.createElement("div", { className: "dxrd-report-preview-holder", role: "list" }, (!!data.currentPage && (data.currentPage.pageLoading || (!data.currentPage.pageLoading && data.currentPage.pageLoaded))) && (React.createElement("div", { role: "listitem", className: "dxrd-report-preview dx-accessibility-page-item dx-accessibility-border-accented", ref: autoFitRef, style: { width: data.currentPage.width + 'px', height: data.currentPage.height + 'px' } },
|
|
33
33
|
React.createElement(Template, { template: "dxrd-preview-page", data: data.currentPage }))))),
|
|
34
34
|
data.showMultipagePreview && !!data.currentPage && React.createElement(MultiPageHolder, { pages: data.pages, lazyImagesOptions: data.lazyImagesOptions }),
|
|
35
35
|
React.createElement("div", { className: `dxrd-report-preview-placeholder ${!!data.currentPage ? 'dxrd-visually-hidden' : ''}` },
|
|
@@ -20,9 +20,7 @@ const ToolbarExportTo = ({ data }) => {
|
|
|
20
20
|
}, []);
|
|
21
21
|
return (React.createElement("div", { className: "dxrd-preview-export-toolbar-item dxrd-toolbar-item", hidden: !data.visible },
|
|
22
22
|
React.createElement("div", { className: "dx-accessibility-toolbar-item dx-accessibility-focus-border-accented" },
|
|
23
|
-
React.createElement(Menu, { ref: menuRef,
|
|
24
|
-
// wrapperAttr={{ className: 'dxrd-preview-export-to dxd-button-back-color dxd-state-normal dxd-icon-highlighted' }}
|
|
25
|
-
disabled: data.disabled, items: data.widget.items, cssClass: "dxrdp-export-to-menu", onItemClick: data.click, onSubmenuShowing: onSubmenuShowing, onSubmenuShown: data.widget.onSubmenuShown, onSubmenuHiding: data.widget.onSubmenuHiding, onItemRendered: data.widget.onItemRendered, itemRender: (data) => data && React.createElement(MenuItemTemplate, { item: data }), tabIndex: -1 })),
|
|
23
|
+
React.createElement(Menu, { ref: menuRef, disabled: data.disabled, items: data.widget.items, cssClass: "dxrdp-export-to-menu dxrd-preview-export-to dxd-button-back-color dxd-state-normal dxd-icon-highlighted", onItemClick: data.click, onSubmenuShowing: onSubmenuShowing, onSubmenuShown: data.widget.onSubmenuShown, onSubmenuHiding: data.widget.onSubmenuHiding, onItemRendered: data.widget.onItemRendered, itemRender: (data) => data && React.createElement(MenuItemTemplate, { item: data }), tabIndex: -1 })),
|
|
26
24
|
React.createElement("div", { className: "dxrd-toolbar-item-separator dxd-toolbar-separator-color dxd-border-secondary", hidden: !data.hasSeparator })));
|
|
27
25
|
};
|
|
28
26
|
export default ToolbarExportTo;
|
|
@@ -56,6 +56,6 @@ const PictureEditor = ({ options, className }) => {
|
|
|
56
56
|
};
|
|
57
57
|
return (React.createElement("div", { ref: pictureEditingRef, className: "dx-picture-editing" },
|
|
58
58
|
React.createElement("canvas", { ref: canvasRef }),
|
|
59
|
-
React.createElement(Popup, { className: "dx-picture-editing-active", width: "48px", height: "auto", wrapperAttr: { class: 'dx-picture-editing-active' }, position: popupOptions.position, container: popupOptions.container, showTitle: false, animation: {}, shading: false, visible: true, contentRender: renderContent })));
|
|
59
|
+
React.createElement(Popup, { className: "dx-picture-editing-active", width: "48px", height: "auto", wrapperAttr: { class: 'dx-picture-editing-active' }, position: popupOptions.position, container: popupOptions.container, showTitle: false, onShown: pictureEditorViewModel?.onContentReady, showCloseButton: false, animation: {}, shading: false, visible: true, contentRender: renderContent })));
|
|
60
60
|
};
|
|
61
61
|
export default PictureEditor;
|
|
@@ -12,6 +12,7 @@ import ToolbarContent from './Toolbar/ToolbarContent';
|
|
|
12
12
|
import Zoom from './Toolbar/Zoom';
|
|
13
13
|
import ParametersPanel from './ParametersPanel';
|
|
14
14
|
import DocumentMap from './DocumentMap';
|
|
15
|
+
import AIPanel from './AIPanel/AIPanel';
|
|
15
16
|
import Editor from './ParametersPanel/Editor/Editor';
|
|
16
17
|
import EditorContent from './ParametersPanel/Editor/EditorContent';
|
|
17
18
|
import GroupEditor from './ParametersPanel/Editor/GroupEditor';
|
|
@@ -62,6 +63,7 @@ export const reportingTemplates = {
|
|
|
62
63
|
'dxrd-multivalue': MultiValue,
|
|
63
64
|
'dxrd-preview-export-options': ExportOptions,
|
|
64
65
|
'dxrd-preview-document-map': DocumentMap,
|
|
66
|
+
'dxrd-preview-ai-panel': AIPanel,
|
|
65
67
|
'dxrd-multivalue-editable': MultiValueEditable,
|
|
66
68
|
'dxrv-range-parameter': DateRange,
|
|
67
69
|
'dxrv-daterange-editor-popup': DateRangePopupContainer,
|
|
@@ -4,9 +4,9 @@ import { initializeMutationObserver } from '@devexpress/analytics-core/accessibi
|
|
|
4
4
|
const useDxMutationObserver = (ref, args) => {
|
|
5
5
|
const accesibilitySetting = React.useContext(accesibilitySettingsContext);
|
|
6
6
|
React.useEffect(() => {
|
|
7
|
-
if (args &&
|
|
7
|
+
if (args && ref.current)
|
|
8
8
|
return initializeMutationObserver(ref.current, args, accesibilitySetting.accessibilityCompliant);
|
|
9
9
|
return () => { };
|
|
10
|
-
}, [args,
|
|
10
|
+
}, [args, ref.current]);
|
|
11
11
|
};
|
|
12
12
|
export default useDxMutationObserver;
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { IPreviewImageOptions } from 'devexpress-reporting/viewer/internal/_bindings';
|
|
3
|
+
declare const useDxPreviewPageRenderer: (ref: React.MutableRefObject<HTMLElement>, options: IPreviewImageOptions) => void;
|
|
4
|
+
export default useDxPreviewPageRenderer;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { updatePreviewPageRendererBinding } from 'devexpress-reporting/viewer/internal/_bindings';
|
|
3
|
+
const useDxPreviewPageRenderer = (ref, options) => {
|
|
4
|
+
React.useEffect(() => options && ref.current && updatePreviewPageRendererBinding(ref.current, options), [options, ref.current]);
|
|
5
|
+
};
|
|
6
|
+
export default useDxPreviewPageRenderer;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "devexpress-reporting-react",
|
|
3
|
-
"version": "24.
|
|
3
|
+
"version": "24.2.2-beta",
|
|
4
4
|
"homepage": "https://www.devexpress.com/",
|
|
5
5
|
"bugs": "https://www.devexpress.com/support/",
|
|
6
6
|
"author": "Developer Express Inc.",
|
|
@@ -15,23 +15,24 @@
|
|
|
15
15
|
"license": "SEE LICENSE IN README.md",
|
|
16
16
|
"main": "./index.js",
|
|
17
17
|
"dependencies": {
|
|
18
|
-
"
|
|
19
|
-
"
|
|
18
|
+
"devexpress-reporting": "24.2.2-beta",
|
|
19
|
+
"prop-types": "^15.8.1"
|
|
20
20
|
},
|
|
21
21
|
"peerDependencies": {
|
|
22
22
|
"@types/react": "^18.0.28",
|
|
23
23
|
"@types/react-dom": "^18.0.28",
|
|
24
|
-
"devextreme-react": "24.
|
|
24
|
+
"devextreme-react": "24.2.2-beta",
|
|
25
25
|
"react": "^18.0.28",
|
|
26
26
|
"react-dom": "^18.0.28"
|
|
27
27
|
},
|
|
28
28
|
"devDependencies": {
|
|
29
|
+
"@devexpress/analytics-core": "24.2.2-beta",
|
|
29
30
|
"shx": "^0.3.4",
|
|
30
|
-
"typescript": "
|
|
31
|
-
"@devexpress/analytics-core": "24.1.7"
|
|
31
|
+
"typescript": "<5.3.0"
|
|
32
32
|
},
|
|
33
33
|
"scripts": {
|
|
34
34
|
"prebuild": "npx shx rm -rf dist && npx shx mkdir dist && npx shx cp README.md dist/ && npx shx cp package.json dist/",
|
|
35
35
|
"build": "npx tsc --project tsconfig.lib.json"
|
|
36
|
-
}
|
|
37
|
-
|
|
36
|
+
},
|
|
37
|
+
"commitSHA": "cc41462435ed6449af1ecfedef0f3bc179dea83c"
|
|
38
|
+
}
|