@evergis/react 4.0.148 → 4.0.150
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/components/Dashboard/containers/AttachmentContainer/components/ShowMoreButton.d.ts +3 -0
- package/dist/components/Dashboard/containers/AttachmentContainer/styled.d.ts +6 -0
- package/dist/components/Dashboard/containers/AttachmentContainer/useAttachmentContainer.d.ts +3 -9
- package/dist/components/Dashboard/containers/StructuredDataContainer/types.d.ts +6 -0
- package/dist/components/Dashboard/elements/ElementTable/components/AttachmentsCell.d.ts +4 -1
- package/dist/components/Dashboard/elements/ElementTable/components/AttachmentsCellPopup/index.d.ts +10 -0
- package/dist/components/Dashboard/elements/ElementTable/components/AttachmentsCellPopup/styled.d.ts +9 -0
- package/dist/components/Dashboard/elements/ElementTable/components/AttachmentsCellPopup.d.ts +10 -0
- package/dist/components/Dashboard/elements/ElementTable/components/ColorCell.d.ts +12 -0
- package/dist/components/Dashboard/elements/ElementTable/constants.d.ts +17 -0
- package/dist/components/Dashboard/elements/ElementTable/hooks/useAttachmentsCell.d.ts +5 -20
- package/dist/components/Dashboard/elements/ElementTable/hooks/useAttachmentsCellEdit.d.ts +28 -0
- package/dist/components/Dashboard/elements/ElementTable/styled.d.ts +31 -1
- package/dist/components/Dashboard/elements/ElementTable/types.d.ts +44 -0
- package/dist/components/Dashboard/hooks/index.d.ts +1 -0
- package/dist/components/Dashboard/hooks/useAttachmentsView.d.ts +25 -0
- package/dist/components/Dashboard/types.d.ts +15 -0
- package/dist/components/Dashboard/utils/interpolateTranslation.d.ts +8 -0
- package/dist/components/Dashboard/utils/sliceShownOtherItems.d.ts +5 -0
- package/dist/index.js +433 -64
- package/dist/index.js.map +1 -1
- package/dist/react.esm.js +432 -66
- package/dist/react.esm.js.map +1 -1
- package/dist/utils/color.d.ts +8 -0
- package/package.json +2 -2
- package/dist/components/Dashboard/grid/components/GridResizer/styled.d.ts +0 -11
package/dist/react.esm.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import styled, { createGlobalStyle, css, useTheme } from 'styled-components';
|
|
2
|
-
import { Icon, IconButtonInnerChild, IconButton, Flex, transition, Chip, shadows, Description, Divider, useDragAndDropEffect, Popup, Menu, IconToggleButton, LinearProgress, Tooltip as Tooltip$1, IconToggle, Preview, LegendToggler, DropdownField, MultiSelectContainer, IconButtonButton, FlatButton, DraggableTreeContainer, DraggableTree, FlexSpan, Dialog, DialogTitle, ActionsGroup, DialogContent, DialogActions, RaisedButton, UploaderItemArea, UploaderTitleWrapper, RadioGroup, Dropdown, Input, Switch, Checkbox, Radio, ThemeProvider, darkTheme, CircularProgress, AutoComplete, Slider, DatePicker, getLocale, H2, Blank, Popover, NumberInput, Uploader, NumberRangeSlider, useAsyncAutocomplete, RangeNumberInput, TreeDropdown, defaultTheme, dateFormat } from '@evergis/uilib-gl';
|
|
2
|
+
import { Icon, IconButtonInnerChild, IconButton, Flex, transition, Chip, shadows, Description, Divider, useDragAndDropEffect, Popup, Menu, IconToggleButton, LinearProgress, Tooltip as Tooltip$1, IconToggle, Preview, LegendToggler, DropdownField, MultiSelectContainer, IconButtonButton, FlatButton, DraggableTreeContainer, DraggableTree, FlexSpan, Dialog, DialogTitle, ActionsGroup, DialogContent, DialogActions, RaisedButton, UploaderItemArea, UploaderTitleWrapper, RadioGroup, Dropdown, Input, Switch, Checkbox, Radio, ThemeProvider, darkTheme, CircularProgress, AutoComplete, Slider, DatePicker, getLocale, H2, Blank, Popover, ColorPicker, NumberInput, Uploader, NumberRangeSlider, useAsyncAutocomplete, RangeNumberInput, TreeDropdown, defaultTheme, dateFormat } from '@evergis/uilib-gl';
|
|
3
3
|
import { jsx, jsxs, Fragment as Fragment$1 } from 'react/jsx-runtime';
|
|
4
4
|
import { isValidElement, Fragment, createContext, memo, useRef, useState, useCallback, useEffect, useContext, useMemo, createElement, useLayoutEffect, forwardRef } from 'react';
|
|
5
5
|
import { barChartClassNames, lineChartClassNames, BarChart as BarChart$1, LineChart, PieChart } from '@evergis/charts';
|
|
@@ -3847,7 +3847,7 @@ const hue2rgb = (p, q, t) => {
|
|
|
3847
3847
|
*/
|
|
3848
3848
|
const toHex = (value) => {
|
|
3849
3849
|
const hex = Math.round(value * 255).toString(16);
|
|
3850
|
-
return hex.padStart(2,
|
|
3850
|
+
return hex.padStart(2, "0");
|
|
3851
3851
|
};
|
|
3852
3852
|
/**
|
|
3853
3853
|
* Adjusts color brightness
|
|
@@ -3857,7 +3857,7 @@ const toHex = (value) => {
|
|
|
3857
3857
|
*/
|
|
3858
3858
|
const adjustColor = (color, lightnessAdjustment = 5) => {
|
|
3859
3859
|
// Convert hex to RGB
|
|
3860
|
-
const hex = color.replace(
|
|
3860
|
+
const hex = color.replace("#", "");
|
|
3861
3861
|
const r = parseInt(hex.substring(0, 2), 16) / 255;
|
|
3862
3862
|
const g = parseInt(hex.substring(2, 4), 16) / 255;
|
|
3863
3863
|
const b = parseInt(hex.substring(4, 6), 16) / 255;
|
|
@@ -3899,6 +3899,17 @@ const adjustColor = (color, lightnessAdjustment = 5) => {
|
|
|
3899
3899
|
}
|
|
3900
3900
|
return `#${toHex(rNew)}${toHex(gNew)}${toHex(bNew)}`;
|
|
3901
3901
|
};
|
|
3902
|
+
const OPAQUE_ALPHA = "ff";
|
|
3903
|
+
/**
|
|
3904
|
+
* Цвет в hex: `#rrggbb`, а при неполной непрозрачности — `#rrggbbaa`.
|
|
3905
|
+
*
|
|
3906
|
+
* Полностью непрозрачная альфа отбрасывается: в значении она ничего не уточняет, а строку
|
|
3907
|
+
* удлиняет — и в конфиге, и в данных удобнее короткая запись.
|
|
3908
|
+
*/
|
|
3909
|
+
const colorToHex = (color) => {
|
|
3910
|
+
const hex = color.toString("hex");
|
|
3911
|
+
return hex.slice(HEX_RRGGBB_LENGTH).toLowerCase() === OPAQUE_ALPHA ? hex.slice(0, HEX_RRGGBB_LENGTH) : hex;
|
|
3912
|
+
};
|
|
3902
3913
|
|
|
3903
3914
|
const NO_CONTENT_VALUE = "—";
|
|
3904
3915
|
var DateFormat;
|
|
@@ -5583,12 +5594,22 @@ const ServerNotificationsProvider = ({ url, initialized, apiClient, children })
|
|
|
5583
5594
|
}, children: children }));
|
|
5584
5595
|
};
|
|
5585
5596
|
|
|
5597
|
+
const INTERPOLATION_PATTERN = /\{\{\s*(\w+)\s*\}\}/g;
|
|
5598
|
+
/**
|
|
5599
|
+
* Подставляет в строку перевода переменные вида `{{total}}` — так, как это делает i18next.
|
|
5600
|
+
*
|
|
5601
|
+
* Нужна запасному переводчику, когда хост не передал свой `t` (например, в Storybook): без неё
|
|
5602
|
+
* `defaultValue` с переменными уходит в интерфейс как есть. Переменная без значения остаётся
|
|
5603
|
+
* в тексте, чтобы пропуск был виден.
|
|
5604
|
+
*/
|
|
5605
|
+
const interpolateTranslation = (text, values = {}) => text.replace(INTERPOLATION_PATTERN, (match, name) => values[name] === undefined || values[name] === null ? match : String(values[name]));
|
|
5606
|
+
|
|
5586
5607
|
const useGlobalContext = () => {
|
|
5587
5608
|
const { t, language, themeName, api, ewktGeometry, ewktExtent, zoomLevel, projectName, projectAlias, notification } = useContext(GlobalContext) || {};
|
|
5588
5609
|
const translate = useCallback((value, options) => {
|
|
5589
5610
|
if (t)
|
|
5590
5611
|
return t(value, options);
|
|
5591
|
-
return options?.defaultValue ?? value;
|
|
5612
|
+
return interpolateTranslation(options?.defaultValue ?? value, options);
|
|
5592
5613
|
}, [t]);
|
|
5593
5614
|
return useMemo(() => ({
|
|
5594
5615
|
t: translate,
|
|
@@ -6014,6 +6035,30 @@ const useAttachmentPreviewImages = ({ items, active, }) => {
|
|
|
6014
6035
|
}), [items, blobUrls, failedLinks]);
|
|
6015
6036
|
};
|
|
6016
6037
|
|
|
6038
|
+
/**
|
|
6039
|
+
* Вид списка вложений: плитка или строки и сколько файлов из списка показано.
|
|
6040
|
+
*
|
|
6041
|
+
* Общий для контейнера вложений и колонки таблицы: список у них один и тот же, и считать
|
|
6042
|
+
* видимое дважды незачем. Предел приходит числом, а не опциями конфига, — у колонки опций
|
|
6043
|
+
* вида нет, он у неё зашит константой.
|
|
6044
|
+
*/
|
|
6045
|
+
const useAttachmentsView = ({ items, limit, initialViewMode = "grid", }) => {
|
|
6046
|
+
const [viewMode, setViewMode] = useState(initialViewMode);
|
|
6047
|
+
const [showMore, setShowMore] = useState(false);
|
|
6048
|
+
const visibleItems = useMemo(() => (limit && !showMore ? items.slice(0, limit) : items), [items, limit, showMore]);
|
|
6049
|
+
const hiddenCount = items.length - visibleItems.length;
|
|
6050
|
+
const handleSetViewMode = useCallback((mode) => setViewMode(mode), []);
|
|
6051
|
+
return {
|
|
6052
|
+
visibleItems,
|
|
6053
|
+
hiddenCount,
|
|
6054
|
+
hasMore: hiddenCount > 0,
|
|
6055
|
+
showMore,
|
|
6056
|
+
setShowMore,
|
|
6057
|
+
viewMode,
|
|
6058
|
+
setViewMode: handleSetViewMode,
|
|
6059
|
+
};
|
|
6060
|
+
};
|
|
6061
|
+
|
|
6017
6062
|
const useAutoCompleteControl = (items) => {
|
|
6018
6063
|
const [value, setValue] = useState("");
|
|
6019
6064
|
const [options, setOptions] = useState([]);
|
|
@@ -8554,9 +8599,23 @@ const AttachmentsViewControls = styled.div.withConfig({ displayName: "Attachment
|
|
|
8554
8599
|
font-size: 1rem;
|
|
8555
8600
|
}
|
|
8556
8601
|
`;
|
|
8602
|
+
/**
|
|
8603
|
+
* Счётчик файлов у подписи — плоский чип в строку подписи.
|
|
8604
|
+
*
|
|
8605
|
+
* Шрифт ставится на текст чипа, а не на корень: текст задаёт себе шрифт шорткатом `font` из темы,
|
|
8606
|
+
* и размер с корня до цифры не доходит — чип выходил высоким, во весь шрифт описания.
|
|
8607
|
+
*/
|
|
8557
8608
|
const AttachmentsCountChip = styled(Chip).withConfig({ displayName: "AttachmentsCountChip", componentId: "sc-117ib6u" }) `
|
|
8558
|
-
|
|
8559
|
-
|
|
8609
|
+
&& {
|
|
8610
|
+
padding: 0.0625rem 0.25rem;
|
|
8611
|
+
border-radius: 0.75rem;
|
|
8612
|
+
}
|
|
8613
|
+
|
|
8614
|
+
span {
|
|
8615
|
+
font-size: 0.625rem;
|
|
8616
|
+
line-height: 0.75rem;
|
|
8617
|
+
font-weight: bold;
|
|
8618
|
+
}
|
|
8560
8619
|
`;
|
|
8561
8620
|
const AttachmentsContent = styled.div.withConfig({ displayName: "AttachmentsContent", componentId: "sc-1j2thff" }) `
|
|
8562
8621
|
width: 100%;
|
|
@@ -8749,22 +8808,31 @@ const LinkDialogContent = styled.div.withConfig({ displayName: "LinkDialogConten
|
|
|
8749
8808
|
padding: 1rem 0;
|
|
8750
8809
|
`;
|
|
8751
8810
|
|
|
8811
|
+
/**
|
|
8812
|
+
* Заглушка недоступного изображения.
|
|
8813
|
+
*
|
|
8814
|
+
* Масштаб значка считается от размера самого превью: `font-size` контейнера приравнен к нему, а
|
|
8815
|
+
* бокс значка и его глиф заданы одной долей от этого размера. Раньше бокс был долей превью, а
|
|
8816
|
+
* глиф — фиксированным: в списке, где превью всего `1.5rem`, глиф выходил втрое крупнее своего
|
|
8817
|
+
* бокса и съезжал относительно квадрата.
|
|
8818
|
+
*/
|
|
8752
8819
|
const ImagePreviewError = styled.div.withConfig({ displayName: "ImagePreviewError", componentId: "sc-7cwrhm" }) `
|
|
8753
8820
|
display: flex;
|
|
8754
8821
|
align-items: center;
|
|
8755
8822
|
justify-content: center;
|
|
8756
8823
|
width: 100%;
|
|
8757
8824
|
height: 100%;
|
|
8825
|
+
font-size: ${({ $size = GRID_TILE_SIZE }) => $size};
|
|
8758
8826
|
background-color: ${({ theme }) => theme.palette.elementDark};
|
|
8759
8827
|
border-radius: ${({ theme: { borderRadius: themeBorder }, borderRadius }) => borderRadius || themeBorder.smallest};
|
|
8760
8828
|
|
|
8761
8829
|
${Icon} {
|
|
8762
|
-
width:
|
|
8763
|
-
height:
|
|
8830
|
+
width: 0.375em;
|
|
8831
|
+
height: 0.375em;
|
|
8764
8832
|
}
|
|
8765
8833
|
|
|
8766
8834
|
${Icon}:after {
|
|
8767
|
-
font-size:
|
|
8835
|
+
font-size: 0.375em;
|
|
8768
8836
|
color: ${({ theme }) => theme.palette.textSecondary};
|
|
8769
8837
|
}
|
|
8770
8838
|
`;
|
|
@@ -8802,7 +8870,7 @@ const FileImagePreview = ({ link, isExternal, size, borderRadius, }) => {
|
|
|
8802
8870
|
URL.revokeObjectURL(objectUrl);
|
|
8803
8871
|
};
|
|
8804
8872
|
}, [api, link, isExternal]);
|
|
8805
|
-
return (jsxs(ImagePreviewContainer, { size: size, children: [hasError && (jsx(ImagePreviewError, { borderRadius: borderRadius, children: jsx(Icon, { kind: "alert" }) })), !hasError && !imageSrc && (jsx(ImagePreviewLoaderContainer, { children: jsx(LinearProgress, {}) })), !hasError && imageSrc && (jsx(GridImagePreview, { borderRadius: borderRadius, size: size, src: imageSrc, alt: "", onError: () => setHasError(true) }))] }));
|
|
8873
|
+
return (jsxs(ImagePreviewContainer, { size: size, children: [hasError && (jsx(ImagePreviewError, { borderRadius: borderRadius, "$size": size, children: jsx(Icon, { kind: "alert" }) })), !hasError && !imageSrc && (jsx(ImagePreviewLoaderContainer, { children: jsx(LinearProgress, {}) })), !hasError && imageSrc && (jsx(GridImagePreview, { borderRadius: borderRadius, size: size, src: imageSrc, alt: "", onError: () => setHasError(true) }))] }));
|
|
8806
8874
|
};
|
|
8807
8875
|
|
|
8808
8876
|
const AttachmentItem = ({ item, viewMode, isEdit, onPreview, onDelete, }) => {
|
|
@@ -8830,38 +8898,30 @@ const AttachmentsList = ({ items, isEdit, onPreview, onDelete, }) => {
|
|
|
8830
8898
|
return (jsx(ListContainer, { children: items.map(item => (jsx(AttachmentItem, { item: item, viewMode: "list", isEdit: isEdit, onPreview: onPreview, onDelete: onDelete }, item.link))) }));
|
|
8831
8899
|
};
|
|
8832
8900
|
|
|
8833
|
-
const ShowMoreButton = ({ hiddenCount, onClick, }) => {
|
|
8901
|
+
const ShowMoreButton = ({ hiddenCount, iconKind = "arrow_down", onClick, }) => {
|
|
8834
8902
|
const { t } = useGlobalContext();
|
|
8835
|
-
return (jsxs(ShowMoreButton$1, { onClick: onClick, children: [t("showMore", { ns: "dashboard", defaultValue: "Показать ещё" }), " ", hiddenCount, jsx(Icon, { kind:
|
|
8903
|
+
return (jsxs(ShowMoreButton$1, { onClick: onClick, children: [t("showMore", { ns: "dashboard", defaultValue: "Показать ещё" }), " ", hiddenCount, jsx(Icon, { kind: iconKind })] }));
|
|
8836
8904
|
};
|
|
8837
8905
|
|
|
8906
|
+
/**
|
|
8907
|
+
* Сколько элементов показывать сразу. Заданы обе опции — выигрывает меньшая, не задана ни одна —
|
|
8908
|
+
* предела нет и список показывается целиком.
|
|
8909
|
+
*/
|
|
8910
|
+
const getShownItemsLimit = ({ shownItems, otherItems } = {}) => shownItems && otherItems ? Math.min(shownItems, otherItems) : shownItems || otherItems;
|
|
8838
8911
|
const sliceShownOtherItems = (data, options = {}, showMore) => {
|
|
8839
|
-
const
|
|
8840
|
-
|
|
8841
|
-
return (shownItems || otherItems) && !showMore ? (data?.slice(0, limit) || []) : data;
|
|
8912
|
+
const limit = getShownItemsLimit(options);
|
|
8913
|
+
return limit && !showMore ? (data?.slice(0, limit) || []) : data;
|
|
8842
8914
|
};
|
|
8843
8915
|
|
|
8844
8916
|
const useAttachmentContainer = ({ type, elementConfig, valueOverride, }) => {
|
|
8845
8917
|
const { items, attributeName } = useAttachmentItems({ type, elementConfig, valueOverride });
|
|
8846
8918
|
const { options } = elementConfig || {};
|
|
8847
|
-
const
|
|
8848
|
-
const [viewMode, setViewMode] = useState(initialViewMode);
|
|
8849
|
-
const [showMore, setShowMore] = useState(false);
|
|
8850
|
-
const visibleItems = useMemo(() => sliceShownOtherItems(items, options, showMore), [items, options, showMore]);
|
|
8851
|
-
const hiddenCount = items.length - visibleItems.length;
|
|
8852
|
-
const hasMore = hiddenCount > 0;
|
|
8853
|
-
const handleSetViewMode = useCallback((mode) => setViewMode(mode), []);
|
|
8854
|
-
return {
|
|
8919
|
+
const view = useAttachmentsView({
|
|
8855
8920
|
items,
|
|
8856
|
-
|
|
8857
|
-
|
|
8858
|
-
|
|
8859
|
-
|
|
8860
|
-
setShowMore,
|
|
8861
|
-
viewMode,
|
|
8862
|
-
setViewMode: handleSetViewMode,
|
|
8863
|
-
attributeName,
|
|
8864
|
-
};
|
|
8921
|
+
limit: getShownItemsLimit(options),
|
|
8922
|
+
initialViewMode: options?.viewMode === "list" ? "list" : "grid",
|
|
8923
|
+
});
|
|
8924
|
+
return { ...view, items, attributeName };
|
|
8865
8925
|
};
|
|
8866
8926
|
|
|
8867
8927
|
const AttachmentContainer = memo(({ type, elementConfig, renderElement }) => {
|
|
@@ -11464,7 +11524,11 @@ const toSchemaAttribute = (params) => {
|
|
|
11464
11524
|
width: description?.width,
|
|
11465
11525
|
resizable: description?.resizable,
|
|
11466
11526
|
multiline: description?.multiline,
|
|
11527
|
+
colorPicker: description?.colorPicker,
|
|
11467
11528
|
style: description?.style,
|
|
11529
|
+
// Настройки загрузки файлов в колонку вложений: у источника их тоже нет.
|
|
11530
|
+
parentResourceId: description?.parentResourceId,
|
|
11531
|
+
fileExtensions: description?.fileExtensions,
|
|
11468
11532
|
};
|
|
11469
11533
|
};
|
|
11470
11534
|
/**
|
|
@@ -13755,6 +13819,8 @@ const AddButton = ({ multiple = true, accept, onSelectFiles, onSelectFromCatalog
|
|
|
13755
13819
|
value: AddAttachmentSource.Catalog,
|
|
13756
13820
|
icon: "folder_outline",
|
|
13757
13821
|
text: t("attachments.fromCatalog", { ns: "common", defaultValue: "Из каталога" }),
|
|
13822
|
+
// Диалог каталога выдаёт виджету приложение: не выдан — и выбирать нечем.
|
|
13823
|
+
disabled: !onSelectFromCatalog,
|
|
13758
13824
|
},
|
|
13759
13825
|
{
|
|
13760
13826
|
value: AddAttachmentSource.Link,
|
|
@@ -13762,7 +13828,7 @@ const AddButton = ({ multiple = true, accept, onSelectFiles, onSelectFromCatalog
|
|
|
13762
13828
|
text: t("attachments.fromLink", { ns: "common", defaultValue: "По ссылке" }),
|
|
13763
13829
|
disabled: !onSelectFromLink,
|
|
13764
13830
|
},
|
|
13765
|
-
], [t, onSelectFromLink]);
|
|
13831
|
+
], [t, onSelectFromCatalog, onSelectFromLink]);
|
|
13766
13832
|
const handleMenuSelect = useCallback(([{ value }]) => {
|
|
13767
13833
|
if (value === AddAttachmentSource.Pc) {
|
|
13768
13834
|
inputRef.current?.click();
|
|
@@ -15477,6 +15543,92 @@ const ElementSvg = memo(({ type, elementConfig, ...rest }) => {
|
|
|
15477
15543
|
return (jsx(SvgImage, { url: getSvgUrl({ elementConfig, layerInfo, attributes }), width: width, height: height, fontColor: fontColor }));
|
|
15478
15544
|
});
|
|
15479
15545
|
|
|
15546
|
+
/**
|
|
15547
|
+
* Вложения ячейки в поп-апе. Ширина своя, а не по ячейке: колонка таблицы бывает узкой,
|
|
15548
|
+
* а внутри стоит полный список вложений с плиткой и кнопкой добавления.
|
|
15549
|
+
*
|
|
15550
|
+
* Список взят у контейнера вложений карточки, а величины у поп-апа свои, с макета: имя файла
|
|
15551
|
+
* крупнее и ссылочного цвета, значок в строку имени, «Показать ещё» серое. Переопределены они
|
|
15552
|
+
* здесь, а не в самих компонентах, чтобы вложения в карточке объекта остались как были.
|
|
15553
|
+
*/
|
|
15554
|
+
const AttachmentsPopupBox = styled.div.withConfig({ displayName: "AttachmentsPopupBox", componentId: "sc-1dv1wz6" }) `
|
|
15555
|
+
display: flex;
|
|
15556
|
+
flex-direction: column;
|
|
15557
|
+
box-sizing: border-box;
|
|
15558
|
+
width: 19.5rem;
|
|
15559
|
+
padding: 1.25rem;
|
|
15560
|
+
|
|
15561
|
+
${AttachmentsLabel} {
|
|
15562
|
+
gap: 0 0.25rem;
|
|
15563
|
+
line-height: 0.875rem;
|
|
15564
|
+
}
|
|
15565
|
+
|
|
15566
|
+
${AttachmentsViewControls} {
|
|
15567
|
+
gap: 0 0.5rem;
|
|
15568
|
+
|
|
15569
|
+
${IconToggleButton}, ${Icon} {
|
|
15570
|
+
width: 0.875rem;
|
|
15571
|
+
height: 0.875rem;
|
|
15572
|
+
}
|
|
15573
|
+
|
|
15574
|
+
${Icon}:after {
|
|
15575
|
+
font-size: 0.875rem;
|
|
15576
|
+
}
|
|
15577
|
+
}
|
|
15578
|
+
|
|
15579
|
+
${ListItemMeta} {
|
|
15580
|
+
${ListIcon}, ${ImagePreviewContainer}, ${GridImagePreview} {
|
|
15581
|
+
width: 1rem;
|
|
15582
|
+
height: 1rem;
|
|
15583
|
+
background-size: contain;
|
|
15584
|
+
}
|
|
15585
|
+
}
|
|
15586
|
+
|
|
15587
|
+
${ListItemDescription} {
|
|
15588
|
+
gap: 0;
|
|
15589
|
+
}
|
|
15590
|
+
|
|
15591
|
+
${ListItemName} {
|
|
15592
|
+
font-size: 1rem;
|
|
15593
|
+
line-height: 1.125rem;
|
|
15594
|
+
color: ${({ theme }) => theme.palette.primary};
|
|
15595
|
+
}
|
|
15596
|
+
|
|
15597
|
+
${ListItemDate} {
|
|
15598
|
+
font-size: 0.75rem;
|
|
15599
|
+
line-height: 0.875rem;
|
|
15600
|
+
}
|
|
15601
|
+
|
|
15602
|
+
${ShowMoreButton$1} {
|
|
15603
|
+
gap: 0 0.25rem;
|
|
15604
|
+
margin-top: 0.5rem;
|
|
15605
|
+
line-height: 0.875rem;
|
|
15606
|
+
color: ${({ theme }) => theme.palette.textSecondary};
|
|
15607
|
+
|
|
15608
|
+
${Icon} {
|
|
15609
|
+
width: 0.875rem;
|
|
15610
|
+
height: 0.875rem;
|
|
15611
|
+
}
|
|
15612
|
+
|
|
15613
|
+
${Icon}:after {
|
|
15614
|
+
font-size: 0.875rem;
|
|
15615
|
+
color: ${({ theme }) => theme.palette.textSecondary};
|
|
15616
|
+
}
|
|
15617
|
+
}
|
|
15618
|
+
`;
|
|
15619
|
+
|
|
15620
|
+
/**
|
|
15621
|
+
* Полный список вложений колонки — тот же набор, что у контейнера вложений в карточке объекта:
|
|
15622
|
+
* шапка с подписью, счётчиком и переключателем вида, сам список, «Показать ещё» и добавление.
|
|
15623
|
+
*
|
|
15624
|
+
* Кнопка добавления и корзины у файлов появляются только на правку: на чтение поп-ап нужен
|
|
15625
|
+
* ровно затем, чтобы развернуть свёрнутый счётчик.
|
|
15626
|
+
*/
|
|
15627
|
+
const AttachmentsCellPopup = memo(({ alias, state }) => {
|
|
15628
|
+
const { items, visibleItems, editable, viewMode, setViewMode, hasMore, hiddenCount, onShowMore, accept, onPreview, onDelete, onUpload, onSelectFromCatalog, onOpenLinkDialog, } = state;
|
|
15629
|
+
return (jsxs(AttachmentsPopupBox, { children: [jsx(AttachmentsHeader, { alias: alias, count: items.length, viewMode: viewMode, onChangeViewMode: setViewMode }), jsx(AttachmentsContent, { children: viewMode === "grid" ? (jsx(AttachmentsGrid, { items: visibleItems, isEdit: editable, onPreview: onPreview, onDelete: onDelete })) : (jsx(AttachmentsList, { items: visibleItems, isEdit: editable, onPreview: onPreview, onDelete: onDelete })) }), hasMore && jsx(ShowMoreButton, { hiddenCount: hiddenCount, iconKind: "expand", onClick: onShowMore }), editable && (jsx(AddButton, { accept: accept, onSelectFiles: onUpload, onSelectFromCatalog: onSelectFromCatalog, onSelectFromLink: onOpenLinkDialog }))] }));
|
|
15630
|
+
});
|
|
15631
|
+
|
|
15480
15632
|
/**
|
|
15481
15633
|
* Насколько тело таблицы заехало под липкую шапку. Пишется на таблицу при прокрутке, читается
|
|
15482
15634
|
* стилем тела: ровно на эту величину тело и отсекается.
|
|
@@ -15497,6 +15649,23 @@ const TIME_FORMAT = /hh:mm/;
|
|
|
15497
15649
|
const PORTAL_ROOT_SELECTOR = "#portal-root";
|
|
15498
15650
|
/** Ниже этой ширины колонку не ужать мышью: уже неё в ячейке не остаётся места под значение. */
|
|
15499
15651
|
const MIN_COLUMN_WIDTH = 48;
|
|
15652
|
+
/**
|
|
15653
|
+
* Цвет, с которого палитра открывается у пустой ячейки. Своего значения там ещё нет, а `Color`
|
|
15654
|
+
* без валидной строки не собрать.
|
|
15655
|
+
*/
|
|
15656
|
+
const DEFAULT_CELL_COLOR = "#000000";
|
|
15657
|
+
/**
|
|
15658
|
+
* Сколько вложений ячейка показывает сама. Больше — все схлопываются в одну строку со значком
|
|
15659
|
+
* ссылки и счётчиком: колонка в таблице узкая, и списком там помещается ровно один файл.
|
|
15660
|
+
*/
|
|
15661
|
+
const ATTACHMENTS_INLINE_LIMIT = 1;
|
|
15662
|
+
/**
|
|
15663
|
+
* Сколько файлов видно в поп-апе вложений сразу, остальные прячутся за «Показать ещё N».
|
|
15664
|
+
* Величина с макета и опцией не выносится: поп-ап у колонки один на все таблицы.
|
|
15665
|
+
*/
|
|
15666
|
+
const ATTACHMENTS_SHOWN_ITEMS = 3;
|
|
15667
|
+
/** Вид списка, с которого поп-ап вложений открывается. */
|
|
15668
|
+
const ATTACHMENTS_VIEW_MODE = "list";
|
|
15500
15669
|
|
|
15501
15670
|
/**
|
|
15502
15671
|
* Собственный бокс таблицы. Без размеров в `options` представления узел ничего не меняет:
|
|
@@ -15723,36 +15892,177 @@ const CellField = styled.div.withConfig({ displayName: "CellField", componentId:
|
|
|
15723
15892
|
*/
|
|
15724
15893
|
const AttachmentsCellBox = styled.div.withConfig({ displayName: "AttachmentsCellBox", componentId: "sc-1ayq7sq" }) `
|
|
15725
15894
|
display: flex;
|
|
15726
|
-
|
|
15727
|
-
|
|
15728
|
-
gap: 0.25rem;
|
|
15895
|
+
align-items: center;
|
|
15896
|
+
gap: 0.375rem;
|
|
15729
15897
|
padding: 0.375rem 0.25rem;
|
|
15898
|
+
min-width: 0;
|
|
15899
|
+
line-height: 1.25rem;
|
|
15900
|
+
/* Пустая ячейка на чтении не делает по клику ничего — и на указатель ей меняться незачем. */
|
|
15901
|
+
cursor: ${({ $interactive }) => ($interactive ? "pointer" : "default")};
|
|
15902
|
+
`;
|
|
15903
|
+
/**
|
|
15904
|
+
* Значок файла в ячейке. Тот же, что в списке вложений, только с макетную величину строки
|
|
15905
|
+
* таблицы: в контейнере строка свободнее и значок там крупнее.
|
|
15906
|
+
*/
|
|
15907
|
+
const AttachmentsCellIcon = styled(ListIcon).withConfig({ displayName: "AttachmentsCellIcon", componentId: "sc-wf195o" }) `
|
|
15908
|
+
width: 1rem;
|
|
15909
|
+
height: 1rem;
|
|
15910
|
+
background-size: contain;
|
|
15911
|
+
`;
|
|
15912
|
+
/**
|
|
15913
|
+
* Подпись файла или счётчика свёрнутых. Ссылочная: по ней и кликают — одиночный файл открывает
|
|
15914
|
+
* галерею, счётчик разворачивает список.
|
|
15915
|
+
*/
|
|
15916
|
+
const AttachmentsCellLabel = styled.div.withConfig({ displayName: "AttachmentsCellLabel", componentId: "sc-11wbjsl" }) `
|
|
15917
|
+
color: ${({ theme }) => theme.palette.primary};
|
|
15918
|
+
|
|
15919
|
+
${cellWrapMixin};
|
|
15920
|
+
`;
|
|
15921
|
+
/** Значок ссылки у счётчика свёрнутых файлов — в цвет подписи. */
|
|
15922
|
+
const AttachmentsCellLinkIcon = styled(Icon).withConfig({ displayName: "AttachmentsCellLinkIcon", componentId: "sc-oxcx2o" }) `
|
|
15923
|
+
flex-shrink: 0;
|
|
15924
|
+
width: 1rem;
|
|
15925
|
+
height: 1rem;
|
|
15926
|
+
|
|
15927
|
+
&:after {
|
|
15928
|
+
font-size: 1rem;
|
|
15929
|
+
color: ${({ theme }) => theme.palette.primary};
|
|
15930
|
+
}
|
|
15931
|
+
`;
|
|
15932
|
+
/**
|
|
15933
|
+
* Ячейка цвета: плашка или палитра слева, значение справа.
|
|
15934
|
+
*
|
|
15935
|
+
* Отступы те же, что у текстовой ячейки: в одном ряду с обычными колонками значения обязаны
|
|
15936
|
+
* стоять на одной линии.
|
|
15937
|
+
*/
|
|
15938
|
+
const ColorCellBox = styled.div.withConfig({ displayName: "ColorCellBox", componentId: "sc-1x8c5gd" }) `
|
|
15939
|
+
display: flex;
|
|
15940
|
+
align-items: center;
|
|
15941
|
+
gap: 0.375rem;
|
|
15942
|
+
padding: 0 0.25rem;
|
|
15943
|
+
|
|
15944
|
+
${CellText} {
|
|
15945
|
+
padding-left: 0;
|
|
15946
|
+
padding-right: 0;
|
|
15947
|
+
}
|
|
15948
|
+
`;
|
|
15949
|
+
/**
|
|
15950
|
+
* Плашка цвета. Повторяет маркер легенды графика: цвет всюду обозначается одинаково, где бы он
|
|
15951
|
+
* ни показывался.
|
|
15952
|
+
*/
|
|
15953
|
+
const ColorSwatch = styled.div.withConfig({ displayName: "ColorSwatch", componentId: "sc-1h7m0yr" }) `
|
|
15954
|
+
flex-shrink: 0;
|
|
15955
|
+
width: 0.75rem;
|
|
15956
|
+
height: 0.75rem;
|
|
15957
|
+
background-color: ${({ $color }) => $color};
|
|
15958
|
+
border-radius: ${({ theme: { borderRadius } }) => borderRadius.tiny};
|
|
15730
15959
|
`;
|
|
15731
|
-
const TableEmpty = styled.div.withConfig({ displayName: "TableEmpty", componentId: "sc-
|
|
15960
|
+
const TableEmpty = styled.div.withConfig({ displayName: "TableEmpty", componentId: "sc-10hkdmv" }) `
|
|
15732
15961
|
padding: 0.75rem 0.25rem;
|
|
15733
15962
|
color: ${({ theme }) => theme.palette.textSecondary};
|
|
15734
15963
|
`;
|
|
15735
15964
|
|
|
15736
15965
|
/**
|
|
15737
|
-
*
|
|
15966
|
+
* Добавление и удаление файлов в колонке вложений.
|
|
15967
|
+
*
|
|
15968
|
+
* Все три источника — диск, каталог ресурсов и ссылка — те же, что у контейнера вложений
|
|
15969
|
+
* в карточке объекта: файловое api берётся из глобального контекста, диалог каталога выдаёт
|
|
15970
|
+
* виджету приложение, а ссылка разбирается по адресу.
|
|
15971
|
+
*
|
|
15972
|
+
* Папку-приёмник загрузки задаёт сам атрибут: у колонки нет узла-элемента с опциями, зато
|
|
15973
|
+
* колонок вложений в таблице может быть несколько, и складывать их файлы в одно место незачем.
|
|
15974
|
+
*/
|
|
15975
|
+
const useAttachmentsCellEdit = ({ attribute, items, persist }) => {
|
|
15976
|
+
const { api } = useGlobalContext();
|
|
15977
|
+
const { selectAttachmentsFromCatalog } = useWidgetContext();
|
|
15978
|
+
const [isLinkDialogOpen, , setLinkDialogOpen] = useToggle(false);
|
|
15979
|
+
const [uploading, setUploading] = useState(false);
|
|
15980
|
+
const { parentResourceId, fileExtensions } = attribute;
|
|
15981
|
+
const onDelete = useCallback((link) => persist(items.filter(item => item.link !== link)), [items, persist]);
|
|
15982
|
+
const onUpload = useCallback(async (files) => {
|
|
15983
|
+
if (!api?.file?.upload || uploading) {
|
|
15984
|
+
return;
|
|
15985
|
+
}
|
|
15986
|
+
setUploading(true);
|
|
15987
|
+
try {
|
|
15988
|
+
const uploaded = await Promise.all(files.map(file => api.file.upload(file, true, parentResourceId || "", file.name)));
|
|
15989
|
+
persist([
|
|
15990
|
+
...items,
|
|
15991
|
+
...uploaded.map((response, index) => ({
|
|
15992
|
+
link: response.resourceId,
|
|
15993
|
+
name: response.name ?? files[index].name,
|
|
15994
|
+
mimeType: files[index].type,
|
|
15995
|
+
date: new Date().toISOString(),
|
|
15996
|
+
isExternal: false,
|
|
15997
|
+
})),
|
|
15998
|
+
]);
|
|
15999
|
+
}
|
|
16000
|
+
finally {
|
|
16001
|
+
setUploading(false);
|
|
16002
|
+
}
|
|
16003
|
+
}, [api, items, parentResourceId, persist, uploading]);
|
|
16004
|
+
const onAddFromCatalog = useCallback((resources) => persist([
|
|
16005
|
+
...items,
|
|
16006
|
+
...resources.map(({ resourceId, name, contentType }) => ({
|
|
16007
|
+
link: resourceId ?? "",
|
|
16008
|
+
name: name ?? "",
|
|
16009
|
+
mimeType: contentType ?? "",
|
|
16010
|
+
date: new Date().toISOString(),
|
|
16011
|
+
isExternal: false,
|
|
16012
|
+
})),
|
|
16013
|
+
]), [items, persist]);
|
|
16014
|
+
const onSelectFromCatalog = useMemo(() => (selectAttachmentsFromCatalog ? () => selectAttachmentsFromCatalog(onAddFromCatalog) : undefined), [onAddFromCatalog, selectAttachmentsFromCatalog]);
|
|
16015
|
+
const onOpenLinkDialog = useCallback(() => setLinkDialogOpen(true), [setLinkDialogOpen]);
|
|
16016
|
+
const onCloseLinkDialog = useCallback(() => setLinkDialogOpen(false), [setLinkDialogOpen]);
|
|
16017
|
+
const onAddByLink = useCallback((url) => persist([
|
|
16018
|
+
...items,
|
|
16019
|
+
{
|
|
16020
|
+
link: url,
|
|
16021
|
+
name: getFileNameFromUrl(url),
|
|
16022
|
+
mimeType: getMimeTypeFromUrl(url),
|
|
16023
|
+
date: new Date().toISOString(),
|
|
16024
|
+
isExternal: true,
|
|
16025
|
+
},
|
|
16026
|
+
]), [items, persist]);
|
|
16027
|
+
return {
|
|
16028
|
+
accept: fileExtensions,
|
|
16029
|
+
isLinkDialogOpen,
|
|
16030
|
+
onDelete,
|
|
16031
|
+
onUpload,
|
|
16032
|
+
onSelectFromCatalog,
|
|
16033
|
+
onOpenLinkDialog,
|
|
16034
|
+
onCloseLinkDialog,
|
|
16035
|
+
onAddByLink,
|
|
16036
|
+
};
|
|
16037
|
+
};
|
|
16038
|
+
|
|
16039
|
+
/**
|
|
16040
|
+
* Колонка вложений: разбор значения, свёрнутый вид ячейки и полный список в поп-апе.
|
|
15738
16041
|
*
|
|
15739
16042
|
* Значение атрибута — строка: файлы приезжают в ней списком JSON, поэтому и обратно в черновик
|
|
15740
16043
|
* кладём строку, а не массив — иначе тип ячейки менялся бы от самой правки.
|
|
15741
16044
|
*
|
|
15742
|
-
*
|
|
15743
|
-
*
|
|
16045
|
+
* Ячейка показывает один файл, а несколько схлопывает в счётчик, и весь список с добавлением
|
|
16046
|
+
* и удалением живёт в поп-апе — тот же набор, что у контейнера вложений в карточке объекта.
|
|
15744
16047
|
*/
|
|
15745
|
-
const useAttachmentsCell = ({ attribute, row, canEdit, onChange }) => {
|
|
16048
|
+
const useAttachmentsCell = ({ attribute, row, canEdit, onChange, }) => {
|
|
15746
16049
|
const [previewIndex, setPreviewIndex] = useState(null);
|
|
15747
|
-
const [
|
|
16050
|
+
const [isPopupOpen, , setPopupOpen] = useToggle(false);
|
|
15748
16051
|
const { attributeName, isEditable } = attribute;
|
|
15749
16052
|
const value = row.properties[attributeName];
|
|
15750
16053
|
const items = useMemo(() => parseAttachments(value), [value]);
|
|
16054
|
+
const view = useAttachmentsView({
|
|
16055
|
+
items,
|
|
16056
|
+
limit: ATTACHMENTS_SHOWN_ITEMS,
|
|
16057
|
+
initialViewMode: ATTACHMENTS_VIEW_MODE,
|
|
16058
|
+
});
|
|
16059
|
+
const { setShowMore } = view;
|
|
15751
16060
|
const previewImages = useAttachmentPreviewImages({ items, active: previewIndex !== null });
|
|
15752
16061
|
const downloadByIndex = useAttachmentDownload(items);
|
|
15753
16062
|
// Те же два условия, что и у обычной ячейки: режим таблицы и разрешение самого атрибута.
|
|
15754
16063
|
const editable = canEdit && isEditable;
|
|
15755
16064
|
const persist = useCallback((next) => onChange(row.key, attributeName, JSON.stringify(next)), [attributeName, onChange, row.key]);
|
|
16065
|
+
const edit = useAttachmentsCellEdit({ attribute, items, persist });
|
|
15756
16066
|
const onPreview = useCallback((link) => {
|
|
15757
16067
|
const index = items.findIndex(item => item.link === link);
|
|
15758
16068
|
if (index >= 0) {
|
|
@@ -15761,48 +16071,99 @@ const useAttachmentsCell = ({ attribute, row, canEdit, onChange }) => {
|
|
|
15761
16071
|
}, [items]);
|
|
15762
16072
|
const onClosePreview = useCallback(() => setPreviewIndex(null), []);
|
|
15763
16073
|
const onDownload = useCallback((_image, index) => downloadByIndex(index), [downloadByIndex]);
|
|
15764
|
-
const
|
|
15765
|
-
const
|
|
15766
|
-
|
|
15767
|
-
|
|
15768
|
-
|
|
15769
|
-
|
|
15770
|
-
|
|
15771
|
-
|
|
15772
|
-
|
|
15773
|
-
|
|
15774
|
-
|
|
15775
|
-
}
|
|
15776
|
-
|
|
16074
|
+
const onShowMore = useCallback(() => setShowMore(true), [setShowMore]);
|
|
16075
|
+
const onClosePopup = useCallback(() => setPopupOpen(false), [setPopupOpen]);
|
|
16076
|
+
/**
|
|
16077
|
+
* На правку поп-ап открывается всегда, даже у пустой ячейки: другого места, откуда добавить
|
|
16078
|
+
* первый файл, у колонки нет. На чтение единственный файл ведёт прямо в галерею, а свёрнутый
|
|
16079
|
+
* счётчик — в тот же поп-ап, только без кнопок.
|
|
16080
|
+
*/
|
|
16081
|
+
const onCellClick = useCallback(() => {
|
|
16082
|
+
if (!editable && items.length === ATTACHMENTS_INLINE_LIMIT) {
|
|
16083
|
+
onPreview(items[0].link);
|
|
16084
|
+
return;
|
|
16085
|
+
}
|
|
16086
|
+
if (editable || items.length) {
|
|
16087
|
+
setPopupOpen(true);
|
|
16088
|
+
}
|
|
16089
|
+
}, [editable, items, onPreview, setPopupOpen]);
|
|
15777
16090
|
return {
|
|
16091
|
+
...view,
|
|
16092
|
+
...edit,
|
|
15778
16093
|
items,
|
|
15779
16094
|
editable,
|
|
16095
|
+
onShowMore,
|
|
16096
|
+
isPopupOpen,
|
|
16097
|
+
onClosePopup,
|
|
16098
|
+
onCellClick,
|
|
15780
16099
|
previewIndex,
|
|
15781
16100
|
previewImages,
|
|
15782
|
-
isLinkDialogOpen,
|
|
15783
16101
|
onPreview,
|
|
15784
16102
|
onClosePreview,
|
|
15785
16103
|
onDownload,
|
|
15786
|
-
onDelete,
|
|
15787
|
-
onOpenLinkDialog,
|
|
15788
|
-
onCloseLinkDialog,
|
|
15789
|
-
onAddByLink,
|
|
15790
16104
|
};
|
|
15791
16105
|
};
|
|
15792
16106
|
|
|
15793
16107
|
/**
|
|
15794
|
-
* Колонка со
|
|
16108
|
+
* Колонка со вложениями.
|
|
15795
16109
|
*
|
|
15796
16110
|
* Тип у атрибута строковый, вложениями его делает `subType: "Attachments"` в схеме контейнера —
|
|
15797
16111
|
* поэтому ветка стоит раньше разбора типа и обычных редакторов ячейки.
|
|
16112
|
+
*
|
|
16113
|
+
* Сама ячейка показывает один файл, а несколько схлопывает в строку со значком ссылки
|
|
16114
|
+
* и счётчиком: в ширину колонки список файлов не помещается. Весь список живёт в поп-апе.
|
|
15798
16115
|
*/
|
|
15799
16116
|
const AttachmentsCell = memo(({ attribute, row, canEdit, onChange }) => {
|
|
15800
16117
|
const { t } = useGlobalContext();
|
|
15801
|
-
const
|
|
15802
|
-
|
|
16118
|
+
const state = useAttachmentsCell({ attribute, row, canEdit, onChange });
|
|
16119
|
+
const { items, editable, isPopupOpen, onClosePopup, onCellClick } = state;
|
|
16120
|
+
const [single] = items;
|
|
16121
|
+
const isCollapsed = items.length > ATTACHMENTS_INLINE_LIMIT;
|
|
16122
|
+
const fileType = useMemo(() => (single ? getFileType(single.mimeType, single.name) : undefined), [single]);
|
|
16123
|
+
const isImage = useMemo(() => !!fileType && IMAGE_FILE_TYPES.includes(fileType), [fileType]);
|
|
16124
|
+
// Удаление единственного файла — действие самой ячейки, поп-ап ради него открывать незачем.
|
|
16125
|
+
const handleDelete = useCallback((event) => {
|
|
16126
|
+
event.stopPropagation();
|
|
16127
|
+
state.onDelete(single.link);
|
|
16128
|
+
}, [single, state]);
|
|
16129
|
+
const renderCell = () => {
|
|
16130
|
+
if (isCollapsed) {
|
|
16131
|
+
return (jsxs(Fragment$1, { children: [jsx(AttachmentsCellLinkIcon, { kind: "link" }), jsx(AttachmentsCellLabel, { children: t("attachments.objectsCount", {
|
|
16132
|
+
ns: "common",
|
|
16133
|
+
total: items.length,
|
|
16134
|
+
defaultValue: "Объектов: {{total}}",
|
|
16135
|
+
}) })] }));
|
|
16136
|
+
}
|
|
16137
|
+
if (!single) {
|
|
16138
|
+
return jsx(CellPlaceholder, { children: "\u2014" });
|
|
16139
|
+
}
|
|
16140
|
+
return (jsxs(Fragment$1, { children: [isImage ? (jsx(FileImagePreview, { size: "1rem", isExternal: single.isExternal, link: single.link })) : (jsx(AttachmentsCellIcon, { fileType: fileType })), jsx(AttachmentsCellLabel, { title: single.name, children: single.name }), editable && jsx(IconButton, { kind: "delete", tabIndex: 0, onClick: handleDelete })] }));
|
|
16141
|
+
};
|
|
16142
|
+
return (jsxs(Fragment$1, { children: [jsx(Popup, { zIndex: DASHBOARD_OVERLAY_Z_INDEX, isVisible: isPopupOpen, onRequestClose: onClosePopup, placement: "bottom-start", anchor: ref => (jsx(AttachmentsCellBox, { ref: ref, "$interactive": editable || !!items.length, onClick: onCellClick, children: renderCell() })), children: jsx(AttachmentsCellPopup, { alias: attribute.alias, state: state }) }), jsx(AttachmentLinkDialog, { isOpen: state.isLinkDialogOpen, onClose: state.onCloseLinkDialog, onSubmit: state.onAddByLink }), state.previewIndex !== null && (jsx(Preview, { images: state.previewImages, initialIndex: state.previewIndex, isOpen: true, onClose: state.onClosePreview, onDownload: state.onDownload, errorTitleText: t("attachments.resourceUnavailable", {
|
|
15803
16143
|
ns: "common",
|
|
15804
16144
|
defaultValue: "Ресурс недоступен",
|
|
15805
|
-
}) }, previewIndex))] }));
|
|
16145
|
+
}) }, state.previewIndex))] }));
|
|
16146
|
+
});
|
|
16147
|
+
|
|
16148
|
+
/**
|
|
16149
|
+
* Колонка цвета (`colorPicker` у атрибута).
|
|
16150
|
+
*
|
|
16151
|
+
* Значение хранится строкой в любом из привычных видов — `hex`, `rgb`, `rgba`, — поэтому рядом со
|
|
16152
|
+
* значением показывается плашка этого цвета, а на правку встаёт палитра.
|
|
16153
|
+
*
|
|
16154
|
+
* Неразбираемая строка остаётся просто текстом, без плашки: так видно, что в данных мусор, а не
|
|
16155
|
+
* пустое значение.
|
|
16156
|
+
*/
|
|
16157
|
+
const ColorCell = memo(({ attribute, row, canEdit, onChange }) => {
|
|
16158
|
+
const { attributeName, isEditable } = attribute;
|
|
16159
|
+
const value = row.properties[attributeName];
|
|
16160
|
+
const text = useMemo(() => (isNil(value) ? "" : String(value)), [value]);
|
|
16161
|
+
const color = useMemo(() => (text ? new Color$1(text) : null), [text]);
|
|
16162
|
+
const isValidColor = !!color?.isValid;
|
|
16163
|
+
// Те же два условия, что и у обычной ячейки: режим таблицы и разрешение самого атрибута.
|
|
16164
|
+
const editable = canEdit && isEditable;
|
|
16165
|
+
const handleChange = useCallback((next) => onChange(row.key, attributeName, colorToHex(next)), [attributeName, onChange, row.key]);
|
|
16166
|
+
return (jsxs(ColorCellBox, { children: [editable ? (jsx(ColorPicker, { zIndex: DASHBOARD_OVERLAY_Z_INDEX, withOpacity: true, value: isValidColor ? color : new Color$1(DEFAULT_CELL_COLOR), onChange: handleChange })) : (isValidColor && jsx(ColorSwatch, { "$color": text })), jsx(CellText, { title: text, children: text || jsx(CellPlaceholder, { children: "\u2014" }) })] }));
|
|
15806
16167
|
});
|
|
15807
16168
|
|
|
15808
16169
|
/**
|
|
@@ -15903,7 +16264,7 @@ const useCellEditing = () => {
|
|
|
15903
16264
|
const TableCell = memo(({ attribute, row, canEdit, onChange }) => {
|
|
15904
16265
|
const { t, language } = useGlobalContext();
|
|
15905
16266
|
const { editing, buttonProps, editorProps } = useCellEditing();
|
|
15906
|
-
const { attributeName, type, subType, isEditable, stringFormat, multiline } = attribute;
|
|
16267
|
+
const { attributeName, type, subType, isEditable, stringFormat, multiline, colorPicker } = attribute;
|
|
15907
16268
|
const value = row.properties[attributeName];
|
|
15908
16269
|
const handleChange = useCallback((next) => {
|
|
15909
16270
|
// Пустые правки отбрасываем: иначе строка становилась бы «изменённой» от простого
|
|
@@ -15927,6 +16288,11 @@ const TableCell = memo(({ attribute, row, canEdit, onChange }) => {
|
|
|
15927
16288
|
if (subType === StringSubType.Attachments) {
|
|
15928
16289
|
return jsx(AttachmentsCell, { attribute: attribute, row: row, canEdit: canEdit, onChange: onChange });
|
|
15929
16290
|
}
|
|
16291
|
+
// Цвет — тоже строка, и по типу от обычной не отличается: что она значит, говорит только
|
|
16292
|
+
// `colorPicker` в схеме.
|
|
16293
|
+
if (colorPicker) {
|
|
16294
|
+
return jsx(ColorCell, { attribute: attribute, row: row, canEdit: canEdit, onChange: onChange });
|
|
16295
|
+
}
|
|
15930
16296
|
// Логическое значение и на чтение показываем галкой, а не словами «true»/«false» —
|
|
15931
16297
|
// так же, как остальной дашборд рисует булевы атрибуты.
|
|
15932
16298
|
if (type === AttributeType.Boolean) {
|
|
@@ -19548,5 +19914,5 @@ const DEFAULT_HEATMAP_STYLE = {
|
|
|
19548
19914
|
],
|
|
19549
19915
|
};
|
|
19550
19916
|
|
|
19551
|
-
export { ALIGNMENTS, ALIGN_ITEMS, ATTRIBUTE_ICON_ELEMENT_TYPES, AddButtonRow, AddFeatureButton, AddFeatureContainer, AlertIconContainer, AttachmentContainer, AttributeGalleryContainer, AttributeLabel, BASE_CONTAINER_STYLE, BG_IMAGE_SLOT_ID, BaseMapTheme, CHART_TYPES, COMPACT_FRACTION_DIGITS, CONFIG_PAGES_ID, CONFIG_PAGE_ID, CONTAINERS_GROUP_DEFAULTS, CONTAINER_BODY_ATTRIBUTE, CONTAINER_BODY_FILL_STYLE, CameraContainer, Chart, ChartContainer, ChartLegend, ChartLoading, Container, ContainerBackground, ContainerChildren, ContainerLoading, ContainerRoot, ContainerTemplate, ContainerWrapper, ContainersGroupContainer, DASHBOARD_OVERLAY_Z_INDEX, 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_STROKE_WIDTH, DEFAULT_CIRCLE_STYLE, DEFAULT_COLOR, DEFAULT_DASHBOARD_CONFIG, DEFAULT_DATA_SOURCE_LIMIT, DEFAULT_DROPDOWN_WIDTH, DEFAULT_FILL_EXTRUSION_BASE, DEFAULT_FILL_EXTRUSION_HEIGHT, DEFAULT_FILL_EXTRUSION_STYLE, DEFAULT_FILL_EXTRUSION_VERTICAL_GRADIENT, DEFAULT_FILL_STYLE, DEFAULT_FILTER_PADDING, DEFAULT_GRID_GAP, DEFAULT_HEATMAP_COLOR, DEFAULT_HEATMAP_INTENSITY, DEFAULT_HEATMAP_RADIUS, DEFAULT_HEATMAP_STYLE, DEFAULT_HEATMAP_WEIGHT, DEFAULT_ICON_ANCHOR, DEFAULT_ICON_OVERLAP, DEFAULT_ICON_PADDING, DEFAULT_ICON_ROTATE, DEFAULT_ICON_SIZE, 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_SYMBOL_COLOR, DEFAULT_SYMBOL_HALO_COLOR, DEFAULT_SYMBOL_PLACEMENT, DEFAULT_SYMBOL_SPACING, DEFAULT_SYMBOL_STYLE, DEFAULT_TEXT_ANCHOR, DEFAULT_TEXT_JUSTIFY, DEFAULT_TEXT_SIZE, DEFAULT_TEXT_TRANSFORM, DEFAULT_TRACK_FR, DEFAULT_TRANSLATE, DEFAULT_ZOOM, DRAG_THRESHOLD_PX, 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, EXTENT_FILTER_NAME, EditGeometryType, ElementButton, ElementCamera, ElementChart, ElementChips, ElementControl, ElementIcon, ElementImage, ElementLegend, ElementLink, ElementMarkdown, ElementSlideshow, ElementSvg, ElementTable, ElementTooltip, ElementValueWrapper, ExpandableTitle, FEATURE_CARD_DEFAULT_COLORS, FEATURE_CARD_OTHER_COLOR, FILL_SIZE, FILTERED_VALUE_OPACITY, FILTER_PREFIX, FR_PRECISION, FeatureCardBackgroundHeader, FeatureCardButtons, FeatureCardContext, FeatureCardDefaultHeader, FeatureCardHeader, FeatureCardProvider, FeatureCardSlideshowHeader, FeatureCardTitle, FeatureControls, FeatureTitleContainer, FiltersContainer, GEOMETRY_ATTRIBUTE, GEOMETRY_FILTER_NAME, GRID_AUTO_FILL_DEFAULTS, GRID_CELL_ATTR, GRID_CELL_ID_PREFIX, GRID_DRAGGING_ATTR, GRID_DRAG_SOURCE_ATTR, GRID_DROP_TARGET_ATTR, GRID_FILL_DEFAULTS, GRID_ROW_ID_PREFIX, GlobalContext, GlobalProvider, GridRowContainer, HANDLE_BLEED_PX, 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, MAP_VIEW_FILTER_NAMES, MAX_CHART_WIDTH, MAX_TRACKS, MIN_TRACK_PX, MIN_TRACK_RATIO, Map$1 as Map, MapContext, MapProvider, NON_TRACK_SLOT_IDS, NO_CELL_DRAG_SELECTOR, NO_CONTENT_VALUE, NUMERIC_ATTRIBUTE_TYPES, NoLiveSnapshotContainer, OBJECT_FITS, OVERFLOWS, OneColumnContainer, PIE_CHART_TOOLTIP_STYLE, POLL_SUBTASK_INTERVAL_MS, POLL_SUBTASK_TIMEOUT_MS, PROJECT_ALIAS_PROP, PROJECT_FILTER_NAME, PROJECT_NAME_PROP, PROJECT_PROPS, PROVIDER_PREFIX, PageNavigator, PageTitle, PageTitleContainer, PagesContainer, Pagination, PresentationHeader, PresentationHeaderButtons, PresentationHeaderTools, PresentationPanelContainer, PresentationPanelWrapper, PresentationWrapper, ProgressContainer, ProviderPrefix, QUERY_DESCRIPTION_CACHE_TTL, RESIZE_HANDLE_ATTR, ResizeHandle, 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, StructuredDataContainer, SvgImage, TILE_ALIGNMENTS, TIME_ZONE_FORMAT, TITLE_SLOT_IDS, TabsContainer, TextTrim, ThemeName, TitleContainer, TopContainer, TopContainerButtons, TwoColumnContainer, UploadContainer, VIEW_MODES, VoteContainer, WidgetType, ZOOM_FILTER_NAME, addDataSource, addDataSources, adjustColor, applyFiltersToCondition, applyQueryFilters, applyTreeFilterToCondition, applyVarsToCondition, asAttributeName, asChartId, asContainerId, asDataSourceName, asFilterName, asLayerName, asModalId, asResourceId, asTabId, buildGridTemplate, buildTrackTemplate, checkEqualOrIncludes, checkIsLoading, collectConfigIds, containsNodeId, createConfigLayer, createConfigPage, createGridCell, createGridIdFactory, createGridRow, createNewPageId, createSaveNotificationId, dateOptions, debounce, decimalOpacityToHex, enrichStyleItemsWithIds, enrichStyleModelsWithIds, eqlParametersToPayload, fetchQueryDescription, findAttributeInExpression, findCellContext, formatArea, formatAttributeValue, formatChartRelatedValue, formatConditionValue, formatDataSourceCondition, formatDate$1 as formatDate, formatElementValue, formatLength, formatNumber, formatPolygonMeasure, geometryToEwkt, getActualExtrusionHeight, getAttributeByName, getAttributeConfigurationByName, getAttributeIconElement, getAttributeIconUrl, getAttributeValue, getAttributesConfiguration, getAverageTrackSize, 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, getLayoutChildren, getMapViewDataSources, getPagesFromConfig, getPagesFromProjectInfo, getProjectValue, getProxyService, getRelatedAttribute, getRenderElement, getResourceUrl, getRootElementId, getSelectedFilterValue, getSlideshowImages, getStyleAttributes, getSvgUrl, getTemplateNameFromAttribute, getThemeByName, getTotalFromAttributes, getTotalFromRelatedFeatures, getTrackSize, getTrackSizeKey, getTrackSizes, getWrapperSizeStyle, hasContainerBgImage, hexToRgba, isCrossOriginUrl, isEmptyElementValue, isEmptyValue, isFeaturesFilterValue, isFillSize, isFrSize, isGridNode, isHiddenEmptyValue, isHookActive, isLayerService, isNotValidSelectedTab, isNumeric, isObject, isProxyService, isRootOwningContainer, isTreeFilterValue, isVisibleContainer, mapNodeById, mergeAttributeConfigurations, metersPerPixel, noMarginMixin, numberOptions, parseFrValue, parseIconNames, parseIconNamesFromClientStyle, pieChartTooltipFromAttributes, pieChartTooltipFromRelatedFeatures, pointOptions, removeDataSource, removeTracks, replaceNodesByIds, rgbToHex, roundFr, roundTotalSum, setLayoutChildren, sizeCssMixin, sliceShownOtherItems, stretchPalette, timeOptions, toConditionsArray, toCssSize, toFrSize, toPxNumber, toRenderableValue, tooltipNameFromAttributes, tooltipValueFromAttributes, tooltipValueFromRelatedFeatures, transparentizeColor, updateDataSource, useAfterSave, useAppHeight, useAttachmentDownload, useAttachmentItems, useAttachmentPreviewImages, useAutoCompleteControl, useBeforeSave, useBgImageHost, useChartChange, useChartData, useContainerAttributes, useContainerRoot, useCurrentPageLayers, useCustomFeatureSelect, useDashboardHeader, useDataSourceLoading, useDataSources, useDebouncedCallback, useDiffPage, useEditGroupAttributes, useEqualTileWidth, useExpandableContainers, useExportPdf, useFeatureSaveHooks, useFetchImageWithAuth, useFetchWithAuth, useGetConfigLayer, useGlobalContext, useHeaderRender, useHideIfEmptyDataSource, useLayerHiddenAttributes, useLayerParams, useMapContext, useMapDraw, useMapImages, useMaxZoomTo, useProjectDashboardInit, usePythonSandbox, usePythonTask, useRedrawLayer, useRelatedDataSourceAttributes, useRemoteTask, useRenderElement, useResizeBox, useResizeDrag, useSavePrototypeBuilder, useServerNotificationsContext, useShownOtherItems, useToggle, useUpdateDataSource, useVisibleProjectItems, useWidgetConfig, useWidgetContext, useWidgetFilters, useWidgetPage, useWindowResize, useWrapperSize, useZoomToFeatures, useZoomToPoint, withTrackSize };
|
|
19917
|
+
export { ALIGNMENTS, ALIGN_ITEMS, ATTRIBUTE_ICON_ELEMENT_TYPES, AddButtonRow, AddFeatureButton, AddFeatureContainer, AlertIconContainer, AttachmentContainer, AttributeGalleryContainer, AttributeLabel, BASE_CONTAINER_STYLE, BG_IMAGE_SLOT_ID, BaseMapTheme, CHART_TYPES, COMPACT_FRACTION_DIGITS, CONFIG_PAGES_ID, CONFIG_PAGE_ID, CONTAINERS_GROUP_DEFAULTS, CONTAINER_BODY_ATTRIBUTE, CONTAINER_BODY_FILL_STYLE, CameraContainer, Chart, ChartContainer, ChartLegend, ChartLoading, Container, ContainerBackground, ContainerChildren, ContainerLoading, ContainerRoot, ContainerTemplate, ContainerWrapper, ContainersGroupContainer, DASHBOARD_OVERLAY_Z_INDEX, 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_STROKE_WIDTH, DEFAULT_CIRCLE_STYLE, DEFAULT_COLOR, DEFAULT_DASHBOARD_CONFIG, DEFAULT_DATA_SOURCE_LIMIT, DEFAULT_DROPDOWN_WIDTH, DEFAULT_FILL_EXTRUSION_BASE, DEFAULT_FILL_EXTRUSION_HEIGHT, DEFAULT_FILL_EXTRUSION_STYLE, DEFAULT_FILL_EXTRUSION_VERTICAL_GRADIENT, DEFAULT_FILL_STYLE, DEFAULT_FILTER_PADDING, DEFAULT_GRID_GAP, DEFAULT_HEATMAP_COLOR, DEFAULT_HEATMAP_INTENSITY, DEFAULT_HEATMAP_RADIUS, DEFAULT_HEATMAP_STYLE, DEFAULT_HEATMAP_WEIGHT, DEFAULT_ICON_ANCHOR, DEFAULT_ICON_OVERLAP, DEFAULT_ICON_PADDING, DEFAULT_ICON_ROTATE, DEFAULT_ICON_SIZE, 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_SYMBOL_COLOR, DEFAULT_SYMBOL_HALO_COLOR, DEFAULT_SYMBOL_PLACEMENT, DEFAULT_SYMBOL_SPACING, DEFAULT_SYMBOL_STYLE, DEFAULT_TEXT_ANCHOR, DEFAULT_TEXT_JUSTIFY, DEFAULT_TEXT_SIZE, DEFAULT_TEXT_TRANSFORM, DEFAULT_TRACK_FR, DEFAULT_TRANSLATE, DEFAULT_ZOOM, DRAG_THRESHOLD_PX, 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, EXTENT_FILTER_NAME, EditGeometryType, ElementButton, ElementCamera, ElementChart, ElementChips, ElementControl, ElementIcon, ElementImage, ElementLegend, ElementLink, ElementMarkdown, ElementSlideshow, ElementSvg, ElementTable, ElementTooltip, ElementValueWrapper, ExpandableTitle, FEATURE_CARD_DEFAULT_COLORS, FEATURE_CARD_OTHER_COLOR, FILL_SIZE, FILTERED_VALUE_OPACITY, FILTER_PREFIX, FR_PRECISION, FeatureCardBackgroundHeader, FeatureCardButtons, FeatureCardContext, FeatureCardDefaultHeader, FeatureCardHeader, FeatureCardProvider, FeatureCardSlideshowHeader, FeatureCardTitle, FeatureControls, FeatureTitleContainer, FiltersContainer, GEOMETRY_ATTRIBUTE, GEOMETRY_FILTER_NAME, GRID_AUTO_FILL_DEFAULTS, GRID_CELL_ATTR, GRID_CELL_ID_PREFIX, GRID_DRAGGING_ATTR, GRID_DRAG_SOURCE_ATTR, GRID_DROP_TARGET_ATTR, GRID_FILL_DEFAULTS, GRID_ROW_ID_PREFIX, GlobalContext, GlobalProvider, GridRowContainer, HANDLE_BLEED_PX, 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, MAP_VIEW_FILTER_NAMES, MAX_CHART_WIDTH, MAX_TRACKS, MIN_TRACK_PX, MIN_TRACK_RATIO, Map$1 as Map, MapContext, MapProvider, NON_TRACK_SLOT_IDS, NO_CELL_DRAG_SELECTOR, NO_CONTENT_VALUE, NUMERIC_ATTRIBUTE_TYPES, NoLiveSnapshotContainer, OBJECT_FITS, OVERFLOWS, OneColumnContainer, PIE_CHART_TOOLTIP_STYLE, POLL_SUBTASK_INTERVAL_MS, POLL_SUBTASK_TIMEOUT_MS, PROJECT_ALIAS_PROP, PROJECT_FILTER_NAME, PROJECT_NAME_PROP, PROJECT_PROPS, PROVIDER_PREFIX, PageNavigator, PageTitle, PageTitleContainer, PagesContainer, Pagination, PresentationHeader, PresentationHeaderButtons, PresentationHeaderTools, PresentationPanelContainer, PresentationPanelWrapper, PresentationWrapper, ProgressContainer, ProviderPrefix, QUERY_DESCRIPTION_CACHE_TTL, RESIZE_HANDLE_ATTR, ResizeHandle, 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, StructuredDataContainer, SvgImage, TILE_ALIGNMENTS, TIME_ZONE_FORMAT, TITLE_SLOT_IDS, TabsContainer, TextTrim, ThemeName, TitleContainer, TopContainer, TopContainerButtons, TwoColumnContainer, UploadContainer, VIEW_MODES, VoteContainer, WidgetType, ZOOM_FILTER_NAME, addDataSource, addDataSources, adjustColor, applyFiltersToCondition, applyQueryFilters, applyTreeFilterToCondition, applyVarsToCondition, asAttributeName, asChartId, asContainerId, asDataSourceName, asFilterName, asLayerName, asModalId, asResourceId, asTabId, buildGridTemplate, buildTrackTemplate, checkEqualOrIncludes, checkIsLoading, collectConfigIds, colorToHex, containsNodeId, createConfigLayer, createConfigPage, createGridCell, createGridIdFactory, createGridRow, createNewPageId, createSaveNotificationId, dateOptions, debounce, decimalOpacityToHex, enrichStyleItemsWithIds, enrichStyleModelsWithIds, eqlParametersToPayload, fetchQueryDescription, findAttributeInExpression, findCellContext, formatArea, formatAttributeValue, formatChartRelatedValue, formatConditionValue, formatDataSourceCondition, formatDate$1 as formatDate, formatElementValue, formatLength, formatNumber, formatPolygonMeasure, geometryToEwkt, getActualExtrusionHeight, getAttributeByName, getAttributeConfigurationByName, getAttributeIconElement, getAttributeIconUrl, getAttributeValue, getAttributesConfiguration, getAverageTrackSize, 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, getLayoutChildren, getMapViewDataSources, getPagesFromConfig, getPagesFromProjectInfo, getProjectValue, getProxyService, getRelatedAttribute, getRenderElement, getResourceUrl, getRootElementId, getSelectedFilterValue, getShownItemsLimit, getSlideshowImages, getStyleAttributes, getSvgUrl, getTemplateNameFromAttribute, getThemeByName, getTotalFromAttributes, getTotalFromRelatedFeatures, getTrackSize, getTrackSizeKey, getTrackSizes, getWrapperSizeStyle, hasContainerBgImage, hexToRgba, isCrossOriginUrl, isEmptyElementValue, isEmptyValue, isFeaturesFilterValue, isFillSize, isFrSize, isGridNode, isHiddenEmptyValue, isHookActive, isLayerService, isNotValidSelectedTab, isNumeric, isObject, isProxyService, isRootOwningContainer, isTreeFilterValue, isVisibleContainer, mapNodeById, mergeAttributeConfigurations, metersPerPixel, noMarginMixin, numberOptions, parseFrValue, parseIconNames, parseIconNamesFromClientStyle, pieChartTooltipFromAttributes, pieChartTooltipFromRelatedFeatures, pointOptions, removeDataSource, removeTracks, replaceNodesByIds, rgbToHex, roundFr, roundTotalSum, setLayoutChildren, sizeCssMixin, sliceShownOtherItems, stretchPalette, timeOptions, toConditionsArray, toCssSize, toFrSize, toPxNumber, toRenderableValue, tooltipNameFromAttributes, tooltipValueFromAttributes, tooltipValueFromRelatedFeatures, transparentizeColor, updateDataSource, useAfterSave, useAppHeight, useAttachmentDownload, useAttachmentItems, useAttachmentPreviewImages, useAttachmentsView, useAutoCompleteControl, useBeforeSave, useBgImageHost, useChartChange, useChartData, useContainerAttributes, useContainerRoot, useCurrentPageLayers, useCustomFeatureSelect, useDashboardHeader, useDataSourceLoading, useDataSources, useDebouncedCallback, useDiffPage, useEditGroupAttributes, useEqualTileWidth, useExpandableContainers, useExportPdf, useFeatureSaveHooks, useFetchImageWithAuth, useFetchWithAuth, useGetConfigLayer, useGlobalContext, useHeaderRender, useHideIfEmptyDataSource, useLayerHiddenAttributes, useLayerParams, useMapContext, useMapDraw, useMapImages, useMaxZoomTo, useProjectDashboardInit, usePythonSandbox, usePythonTask, useRedrawLayer, useRelatedDataSourceAttributes, useRemoteTask, useRenderElement, useResizeBox, useResizeDrag, useSavePrototypeBuilder, useServerNotificationsContext, useShownOtherItems, useToggle, useUpdateDataSource, useVisibleProjectItems, useWidgetConfig, useWidgetContext, useWidgetFilters, useWidgetPage, useWindowResize, useWrapperSize, useZoomToFeatures, useZoomToPoint, withTrackSize };
|
|
19552
19918
|
//# sourceMappingURL=react.esm.js.map
|