@evergis/react 4.0.134 → 4.0.136
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/index.js +38 -30
- package/dist/index.js.map +1 -1
- package/dist/react.esm.js +39 -31
- package/dist/react.esm.js.map +1 -1
- package/package.json +3 -3
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, isEmpty, uniqueId,
|
|
7
|
+
import { isNil, isEqual, isEmpty, uniqueId, unescape } from 'lodash';
|
|
8
8
|
import { Color as Color$1, ColorScale } from '@evergis/color';
|
|
9
9
|
import { isValid, format, parseJSON, parseISO, toDate } from 'date-fns';
|
|
10
10
|
import { ru, enUS } from 'date-fns/locale';
|
|
@@ -6349,6 +6349,7 @@ const useMapImages = ({ images }) => {
|
|
|
6349
6349
|
const [loaded, setLoaded] = useState(false);
|
|
6350
6350
|
const [errors, setErrors] = useState({});
|
|
6351
6351
|
const loadedImagesRef = useRef(new Set());
|
|
6352
|
+
const previouslyLoadedImages = useRef([]);
|
|
6352
6353
|
const hasImage = useCallback((name) => {
|
|
6353
6354
|
if (!map?.current) {
|
|
6354
6355
|
return false;
|
|
@@ -6356,8 +6357,9 @@ const useMapImages = ({ images }) => {
|
|
|
6356
6357
|
return map.current.hasImage(name);
|
|
6357
6358
|
}, [map]);
|
|
6358
6359
|
const removeImage = useCallback((name) => {
|
|
6359
|
-
if (!map?.current)
|
|
6360
|
+
if (!map?.current) {
|
|
6360
6361
|
return;
|
|
6362
|
+
}
|
|
6361
6363
|
if (map.current.hasImage(name)) {
|
|
6362
6364
|
map.current.removeImage(name);
|
|
6363
6365
|
loadedImagesRef.current.delete(name);
|
|
@@ -6368,7 +6370,7 @@ const useMapImages = ({ images }) => {
|
|
|
6368
6370
|
throw new Error("Map is not initialized");
|
|
6369
6371
|
}
|
|
6370
6372
|
if (map.current.hasImage(config.name)) {
|
|
6371
|
-
|
|
6373
|
+
removeImage(config.name);
|
|
6372
6374
|
}
|
|
6373
6375
|
const size = config.size ?? DEFAULT_IMAGE_SIZE;
|
|
6374
6376
|
const pixelRatio = config.pixelRatio ?? 1;
|
|
@@ -6429,9 +6431,15 @@ const useMapImages = ({ images }) => {
|
|
|
6429
6431
|
setLoaded(true);
|
|
6430
6432
|
return;
|
|
6431
6433
|
}
|
|
6434
|
+
if (isEqual(images, previouslyLoadedImages.current)) {
|
|
6435
|
+
return;
|
|
6436
|
+
}
|
|
6432
6437
|
const loadAllImages = async () => {
|
|
6433
6438
|
setLoaded(false);
|
|
6434
6439
|
const loadPromises = images.map(async (config) => {
|
|
6440
|
+
if (isEqual(config, previouslyLoadedImages.current.find(item => item.name === config.name))) {
|
|
6441
|
+
return;
|
|
6442
|
+
}
|
|
6435
6443
|
try {
|
|
6436
6444
|
await addImage(config);
|
|
6437
6445
|
}
|
|
@@ -6441,9 +6449,10 @@ const useMapImages = ({ images }) => {
|
|
|
6441
6449
|
});
|
|
6442
6450
|
await Promise.all(loadPromises);
|
|
6443
6451
|
setLoaded(true);
|
|
6452
|
+
previouslyLoadedImages.current = images;
|
|
6444
6453
|
};
|
|
6445
6454
|
void loadAllImages();
|
|
6446
|
-
}, [mapLoaded,
|
|
6455
|
+
}, [mapLoaded, images, map, addImage]);
|
|
6447
6456
|
return { loaded, errors, addImage, removeImage, hasImage };
|
|
6448
6457
|
};
|
|
6449
6458
|
|
|
@@ -16419,15 +16428,10 @@ const RangeDateFilter = ({ type, filter }) => {
|
|
|
16419
16428
|
const updateDebounce = useDebouncedCallback(FILTER_UPDATE_DEBOUNCE);
|
|
16420
16429
|
const { filters: configFilters } = currentPage;
|
|
16421
16430
|
const { filterName, label, minValue, maxValue, withTime } = filter.options;
|
|
16422
|
-
|
|
16423
|
-
// выбор оттуда. Контейнер фильтров размонтируется на время перезапроса источников (их стор
|
|
16424
|
-
// сбрасывается целиком, например, на смену геометрической выборки), и без этого выбранный
|
|
16425
|
-
// диапазон терялся бы, а следом его затирал дефолт.
|
|
16426
|
-
const [value, setValue] = useState(() => [getDate(filters[filterName]?.min)?.toISOString(), getDate(filters[filterName]?.max)?.toISOString()]);
|
|
16431
|
+
const [value, setValue] = useState([undefined, undefined]);
|
|
16427
16432
|
const isInit = useRef(false);
|
|
16428
|
-
|
|
16429
|
-
|
|
16430
|
-
const isDefaultApplied = useRef(!isNil(value[0]) || !isNil(value[1]));
|
|
16433
|
+
const isDefaultApplied = useRef(false);
|
|
16434
|
+
const isRestored = useRef(false);
|
|
16431
16435
|
const configFilter = useMemo(() => getConfigFilter(filterName, configFilters), [configFilters, filterName]);
|
|
16432
16436
|
const dataSource = useMemo(() => getDataSource(configFilter?.relatedDataSource, dataSources), [configFilter?.relatedDataSource, dataSources]);
|
|
16433
16437
|
const { minFromData, maxFromData } = useMemo(() => dataSource?.features?.reduce((prev, { properties }) => {
|
|
@@ -16462,6 +16466,25 @@ const RangeDateFilter = ({ type, filter }) => {
|
|
|
16462
16466
|
const onChange = useCallback((newValue) => {
|
|
16463
16467
|
setValue([newValue[0].toISOString(), newValue[1].toISOString()]);
|
|
16464
16468
|
}, []);
|
|
16469
|
+
// Значение фильтра живёт в общем сторе, локальный стейт — лишь его копия, поэтому при
|
|
16470
|
+
// монтировании поднимаем выбор оттуда: контейнер фильтров размонтируется на время перезапроса
|
|
16471
|
+
// источников (их стор сбрасывается целиком, например, на смену геометрической выборки), и без
|
|
16472
|
+
// восстановления выбранный диапазон терялся бы, а следом его затирал дефолт.
|
|
16473
|
+
// Восстанавливаем эффектом, а не начальным стейтом: `RangeNumberInput` на монтировании затирает
|
|
16474
|
+
// своё внутреннее значение границами календаря и подхватывает диапазон только по изменению
|
|
16475
|
+
// пропа `value`.
|
|
16476
|
+
useEffect(() => {
|
|
16477
|
+
if (isRestored.current)
|
|
16478
|
+
return;
|
|
16479
|
+
isRestored.current = true;
|
|
16480
|
+
const from = getDate(filters[filterName]?.min)?.toISOString();
|
|
16481
|
+
const to = getDate(filters[filterName]?.max)?.toISOString();
|
|
16482
|
+
if (isNil(from) && isNil(to))
|
|
16483
|
+
return;
|
|
16484
|
+
// Выбор уже сделан — дефолт применять нельзя, иначе перемонтирование затирало бы его.
|
|
16485
|
+
isDefaultApplied.current = true;
|
|
16486
|
+
setValue([from, to]);
|
|
16487
|
+
}, [filterName, filters]);
|
|
16465
16488
|
// Дефолт применяем однократно — как только обе границы диапазона известны. С `defaultValue`
|
|
16466
16489
|
// это происходит сразу, без него — после подгрузки фич связанного источника данных.
|
|
16467
16490
|
useEffect(() => {
|
|
@@ -18207,29 +18230,14 @@ const VectorLayer = ({ layer, tileUrl, visible, beforeId, getLayerTempStyle, })
|
|
|
18207
18230
|
: clientStyle, [clientStyle, getLayerTempStyle, layer.name]);
|
|
18208
18231
|
const idAttribute = layerConfiguration?.attributesConfiguration?.idAttribute;
|
|
18209
18232
|
const tiles = useMemo(() => [tileUrl], [tileUrl]);
|
|
18210
|
-
// Собираем конфигурации иконок для загрузки из clientStyle
|
|
18211
18233
|
const iconConfigs = useMemo(() => {
|
|
18212
18234
|
if (!currentStyle?.items) {
|
|
18213
18235
|
return [];
|
|
18214
18236
|
}
|
|
18215
|
-
|
|
18216
|
-
|
|
18217
|
-
return [];
|
|
18218
|
-
}
|
|
18219
|
-
return iconNames.map(name => {
|
|
18220
|
-
const customIcon = currentStyle.icons?.find((icon) => icon.name === name);
|
|
18221
|
-
if (customIcon) {
|
|
18222
|
-
return {
|
|
18223
|
-
name: customIcon.name,
|
|
18224
|
-
url: customIcon.url,
|
|
18225
|
-
sdf: customIcon.sdf,
|
|
18226
|
-
size: customIcon.size,
|
|
18227
|
-
pixelRatio: customIcon.pixelRatio,
|
|
18228
|
-
};
|
|
18229
|
-
}
|
|
18230
|
-
// Fallback - иконка не найдена в конфиге, пропускаем
|
|
18231
|
-
return null;
|
|
18232
|
-
}).filter((config) => config !== null);
|
|
18237
|
+
return parseIconNamesFromClientStyle(currentStyle).reduce((acc, curr) => {
|
|
18238
|
+
const icon = currentStyle.icons?.find((icon) => icon.name === curr);
|
|
18239
|
+
return icon ? [...acc, icon] : acc;
|
|
18240
|
+
}, []);
|
|
18233
18241
|
}, [currentStyle]);
|
|
18234
18242
|
useMapImages({ images: iconConfigs });
|
|
18235
18243
|
const renderClientStyle = useCallback(() => {
|