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.
Files changed (20) hide show
  1. package/dx-report-viewer/components/reporting/AIPanel/AIPanel.d.ts +6 -0
  2. package/dx-report-viewer/components/reporting/AIPanel/AIPanel.js +73 -0
  3. package/dx-report-viewer/components/reporting/AIPanel/index.d.ts +2 -0
  4. package/dx-report-viewer/components/reporting/AIPanel/index.js +2 -0
  5. package/dx-report-viewer/components/reporting/DocumentMap/DocumentMap.js +1 -1
  6. package/dx-report-viewer/components/reporting/Editing/CharacterComb/CharacterComb.js +1 -1
  7. package/dx-report-viewer/components/reporting/Editing/PopupImageEditingField/PopupImageEditingField.js +1 -0
  8. package/dx-report-viewer/components/reporting/Editing/TextField/Container/EditingFieldContainer.js +3 -0
  9. package/dx-report-viewer/components/reporting/Mobile/Page/MobilePage.js +2 -1
  10. package/dx-report-viewer/components/reporting/ParametersPanel/DateRange/PopupContainer/PopupContainer.js +2 -2
  11. package/dx-report-viewer/components/reporting/ReportPreview/Breadcrumbs/Breadcrumbs.js +4 -4
  12. package/dx-report-viewer/components/reporting/ReportPreview/Page/Page.js +26 -7
  13. package/dx-report-viewer/components/reporting/ReportPreview/Surface/Surface.js +2 -2
  14. package/dx-report-viewer/components/reporting/Toolbar/ExportTo/ExportTo.js +1 -3
  15. package/dx-report-viewer/components/reporting/Widgets/PictureEditor/PictureEditor.js +1 -1
  16. package/dx-report-viewer/components/reporting/_templates.js +2 -0
  17. package/dx-report-viewer/hooks/dxMutationObserver.js +2 -2
  18. package/dx-report-viewer/hooks/dxPreviewPageRenderer.d.ts +4 -0
  19. package/dx-report-viewer/hooks/dxPreviewPageRenderer.js +6 -0
  20. package/package.json +9 -8
@@ -0,0 +1,6 @@
1
+ import React from 'react';
2
+ import { IAIPanelViewModel } from 'devexpress-reporting/scopes/reporting-viewer-internal';
3
+ declare const AIPanel: React.FC<{
4
+ data: IAIPanelViewModel;
5
+ }>;
6
+ export default AIPanel;
@@ -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;
@@ -0,0 +1,2 @@
1
+ export * from './AIPanel';
2
+ export { default } from './AIPanel';
@@ -0,0 +1,2 @@
1
+ export * from './AIPanel';
2
+ export { default } from './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.nativeEvent), className: `dxrp-editing-field-charactercomb dx-accessibility-editing-field-item dx-accessibility-border-accented ${data.active ? 'active' : ''} ${data.field.readOnly ? 'readOnly' : ''}` },
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) },
@@ -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("div", null,
18
- React.createElement("img", { className: "dxrd-pointer-events-none dxrd-width-100 dxrd-height-100", src: data.displayImageSrc, alt: data.currentPageAriaLabelImgAlt }),
19
- data.activeBricks.map(brick => React.createElement(Template, { key: brick.indexes, template: "dxrd-page-brick-mobile", data: brick })),
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.displayImageSrc);
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.displayImageSrc))) && (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' } },
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 && !args.isDisposing && ref.current)
7
+ if (args && ref.current)
8
8
  return initializeMutationObserver(ref.current, args, accesibilitySetting.accessibilityCompliant);
9
9
  return () => { };
10
- }, [args, accesibilitySetting, ref.current]);
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.1.7",
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
- "prop-types": "^15.8.1",
19
- "devexpress-reporting": "24.1.7"
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.1.7",
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": "~5.0.4",
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
+ }