@evergis/react 4.0.114 → 4.0.116

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/react.esm.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { jsx, jsxs, Fragment as Fragment$1 } from 'react/jsx-runtime';
2
- import { IconButton, Flex, transition, Chip, shadows, Description, Divider, Icon, LegendToggler, Tooltip as Tooltip$1, DropdownField, MultiSelectContainer, IconButtonButton, FlexSpan, FlatButton, IconToggle, DraggableTreeContainer, DraggableTree, UploaderItemArea, UploaderTitleWrapper, Dialog, DialogTitle, ThemeProvider, darkTheme, DialogContent, CircularProgress, Switch, AutoComplete, Input, Slider, Dropdown, Checkbox, DatePicker, getLocale, IconToggleButton, LinearProgress, Popup, Menu, ActionsGroup, DialogActions, RaisedButton, Preview, H2, Blank, Popover, Uploader, NumberRangeSlider, useAsyncAutocomplete, RangeNumberInput, TreeDropdown, defaultTheme, dateFormat } from '@evergis/uilib-gl';
2
+ import { IconButton, Flex, transition, Chip, shadows, Description, Divider, Icon, LegendToggler, Tooltip as Tooltip$1, DropdownField, MultiSelectContainer, IconButtonButton, FlatButton, FlexSpan, IconToggle, DraggableTreeContainer, DraggableTree, UploaderItemArea, UploaderTitleWrapper, Dialog, DialogTitle, ThemeProvider, darkTheme, DialogContent, CircularProgress, Switch, AutoComplete, Input, Slider, Dropdown, Checkbox, DatePicker, getLocale, IconToggleButton, LinearProgress, Popup, Menu, ActionsGroup, DialogActions, RaisedButton, Preview, H2, Blank, Popover, Uploader, NumberRangeSlider, useAsyncAutocomplete, RangeNumberInput, TreeDropdown, defaultTheme, dateFormat } from '@evergis/uilib-gl';
3
3
  import { isValidElement, Fragment, createContext, memo, useRef, useState, useCallback, useEffect, useContext, useMemo, createElement, forwardRef } from 'react';
4
4
  import styled, { createGlobalStyle, css, useTheme } from 'styled-components';
5
5
  import { lineChartClassNames, BarChart as BarChart$1, barChartClassNames, LineChart, PieChart } from '@evergis/charts';
@@ -3532,6 +3532,24 @@ const DEFAULT_FILTER_PADDING = 12;
3532
3532
  const BASE_CONTAINER_STYLE = {
3533
3533
  marginBottom: "1rem",
3534
3534
  };
3535
+ /**
3536
+ * Маркер тела контейнера внутри `ContainerRoot` — содержимое без заголовка.
3537
+ *
3538
+ * Нужен, чтобы находить тело по DOM снаружи: `#<id контейнера>` теперь указывает на корень,
3539
+ * то есть на пару «заголовок + тело».
3540
+ */
3541
+ const CONTAINER_BODY_ATTRIBUTE = "data-container-body";
3542
+ /**
3543
+ * Заданная высота контейнера достаётся телу — за вычетом заголовка.
3544
+ *
3545
+ * Сама высота остаётся на корне, поэтому тело забирает остаток ячейки, а заголовок сохраняет
3546
+ * `flex-shrink: 0` и не сжимается.
3547
+ */
3548
+ const CONTAINER_BODY_FILL_STYLE = {
3549
+ flex: "1 1 auto",
3550
+ minHeight: 0,
3551
+ minWidth: 0,
3552
+ };
3535
3553
 
3536
3554
  const StackBarContainer = styled(Flex).withConfig({ displayName: "StackBarContainer", componentId: "sc-stc97k" }) `
3537
3555
  flex-wrap: nowrap;
@@ -3807,15 +3825,16 @@ const debounce = (callback, delay) => {
3807
3825
  const MILLION = 1000000;
3808
3826
  const TEN_THOUSANDS = 10000;
3809
3827
  const THOUSAND = 1000;
3810
- const FRACTION_DIGITS = 1;
3811
- const roundTotalSum = (value) => {
3828
+ const COMPACT_FRACTION_DIGITS = 1;
3829
+ const roundTotalSum = (value, fractionDigits) => {
3812
3830
  if (!value)
3813
3831
  return "";
3832
+ const digits = fractionDigits ?? COMPACT_FRACTION_DIGITS;
3814
3833
  if (value >= MILLION) {
3815
- return `${(value / MILLION).toFixed(FRACTION_DIGITS)}M`;
3834
+ return `${(value / MILLION).toFixed(digits)}M`;
3816
3835
  }
3817
3836
  if (value >= TEN_THOUSANDS) {
3818
- return `${(value / THOUSAND).toFixed(FRACTION_DIGITS)}K`;
3837
+ return `${(value / THOUSAND).toFixed(digits)}K`;
3819
3838
  }
3820
3839
  return value;
3821
3840
  };
@@ -3960,11 +3979,14 @@ const formatNumberValue = (stringFormat, value, type, noUnits = false) => {
3960
3979
  if (scalingFactor) {
3961
3980
  currentValue *= scalingFactor;
3962
3981
  }
3963
- const compactValue = roundDigitGroup ? roundTotalSum(Number(currentValue)) : null;
3982
+ const hasRounding = !isNil(rounding);
3983
+ const compactValue = roundDigitGroup
3984
+ ? roundTotalSum(Number(currentValue), hasRounding ? rounding : undefined)
3985
+ : null;
3964
3986
  if (typeof compactValue === "string" && compactValue) {
3965
3987
  return appendUnitsLabel(compactValue, unitsLabel, noUnits);
3966
3988
  }
3967
- if ((rounding || rounding === 0) && (!isIntValue || (isIntValue && !isDefaultScaling))) {
3989
+ if (hasRounding && (!isIntValue || !isDefaultScaling)) {
3968
3990
  currentValue = currentValue && Number(currentValue).toFixed(rounding);
3969
3991
  }
3970
3992
  if (splitDigitGroup) {
@@ -4585,7 +4607,24 @@ const ElementValueWrapper = styled.div.withConfig({ displayName: "ElementValueWr
4585
4607
  }
4586
4608
  `};
4587
4609
  `;
4588
- const Container = styled(Flex).withConfig({ displayName: "Container", componentId: "sc-1gpmkbq" }) `
4610
+ /**
4611
+ * Единственный корневой узел контейнера: внутри — заголовок (`ExpandableTitle`) и тело.
4612
+ *
4613
+ * Два корня (фрагмент из заголовка и тела) ломают раскладку родителя: в строке
4614
+ * (`options.column: false`) они становятся ДВУМЯ ячейками flex-row и делят её ширину между собой,
4615
+ * а доля из `options.width` достаётся только телу. Поэтому `id`, `data-templatename`, авторский
4616
+ * `style` и `$sizeCss` живут здесь, а не на теле — см. `useContainerRoot`.
4617
+ *
4618
+ * Всегда flex-колонка: заголовок и тело раньше были flex-элементами родительского `Container`,
4619
+ * и блочная обёртка вернула бы схлопывание вертикальных отступов между ними.
4620
+ */
4621
+ const ContainerRoot = styled(Flex).withConfig({ displayName: "ContainerRoot", componentId: "sc-2j6lbd" }) `
4622
+ flex-direction: column;
4623
+ min-width: 0;
4624
+
4625
+ ${sizeCssMixin};
4626
+ `;
4627
+ const Container = styled(Flex).withConfig({ displayName: "Container", componentId: "sc-1o8dsu2" }) `
4589
4628
  flex-direction: column;
4590
4629
  width: 100%;
4591
4630
 
@@ -4639,7 +4678,7 @@ const Container = styled(Flex).withConfig({ displayName: "Container", componentI
4639
4678
 
4640
4679
  ${sizeCssMixin};
4641
4680
  `;
4642
- const ContainerWrapper = styled(Flex).withConfig({ displayName: "ContainerWrapper", componentId: "sc-4nlisz" }) `
4681
+ const ContainerWrapper = styled(Flex).withConfig({ displayName: "ContainerWrapper", componentId: "sc-16tb6s0" }) `
4643
4682
  position: relative;
4644
4683
  box-sizing: border-box;
4645
4684
  width: 100%;
@@ -4660,7 +4699,7 @@ const ContainerWrapper = styled(Flex).withConfig({ displayName: "ContainerWrappe
4660
4699
  }
4661
4700
  `}
4662
4701
  `;
4663
- const DashboardChip = styled(Chip).withConfig({ displayName: "DashboardChip", componentId: "sc-8os072" }) `
4702
+ const DashboardChip = styled(Chip).withConfig({ displayName: "DashboardChip", componentId: "sc-19j7obx" }) `
4664
4703
  margin: 0 0.25rem 0.25rem 0;
4665
4704
  background: ${({ $isDefault, $bgColor, theme: { palette } }) => $isDefault ? palette.element : $bgColor || palette.primary};
4666
4705
  border-radius: ${({ $radius, theme: { borderRadius } }) => $radius || borderRadius.medium};
@@ -4676,7 +4715,7 @@ const DashboardChip = styled(Chip).withConfig({ displayName: "DashboardChip", co
4676
4715
  color: ${({ $isDefault, $fontColor, theme: { palette } }) => $isDefault ? palette.icon : $fontColor || "#fff"};
4677
4716
  }
4678
4717
  `;
4679
- const DashboardPlaceholderWrap = styled(Flex).withConfig({ displayName: "DashboardPlaceholderWrap", componentId: "sc-1qpd82p" }) `
4718
+ const DashboardPlaceholderWrap = styled(Flex).withConfig({ displayName: "DashboardPlaceholderWrap", componentId: "sc-anwihw" }) `
4680
4719
  flex-grow: 1;
4681
4720
  flex-direction: column;
4682
4721
  justify-content: center;
@@ -4684,7 +4723,7 @@ const DashboardPlaceholderWrap = styled(Flex).withConfig({ displayName: "Dashboa
4684
4723
  width: 100%;
4685
4724
  margin-bottom: 2rem;
4686
4725
  `;
4687
- const DashboardPlaceholder = styled(Flex).withConfig({ displayName: "DashboardPlaceholder", componentId: "sc-1ls3oxv" }) `
4726
+ const DashboardPlaceholder = styled(Flex).withConfig({ displayName: "DashboardPlaceholder", componentId: "sc-jry8vp" }) `
4688
4727
  flex-direction: column;
4689
4728
  justify-content: center;
4690
4729
  align-items: center;
@@ -4717,7 +4756,7 @@ const DashboardPlaceholder = styled(Flex).withConfig({ displayName: "DashboardPl
4717
4756
  }
4718
4757
  }
4719
4758
  `;
4720
- const DashboardWrapper = styled(Flex).withConfig({ displayName: "DashboardWrapper", componentId: "sc-bx93vz" }) `
4759
+ const DashboardWrapper = styled(Flex).withConfig({ displayName: "DashboardWrapper", componentId: "sc-100ipup" }) `
4721
4760
  flex-direction: column;
4722
4761
  flex-wrap: nowrap;
4723
4762
  flex-grow: 1;
@@ -4730,7 +4769,7 @@ const DashboardWrapper = styled(Flex).withConfig({ displayName: "DashboardWrappe
4730
4769
  margin-top: -0.35rem;
4731
4770
  `}
4732
4771
  `;
4733
- const DashboardContent = styled(Flex).withConfig({ displayName: "DashboardContent", componentId: "sc-mslago" }) `
4772
+ const DashboardContent = styled(Flex).withConfig({ displayName: "DashboardContent", componentId: "sc-77il9k" }) `
4734
4773
  flex-grow: 1;
4735
4774
  width: 100%;
4736
4775
  padding: 1.5rem 1.5rem 2rem;
@@ -4745,16 +4784,16 @@ const PresentationWrapperCss = css `
4745
4784
  border-radius: ${({ theme: { borderRadius } }) => borderRadius.medium};
4746
4785
  box-shadow: ${shadows.raised};
4747
4786
  `;
4748
- const PresentationWrapper = styled.div.withConfig({ displayName: "PresentationWrapper", componentId: "sc-1aajdp8" }) `
4787
+ const PresentationWrapper = styled.div.withConfig({ displayName: "PresentationWrapper", componentId: "sc-891z9z" }) `
4749
4788
  ${PresentationWrapperCss};
4750
4789
  position: relative;
4751
4790
  z-index: 1;
4752
4791
  `;
4753
- const PresentationPanelWrapper = styled(PresentationWrapper).withConfig({ displayName: "PresentationPanelWrapper", componentId: "sc-9w36pj" }) `
4792
+ const PresentationPanelWrapper = styled(PresentationWrapper).withConfig({ displayName: "PresentationPanelWrapper", componentId: "sc-1ptpbt9" }) `
4754
4793
  margin-top: 0.75rem;
4755
4794
  transition: background-color ${transition.toggle};
4756
4795
  `;
4757
- const PresentationHeader = styled.div.withConfig({ displayName: "PresentationHeader", componentId: "sc-xe6ev3" }) `
4796
+ const PresentationHeader = styled.div.withConfig({ displayName: "PresentationHeader", componentId: "sc-182b7wg" }) `
4758
4797
  margin: -1.5rem -1.5rem 0 -1.5rem;
4759
4798
  padding: 1.5rem;
4760
4799
  // background: url(images.presentationHeader) 0 0 no-repeat;
@@ -4766,7 +4805,7 @@ const PresentationHeader = styled.div.withConfig({ displayName: "PresentationHea
4766
4805
  padding-top: 7rem;
4767
4806
  `};
4768
4807
  `;
4769
- const PresentationHeaderTools = styled(Flex).withConfig({ displayName: "PresentationHeaderTools", componentId: "sc-13dyz78" }) `
4808
+ const PresentationHeaderTools = styled(Flex).withConfig({ displayName: "PresentationHeaderTools", componentId: "sc-dms7fm" }) `
4770
4809
  justify-content: space-between;
4771
4810
  align-items: center;
4772
4811
  margin-bottom: -0.5rem;
@@ -4784,7 +4823,7 @@ const PresentationHeaderTools = styled(Flex).withConfig({ displayName: "Presenta
4784
4823
  }
4785
4824
  }
4786
4825
  `;
4787
- const LayerGroupList = styled(Flex).withConfig({ displayName: "LayerGroupList", componentId: "sc-110h1r0" }) `
4826
+ const LayerGroupList = styled(Flex).withConfig({ displayName: "LayerGroupList", componentId: "sc-19uothl" }) `
4788
4827
  flex-direction: column;
4789
4828
  height: 100%;
4790
4829
  flex-wrap: nowrap;
@@ -4797,8 +4836,8 @@ const LayerGroupList = styled(Flex).withConfig({ displayName: "LayerGroupList",
4797
4836
  flex-grow: 1;
4798
4837
  }
4799
4838
  `;
4800
- const PresentationHeaderButtons = styled(Flex).withConfig({ displayName: "PresentationHeaderButtons", componentId: "sc-5xerc" }) ``;
4801
- const PresentationPanelContainer = styled.div.withConfig({ displayName: "PresentationPanelContainer", componentId: "sc-ok1jzl" }) `
4839
+ const PresentationHeaderButtons = styled(Flex).withConfig({ displayName: "PresentationHeaderButtons", componentId: "sc-c24t7n" }) ``;
4840
+ const PresentationPanelContainer = styled.div.withConfig({ displayName: "PresentationPanelContainer", componentId: "sc-17q0jzw" }) `
4802
4841
  position: absolute;
4803
4842
  top: 0;
4804
4843
  left: calc(${({ left }) => left || 0}px + 0.75rem);
@@ -4867,7 +4906,7 @@ const PresentationPanelContainer = styled.div.withConfig({ displayName: "Present
4867
4906
  }
4868
4907
  }
4869
4908
  `;
4870
- const DataSourceErrorContainer = styled(Flex).withConfig({ displayName: "DataSourceErrorContainer", componentId: "sc-16x60eq" }) `
4909
+ const DataSourceErrorContainer = styled(Flex).withConfig({ displayName: "DataSourceErrorContainer", componentId: "sc-nh93ry" }) `
4871
4910
  align-items: center;
4872
4911
  justify-content: center;
4873
4912
  flex-wrap: nowrap;
@@ -4886,12 +4925,12 @@ const DataSourceErrorContainer = styled(Flex).withConfig({ displayName: "DataSou
4886
4925
  }
4887
4926
  }
4888
4927
  `;
4889
- const AttributeLabel = styled(Description).withConfig({ displayName: "AttributeLabel", componentId: "sc-1bou1dd" }) `
4928
+ const AttributeLabel = styled(Description).withConfig({ displayName: "AttributeLabel", componentId: "sc-9u3noy" }) `
4890
4929
  margin-top: 0 !important;
4891
4930
  margin-bottom: ${({ forCheckbox }) => forCheckbox ? "0.75rem" : "0.25rem"} !important;
4892
4931
  padding-left: ${({ isEdit }) => (isEdit ? "0.5rem" : "0")};
4893
4932
  `;
4894
- const FeatureControls = styled(Flex).withConfig({ displayName: "FeatureControls", componentId: "sc-fpl3fy" }) `
4933
+ const FeatureControls = styled(Flex).withConfig({ displayName: "FeatureControls", componentId: "sc-1wenq0r" }) `
4895
4934
  align-items: center;
4896
4935
  gap: 1rem;
4897
4936
  flex-wrap: nowrap;
@@ -6532,6 +6571,45 @@ const useContainerAttributes = ({ elementConfig, type, renderElement }) => {
6532
6571
  return { getRenderContainerItem, attributesToRender };
6533
6572
  };
6534
6573
 
6574
+ /**
6575
+ * Пропсы корневой обёртки контейнера: идентификаторы для внешних селекторов, авторский `style`
6576
+ * из конфига и css-объект размеров.
6577
+ *
6578
+ * Размеры уходят styled-пропом (класс), а не inline-стилем, поэтому перебиваются снаружи
6579
+ * без `!important`. Авторский `style` остаётся inline — у него приоритет по замыслу автора конфига.
6580
+ */
6581
+ const useWrapperSize = ({ elementConfig, defaults }) => {
6582
+ const { id, style, templateName, options } = elementConfig || {};
6583
+ const { width, height, overflow } = options || {};
6584
+ return useMemo(() => ({
6585
+ id,
6586
+ "data-templatename": templateName,
6587
+ style,
6588
+ $sizeCss: getWrapperSizeStyle({ style, width, height, overflow, defaults, defaultWidth: FILL_SIZE }),
6589
+ }), [id, templateName, style, width, height, overflow, defaults]);
6590
+ };
6591
+
6592
+ /**
6593
+ * Пропсы двух узлов контейнера с заголовком: корня (`ContainerRoot`) и тела.
6594
+ *
6595
+ * Контейнер обязан иметь ОДИН корневой узел — иначе в строке (`options.column: false`) заголовок
6596
+ * и тело становятся двумя ячейками родительского flex-row. Размеры из конфига поэтому уходят на
6597
+ * корень, а тело получает лишь остаток высоты под заголовком.
6598
+ */
6599
+ const useContainerRoot = ({ elementConfig, defaults }) => {
6600
+ const root = useWrapperSize({ elementConfig, defaults });
6601
+ // Гейт по РЕЗУЛЬТИРУЮЩЕЙ высоте, а не по `options.height`: высоту задаёт ещё и авторский `style`,
6602
+ // и внутренние `defaults` контейнера. `auto` высотой не считаем — делить нечего.
6603
+ const fillsHeight = !!root.$sizeCss?.height && root.$sizeCss.height !== "auto";
6604
+ return useMemo(() => ({
6605
+ root,
6606
+ body: {
6607
+ [CONTAINER_BODY_ATTRIBUTE]: "",
6608
+ $sizeCss: fillsHeight ? CONTAINER_BODY_FILL_STYLE : undefined,
6609
+ },
6610
+ }), [root, fillsHeight]);
6611
+ };
6612
+
6535
6613
  const useEditGroupAttributes = ({ elementConfig, type }) => {
6536
6614
  const { options } = elementConfig || {};
6537
6615
  const { controls, useProjectHiddenAttributes } = options || {};
@@ -7477,7 +7555,11 @@ const useExportPdf = (id, margin = 20) => {
7477
7555
  return;
7478
7556
  }
7479
7557
  setLoading(true);
7480
- const container = document.querySelector(`#${id}`);
7558
+ const target = document.querySelector(`#${id}`);
7559
+ // `#id` — корень контейнера, то есть пара «заголовок + тело». Постранично режем содержимое
7560
+ // тела: у самого корня детей всего два, и длинное тело уехало бы одной картинкой на первую
7561
+ // страницу. Fallback — для одноузловых целей вроде корня дашборда.
7562
+ const container = target?.querySelector(`:scope > [${CONTAINER_BODY_ATTRIBUTE}]`) ?? target;
7481
7563
  if (!container) {
7482
7564
  setLoading(false);
7483
7565
  return;
@@ -7861,32 +7943,14 @@ const useUpdateDataSource = ({ dataSource, config, filters, attributes, layerPar
7861
7943
  }, [dataSource, getDataSourcePromises, getUpdatedDataSources, dataSources]);
7862
7944
  };
7863
7945
 
7864
- /**
7865
- * Пропсы корневой обёртки контейнера: идентификаторы для внешних селекторов, авторский `style`
7866
- * из конфига и css-объект размеров.
7867
- *
7868
- * Размеры уходят styled-пропом (класс), а не inline-стилем, поэтому перебиваются снаружи
7869
- * без `!important`. Авторский `style` остаётся inline — у него приоритет по замыслу автора конфига.
7870
- */
7871
- const useWrapperSize = ({ elementConfig, defaults }) => {
7872
- const { id, style, templateName, options } = elementConfig || {};
7873
- const { width, height, overflow } = options || {};
7874
- return useMemo(() => ({
7875
- id,
7876
- "data-templatename": templateName,
7877
- style,
7878
- $sizeCss: getWrapperSizeStyle({ style, width, height, overflow, defaults, defaultWidth: FILL_SIZE }),
7879
- }), [id, templateName, style, width, height, overflow, defaults]);
7880
- };
7881
-
7882
7946
  const ContainersGroupContainer = memo(({ elementConfig, type, renderElement }) => {
7883
7947
  const { expandedContainers } = useWidgetContext(type);
7884
7948
  const { id, children, options } = elementConfig || {};
7885
7949
  const { column, expandable, expanded, alignItems } = options || {};
7886
7950
  const isColumn = column === undefined || column;
7887
7951
  const isVisible = isVisibleContainer(id, expandable, expanded, expandedContainers);
7888
- const root = useWrapperSize({ elementConfig });
7889
- return (jsxs(Fragment$1, { children: [jsx(ExpandableTitle, { elementConfig: elementConfig, type: type, renderElement: renderElement }), isVisible && (jsx(Container, { ...root, isColumn: isColumn, "$alignItems": alignItems, children: jsx(ContainerChildren, { type: type, items: children, elementConfig: elementConfig, isColumn: isColumn, isMain: id?.startsWith(CONFIG_PAGE_ID), renderElement: renderElement }) }))] }));
7952
+ const { root, body } = useContainerRoot({ elementConfig });
7953
+ return (jsxs(ContainerRoot, { ...root, children: [jsx(ExpandableTitle, { elementConfig: elementConfig, type: type, renderElement: renderElement }), isVisible && (jsx(Container, { ...body, isColumn: isColumn, "$alignItems": alignItems, children: jsx(ContainerChildren, { type: type, items: children, elementConfig: elementConfig, isColumn: isColumn, isMain: id?.startsWith(CONFIG_PAGE_ID), renderElement: renderElement }) }))] }));
7890
7954
  });
7891
7955
 
7892
7956
  const ChartLegendContainer = styled(Flex).withConfig({ displayName: "ChartLegendContainer", componentId: "sc-1di1zl9" }) `
@@ -8307,7 +8371,7 @@ const DataSourceProgressContainer = memo(({ config, elementConfig, type, innerCo
8307
8371
  const { maxValue, showTotal, relatedDataSource, expandable, expanded } = options || {};
8308
8372
  const valueElement = children?.find(item => item.id === "value");
8309
8373
  const unitsElement = children?.find(item => item.id === "units");
8310
- const root = useWrapperSize({ elementConfig });
8374
+ const { root, body } = useContainerRoot({ elementConfig });
8311
8375
  const { sliceItems, checkIsSliced, showMore, onShowMore } = useShownOtherItems(options);
8312
8376
  const totalUnits = useMemo(() => unitsElement?.type === "attributeUnits"
8313
8377
  ? attributes?.find(({ attributeName }) => attributeName === unitsElement.attributeName)?.stringFormat
@@ -8338,7 +8402,7 @@ const DataSourceProgressContainer = memo(({ config, elementConfig, type, innerCo
8338
8402
  return jsx(DataSourceError, { name: elementConfig.templateName });
8339
8403
  }
8340
8404
  const isVisible = isVisibleContainer(id, expandable, expanded, expandedContainers);
8341
- return (jsxs(Fragment$1, { children: [jsx(ExpandableTitle, { elementConfig: elementConfig, type: type, renderElement: renderElement }), !isVisible ? null : dataSource ? (jsxs(DataSourceProgressContainerWrapper, { ...root, children: [sliceItems(dataSource?.features)?.map((feature, index) => (jsx(DataSourceInnerContainer, { type: type, index: index, feature: feature, config: config, elementConfig: elementConfig, maxValue: currentMaxValue, innerComponent: innerComponent }, index))), checkIsSliced(dataSource?.features) && (jsx(ContainerToggler, { toggled: showMore, onClick: onShowMore, children: showMore ? t("hide", { ns: "dashboard", defaultValue: "Свернуть" }) : t("showAll", {
8405
+ return (jsxs(ContainerRoot, { ...root, children: [jsx(ExpandableTitle, { elementConfig: elementConfig, type: type, renderElement: renderElement }), !isVisible ? null : dataSource ? (jsxs(DataSourceProgressContainerWrapper, { ...body, children: [sliceItems(dataSource?.features)?.map((feature, index) => (jsx(DataSourceInnerContainer, { type: type, index: index, feature: feature, config: config, elementConfig: elementConfig, maxValue: currentMaxValue, innerComponent: innerComponent }, index))), checkIsSliced(dataSource?.features) && (jsx(ContainerToggler, { toggled: showMore, onClick: onShowMore, children: showMore ? t("hide", { ns: "dashboard", defaultValue: "Свернуть" }) : t("showAll", {
8342
8406
  ns: "dashboard",
8343
8407
  defaultValue: "Показать все",
8344
8408
  }) })), showTotal && (jsxs(Fragment$1, { children: [jsx(Divider, {}), jsxs(ProgressTotal, { children: [jsx(ProgressTotalTitle, { children: t("total", { ns: "dashboard", defaultValue: "Итого" }) }), jsxs(ProgressValue, { children: [totalValue, jsx(ProgressUnits, { children: totalUnits })] })] })] }))] })) : (jsx(ContainerLoading, {})), jsx(HiddenTitleItems, { elementConfig: elementConfig, config: config, type: type })] }));
@@ -8599,7 +8663,7 @@ const FiltersContainer = memo(({ elementConfig, config, type, renderElement }) =
8599
8663
  const { filters: configFilters } = currentPage;
8600
8664
  const { id, options } = elementConfig || {};
8601
8665
  const { padding, bgColor, fontColor, fontSize, expandable, expanded } = options || {};
8602
- const root = useWrapperSize({ elementConfig });
8666
+ const { root, body } = useContainerRoot({ elementConfig });
8603
8667
  const isLoading = useMemo(() => checkIsLoading(dataSources, config, configFilters), [configFilters, config, dataSources]);
8604
8668
  const filterItems = useMemo(() => elementConfig?.children?.filter(child => child.options?.filterName), [elementConfig?.children]);
8605
8669
  const renderFilter = useCallback((filter, index) => {
@@ -8608,7 +8672,7 @@ const FiltersContainer = memo(({ elementConfig, config, type, renderElement }) =
8608
8672
  }, [config, type]);
8609
8673
  const isVisible = isVisibleContainer(id, expandable, expanded, expandedContainers);
8610
8674
  const selectedItems = useMemo(() => getFilterSelectedItems(filterItems, filters, configFilters), [configFilters, filters, filterItems]);
8611
- return (jsxs(Fragment$1, { children: [jsx(Flex, { mb: !isVisible && selectedItems.length ? "2rem" : 0, children: jsx(ExpandableTitle, { elementConfig: elementConfig, type: type, renderElement: renderElement }) }), isLoading && jsx(ContainerLoading, {}), !isLoading && isVisible && (jsx(FiltersContainerWrapper, { ...root, "$padding": padding, "$bgColor": bgColor, "$fontSize": fontSize, "$fontColor": fontColor, children: filterItems?.map(renderFilter) })), jsx(HiddenTitleItems, { elementConfig: elementConfig, config: config, type: type, filter: filterItems[0]?.options?.filterName })] }));
8675
+ return (jsxs(ContainerRoot, { ...root, children: [jsx(Flex, { mb: !isVisible && selectedItems.length ? "2rem" : 0, children: jsx(ExpandableTitle, { elementConfig: elementConfig, type: type, renderElement: renderElement }) }), isLoading && jsx(ContainerLoading, {}), !isLoading && isVisible && (jsx(FiltersContainerWrapper, { ...body, "$padding": padding, "$bgColor": bgColor, "$fontSize": fontSize, "$fontColor": fontColor, children: filterItems?.map(renderFilter) })), jsx(HiddenTitleItems, { elementConfig: elementConfig, config: config, type: type, filter: filterItems[0]?.options?.filterName })] }));
8612
8676
  });
8613
8677
 
8614
8678
  const DefaultAttributesContainer = memo(({ type, renderElement }) => {
@@ -8616,26 +8680,6 @@ const DefaultAttributesContainer = memo(({ type, renderElement }) => {
8616
8680
  return (jsx(Fragment$1, { children: attributes?.map(({ attributeName }) => (jsx(Container, { isColumn: true, children: renderElement({ id: attributeName }) }, attributeName))) }));
8617
8681
  });
8618
8682
 
8619
- const ChartContainerWrapper = styled(FlexSpan).withConfig({ displayName: "ChartContainerWrapper", componentId: "sc-17oj4lo" }) `
8620
- flex-direction: column;
8621
- min-width: 0;
8622
-
8623
- /* Заданная высота контейнера достаётся телу графика — за вычетом заголовка. */
8624
- ${({ $sizeCss }) => !!$sizeCss?.height &&
8625
- css `
8626
- /* Раздача высоты требует, чтобы обёртка была flex-колонкой (FlexSpan сам по себе не flex),
8627
- иначе Container с flex:1 1 auto не растянется на заданную высоту, а fill-график не впишется по высоте. */
8628
- display: flex;
8629
-
8630
- > ${Container} {
8631
- flex: 1 1 auto;
8632
- min-height: 0;
8633
- }
8634
- `}
8635
-
8636
- ${sizeCssMixin};
8637
- `;
8638
-
8639
8683
  /**
8640
8684
  * Контекст вписывания графика (`options.fill` контейнера Chart).
8641
8685
  *
@@ -8653,7 +8697,7 @@ const ChartContainer = memo(({ elementConfig, isVisible, type, renderElement })
8653
8697
  const aliasElement = children.find(child => child.id === "alias");
8654
8698
  const chartElement = children.find(child => child.id === "chart");
8655
8699
  const legendElement = children.find(child => child.id === "legend");
8656
- const root = useWrapperSize({ elementConfig });
8700
+ const { root, body } = useContainerRoot({ elementConfig });
8657
8701
  const { data, loading } = useChartData({
8658
8702
  element: chartElement,
8659
8703
  type,
@@ -8664,7 +8708,7 @@ const ChartContainer = memo(({ elementConfig, isVisible, type, renderElement })
8664
8708
  const hasItems = !!data[0]?.items?.length;
8665
8709
  if (!loading && !hasItems && hideEmpty)
8666
8710
  return null;
8667
- return (jsxs(ChartContainerWrapper, { ...root, children: [jsx(ExpandableTitle, { elementConfig: elementConfig, type: type, renderElement: renderElement }), isVisible && (jsxs(Container, { isColumn: true, children: [aliasElement && jsx(ContainerAlias, { hasBottomMargin: true, children: renderElement({ id: "alias" }) }), jsx(ContainerValue, { column: !twoColumns, alignItems: twoColumns && fill ? "stretch" : "center", "$fill": !!fill, children: hasItems ? (jsxs(Fragment$1, { children: [jsx(ContainerChart, { "$fill": !!fill, children: jsx(FillContext.Provider, { value: fillContextValue, children: renderElement({ id: "chart" }) }) }), jsx(ContainerLegend, { justifyContent: legendElement?.options?.center ? "center" : "flex-start", children: renderElement({ id: "legend" }) })] })) : (jsx(Fragment$1, { children: "\u2014" })) })] }))] }));
8711
+ return (jsxs(ContainerRoot, { ...root, children: [jsx(ExpandableTitle, { elementConfig: elementConfig, type: type, renderElement: renderElement }), isVisible && (jsxs(Container, { ...body, isColumn: true, children: [aliasElement && jsx(ContainerAlias, { hasBottomMargin: true, children: renderElement({ id: "alias" }) }), jsx(ContainerValue, { column: !twoColumns, alignItems: twoColumns && fill ? "stretch" : "center", "$fill": !!fill, children: hasItems ? (jsxs(Fragment$1, { children: [jsx(ContainerChart, { "$fill": !!fill, children: jsx(FillContext.Provider, { value: fillContextValue, children: renderElement({ id: "chart" }) }) }), jsx(ContainerLegend, { justifyContent: legendElement?.options?.center ? "center" : "flex-start", children: renderElement({ id: "legend" }) })] })) : (jsx(Fragment$1, { children: "\u2014" })) })] }))] }));
8668
8712
  });
8669
8713
 
8670
8714
  const PagesContainer = memo(({ type = WidgetType.Dashboard, noBorders }) => {
@@ -8890,13 +8934,13 @@ const DataSourceContainer = memo(({ config, elementConfig, type, innerComponent,
8890
8934
  gap: gap ?? DEFAULT_TILE_GAP,
8891
8935
  });
8892
8936
  const defaults = useMemo(() => ({ height: isLoading ? "3rem" : "auto" }), [isLoading]);
8893
- const root = useWrapperSize({ elementConfig, defaults });
8937
+ const { root, body } = useContainerRoot({ elementConfig, defaults });
8894
8938
  if (!relatedDataSource)
8895
8939
  return null;
8896
8940
  if (dataSource && !dataSource.features) {
8897
8941
  return jsx(DataSourceError, { name: elementConfig.templateName });
8898
8942
  }
8899
- return (jsxs(Fragment$1, { children: [jsx(ExpandableTitle, { elementConfig: elementConfig, type: type, renderElement: renderElement }), !isVisible ? null : dataSource ? (jsxs(Fragment$1, { children: [jsx(DataSourceContainerWrapper, { ...root, ref: tilesRef, isColumn: column, "$isRow": !column, "$columns": columns, "$gap": gap, "$align": align, "$stretch": stretch, "$tileWidth": tileWidth, children: sliceItems(dataSource.features)?.map((feature, index) => (jsx(DataSourceInnerContainer, { index: index, type: type, config: config, feature: feature, elementConfig: elementConfig, innerComponent: innerComponent }, index))) }), checkIsSliced(dataSource.features) && (jsx(ContainerToggler, { toggled: showMore, onClick: onShowMore, children: showMore
8943
+ return (jsxs(ContainerRoot, { ...root, children: [jsx(ExpandableTitle, { elementConfig: elementConfig, type: type, renderElement: renderElement }), !isVisible ? null : dataSource ? (jsxs(Fragment$1, { children: [jsx(DataSourceContainerWrapper, { ...body, ref: tilesRef, isColumn: column, "$isRow": !column, "$columns": columns, "$gap": gap, "$align": align, "$stretch": stretch, "$tileWidth": tileWidth, children: sliceItems(dataSource.features)?.map((feature, index) => (jsx(DataSourceInnerContainer, { index: index, type: type, config: config, feature: feature, elementConfig: elementConfig, innerComponent: innerComponent }, index))) }), checkIsSliced(dataSource.features) && (jsx(ContainerToggler, { toggled: showMore, onClick: onShowMore, children: showMore
8900
8944
  ? t("hide", { ns: "dashboard", defaultValue: "Свернуть" })
8901
8945
  : t("showAll", { ns: "dashboard", defaultValue: "Показать все" }) }))] })) : (jsx(ContainerLoading, {}))] }));
8902
8946
  });
@@ -9056,7 +9100,7 @@ const SlideshowContainer = memo(({ config, elementConfig, type }) => {
9056
9100
  const { id, options } = elementConfig || {};
9057
9101
  const { expandable, expanded } = options || {};
9058
9102
  const isVisible = isVisibleContainer(id, expandable, expanded, expandedContainers);
9059
- const root = useWrapperSize({ elementConfig });
9103
+ const { root, body } = useContainerRoot({ elementConfig });
9060
9104
  const render = useMemo(() => getRenderElement({
9061
9105
  config,
9062
9106
  elementConfig,
@@ -9082,11 +9126,11 @@ const SlideshowContainer = memo(({ config, elementConfig, type }) => {
9082
9126
  // Подпись `alias` не задают почти всегда — тогда обёртку не рендерим, чтобы в DOM не оставался
9083
9127
  // пустой блок, который вдобавок отъедал бы половину ширины у галереи (см. isColumn ниже).
9084
9128
  const aliasNode = render({ id: "alias" });
9085
- return (jsxs(Fragment$1, { children: [jsx(ExpandableTitle, { elementConfig: elementConfig, type: type, renderElement: render }), isVisible && (
9129
+ return (jsxs(ContainerRoot, { ...root, children: [jsx(ExpandableTitle, { elementConfig: elementConfig, type: type, renderElement: render }), isVisible && (
9086
9130
  // `isColumn`: подпись над галереей, а сама галерея на всю ширину. Без него Container
9087
9131
  // раскладывает alias и slideshow в ряд, и оба (Flex с `width: 100%`) сжимаются пополам —
9088
9132
  // картинка занимала лишь половину доступной ширины.
9089
- jsxs(Container, { ...root, isColumn: true, children: [aliasNode && jsx(ContainerAlias, { hasBottomMargin: true, children: aliasNode }), jsx(ContainerValue, { children: render({
9133
+ jsxs(Container, { ...body, isColumn: true, children: [aliasNode && jsx(ContainerAlias, { hasBottomMargin: true, children: aliasNode }), jsx(ContainerValue, { children: render({
9090
9134
  id: "slideshow",
9091
9135
  wrap: false,
9092
9136
  }) })] }))] }));
@@ -9097,8 +9141,8 @@ const CameraContainer = memo(({ elementConfig, type, renderElement }) => {
9097
9141
  const { id, options } = elementConfig || {};
9098
9142
  const { expandable, expanded } = options || {};
9099
9143
  const isVisible = isVisibleContainer(id, expandable, expanded, expandedContainers);
9100
- const root = useWrapperSize({ elementConfig });
9101
- return (jsxs(Fragment$1, { children: [jsx(ExpandableTitle, { elementConfig: elementConfig, type: type, renderElement: renderElement }), isVisible && (jsxs(Container, { ...root, children: [jsx(ContainerAlias, { hasBottomMargin: true, children: renderElement({ id: "alias" }) }), jsx(ContainerValue, { children: renderElement({ id: "value", wrap: false }) })] }))] }));
9144
+ const { root, body } = useContainerRoot({ elementConfig });
9145
+ return (jsxs(ContainerRoot, { ...root, children: [jsx(ExpandableTitle, { elementConfig: elementConfig, type: type, renderElement: renderElement }), isVisible && (jsxs(Container, { ...body, children: [jsx(ContainerAlias, { hasBottomMargin: true, children: renderElement({ id: "alias" }) }), jsx(ContainerValue, { children: renderElement({ id: "value", wrap: false }) })] }))] }));
9102
9146
  });
9103
9147
 
9104
9148
  const TabAnchor = styled.div.withConfig({ displayName: "TabAnchor", componentId: "sc-emqf31" }) `
@@ -9518,7 +9562,7 @@ const LayersContainer = memo(({ type, elementConfig, renderElement }) => {
9518
9562
  const { id, options } = elementConfig || {};
9519
9563
  const { layerNames, expandable, expanded } = options || {};
9520
9564
  const isVisible = isVisibleContainer(id, expandable, expanded, expandedContainers);
9521
- const root = useWrapperSize({ elementConfig });
9565
+ const { root, body } = useContainerRoot({ elementConfig });
9522
9566
  const layers = useMemo(() => {
9523
9567
  if (!currentPage?.layers)
9524
9568
  return [];
@@ -9526,7 +9570,7 @@ const LayersContainer = memo(({ type, elementConfig, renderElement }) => {
9526
9570
  return currentPage.layers;
9527
9571
  return currentPage.layers.filter(({ name }) => layerNames.includes(name));
9528
9572
  }, [currentPage?.layers, layerNames]);
9529
- return (jsxs(Fragment$1, { children: [jsx(ExpandableTitle, { elementConfig: elementConfig, type: type, renderElement: renderElement }), isVisible && (jsx(LayersContainerWrapper, { ...root, children: jsx(LayerTree, { layers: layers, onlyMainTools: true }) }))] }));
9573
+ return (jsxs(ContainerRoot, { ...root, children: [jsx(ExpandableTitle, { elementConfig: elementConfig, type: type, renderElement: renderElement }), isVisible && (jsx(LayersContainerWrapper, { ...body, children: jsx(LayerTree, { layers: layers, onlyMainTools: true }) }))] }));
9530
9574
  });
9531
9575
 
9532
9576
  const ExportPdfContainer = memo(({ type, elementConfig }) => {
@@ -9562,8 +9606,8 @@ const UploadContainer = memo(({ type, elementConfig, renderElement }) => {
9562
9606
  const { id, options } = elementConfig || {};
9563
9607
  const { expandable, expanded } = options || {};
9564
9608
  const isVisible = isVisibleContainer(id, expandable, expanded, expandedContainers);
9565
- const root = useWrapperSize({ elementConfig });
9566
- return (jsxs(Fragment$1, { children: [jsx(ExpandableTitle, { elementConfig: elementConfig, type: type, renderElement: renderElement }), isVisible && (jsx(UploadContainerWrapper, { ...root, children: renderElement({ id: "uploader", wrap: false }) }))] }));
9609
+ const { root, body } = useContainerRoot({ elementConfig });
9610
+ return (jsxs(ContainerRoot, { ...root, children: [jsx(ExpandableTitle, { elementConfig: elementConfig, type: type, renderElement: renderElement }), isVisible && (jsx(UploadContainerWrapper, { ...body, children: renderElement({ id: "uploader", wrap: false }) }))] }));
9567
9611
  });
9568
9612
 
9569
9613
  const StatusBadge = styled(Chip).withConfig({ displayName: "StatusBadge", componentId: "sc-1xmfl10" }) `
@@ -9783,7 +9827,7 @@ const TaskContainer = memo(({ type, elementConfig, renderElement }) => {
9783
9827
  const { taskId, runTask, stopTask, status, openLog, loading, isLogDialogOpen, closeLog, log, lastMessage, result, } = usePythonTask();
9784
9828
  const { options } = elementConfig || {};
9785
9829
  const { title, relatedResources, center, icon, statusColors, responseFilters, useNotifications, } = options || {};
9786
- const root = useWrapperSize({ elementConfig });
9830
+ const { root, body } = useContainerRoot({ elementConfig });
9787
9831
  const { setNotificationDismissed } = useTaskNotifications({
9788
9832
  enabled: !!useNotifications,
9789
9833
  suppressed: isLogDialogOpen,
@@ -9823,12 +9867,12 @@ const TaskContainer = memo(({ type, elementConfig, renderElement }) => {
9823
9867
  return runTask({ resourceId, parameters: newParams, script, fileName, methodName });
9824
9868
  }));
9825
9869
  }, [attributes, currentPage.filters, dataSources, ewktGeometry, layerInfo, projectDataSources, relatedResources, runTask, selectedFilters, stopTask, taskId]);
9826
- return (jsxs(Fragment$1, { children: [jsx(ExpandableTitle, { elementConfig: elementConfig, type: type, renderElement: renderElement }), jsxs(TaskContainerWrapper, { ...root, justifyContent: center ? "center" : "flex-start", children: [jsx(StatusWaitingButton, { title: title || t("run", { ns: "dashboard", defaultValue: "Запуск" }), icon: icon, status: status, statusColors: statusColors, isWaiting: loading || !!taskId, isDisabled: !relatedResources?.length, onClick: onClick }), !!(log || taskId) && (jsxs(Fragment$1, { children: [jsx(IconButton, { kind: "info", onClick: openLog }), jsx(LogDialog, { logs: log, status: status, statusColors: statusColors, isOpen: isLogDialogOpen, onClose: onCloseLog, onMinimize: useNotifications ? onMinimizeLog : undefined })] }))] })] }));
9870
+ return (jsxs(ContainerRoot, { ...root, children: [jsx(ExpandableTitle, { elementConfig: elementConfig, type: type, renderElement: renderElement }), jsxs(TaskContainerWrapper, { ...body, justifyContent: center ? "center" : "flex-start", children: [jsx(StatusWaitingButton, { title: title || t("run", { ns: "dashboard", defaultValue: "Запуск" }), icon: icon, status: status, statusColors: statusColors, isWaiting: loading || !!taskId, isDisabled: !relatedResources?.length, onClick: onClick }), !!(log || taskId) && (jsxs(Fragment$1, { children: [jsx(IconButton, { kind: "info", onClick: openLog }), jsx(LogDialog, { logs: log, status: status, statusColors: statusColors, isOpen: isLogDialogOpen, onClose: onCloseLog, onMinimize: useNotifications ? onMinimizeLog : undefined })] }))] })] }));
9827
9871
  });
9828
9872
 
9829
9873
  const EditContainer = ({ type, elementConfig, renderElement }) => {
9830
- const { id, style } = elementConfig || {};
9831
- return (jsxs(Fragment$1, { children: [jsx(ExpandableTitle, { elementConfig: elementConfig, type: type, renderElement: renderElement }), jsxs(Container, { id: id, isColumn: true, style: style, children: [jsx(ContainerAlias, { hasBottomMargin: true, children: renderElement({ id: "alias" }) }), jsx(ContainerValue, { children: renderElement({ id: "value" }) })] })] }));
9874
+ const { root, body } = useContainerRoot({ elementConfig });
9875
+ return (jsxs(ContainerRoot, { ...root, children: [jsx(ExpandableTitle, { elementConfig: elementConfig, type: type, renderElement: renderElement }), jsxs(Container, { ...body, isColumn: true, children: [jsx(ContainerAlias, { hasBottomMargin: true, children: renderElement({ id: "alias" }) }), jsx(ContainerValue, { children: renderElement({ id: "value" }) })] })] }));
9832
9876
  };
9833
9877
 
9834
9878
  const getControlTemplateName = (type) => {
@@ -10565,7 +10609,7 @@ const AttachmentContainer = memo(({ type, elementConfig, renderElement }) => {
10565
10609
  const { items, visibleItems, viewMode, setViewMode, showMore, setShowMore, hasMore, hiddenCount } = useAttachmentContainer({ type, elementConfig });
10566
10610
  const { id, options } = elementConfig || {};
10567
10611
  const { expandable, expanded } = options || {};
10568
- const root = useWrapperSize({ elementConfig, defaults: BASE_CONTAINER_STYLE });
10612
+ const { root, body } = useContainerRoot({ elementConfig, defaults: BASE_CONTAINER_STYLE });
10569
10613
  const [previewIndex, setPreviewIndex] = useState(null);
10570
10614
  const previewImages = useAttachmentPreviewImages({ items, active: previewIndex !== null });
10571
10615
  const handlePreview = useCallback((link) => {
@@ -10576,7 +10620,7 @@ const AttachmentContainer = memo(({ type, elementConfig, renderElement }) => {
10576
10620
  const handleClosePreview = useCallback(() => setPreviewIndex(null), []);
10577
10621
  const handleShowMore = useCallback(() => setShowMore(true), [setShowMore]);
10578
10622
  const isVisible = isVisibleContainer(id, expandable, expanded, expandedContainers);
10579
- return (jsxs(Fragment$1, { children: [jsx(ExpandableTitle, { elementConfig: elementConfig, type: type, renderElement: renderElement }), isVisible && (jsx(Container, { ...root, children: jsxs(Flex, { column: true, children: [jsx(AttachmentsHeader, { alias: renderElement?.({ id: "alias" }), count: items.length, viewMode: viewMode, onChangeViewMode: setViewMode }), jsx(AttachmentsContent, { children: viewMode === "grid" ? (jsx(AttachmentsGrid, { items: visibleItems, isEdit: false, onPreview: handlePreview })) : (jsx(AttachmentsList, { items: visibleItems, isEdit: false, onPreview: handlePreview })) }), hasMore && !showMore && (jsx(ShowMoreButton, { hiddenCount: hiddenCount, onClick: handleShowMore })), previewIndex !== null && (jsx(Preview, { images: previewImages, initialIndex: previewIndex, isOpen: previewIndex !== null, onClose: handleClosePreview, errorTitleText: t("attachments.resourceUnavailable", {
10623
+ return (jsxs(ContainerRoot, { ...root, children: [jsx(ExpandableTitle, { elementConfig: elementConfig, type: type, renderElement: renderElement }), isVisible && (jsx(Container, { ...body, children: jsxs(Flex, { column: true, children: [jsx(AttachmentsHeader, { alias: renderElement?.({ id: "alias" }), count: items.length, viewMode: viewMode, onChangeViewMode: setViewMode }), jsx(AttachmentsContent, { children: viewMode === "grid" ? (jsx(AttachmentsGrid, { items: visibleItems, isEdit: false, onPreview: handlePreview })) : (jsx(AttachmentsList, { items: visibleItems, isEdit: false, onPreview: handlePreview })) }), hasMore && !showMore && (jsx(ShowMoreButton, { hiddenCount: hiddenCount, onClick: handleShowMore })), previewIndex !== null && (jsx(Preview, { images: previewImages, initialIndex: previewIndex, isOpen: previewIndex !== null, onClose: handleClosePreview, errorTitleText: t("attachments.resourceUnavailable", {
10580
10624
  ns: "common",
10581
10625
  defaultValue: "Ресурс недоступен",
10582
10626
  }) }, previewIndex))] }) }))] }));
@@ -15205,5 +15249,5 @@ const DEFAULT_CIRCLE_STYLE = {
15205
15249
  ],
15206
15250
  };
15207
15251
 
15208
- export { ALIGNMENTS, ALIGN_ITEMS, ATTRIBUTE_ICON_ELEMENT_TYPES, AddFeatureButton, AddFeatureContainer, AlertIconContainer, AttachmentContainer, AttributeGalleryContainer, AttributeLabel, BASE_CONTAINER_STYLE, BaseMapTheme, CHART_TYPES, CONFIG_PAGES_ID, CONFIG_PAGE_ID, CameraContainer, Chart, ChartContainer, ChartLegend, ChartLoading, Container, ContainerChildren, ContainerLoading, ContainerTemplate, ContainerWrapper, ContainersGroupContainer, DEFAULT_ATTRIBUTE_NAME, DEFAULT_BARCHART_RADIUS, DEFAULT_BASE_MAP, DEFAULT_BLUR, DEFAULT_CHART_ANGLE, DEFAULT_CHART_HEIGHT, DEFAULT_CHART_WIDTH, DEFAULT_CIRCLE_RADIUS, DEFAULT_CIRCLE_STYLE, DEFAULT_COLOR, DEFAULT_DASHBOARD_CONFIG, DEFAULT_DATA_SOURCE_LIMIT, DEFAULT_DROPDOWN_WIDTH, DEFAULT_FILL_EXTRUSION_STYLE, DEFAULT_FILL_STYLE, DEFAULT_FILTER_PADDING, DEFAULT_ID_ATTRIBUTE_NAME, DEFAULT_LAT, DEFAULT_LINE_CAP, DEFAULT_LINE_JOIN, DEFAULT_LINE_STYLE, DEFAULT_LINE_WIDTH, DEFAULT_LNG, DEFAULT_OPACITY, DEFAULT_PAGES_CONFIG, DEFAULT_PIECHART_RADIUS, DEFAULT_ZOOM, Dashboard, DashboardCheckbox, DashboardChip, DashboardContent, DashboardContext, DashboardDefaultHeader, DashboardHeader, DashboardLoading, DashboardPlaceholder, DashboardPlaceholderWrap, DashboardProvider, DashboardWrapper, DataSourceContainer, DataSourceError, DataSourceErrorContainer, DataSourceInnerContainer, DataSourceProgressContainer, DateFormat, DefaultAttributesContainer, DefaultHeaderContainer, DefaultHeaderWrapper, DividerContainer, EMPTY_DATA_SOURCE_LAYER_INFO, EditGeometryType, ElementButton, ElementCamera, ElementChart, ElementChips, ElementControl, ElementIcon, ElementImage, ElementLegend, ElementLink, ElementMarkdown, ElementSlideshow, ElementSvg, ElementTooltip, ElementValueWrapper, ExpandableTitle, FEATURE_CARD_DEFAULT_COLORS, FEATURE_CARD_OTHER_COLOR, FILL_SIZE, FILTERED_VALUE_OPACITY, FILTER_PREFIX, FeatureCardBackgroundHeader, FeatureCardButtons, FeatureCardContext, FeatureCardDefaultHeader, FeatureCardHeader, FeatureCardProvider, FeatureCardSlideshowHeader, FeatureCardTitle, FeatureControls, FeatureTitleContainer, FiltersContainer, GEOMETRY_ATTRIBUTE, GlobalContext, GlobalProvider, Header, HeaderContainer, HeaderFontColorMixin, HeaderFrontView, HeaderTemplate, HeaderTitleContainer, HiddenTitleItems, IconContainer, ImageContainer, LEFT_PANEL_HEADER_HEIGHT, Layer, LayerDescription, LayerGroupList, LayerIcon, LayerIconContainer, LayerListContainer, LayerTree, LayersContainer, LayersListWrapper, LinearProgressContainer, LogTerminal, LogoContainer, MAX_CHART_WIDTH, Map$1 as Map, MapContext, MapProvider, NO_CONTENT_VALUE, NUMERIC_ATTRIBUTE_TYPES, NoLiveSnapshotContainer, OBJECT_FITS, OVERFLOWS, OneColumnContainer, POLL_SUBTASK_INTERVAL_MS, POLL_SUBTASK_TIMEOUT_MS, PROVIDER_PREFIX, PageNavigator, PageTitle, PageTitleContainer, PagesContainer, Pagination, PresentationHeader, PresentationHeaderButtons, PresentationHeaderTools, PresentationPanelContainer, PresentationPanelWrapper, PresentationWrapper, ProgressContainer, ProviderPrefix, QUERY_DESCRIPTION_CACHE_TTL, RoundedBackgroundContainer, SAVE_HOOK_RESULT_DURATION, SERVER_NOTIFICATION_EVENT, STACK_BAR_TOTAL_HEIGHT, ScalingFactor, ServerNotificationsContext, ServerNotificationsProvider, SlideshowContainer, SmallPreviewContainer$1 as SmallPreviewContainer, SmallPreviewControl, SmallPreviewCounter, SmallPreviewImages, SmallPreviewLeft, SmallPreviewRight, StackBar, SvgImage, TILE_ALIGNMENTS, TIME_ZONE_FORMAT, TabsContainer, TextTrim, ThemeName, TitleContainer, TopContainer, TopContainerButtons, TwoColumnContainer, UploadContainer, VIEW_MODES, WidgetType, addDataSource, addDataSources, adjustColor, applyFiltersToCondition, applyQueryFilters, applyTreeFilterToCondition, applyVarsToCondition, asAttributeName, asChartId, asContainerId, asDataSourceName, asFilterName, asLayerName, asModalId, asResourceId, asTabId, checkEqualOrIncludes, checkIsLoading, createConfigLayer, createConfigPage, createNewPageId, createSaveNotificationId, dateOptions, debounce, decimalOpacityToHex, enrichStyleItemsWithIds, enrichStyleModelsWithIds, eqlParametersToPayload, fetchQueryDescription, findAttributeInExpression, formatArea, formatAttributeValue, formatChartRelatedValue, formatConditionValue, formatDataSourceCondition, formatDate$1 as formatDate, formatElementValue, formatLength, formatNumber, formatPolygonMeasure, geometryToEwkt, getActualExtrusionHeight, getAttributeByName, getAttributeConfigurationByName, getAttributeIconElement, getAttributeIconUrl, getAttributeValue, getAttributesConfiguration, getChartAxes, getChartFilterName, getChartMarkers, getConfigFilter, getContainerComponent, getDashboardHeader, getDataFromAttributes, getDataFromRelatedFeatures, getDataSource, getDataSourceFilterValue, getDataSourceLayerInfo, getDate, getDefaultConfig, getDisplayTemplateNameFromAttribute, getElementValue, getFeatureAttributes, getFeatureCardHeader, getFilterComponent, getFilterSelectedItems, getFilterValue, getFormattedAttributes, getGradientColors, getImageUrl, getLayerClientStyle, getLayerInfo, getLayerInfoAttribute, getLayerInfoFromDataSources, getPagesFromConfig, getPagesFromProjectInfo, getProxyService, getRelatedAttribute, getRenderElement, getResourceUrl, getRootElementId, getSelectedFilterValue, getSlideshowImages, getStyleAttributes, getSvgUrl, getTemplateNameFromAttribute, getThemeByName, getTotalFromAttributes, getTotalFromRelatedFeatures, getWrapperSizeStyle, hexToRgba, isEmptyElementValue, isEmptyValue, isFillSize, isHiddenEmptyValue, isHookActive, isLayerService, isNotValidSelectedTab, isNumeric, isObject, isProxyService, isTreeFilterValue, isVisibleContainer, mergeAttributeConfigurations, metersPerPixel, numberOptions, parseIconNames, parseIconNamesFromClientStyle, pieChartTooltipFromAttributes, pieChartTooltipFromRelatedFeatures, pointOptions, removeDataSource, rgbToHex, roundTotalSum, sizeCssMixin, sliceShownOtherItems, stretchPalette, timeOptions, toCssSize, toPxNumber, toRenderableValue, tooltipNameFromAttributes, tooltipValueFromAttributes, tooltipValueFromRelatedFeatures, transparentizeColor, updateDataSource, useAfterSave, useAppHeight, useAttachmentItems, useAttachmentPreviewImages, useAutoCompleteControl, useBeforeSave, useChartChange, useChartData, useContainerAttributes, useCurrentPageLayers, useCustomFeatureSelect, useDashboardHeader, useDataSources, useDebouncedCallback, useDiffPage, useEditGroupAttributes, useEqualTileWidth, useExpandableContainers, useExportPdf, useFeatureSaveHooks, useFetchImageWithAuth, useFetchWithAuth, useGetConfigLayer, useGlobalContext, useHeaderRender, useHideIfEmptyDataSource, useIconsFromLayers, useLayerHiddenAttributes, useLayerParams, useMapContext, useMapDraw, useMapImages, useMaxZoomTo, useProjectDashboardInit, usePythonSandbox, usePythonTask, useRedrawLayer, useRelatedDataSourceAttributes, useRemoteTask, useRenderElement, useResizeBox, useSavePrototypeBuilder, useServerNotificationsContext, useShownOtherItems, useToggle, useUpdateDataSource, useVisibleProjectItems, useWidgetConfig, useWidgetContext, useWidgetFilters, useWidgetPage, useWindowResize, useWrapperSize, useZoomToFeatures, useZoomToPoint };
15252
+ export { ALIGNMENTS, ALIGN_ITEMS, ATTRIBUTE_ICON_ELEMENT_TYPES, AddFeatureButton, AddFeatureContainer, AlertIconContainer, AttachmentContainer, AttributeGalleryContainer, AttributeLabel, BASE_CONTAINER_STYLE, BaseMapTheme, CHART_TYPES, COMPACT_FRACTION_DIGITS, CONFIG_PAGES_ID, CONFIG_PAGE_ID, CONTAINER_BODY_ATTRIBUTE, CONTAINER_BODY_FILL_STYLE, CameraContainer, Chart, ChartContainer, ChartLegend, ChartLoading, Container, ContainerChildren, ContainerLoading, ContainerRoot, ContainerTemplate, ContainerWrapper, ContainersGroupContainer, DEFAULT_ATTRIBUTE_NAME, DEFAULT_BARCHART_RADIUS, DEFAULT_BASE_MAP, DEFAULT_BLUR, DEFAULT_CHART_ANGLE, DEFAULT_CHART_HEIGHT, DEFAULT_CHART_WIDTH, DEFAULT_CIRCLE_RADIUS, DEFAULT_CIRCLE_STYLE, DEFAULT_COLOR, DEFAULT_DASHBOARD_CONFIG, DEFAULT_DATA_SOURCE_LIMIT, DEFAULT_DROPDOWN_WIDTH, DEFAULT_FILL_EXTRUSION_STYLE, DEFAULT_FILL_STYLE, DEFAULT_FILTER_PADDING, DEFAULT_ID_ATTRIBUTE_NAME, DEFAULT_LAT, DEFAULT_LINE_CAP, DEFAULT_LINE_JOIN, DEFAULT_LINE_STYLE, DEFAULT_LINE_WIDTH, DEFAULT_LNG, DEFAULT_OPACITY, DEFAULT_PAGES_CONFIG, DEFAULT_PIECHART_RADIUS, DEFAULT_ZOOM, Dashboard, DashboardCheckbox, DashboardChip, DashboardContent, DashboardContext, DashboardDefaultHeader, DashboardHeader, DashboardLoading, DashboardPlaceholder, DashboardPlaceholderWrap, DashboardProvider, DashboardWrapper, DataSourceContainer, DataSourceError, DataSourceErrorContainer, DataSourceInnerContainer, DataSourceProgressContainer, DateFormat, DefaultAttributesContainer, DefaultHeaderContainer, DefaultHeaderWrapper, DividerContainer, EMPTY_DATA_SOURCE_LAYER_INFO, EditGeometryType, ElementButton, ElementCamera, ElementChart, ElementChips, ElementControl, ElementIcon, ElementImage, ElementLegend, ElementLink, ElementMarkdown, ElementSlideshow, ElementSvg, ElementTooltip, ElementValueWrapper, ExpandableTitle, FEATURE_CARD_DEFAULT_COLORS, FEATURE_CARD_OTHER_COLOR, FILL_SIZE, FILTERED_VALUE_OPACITY, FILTER_PREFIX, FeatureCardBackgroundHeader, FeatureCardButtons, FeatureCardContext, FeatureCardDefaultHeader, FeatureCardHeader, FeatureCardProvider, FeatureCardSlideshowHeader, FeatureCardTitle, FeatureControls, FeatureTitleContainer, FiltersContainer, GEOMETRY_ATTRIBUTE, GlobalContext, GlobalProvider, Header, HeaderContainer, HeaderFontColorMixin, HeaderFrontView, HeaderTemplate, HeaderTitleContainer, HiddenTitleItems, IconContainer, ImageContainer, LEFT_PANEL_HEADER_HEIGHT, Layer, LayerDescription, LayerGroupList, LayerIcon, LayerIconContainer, LayerListContainer, LayerTree, LayersContainer, LayersListWrapper, LinearProgressContainer, LogTerminal, LogoContainer, MAX_CHART_WIDTH, Map$1 as Map, MapContext, MapProvider, NO_CONTENT_VALUE, NUMERIC_ATTRIBUTE_TYPES, NoLiveSnapshotContainer, OBJECT_FITS, OVERFLOWS, OneColumnContainer, POLL_SUBTASK_INTERVAL_MS, POLL_SUBTASK_TIMEOUT_MS, PROVIDER_PREFIX, PageNavigator, PageTitle, PageTitleContainer, PagesContainer, Pagination, PresentationHeader, PresentationHeaderButtons, PresentationHeaderTools, PresentationPanelContainer, PresentationPanelWrapper, PresentationWrapper, ProgressContainer, ProviderPrefix, QUERY_DESCRIPTION_CACHE_TTL, RoundedBackgroundContainer, SAVE_HOOK_RESULT_DURATION, SERVER_NOTIFICATION_EVENT, STACK_BAR_TOTAL_HEIGHT, ScalingFactor, ServerNotificationsContext, ServerNotificationsProvider, SlideshowContainer, SmallPreviewContainer$1 as SmallPreviewContainer, SmallPreviewControl, SmallPreviewCounter, SmallPreviewImages, SmallPreviewLeft, SmallPreviewRight, StackBar, SvgImage, TILE_ALIGNMENTS, TIME_ZONE_FORMAT, TabsContainer, TextTrim, ThemeName, TitleContainer, TopContainer, TopContainerButtons, TwoColumnContainer, UploadContainer, VIEW_MODES, WidgetType, addDataSource, addDataSources, adjustColor, applyFiltersToCondition, applyQueryFilters, applyTreeFilterToCondition, applyVarsToCondition, asAttributeName, asChartId, asContainerId, asDataSourceName, asFilterName, asLayerName, asModalId, asResourceId, asTabId, checkEqualOrIncludes, checkIsLoading, createConfigLayer, createConfigPage, createNewPageId, createSaveNotificationId, dateOptions, debounce, decimalOpacityToHex, enrichStyleItemsWithIds, enrichStyleModelsWithIds, eqlParametersToPayload, fetchQueryDescription, findAttributeInExpression, formatArea, formatAttributeValue, formatChartRelatedValue, formatConditionValue, formatDataSourceCondition, formatDate$1 as formatDate, formatElementValue, formatLength, formatNumber, formatPolygonMeasure, geometryToEwkt, getActualExtrusionHeight, getAttributeByName, getAttributeConfigurationByName, getAttributeIconElement, getAttributeIconUrl, getAttributeValue, getAttributesConfiguration, getChartAxes, getChartFilterName, getChartMarkers, getConfigFilter, getContainerComponent, getDashboardHeader, getDataFromAttributes, getDataFromRelatedFeatures, getDataSource, getDataSourceFilterValue, getDataSourceLayerInfo, getDate, getDefaultConfig, getDisplayTemplateNameFromAttribute, getElementValue, getFeatureAttributes, getFeatureCardHeader, getFilterComponent, getFilterSelectedItems, getFilterValue, getFormattedAttributes, getGradientColors, getImageUrl, getLayerClientStyle, getLayerInfo, getLayerInfoAttribute, getLayerInfoFromDataSources, getPagesFromConfig, getPagesFromProjectInfo, getProxyService, getRelatedAttribute, getRenderElement, getResourceUrl, getRootElementId, getSelectedFilterValue, getSlideshowImages, getStyleAttributes, getSvgUrl, getTemplateNameFromAttribute, getThemeByName, getTotalFromAttributes, getTotalFromRelatedFeatures, getWrapperSizeStyle, hexToRgba, isEmptyElementValue, isEmptyValue, isFillSize, isHiddenEmptyValue, isHookActive, isLayerService, isNotValidSelectedTab, isNumeric, isObject, isProxyService, isTreeFilterValue, isVisibleContainer, mergeAttributeConfigurations, metersPerPixel, numberOptions, parseIconNames, parseIconNamesFromClientStyle, pieChartTooltipFromAttributes, pieChartTooltipFromRelatedFeatures, pointOptions, removeDataSource, rgbToHex, roundTotalSum, sizeCssMixin, sliceShownOtherItems, stretchPalette, timeOptions, toCssSize, toPxNumber, toRenderableValue, tooltipNameFromAttributes, tooltipValueFromAttributes, tooltipValueFromRelatedFeatures, transparentizeColor, updateDataSource, useAfterSave, useAppHeight, useAttachmentItems, useAttachmentPreviewImages, useAutoCompleteControl, useBeforeSave, useChartChange, useChartData, useContainerAttributes, useContainerRoot, useCurrentPageLayers, useCustomFeatureSelect, useDashboardHeader, useDataSources, useDebouncedCallback, useDiffPage, useEditGroupAttributes, useEqualTileWidth, useExpandableContainers, useExportPdf, useFeatureSaveHooks, useFetchImageWithAuth, useFetchWithAuth, useGetConfigLayer, useGlobalContext, useHeaderRender, useHideIfEmptyDataSource, useIconsFromLayers, useLayerHiddenAttributes, useLayerParams, useMapContext, useMapDraw, useMapImages, useMaxZoomTo, useProjectDashboardInit, usePythonSandbox, usePythonTask, useRedrawLayer, useRelatedDataSourceAttributes, useRemoteTask, useRenderElement, useResizeBox, useSavePrototypeBuilder, useServerNotificationsContext, useShownOtherItems, useToggle, useUpdateDataSource, useVisibleProjectItems, useWidgetConfig, useWidgetContext, useWidgetFilters, useWidgetPage, useWindowResize, useWrapperSize, useZoomToFeatures, useZoomToPoint };
15209
15253
  //# sourceMappingURL=react.esm.js.map