@evergis/react 3.1.37 → 3.1.39

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.
@@ -0,0 +1,3 @@
1
+ import { FC } from 'react';
2
+ import { ContainerProps } from '../../types';
3
+ export declare const ExportPdfContainer: FC<ContainerProps>;
@@ -27,5 +27,6 @@ export declare const containerComponents: {
27
27
  readonly Camera: import('react').FC<import('../types').ContainerProps>;
28
28
  readonly AddFeature: import('react').FC<import('../types').ContainerProps>;
29
29
  readonly Divider: import('react').FC<import('../types').ContainerProps>;
30
+ readonly ExportPdf: import('react').FC<import('../types').ContainerProps>;
30
31
  readonly default: import('react').FC<import('../types').ContainerProps>;
31
32
  };
@@ -4,7 +4,8 @@ export * from './useDashboardHeader';
4
4
  export * from './useDataSources';
5
5
  export * from './useDiffPage';
6
6
  export * from './useExpandableContainers';
7
- export * from './useFeatureFilters';
7
+ export * from './useExportPdf';
8
+ export * from './useWidgetFilters';
8
9
  export * from './useGetConfigLayer';
9
10
  export * from './useGlobalContext';
10
11
  export * from './useHeaderRender';
@@ -0,0 +1,4 @@
1
+ export declare const useExportPdf: (ids: string[]) => {
2
+ loading: boolean;
3
+ onExport: () => Promise<void>;
4
+ };
@@ -1,5 +1,5 @@
1
1
  import { FilterItem, WidgetType } from '../types';
2
- export declare const useFeatureFilters: (type: WidgetType, filterName: string, items?: FilterItem[]) => {
2
+ export declare const useWidgetFilters: (type: WidgetType, filterName: string, items?: FilterItem[]) => {
3
3
  filters: import('../types').SelectedFilters;
4
4
  formatFilterColor: (name: string, color: string, defaultColor?: string) => string;
5
5
  hasAnyFilter: boolean;
@@ -238,6 +238,7 @@ export declare enum ContainerTemplate {
238
238
  Camera = "Camera",
239
239
  AddFeature = "AddFeature",
240
240
  Slideshow = "Slideshow",
241
+ ExportPdf = "ExportPdf",
241
242
  Divider = "Divider"
242
243
  }
243
244
  export declare enum HeaderTemplate {
package/dist/index.js CHANGED
@@ -16,6 +16,8 @@ var signalr = require('@microsoft/signalr');
16
16
  var findAnd = require('find-and');
17
17
  var MapboxDraw = require('@mapbox/mapbox-gl-draw');
18
18
  var turf = require('@turf/turf');
19
+ var jspdf = require('jspdf');
20
+ var html2canvas = require('html2canvas');
19
21
  var MapGL = require('react-map-gl/mapbox');
20
22
  require('@mapbox/mapbox-gl-draw/dist/mapbox-gl-draw.css');
21
23
  require('mapbox-gl/dist/mapbox-gl.css');
@@ -3377,6 +3379,7 @@ exports.ContainerTemplate = void 0;
3377
3379
  ContainerTemplate["Camera"] = "Camera";
3378
3380
  ContainerTemplate["AddFeature"] = "AddFeature";
3379
3381
  ContainerTemplate["Slideshow"] = "Slideshow";
3382
+ ContainerTemplate["ExportPdf"] = "ExportPdf";
3380
3383
  ContainerTemplate["Divider"] = "Divider";
3381
3384
  })(exports.ContainerTemplate || (exports.ContainerTemplate = {}));
3382
3385
  exports.HeaderTemplate = void 0;
@@ -5545,7 +5548,7 @@ const DataSourceInnerContainer = React.memo(({ config, elementConfig, feature, m
5545
5548
  t,
5546
5549
  valueElement?.attributeName
5547
5550
  ]);
5548
- const { hasAnyFilter, isFiltered, onFilter } = useFeatureFilters(type, filterName, data);
5551
+ const { hasAnyFilter, isFiltered, onFilter } = useWidgetFilters(type, filterName, data);
5549
5552
  const render = React.useMemo(() => getRenderElement({
5550
5553
  config,
5551
5554
  elementConfig,
@@ -6004,7 +6007,7 @@ const PagesContainer = React.memo(({ type = exports.WidgetType.Dashboard, noBord
6004
6007
  setSelectedTabId,
6005
6008
  type,
6006
6009
  ]);
6007
- return (jsxRuntime.jsxs("div", { style: { width }, children: [jsxRuntime.jsx(ExpandableTitle, { elementConfig: config, type: type, renderElement: renderElement }), jsxRuntime.jsx(Container, { isColumn: isColumn, isMain: true, noBorders: noBorders, children: jsxRuntime.jsx(ContainerChildren, { items: filteredChildren, isMain: true, renderElement: renderElement }) })] }));
6010
+ return (jsxRuntime.jsxs("div", { id: "dashboard-root", style: { width }, children: [jsxRuntime.jsx(ExpandableTitle, { elementConfig: config, type: type, renderElement: renderElement }), jsxRuntime.jsx(Container, { isColumn: isColumn, isMain: true, noBorders: noBorders, children: jsxRuntime.jsx(ContainerChildren, { items: filteredChildren, isMain: true, renderElement: renderElement }) })] }));
6008
6011
  });
6009
6012
 
6010
6013
  const TwoColumnsInnerContainer = React.memo(({ renderElement }) => {
@@ -6572,6 +6575,12 @@ const LayersContainer = React.memo(({ type, elementConfig, renderElement }) => {
6572
6575
  return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(ExpandableTitle, { elementConfig: elementConfig, type: type, renderElement: renderElement }), isVisible && (jsxRuntime.jsx(LayersContainerWrapper, { style: style, children: jsxRuntime.jsx(LayerTree, { layers: layers, onlyMainTools: true }) }))] }));
6573
6576
  });
6574
6577
 
6578
+ const ExportPdfContainer = React.memo(({ elementConfig }) => {
6579
+ const { loading, onExport } = useExportPdf(["dashboard-root"]);
6580
+ const { style } = elementConfig || {};
6581
+ return (jsxRuntime.jsx(Container, { style: style, children: jsxRuntime.jsx(uilibGl.IconButton, { kind: "tools_print", primary: true, disabled: loading, onClick: onExport, children: "\u042D\u043A\u0441\u043F\u043E\u0440\u0442 \u0432 PDF" }) }));
6582
+ });
6583
+
6575
6584
  const containerComponents = {
6576
6585
  [exports.ContainerTemplate.DefaultAttributes]: DefaultAttributesContainer,
6577
6586
  [exports.ContainerTemplate.Pages]: PagesContainer,
@@ -6593,6 +6602,7 @@ const containerComponents = {
6593
6602
  [exports.ContainerTemplate.Camera]: CameraContainer,
6594
6603
  [exports.ContainerTemplate.AddFeature]: AddFeatureContainer,
6595
6604
  [exports.ContainerTemplate.Divider]: DividerContainer,
6605
+ [exports.ContainerTemplate.ExportPdf]: ExportPdfContainer,
6596
6606
  default: ContainersGroupContainer,
6597
6607
  };
6598
6608
 
@@ -8189,7 +8199,7 @@ const useBarChartFilter = ({ type, filter, elementConfig }) => {
8189
8199
  const width = React.useMemo(() => configWidth || amount * barFullWidth, [amount, barFullWidth, configWidth]);
8190
8200
  const data = React.useMemo(() => getDataFromFilterItems(filterItems), [filterItems]);
8191
8201
  const loading = isLoading && !amount;
8192
- const { formatFilterColor, onFilter } = useFeatureFilters(type, filterName, filterItems);
8202
+ const { formatFilterColor, onFilter } = useWidgetFilters(type, filterName, filterItems);
8193
8203
  const colors = React.useMemo(() => getColorsFromFilterItems(filterItems, defaultColor, formatFilterColor), [defaultColor, filterItems, formatFilterColor]);
8194
8204
  const selectedRange = React.useMemo(() => getIndexRange(selectedPixels, amount, barFullWidth), [amount, barFullWidth, selectedPixels]);
8195
8205
  const customXAxis = React.useCallback(xAxis => {
@@ -9086,6 +9096,128 @@ const useExpandableContainers = () => {
9086
9096
  return [expandedContainers, expandContainer];
9087
9097
  };
9088
9098
 
9099
+ const useExportPdf = (ids) => {
9100
+ const [loading, setLoading] = React.useState(false);
9101
+ const onExport = React.useCallback(async () => {
9102
+ if (ids.length === 0) {
9103
+ return;
9104
+ }
9105
+ setLoading(true);
9106
+ const pdf = new jspdf.jsPDF("landscape", "pt", "a4", false);
9107
+ for (let i = 0; i < ids.length; i++) {
9108
+ const pageItemContents = document.querySelector(`#${ids[i]}`);
9109
+ const data = await html2canvas(pageItemContents, {
9110
+ scale: 2,
9111
+ windowWidth: 800,
9112
+ onclone: (clonedDocument, clonedElement) => {
9113
+ clonedDocument.body.style.width = "1920px";
9114
+ clonedDocument.body.style.height = "1080px";
9115
+ /* if (!isCoverPage) {
9116
+ clonedDocument.body.style.background = "#f4f7f9";
9117
+ }
9118
+
9119
+ const pageContainers = clonedElement.querySelectorAll(".export-page-container");
9120
+ const inputWrappers = clonedElement.querySelectorAll(".page-title-input");
9121
+ const textareas = clonedElement.querySelectorAll(".report-page-item-textarea");
9122
+ const datePickerWrappers = clonedElement.querySelectorAll(".report-page-item-datepicker");
9123
+ const pageBlockContainers = clonedElement.querySelectorAll(".report-page-block-container");
9124
+ const pageItemTitles = clonedDocument.querySelectorAll(".report-page-item-title");
9125
+
9126
+ pageContainers.forEach((element) => {
9127
+ (element as HTMLDivElement).style.background = isCoverPage ? "transparent" : "#f4f7f9";
9128
+ (element as HTMLDivElement).style.border = "none";
9129
+ (element as HTMLDivElement).style.padding = isCoverPage ? "0px" : "3rem 3rem 30rem";
9130
+ (element as HTMLDivElement).style.margin = isCoverPage ? "0px" : "initial";
9131
+ });
9132
+
9133
+ inputWrappers.forEach((inputWrapper) => {
9134
+ const input = inputWrapper.querySelector("input");
9135
+ const div = document.createElement("div");
9136
+
9137
+ div.innerText = (input as HTMLInputElement).value;
9138
+
9139
+ inputWrapper.replaceWith(div);
9140
+ });
9141
+
9142
+ textareas.forEach((textarea) => {
9143
+ const div = document.createElement("div");
9144
+
9145
+ if ((textarea as HTMLTextAreaElement).classList.contains("report-page-item-comment")) {
9146
+ if (isCoverPage) {
9147
+ (div as HTMLDivElement).style.display = "none";
9148
+ } else {
9149
+ (div as HTMLDivElement).style.fontSize = "24px";
9150
+ (div as HTMLDivElement).style.fontWeight = "400";
9151
+ (div as HTMLDivElement).style.opacity = "0.54";
9152
+ (div as HTMLDivElement).style.marginTop = "2rem";
9153
+ }
9154
+ }
9155
+
9156
+ if (isCoverPage) {
9157
+ if ((textarea as HTMLTextAreaElement).classList.contains("report-page-front-cover-title")) {
9158
+ (div as HTMLDivElement).style.fontSize = "32px";
9159
+ (div as HTMLDivElement).style.fontWeight = "300";
9160
+ (div as HTMLDivElement).style.lineHeight = "normal";
9161
+ }
9162
+
9163
+ if ((textarea as HTMLTextAreaElement).classList.contains("report-page-front-cover-comment")) {
9164
+ (div as HTMLDivElement).style.fontSize = "16px";
9165
+ (div as HTMLDivElement).style.fontWeight = "400";
9166
+ (div as HTMLDivElement).style.opacity = "0.54";
9167
+ (div as HTMLDivElement).style.lineHeight = "normal";
9168
+ }
9169
+ }
9170
+
9171
+ div.innerText = (textarea as HTMLTextAreaElement).value;
9172
+
9173
+ textarea.replaceWith(div);
9174
+ });
9175
+
9176
+ datePickerWrappers.forEach((inputWrapper) => {
9177
+ const input = inputWrapper.querySelector("input");
9178
+ const div = document.createElement("div");
9179
+
9180
+ if (isCoverPage) {
9181
+ (div as HTMLDivElement).style.fontSize = "12px";
9182
+ (div as HTMLDivElement).style.fontWeight = "400";
9183
+ (div as HTMLDivElement).style.opacity = "0.54";
9184
+ }
9185
+
9186
+ div.innerText = (input as HTMLInputElement).value;
9187
+
9188
+ inputWrapper.replaceWith(div);
9189
+ });
9190
+
9191
+ pageBlockContainers.forEach((element) => {
9192
+ (element as HTMLDivElement).style.background = "#ffffff";
9193
+ });
9194
+
9195
+ pageItemTitles.forEach((item) => {
9196
+ if (isCoverPage) {
9197
+ (item as HTMLDivElement).style.display = "none";
9198
+ } else {
9199
+ (item as HTMLDivElement).style.fontSize = "40px";
9200
+ (item as HTMLDivElement).style.fontWeight = "300";
9201
+ (item as HTMLDivElement).style.marginBottom = "2rem";
9202
+ }
9203
+ });*/
9204
+ },
9205
+ });
9206
+ const img = data.toDataURL("image/png");
9207
+ const imgProperties = pdf.getImageProperties(img);
9208
+ const pdfWidth = pdf.internal.pageSize.getWidth();
9209
+ const pdfHeight = (imgProperties.height * pdfWidth) / imgProperties.width;
9210
+ if (i > 0) {
9211
+ pdf.addPage("a4", "landscape");
9212
+ }
9213
+ pdf.addImage(img, "PNG", 0, 0, pdfWidth, pdfHeight);
9214
+ }
9215
+ pdf.save(`report_${dateFns.format(new Date(), "yyyy-MM-dd_HH:mm:ss")}.pdf`);
9216
+ setLoading(false);
9217
+ }, [ids]);
9218
+ return { loading, onExport };
9219
+ };
9220
+
9089
9221
  const getMinMaxFromStringValue = (items, value, current, type) => {
9090
9222
  const valueIndex = items.findIndex(item => item.value === (type === "min" ? value.min : value.max));
9091
9223
  const currentIndex = items.findIndex(item => item.value === (type === "min" ? value.min : value.max));
@@ -9097,7 +9229,7 @@ const getMinMaxFromStringValue = (items, value, current, type) => {
9097
9229
  ? current.max
9098
9230
  : value.max;
9099
9231
  };
9100
- const useFeatureFilters = (type, filterName, items) => {
9232
+ const useWidgetFilters = (type, filterName, items) => {
9101
9233
  const theme = styled.useTheme();
9102
9234
  const { filters, changeFilters } = useWidgetContext(type);
9103
9235
  const { currentPage } = useWidgetPage(type);
@@ -9264,7 +9396,7 @@ const useUpdateDataSource = ({ dataSource, config, filters, attributes, layerPar
9264
9396
  const StackBar = ({ data, filterName, type, alias, options, renderElement, renderTooltip }) => {
9265
9397
  const { height, showTotal, cornerRadius, groupTooltip } = options || {};
9266
9398
  const { t } = useGlobalContext();
9267
- const { hasAnyFilter, isFiltered, onFilter } = useFeatureFilters(type, filterName, data?.[0]?.items);
9399
+ const { hasAnyFilter, isFiltered, onFilter } = useWidgetFilters(type, filterName, data?.[0]?.items);
9268
9400
  const { items, layerInfo, attributeName } = data?.[0] || {};
9269
9401
  const attribute = layerInfo?.layerDefinition.attributes[attributeName];
9270
9402
  const units = attribute?.stringFormat?.unitsLabel;
@@ -9320,7 +9452,7 @@ const Chart = React.memo(({ config, element, elementConfig, type, renderElement
9320
9452
  markers: configMarkers,
9321
9453
  showMarkers,
9322
9454
  });
9323
- const { formatFilterColor, onFilter } = useFeatureFilters(type, filterName, data?.[0]?.items);
9455
+ const { formatFilterColor, onFilter } = useWidgetFilters(type, filterName, data?.[0]?.items);
9324
9456
  const formattedAttributes = React.useMemo(() => getFormattedAttributes(t, (data[0]?.items || []), attributes, element), [attributes, data, element, t]);
9325
9457
  const totalSum = React.useMemo(() => isRelated
9326
9458
  ? getTotalFromRelatedFeatures((data[0]?.items || []))
@@ -9461,7 +9593,7 @@ const ChartLegend = ({ data, chartElement, type, twoColumns, loading }) => {
9461
9593
  const { t } = useGlobalContext();
9462
9594
  const { sliceItems, showMore, onShowMore } = useShownOtherItems(chartElement?.options);
9463
9595
  const axes = React.useMemo(() => getChartAxes(chartElement), [chartElement]);
9464
- const { isFiltered, hasAnyFilter, onFilter } = useFeatureFilters(type, axes?.[0]?.filterName);
9596
+ const { isFiltered, hasAnyFilter, onFilter } = useWidgetFilters(type, axes?.[0]?.filterName);
9465
9597
  const { fontColor, shownItems, hideEmpty } = chartElement?.options || {};
9466
9598
  const showMoreBtn = !!shownItems && data.length > shownItems;
9467
9599
  if (!loading && !data?.length && !!hideEmpty)
@@ -10209,7 +10341,7 @@ exports.useDataSources = useDataSources;
10209
10341
  exports.useDebouncedCallback = useDebouncedCallback;
10210
10342
  exports.useDiffPage = useDiffPage;
10211
10343
  exports.useExpandableContainers = useExpandableContainers;
10212
- exports.useFeatureFilters = useFeatureFilters;
10344
+ exports.useExportPdf = useExportPdf;
10213
10345
  exports.useGetConfigLayer = useGetConfigLayer;
10214
10346
  exports.useGlobalContext = useGlobalContext;
10215
10347
  exports.useHeaderRender = useHeaderRender;
@@ -10226,6 +10358,7 @@ exports.useToggle = useToggle;
10226
10358
  exports.useUpdateDataSource = useUpdateDataSource;
10227
10359
  exports.useWidgetConfig = useWidgetConfig;
10228
10360
  exports.useWidgetContext = useWidgetContext;
10361
+ exports.useWidgetFilters = useWidgetFilters;
10229
10362
  exports.useWidgetPage = useWidgetPage;
10230
10363
  exports.useWindowResize = useWindowResize;
10231
10364
  exports.useZoomToFeatures = useZoomToFeatures;