@evergis/react 3.1.14 → 3.1.16

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 (43) hide show
  1. package/dist/components/Dashboard/components/Chart/styled.d.ts +16 -0
  2. package/dist/components/Dashboard/components/DashboardHeader/index.d.ts +3 -0
  3. package/dist/components/Dashboard/components/FeatureCardButtons/index.d.ts +2 -0
  4. package/dist/components/Dashboard/components/FeatureCardHeader/index.d.ts +2 -0
  5. package/dist/components/Dashboard/components/FeatureCardTitle/index.d.ts +5 -0
  6. package/dist/components/Dashboard/components/Pagination/index.d.ts +1 -1
  7. package/dist/components/Dashboard/components/index.d.ts +4 -0
  8. package/dist/components/Dashboard/containers/RoundedBackgroundContainer/styled.d.ts +2 -0
  9. package/dist/components/Dashboard/headers/DashboardDefaultHeader/index.d.ts +3 -0
  10. package/dist/components/Dashboard/headers/DashboardDefaultHeader/styled.d.ts +8 -0
  11. package/dist/components/Dashboard/headers/FeatureCardDefaultHeader/components/HeaderTitle.d.ts +4 -0
  12. package/dist/components/Dashboard/headers/FeatureCardDefaultHeader/index.d.ts +5 -0
  13. package/dist/components/Dashboard/headers/FeatureCardDefaultHeader/styled.d.ts +12 -0
  14. package/dist/components/Dashboard/headers/FeatureCardGradientHeader/index.d.ts +3 -0
  15. package/dist/components/Dashboard/headers/FeatureCardGradientHeader/styled.d.ts +4 -0
  16. package/dist/components/Dashboard/headers/FeatureCardIconHeader/index.d.ts +3 -0
  17. package/dist/components/Dashboard/headers/FeatureCardIconHeader/styled.d.ts +6 -0
  18. package/dist/components/Dashboard/headers/FeatureCardSlideshowHeader/index.d.ts +3 -0
  19. package/dist/components/Dashboard/headers/FeatureCardSlideshowHeader/styled.d.ts +8 -0
  20. package/dist/components/Dashboard/headers/index.d.ts +7 -0
  21. package/dist/components/Dashboard/hooks/index.d.ts +1 -0
  22. package/dist/components/Dashboard/hooks/useDashboardHeader.d.ts +2 -2
  23. package/dist/components/Dashboard/hooks/useGlobalContext.d.ts +0 -1
  24. package/dist/components/Dashboard/hooks/useHeaderRender.d.ts +2 -0
  25. package/dist/components/Dashboard/hooks/useWidgetContext.d.ts +8 -0
  26. package/dist/components/Dashboard/index.d.ts +1 -0
  27. package/dist/components/Dashboard/styled.d.ts +1 -0
  28. package/dist/components/Dashboard/types.d.ts +2 -0
  29. package/dist/components/Dashboard/utils/getDashboardHeader.d.ts +2 -0
  30. package/dist/components/Dashboard/utils/getFeatureCardHeader.d.ts +2 -0
  31. package/dist/components/Dashboard/utils/index.d.ts +2 -0
  32. package/dist/components/LayerIcon/index.d.ts +5 -0
  33. package/dist/components/LayerIcon/styled.d.ts +2 -0
  34. package/dist/components/LayerTree/types.d.ts +0 -2
  35. package/dist/components/index.d.ts +1 -0
  36. package/dist/contexts/DashboardContext/types.d.ts +8 -2
  37. package/dist/contexts/FeatureCardContext/types.d.ts +3 -1
  38. package/dist/contexts/GlobalContext/types.d.ts +1 -3
  39. package/dist/index.js +1460 -701
  40. package/dist/index.js.map +1 -1
  41. package/dist/react.esm.js +1185 -451
  42. package/dist/react.esm.js.map +1 -1
  43. package/package.json +3 -3
package/dist/react.esm.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { jsx, jsxs, Fragment as Fragment$1 } from 'react/jsx-runtime';
2
- import { IconButton, Flex, transition, Chip, Icon, Description, FlexSpan, IconToggle, Popup, Menu, DraggableTree, shadows, Divider, LegendToggler, Tooltip, DropdownField, MultiSelectContainer, IconButtonButton, FlatButton, DraggableTreeContainer, LinearProgress, Preview, Blank, Popover, NumberRangeSlider, useAsyncAutocomplete, AutoComplete, Dropdown, Checkbox, CircularProgress, ThemeProvider, RangeNumberInput, dateFormat } from '@evergis/uilib-gl';
2
+ import { IconButton, Flex, transition, Chip, Icon, Description, FlexSpan, IconToggle, Popup, Menu, DraggableTree, shadows, Divider, LegendToggler, Tooltip as Tooltip$1, DropdownField, MultiSelectContainer, IconButtonButton, FlatButton, DraggableTreeContainer, LinearProgress, H2, ThemeProvider, defaultTheme, Preview, Blank, Popover, darkTheme, NumberRangeSlider, useAsyncAutocomplete, AutoComplete, Dropdown, Checkbox, CircularProgress, RangeNumberInput, dateFormat } from '@evergis/uilib-gl';
3
3
  import { createContext, memo, useRef, useState, useEffect, useCallback, useContext, useMemo, Fragment } from 'react';
4
- import styled, { css, useTheme } from 'styled-components';
4
+ import styled, { createGlobalStyle, css, useTheme } from 'styled-components';
5
5
  import { lineChartClassNames, barChartClassNames, BarChart as BarChart$1, LineChart, PieChart } from '@evergis/charts';
6
6
  import { AttributeType, GeometryType } from '@evergis/api';
7
7
  import Gradient from 'javascript-color-gradient';
@@ -35,14 +35,18 @@ const ChartTooltipTable = styled.table `
35
35
  }
36
36
  `;
37
37
  const ChartTooltip = styled(Flex) `
38
- flex-direction: row;
39
- align-items: center;
40
38
  flex-wrap: nowrap;
39
+ background: rgb(48, 69, 79);
40
+ border-radius: 0.25rem;
41
+ color: white;
41
42
 
42
43
  :not(:last-child) {
43
44
  margin-bottom: 0.25rem;
44
45
  }
45
46
  `;
47
+ const ChartTooltipLabel = styled.div `
48
+ margin-right: 0.25rem;
49
+ `;
46
50
  const ChartTooltipColor = styled.div `
47
51
  width: 0.625rem;
48
52
  height: 0.625rem;
@@ -88,6 +92,107 @@ const ChartWrapperContainer = styled.div `
88
92
  position: relative;
89
93
  width: 100%;
90
94
  `;
95
+ const Tooltip = styled.div `
96
+ position: relative;
97
+ border-radius: 0.25rem;
98
+ background-color: rgba(28, 33, 48);
99
+ padding: 0.5rem;
100
+ box-shadow: 0 0.125rem 0.25rem 0 rgba(0, 0, 0, 0.15);
101
+ font-size: 0.75rem;
102
+ transform: ${({ transform }) => transform};
103
+ color: white;
104
+
105
+ :before {
106
+ position: absolute;
107
+ display: block;
108
+ content: "";
109
+ width: 0;
110
+ height: 0;
111
+ }
112
+ `;
113
+ const LineChartTooltipStyles = createGlobalStyle `
114
+ .dashboardLineChartTooltip.${lineChartClassNames.lineChartMouseLabel} {
115
+ .${lineChartClassNames.lineChartLabelFlex} {
116
+ justify-content: center;
117
+ align-items: flex-end;
118
+
119
+ ${Tooltip} {
120
+ margin: 0 0 12px 0;
121
+
122
+ :before {
123
+ top: auto;
124
+ bottom: 0;
125
+ left: 50%;
126
+ transform: translate(-50%, 100%);
127
+ border-left: 4px solid transparent;
128
+ border-right: 4px solid transparent;
129
+ border-top: 4px solid rgba(28, 33, 48, 0.9);
130
+ }
131
+ }
132
+ }
133
+ }
134
+
135
+ .${lineChartClassNames.lineChartYScaleGlobal}, .${lineChartClassNames.lineChartXScaleGlobal} {
136
+ .domain {
137
+ visibility: hidden;
138
+ }
139
+
140
+ .tick {
141
+ text {
142
+ fill: ${({ theme: { palette } }) => palette.textDisabled};
143
+ }
144
+
145
+ line {
146
+ visibility: hidden;
147
+ }
148
+ }
149
+ }
150
+
151
+ .${lineChartClassNames.lineChartXScaleGlobal} {
152
+ .tick {
153
+ :first-of-type {
154
+ text {
155
+ text-anchor: start;
156
+ }
157
+ }
158
+
159
+ :last-of-type {
160
+ text {
161
+ text-anchor: end;
162
+ }
163
+ }
164
+ }
165
+ }
166
+
167
+ .${lineChartClassNames.lineChartLine} {
168
+ stroke-width: 2px;
169
+ }
170
+
171
+ .${lineChartClassNames.lineChartLabel} {
172
+ color: ${({ theme: { palette } }) => palette.textPrimary};
173
+ }
174
+
175
+ .${lineChartClassNames.lineChartMouseCircle} {
176
+ stroke: #ffffff;
177
+ stroke-width: 2px;
178
+ }
179
+
180
+ .${lineChartClassNames.lineChartGridLineX} {
181
+ stroke: ${({ theme: { palette } }) => palette.element};
182
+ }
183
+
184
+ text {
185
+ fill: ${({ theme: { palette } }) => palette.textDisabled};
186
+ }
187
+ `;
188
+ const BarChartStyles = createGlobalStyle `
189
+ .dashboardBarChart {
190
+ .domain,
191
+ line {
192
+ display: none;
193
+ }
194
+ }
195
+ `;
91
196
 
92
197
  function range(start, stop, step) {
93
198
  start = +start, stop = +stop, step = (n = arguments.length) < 2 ? (stop = start, start = 0, 1) : n < 3 ? 1 : +step;
@@ -3800,8 +3905,8 @@ const ServerNotificationsProvider = ({ url, initialized, children }) => {
3800
3905
  };
3801
3906
 
3802
3907
  const useWidgetContext = (type = WidgetType.Dashboard) => {
3803
- const { projectInfo, updateProject, layerInfos, geometryFilter, dashboardLayers, setDashboardLayer, pageIndex: projectPageIndex, selectedTabId: projectSelectedTabId, setSelectedTabId: setProjectSelectedTabId, dataSources: projectDataSources, loading: projectLoading, filters: projectFilters, changeFilters: projectChangeFilters, expandContainer: projectExpandContainer, expandedContainers: projectExpandedContainers, nextPage: projectNextPage, prevPage: projectPrevPage, changePage: projectChangePage, } = useContext(DashboardContext) || {};
3804
- const { layerInfo, attributes, pageIndex: featurePageIndex, selectedTabId: featureSelectedTabId, setSelectedTabId: setFeatureSelectedTabId, dataSources: featureDataSources, loading: featureLoading, filters: featureFilters, changeFilters: featureChangeFilters, expandContainer: featureExpandContainer, expandedContainers: featureExpandedContainers, nextPage: featureNextPage, prevPage: featurePrevPage, changePage: featureChangePage, } = useContext(FeatureCardContext) || {};
3908
+ const { projectInfo, updateProject, layerInfos, geometryFilter, dashboardLayers, setDashboardLayer, components: dashboardComponents, pageIndex: projectPageIndex, selectedTabId: projectSelectedTabId, setSelectedTabId: setProjectSelectedTabId, dataSources: projectDataSources, loading: projectLoading, filters: projectFilters, changeFilters: projectChangeFilters, expandContainer: projectExpandContainer, expandedContainers: projectExpandedContainers, nextPage: projectNextPage, prevPage: projectPrevPage, changePage: projectChangePage, } = useContext(DashboardContext) || {};
3909
+ const { layerInfo, attributes, feature, closeFeatureCard, pageIndex: featurePageIndex, selectedTabId: featureSelectedTabId, setSelectedTabId: setFeatureSelectedTabId, dataSources: featureDataSources, loading: featureLoading, filters: featureFilters, changeFilters: featureChangeFilters, expandContainer: featureExpandContainer, expandedContainers: featureExpandedContainers, nextPage: featureNextPage, prevPage: featurePrevPage, changePage: featureChangePage, } = useContext(FeatureCardContext) || {};
3805
3910
  return {
3806
3911
  projectInfo,
3807
3912
  layerInfos,
@@ -3811,6 +3916,9 @@ const useWidgetContext = (type = WidgetType.Dashboard) => {
3811
3916
  geometryFilter,
3812
3917
  layerInfo,
3813
3918
  attributes,
3919
+ feature,
3920
+ closeFeatureCard,
3921
+ components: dashboardComponents,
3814
3922
  isLoading: type === WidgetType.Dashboard ? projectLoading : featureLoading,
3815
3923
  pageIndex: type === WidgetType.Dashboard ? projectPageIndex : featurePageIndex,
3816
3924
  filters: type === WidgetType.Dashboard ? projectFilters : featureFilters,
@@ -3827,15 +3935,14 @@ const useWidgetContext = (type = WidgetType.Dashboard) => {
3827
3935
  };
3828
3936
 
3829
3937
  const useGlobalContext = () => {
3830
- const { t, language, themeName, api, ewktGeometry, LayerItemComponent } = useContext(GlobalContext) || {};
3938
+ const { t, language, themeName, api, ewktGeometry } = useContext(GlobalContext) || {};
3831
3939
  return useMemo(() => ({
3832
3940
  t,
3833
3941
  language,
3834
3942
  themeName,
3835
3943
  api,
3836
3944
  ewktGeometry,
3837
- LayerItemComponent,
3838
- }), [language, t, api, ewktGeometry, themeName, LayerItemComponent]);
3945
+ }), [language, t, api, ewktGeometry, themeName]);
3839
3946
  };
3840
3947
 
3841
3948
  const HEIGHT_OFFSET = 20;
@@ -4942,10 +5049,10 @@ const treeNodesToProjectItems = (currentProjectItems, treeNodes) => {
4942
5049
  return combineProjectItems(treeNodes);
4943
5050
  };
4944
5051
 
4945
- const LayerTree = ({ layers, LayerItemComponent, onlyMainTools }) => {
4946
- const { projectInfo, updateProject } = useWidgetContext();
5052
+ const LayerTree = ({ layers, onlyMainTools }) => {
5053
+ const { projectInfo, updateProject, components: { LayerItem } } = useWidgetContext();
4947
5054
  const { pageIndex } = useWidgetPage();
4948
- const nodes = useMemo(() => layers?.map(layer => createTreeNode(layer, LayerItemComponent, onlyMainTools)), [LayerItemComponent, layers, onlyMainTools]);
5055
+ const nodes = useMemo(() => layers?.map(layer => createTreeNode(layer, LayerItem, onlyMainTools)), [LayerItem, layers, onlyMainTools]);
4949
5056
  const onUpdate = useCallback((updatedNodes) => {
4950
5057
  const newProjectInfo = JSON.parse(JSON.stringify(projectInfo));
4951
5058
  const page = getPagesFromProjectInfo(newProjectInfo)?.[pageIndex - 1];
@@ -5227,6 +5334,18 @@ const AttributeLabel = styled(Description) `
5227
5334
  margin-bottom: ${({ forCheckbox }) => (forCheckbox ? "0.75rem" : "0.25rem")} !important;
5228
5335
  padding-left: ${({ isEdit }) => (isEdit ? "0.5rem" : "0")};
5229
5336
  `;
5337
+ const FeatureControls = styled(Flex) `
5338
+ align-items: center;
5339
+ gap: 1rem;
5340
+ flex-wrap: nowrap;
5341
+ position: relative;
5342
+ flex-shrink: 0;
5343
+
5344
+ button {
5345
+ padding: 0;
5346
+ width: auto;
5347
+ }
5348
+ `;
5230
5349
 
5231
5350
  const getAttributeByName = (attributeName, attributes) => {
5232
5351
  return Array.isArray(attributeName)
@@ -5604,7 +5723,7 @@ const ProgressContainer = memo(({ type, elementConfig, feature, maxValue, index,
5604
5723
  const color = useMemo(() => colorAttribute
5605
5724
  ? attributes?.find(({ name }) => name === colorAttribute)?.value
5606
5725
  : colors?.[index] || bgColor, [attributes, bgColor, colorAttribute, colors, index]);
5607
- return (jsx(Tooltip, { content: renderTooltip, placement: "top", arrow: true, children: ref => (jsxs(ProgressContainerWrapper, { ref: ref, style: innerTemplateStyle || style, children: [renderIcon && jsx(ProgressIcon, { children: renderIcon }), jsxs(ProgressContent, { children: [!hideTitle && (jsxs(ProgressAlias, { children: [jsx("div", { children: renderAlias }), jsxs(ProgressValue, { children: [renderValue, unitsElement && jsx(ProgressUnits, { children: renderElement({ id: "units" }) })] })] })), jsxs(ProgressBarContainer, { innerValue: innerValue, children: [jsx(ProgressBarWrapper, { children: jsx(ProgressBar, { "$width": width, "$color": color }) }), !!(hideTitle || innerValue) && jsx(ProgressInnerValue, { children: renderValue })] })] })] })) }));
5726
+ return (jsx(Tooltip$1, { content: renderTooltip, placement: "top", arrow: true, children: ref => (jsxs(ProgressContainerWrapper, { ref: ref, style: innerTemplateStyle || style, children: [renderIcon && jsx(ProgressIcon, { children: renderIcon }), jsxs(ProgressContent, { children: [!hideTitle && (jsxs(ProgressAlias, { children: [jsx("div", { children: renderAlias }), jsxs(ProgressValue, { children: [renderValue, unitsElement && jsx(ProgressUnits, { children: renderElement({ id: "units" }) })] })] })), jsxs(ProgressBarContainer, { innerValue: innerValue, children: [jsx(ProgressBarWrapper, { children: jsx(ProgressBar, { "$width": width, "$color": color }) }), !!(hideTitle || innerValue) && jsx(ProgressInnerValue, { children: renderValue })] })] })] })) }));
5608
5727
  });
5609
5728
 
5610
5729
  const RANGE_MIN_VALUE = 0;
@@ -5700,7 +5819,6 @@ const AnyChartWrapper = styled.div `
5700
5819
  `;
5701
5820
  const BarChartWrapper = styled(AnyChartWrapper) `
5702
5821
  width: 100%;
5703
- max-width: ${MAX_CHART_WIDTH}px;
5704
5822
  margin: 0 auto ${BAR_CHART_FOOTER_MARGIN}px;
5705
5823
 
5706
5824
  :hover {
@@ -5830,7 +5948,7 @@ const PagesContainer = memo(({ type }) => {
5830
5948
  const { pageIndex, currentPage } = useWidgetPage(type);
5831
5949
  const { selectedTabId, setSelectedTabId, expandedContainers, attributes } = useWidgetContext(type);
5832
5950
  const { options } = config || {};
5833
- const { column } = options || {};
5951
+ const { column, width } = options || {};
5834
5952
  const isColumn = column === undefined || column;
5835
5953
  const filteredChildren = useMemo(() => !selectedTabId
5836
5954
  ? currentPage.children
@@ -5855,14 +5973,14 @@ const PagesContainer = memo(({ type }) => {
5855
5973
  setSelectedTabId,
5856
5974
  type,
5857
5975
  ]);
5858
- return (jsxs(Fragment$1, { children: [jsx(ExpandableTitle, { elementConfig: config, type: type, renderElement: renderElement }), jsx(Container, { isColumn: isColumn, isMain: true, children: jsx(ContainerChildren, { items: filteredChildren, isMain: true, renderElement: renderElement }) })] }));
5976
+ return (jsxs("div", { style: { width }, children: [jsx(ExpandableTitle, { elementConfig: config, type: type, renderElement: renderElement }), jsx(Container, { isColumn: isColumn, isMain: true, children: jsx(ContainerChildren, { items: filteredChildren, isMain: true, renderElement: renderElement }) })] }));
5859
5977
  });
5860
5978
 
5861
5979
  const TwoColumnsInnerContainer = memo(({ renderElement }) => {
5862
5980
  return (jsxs(Fragment$1, { children: [jsxs(TwoColumnContainerWrapper, { children: [jsxs(Container, { children: [jsx(ContainerAlias, { children: renderElement({ id: "firstAlias" }) }), jsx(ContainerValue, { big: true, children: renderElement({ id: "firstValue" }) })] }), jsxs(Container, { children: [jsx(ContainerAlias, { children: renderElement({ id: "secondAlias" }) }), jsx(ContainerValue, { big: true, children: renderElement({ id: "secondValue" }) })] })] }), renderElement({ id: "thirdContainer" })] }));
5863
5981
  });
5864
5982
 
5865
- const ImageContainerBg = styled.div `
5983
+ const ImageContainerBg$1 = styled.div `
5866
5984
  position: absolute;
5867
5985
  top: 0;
5868
5986
  bottom: 0;
@@ -5924,7 +6042,7 @@ const ImageContainerWrapper = styled(Flex) `
5924
6042
 
5925
6043
  const ImageContainer = memo(({ elementConfig, renderElement }) => {
5926
6044
  const { style } = elementConfig || {};
5927
- return (jsxs(ImageContainerWrapper, { style: style, children: [jsx(ImageContainerTitle, { children: renderElement({ id: "alias" }) }), jsx(ImageContainerText, { children: renderElement({ id: "text" }) }), renderElement({ id: "button" }), jsx(ImageContainerBg, { children: renderElement({ id: "image" }) })] }));
6045
+ return (jsxs(ImageContainerWrapper, { style: style, children: [jsx(ImageContainerTitle, { children: renderElement({ id: "alias" }) }), jsx(ImageContainerText, { children: renderElement({ id: "text" }) }), renderElement({ id: "button" }), jsx(ImageContainerBg$1, { children: renderElement({ id: "image" }) })] }));
5928
6046
  });
5929
6047
 
5930
6048
  const IconContainerWrapper = styled(Flex) `
@@ -6254,6 +6372,7 @@ const TabsContainer = memo(({ elementConfig, type }) => {
6254
6372
  return (jsx(SwiperContainer, { style: style, children: jsx(Swiper, { spaceBetween: 0, slidesPerView: shownItems || 2, children: tabs.map(({ id, value, options: tabOptions }) => (jsxs(SwiperSlide, { children: [jsxs(TabContainer, { href: `#${id}`, active: selectedTabId === id, column: column, bgColor: bgColor, noBg: noBg, radius: radius, onlyIcon: onlyIcon, hasIcon: !!tabOptions?.icon, onClick: () => onClick(id), children: [renderIcon(tabOptions?.icon, selectedTabId === id), !onlyIcon && (jsx(TabValue, { children: jsx(TextTrim, { maxLength: maxLength, children: value }) }))] }), jsx(TabAnchor, { id: id })] }, id))) }) }));
6255
6373
  });
6256
6374
 
6375
+ const ContainerIconValue = styled(Flex) ``;
6257
6376
  const RoundedBackgroundContainerWrapper = styled(Flex) `
6258
6377
  position: relative;
6259
6378
  flex-direction: ${({ $bigIcon }) => ($bigIcon ? "row" : "column")};
@@ -6271,13 +6390,10 @@ const RoundedBackgroundContainerWrapper = styled(Flex) `
6271
6390
  css `
6272
6391
  align-items: center;
6273
6392
 
6274
- * {
6393
+ > * {
6275
6394
  display: flex;
6276
6395
  justify-content: center;
6277
6396
  text-align: center;
6278
- }
6279
-
6280
- > * {
6281
6397
  width: 100%;
6282
6398
  }
6283
6399
  `};
@@ -6310,8 +6426,32 @@ const RoundedBackgroundContainerWrapper = styled(Flex) `
6310
6426
  }
6311
6427
  `};
6312
6428
 
6429
+ ${ContainerIconValue} {
6430
+ align-items: center;
6431
+ flex-direction: column;
6432
+
6433
+ ${({ $big }) => $big &&
6434
+ css `
6435
+ flex-direction: row;
6436
+ margin-bottom: 0.5rem;
6437
+
6438
+ > * {
6439
+ text-align: left;
6440
+ }
6441
+
6442
+ span[kind] {
6443
+ margin-right: 0.5rem;
6444
+ }
6445
+
6446
+ ${ContainerValue} {
6447
+ width: auto;
6448
+ }
6449
+ `};
6450
+ }
6451
+
6313
6452
  ${ContainerValue} {
6314
6453
  flex-direction: ${({ $inlineUnits }) => ($inlineUnits ? "row" : "column")};
6454
+ justify-content: ${({ $big }) => ($big ? "flex-start" : "flex-end")};
6315
6455
  align-items: ${({ $inlineUnits }) => ($inlineUnits ? "center" : "flex-start")};
6316
6456
  line-height: 1;
6317
6457
  }
@@ -6335,15 +6475,17 @@ const RoundedBackgroundContainer = memo(({ type, elementConfig, feature, renderE
6335
6475
  feature
6336
6476
  });
6337
6477
  const { options, style, children } = elementConfig || {};
6338
- const { maxLength, center, fontColor, innerTemplateStyle, inlineUnits, bigIcon, hideEmpty, colorAttribute } = options || {};
6478
+ const { maxLength, center, fontColor, innerTemplateStyle, inlineUnits, big, bigIcon, hideEmpty, colorAttribute } = options || {};
6339
6479
  const aliasElement = children?.find(({ id }) => id === "alias");
6340
6480
  const unitsElement = children?.find(({ id }) => id === "units");
6341
6481
  const valueElement = children?.find(({ id }) => id === "value");
6342
6482
  const value = renderElement({ id: "value" });
6343
6483
  const color = useMemo(() => attributes?.find(({ name }) => name === colorAttribute)?.value || fontColor, [attributes, colorAttribute, fontColor]);
6484
+ const renderAlias = useMemo(() => (jsx(ContainerAlias, { style: aliasElement?.style, children: jsx(TextTrim, { maxLength: maxLength || ALIAS_DEFAULT_MAX_LENGTH, children: renderElement({ id: "alias", wrap: false }) }) })), [aliasElement?.style, maxLength, renderElement]);
6485
+ const renderValue = useMemo(() => (jsxs(ContainerValue, { style: valueElement?.style, big: true, children: [value, !!unitsElement && (jsx(ContainerUnits, { style: unitsElement?.style, children: renderElement({ id: "units" }) }))] })), [valueElement?.style, value, unitsElement, renderElement]);
6344
6486
  if (!value && hideEmpty)
6345
6487
  return null;
6346
- return (jsxs(RoundedBackgroundContainerWrapper, { style: innerTemplateStyle || style, "$center": center, "$color": color, "$inlineUnits": inlineUnits, "$bigIcon": bigIcon, children: [renderElement({ id: "icon", wrap: false }), jsxs(ContainerValue, { style: valueElement?.style, big: true, children: [value, !!unitsElement && (jsx(ContainerUnits, { style: unitsElement?.style, children: renderElement({ id: "units" }) }))] }), jsx(ContainerAlias, { style: aliasElement?.style, children: jsx(TextTrim, { maxLength: maxLength || ALIAS_DEFAULT_MAX_LENGTH, children: renderElement({ id: "alias", wrap: false }) }) })] }));
6488
+ return (jsxs(RoundedBackgroundContainerWrapper, { style: innerTemplateStyle || style, "$center": center, "$color": color, "$inlineUnits": inlineUnits, "$big": big, "$bigIcon": bigIcon, children: [jsxs(ContainerIconValue, { children: [renderElement({ id: "icon", wrap: false }), big ? renderAlias : renderValue] }), big ? renderValue : renderAlias] }));
6347
6489
  });
6348
6490
 
6349
6491
  const AddFeatureContainer = memo(({ elementConfig }) => {
@@ -6370,7 +6512,6 @@ const LayersContainerWrapper = styled(Container) `
6370
6512
  `;
6371
6513
 
6372
6514
  const LayersContainer = memo(({ type, elementConfig, renderElement }) => {
6373
- const { LayerItemComponent } = useGlobalContext();
6374
6515
  const { expandedContainers } = useWidgetContext(type);
6375
6516
  const { currentPage } = useWidgetPage(type);
6376
6517
  const { id, options, style } = elementConfig || {};
@@ -6383,7 +6524,7 @@ const LayersContainer = memo(({ type, elementConfig, renderElement }) => {
6383
6524
  return currentPage.layers;
6384
6525
  return currentPage.layers.filter(({ name }) => layerNames.includes(name));
6385
6526
  }, [currentPage?.layers, layerNames]);
6386
- return (jsxs(Fragment$1, { children: [jsx(ExpandableTitle, { elementConfig: elementConfig, type: type, renderElement: renderElement }), isVisible && (jsx(LayersContainerWrapper, { style: style, children: jsx(LayerTree, { layers: layers, LayerItemComponent: LayerItemComponent, onlyMainTools: true }) }))] }));
6527
+ return (jsxs(Fragment$1, { children: [jsx(ExpandableTitle, { elementConfig: elementConfig, type: type, renderElement: renderElement }), isVisible && (jsx(LayersContainerWrapper, { style: style, children: jsx(LayerTree, { layers: layers, onlyMainTools: true }) }))] }));
6387
6528
  });
6388
6529
 
6389
6530
  const containerComponents = {
@@ -6412,157 +6553,480 @@ const containerComponents = {
6412
6553
 
6413
6554
  const getContainerComponent = (innerTemplateName) => innerTemplateName ? containerComponents[innerTemplateName] || containerComponents.default : null;
6414
6555
 
6415
- const getDataFromAttributes = (t, config, attributes) => {
6416
- const colors = config?.options?.colors || FEATURE_CARD_DEFAULT_COLORS;
6417
- const data = config?.children?.map(({ attributeName }, index) => {
6418
- const attribute = attributes?.find(({ name }) => name === attributeName);
6419
- return {
6420
- name: attribute?.name || "",
6421
- value: attribute ? Number(attribute.value) : 0,
6422
- color: colors[index] || FEATURE_CARD_OTHER_COLOR
6423
- };
6424
- });
6425
- if (config?.options?.orderByValue) {
6426
- data.sort((a, b) => b.value - a.value);
6427
- }
6428
- const isOtherSliced = config?.options?.otherItems && config.options.otherItems < data.length;
6429
- if (!isOtherSliced)
6430
- return data;
6431
- const otherValue = data
6432
- .slice(0, config?.options?.otherItems)
6433
- .reduce((prev, { value }) => prev + value, 0);
6434
- return [
6435
- ...data?.slice(0, config.options?.otherItems),
6436
- {
6437
- name: t("other", { ns: "dashboard" }),
6438
- color: FEATURE_CARD_OTHER_COLOR,
6439
- value: Number(otherValue)
6440
- }
6441
- ];
6442
- };
6443
-
6444
- const getDataFromRelatedFeatures = ({ t, config, filters, relatedConfig, dataSource, layerInfo }) => {
6445
- if (!dataSource || !dataSource?.features?.length) {
6446
- return [];
6447
- }
6448
- const { colors } = config.options;
6449
- const layerDefinition = getLayerDefinition(layerInfo);
6450
- let data = JSON.parse(JSON.stringify(dataSource?.features));
6451
- const sortAttribute = config?.options?.orderByValue
6452
- ? relatedConfig.attributeName
6453
- : config?.options?.orderByTitle
6454
- ? relatedConfig.attributeTitle
6455
- : null;
6456
- if (sortAttribute) {
6457
- data.sort((a, b) => b.attributes[sortAttribute] - a.attributes[sortAttribute]);
6458
- }
6459
- const isOtherSliced = config?.options?.otherItems && config.options.otherItems < data.length;
6460
- const otherValue = isOtherSliced
6461
- ? data
6462
- .slice(config.options.otherItems)
6463
- .reduce((prev, { attributes }) => prev + attributes[relatedConfig.attributeName], 0)
6464
- : null;
6465
- if (isOtherSliced) {
6466
- data = data.slice(0, config?.options?.otherItems);
6467
- }
6468
- const gradientArray = relatedConfig.chartAxis && colors?.length < data.length
6469
- ? new Gradient()
6470
- .setColorGradient(colors[0], colors[colors.length - 1])
6471
- .setMidpoint(data.length)
6472
- .getColors()
6473
- : colors;
6474
- const filter = getConfigFilter(relatedConfig?.filterName, filters);
6475
- const result = data.reduce((acc, feature, index) => {
6476
- if (relatedConfig?.filterName && !filter) {
6477
- return acc;
6478
- }
6479
- const attributeName = feature.attributes[relatedConfig.attributeName];
6480
- const attributeTitle = feature.attributes[relatedConfig.attributeTitle];
6481
- const attributeColor = feature.attributes[relatedConfig.attributeColor];
6482
- return [
6483
- ...acc,
6484
- {
6485
- name: formatAttributeValue({
6486
- t,
6487
- type: layerDefinition.attributes[relatedConfig.attributeTitle]?.type,
6488
- value: attributeTitle,
6489
- stringFormat: layerDefinition.attributes[relatedConfig.attributeTitle]?.stringFormat
6490
- }),
6491
- value: attributeName === null ? null : Number(attributeName),
6492
- color: attributeColor || gradientArray?.[index] || FEATURE_CARD_OTHER_COLOR,
6493
- min: filter?.attributeMin ? feature.attributes[filter.attributeMin] : null,
6494
- max: filter?.attributeMin ? feature.attributes[filter.attributeMax] : null
6495
- }
6496
- ];
6497
- }, []);
6498
- if (isOtherSliced) {
6499
- result.push({
6500
- name: t("other", { ns: "dashboard" }),
6501
- color: FEATURE_CARD_OTHER_COLOR,
6502
- value: Number(otherValue)
6503
- });
6504
- }
6505
- return result;
6506
- };
6507
-
6508
- const getDefaultConfig = ({ title, defaultTitle, items, baseMapName, position, resolution, srid, }) => {
6509
- const dashboardConfiguration = JSON.parse(JSON.stringify(DEFAULT_DASHBOARD_CONFIG));
6510
- const defaultPages = JSON.parse(JSON.stringify(DEFAULT_PAGES_CONFIG));
6511
- const defaultPage = createConfigPage({ title, baseMapName, position, resolution, defaultTitle });
6512
- if (items?.length) {
6513
- const contentItems = items.map(item => createConfigLayer(item.name));
6514
- defaultPage.layers.push(...contentItems);
6515
- }
6516
- defaultPages.children.push(defaultPage);
6517
- dashboardConfiguration.children.push(defaultPages);
6518
- return dashboardConfiguration;
6519
- };
6520
-
6521
- const ElementImage = memo(({ type, elementConfig }) => {
6522
- const { attributes } = useWidgetContext(type);
6523
- const { value, attributeName, options } = elementConfig || {};
6524
- const { width } = options || {};
6525
- const firstImage = useMemo(() => {
6526
- if (value) {
6527
- return value.toString();
6528
- }
6529
- if (!attributeName || Array.isArray(attributeName)) {
6530
- return null;
6531
- }
6532
- const attribute = attributes?.find(item => item.name === attributeName);
6533
- return attribute?.value?.split(";")?.[0];
6534
- }, [attributeName, attributes, value]);
6535
- return firstImage ? jsx("img", { src: firstImage, alt: firstImage, width: width }) : null;
6536
- });
6537
-
6538
- const SmallPreviewContainer$1 = styled.div `
6539
- width: 100%;
6540
- height: 100%;
6541
- `;
6556
+ var img$3 = "data:image/png;base64,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";
6542
6557
 
6543
- const AttributeGalleryContainer = styled.div `
6544
- && {
6545
- width: calc(100% + 3rem);
6546
- }
6558
+ const getMaskColor = (isDark) => (isDark ? "0, 0, 0" : "255, 255, 255");
6559
+ const DefaultHeaderContainer = styled(Flex) `
6560
+ flex-direction: column;
6561
+ position: relative;
6562
+ flex-shrink: 0;
6563
+ min-height: 8.375rem;
6564
+ margin-bottom: -1.5rem;
6565
+ padding: 1.5rem 1.5rem 0;
6566
+ border-top-left-radius: 0.5rem;
6567
+ border-top-right-radius: 0.5rem;
6568
+ overflow: hidden;
6547
6569
 
6548
- min-height: 12.625rem;
6549
- background-color: ${({ theme: { palette } }) => palette.element};
6570
+ > * {
6571
+ z-index: 1;
6572
+ }
6550
6573
 
6551
- img {
6574
+ &::before {
6575
+ content: "";
6576
+ position: absolute;
6577
+ top: 0;
6578
+ left: 0;
6552
6579
  width: 100%;
6580
+ height: 100%;
6581
+
6582
+ ${({ image, isDark }) => image
6583
+ ? css `
6584
+ background: url(${image}) 0 0 no-repeat;
6585
+ background-size: cover;
6586
+ `
6587
+ : css `
6588
+ background: url(${img$3}) 50% 0 no-repeat;
6589
+ opacity: ${isDark ? 1 : 0.5};
6590
+ `}
6553
6591
  }
6554
- `;
6555
- const LinearProgressContainer = styled(Flex) `
6556
- align-items: center;
6557
- justify-content: center;
6558
- min-height: inherit;
6559
6592
 
6593
+ ${({ image, isDark }) => image &&
6594
+ css `
6595
+ &::before {
6596
+ -webkit-mask-image: linear-gradient(
6597
+ to bottom,
6598
+ rgba(${getMaskColor(isDark)}, 1),
6599
+ rgba(${getMaskColor(isDark)}, 0)
6600
+ );
6601
+ mask-image: linear-gradient(to bottom, rgba(${getMaskColor(isDark)}, 1), rgba(${getMaskColor(isDark)}, 0));
6602
+ }
6603
+ `}
6560
6604
  ${LinearProgress} {
6561
- max-width: 4rem;
6605
+ position: absolute;
6606
+ top: 0;
6607
+ left: 0;
6562
6608
  }
6563
6609
  `;
6564
- const NoLiveSnapshotContainer = styled(Flex) `
6565
- flex-direction: column;
6610
+ const TopContainer = styled(Flex) `
6611
+ z-index: 1;
6612
+ position: relative;
6613
+ justify-content: space-between;
6614
+ flex-wrap: nowrap;
6615
+ width: 100%;
6616
+ align-items: flex-start;
6617
+ `;
6618
+ const TopContainerButtons = styled(Flex) `
6619
+ align-items: center;
6620
+ width: auto;
6621
+ margin-right: -0.5rem;
6622
+
6623
+ button {
6624
+ width: auto;
6625
+ height: 1rem;
6626
+ padding: 0 0.5rem;
6627
+ }
6628
+ `;
6629
+ const LogoContainer = styled(Flex) `
6630
+ max-width: calc(100% - 1.4rem);
6631
+ flex-grow: 1;
6632
+ font-size: 0;
6633
+
6634
+ & > span::after {
6635
+ font-size: 2rem;
6636
+ }
6637
+
6638
+ img {
6639
+ max-height: 1.875rem;
6640
+ }
6641
+ `;
6642
+ const PageTitle = styled(H2) `
6643
+ display: -webkit-box;
6644
+ -webkit-line-clamp: 3;
6645
+ -webkit-box-orient: vertical;
6646
+ overflow: hidden;
6647
+ margin: 0;
6648
+ font-size: 1.25rem;
6649
+ font-weight: 600;
6650
+ pointer-events: initial;
6651
+ font-family: "Nunito Sans", serif;
6652
+ `;
6653
+
6654
+ var ThemeName;
6655
+ (function (ThemeName) {
6656
+ ThemeName["Light"] = "light";
6657
+ ThemeName["Dark"] = "dark";
6658
+ })(ThemeName || (ThemeName = {}));
6659
+
6660
+ var TmsType;
6661
+ (function (TmsType) {
6662
+ TmsType["WMS"] = "WMS";
6663
+ TmsType["TMS"] = "TMS";
6664
+ TmsType["ArcGIS"] = "ArcGIS";
6665
+ })(TmsType || (TmsType = {}));
6666
+ var EditGeometryType;
6667
+ (function (EditGeometryType) {
6668
+ EditGeometryType["Raster"] = "raster";
6669
+ })(EditGeometryType || (EditGeometryType = {}));
6670
+
6671
+ const DashboardDefaultHeader = memo(() => {
6672
+ const { components: { ProjectCatalogMenu, ProjectPanelMenu, ProjectPagesMenu }, } = useWidgetContext();
6673
+ const { pageId, image, icon, tooltip, themeName } = useDashboardHeader();
6674
+ return (jsxs(DefaultHeaderContainer, { image: image, isDark: themeName === ThemeName.Dark, children: [!pageId && jsx(LinearProgress, {}), jsxs(Flex, { column: true, gap: "1rem", children: [jsx(FlexSpan, { children: jsxs(TopContainer, { children: [jsx(LogoContainer, { children: icon }), jsxs(TopContainerButtons, { children: [jsx(ProjectCatalogMenu, {}), jsx(ProjectPanelMenu, {})] })] }) }), jsx(FlexSpan, { children: jsx(Flex, { column: true, gap: "0.25rem", children: jsx(FlexSpan, { children: jsxs(Flex, { alignItems: "center", children: [jsx(FlexSpan, { flexGrow: 1, children: jsx(Tooltip$1, { arrow: true, content: tooltip, children: ref => (jsx(PageTitle, { ref: ref, children: jsx(ProjectPagesMenu, {}) })) }) }), jsx(FlexSpan, { children: jsx(Pagination, {}) })] }) }) }) })] })] }));
6675
+ });
6676
+
6677
+ const HeaderFrontView = styled(Flex) `
6678
+ z-index: 10;
6679
+ position: relative;
6680
+ justify-content: space-between;
6681
+ align-items: ${({ isDefault }) => (isDefault ? "center" : "flex-start")};
6682
+ width: 100%;
6683
+ font: ${({ theme: { fonts } }) => fonts.subtitle};
6684
+ `;
6685
+ const HeaderContainer = styled(FlexSpan) `
6686
+ display: flex;
6687
+ flex-grow: 1;
6688
+ flex-wrap: nowrap;
6689
+ width: calc(100% - 48px);
6690
+ `;
6691
+ const FeatureTitleContainer = styled.div `
6692
+ display: -webkit-box;
6693
+ max-width: 100%;
6694
+ width: 100%;
6695
+ margin: 0.5rem 0;
6696
+ -webkit-line-clamp: 2;
6697
+ -webkit-box-orient: vertical;
6698
+ overflow: hidden;
6699
+ text-overflow: ellipsis;
6700
+ color: ${({ theme: { palette } }) => palette.textPrimary};
6701
+
6702
+ & > ${FlexSpan} {
6703
+ cursor: ${({ clickable }) => clickable && "pointer"};
6704
+
6705
+ &:hover {
6706
+ color: ${({ clickable, theme: { palette } }) => clickable && palette.primary};
6707
+ }
6708
+ }
6709
+ `;
6710
+ const LayerDescription = styled(Description) `
6711
+ width: calc(100% - 4rem);
6712
+ display: -webkit-box;
6713
+ -webkit-line-clamp: 2;
6714
+ -webkit-box-orient: vertical;
6715
+ overflow: hidden;
6716
+ text-overflow: ellipsis;
6717
+ `;
6718
+ const HeaderTitleContainer = styled(Flex) `
6719
+ flex-direction: column;
6720
+ width: 100%;
6721
+ `;
6722
+ const RowHeaderMixin = css `
6723
+ &&& {
6724
+ min-height: auto;
6725
+
6726
+ ${FeatureTitleContainer}, ${LayerDescription} {
6727
+ text-align: left;
6728
+ }
6729
+ }
6730
+
6731
+ ${HeaderContainer} {
6732
+ flex-direction: row;
6733
+ }
6734
+
6735
+ ${FeatureTitleContainer} {
6736
+ max-width: calc(100% - 3.8rem);
6737
+ }
6738
+ `;
6739
+ const Header = styled(Flex) `
6740
+ z-index: 1;
6741
+ position: relative;
6742
+ top: 0;
6743
+ flex-shrink: 0;
6744
+ overflow: hidden;
6745
+ padding: 0.5rem;
6746
+
6747
+ ${HeaderContainer} {
6748
+ flex-direction: column;
6749
+ }
6750
+
6751
+ ${({ $isRow }) => $isRow && RowHeaderMixin};
6752
+ `;
6753
+
6754
+ const HeaderTitle = ({ noFeature }) => {
6755
+ const { t } = useGlobalContext();
6756
+ const { attributes, layerInfo, feature } = useWidgetContext(WidgetType.FeatureCard);
6757
+ const zoomToFeatures = useZoomToFeatures();
6758
+ const { alias, name, layerDefinition } = layerInfo || {};
6759
+ const resultDescription = alias || name || "";
6760
+ const resultTitle = useMemo(() => {
6761
+ const layerDefinitionAttribute = layerDefinition && attributes?.length
6762
+ ? attributes.find(item => item.name === layerDefinition.titleAttribute)
6763
+ : null;
6764
+ const layerDefinitionTitle = layerDefinition?.titleAttribute && layerDefinitionAttribute?.value
6765
+ ? layerDefinitionAttribute.value
6766
+ : null;
6767
+ return ((!!layerDefinitionTitle &&
6768
+ formatAttributeValue({
6769
+ t,
6770
+ type: layerDefinitionAttribute.type,
6771
+ value: layerDefinitionTitle,
6772
+ stringFormat: layerDefinitionAttribute.stringFormat,
6773
+ })) ||
6774
+ feature?.id);
6775
+ }, [attributes, feature, layerDefinition]);
6776
+ return (jsxs(HeaderTitleContainer, { children: [noFeature ? (jsx(FeatureTitleContainer, { children: t("noObjectFound", { ns: "dashboard" }) })) : (jsx(FeatureTitleContainer, { clickable: true, children: jsx(Tooltip$1, { arrow: true, placement: "top", content: t("zoomToFeature", { ns: "dashboard" }), delay: [600, 0], children: ref => (jsx(FlexSpan, { ref: ref, onClick: () => zoomToFeatures([feature]), children: resultTitle })) }) })), jsx(LayerDescription, { title: resultDescription, children: resultDescription })] }));
6777
+ };
6778
+
6779
+ const LayerIconContainer = styled.div `
6780
+ display: flex;
6781
+ align-items: center;
6782
+ margin-right: 0.75rem;
6783
+ `;
6784
+ const AlertIconContainer = styled(Flex) `
6785
+ align-items: center;
6786
+ justify-content: center;
6787
+ width: 2rem;
6788
+ height: 2rem;
6789
+
6790
+ ${Icon} {
6791
+ :after {
6792
+ color: ${({ theme: { palette } }) => palette.error};
6793
+ }
6794
+ }
6795
+ `;
6796
+
6797
+ var img$2 = "data:image/svg+xml,%3csvg width='32' height='32' viewBox='0 0 32 32' fill='none' xmlns='http://www.w3.org/2000/svg'%3e %3crect width='32' height='32' fill='transparent'/%3e %3cpath d='M20.248 9.67787C18.5318 8.04035 15.9473 7.54977 13.7024 8.43543C11.4576 9.32109 9.99566 11.4081 10 13.721C10 18.2894 16 24 16 24C16 24 22 18.2894 22 13.721C22.0028 12.2054 21.3726 10.7509 20.248 9.67787Z' fill='url(%23paint0_linear_6459_10338)'/%3e %3ccircle cx='16' cy='14' r='2' fill='white'/%3e %3cdefs%3e %3clinearGradient id='paint0_linear_6459_10338' x1='10' y1='8' x2='25.36' y2='19.52' gradientUnits='userSpaceOnUse'%3e %3cstop stop-color='%230084D6'/%3e %3cstop offset='0.489583' stop-color='%230084D6'/%3e %3cstop offset='0.489683' stop-color='%2305A9FF'/%3e %3cstop offset='0.921875' stop-color='%2305A9FF'/%3e %3c/linearGradient%3e %3c/defs%3e%3c/svg%3e";
6798
+
6799
+ var img$1 = "data:image/svg+xml,%3csvg width='32' height='32' viewBox='0 0 32 32' fill='none' xmlns='http://www.w3.org/2000/svg'%3e %3crect width='32' height='32' fill='transparent'/%3e %3cpath d='M4 17.9574H10.1538L13.5385 12L18.4615 20L22 13.8723H28' stroke='url(%23paint0_linear_6459_10369)' stroke-width='2' stroke-linejoin='round'/%3e %3cdefs%3e %3clinearGradient id='paint0_linear_6459_10369' x1='4' y1='9.54167' x2='28.7229' y2='20.1484' gradientUnits='userSpaceOnUse'%3e %3cstop offset='0.525942' stop-color='%2306AAFF'/%3e %3cstop offset='0.526042' stop-color='%230184D7'/%3e %3c/linearGradient%3e %3c/defs%3e%3c/svg%3e";
6800
+
6801
+ var img = "data:image/svg+xml,%3csvg width='32' height='32' viewBox='0 0 32 32' fill='none' xmlns='http://www.w3.org/2000/svg'%3e %3crect width='32' height='32' fill='transparent'/%3e %3crect x='8' y='8' width='16' height='16' rx='2' fill='url(%23paint0_linear_6459_10399)'/%3e %3cdefs%3e %3clinearGradient id='paint0_linear_6459_10399' x1='8' y1='8' x2='24' y2='24' gradientUnits='userSpaceOnUse'%3e %3cstop stop-color='%230084D6'/%3e %3cstop offset='0.489583' stop-color='%230084D6'/%3e %3cstop offset='0.489683' stop-color='%2305A9FF'/%3e %3cstop offset='0.921875' stop-color='%2305A9FF'/%3e %3c/linearGradient%3e %3c/defs%3e%3c/svg%3e";
6802
+
6803
+ const LayerIcon = ({ layerInfo }) => {
6804
+ const renderSymbol = useMemo(() => {
6805
+ if (!layerInfo.geometryType) {
6806
+ return (jsx(AlertIconContainer, { children: jsx(Icon, { kind: "warning" }) }));
6807
+ }
6808
+ switch (layerInfo.geometryType) {
6809
+ case GeometryType.Polyline:
6810
+ return jsx("img", { src: img$1, alt: "" });
6811
+ case GeometryType.Polygon:
6812
+ return jsx("img", { src: img, alt: "" });
6813
+ case GeometryType.Point:
6814
+ default:
6815
+ return jsx("img", { src: img$2, alt: "" });
6816
+ }
6817
+ }, [layerInfo.geometryType]);
6818
+ return jsx(LayerIconContainer, { children: renderSymbol });
6819
+ };
6820
+
6821
+ const FeatureCardDefaultHeader = ({ noFeature }) => {
6822
+ const { layerInfo } = useWidgetContext(WidgetType.FeatureCard);
6823
+ return (jsx(Header, { "$isRow": true, children: jsxs(HeaderFrontView, { isDefault: true, children: [jsxs(HeaderContainer, { children: [!!layerInfo?.name && jsx(LayerIcon, { layerInfo: layerInfo }), jsx(HeaderTitle, { noFeature: noFeature })] }), jsx(FeatureCardButtons, {})] }) }));
6824
+ };
6825
+
6826
+ const HeaderFontColorMixin$1 = css `
6827
+ ${HeaderTitleContainer}, ${LayerDescription} {
6828
+ color: ${({ $fontColor }) => $fontColor};
6829
+ }
6830
+ `;
6831
+ const HeaderWrapperMixin$1 = css `
6832
+ padding: 0.5rem 0.5rem 0;
6833
+
6834
+ ${Header} {
6835
+ min-height: 5.25rem;
6836
+ }
6837
+
6838
+ ${HeaderContainer} {
6839
+ max-width: 100%;
6840
+ width: 100%;
6841
+ }
6842
+
6843
+ ${FeatureControls} {
6844
+ max-width: calc(100% - 2rem);
6845
+ width: calc(100% - 2rem);
6846
+ margin-top: -0.5rem;
6847
+ padding-top: 1rem;
6848
+ border-radius: ${({ theme: { borderRadius } }) => borderRadius.medium};
6849
+ }
6850
+
6851
+ ${({ $fontColor }) => !!$fontColor && HeaderFontColorMixin$1};
6852
+ `;
6853
+ const GradientHeaderWrapper = styled.div `
6854
+ ${Header} {
6855
+ background: ${({ $bgColor }) => $bgColor || "radial-gradient(129.21% 133.22% at 51.94% 0%, #e8fffe 9.48%, #5fcaff 100%)"};
6856
+ }
6857
+
6858
+ ${HeaderContainer} {
6859
+ align-items: center;
6860
+ }
6861
+
6862
+ ${HeaderTitleContainer} {
6863
+ margin-left: 0;
6864
+ text-align: center;
6865
+ }
6866
+
6867
+ ${FeatureTitleContainer} {
6868
+ text-align: center;
6869
+ }
6870
+
6871
+ ${LayerDescription} {
6872
+ text-align: center;
6873
+ }
6874
+
6875
+ ${HeaderWrapperMixin$1};
6876
+ `;
6877
+
6878
+ const FeatureCardGradientHeader = ({ isRow }) => {
6879
+ const { layerInfo } = useWidgetContext(WidgetType.FeatureCard);
6880
+ const { config } = useWidgetConfig(WidgetType.FeatureCard);
6881
+ const { header, options } = config || {};
6882
+ const renderElement = useHeaderRender(header);
6883
+ return (jsx(GradientHeaderWrapper, { "$fontColor": options?.fontColor, "$bgColor": options?.bgColor, children: jsx(ThemeProvider, { theme: defaultTheme, children: jsx(Header, { "$isRow": isRow, children: jsxs(HeaderFrontView, { children: [jsxs(HeaderContainer, { children: [jsx(LayerIcon, { layerInfo: layerInfo }), jsx(FeatureCardTitle, { title: renderElement({
6884
+ id: "title",
6885
+ wrap: false,
6886
+ }), description: renderElement({
6887
+ id: "description",
6888
+ wrap: false,
6889
+ }) })] }), jsx(FeatureCardButtons, {})] }) }) }) }));
6890
+ };
6891
+
6892
+ const HeaderFontColorMixin = css `
6893
+ ${HeaderTitleContainer}, ${LayerDescription} {
6894
+ color: ${({ $fontColor }) => $fontColor};
6895
+ }
6896
+ `;
6897
+ const HeaderWrapperMixin = css `
6898
+ padding: 0.5rem 0.5rem 0;
6899
+
6900
+ ${Header} {
6901
+ min-height: 5.25rem;
6902
+ }
6903
+
6904
+ ${HeaderContainer} {
6905
+ max-width: 100%;
6906
+ width: 100%;
6907
+ }
6908
+
6909
+ ${FeatureControls} {
6910
+ max-width: calc(100% - 2rem);
6911
+ width: calc(100% - 2rem);
6912
+ margin-top: -0.5rem;
6913
+ padding-top: 1rem;
6914
+ border-radius: ${({ theme: { borderRadius } }) => borderRadius.medium};
6915
+ }
6916
+
6917
+ ${({ $fontColor }) => !!$fontColor && HeaderFontColorMixin};
6918
+ `;
6919
+ const HeaderIcon = styled(Flex) `
6920
+ position: absolute;
6921
+ top: 0;
6922
+ right: 0;
6923
+ justify-content: flex-end;
6924
+ align-items: center;
6925
+ min-width: 7.5rem;
6926
+ height: 100%;
6927
+
6928
+ span[kind]:after {
6929
+ font-size: 7.5rem;
6930
+ }
6931
+
6932
+ span[kind]:after,
6933
+ path,
6934
+ line,
6935
+ circle {
6936
+ fill: rgba(255, 255, 255, 0.36);
6937
+ }
6938
+
6939
+ && > * {
6940
+ display: flex;
6941
+ align-items: center;
6942
+ height: 100%;
6943
+ }
6944
+ `;
6945
+ const BigIconHeaderMixin = css `
6946
+ ${HeaderIcon} {
6947
+ min-width: 14rem;
6948
+ right: -3rem;
6949
+
6950
+ span[kind]:after {
6951
+ font-size: 14rem;
6952
+ }
6953
+ }
6954
+ `;
6955
+ const IconHeaderWrapper = styled.div `
6956
+ ${Header} {
6957
+ width: calc(100% + 3rem);
6958
+ margin: -1.5rem -1.5rem 0 -1.5rem;
6959
+ padding: 1.5rem;
6960
+ border-top-left-radius: 0.5rem;
6961
+ border-top-right-radius: 0.5rem;
6962
+ background: ${({ $bgColor }) => $bgColor || "linear-gradient(96.55deg, #FFFCD3 0%, #B4DC47 100%)"};
6963
+ }
6964
+
6965
+ ${HeaderWrapperMixin};
6966
+
6967
+ ${({ $bigIcon }) => $bigIcon && BigIconHeaderMixin};
6968
+ `;
6969
+
6970
+ const FeatureCardIconHeader = ({ isRow }) => {
6971
+ const { layerInfo } = useWidgetContext(WidgetType.FeatureCard);
6972
+ const { config } = useWidgetConfig(WidgetType.FeatureCard);
6973
+ const { header, options } = config || {};
6974
+ const renderElement = useHeaderRender(header);
6975
+ return (jsx(IconHeaderWrapper, { "$fontColor": options?.fontColor, "$bgColor": options?.bgColor, "$bigIcon": options?.bigIcon, children: jsx(ThemeProvider, { theme: defaultTheme, children: jsxs(Header, { "$isRow": isRow, children: [jsxs(HeaderFrontView, { children: [jsxs(HeaderContainer, { children: [jsx(LayerIcon, { layerInfo: layerInfo }), jsx(FeatureCardTitle, { title: renderElement({
6976
+ id: "title",
6977
+ wrap: false,
6978
+ }), description: renderElement({
6979
+ id: "description",
6980
+ wrap: false,
6981
+ }) })] }), jsx(FeatureCardButtons, {})] }), jsx(HeaderIcon, { children: renderElement({
6982
+ id: "icon",
6983
+ wrap: false,
6984
+ }) })] }) }) }));
6985
+ };
6986
+
6987
+ const ImageContainerButton = styled(FlatButton) `
6988
+ min-height: 1.5rem;
6989
+ border-radius: ${({ theme: { borderRadius } }) => borderRadius.large};
6990
+ background-color: ${({ theme: { palette } }) => palette.primary};
6991
+ text-transform: none;
6992
+
6993
+ :hover {
6994
+ background-color: ${({ theme: { palette } }) => palette.primaryDeep};
6995
+ }
6996
+ `;
6997
+
6998
+ const ElementButton = memo(({ type, elementConfig }) => {
6999
+ const { attributes } = useWidgetContext(type);
7000
+ const attribute = getAttributeByName(elementConfig?.attributeName, attributes);
7001
+ const link = attribute?.value;
7002
+ if (!link || typeof link !== "string")
7003
+ return null;
7004
+ return (jsx(ImageContainerButton, { onClick: () => window.open(attribute?.value), children: elementConfig.value || "" }));
7005
+ });
7006
+
7007
+ const AttributeGalleryContainer = styled.div `
7008
+ && {
7009
+ width: calc(100% + 3rem);
7010
+ }
7011
+
7012
+ min-height: 12.625rem;
7013
+ background-color: ${({ theme: { palette } }) => palette.element};
7014
+
7015
+ img {
7016
+ width: 100%;
7017
+ }
7018
+ `;
7019
+ const LinearProgressContainer = styled(Flex) `
7020
+ align-items: center;
7021
+ justify-content: center;
7022
+ min-height: inherit;
7023
+
7024
+ ${LinearProgress} {
7025
+ max-width: 4rem;
7026
+ }
7027
+ `;
7028
+ const NoLiveSnapshotContainer = styled(Flex) `
7029
+ flex-direction: column;
6566
7030
  align-items: center;
6567
7031
 
6568
7032
  span[kind="alert"] {
@@ -6649,7 +7113,7 @@ const imgSlideShowMixin = css `
6649
7113
  }
6650
7114
  }
6651
7115
  `;
6652
- const SmallPreviewContainer = styled.div `
7116
+ const SmallPreviewContainer$1 = styled.div `
6653
7117
  cursor: ${({ onClick }) => (onClick ? "pointer" : "default")};
6654
7118
  position: relative;
6655
7119
  width: 100%;
@@ -6694,6 +7158,10 @@ const SmallPreviewContainer = styled.div `
6694
7158
  `;
6695
7159
  const SmallPreviewImages = styled.div ``;
6696
7160
 
7161
+ const NoLiveSnapshot = () => {
7162
+ return (jsxs(NoLiveSnapshotContainer, { children: [jsx(Icon, { kind: "alert" }), jsx(Description, { children: "\u0421\u043D\u0438\u043C\u043E\u043A \u043D\u0435 \u0434\u043E\u0441\u0442\u0443\u043F\u0435\u043D" })] }));
7163
+ };
7164
+
6697
7165
  const SmallPreview = ({ images, totalCount, currentIndex, isLoading, setCurrentIndex, onClick, onNextPage }) => {
6698
7166
  const { t } = useGlobalContext();
6699
7167
  const [prevIndex, setPrevIndex] = useState(currentIndex + 1);
@@ -6715,40 +7183,151 @@ const SmallPreview = ({ images, totalCount, currentIndex, isLoading, setCurrentI
6715
7183
  onNextPage();
6716
7184
  }
6717
7185
  }, [currentIndex, images, isNextDisabled, onNextPage, setCurrentIndex]);
6718
- return (jsxs(SmallPreviewContainer, { currentIndex: currentIndex + 1, prevIndex: prevIndex + 1, children: [isLoading && jsx(LinearProgress, {}), images.length > 1 && (jsxs(Fragment$1, { children: [jsx(SmallPreviewLeft, { "$isDisabled": isPrevDisabled, onClick: prev }), jsx(SmallPreviewRight, { "$isDisabled": isNextDisabled, onClick: next }), jsx(SmallPreviewCounter, { children: jsxs("div", { children: [currentIndex + 1, " ", t("of", { ns: "dashboard" }), " ", total] }) })] })), jsx(SmallPreviewImages, { onClick: onClick, children: images.map(image => (jsx("img", { src: image.src, alt: "" }, image.src))) })] }));
7186
+ return (jsxs(SmallPreviewContainer$1, { currentIndex: currentIndex + 1, prevIndex: prevIndex + 1, children: [isLoading && jsx(LinearProgress, {}), images.length > 1 && (jsxs(Fragment$1, { children: [jsx(SmallPreviewLeft, { "$isDisabled": isPrevDisabled, onClick: prev }), jsx(SmallPreviewRight, { "$isDisabled": isNextDisabled, onClick: next }), jsx(SmallPreviewCounter, { children: jsxs("div", { children: [currentIndex + 1, " ", t("of", { ns: "dashboard" }), " ", total] }) })] })), jsx(SmallPreviewImages, { onClick: onClick, children: images.map(image => (jsx("img", { src: image.src, alt: "" }, image.src))) })] }));
6719
7187
  };
6720
7188
 
6721
- const ElementSlideshow = ({ elementConfig, type, renderElement }) => {
6722
- const { expandedContainers, dataSources, attributes } = useWidgetContext(type);
7189
+ const DEFAULT_ARCHIVED_PERIOD = "#24h";
7190
+ const SNAPSHOTS_PER_PAGE = 10;
7191
+ const getDuration = (archivePeriod) => {
7192
+ const lastLetter = archivePeriod[archivePeriod.length - 1];
7193
+ const value = archivePeriod.slice(1, -1);
7194
+ const prop = lastLetter === "d"
7195
+ ? "days"
7196
+ : lastLetter === "h"
7197
+ ? "hours"
7198
+ : lastLetter === "m"
7199
+ ? "minutes"
7200
+ : lastLetter === "s"
7201
+ ? "seconds"
7202
+ : null;
7203
+ if (!lastLetter || !value || !prop)
7204
+ return {};
7205
+ return { [prop]: Number(value) };
7206
+ };
7207
+ const useCameraAttribute = (cameraId) => {
7208
+ const { api } = useGlobalContext();
6723
7209
  const [currentIndex, setCurrentIndex] = useState(0);
6724
- const [isOpenGallery, toggleGallery] = useToggle();
6725
- const { id, options, attributeName } = elementConfig || {};
6726
- const { expandable, expanded, relatedDataSource } = options || {};
6727
- const isVisible = isVisibleContainer(id, expandable, expanded, expandedContainers);
6728
- const images = useMemo(() => {
6729
- const dataSource = relatedDataSource ? dataSources?.find(({ name }) => name === relatedDataSource) : null;
6730
- const array = dataSource
6731
- ? dataSource.features.map(feature => feature.attributes[attributeName])
6732
- : getSlideshowImages({
6733
- element: elementConfig,
6734
- attribute: attributes?.find(({ name }) => name === attributeName),
7210
+ const [currentPage, setCurrentPage] = useState(0);
7211
+ const [timeline, setTimeline] = useState([]);
7212
+ const [isLoadingSnapshot, setLoadingSnapshot] = useState(false);
7213
+ const [isLoadingTimeline, setLoadingTimeline] = useState(false);
7214
+ const [isOpenGallery, toggleGallery] = useToggle();
7215
+ const [galleryImages, setGalleryImages] = useState([]);
7216
+ const imagesRef = useRef([]);
7217
+ // Todo get archivePeriod from project configuration
7218
+ const archivePeriod = /* appConfig?.settings?.cameraAttribute?.archivePeriod ||*/ DEFAULT_ARCHIVED_PERIOD;
7219
+ const onNextPage = useCallback(() => {
7220
+ setCurrentPage(currentPage + 1);
7221
+ }, [currentPage]);
7222
+ useEffect(() => {
7223
+ (async () => {
7224
+ if (!cameraId)
7225
+ return;
7226
+ setLoadingSnapshot(true);
7227
+ const snapshot = null; // await api.cameras.getLiveSnapshot(cameraId);
7228
+ const url = URL.createObjectURL(snapshot);
7229
+ setLoadingSnapshot(false);
7230
+ setLoadingTimeline(true);
7231
+ imagesRef.current = [
7232
+ {
7233
+ src: url,
7234
+ startTime: new Date(),
7235
+ },
7236
+ ];
7237
+ setGalleryImages([
7238
+ {
7239
+ src: url,
7240
+ fileName: formatDate$1(new Date()),
7241
+ },
7242
+ ]);
7243
+ const formatDateOptions = { dateFormat: DateFormat.UTC };
7244
+ const startTime = formatDate$1(sub(new Date(), getDuration(archivePeriod)), formatDateOptions);
7245
+ const endTime = formatDate$1(new Date(), formatDateOptions);
7246
+ const timelineResponse = await api.cameras.getArchiveTimeline({ cameraId, startTime, endTime });
7247
+ if (!timelineResponse.success || !timelineResponse.timeline.length)
7248
+ return;
7249
+ timelineResponse.timeline.reverse();
7250
+ setTimeline(timelineResponse.timeline);
7251
+ })();
7252
+ }, [cameraId]);
7253
+ useEffect(() => {
7254
+ if (!timeline.length)
7255
+ return;
7256
+ const timelinePage = timeline.slice(currentPage * SNAPSHOTS_PER_PAGE, (currentPage + 1) * SNAPSHOTS_PER_PAGE);
7257
+ for (const item of timelinePage) {
7258
+ if (!item)
7259
+ continue;
7260
+ api.cameras
7261
+ .getArchiveSnapshot({
7262
+ cameraId,
7263
+ time: item.startTime,
7264
+ })
7265
+ .then(response => {
7266
+ const newImages = [
7267
+ ...imagesRef.current,
7268
+ { src: URL.createObjectURL(response), startTime: new Date(item.startTime) },
7269
+ ];
7270
+ newImages.sort((a, b) => (a.startTime < b.startTime ? 1 : a.startTime > b.startTime ? -1 : 0));
7271
+ imagesRef.current = newImages;
7272
+ setGalleryImages(newImages.map(newImage => ({
7273
+ src: newImage.src,
7274
+ fileName: formatDate$1(newImage.startTime, { dateFormat: DateFormat.DateTime }),
7275
+ })));
7276
+ if (newImages.length === timelinePage.length) {
7277
+ setLoadingTimeline(false);
7278
+ }
6735
7279
  });
6736
- return (array?.map(image => ({
6737
- src: image,
6738
- fileName: image,
6739
- })) || []);
6740
- }, [attributeName, attributes, dataSources, elementConfig, relatedDataSource]);
6741
- return (jsxs(Fragment$1, { children: [jsx(ExpandableTitle, { elementConfig: elementConfig, type: type, renderElement: renderElement }), isVisible && (jsxs(SmallPreviewContainer$1, { children: [jsx(SmallPreview, { images: images, currentIndex: currentIndex, setCurrentIndex: setCurrentIndex, onClick: toggleGallery }), isOpenGallery && (jsx(Preview, { images: images,
7280
+ }
7281
+ }, [timeline, currentPage]);
7282
+ return [
7283
+ {
7284
+ currentIndex,
7285
+ currentPage,
7286
+ totalCount: timeline.length,
7287
+ galleryImages,
7288
+ isLoadingSnapshot,
7289
+ isLoadingTimeline,
7290
+ isOpenGallery,
7291
+ },
7292
+ {
7293
+ toggleGallery,
7294
+ setGalleryImages,
7295
+ setCurrentIndex,
7296
+ onNextPage,
7297
+ },
7298
+ ];
7299
+ };
7300
+
7301
+ const ElementCamera = ({ type, renderElement, elementConfig, field }) => {
7302
+ const { expandedContainers, attributes } = useWidgetContext(type);
7303
+ const attribute = getAttributeByName(elementConfig?.attributeName, attributes);
7304
+ const value = attribute?.value;
7305
+ const { id, options } = elementConfig || {};
7306
+ const { expandable, expanded } = options || {};
7307
+ const isVisible = isVisibleContainer(id, expandable, expanded, expandedContainers);
7308
+ const [{ currentIndex /* , currentPage*/, totalCount, galleryImages, isLoadingSnapshot, isLoadingTimeline, isOpenGallery }, { setCurrentIndex, toggleGallery, onNextPage },] = useCameraAttribute(value);
7309
+ return (jsxs(Fragment$1, { children: [jsx(ExpandableTitle, { elementConfig: elementConfig, type: type, renderElement: renderElement }), isVisible && (jsxs(Fragment$1, { children: [!!field && jsx(AttributeLabel, { children: field }), jsx(AttributeGalleryContainer, { children: isLoadingSnapshot ? (jsx(LinearProgressContainer, { children: jsx(LinearProgress, {}) })) : !galleryImages?.length && !isLoadingTimeline ? (jsx(NoLiveSnapshot, {})) : (jsx(SmallPreview, { images: galleryImages, totalCount: totalCount, currentIndex: currentIndex, isLoading: isLoadingTimeline, setCurrentIndex: setCurrentIndex, onClick: toggleGallery, onNextPage: onNextPage })) }), isOpenGallery && (jsx(Preview, { images: galleryImages,
6742
7310
  // currentIndex={currentIndex}
6743
- // totalCount={images.length}
6744
- isOpen: isOpenGallery, onClose: toggleGallery }))] }))] }));
7311
+ // currentPage={currentPage}
7312
+ // totalCount={totalCount}
7313
+ isOpen: isOpenGallery,
7314
+ // isLoading={isLoadingTimeline}
7315
+ // hasSidebar
7316
+ onClose: toggleGallery }))] }))] }));
6745
7317
  };
6746
7318
 
6747
- const ElementSvg = memo(({ type, elementConfig }) => {
6748
- const { layerInfo, attributes } = useWidgetContext(type);
6749
- const { options } = elementConfig || {};
6750
- const { width, height, fontColor } = options || {};
6751
- return (jsx(SvgImage, { url: getSvgUrl({ elementConfig, layerInfo, attributes }), width: width, height: height, fontColor: fontColor }));
7319
+ const ElementChart = memo(({ type, elementConfig, renderElement }) => {
7320
+ const { config } = useWidgetConfig(type);
7321
+ return (jsx(Chart, { type: type, config: config, elementConfig: elementConfig, element: elementConfig, renderElement: renderElement }));
7322
+ });
7323
+
7324
+ const ElementChips = memo(({ type, elementConfig }) => {
7325
+ const { attributes } = useWidgetContext(type);
7326
+ const { attributeName, options, style } = elementConfig || {};
7327
+ const { separator, bgColor, fontColor, fontSize } = options || {};
7328
+ const attribute = getAttributeByName(attributeName, attributes);
7329
+ const tags = attribute?.value?.split(separator || ",");
7330
+ return (jsx(DashboardChipsContainer, { style: style, children: tags?.map(tag => (jsx(DashboardChip$1, { text: tag, "$bgColor": bgColor, "$fontColor": fontColor, "$fontSize": fontSize, "$isDefault": true }, tag))) }));
6752
7331
  });
6753
7332
 
6754
7333
  const StyledIconFontSizeMixin = css `
@@ -6776,27 +7355,45 @@ const ElementIcon = memo(({ type, elementConfig }) => {
6776
7355
  return jsx(StyledIcon, { kind: iconValue, fontSize: fontSize, fontColor: fontColor });
6777
7356
  });
6778
7357
 
6779
- const TooltipIcon = styled(Icon) `
6780
- &&& {
6781
- :after {
6782
- font-size: 0.75rem;
6783
- color: ${({ theme: { palette } }) => palette.iconDisabled};
6784
- transition: color ${transition.hover};
6785
- }
6786
-
6787
- :hover:after {
6788
- color: ${({ theme: { palette } }) => palette.icon};
6789
- }
6790
- }
6791
- `;
7358
+ const ElementImage = memo(({ type, elementConfig }) => {
7359
+ const { attributes } = useWidgetContext(type);
7360
+ const { value, attributeName, options } = elementConfig || {};
7361
+ const { width } = options || {};
7362
+ const firstImage = useMemo(() => {
7363
+ if (value) {
7364
+ return value.toString();
7365
+ }
7366
+ if (!attributeName || Array.isArray(attributeName)) {
7367
+ return null;
7368
+ }
7369
+ const attribute = attributes?.find(item => item.name === attributeName);
7370
+ return attribute?.value?.split(";")?.[0];
7371
+ }, [attributeName, attributes, value]);
7372
+ return firstImage ? jsx("img", { src: firstImage, alt: firstImage, width: width }) : null;
7373
+ });
6792
7374
 
6793
- const ElementTooltip = memo(({ type, elementConfig }) => {
7375
+ const ElementLegend = memo(({ type, element, elementConfig, expandedContainers }) => {
6794
7376
  const { attributes } = useWidgetContext(type);
6795
- const { attributeName, options } = elementConfig || {};
6796
- const { icon } = options || {};
6797
- const attribute = getAttributeByName(attributeName, attributes);
6798
- const text = (attribute?.value || elementConfig?.value);
6799
- return text ? (jsx(Tooltip, { placement: "top", arrow: true, content: text, children: ref => jsx(TooltipIcon, { kind: icon || "question", ref: ref }) })) : null;
7377
+ const { options } = elementConfig || {};
7378
+ const { twoColumns, chartId, relatedDataSources } = options || {};
7379
+ const chartElement = useMemo(() => returnFound(element?.children, { id: chartId }), [chartId, element?.children]);
7380
+ const { data, loading } = useChartData({
7381
+ element: chartElement,
7382
+ type,
7383
+ });
7384
+ const legendData = useMemo(() => {
7385
+ if (!data[0]?.items?.length)
7386
+ return [];
7387
+ const relatedAttributes = relatedDataSources || [];
7388
+ const isRelated = !!relatedAttributes?.length;
7389
+ return isRelated
7390
+ ? data[0].items
7391
+ : data[0].items.map(item => {
7392
+ const attribute = attributes?.find(({ name }) => name === item.name);
7393
+ return { ...item, name: attribute?.alias || item.name };
7394
+ });
7395
+ }, [attributes, data, relatedDataSources]);
7396
+ return !chartElement?.options?.expanded || expandedContainers?.[chartElement.id] ? (jsx(ChartLegend, { data: legendData, loading: loading, chartElement: chartElement, twoColumns: twoColumns, type: type })) : null;
6800
7397
  });
6801
7398
 
6802
7399
  const ExternalLink = styled(IconButton).attrs(() => ({
@@ -6867,197 +7464,272 @@ const ElementLink = memo(({ type, elementConfig }) => {
6867
7464
  return link.startsWith("http") ? jsx(ExternalLink, { onClick: () => window.open(link) }) : jsx(LocalLink, { link: link });
6868
7465
  });
6869
7466
 
6870
- const ImageContainerButton = styled(FlatButton) `
6871
- min-height: 1.5rem;
6872
- border-radius: ${({ theme: { borderRadius } }) => borderRadius.large};
6873
- background-color: ${({ theme: { palette } }) => palette.primary};
6874
- text-transform: none;
7467
+ const SmallPreviewContainer = styled.div `
7468
+ width: 100%;
7469
+ height: 100%;
7470
+ `;
7471
+
7472
+ const ElementSlideshow = ({ elementConfig, type, renderElement }) => {
7473
+ const { expandedContainers, dataSources, attributes } = useWidgetContext(type);
7474
+ const [currentIndex, setCurrentIndex] = useState(0);
7475
+ const [isOpenGallery, toggleGallery] = useToggle();
7476
+ const { id, options, attributeName } = elementConfig || {};
7477
+ const { expandable, expanded, relatedDataSource } = options || {};
7478
+ const isVisible = isVisibleContainer(id, expandable, expanded, expandedContainers);
7479
+ const images = useMemo(() => {
7480
+ const dataSource = relatedDataSource ? dataSources?.find(({ name }) => name === relatedDataSource) : null;
7481
+ const array = dataSource
7482
+ ? dataSource.features.map(feature => feature.attributes[attributeName])
7483
+ : getSlideshowImages({
7484
+ element: elementConfig,
7485
+ attribute: attributes?.find(({ name }) => name === attributeName),
7486
+ });
7487
+ return (array?.map(image => ({
7488
+ src: image,
7489
+ fileName: image,
7490
+ })) || []);
7491
+ }, [attributeName, attributes, dataSources, elementConfig, relatedDataSource]);
7492
+ return (jsxs(Fragment$1, { children: [jsx(ExpandableTitle, { elementConfig: elementConfig, type: type, renderElement: renderElement }), isVisible && (jsxs(SmallPreviewContainer, { children: [jsx(SmallPreview, { images: images, currentIndex: currentIndex, setCurrentIndex: setCurrentIndex, onClick: toggleGallery }), isOpenGallery && (jsx(Preview, { images: images,
7493
+ // currentIndex={currentIndex}
7494
+ // totalCount={images.length}
7495
+ isOpen: isOpenGallery, onClose: toggleGallery }))] }))] }));
7496
+ };
7497
+
7498
+ const ElementSvg = memo(({ type, elementConfig }) => {
7499
+ const { layerInfo, attributes } = useWidgetContext(type);
7500
+ const { options } = elementConfig || {};
7501
+ const { width, height, fontColor } = options || {};
7502
+ return (jsx(SvgImage, { url: getSvgUrl({ elementConfig, layerInfo, attributes }), width: width, height: height, fontColor: fontColor }));
7503
+ });
7504
+
7505
+ const TooltipIcon = styled(Icon) `
7506
+ &&& {
7507
+ :after {
7508
+ font-size: 0.75rem;
7509
+ color: ${({ theme: { palette } }) => palette.iconDisabled};
7510
+ transition: color ${transition.hover};
7511
+ }
6875
7512
 
6876
- :hover {
6877
- background-color: ${({ theme: { palette } }) => palette.primaryDeep};
7513
+ :hover:after {
7514
+ color: ${({ theme: { palette } }) => palette.icon};
7515
+ }
6878
7516
  }
6879
7517
  `;
6880
7518
 
6881
- const ElementButton = memo(({ type, elementConfig }) => {
7519
+ const ElementTooltip = memo(({ type, elementConfig }) => {
6882
7520
  const { attributes } = useWidgetContext(type);
6883
- const attribute = getAttributeByName(elementConfig?.attributeName, attributes);
6884
- const link = attribute?.value;
6885
- if (!link || typeof link !== "string")
6886
- return null;
6887
- return (jsx(ImageContainerButton, { onClick: () => window.open(attribute?.value), children: elementConfig.value || "" }));
7521
+ const { attributeName, options } = elementConfig || {};
7522
+ const { icon } = options || {};
7523
+ const attribute = getAttributeByName(attributeName, attributes);
7524
+ const text = (attribute?.value || elementConfig?.value);
7525
+ return text ? (jsx(Tooltip$1, { placement: "top", arrow: true, content: text, children: ref => jsx(TooltipIcon, { kind: icon || "question", ref: ref }) })) : null;
6888
7526
  });
6889
7527
 
6890
- const NoLiveSnapshot = () => {
6891
- return (jsxs(NoLiveSnapshotContainer, { children: [jsx(Icon, { kind: "alert" }), jsx(Description, { children: "\u0421\u043D\u0438\u043C\u043E\u043A \u043D\u0435 \u0434\u043E\u0441\u0442\u0443\u043F\u0435\u043D" })] }));
6892
- };
6893
-
6894
- const DEFAULT_ARCHIVED_PERIOD = "#24h";
6895
- const SNAPSHOTS_PER_PAGE = 10;
6896
- const getDuration = (archivePeriod) => {
6897
- const lastLetter = archivePeriod[archivePeriod.length - 1];
6898
- const value = archivePeriod.slice(1, -1);
6899
- const prop = lastLetter === "d"
6900
- ? "days"
6901
- : lastLetter === "h"
6902
- ? "hours"
6903
- : lastLetter === "m"
6904
- ? "minutes"
6905
- : lastLetter === "s"
6906
- ? "seconds"
6907
- : null;
6908
- if (!lastLetter || !value || !prop)
6909
- return {};
6910
- return { [prop]: Number(value) };
6911
- };
6912
- const useCameraAttribute = (cameraId) => {
6913
- const { api } = useGlobalContext();
6914
- const [currentIndex, setCurrentIndex] = useState(0);
6915
- const [currentPage, setCurrentPage] = useState(0);
6916
- const [timeline, setTimeline] = useState([]);
6917
- const [isLoadingSnapshot, setLoadingSnapshot] = useState(false);
6918
- const [isLoadingTimeline, setLoadingTimeline] = useState(false);
6919
- const [isOpenGallery, toggleGallery] = useToggle();
6920
- const [galleryImages, setGalleryImages] = useState([]);
6921
- const imagesRef = useRef([]);
6922
- // Todo get archivePeriod from project configuration
6923
- const archivePeriod = /* appConfig?.settings?.cameraAttribute?.archivePeriod ||*/ DEFAULT_ARCHIVED_PERIOD;
6924
- const onNextPage = useCallback(() => {
6925
- setCurrentPage(currentPage + 1);
6926
- }, [currentPage]);
6927
- useEffect(() => {
6928
- (async () => {
6929
- if (!cameraId)
6930
- return;
6931
- setLoadingSnapshot(true);
6932
- const snapshot = null; // await api.cameras.getLiveSnapshot(cameraId);
6933
- const url = URL.createObjectURL(snapshot);
6934
- setLoadingSnapshot(false);
6935
- setLoadingTimeline(true);
6936
- imagesRef.current = [
6937
- {
6938
- src: url,
6939
- startTime: new Date(),
6940
- },
6941
- ];
6942
- setGalleryImages([
6943
- {
6944
- src: url,
6945
- fileName: formatDate$1(new Date()),
6946
- },
6947
- ]);
6948
- const formatDateOptions = { dateFormat: DateFormat.UTC };
6949
- const startTime = formatDate$1(sub(new Date(), getDuration(archivePeriod)), formatDateOptions);
6950
- const endTime = formatDate$1(new Date(), formatDateOptions);
6951
- const timelineResponse = await api.cameras.getArchiveTimeline({ cameraId, startTime, endTime });
6952
- if (!timelineResponse.success || !timelineResponse.timeline.length)
6953
- return;
6954
- timelineResponse.timeline.reverse();
6955
- setTimeline(timelineResponse.timeline);
6956
- })();
6957
- }, [cameraId]);
6958
- useEffect(() => {
6959
- if (!timeline.length)
6960
- return;
6961
- const timelinePage = timeline.slice(currentPage * SNAPSHOTS_PER_PAGE, (currentPage + 1) * SNAPSHOTS_PER_PAGE);
6962
- for (const item of timelinePage) {
6963
- if (!item)
6964
- continue;
6965
- api.cameras
6966
- .getArchiveSnapshot({
6967
- cameraId,
6968
- time: item.startTime,
6969
- })
6970
- .then(response => {
6971
- const newImages = [
6972
- ...imagesRef.current,
6973
- { src: URL.createObjectURL(response), startTime: new Date(item.startTime) },
6974
- ];
6975
- newImages.sort((a, b) => (a.startTime < b.startTime ? 1 : a.startTime > b.startTime ? -1 : 0));
6976
- imagesRef.current = newImages;
6977
- setGalleryImages(newImages.map(newImage => ({
6978
- src: newImage.src,
6979
- fileName: formatDate$1(newImage.startTime, { dateFormat: DateFormat.DateTime }),
6980
- })));
6981
- if (newImages.length === timelinePage.length) {
6982
- setLoadingTimeline(false);
6983
- }
6984
- });
6985
- }
6986
- }, [timeline, currentPage]);
7528
+ const SlideshowHeaderWrapper = styled.div `
7529
+ padding: ${({ withPadding }) => (withPadding ? "0.5rem 0.5rem 0" : 0)};
7530
+
7531
+ ${Header} {
7532
+ align-items: flex-start;
7533
+ width: calc(100% + 2rem);
7534
+ height: ${({ big }) => (big ? "15.5rem" : "auto")};
7535
+ padding: 1.5rem;
7536
+ margin: -1rem -1rem 0 -1rem;
7537
+ border-radius: ${({ theme: { borderRadius } }) => borderRadius.medium};
7538
+
7539
+ ${SmallPreviewCounter} {
7540
+ bottom: ${({ withPadding }) => (withPadding ? 0.625 : 1.125)}rem;
7541
+ }
7542
+
7543
+ :before,
7544
+ :after {
7545
+ content: "";
7546
+ z-index: 2;
7547
+ position: absolute;
7548
+ top: 0;
7549
+ left: 0;
7550
+ width: 100%;
7551
+ }
7552
+
7553
+ :before {
7554
+ height: 100%;
7555
+ background: rgba(32, 46, 53, 0.25);
7556
+ }
7557
+
7558
+ :after {
7559
+ height: 4.5rem;
7560
+ background: linear-gradient(180deg, #000000 0%, rgba(0, 0, 0, 0) 100%);
7561
+ }
7562
+
7563
+ :hover {
7564
+ ${SmallPreviewControl}, ${SmallPreviewCounter} {
7565
+ opacity: 1;
7566
+ }
7567
+ }
7568
+ }
7569
+ `;
7570
+ const ImageContainerBg = styled.div `
7571
+ position: absolute;
7572
+ top: 0;
7573
+ bottom: 0;
7574
+ left: 0;
7575
+ right: 0;
7576
+
7577
+ img {
7578
+ width: 100%;
7579
+ height: 100%;
7580
+ object-position: center;
7581
+ object-fit: cover;
7582
+ }
7583
+ `;
7584
+ const HeaderSlideshow = styled.div `
7585
+ position: absolute;
7586
+ top: 0;
7587
+ bottom: ${({ height }) => (height ? `${height}px` : 0)};
7588
+ left: 0;
7589
+ right: 0;
7590
+
7591
+ img {
7592
+ width: 100%;
7593
+ height: 100%;
7594
+ min-height: inherit;
7595
+ object-position: center;
7596
+ object-fit: cover;
7597
+ }
7598
+ `;
7599
+
7600
+ const FeatureCardSlideshowHeader = ({ isRow }) => {
7601
+ const { layerInfo } = useWidgetContext(WidgetType.FeatureCard);
7602
+ const { config } = useWidgetConfig(WidgetType.FeatureCard);
7603
+ const { header, options } = config || {};
7604
+ const renderElement = useHeaderRender(header);
7605
+ return (jsx(SlideshowHeaderWrapper, { big: true, withPadding: options?.withPadding, children: jsx(ThemeProvider, { theme: darkTheme, children: jsxs(Header, { "$isRow": isRow, children: [jsxs(HeaderFrontView, { children: [jsxs(HeaderContainer, { children: [jsx(LayerIcon, { layerInfo: layerInfo }), jsx(FeatureCardTitle, { title: renderElement({
7606
+ id: "title",
7607
+ wrap: false,
7608
+ }), description: renderElement({
7609
+ id: "description",
7610
+ wrap: false,
7611
+ }) })] }), jsx(FeatureCardButtons, {})] }), jsx(ImageContainerBg, { children: renderElement({
7612
+ id: "bgImage",
7613
+ wrap: false,
7614
+ }) }), jsx(HeaderSlideshow, { height: options?.height, children: renderElement({
7615
+ id: "slideshow",
7616
+ wrap: false,
7617
+ }) })] }) }) }));
7618
+ };
7619
+
7620
+ const getDashboardHeader = (templateName) => {
7621
+ switch (templateName) {
7622
+ case HeaderTemplate.Default:
7623
+ default:
7624
+ return DashboardDefaultHeader;
7625
+ }
7626
+ };
7627
+
7628
+ const getDataFromAttributes = (t, config, attributes) => {
7629
+ const colors = config?.options?.colors || FEATURE_CARD_DEFAULT_COLORS;
7630
+ const data = config?.children?.map(({ attributeName }, index) => {
7631
+ const attribute = attributes?.find(({ name }) => name === attributeName);
7632
+ return {
7633
+ name: attribute?.name || "",
7634
+ value: attribute ? Number(attribute.value) : 0,
7635
+ color: colors[index] || FEATURE_CARD_OTHER_COLOR
7636
+ };
7637
+ });
7638
+ if (config?.options?.orderByValue) {
7639
+ data.sort((a, b) => b.value - a.value);
7640
+ }
7641
+ const isOtherSliced = config?.options?.otherItems && config.options.otherItems < data.length;
7642
+ if (!isOtherSliced)
7643
+ return data;
7644
+ const otherValue = data
7645
+ .slice(0, config?.options?.otherItems)
7646
+ .reduce((prev, { value }) => prev + value, 0);
6987
7647
  return [
7648
+ ...data?.slice(0, config.options?.otherItems),
6988
7649
  {
6989
- currentIndex,
6990
- currentPage,
6991
- totalCount: timeline.length,
6992
- galleryImages,
6993
- isLoadingSnapshot,
6994
- isLoadingTimeline,
6995
- isOpenGallery,
6996
- },
6997
- {
6998
- toggleGallery,
6999
- setGalleryImages,
7000
- setCurrentIndex,
7001
- onNextPage,
7002
- },
7650
+ name: t("other", { ns: "dashboard" }),
7651
+ color: FEATURE_CARD_OTHER_COLOR,
7652
+ value: Number(otherValue)
7653
+ }
7003
7654
  ];
7004
7655
  };
7005
7656
 
7006
- const ElementCamera = ({ type, renderElement, elementConfig, field }) => {
7007
- const { expandedContainers, attributes } = useWidgetContext(type);
7008
- const attribute = getAttributeByName(elementConfig?.attributeName, attributes);
7009
- const value = attribute?.value;
7010
- const { id, options } = elementConfig || {};
7011
- const { expandable, expanded } = options || {};
7012
- const isVisible = isVisibleContainer(id, expandable, expanded, expandedContainers);
7013
- const [{ currentIndex /* , currentPage*/, totalCount, galleryImages, isLoadingSnapshot, isLoadingTimeline, isOpenGallery }, { setCurrentIndex, toggleGallery, onNextPage },] = useCameraAttribute(value);
7014
- return (jsxs(Fragment$1, { children: [jsx(ExpandableTitle, { elementConfig: elementConfig, type: type, renderElement: renderElement }), isVisible && (jsxs(Fragment$1, { children: [!!field && jsx(AttributeLabel, { children: field }), jsx(AttributeGalleryContainer, { children: isLoadingSnapshot ? (jsx(LinearProgressContainer, { children: jsx(LinearProgress, {}) })) : !galleryImages?.length && !isLoadingTimeline ? (jsx(NoLiveSnapshot, {})) : (jsx(SmallPreview, { images: galleryImages, totalCount: totalCount, currentIndex: currentIndex, isLoading: isLoadingTimeline, setCurrentIndex: setCurrentIndex, onClick: toggleGallery, onNextPage: onNextPage })) }), isOpenGallery && (jsx(Preview, { images: galleryImages,
7015
- // currentIndex={currentIndex}
7016
- // currentPage={currentPage}
7017
- // totalCount={totalCount}
7018
- isOpen: isOpenGallery,
7019
- // isLoading={isLoadingTimeline}
7020
- // hasSidebar
7021
- onClose: toggleGallery }))] }))] }));
7657
+ const getDataFromRelatedFeatures = ({ t, config, filters, relatedConfig, dataSource, layerInfo }) => {
7658
+ if (!dataSource || !dataSource?.features?.length) {
7659
+ return [];
7660
+ }
7661
+ const { colors } = config.options;
7662
+ const layerDefinition = getLayerDefinition(layerInfo);
7663
+ let data = JSON.parse(JSON.stringify(dataSource?.features));
7664
+ const sortAttribute = config?.options?.orderByValue
7665
+ ? relatedConfig.attributeName
7666
+ : config?.options?.orderByTitle
7667
+ ? relatedConfig.attributeTitle
7668
+ : null;
7669
+ if (sortAttribute) {
7670
+ data.sort((a, b) => b.attributes[sortAttribute] - a.attributes[sortAttribute]);
7671
+ }
7672
+ const isOtherSliced = config?.options?.otherItems && config.options.otherItems < data.length;
7673
+ const otherValue = isOtherSliced
7674
+ ? data
7675
+ .slice(config.options.otherItems)
7676
+ .reduce((prev, { attributes }) => prev + attributes[relatedConfig.attributeName], 0)
7677
+ : null;
7678
+ if (isOtherSliced) {
7679
+ data = data.slice(0, config?.options?.otherItems);
7680
+ }
7681
+ const gradientArray = relatedConfig.chartAxis && colors?.length < data.length
7682
+ ? new Gradient()
7683
+ .setColorGradient(colors[0], colors[colors.length - 1])
7684
+ .setMidpoint(data.length)
7685
+ .getColors()
7686
+ : colors;
7687
+ const filter = getConfigFilter(relatedConfig?.filterName, filters);
7688
+ const result = data.reduce((acc, feature, index) => {
7689
+ if (relatedConfig?.filterName && !filter) {
7690
+ return acc;
7691
+ }
7692
+ const attributeName = feature.attributes[relatedConfig.attributeName];
7693
+ const attributeTitle = feature.attributes[relatedConfig.attributeTitle];
7694
+ const attributeColor = feature.attributes[relatedConfig.attributeColor];
7695
+ return [
7696
+ ...acc,
7697
+ {
7698
+ name: formatAttributeValue({
7699
+ t,
7700
+ type: layerDefinition.attributes[relatedConfig.attributeTitle]?.type,
7701
+ value: attributeTitle,
7702
+ stringFormat: layerDefinition.attributes[relatedConfig.attributeTitle]?.stringFormat
7703
+ }),
7704
+ value: attributeName === null ? null : Number(attributeName),
7705
+ color: attributeColor || gradientArray?.[index] || FEATURE_CARD_OTHER_COLOR,
7706
+ min: filter?.attributeMin ? feature.attributes[filter.attributeMin] : null,
7707
+ max: filter?.attributeMin ? feature.attributes[filter.attributeMax] : null
7708
+ }
7709
+ ];
7710
+ }, []);
7711
+ if (isOtherSliced) {
7712
+ result.push({
7713
+ name: t("other", { ns: "dashboard" }),
7714
+ color: FEATURE_CARD_OTHER_COLOR,
7715
+ value: Number(otherValue)
7716
+ });
7717
+ }
7718
+ return result;
7022
7719
  };
7023
7720
 
7024
- const ElementChart = memo(({ type, elementConfig, renderElement }) => {
7025
- const { config } = useWidgetConfig(type);
7026
- return (jsx(Chart, { type: type, config: config, elementConfig: elementConfig, element: elementConfig, renderElement: renderElement }));
7027
- });
7028
-
7029
- const ElementLegend = memo(({ type, element, elementConfig, expandedContainers }) => {
7030
- const { attributes } = useWidgetContext(type);
7031
- const { options } = elementConfig || {};
7032
- const { twoColumns, chartId, relatedDataSources } = options || {};
7033
- const chartElement = useMemo(() => returnFound(element?.children, { id: chartId }), [chartId, element?.children]);
7034
- const { data, loading } = useChartData({
7035
- element: chartElement,
7036
- type,
7037
- });
7038
- const legendData = useMemo(() => {
7039
- if (!data[0]?.items?.length)
7040
- return [];
7041
- const relatedAttributes = relatedDataSources || [];
7042
- const isRelated = !!relatedAttributes?.length;
7043
- return isRelated
7044
- ? data[0].items
7045
- : data[0].items.map(item => {
7046
- const attribute = attributes?.find(({ name }) => name === item.name);
7047
- return { ...item, name: attribute?.alias || item.name };
7048
- });
7049
- }, [attributes, data, relatedDataSources]);
7050
- return !chartElement?.options?.expanded || expandedContainers?.[chartElement.id] ? (jsx(ChartLegend, { data: legendData, loading: loading, chartElement: chartElement, twoColumns: twoColumns, type: type })) : null;
7051
- });
7052
-
7053
- const ElementChips = memo(({ type, elementConfig }) => {
7054
- const { attributes } = useWidgetContext(type);
7055
- const { attributeName, options, style } = elementConfig || {};
7056
- const { separator, bgColor, fontColor, fontSize } = options || {};
7057
- const attribute = getAttributeByName(attributeName, attributes);
7058
- const tags = attribute?.value?.split(separator || ",");
7059
- return (jsx(DashboardChipsContainer, { style: style, children: tags?.map(tag => (jsx(DashboardChip$1, { text: tag, "$bgColor": bgColor, "$fontColor": fontColor, "$fontSize": fontSize, "$isDefault": true }, tag))) }));
7060
- });
7721
+ const getDefaultConfig = ({ title, defaultTitle, items, baseMapName, position, resolution, srid, }) => {
7722
+ const dashboardConfiguration = JSON.parse(JSON.stringify(DEFAULT_DASHBOARD_CONFIG));
7723
+ const defaultPages = JSON.parse(JSON.stringify(DEFAULT_PAGES_CONFIG));
7724
+ const defaultPage = createConfigPage({ title, baseMapName, position, resolution, defaultTitle });
7725
+ if (items?.length) {
7726
+ const contentItems = items.map(item => createConfigLayer(item.name));
7727
+ defaultPage.layers.push(...contentItems);
7728
+ }
7729
+ defaultPages.children.push(defaultPage);
7730
+ dashboardConfiguration.children.push(defaultPages);
7731
+ return dashboardConfiguration;
7732
+ };
7061
7733
 
7062
7734
  const elementComponents = {
7063
7735
  image: ElementImage,
@@ -7150,6 +7822,20 @@ function getFeatureAttributes(feature = {}, layer, dataSource) {
7150
7822
  });
7151
7823
  }
7152
7824
 
7825
+ const getFeatureCardHeader = (templateName) => {
7826
+ switch (templateName) {
7827
+ case HeaderTemplate.Slideshow:
7828
+ return FeatureCardSlideshowHeader;
7829
+ case HeaderTemplate.Gradient:
7830
+ return FeatureCardGradientHeader;
7831
+ case HeaderTemplate.Icon:
7832
+ return FeatureCardIconHeader;
7833
+ case HeaderTemplate.Default:
7834
+ default:
7835
+ return FeatureCardDefaultHeader;
7836
+ }
7837
+ };
7838
+
7153
7839
  const RangeNumberFilter = ({ type, filter }) => {
7154
7840
  const { t } = useGlobalContext();
7155
7841
  const { filters, changeFilters } = useWidgetContext(type);
@@ -7848,7 +8534,7 @@ const pieChartTooltipFromAttributes = (t, data, attributes) => {
7848
8534
  const pieChartTooltipFromRelatedFeatures = (t, data, relatedAttributes, layerInfo) => {
7849
8535
  if (!data?.length)
7850
8536
  return "";
7851
- return (jsx(ThemeProvider, { children: jsxs(ChartTooltip, { children: [jsx(ChartTooltipColor, { "$color": data[0].color }), jsxs("div", { children: [data[0].name, " \u00A0 ", formatChartRelatedValue(t, data[0].value, layerInfo, relatedAttributes)] })] }) }));
8537
+ return (jsx(ThemeProvider, { children: jsxs(ChartTooltip, { alignItems: "center", children: [jsx(ChartTooltipColor, { "$color": data[0].color }), jsxs("div", { children: [data[0].name, " \u00A0 ", formatChartRelatedValue(t, data[0].value, layerInfo, relatedAttributes)] })] }) }));
7852
8538
  };
7853
8539
 
7854
8540
  const removeDataSource = (dashboardConfiguration, name, pageIndex) => {
@@ -7932,6 +8618,7 @@ const useWidgetPage = (type = WidgetType.Dashboard) => {
7932
8618
  const page = getPagesFromConfig(config)?.[pageIndex - 1];
7933
8619
  return {
7934
8620
  ...(page || {}),
8621
+ header: page?.header || config.header,
7935
8622
  dataSources: [
7936
8623
  ...(page?.dataSources?.filter(({ name }) => !config.dataSources?.some(item => item.name === name)) || []),
7937
8624
  ...(config.dataSources || [])
@@ -8046,12 +8733,29 @@ const useChartData = ({ element, type }) => {
8046
8733
  return { data, loading };
8047
8734
  };
8048
8735
 
8049
- const useDashboardHeader = (renderElement) => {
8736
+ const useHeaderRender = (elementConfig, type = WidgetType.Dashboard) => {
8737
+ const { layerInfo, attributes, expandedContainers, selectedTabId, setSelectedTabId } = useWidgetContext(type);
8738
+ const { config } = useWidgetConfig(type);
8739
+ const { pageIndex } = useWidgetPage(type);
8740
+ return useMemo(() => getRenderElement({
8741
+ config,
8742
+ elementConfig,
8743
+ attributes,
8744
+ layerInfo,
8745
+ expandedContainers,
8746
+ selectedTabId,
8747
+ setSelectedTabId,
8748
+ pageIndex,
8749
+ }), [config, elementConfig, attributes, layerInfo, expandedContainers, selectedTabId, setSelectedTabId, pageIndex]);
8750
+ };
8751
+
8752
+ const useDashboardHeader = () => {
8050
8753
  const { themeName } = useGlobalContext();
8051
8754
  const { projectInfo } = useWidgetContext();
8052
8755
  const { currentPage } = useWidgetPage();
8053
8756
  const { alias, name } = projectInfo || {};
8054
8757
  const { id: pageId, header } = currentPage || {};
8758
+ const renderElement = useHeaderRender(header);
8055
8759
  const image = useMemo(() => (header?.children?.some(({ id }) => id === "image") ? renderElement({ id: "image", wrap: false }) : null), [header?.children, renderElement]);
8056
8760
  const icon = useMemo(() => header?.children?.some(({ id }) => id === "icon") ? (renderElement({ id: "icon", wrap: false })) : (jsx(Icon, { kind: "logo", style: { width: "2rem", height: "2rem" } })), [header?.children, renderElement]);
8057
8761
  const title = useMemo(() => header?.children?.some(({ id }) => id === "title") ? renderElement({ id: "title" }) : currentPage?.options?.title, [header?.children, renderElement, currentPage?.options?.title]);
@@ -8065,6 +8769,7 @@ const useDashboardHeader = (renderElement) => {
8065
8769
  tooltip,
8066
8770
  description,
8067
8771
  themeName,
8772
+ renderElement,
8068
8773
  };
8069
8774
  };
8070
8775
 
@@ -8411,12 +9116,12 @@ const StackBar = ({ data, filterName, type, alias, options, renderElement, rende
8411
9116
  const units = attribute?.stringFormat?.unitsLabel;
8412
9117
  const total = useMemo(() => items?.reduce((result, { value }) => result + Number(value), 0) || 0, [items]);
8413
9118
  const getWidth = useCallback(value => ((Number(value) / total) * 100).toFixed(2), [total]);
8414
- const renderGroupTooltip = useMemo(() => (jsx(ThemeProvider, { children: jsx(ChartTooltipTable, { cellPadding: 0, cellSpacing: 0, children: items?.map(({ name, value, color }, index) => (jsxs("tr", { children: [jsx("td", { children: jsxs(ChartTooltip, { children: [jsx(ChartTooltipColor, { "$color": color }), jsx(ChartTooltipName, { children: name })] }) }), jsx("td", { children: value })] }, index))) }) })), [items]);
9119
+ const renderGroupTooltip = useMemo(() => (jsx(ThemeProvider, { children: jsx(ChartTooltipTable, { cellPadding: 0, cellSpacing: 0, children: items?.map(({ name, value, color }, index) => (jsxs("tr", { children: [jsx("td", { children: jsxs(ChartTooltip, { alignItems: "center", children: [jsx(ChartTooltipColor, { "$color": color }), jsx(ChartTooltipName, { children: name })] }) }), jsx("td", { children: value })] }, index))) }) })), [items]);
8415
9120
  const renderItem = useCallback(({ name, value, color }, ref) => (jsx(StackBarSection, { ref: ref, "$width": getWidth(value), "$height": height, "$color": color, cornerRadius: cornerRadius, hasAnyFilter: hasAnyFilter, isFiltered: isFiltered(name), onClick: filterName ? () => onFilter(name) : undefined })), [cornerRadius, filterName, getWidth, hasAnyFilter, height, isFiltered, onFilter]);
8416
- const renderItems = useMemo(() => (jsx(Fragment$1, { children: items?.map((item, index) => (jsx(Fragment, { children: groupTooltip ? (renderItem(item)) : (jsx(ThemeProvider, { children: jsx(Tooltip, { placement: "top", arrow: true, content: renderTooltip([item]), children: ref => renderItem(item, ref) }) })) }, index))) })), [groupTooltip, items, renderItem, renderTooltip]);
9121
+ const renderItems = useMemo(() => (jsx(Fragment$1, { children: items?.map((item, index) => (jsx(Fragment, { children: groupTooltip ? (renderItem(item)) : (jsx(ThemeProvider, { children: jsx(Tooltip$1, { placement: "top", arrow: true, content: renderTooltip([item]), children: ref => renderItem(item, ref) }) })) }, index))) })), [groupTooltip, items, renderItem, renderTooltip]);
8417
9122
  if (!total || !attribute)
8418
9123
  return null;
8419
- return (jsxs(Fragment$1, { children: [(alias || showTotal) && (jsxs(StackBarHeader, { children: [jsx(StackBarAlias, { children: renderElement({ id: "alias" }) }), showTotal && (jsxs(StackBarTotal, { children: [jsx(StackBarValue, { children: formatAttributeValue({ t, type: attribute.type, value: total, stringFormat: attribute.stringFormat, noUnits: true }) }), !!units && jsx(StackBarUnits, { children: units })] }))] })), groupTooltip ? (jsx(Tooltip, { placement: "top", arrow: true, content: renderGroupTooltip, children: ref => jsx(StackBarContainer, { ref: ref, children: renderItems }) })) : (jsx(StackBarContainer, { children: renderItems }))] }));
9124
+ return (jsxs(Fragment$1, { children: [(alias || showTotal) && (jsxs(StackBarHeader, { children: [jsx(StackBarAlias, { children: renderElement({ id: "alias" }) }), showTotal && (jsxs(StackBarTotal, { children: [jsx(StackBarValue, { children: formatAttributeValue({ t, type: attribute.type, value: total, stringFormat: attribute.stringFormat, noUnits: true }) }), !!units && jsx(StackBarUnits, { children: units })] }))] })), groupTooltip ? (jsx(Tooltip$1, { placement: "top", arrow: true, content: renderGroupTooltip, children: ref => jsx(StackBarContainer, { ref: ref, children: renderItems }) })) : (jsx(StackBarContainer, { children: renderItems }))] }));
8420
9125
  };
8421
9126
 
8422
9127
  const Chart = memo(({ config, element, elementConfig, type, renderElement }) => {
@@ -8444,16 +9149,11 @@ const Chart = memo(({ config, element, elementConfig, type, renderElement }) =>
8444
9149
  const isRelated = !!relatedAttributes?.length;
8445
9150
  const { data, loading } = useChartData({ element, type });
8446
9151
  const totalWidthFromBarWidth = (data[0]?.items?.length || 0) * (barWidth + padding);
8447
- const width = options?.width
8448
- ? options.width > MAX_CHART_WIDTH
8449
- ? MAX_CHART_WIDTH
8450
- : options.width
8451
- : isStackBar
9152
+ const width = options?.width ? options.width :
9153
+ isStackBar
8452
9154
  ? "100%"
8453
9155
  : isBarChart
8454
- ? totalWidthFromBarWidth < MAX_CHART_WIDTH
8455
- ? MAX_CHART_WIDTH
8456
- : totalWidthFromBarWidth
9156
+ ? totalWidthFromBarWidth || MAX_CHART_WIDTH
8457
9157
  : DEFAULT_CHART_WIDTH;
8458
9158
  const [customize] = useChartChange({
8459
9159
  dataSources: config.dataSources,
@@ -8482,13 +9182,13 @@ const Chart = memo(({ config, element, elementConfig, type, renderElement }) =>
8482
9182
  return result?.filter((name, index) => result.indexOf(name) === index);
8483
9183
  }, [data, isLineChart]);
8484
9184
  const renderLineChartTooltip = useCallback((items, { indexX }) => {
8485
- return (jsx(ThemeProvider, { children: jsxs(ChartTooltip, { children: [jsx("div", { children: labels[indexX] }), items
8486
- .filter(({ value }) => !isEmptyValue(value))
8487
- ?.map(({ layerName, attributeName, value, stroke }, index) => {
8488
- const layerInfo = layerInfos?.find(({ name }) => name === layerName);
8489
- const attribute = layerInfo?.layerDefinition.attributes[attributeName];
8490
- return (jsxs(ChartTooltipRow, { children: [jsx(ChartLegendColor$1, { "$color": stroke }), jsx(ChartLegendValue, { children: attribute ? formatAttributeValue({ t, type: attribute.type, value, stringFormat: attribute.stringFormat }) : value })] }, index));
8491
- })] }) }));
9185
+ return (jsxs(Tooltip, { children: [jsx(ChartTooltipLabel, { children: labels[indexX] }), items
9186
+ .filter(({ value }) => !isEmptyValue(value))
9187
+ ?.map(({ layerName, attributeName, value, stroke }, index) => {
9188
+ const layerInfo = layerInfos?.find(({ name }) => name === layerName);
9189
+ const attribute = layerInfo?.layerDefinition.attributes[attributeName];
9190
+ return (jsxs(ChartTooltipRow, { children: [jsx(ChartLegendColor$1, { "$color": stroke }), jsx(ChartLegendValue, { children: attribute ? formatAttributeValue({ t, type: attribute.type, value, stringFormat: attribute.stringFormat }) : value })] }, index));
9191
+ })] }));
8492
9192
  }, [labels, layerInfos]);
8493
9193
  const markers = useMemo(() => getChartMarkers(data[0]?.items, configMarkers), [data, configMarkers]);
8494
9194
  const formatTooltipName = useCallback((name) => (isRelated ? name : tooltipNameFromAttributes(name, formattedAttributes)), [formattedAttributes, isRelated]);
@@ -8512,16 +9212,16 @@ const Chart = memo(({ config, element, elementConfig, type, renderElement }) =>
8512
9212
  .flat()
8513
9213
  .map(({ values }) => values)
8514
9214
  .flat();
8515
- return (jsx(AnyChartWrapper, { height: height, children: jsx(LineChart, { data: lineChartData, labels: labels, width: +width, height: height, xAxisPadding: 15, yAxisPadding: 0, min: Math.min(...chartValues), customYAxisSelection: yAxis => {
8516
- if (isHidedY) {
8517
- yAxis.remove();
8518
- }
8519
- }, customYAxis: yAxis => yAxis.ticks(4), renderTooltip: renderLineChartTooltip, customize: customize, dynamicTooltipEnable: true, stackedTooltip: true, drawGridX: !isHidedY, margin: {
8520
- top: 0,
8521
- right: 0,
8522
- bottom: 0,
8523
- left: 0
8524
- } }) }));
9215
+ return (jsxs(AnyChartWrapper, { height: height, children: [jsx(LineChartTooltipStyles, {}), jsx(LineChart, { data: lineChartData, labels: labels, width: +width, height: height, xAxisPadding: 15, yAxisPadding: 0, min: Math.min(...chartValues), customYAxisSelection: yAxis => {
9216
+ if (isHidedY) {
9217
+ yAxis.remove();
9218
+ }
9219
+ }, customYAxis: yAxis => yAxis.ticks(4), renderTooltip: renderLineChartTooltip, customize: customize, dynamicTooltipEnable: true, stackedTooltip: true, tooltipClassName: "dashboardLineChartTooltip", drawGridX: !isHidedY, margin: {
9220
+ top: 0,
9221
+ right: 0,
9222
+ bottom: 0,
9223
+ left: 0
9224
+ } })] }));
8525
9225
  }
8526
9226
  if (isStackBar) {
8527
9227
  return (jsx(AnyChartWrapper, { height: height, children: jsx(StackBar, { data: data, filterName: filterName, type: type, alias: elementConfig?.children?.find(child => child.id === "alias"), options: options, renderTooltip: renderPieChartTooltip, renderElement: renderElement }) }));
@@ -8534,16 +9234,17 @@ const Chart = memo(({ config, element, elementConfig, type, renderElement }) =>
8534
9234
  color: formatFilterColor(item.name, item.color, defaultColor)
8535
9235
  })) || []), width: +width, height: +width, padAngle: angle, outerRadius: radius, cornerRadius: cornerRadius, renderTooltip: renderPieChartTooltip, withTooltip: true, onClick: filterName ? item => onFilter(item.name) : undefined, children: showTotal && jsx(PieChartCenter, { children: totalWord || roundTotalSum(+totalSum) }) }) }));
8536
9236
  }
9237
+ const markersMargin = options?.showMarkers ? 10 : 0;
8537
9238
  const margin = {
8538
- top: 0,
8539
- right: 0,
8540
- bottom: markers?.length ? 20 : 0,
8541
- left: 0
9239
+ top: markersMargin,
9240
+ right: markersMargin,
9241
+ bottom: markers?.length ? 20 : markersMargin,
9242
+ left: markersMargin
8542
9243
  };
8543
- return (jsx(BarChartWrapper, { height: height + margin.bottom, children: jsx(BarChartContainer, { children: jsx(BarChart$1, { data: getDataFromFilterItems(data[0]?.items), colors: getColorsFromFilterItems(data[0]?.items, defaultColor, formatFilterColor), minValue: getMinValueFromFilterItems(data[0]?.items), markers: markers, width: +width, height: height, barWidth: barWidth, barPadding: padding, customXAxis: axis => axis.remove(), customYAxis: axis => axis.remove(), customBars: ({ bars }) => {
8544
- bars.attr("rx", radius);
8545
- bars.attr("ry", radius);
8546
- }, margin: margin, xAxisPadding: 0, yAxisPadding: 0, formatTooltipValue: formatTooltipValue, formatTooltipName: formatTooltipName, onBarClick: filterName ? item => onFilter(item.name) : undefined, hideTooltipGroupName: true, dynamicTooltipEnable: true, isBarTooltip: true }) }) }));
9244
+ return (jsx(BarChartWrapper, { height: height + margin.bottom, children: jsxs(BarChartContainer, { children: [jsx(BarChartStyles, {}), jsx(BarChart$1, { data: getDataFromFilterItems(data[0]?.items), colors: getColorsFromFilterItems(data[0]?.items, defaultColor, formatFilterColor), minValue: getMinValueFromFilterItems(data[0]?.items), markers: markers, width: +width, height: height, barWidth: barWidth, barPadding: padding, className: "dashboardBarChart", customXAxis: axis => axis.remove(), customYAxis: axis => !options?.showMarkers && axis.remove(), customBars: ({ bars }) => {
9245
+ bars.attr("rx", radius);
9246
+ bars.attr("ry", radius);
9247
+ }, margin: margin, xAxisPadding: 0, yAxisPadding: 0, formatTooltipValue: formatTooltipValue, formatTooltipName: formatTooltipName, hideTooltipGroupName: true, dynamicTooltipEnable: true, isBarTooltip: true, onBarClick: filterName ? item => onFilter(item.name) : undefined })] }) }));
8547
9248
  }, [
8548
9249
  element,
8549
9250
  isLineChart,
@@ -8592,7 +9293,7 @@ const ChartLegend = ({ data, chartElement, type, twoColumns, loading }) => {
8592
9293
  const showMoreBtn = !!shownItems && data.length > shownItems;
8593
9294
  if (!loading && !data?.length && !!hideEmpty)
8594
9295
  return null;
8595
- return (jsxs(Flex, { opacity: loading ? FILTERED_VALUE_OPACITY / 100 : 1, children: [jsx(ChartLegendContainer, { twoColumns: twoColumns, children: sliceItems(data)?.map(({ name, color }, index) => (jsxs(ChartLegendItem, { hasAnyFilter: hasAnyFilter, isFiltered: isFiltered(name), onClick: axes?.[0]?.filterName ? () => onFilter(name) : undefined, children: [jsx(ChartLegendColor, { color: color }), jsx(ChartLegendName, { "$fontColor": fontColor, children: name })] }, index))) }), showMoreBtn && (jsx(LegendToggler, { onClick: onShowMore, toggled: showMore, children: t("other", { ns: "dashboard" }) }))] }));
9296
+ return (jsxs(Flex, { flexDirection: "column", opacity: loading ? FILTERED_VALUE_OPACITY / 100 : 1, children: [jsx(ChartLegendContainer, { twoColumns: twoColumns, children: sliceItems(data)?.map(({ name, color }, index) => (jsxs(ChartLegendItem, { hasAnyFilter: hasAnyFilter, isFiltered: isFiltered(name), onClick: axes?.[0]?.filterName ? () => onFilter(name) : undefined, children: [jsx(ChartLegendColor, { color: color }), jsx(ChartLegendName, { "$fontColor": fontColor, children: name })] }, index))) }), showMoreBtn && (jsx(LegendToggler, { onClick: onShowMore, toggled: showMore, children: t("other", { ns: "dashboard" }) }))] }));
8596
9297
  };
8597
9298
 
8598
9299
  const ContainerChildren = memo(({ items, isColumn, isMain, renderElement }) => {
@@ -8633,6 +9334,12 @@ const DashboardCheckbox = ({ title, checked, onChange, }) => {
8633
9334
  return (jsxs(Fragment$1, { children: [jsx(AttributeLabel, { isEdit: !!onChange, forCheckbox: !!onChange, children: title }), onChange ? jsx(CardCheckbox, { checked: checked, label: label, onChange: onChange }) : label] }));
8634
9335
  };
8635
9336
 
9337
+ const DashboardHeader = memo(() => {
9338
+ const { currentPage } = useWidgetPage();
9339
+ const HeaderTemplate = useMemo(() => getDashboardHeader(currentPage?.header?.templateName), [currentPage?.header?.templateName]);
9340
+ return jsx(HeaderTemplate, {});
9341
+ });
9342
+
8636
9343
  const DataSourceError = ({ name }) => {
8637
9344
  const { t } = useGlobalContext();
8638
9345
  return (jsxs(DataSourceErrorContainer, { children: [jsx(Icon, { kind: "alert" }), jsxs("div", { children: [t("block", { ns: "dashboard" }), " \"", name, "\" ", t("isNotLoaded", { ns: "dashboard" })] })] }));
@@ -8649,6 +9356,50 @@ const ExpandableTitle = memo(({ elementConfig, type, renderElement }) => {
8649
9356
  return (jsx(TitleContainer, { containerId: id, elementConfig: titleElement, templateName: templateName, layerNames: layerNames, fontColor: fontColor, expandable: expandable, expanded: expanded, type: type, isVisible: isVisible, renderElement: renderElement }));
8650
9357
  });
8651
9358
 
9359
+ const FeatureCardButtons = () => {
9360
+ const { closeFeatureCard } = useWidgetContext(WidgetType.FeatureCard);
9361
+ return (jsx(FlexSpan, { children: jsx(IconButton, { kind: "close", style: {
9362
+ padding: 0,
9363
+ width: "1rem",
9364
+ }, onClick: closeFeatureCard }) }));
9365
+ };
9366
+
9367
+ const FeatureCardHeader = () => {
9368
+ const { currentPage } = useWidgetPage(WidgetType.FeatureCard);
9369
+ const HeaderTemplate = getFeatureCardHeader(currentPage?.header?.templateName);
9370
+ return jsx(HeaderTemplate, {});
9371
+ };
9372
+
9373
+ const FeatureCardTitle = ({ title, description }) => {
9374
+ const { t } = useGlobalContext();
9375
+ const { attributes, layerInfo, feature } = useWidgetContext(WidgetType.FeatureCard);
9376
+ const zoomToFeatures = useZoomToFeatures();
9377
+ const { alias, name, layerDefinition, titleAttribute } = layerInfo || {};
9378
+ const resultDescription = description || alias || name || "";
9379
+ const resultTitle = useMemo(() => {
9380
+ const layerDefinitionAttribute = layerDefinition && attributes?.length
9381
+ ? attributes.find(item => item.name === layerDefinition.titleAttribute)
9382
+ : null;
9383
+ const layerDefinitionTitle = layerDefinition?.titleAttribute && layerDefinitionAttribute?.value
9384
+ ? layerDefinitionAttribute.value
9385
+ : null;
9386
+ const sourceTitleAttribute = titleAttribute && attributes?.length ? attributes.find(item => item.name === titleAttribute) : null;
9387
+ const sourceTitle = titleAttribute && sourceTitleAttribute?.value ? sourceTitleAttribute.value : null;
9388
+ return (title ||
9389
+ (!!sourceTitle &&
9390
+ formatAttributeValue({ t, type: sourceTitleAttribute.type, value: sourceTitle, stringFormat: sourceTitleAttribute.stringFormat })) ||
9391
+ (!!layerDefinitionTitle &&
9392
+ formatAttributeValue({
9393
+ t,
9394
+ type: layerDefinitionAttribute.type,
9395
+ value: layerDefinitionTitle,
9396
+ stringFormat: layerDefinitionAttribute.stringFormat,
9397
+ })) ||
9398
+ feature?.id);
9399
+ }, [attributes, feature?.id, layerDefinition, title, titleAttribute]);
9400
+ return (jsxs(HeaderTitleContainer, { children: [jsx(FeatureTitleContainer, { clickable: true, children: jsx(Tooltip$1, { arrow: true, placement: "top", content: t("zoomToFeature", { ns: "dashboard" }), delay: [600, 0], children: ref => (jsx(FlexSpan, { ref: ref, onClick: () => zoomToFeatures([feature]), children: resultTitle })) }) }), jsx(LayerDescription, { title: resultDescription, children: resultDescription })] }));
9401
+ };
9402
+
8652
9403
  const HiddenFilters = styled(Flex) `
8653
9404
  flex-wrap: wrap;
8654
9405
  margin-top: -1.25rem;
@@ -8747,7 +9498,7 @@ const PageNavigator = styled(Flex) `
8747
9498
  }
8748
9499
  `;
8749
9500
 
8750
- const Pagination = memo(({ type }) => {
9501
+ const Pagination = memo(({ type = WidgetType.Dashboard }) => {
8751
9502
  const { nextPage, prevPage } = useWidgetContext(type);
8752
9503
  const { pages } = useWidgetConfig(type);
8753
9504
  return (jsxs(PageNavigator, { children: [jsx(IconButton, { kind: "prev", onClick: () => prevPage(pages.length) }), jsx(IconButton, { kind: "next", onClick: () => nextPage(pages.length) })] }));
@@ -8820,7 +9571,7 @@ const TextTrim = memo(({ maxLength, expandable, lineBreak, children }) => {
8820
9571
  if (expandable) {
8821
9572
  return (jsxs(Fragment$1, { children: [formatValue(expanded ? text : substring), jsx(LegendToggler, { toggled: expanded, onClick: toggleExpanded, children: expanded ? t("hide", { ns: "dashboard" }) : t("more", { ns: "dashboard" }) })] }));
8822
9573
  }
8823
- return (jsx(Tooltip, { placement: "top", arrow: true, content: text, children: ref => jsx("div", { ref: ref, children: formatValue(substring) }) }));
9574
+ return (jsx(Tooltip$1, { placement: "top", arrow: true, content: text, children: ref => jsx("div", { ref: ref, children: formatValue(substring) }) }));
8824
9575
  });
8825
9576
 
8826
9577
  const DEFAULT_COLOR = "#00ffff";
@@ -9040,22 +9791,5 @@ const Map$1 = ({ zIndex, lowerSiblings, upperSiblings, onError, children, ...res
9040
9791
  }, children: children }), upperSiblings] }));
9041
9792
  };
9042
9793
 
9043
- var ThemeName;
9044
- (function (ThemeName) {
9045
- ThemeName["Light"] = "light";
9046
- ThemeName["Dark"] = "dark";
9047
- })(ThemeName || (ThemeName = {}));
9048
-
9049
- var TmsType;
9050
- (function (TmsType) {
9051
- TmsType["WMS"] = "WMS";
9052
- TmsType["TMS"] = "TMS";
9053
- TmsType["ArcGIS"] = "ArcGIS";
9054
- })(TmsType || (TmsType = {}));
9055
- var EditGeometryType;
9056
- (function (EditGeometryType) {
9057
- EditGeometryType["Raster"] = "raster";
9058
- })(EditGeometryType || (EditGeometryType = {}));
9059
-
9060
- export { AddFeatureButton, AddFeatureContainer, AttributeGalleryContainer, AttributeLabel, BaseMapTheme, CONFIG_PAGES_ID, CONFIG_PAGE_ID, CameraContainer, Chart, ChartContainer, ChartLegend, ChartLoading, ConfigContext, ConfigProvider, ContainerChildren, ContainerLoading, ContainerTemplate, ContainerWrapper, ContainersGroupContainer, DEFAULT_ATTRIBUTE_NAME, DEFAULT_BARCHART_RADIUS, DEFAULT_BASE_MAP, DEFAULT_CHART_ANGLE, DEFAULT_CHART_HEIGHT, DEFAULT_CHART_WIDTH, DEFAULT_CIRCLE_PAINT, DEFAULT_DASHBOARD_CONFIG, DEFAULT_DATA_SOURCE_LIMIT, DEFAULT_FILL_EXTRUSION_PAINT, DEFAULT_FILL_PAINT, DEFAULT_ID_ATTRIBUTE_NAME, DEFAULT_LAT, DEFAULT_LINE_PAINT, DEFAULT_LNG, DEFAULT_PAGES_CONFIG, DEFAULT_PIECHART_RADIUS, DEFAULT_ZOOM, Dashboard, DashboardCheckbox, DashboardChip, DashboardContent, DashboardContext, DashboardPlaceholder, DashboardPlaceholderWrap, DashboardProvider, DashboardWrapper, DataSourceContainer, DataSourceError, DataSourceErrorContainer, DataSourceInnerContainer, DataSourceProgressContainer, DateFormat, DefaultAttributesContainer, DividerContainer, EditGeometryType, ElementButton, ElementCamera, ElementChart, ElementChips, ElementIcon, ElementImage, ElementLegend, ElementLink, ElementSlideshow, ElementSvg, ElementTooltip, ElementValueWrapper, ExpandableTitle, FEATURE_CARD_DEFAULT_COLORS, FEATURE_CARD_OTHER_COLOR, FILTERED_VALUE_OPACITY, FILTER_PREFIX, FeatureCardContext, FeatureCardProvider, FiltersContainer, GEOMETRY_ATTRIBUTE, GlobalContext, GlobalProvider, HeaderTemplate, HiddenTitleItems, IconContainer, ImageContainer, LEFT_PANEL_HEADER_HEIGHT, Layer, LayerGroup, LayerGroupList, LayerListContainer, LayerTree, LayersContainer, LayersListWrapper, LinearProgressContainer, MAX_CHART_WIDTH, Map$1 as Map, MapContext, MapProvider, NO_CONTENT_VALUE, NUMERIC_ATTRIBUTE_TYPES, NoLiveSnapshotContainer, OneColumnContainer, PageNavigator, PagesContainer, Pagination, PresentationHeader, PresentationHeaderButtons, PresentationHeaderTools, PresentationPanelContainer, PresentationPanelWrapper, PresentationWrapper, ProgressContainer, RoundedBackgroundContainer, ScalingFactor, ServerNotificationsContext, ServerNotificationsProvider, SlideshowContainer, SmallPreviewContainer, SmallPreviewControl, SmallPreviewCounter, SmallPreviewImages, SmallPreviewLeft, SmallPreviewRight, StackBar, SvgImage, TIME_ZONE_FORMAT, TabsContainer, TextTrim, ThemeName, TitleContainer, TmsType, TwoColumnContainer, TwoColumnsInnerContainer, WidgetType, addDataSource, addDataSources, applyFiltersToCondition, applyQueryFilters, applyVarsToCondition, checkEqualOrIncludes, checkIsLoading, convertSpToTurfFeature, createConfigLayer, createConfigPage, createNewPageId, createTreeNode, dateOptions, debounce, decimalOpacityToHex, eqlParametersToPayload, findAttributeInExpression, formatArea, formatAttributeValue, formatChartRelatedValue, formatConditionValue, formatDataSourceCondition, formatDate$1 as formatDate, formatElementValue, formatLength, formatNumber, formatPolygonMeasure, getActualExtrusionHeight, getAttributeByName, getAttributeValue, getAttributesConfiguration, getChartFilterName, getChartMarkers, getConfigFilter, getContainerComponent, getDataFromAttributes, getDataFromRelatedFeatures, getDataSource, getDataSourceFilterValue, getDate, getDefaultConfig, getElementValue, getFeatureAttributes, getFilterComponent, getFilterSelectedItems, getFilterValue, getFormattedAttributes, getGradientColors, getLayerDefinition, getLayerInfoFromDataSources, getPagesFromConfig, getPagesFromProjectInfo, getRelatedAttribute, getRenderElement, getResourceUrl, getSelectedFilterValue, getSlideshowImages, getSvgUrl, getTotalFromAttributes, getTotalFromRelatedFeatures, hexToRgba, isEmptyElementValue, isEmptyValue, isHiddenEmptyValue, isLayerService, isNotValidSelectedTab, isNumeric, isObject, isVisibleContainer, numberOptions, parseClientStyle, pieChartTooltipFromAttributes, pieChartTooltipFromRelatedFeatures, pointOptions, removeDataSource, rgbToHex, roundTotalSum, sliceShownOtherItems, timeOptions, tooltipNameFromAttributes, tooltipValueFromAttributes, tooltipValueFromRelatedFeatures, transparentizeColor, treeNodesToProjectItems, useChartChange, useChartData, useDashboardHeader, useDataSources, useDebouncedCallback, useDiffPage, useExpandableContainers, useFeatureFilters, useGetConfigLayer, useGlobalContext, useLayerParams, useMapContext, useMapDraw, useProjectDashboardInit, useRedrawLayer, useRelatedDataSourceAttributes, useRenderElement, useServerNotificationsContext, useShownOtherItems, useToggle, useUpdateDataSource, useWidgetConfig, useWidgetContext, useWidgetPage, useWindowResize, useZoomToFeatures, useZoomToPoint };
9794
+ export { AddFeatureButton, AddFeatureContainer, AttributeGalleryContainer, AttributeLabel, BaseMapTheme, CONFIG_PAGES_ID, CONFIG_PAGE_ID, CameraContainer, Chart, ChartContainer, ChartLegend, ChartLoading, ConfigContext, ConfigProvider, ContainerChildren, ContainerLoading, ContainerTemplate, ContainerWrapper, ContainersGroupContainer, DEFAULT_ATTRIBUTE_NAME, DEFAULT_BARCHART_RADIUS, DEFAULT_BASE_MAP, DEFAULT_CHART_ANGLE, DEFAULT_CHART_HEIGHT, DEFAULT_CHART_WIDTH, DEFAULT_CIRCLE_PAINT, DEFAULT_DASHBOARD_CONFIG, DEFAULT_DATA_SOURCE_LIMIT, DEFAULT_FILL_EXTRUSION_PAINT, DEFAULT_FILL_PAINT, DEFAULT_ID_ATTRIBUTE_NAME, DEFAULT_LAT, DEFAULT_LINE_PAINT, DEFAULT_LNG, DEFAULT_PAGES_CONFIG, DEFAULT_PIECHART_RADIUS, DEFAULT_ZOOM, Dashboard, DashboardCheckbox, DashboardChip, DashboardContent, DashboardContext, DashboardDefaultHeader, DashboardHeader, DashboardPlaceholder, DashboardPlaceholderWrap, DashboardProvider, DashboardWrapper, DataSourceContainer, DataSourceError, DataSourceErrorContainer, DataSourceInnerContainer, DataSourceProgressContainer, DateFormat, DefaultAttributesContainer, DefaultHeaderContainer, DividerContainer, EditGeometryType, ElementButton, ElementCamera, ElementChart, ElementChips, ElementIcon, ElementImage, ElementLegend, ElementLink, ElementSlideshow, ElementSvg, ElementTooltip, ElementValueWrapper, ExpandableTitle, FEATURE_CARD_DEFAULT_COLORS, FEATURE_CARD_OTHER_COLOR, FILTERED_VALUE_OPACITY, FILTER_PREFIX, FeatureCardButtons, FeatureCardContext, FeatureCardDefaultHeader, FeatureCardGradientHeader, FeatureCardHeader, FeatureCardIconHeader, FeatureCardProvider, FeatureCardSlideshowHeader, FeatureCardTitle, FeatureControls, FeatureTitleContainer, FiltersContainer, GEOMETRY_ATTRIBUTE, GlobalContext, GlobalProvider, Header, HeaderContainer, HeaderFrontView, HeaderTemplate, HeaderTitleContainer, HiddenTitleItems, IconContainer, ImageContainer, LEFT_PANEL_HEADER_HEIGHT, Layer, LayerDescription, LayerGroup, LayerGroupList, LayerIcon, LayerListContainer, LayerTree, LayersContainer, LayersListWrapper, LinearProgressContainer, LogoContainer, MAX_CHART_WIDTH, Map$1 as Map, MapContext, MapProvider, NO_CONTENT_VALUE, NUMERIC_ATTRIBUTE_TYPES, NoLiveSnapshotContainer, OneColumnContainer, PageNavigator, PageTitle, PagesContainer, Pagination, PresentationHeader, PresentationHeaderButtons, PresentationHeaderTools, PresentationPanelContainer, PresentationPanelWrapper, PresentationWrapper, ProgressContainer, RoundedBackgroundContainer, ScalingFactor, ServerNotificationsContext, ServerNotificationsProvider, SlideshowContainer, SmallPreviewContainer$1 as SmallPreviewContainer, SmallPreviewControl, SmallPreviewCounter, SmallPreviewImages, SmallPreviewLeft, SmallPreviewRight, StackBar, SvgImage, TIME_ZONE_FORMAT, TabsContainer, TextTrim, ThemeName, TitleContainer, TmsType, TopContainer, TopContainerButtons, TwoColumnContainer, TwoColumnsInnerContainer, WidgetType, addDataSource, addDataSources, applyFiltersToCondition, applyQueryFilters, applyVarsToCondition, checkEqualOrIncludes, checkIsLoading, convertSpToTurfFeature, createConfigLayer, createConfigPage, createNewPageId, createTreeNode, dateOptions, debounce, decimalOpacityToHex, eqlParametersToPayload, findAttributeInExpression, formatArea, formatAttributeValue, formatChartRelatedValue, formatConditionValue, formatDataSourceCondition, formatDate$1 as formatDate, formatElementValue, formatLength, formatNumber, formatPolygonMeasure, getActualExtrusionHeight, getAttributeByName, getAttributeValue, getAttributesConfiguration, getChartFilterName, getChartMarkers, getConfigFilter, getContainerComponent, getDashboardHeader, getDataFromAttributes, getDataFromRelatedFeatures, getDataSource, getDataSourceFilterValue, getDate, getDefaultConfig, getElementValue, getFeatureAttributes, getFeatureCardHeader, getFilterComponent, getFilterSelectedItems, getFilterValue, getFormattedAttributes, getGradientColors, getLayerDefinition, getLayerInfoFromDataSources, getPagesFromConfig, getPagesFromProjectInfo, getRelatedAttribute, getRenderElement, getResourceUrl, getSelectedFilterValue, getSlideshowImages, getSvgUrl, getTotalFromAttributes, getTotalFromRelatedFeatures, hexToRgba, isEmptyElementValue, isEmptyValue, isHiddenEmptyValue, isLayerService, isNotValidSelectedTab, isNumeric, isObject, isVisibleContainer, numberOptions, parseClientStyle, pieChartTooltipFromAttributes, pieChartTooltipFromRelatedFeatures, pointOptions, removeDataSource, rgbToHex, roundTotalSum, sliceShownOtherItems, timeOptions, tooltipNameFromAttributes, tooltipValueFromAttributes, tooltipValueFromRelatedFeatures, transparentizeColor, treeNodesToProjectItems, useChartChange, useChartData, useDashboardHeader, useDataSources, useDebouncedCallback, useDiffPage, useExpandableContainers, useFeatureFilters, useGetConfigLayer, useGlobalContext, useHeaderRender, useLayerParams, useMapContext, useMapDraw, useProjectDashboardInit, useRedrawLayer, useRelatedDataSourceAttributes, useRenderElement, useServerNotificationsContext, useShownOtherItems, useToggle, useUpdateDataSource, useWidgetConfig, useWidgetContext, useWidgetPage, useWindowResize, useZoomToFeatures, useZoomToPoint };
9061
9795
  //# sourceMappingURL=react.esm.js.map