@evergis/react 4.0.138 → 4.0.140

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
@@ -4,7 +4,7 @@ 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';
6
6
  import { AttributeType, AttributeIconType, generateId, STORAGE_TOKEN_KEY, parseJwt, STORAGE_REFRESH_TOKEN_KEY, RemoteTaskStatus, AttributeConfigurationType, LayerServiceType, OgcGeometryType, StringSubType } from '@evergis/api';
7
- import { isNil, isEqual, isEmpty, uniqueId, unescape } from 'lodash';
7
+ import { isNil, isEqual, uniqueId, isEmpty, unescape } from 'lodash';
8
8
  import { ColorScale, Color as Color$1 } from '@evergis/color';
9
9
  import { isValid, format, parseJSON, parseISO, toDate } from 'date-fns';
10
10
  import { ru, enUS } from 'date-fns/locale';
@@ -6353,300 +6353,23 @@ const useMapImages = ({ images }) => {
6353
6353
  };
6354
6354
  void loadAllImages();
6355
6355
  }, [mapLoaded, images, map, addImage]);
6356
- return { loaded, errors, addImage, removeImage, hasImage };
6357
- };
6358
-
6359
- const enrichStyleItemsWithIds = (style) => {
6360
- return {
6361
- ...style,
6362
- items: style.items.map(item => {
6363
- return {
6364
- ...item,
6365
- id: item.id || v4(),
6366
- };
6367
- }),
6368
- };
6369
- };
6370
-
6371
- const enrichStyleModelsWithIds = (style) => {
6372
- return {
6373
- ...style,
6374
- models: style.models.map(model => {
6375
- return {
6376
- ...model,
6377
- id: model.id || v4(),
6378
- };
6379
- }),
6380
- };
6381
- };
6382
-
6383
- const findAttributeInExpression = (expression) => {
6384
- if (Array.isArray(expression) && expression.length === 2 && expression[0] === "get") {
6385
- return [expression[1]];
6386
- }
6387
- return expression.reduce((acc, curr) => {
6388
- if (!Array.isArray(curr)) {
6389
- return acc;
6390
- }
6391
- if (curr[0] === "get") {
6392
- return [...new Set([...acc, curr[1]])];
6393
- }
6394
- return [...new Set([...acc, ...findAttributeInExpression(curr)])];
6395
- }, []);
6396
- };
6397
-
6398
- const getActualExtrusionHeight = (paint) => {
6399
- return Array.isArray(paint?.["fill-extrusion-height"]) && paint?.["fill-extrusion-height"][0] === "+"
6400
- ? paint?.["fill-extrusion-height"][1]
6401
- : paint?.["fill-extrusion-height"];
6402
- };
6403
-
6404
- const getLayerClientStyle = (layer) => {
6405
- const clientStyle = layer?.configuration?.clientStyle;
6406
- return {
6407
- ...clientStyle,
6408
- items: clientStyle?.items ?? [],
6409
- };
6410
- };
6411
-
6412
- const extractAttributesFromObject = (obj) => {
6413
- if (!obj || isEmpty(obj)) {
6414
- return [];
6415
- }
6416
- return Object.entries(obj).reduce((acc, [, value]) => {
6417
- if (!Array.isArray(value)) {
6418
- return acc;
6356
+ useEffect(() => {
6357
+ if (!mapLoaded) {
6358
+ return;
6419
6359
  }
6420
- return [...new Set([...acc, ...findAttributeInExpression(value)])];
6421
- }, []);
6422
- };
6423
- const getStyleAttributes = (style) => {
6424
- if (!style) {
6425
- return [];
6426
- }
6427
- return style?.items?.reduce((acc, curr) => {
6428
- const paintAttributes = extractAttributesFromObject(curr.paint);
6429
- const layoutAttributes = extractAttributesFromObject(curr.layout);
6430
- const filterAttributes = curr.filter
6431
- ? findAttributeInExpression(curr.filter)
6432
- : [];
6433
- return [...new Set([...acc, ...paintAttributes, ...layoutAttributes, ...filterAttributes])];
6434
- }, []);
6435
- };
6436
-
6437
- /**
6438
- * Извлекает имена иконок из выражения icon-image.
6439
- *
6440
- * Поддерживает:
6441
- * - Строки: "parking" → ["parking"]
6442
- * - match: ["match", ["get", "type"], "a", "icon-a", "b", "icon-b", "default"] → ["icon-a", "icon-b", "default"]
6443
- * - case: ["case", [...], "icon-a", "icon-b"] → ["icon-a", "icon-b"]
6444
- * - coalesce: ["coalesce", ["image", "icon-a"], ["image", "icon-b"]] → ["icon-a", "icon-b"]
6445
- * - image: ["image", "icon-a"] → ["icon-a"]
6446
- *
6447
- * @param iconImage - значение icon-image из layout
6448
- * @returns массив имён иконок
6449
- */
6450
- const parseIconNames = (iconImage) => {
6451
- if (!iconImage) {
6452
- return [];
6453
- }
6454
- // Простая строка: "parking"
6455
- if (typeof iconImage === "string") {
6456
- return [iconImage];
6457
- }
6458
- // Выражение Mapbox
6459
- if (Array.isArray(iconImage) && iconImage.length > 0) {
6460
- const [operator, ...args] = iconImage;
6461
- switch (operator) {
6462
- // ["match", input, label1, output1, label2, output2, ..., fallback]
6463
- case "match": {
6464
- const results = [];
6465
- // Пропускаем первый аргумент (input), берём каждый второй начиная с индекса 2
6466
- for (let i = 2; i < args.length; i += 2) {
6467
- if (typeof args[i] === "string") {
6468
- results.push(args[i]);
6469
- }
6470
- else if (Array.isArray(args[i])) {
6471
- results.push(...parseIconNames(args[i]));
6472
- }
6473
- }
6474
- // Последний аргумент - fallback (если нечётное количество после input)
6475
- const lastArg = args[args.length - 1];
6476
- if (typeof lastArg === "string") {
6477
- results.push(lastArg);
6478
- }
6479
- else if (Array.isArray(lastArg)) {
6480
- results.push(...parseIconNames(lastArg));
6481
- }
6482
- return [...new Set(results)];
6483
- }
6484
- // ["case", condition1, output1, condition2, output2, ..., fallback]
6485
- case "case": {
6486
- const results = [];
6487
- for (let i = 1; i < args.length; i += 2) {
6488
- if (typeof args[i] === "string") {
6489
- results.push(args[i]);
6490
- }
6491
- else if (Array.isArray(args[i])) {
6492
- results.push(...parseIconNames(args[i]));
6493
- }
6360
+ map.current.on("styleimagemissing", async (e) => {
6361
+ const missingImage = images.find(item => item.name === e.id);
6362
+ if (missingImage && !map.current.hasImage(e.id)) {
6363
+ try {
6364
+ await addImage(missingImage);
6494
6365
  }
6495
- // Fallback
6496
- if (args.length % 2 === 0) {
6497
- const lastArg = args[args.length - 1];
6498
- if (typeof lastArg === "string") {
6499
- results.push(lastArg);
6500
- }
6501
- else if (Array.isArray(lastArg)) {
6502
- results.push(...parseIconNames(lastArg));
6503
- }
6366
+ catch {
6367
+ // Ошибка уже записана в errors
6504
6368
  }
6505
- return [...new Set(results)];
6506
- }
6507
- // ["coalesce", expr1, expr2, ...]
6508
- case "coalesce": {
6509
- const results = [];
6510
- args.forEach(arg => {
6511
- if (typeof arg === "string") {
6512
- results.push(arg);
6513
- }
6514
- else if (Array.isArray(arg)) {
6515
- results.push(...parseIconNames(arg));
6516
- }
6517
- });
6518
- return [...new Set(results)];
6519
- }
6520
- // ["image", name] или ["image", name1, name2, ...]
6521
- case "image": {
6522
- return args.filter((arg) => typeof arg === "string");
6523
- }
6524
- // ["concat", ...] или другие - рекурсивно ищем строки
6525
- default: {
6526
- const results = [];
6527
- args.forEach(arg => {
6528
- if (Array.isArray(arg)) {
6529
- results.push(...parseIconNames(arg));
6530
- }
6531
- });
6532
- return [...new Set(results)];
6533
- }
6534
- }
6535
- }
6536
- return [];
6537
- };
6538
- /**
6539
- * Свойства, содержащие имена изображений (иконки и паттерны).
6540
- */
6541
- const IMAGE_PROPERTIES = {
6542
- layout: ["icon-image"],
6543
- paint: ["fill-pattern", "line-pattern", "fill-extrusion-pattern"],
6544
- };
6545
- /**
6546
- * Извлекает все имена изображений из clientStyle.
6547
- * Включает иконки (icon-image) и паттерны (fill-pattern, line-pattern, fill-extrusion-pattern).
6548
- *
6549
- * @param clientStyle - конфигурация стиля слоя
6550
- * @returns массив уникальных имён изображений
6551
- */
6552
- const parseIconNamesFromClientStyle = (clientStyle) => {
6553
- if (!clientStyle?.items) {
6554
- return [];
6555
- }
6556
- const imageNames = new Set();
6557
- clientStyle.items.forEach(item => {
6558
- // Парсим icon-image из layout
6559
- IMAGE_PROPERTIES.layout.forEach(prop => {
6560
- const value = item.layout?.[prop];
6561
- if (value) {
6562
- parseIconNames(value).forEach(name => imageNames.add(name));
6563
- }
6564
- });
6565
- // Парсим fill-pattern, line-pattern, fill-extrusion-pattern из paint
6566
- IMAGE_PROPERTIES.paint.forEach(prop => {
6567
- const value = item.paint?.[prop];
6568
- if (value) {
6569
- parseIconNames(value).forEach(name => imageNames.add(name));
6570
- }
6571
- });
6572
- });
6573
- return [...imageNames];
6574
- };
6575
-
6576
- /**
6577
- * Находит конфигурацию иконки в clientStyle.icons по имени.
6578
- */
6579
- const findIconConfig = (layers, iconName) => {
6580
- for (const layer of layers) {
6581
- const icon = layer.clientStyle?.icons?.find(i => i.name === iconName);
6582
- if (icon) {
6583
- return icon;
6584
- }
6585
- }
6586
- return undefined;
6587
- };
6588
- /**
6589
- * Хук для автоматической загрузки иконок из clientStyle слоёв.
6590
- *
6591
- * Парсит все icon-image выражения из clientStyle.items и загружает
6592
- * соответствующие иконки из clientStyle.icons или по конвенции baseUrl.
6593
- *
6594
- * @example
6595
- * ```tsx
6596
- * const layers = [
6597
- * {
6598
- * layerId: 'parking',
6599
- * clientStyle: {
6600
- * icons: [
6601
- * { name: 'parking-icon', url: '/icons/parking.svg', sdf: true }
6602
- * ],
6603
- * items: [{
6604
- * type: 'symbol',
6605
- * layout: { 'icon-image': 'parking-icon' }
6606
- * }]
6607
- * }
6608
- * }
6609
- * ];
6610
- *
6611
- * const { loaded, errors } = useIconsFromLayers({ layers });
6612
- *
6613
- * if (!loaded) return <Loading />;
6614
- * ```
6615
- */
6616
- const useIconsFromLayers = ({ layers, baseUrl = "/icons", defaultExtension = "svg", }) => {
6617
- // Собираем все уникальные имена иконок из всех слоёв
6618
- const requestedIcons = useMemo(() => {
6619
- const iconNames = new Set();
6620
- layers.forEach(layer => {
6621
- const names = parseIconNamesFromClientStyle(layer.clientStyle);
6622
- names.forEach(name => iconNames.add(name));
6623
- });
6624
- return [...iconNames];
6625
- }, [layers]);
6626
- // Формируем конфигурации для загрузки
6627
- const imageConfigs = useMemo(() => {
6628
- return requestedIcons.map(name => {
6629
- // Ищем в clientStyle.icons
6630
- const customIcon = findIconConfig(layers, name);
6631
- if (customIcon) {
6632
- return {
6633
- name: customIcon.name,
6634
- url: customIcon.url,
6635
- sdf: customIcon.sdf,
6636
- size: customIcon.size,
6637
- pixelRatio: customIcon.pixelRatio,
6638
- };
6639
6369
  }
6640
- // Fallback: конструируем URL по конвенции
6641
- return {
6642
- name,
6643
- url: `${baseUrl}/${name}.${defaultExtension}`,
6644
- sdf: true,
6645
- };
6646
6370
  });
6647
- }, [requestedIcons, layers, baseUrl, defaultExtension]);
6648
- const { loaded, errors } = useMapImages({ images: imageConfigs });
6649
- return { loaded, errors, requestedIcons };
6371
+ }, [mapLoaded]);
6372
+ return { loaded, errors, addImage, removeImage, hasImage };
6650
6373
  };
6651
6374
 
6652
6375
  const useRedrawLayer = () => {
@@ -12183,7 +11906,8 @@ const VoteAcceptedBadge = styled(Flex).withConfig({ displayName: "VoteAcceptedBa
12183
11906
  color: #ffffff;
12184
11907
  font-size: 0.875rem;
12185
11908
  `;
12186
- const VoteAuthHint = styled.div.withConfig({ displayName: "VoteAuthHint", componentId: "sc-l6fdf1" }) `
11909
+ /** Мелкая серая подпись под контролами: почему нельзя голосовать или почему кнопка неактивна. */
11910
+ const VoteHint = styled.div.withConfig({ displayName: "VoteHint", componentId: "sc-1ortkdd" }) `
12187
11911
  font-size: 0.8125rem;
12188
11912
  color: ${({ theme: { palette } }) => palette.textSecondary};
12189
11913
  `;
@@ -12285,8 +12009,18 @@ const useVoteForm = (initialValues) => {
12285
12009
  const removeVariant = useCallback((index) => {
12286
12010
  setVariants(prev => prev.filter((_, itemIndex) => itemIndex !== index));
12287
12011
  }, []);
12288
- const isValid = useMemo(() => Boolean(categoryId && text.trim() && variants.length >= MIN_VARIANTS), [categoryId, text, variants.length]);
12289
- const values = useMemo(() => ({ categoryId, text: text.trim(), multiSelect, variants }), [categoryId, text, multiSelect, variants]);
12012
+ /**
12013
+ * Варианты вместе с недобавленным черновиком.
12014
+ *
12015
+ * Последний вариант часто набирают и жмут «Создать», не нажав Enter: чипсом он ещё не стал, но
12016
+ * пользователь его уже ввёл. Считать такой текст вариантом честнее, чем гасить кнопку и молчать.
12017
+ */
12018
+ const allVariants = useMemo(() => {
12019
+ const pending = draft.trim();
12020
+ return pending ? [...variants, { text: pending }] : variants;
12021
+ }, [variants, draft]);
12022
+ const isValid = useMemo(() => Boolean(categoryId && text.trim() && allVariants.length >= MIN_VARIANTS), [categoryId, text, allVariants.length]);
12023
+ const values = useMemo(() => ({ categoryId, text: text.trim(), multiSelect, variants: allVariants }), [categoryId, text, multiSelect, allVariants]);
12290
12024
  return {
12291
12025
  categoryId,
12292
12026
  setCategoryId,
@@ -12316,7 +12050,10 @@ const VoteCreateForm = ({ categories, initialValues, isEditing, canDelete, submi
12316
12050
  }
12317
12051
  } }), jsxs(Flex, { alignItems: "center", justifyContent: "space-between", children: [jsx(VoteSectionLabel, { children: t("vote.multiSelect", { ns: VOTE_NS, defaultValue: "Множественный выбор" }) }), jsx(Switch, { checked: multiSelect, onChange: () => setMultiSelect(prev => !prev) })] }), jsx(RaisedButton, { primary: true, disabled: !isValid || submitting, onClick: () => onSubmit(values), children: isEditing
12318
12052
  ? t("vote.save", { ns: VOTE_NS, defaultValue: "Сохранить" })
12319
- : t("vote.create", { ns: VOTE_NS, defaultValue: "Создать голосование" }) }), isEditing && (jsxs(Flex, { alignItems: "center", justifyContent: "space-between", children: [onCancel && (jsx(VoteEditLink, { onClick: onCancel, children: t("vote.cancel", { ns: VOTE_NS, defaultValue: "Отмена" }) })), canDelete && onDelete && (jsx(RaisedButton, { error: true, disabled: submitting, onClick: onDelete, children: t("vote.delete", { ns: VOTE_NS, defaultValue: "Удалить голосование" }) }))] }))] }));
12053
+ : t("vote.create", { ns: VOTE_NS, defaultValue: "Создать голосование" }) }), !isValid && (jsx(VoteHint, { children: t("vote.formHint", {
12054
+ ns: VOTE_NS,
12055
+ defaultValue: "Нужны категория, вопрос и минимум два варианта ответа",
12056
+ }) })), isEditing && (jsxs(Flex, { alignItems: "center", justifyContent: "space-between", children: [onCancel && (jsx(VoteEditLink, { onClick: onCancel, children: t("vote.cancel", { ns: VOTE_NS, defaultValue: "Отмена" }) })), canDelete && onDelete && (jsx(RaisedButton, { error: true, disabled: submitting, onClick: onDelete, children: t("vote.delete", { ns: VOTE_NS, defaultValue: "Удалить голосование" }) }))] }))] }));
12320
12057
  };
12321
12058
 
12322
12059
  /** Блок «Поделиться в соцсетях» — пока только вёрстка, без рабочих ссылок. */
@@ -12340,7 +12077,7 @@ const VoteResults = ({ question, category, results, screen, isOwner, hasAnswers,
12340
12077
  }, [question.multiSelect]);
12341
12078
  const canSubmit = useMemo(() => selected.length > 0 && !submitting, [selected.length, submitting]);
12342
12079
  return (jsxs(VoteWrapper, { children: [category && jsx(VoteCategoryLabel, { children: category.name }), jsx(VoteQuestionText, { children: question.text }), jsx(VoteVariantList, { column: true, value: selected[0] ?? "", children: results.map(({ id, text, count, percent }) => (jsxs(VoteVariantRow, { children: [jsxs(VoteVariantHead, { children: [showControls &&
12343
- (question.multiSelect ? (jsx(Checkbox, { checked: selected.includes(id), onChange: () => toggle(id) })) : (jsx(Radio, { value: id, checked: selected.includes(id), onChange: () => toggle(id) }))), jsx(VoteVariantText, { children: text }), jsx(VoteVariantCount, { children: count })] }), jsx(LinearProgress, { done: percent })] }, id))) }), screen === "unauthenticated" && (jsx(VoteAuthHint, { children: t("vote.authHint", { ns: VOTE_NS, defaultValue: "Чтобы проголосовать, пожалуйста, авторизуйтесь" }) })), screen === "voted" && (jsxs(VoteAcceptedBadge, { children: [jsx(Icon, { kind: "success" }), t("vote.accepted", { ns: VOTE_NS, defaultValue: "Ваш ответ принят" })] })), showControls && (jsx(RaisedButton, { primary: true, disabled: !canSubmit, onClick: () => onSubmit(selected), children: t("vote.submit", { ns: VOTE_NS, defaultValue: "Отправить ответ" }) })), canEdit && onEdit && (jsx(Flex, { children: jsx(VoteEditLink, { onClick: onEdit, children: t("vote.edit", { ns: VOTE_NS, defaultValue: "Редактировать" }) }) })), showShare && jsx(VoteShare, {})] }));
12080
+ (question.multiSelect ? (jsx(Checkbox, { checked: selected.includes(id), onChange: () => toggle(id) })) : (jsx(Radio, { value: id, checked: selected.includes(id), onChange: () => toggle(id) }))), jsx(VoteVariantText, { children: text }), jsx(VoteVariantCount, { children: count })] }), jsx(LinearProgress, { done: percent })] }, id))) }), screen === "unauthenticated" && (jsx(VoteHint, { children: t("vote.authHint", { ns: VOTE_NS, defaultValue: "Чтобы проголосовать, пожалуйста, авторизуйтесь" }) })), screen === "voted" && (jsxs(VoteAcceptedBadge, { children: [jsx(Icon, { kind: "success" }), t("vote.accepted", { ns: VOTE_NS, defaultValue: "Ваш ответ принят" })] })), showControls && (jsx(RaisedButton, { primary: true, disabled: !canSubmit, onClick: () => onSubmit(selected), children: t("vote.submit", { ns: VOTE_NS, defaultValue: "Отправить ответ" }) })), canEdit && onEdit && (jsx(Flex, { children: jsx(VoteEditLink, { onClick: onEdit, children: t("vote.edit", { ns: VOTE_NS, defaultValue: "Редактировать" }) }) })), showShare && jsx(VoteShare, {})] }));
12344
12081
  };
12345
12082
 
12346
12083
  /**
@@ -19019,6 +18756,223 @@ const RasterLayer = ({ layer, tileUrl, visible, beforeId, }) => {
19019
18756
  return (jsx(Source, { id: layer.name, type: "raster", tiles: tiles, children: jsx(Layer$1, { id: layer.name, type: "raster", "source-layer": "default", beforeId: beforeId, layout: { visibility: visible ? "visible" : "none" } }) }, `${layer.name}-${tileUrl}`));
19020
18757
  };
19021
18758
 
18759
+ const enrichStyleItemsWithIds = (style) => {
18760
+ return {
18761
+ ...style,
18762
+ items: style.items.map(item => {
18763
+ return {
18764
+ ...item,
18765
+ id: item.id || v4(),
18766
+ };
18767
+ }),
18768
+ };
18769
+ };
18770
+
18771
+ const enrichStyleModelsWithIds = (style) => {
18772
+ return {
18773
+ ...style,
18774
+ models: style.models.map(model => {
18775
+ return {
18776
+ ...model,
18777
+ id: model.id || v4(),
18778
+ };
18779
+ }),
18780
+ };
18781
+ };
18782
+
18783
+ const findAttributeInExpression = (expression) => {
18784
+ if (Array.isArray(expression) && expression.length === 2 && expression[0] === "get") {
18785
+ return [expression[1]];
18786
+ }
18787
+ return expression.reduce((acc, curr) => {
18788
+ if (!Array.isArray(curr)) {
18789
+ return acc;
18790
+ }
18791
+ if (curr[0] === "get") {
18792
+ return [...new Set([...acc, curr[1]])];
18793
+ }
18794
+ return [...new Set([...acc, ...findAttributeInExpression(curr)])];
18795
+ }, []);
18796
+ };
18797
+
18798
+ const getActualExtrusionHeight = (paint) => {
18799
+ return Array.isArray(paint?.["fill-extrusion-height"]) && paint?.["fill-extrusion-height"][0] === "+"
18800
+ ? paint?.["fill-extrusion-height"][1]
18801
+ : paint?.["fill-extrusion-height"];
18802
+ };
18803
+
18804
+ const getLayerClientStyle = (layer) => {
18805
+ const clientStyle = layer?.configuration?.clientStyle;
18806
+ return {
18807
+ ...clientStyle,
18808
+ items: clientStyle?.items ?? [],
18809
+ };
18810
+ };
18811
+
18812
+ const extractAttributesFromObject = (obj) => {
18813
+ if (!obj || isEmpty(obj)) {
18814
+ return [];
18815
+ }
18816
+ return Object.entries(obj).reduce((acc, [, value]) => {
18817
+ if (!Array.isArray(value)) {
18818
+ return acc;
18819
+ }
18820
+ return [...new Set([...acc, ...findAttributeInExpression(value)])];
18821
+ }, []);
18822
+ };
18823
+ const getStyleAttributes = (style) => {
18824
+ if (!style) {
18825
+ return [];
18826
+ }
18827
+ return style?.items?.reduce((acc, curr) => {
18828
+ const paintAttributes = extractAttributesFromObject(curr.paint);
18829
+ const layoutAttributes = extractAttributesFromObject(curr.layout);
18830
+ const filterAttributes = curr.filter
18831
+ ? findAttributeInExpression(curr.filter)
18832
+ : [];
18833
+ return [...new Set([...acc, ...paintAttributes, ...layoutAttributes, ...filterAttributes])];
18834
+ }, []);
18835
+ };
18836
+
18837
+ /**
18838
+ * Извлекает имена иконок из выражения icon-image.
18839
+ *
18840
+ * Поддерживает:
18841
+ * - Строки: "parking" → ["parking"]
18842
+ * - match: ["match", ["get", "type"], "a", "icon-a", "b", "icon-b", "default"] → ["icon-a", "icon-b", "default"]
18843
+ * - case: ["case", [...], "icon-a", "icon-b"] → ["icon-a", "icon-b"]
18844
+ * - coalesce: ["coalesce", ["image", "icon-a"], ["image", "icon-b"]] → ["icon-a", "icon-b"]
18845
+ * - image: ["image", "icon-a"] → ["icon-a"]
18846
+ *
18847
+ * @param iconImage - значение icon-image из layout
18848
+ * @returns массив имён иконок
18849
+ */
18850
+ const parseIconNames = (iconImage) => {
18851
+ if (!iconImage) {
18852
+ return [];
18853
+ }
18854
+ // Простая строка: "parking"
18855
+ if (typeof iconImage === "string") {
18856
+ return [iconImage];
18857
+ }
18858
+ // Выражение Mapbox
18859
+ if (Array.isArray(iconImage) && iconImage.length > 0) {
18860
+ const [operator, ...args] = iconImage;
18861
+ switch (operator) {
18862
+ // ["match", input, label1, output1, label2, output2, ..., fallback]
18863
+ case "match": {
18864
+ const results = [];
18865
+ // Пропускаем первый аргумент (input), берём каждый второй начиная с индекса 2
18866
+ for (let i = 2; i < args.length; i += 2) {
18867
+ if (typeof args[i] === "string") {
18868
+ results.push(args[i]);
18869
+ }
18870
+ else if (Array.isArray(args[i])) {
18871
+ results.push(...parseIconNames(args[i]));
18872
+ }
18873
+ }
18874
+ // Последний аргумент - fallback (если нечётное количество после input)
18875
+ const lastArg = args[args.length - 1];
18876
+ if (typeof lastArg === "string") {
18877
+ results.push(lastArg);
18878
+ }
18879
+ else if (Array.isArray(lastArg)) {
18880
+ results.push(...parseIconNames(lastArg));
18881
+ }
18882
+ return [...new Set(results)];
18883
+ }
18884
+ // ["case", condition1, output1, condition2, output2, ..., fallback]
18885
+ case "case": {
18886
+ const results = [];
18887
+ for (let i = 1; i < args.length; i += 2) {
18888
+ if (typeof args[i] === "string") {
18889
+ results.push(args[i]);
18890
+ }
18891
+ else if (Array.isArray(args[i])) {
18892
+ results.push(...parseIconNames(args[i]));
18893
+ }
18894
+ }
18895
+ // Fallback
18896
+ if (args.length % 2 === 0) {
18897
+ const lastArg = args[args.length - 1];
18898
+ if (typeof lastArg === "string") {
18899
+ results.push(lastArg);
18900
+ }
18901
+ else if (Array.isArray(lastArg)) {
18902
+ results.push(...parseIconNames(lastArg));
18903
+ }
18904
+ }
18905
+ return [...new Set(results)];
18906
+ }
18907
+ // ["coalesce", expr1, expr2, ...]
18908
+ case "coalesce": {
18909
+ const results = [];
18910
+ args.forEach(arg => {
18911
+ if (typeof arg === "string") {
18912
+ results.push(arg);
18913
+ }
18914
+ else if (Array.isArray(arg)) {
18915
+ results.push(...parseIconNames(arg));
18916
+ }
18917
+ });
18918
+ return [...new Set(results)];
18919
+ }
18920
+ // ["image", name] или ["image", name1, name2, ...]
18921
+ case "image": {
18922
+ return args.filter((arg) => typeof arg === "string");
18923
+ }
18924
+ // ["concat", ...] или другие - рекурсивно ищем строки
18925
+ default: {
18926
+ const results = [];
18927
+ args.forEach(arg => {
18928
+ if (Array.isArray(arg)) {
18929
+ results.push(...parseIconNames(arg));
18930
+ }
18931
+ });
18932
+ return [...new Set(results)];
18933
+ }
18934
+ }
18935
+ }
18936
+ return [];
18937
+ };
18938
+ /**
18939
+ * Свойства, содержащие имена изображений (иконки и паттерны).
18940
+ */
18941
+ const IMAGE_PROPERTIES = {
18942
+ layout: ["icon-image"],
18943
+ paint: ["fill-pattern", "line-pattern", "fill-extrusion-pattern"],
18944
+ };
18945
+ /**
18946
+ * Извлекает все имена изображений из clientStyle.
18947
+ * Включает иконки (icon-image) и паттерны (fill-pattern, line-pattern, fill-extrusion-pattern).
18948
+ *
18949
+ * @param clientStyle - конфигурация стиля слоя
18950
+ * @returns массив уникальных имён изображений
18951
+ */
18952
+ const parseIconNamesFromClientStyle = (clientStyle) => {
18953
+ if (!clientStyle?.items) {
18954
+ return [];
18955
+ }
18956
+ const imageNames = new Set();
18957
+ clientStyle.items.forEach(item => {
18958
+ // Парсим icon-image из layout
18959
+ IMAGE_PROPERTIES.layout.forEach(prop => {
18960
+ const value = item.layout?.[prop];
18961
+ if (value) {
18962
+ parseIconNames(value).forEach(name => imageNames.add(name));
18963
+ }
18964
+ });
18965
+ // Парсим fill-pattern, line-pattern, fill-extrusion-pattern из paint
18966
+ IMAGE_PROPERTIES.paint.forEach(prop => {
18967
+ const value = item.paint?.[prop];
18968
+ if (value) {
18969
+ parseIconNames(value).forEach(name => imageNames.add(name));
18970
+ }
18971
+ });
18972
+ });
18973
+ return [...imageNames];
18974
+ };
18975
+
19022
18976
  const VectorLayer = ({ layer, tileUrl, visible, beforeId, getLayerTempStyle, }) => {
19023
18977
  const layerConfiguration = layer?.configuration;
19024
18978
  const clientStyle = layerConfiguration?.clientStyle;
@@ -19251,5 +19205,5 @@ const DEFAULT_HEATMAP_STYLE = {
19251
19205
  ],
19252
19206
  };
19253
19207
 
19254
- 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_HANDLE_ATTR, GRID_HANDLE_PROPS, 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, 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, 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, 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, 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, withTrackSize };
19208
+ 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_HANDLE_ATTR, GRID_HANDLE_PROPS, 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, 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, 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, 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, useSavePrototypeBuilder, useServerNotificationsContext, useShownOtherItems, useToggle, useUpdateDataSource, useVisibleProjectItems, useWidgetConfig, useWidgetContext, useWidgetFilters, useWidgetPage, useWindowResize, useWrapperSize, useZoomToFeatures, useZoomToPoint, withTrackSize };
19255
19209
  //# sourceMappingURL=react.esm.js.map