@opengeoweb/core 12.13.0 → 13.1.0

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/README.md CHANGED
@@ -9,7 +9,7 @@ This library was generated with [Nx](https://nx.dev).
9
9
  ## Installation
10
10
 
11
11
  ```
12
- npm install @opengeoweb/core @opengeoweb/store @opengeoweb/timeslider
12
+ npm install @opengeoweb/core @opengeoweb/store @opengeoweb/time-slider
13
13
  ```
14
14
 
15
15
  ## Use
@@ -25,7 +25,7 @@ import {
25
25
  CoreThemeStoreProvider,
26
26
  } from '@opengeoweb/core';
27
27
  import { storeMiddlewares, storeReducerMap } from '@opengeoweb/store';
28
- import { TimeSliderConnect } from '@opengeoweb/timeslider';
28
+ import { TimeSliderConnect } from '@opengeoweb/time-slider';
29
29
  import { configureStore } from '@reduxjs/toolkit';
30
30
 
31
31
  const store = configureStore({
package/index.esm.js CHANGED
@@ -6,8 +6,8 @@ import { safelyInitI18nForTestsAndStories, sharedTranslations, SHARED_NAMESPACE,
6
6
  import { CollapseSmall, CollapseMedium, CollapseLarge, CollapseWindow, ExpandWindow, LayersAdd, CloudLoading, ColumnCollapsed, ColumnCollapse, Copy, None, FastForward, AutoUpdateActive, Both, Delete, Visibility, VisibilityOff, DragHandle as DragHandle$1, Cached, Add, MapAdd, WorldMapProjection, Overlayers, Layers, ExitDomain, Info, Search, Exclamation, MyLocation, Close, ThemeWrapper, lightTheme, FlagBritain, FlagNetherlands, FlagFinland, FlagNorway } from '@opengeoweb/theme';
7
7
  import i18n from 'i18next';
8
8
  import { useTranslation, I18nextProvider } from 'react-i18next';
9
- import { TIMESLIDER_NAMESPACE, timesliderTranslations, defaultTimeSpan, SpeedButton, TimeStepButton, AnimationLengthButton, AnimationLength, TimeSpanButton, secondsPerPxFromCanvasWidth, getNewCenterOfFixedPointZoom, OptionsMenuButton, PlayButton, defaultTimeStep, BackwardForwardStepButton, AutoUpdateButton, NowButton, handleSetNowEvent, TimeSliderButtons, TimeSliderCurrentTimeBox, TimeSliderLegend, onsetNewDateDebounced, defaultSecondsPerPx, moveSelectedTimePx, TimeSlider, getFilteredTime, ControlButtons, OptionsMenu, TimeSliderClock } from '@opengeoweb/timeslider';
10
- import { webmapReactTranslations, WEBMAP_REACT_NAMESPACE, webmapTranslations, WEBMAP_NAMESPACE, LayerInfoButton, LayerInfoDialog, MapControlButton, MapDimensionSelect, dimensionConfig, DimensionSelectDialog, DimensionSelectButton, LegendDialog, LegendButton, MapContext, emptyGeoJSON, MapFeatureClass, setMapCenter, OpenLayersFeatureLayer, OpenLayersMapDraw, getIsInsideAcceptanceTime, OpenLayersLayer, useSetIntervalWhenVisible, openLayersGetMapImageStore, TimeContext, OpenLayersMapView, WMSLayer, genericOpenLayersFeatureStyle, OpenLayersGetFeatureInfo, MapControls, OpenLayersZoomControl, getLayerUpdateInfo, publicLayers } from '@opengeoweb/webmap-react';
9
+ import { TIME_SLIDER_NAMESPACE, timesliderTranslations, defaultTimeSpan, SpeedButton, TimeStepButton, AnimationLengthButton, AnimationLength, TimeSpanButton, secondsPerPxFromCanvasWidth, getNewCenterOfFixedPointZoom, OptionsMenuButton, PlayButton, defaultTimeStep, BackwardForwardStepButton, AutoUpdateButton, NowButton, handleSetNowEvent, TimeSliderButtons, TimeSliderCurrentTimeBox, TimeSliderLegend, onsetNewDateDebounced, defaultSecondsPerPx, moveSelectedTimePx, TimeSlider, getFilteredTime, ControlButtons, OptionsMenu, TimeSliderClock } from '@opengeoweb/time-slider';
10
+ import { webmapReactTranslations, WEBMAP_REACT_NAMESPACE, webmapTranslations, WEBMAP_NAMESPACE, LayerInfoButton, LayerInfoDialog, MapControlButton, MapDimensionSelect, dimensionConfig, DimensionSelectDialog, DimensionSelectButton, LegendDialog, LegendButton, MapContext, emptyGeoJSON, MapFeatureClass, setMapCenter, OpenLayersFeatureLayer, OpenLayersMapDraw, makeTimeList, getIsInsideAcceptanceTime, OpenLayersLayer, useSetIntervalWhenVisible, openLayersGetMapImageStore, TimeContext, OpenLayersMapView, WMSLayer, genericOpenLayersFeatureStyle, OpenLayersGetFeatureInfo, MapControls, OpenLayersZoomControl, getLayerUpdateInfo, publicLayers } from '@opengeoweb/webmap-react';
11
11
  import { useDispatch, useSelector, connect, useStore, Provider } from 'react-redux';
12
12
  import { ReactSortable } from 'react-sortablejs';
13
13
  import Sortable from 'sortablejs';
@@ -76,7 +76,7 @@ var en = {
76
76
  "layermanager-header-button-large": "large",
77
77
  "layermanager-header-button-dock": "Dock",
78
78
  "layermanager-header-button-undock": "Undock",
79
- "layermanager-EDR-multiparam": "Multi params",
79
+ "layermanager-EDR": "EDR: ",
80
80
  "projection-title": "Projection",
81
81
  "wms-loader-description": "Please enter a wms server, or select one from the list.",
82
82
  "wms-loader-no-data": "No data",
@@ -699,11 +699,11 @@ var initCoreReactI18n = function initCoreReactI18n() {
699
699
  ns: SHARED_NAMESPACE,
700
700
  translations: sharedTranslations
701
701
  }, {
702
- ns: TIMESLIDER_NAMESPACE,
702
+ ns: TIME_SLIDER_NAMESPACE,
703
703
  translations: timesliderTranslations
704
704
  }]);
705
705
  };
706
- var ns = [CORE_NAMESPACE, TIMESLIDER_NAMESPACE];
706
+ var ns = [CORE_NAMESPACE, TIME_SLIDER_NAMESPACE];
707
707
  var useCoreTranslation = function useCoreTranslation() {
708
708
  return useTranslation(ns);
709
709
  };
@@ -1218,6 +1218,26 @@ var DimensionSelectName = function DimensionSelectName(_ref) {
1218
1218
  });
1219
1219
  };
1220
1220
 
1221
+ var LatestOptions;
1222
+ (function (LatestOptions) {
1223
+ LatestOptions["LATEST_0"] = "Latest";
1224
+ LatestOptions["LATEST_1"] = "Latest -1";
1225
+ LatestOptions["LATEST_2"] = "Latest -2";
1226
+ LatestOptions["LATEST_3"] = "Latest -3";
1227
+ })(LatestOptions || (LatestOptions = {}));
1228
+ var createLatestMap = function createLatestMap(dimensionValuesRaw) {
1229
+ var latestOptions = Object.values(LatestOptions).slice(0, dimensionValuesRaw.length);
1230
+ return {
1231
+ getValue: function getValue(value) {
1232
+ var index = dimensionValuesRaw.indexOf(value);
1233
+ return index !== -1 ? latestOptions[index] : value;
1234
+ },
1235
+ getIndex: function getIndex(value) {
1236
+ return latestOptions.indexOf(value);
1237
+ },
1238
+ latestOptions: latestOptions
1239
+ };
1240
+ };
1221
1241
  var DimensionSelectValue = function DimensionSelectValue(_ref) {
1222
1242
  var isEnabled = _ref.isEnabled,
1223
1243
  tooltip = _ref.tooltip,
@@ -1234,24 +1254,40 @@ var DimensionSelectValue = function DimensionSelectValue(_ref) {
1234
1254
  var _useCoreTranslation = useCoreTranslation(),
1235
1255
  t = _useCoreTranslation.t;
1236
1256
  var dimensionValuesRaw = generatedValues.toReversed().slice(0, 100);
1257
+ var latestMap = createLatestMap(dimensionValuesRaw);
1237
1258
  if (!(selectedDimension != null && selectedDimension.name) || !(dimensionValuesRaw != null && dimensionValuesRaw.length)) {
1238
1259
  return null;
1239
1260
  }
1240
1261
  var isReferenceTimeDimensionAndUseLatestIsAvailable = selectedDimension.name === 'reference_time' && useLatestReferenceTime !== undefined;
1241
1262
  var latestValue = dimensionValuesRaw[0];
1263
+ var dimensionValues = isReferenceTimeDimensionAndUseLatestIsAvailable ? [].concat(latestMap.latestOptions, dimensionValuesRaw.slice(hideLatestDuplicate ? 1 : 0)) : dimensionValuesRaw.slice().reverse();
1242
1264
  var setDimensionValue = function setDimensionValue(dimensionValue) {
1243
1265
  if (isReferenceTimeDimensionAndUseLatestIsAvailable) {
1244
- if (dimensionValue === 'Latest') {
1266
+ var index = latestMap.getIndex(dimensionValue);
1267
+ if (index !== -1) {
1245
1268
  setUseLatestReferenceTime == null || setUseLatestReferenceTime(true);
1246
- onLayerChangeDimension(selectedDimension.name, dimensionValuesRaw[0], layerTypes.LayerActionOrigin.layerManager);
1269
+ onLayerChangeDimension(selectedDimension.name, dimensionValuesRaw[index], layerTypes.LayerActionOrigin.layerManager);
1247
1270
  return;
1248
1271
  }
1249
1272
  setUseLatestReferenceTime == null || setUseLatestReferenceTime(false);
1250
1273
  }
1251
1274
  onLayerChangeDimension(selectedDimension.name, dimensionValue, layerTypes.LayerActionOrigin.layerManager);
1252
1275
  };
1253
- var dimensionValues = isReferenceTimeDimensionAndUseLatestIsAvailable ? ['Latest'].concat(dimensionValuesRaw.slice(hideLatestDuplicate ? 1 : 0)) : dimensionValuesRaw.slice().reverse();
1254
- var isLatest = isReferenceTimeDimensionAndUseLatestIsAvailable && useLatestReferenceTime && selectedDimension.maxValue === selectedDimension.currentValue;
1276
+ var isOneOfLatest = isReferenceTimeDimensionAndUseLatestIsAvailable && useLatestReferenceTime;
1277
+ var getValue = function getValue() {
1278
+ if (isOneOfLatest) {
1279
+ return latestMap.getValue(selectedDimension.currentValue);
1280
+ }
1281
+ return selectedDimension.currentValue;
1282
+ };
1283
+ var getIndex = function getIndex() {
1284
+ if (isOneOfLatest) {
1285
+ return latestMap.getIndex(selectedDimension.currentValue);
1286
+ }
1287
+ return dimensionValues.findIndex(function (dimensionValue) {
1288
+ return dimensionValue === selectedDimension.currentValue;
1289
+ });
1290
+ };
1255
1291
  return jsxs(TooltipSelect, {
1256
1292
  "data-testid": "dimensionSelectValue",
1257
1293
  disableUnderline: true,
@@ -1260,15 +1296,13 @@ var DimensionSelectValue = function DimensionSelectValue(_ref) {
1260
1296
  },
1261
1297
  tooltip: tooltip,
1262
1298
  isEnabled: isEnabled,
1263
- value: isLatest ? 'Latest' : selectedDimension.currentValue,
1299
+ value: getValue(),
1264
1300
  list: dimensionValues.map(function (dimensionValue) {
1265
1301
  return {
1266
1302
  value: dimensionValue
1267
1303
  };
1268
1304
  }),
1269
- currentIndex: isLatest ? 0 : dimensionValues.findIndex(function (dimensionValue) {
1270
- return dimensionValue === selectedDimension.currentValue;
1271
- }),
1305
+ currentIndex: getIndex(),
1272
1306
  onChange: function onChange(event) {
1273
1307
  event.stopPropagation();
1274
1308
  setDimensionValue(event.target.value);
@@ -1294,7 +1328,7 @@ var DimensionSelectValue = function DimensionSelectValue(_ref) {
1294
1328
  style: {
1295
1329
  whiteSpace: 'nowrap'
1296
1330
  },
1297
- children: [dimensionValue, dimensionValue !== 'Latest' && jsxs("i", {
1331
+ children: [dimensionValue, !dimensionValue.includes('Latest') && jsxs("i", {
1298
1332
  children: [" ", selectedDimension.units]
1299
1333
  })]
1300
1334
  })
@@ -2461,7 +2495,7 @@ var Accordion = function Accordion(_ref0) {
2461
2495
  isEDRLayer = _ref0$isEDRLayer === void 0 ? false : _ref0$isEDRLayer;
2462
2496
  var _useCoreTranslation3 = useCoreTranslation(),
2463
2497
  t = _useCoreTranslation3.t;
2464
- var displayLayerName = isEDRLayer && layerName != null && layerName.includes(',') ? t('layermanager-EDR-multiparam') : layerName;
2498
+ var displayLayerName = isEDRLayer ? t('layermanager-EDR') + layerName : layerName;
2465
2499
  return jsx(CustomAccordion, {
2466
2500
  className: "medium-layermanager",
2467
2501
  defaultExpanded: false,
@@ -2832,10 +2866,12 @@ var getRenderEDRLayersValues = function getRenderEDRLayersValues(selectedParams,
2832
2866
  };
2833
2867
  };
2834
2868
  var RenderEDRLayers = function RenderEDRLayers(_ref) {
2835
- var onChangeLayerName = _ref.onChangeLayerName,
2869
+ var onChangeLayerOptions = _ref.onChangeLayerOptions,
2836
2870
  selectedParams = _ref.selectedParams,
2837
2871
  _ref$layers = _ref.layers,
2838
2872
  layers = _ref$layers === void 0 ? [] : _ref$layers,
2873
+ layerName = _ref.layerName,
2874
+ collectionId = _ref.collectionId,
2839
2875
  _ref$isEnabled = _ref.isEnabled,
2840
2876
  isEnabled = _ref$isEnabled === void 0 ? true : _ref$isEnabled,
2841
2877
  tooltipPrefix = _ref.tooltipPrefix,
@@ -2849,10 +2885,13 @@ var RenderEDRLayers = function RenderEDRLayers(_ref) {
2849
2885
  var selectLayer = function selectLayer(event) {
2850
2886
  event.stopPropagation();
2851
2887
  // Ensure after deselecting all, the empty value gets removed
2852
- var params = event.target.value.filter(function (param) {
2888
+ var parameterNames = event.target.value.filter(function (param) {
2853
2889
  return param !== '';
2854
2890
  });
2855
- onChangeLayerName(params.join(','));
2891
+ onChangeLayerOptions({
2892
+ collectionId: collectionId,
2893
+ parameterNames: parameterNames
2894
+ });
2856
2895
  };
2857
2896
  var _getRenderEDRLayersVa = getRenderEDRLayersValues(selectedParams, layers),
2858
2897
  currentValues = _getRenderEDRLayersVa.currentValues,
@@ -2862,7 +2901,7 @@ var RenderEDRLayers = function RenderEDRLayers(_ref) {
2862
2901
  value: layer.name
2863
2902
  };
2864
2903
  });
2865
- var multiParamText = t('layermanager-EDR-multiparam');
2904
+ var edrText = t('layermanager-EDR');
2866
2905
  var tooltipNames = currentValues.map(function (value) {
2867
2906
  var layer = extendedLayers.find(function (layer) {
2868
2907
  return value === layer.name;
@@ -2886,14 +2925,8 @@ var RenderEDRLayers = function RenderEDRLayers(_ref) {
2886
2925
  onChange: selectLayer,
2887
2926
  skipLocalStyling: skipLocalStyling,
2888
2927
  multiple: true,
2889
- renderValue: function renderValue(values) {
2890
- if (values.length === 1) {
2891
- var layer = extendedLayers.find(function (layer) {
2892
- return layer.name === currentValues[0];
2893
- });
2894
- return (layer == null ? void 0 : layer.title) || (layer == null ? void 0 : layer.name) || 'Param';
2895
- }
2896
- return multiParamText;
2928
+ renderValue: function renderValue() {
2929
+ return edrText + layerName;
2897
2930
  },
2898
2931
  children: [jsx(MenuItem, {
2899
2932
  disabled: true,
@@ -2927,6 +2960,9 @@ var RenderLayersConnect = function RenderLayersConnect(_ref) {
2927
2960
  var layerName = useSelector(function (store) {
2928
2961
  return layerSelectors.getLayerName(store, layerId);
2929
2962
  });
2963
+ var layerDisplayName = useSelector(function (store) {
2964
+ return layerSelectors.getLayerDisplayName(store, layerId);
2965
+ });
2930
2966
  var layerType = useSelector(function (store) {
2931
2967
  return layerSelectors.getLayerType(store, layerId);
2932
2968
  });
@@ -2939,6 +2975,9 @@ var RenderLayersConnect = function RenderLayersConnect(_ref) {
2939
2975
  var service = useSelector(function (store) {
2940
2976
  return serviceSelectors.getServiceByUrl(store, layerService);
2941
2977
  });
2978
+ var layerOptions = useSelector(function (store) {
2979
+ return layerSelectors.getLayerOptions(store, layerId);
2980
+ });
2942
2981
  var serviceSetLayers = React.useCallback(function (payload) {
2943
2982
  dispatch(serviceActions.serviceSetLayers(payload));
2944
2983
  }, [dispatch]);
@@ -2997,15 +3036,29 @@ var RenderLayersConnect = function RenderLayersConnect(_ref) {
2997
3036
  origin: layerTypes.LayerActionOrigin.layerManager
2998
3037
  }));
2999
3038
  }, [dispatch, mapId]);
3000
- if (layerType === LayerType.edrLayer) {
3001
- var selectedParams = layerName.split(',');
3039
+ var layerChangeOptions = React.useCallback(function (_ref4) {
3040
+ var layerId = _ref4.layerId,
3041
+ options = _ref4.options;
3042
+ return dispatch(layerActions.layerChangeOptions({
3043
+ layerId: layerId,
3044
+ options: options,
3045
+ mapId: mapId,
3046
+ origin: layerTypes.LayerActionOrigin.layerManager
3047
+ }));
3048
+ }, [dispatch, mapId]);
3049
+ if (layerType === LayerType.edrFeatureLayer) {
3050
+ var _layerOptions$paramet;
3051
+ var selectedParams = (_layerOptions$paramet = layerOptions == null ? void 0 : layerOptions.parameterNames) != null ? _layerOptions$paramet : [];
3052
+ var collectionId = (layerOptions == null ? void 0 : layerOptions.collectionId) || '';
3002
3053
  return jsx(RenderEDRLayers, {
3003
3054
  layers: layers,
3055
+ layerName: layerDisplayName,
3056
+ collectionId: collectionId,
3004
3057
  selectedParams: selectedParams,
3005
- onChangeLayerName: function onChangeLayerName(name) {
3006
- layerChangeName({
3058
+ onChangeLayerOptions: function onChangeLayerOptions(options) {
3059
+ layerChangeOptions({
3007
3060
  layerId: layerId,
3008
- name: name
3061
+ options: options
3009
3062
  });
3010
3063
  },
3011
3064
  isEnabled: isLayerEnabled,
@@ -3303,24 +3356,11 @@ var MissingDataConnect = function MissingDataConnect(_ref) {
3303
3356
  var layerIsInsideAcceptanceTime = useSelector(function (store) {
3304
3357
  return layerSelectors.getLayerIsInsideAcceptanceTime(store, layerId, mapId);
3305
3358
  });
3306
- var layerName = useSelector(function (store) {
3307
- return layerSelectors.getLayerName(store, layerId);
3308
- });
3309
- var layerType = useSelector(function (store) {
3310
- return layerSelectors.getLayerType(store, layerId);
3311
- });
3312
- var layerService = useSelector(function (store) {
3313
- return layerSelectors.getLayerService(store, layerId);
3314
- });
3315
- var serviceLayer = useSelector(function (store) {
3316
- return serviceSelectors.getLayerFromService(store, layerService, layerName, layerType === LayerType.edrLayer);
3317
- });
3318
- var layerStatus = useSelector(function (store) {
3319
- return layerSelectors.getLayerStatus(store, layerId);
3359
+ var isLayerMissing = useSelector(function (store) {
3360
+ return layerSelectors.getIsLayerMissing(store, layerId);
3320
3361
  });
3321
- var layerIsMissingOnServer = !serviceLayer || layerStatus === layerTypes.LayerStatus.error;
3322
3362
  return jsx(MissingData, {
3323
- layerIsInsideAcceptanceTime: layerIsMissingOnServer ? 'outside' : layerIsInsideAcceptanceTime
3363
+ layerIsInsideAcceptanceTime: isLayerMissing ? 'outside' : layerIsInsideAcceptanceTime
3324
3364
  });
3325
3365
  };
3326
3366
 
@@ -3445,45 +3485,32 @@ var LayerRowConnect = /*#__PURE__*/React.memo(function (_ref) {
3445
3485
  var layerName = useSelector(function (store) {
3446
3486
  return layerSelectors.getLayerName(store, layerId);
3447
3487
  });
3488
+ var layerDisplayName = useSelector(function (store) {
3489
+ return layerSelectors.getLayerDisplayName(store, layerId);
3490
+ });
3448
3491
  var layerType = useSelector(function (store) {
3449
3492
  return layerSelectors.getLayerType(store, layerId);
3450
3493
  });
3451
- var isEDRLayer = layerType === LayerType.edrLayer;
3494
+ var isEDRLayer = layerType === LayerType.edrFeatureLayer;
3452
3495
  var layerServiceUrl = useSelector(function (store) {
3453
3496
  return layerSelectors.getLayerService(store, layerId);
3454
3497
  });
3455
- var serviceLayer = useSelector(function (store) {
3456
- return serviceSelectors.getLayerFromService(store, layerServiceUrl, layerName, isEDRLayer);
3457
- });
3458
- var layerStatus = useSelector(function (store) {
3459
- return layerSelectors.getLayerStatus(store, layerId);
3460
- });
3461
- var currentlySelectedLayer = useSelector(function (store) {
3462
- return layerSelectors.getLayerByIdWithoutTimeDimension(store, layerId);
3498
+ var isLayerMissing = useSelector(function (store) {
3499
+ return layerSelectors.getIsLayerMissing(store, layerId);
3463
3500
  });
3464
- var layerWithAllData = useSelector(function (store) {
3465
- return serviceSelectors.getLayerFromService(store, currentlySelectedLayer == null ? void 0 : currentlySelectedLayer.service, currentlySelectedLayer == null ? void 0 : currentlySelectedLayer.name);
3466
- });
3467
- var currentService = useSelector(function (store) {
3468
- return serviceSelectors.getServiceByUrl(store, layerServiceUrl);
3469
- });
3470
- // Ensure that for an EDR layer, we send over the entire layerName if there are multiple params selected
3471
- // If only one param selected, send over the title from the service
3472
- var layerNameForEDRLayer = layerName != null && layerName.includes(',') ? layerName : serviceLayer == null ? void 0 : serviceLayer.title;
3473
- var fullLayerName = isEDRLayer ? layerNameForEDRLayer : serviceLayer == null ? void 0 : serviceLayer.title;
3474
3501
  renderCounter.count(LayerRowConnect.name);
3475
3502
  return jsx(LayerRow, {
3476
3503
  isEnabled: isEnabled,
3477
3504
  mapId: mapId,
3478
3505
  layerId: layerId,
3479
- isLayerMissing: !serviceLayer || layerStatus === layerTypes.LayerStatus.error,
3480
- layerName: fullLayerName || layerName,
3506
+ isLayerMissing: isLayerMissing,
3507
+ layerName: layerDisplayName,
3481
3508
  isEDRLayer: isEDRLayer,
3482
3509
  layerEnableLayout: jsx(EnableLayerConnect, {
3483
3510
  layerId: layerId,
3484
3511
  mapId: mapId,
3485
3512
  isEnabled: isEnabled,
3486
- layerName: fullLayerName || layerName,
3513
+ layerName: layerDisplayName,
3487
3514
  icon: isEnabled ? settings == null || (_settings$enableLayer = settings.enableLayer) == null ? void 0 : _settings$enableLayer.enabledIcon : settings == null || (_settings$enableLayer2 = settings.enableLayer) == null ? void 0 : _settings$enableLayer2.disabledIcon,
3488
3515
  tooltipTitle: isEnabled ? settings == null || (_settings$enableLayer3 = settings.enableLayer) == null ? void 0 : _settings$enableLayer3.enabledTooltipTitle : settings == null || (_settings$enableLayer4 = settings.enableLayer) == null ? void 0 : _settings$enableLayer4.disabledTooltipTitle
3489
3516
  }),
@@ -3527,10 +3554,10 @@ var LayerRowConnect = /*#__PURE__*/React.memo(function (_ref) {
3527
3554
  layerId: layerId
3528
3555
  }, settings == null ? void 0 : settings.deleteLayer)),
3529
3556
  layerShowLayerInfoLayout: jsx(LayerInfoButtonConnect, {
3530
- isLayerMissing: !serviceLayer,
3557
+ isLayerMissing: isLayerMissing,
3531
3558
  mapId: mapId,
3532
- serviceUrl: currentService == null ? void 0 : currentService.serviceUrl,
3533
- layerName: (layerWithAllData == null ? void 0 : layerWithAllData.name) || ''
3559
+ serviceUrl: layerServiceUrl,
3560
+ layerName: layerName
3534
3561
  }),
3535
3562
  layerMenuLayout: jsx(LayerManagerMenuButtonConnect, Object.assign({
3536
3563
  mapId: mapId,
@@ -5720,6 +5747,11 @@ var AnimationLengthButtonConnect = function AnimationLengthButtonConnect(_ref) {
5720
5747
  var animationEndTime = dateUtils.dateToIsoString(dateUtils.add(dateUtils.utc(selectedAnimationStartTime), {
5721
5748
  minutes: length
5722
5749
  }));
5750
+ dispatch(mapActions.setAnimationStartTime({
5751
+ mapId: mapId,
5752
+ animationStartTime: selectedAnimationStartTime || dateUtils.dateToIsoString(dateUtils.utc()),
5753
+ origin: mapEnums.MapActionOrigin.map
5754
+ }));
5723
5755
  dispatch(mapActions.setAnimationEndTime({
5724
5756
  mapId: mapId,
5725
5757
  animationEndTime: animationEndTime || dateUtils.dateToIsoString(dateUtils.utc()),
@@ -5787,10 +5819,6 @@ var TimeSpanButtonConnect = function TimeSpanButtonConnect(_ref) {
5787
5819
  var newSecondsPerPx = secondsPerPxFromCanvasWidth(timeSliderWidth, spanInSeconds);
5788
5820
  var newCenterTime = getNewCenterOfFixedPointZoom(selectedTime, secondsPerPx, newSecondsPerPx, centerTime);
5789
5821
  if (spanInSeconds !== undefined && newCenterTime !== undefined && newSecondsPerPx !== undefined) {
5790
- dispatch(mapActions.setTimeSliderSecondsPerPx({
5791
- mapId: mapId,
5792
- timeSliderSecondsPerPx: newSecondsPerPx
5793
- }));
5794
5822
  dispatch(mapActions.setTimeSliderSpan({
5795
5823
  mapId: mapId,
5796
5824
  timeSliderSpan: spanInSeconds,
@@ -5960,7 +5988,9 @@ var NowButtonConnect = function NowButtonConnect(_ref) {
5960
5988
  dispatch(genericActions.setTime({
5961
5989
  sourceId: sourceId,
5962
5990
  origin: 'NowButtonConnect, 140',
5963
- value: handleDateUtilsISOString(newDate)
5991
+ value: {
5992
+ currentTime: handleDateUtilsISOString(newDate)
5993
+ }
5964
5994
  }));
5965
5995
  };
5966
5996
  var onSetCenterTime = function onSetCenterTime(newTime) {
@@ -6165,16 +6195,6 @@ var TimeSliderLegendConnect = function TimeSliderLegendConnect(_ref) {
6165
6195
  timeSliderCenterTime: newTime
6166
6196
  }));
6167
6197
  },
6168
- onZoom: function onZoom(newSecondsPerPx, newCenterTime) {
6169
- dispatch(mapActions.setTimeSliderSecondsPerPx({
6170
- mapId: mapId,
6171
- timeSliderSecondsPerPx: newSecondsPerPx
6172
- }));
6173
- dispatch(mapActions.setTimeSliderCenterTime({
6174
- mapId: mapId,
6175
- timeSliderCenterTime: newCenterTime
6176
- }));
6177
- },
6178
6198
  onSetAnimationStartTime: function onSetAnimationStartTime(animationStartTime) {
6179
6199
  dispatch(mapActions.setAnimationStartTime({
6180
6200
  mapId: mapId,
@@ -6195,14 +6215,6 @@ var TimeSliderLegendConnect = function TimeSliderLegendConnect(_ref) {
6195
6215
  mapId: mapId,
6196
6216
  timeSliderWidth: newWidth
6197
6217
  }));
6198
- var spanInSeconds = secondsPerPx * storeWidth;
6199
- var newSecondsPerPx = secondsPerPxFromCanvasWidth(newWidth, spanInSeconds);
6200
- if (newSecondsPerPx !== undefined) {
6201
- dispatch(mapActions.setTimeSliderSecondsPerPx({
6202
- mapId: mapId,
6203
- timeSliderSecondsPerPx: newSecondsPerPx
6204
- }));
6205
- }
6206
6218
  }
6207
6219
  },
6208
6220
  adjustSelectedTimeOnWheel: adjustSelectedTimeOnWheel
@@ -6259,14 +6271,12 @@ var useUpdateTimeSpan = function useUpdateTimeSpan(mapId, myOnSetTimeSliderSpan)
6259
6271
  var isAnimating = useSelector(function (store) {
6260
6272
  return mapSelectors.isAnimating(store, mapId);
6261
6273
  });
6262
- var updateTimeSliderSpan = function updateTimeSliderSpan(spanInSeconds, newCenterTime, newSecondsPerPx) {
6263
- if (spanInSeconds !== undefined && newCenterTime !== undefined && newSecondsPerPx !== undefined) {
6264
- // Do not dispatch actions if values are the same
6265
- if (currentTimeSpan !== spanInSeconds || secondsPerPx !== newSecondsPerPx || centerTime !== newCenterTime) {
6266
- myOnSetTimeSliderSpan(spanInSeconds, newCenterTime, newSecondsPerPx);
6267
- }
6274
+ var updateTimeSliderSpan = React.useCallback(function (spanInSeconds, newCenterTime) {
6275
+ // Do not dispatch actions if values are the same
6276
+ if (spanInSeconds !== undefined && newCenterTime !== undefined && (currentTimeSpan !== spanInSeconds || centerTime !== newCenterTime)) {
6277
+ myOnSetTimeSliderSpan(spanInSeconds, newCenterTime);
6268
6278
  }
6269
- };
6279
+ }, [centerTime, currentTimeSpan, myOnSetTimeSliderSpan]);
6270
6280
  React.useEffect(function () {
6271
6281
  if (isTimeSpanAuto && autoTimeStepLayerId && activeLayerTimeDimension && !isAnimating) {
6272
6282
  var _getTimeBounds = getTimeBounds([activeLayerTimeDimension]),
@@ -6275,14 +6285,12 @@ var useUpdateTimeSpan = function useUpdateTimeSpan(mapId, myOnSetTimeSliderSpan)
6275
6285
  var minimumStartTime = selectedTime - 24 * 3600;
6276
6286
  var slicedStartTime = startTime < minimumStartTime ? minimumStartTime : startTime;
6277
6287
  var spanInSeconds = endTime - slicedStartTime;
6278
- var newSecondsPerPx = secondsPerPxFromCanvasWidth(timeSliderWidth, spanInSeconds);
6279
6288
  var newCenterTime = (slicedStartTime + endTime) / 2;
6280
- updateTimeSliderSpan(spanInSeconds, newCenterTime, newSecondsPerPx);
6289
+ updateTimeSliderSpan(spanInSeconds, newCenterTime);
6281
6290
  } else {
6282
6291
  var _spanInSeconds = currentTimeSpan || defaultTimeSpan;
6283
- var _newSecondsPerPx = secondsPerPxFromCanvasWidth(timeSliderWidth, _spanInSeconds);
6284
- var _newCenterTime = getNewCenterOfFixedPointZoom(selectedTime, secondsPerPx, _newSecondsPerPx, centerTime);
6285
- updateTimeSliderSpan(_spanInSeconds, _newCenterTime, _newSecondsPerPx);
6292
+ var _newCenterTime = getNewCenterOfFixedPointZoom(selectedTime, secondsPerPx, secondsPerPxFromCanvasWidth(timeSliderWidth, _spanInSeconds), centerTime);
6293
+ updateTimeSliderSpan(_spanInSeconds, _newCenterTime);
6286
6294
  }
6287
6295
  // eslint-disable-next-line react-hooks/exhaustive-deps
6288
6296
  }, [autoTimeStepLayerId, isTimeSpanAuto, mapId, activeLayerTimeDimension == null ? void 0 : activeLayerTimeDimension.name]);
@@ -6330,19 +6338,11 @@ var TimeSliderConnect = function TimeSliderConnect(_ref) {
6330
6338
  origin: mapEnums.MapActionOrigin.map
6331
6339
  }));
6332
6340
  }, [dispatch, mapId]);
6333
- var onSetTimeSliderSpan = React.useCallback(function (newSpan, newCenterTime, newSecondsPerPx) {
6334
- dispatch(mapActions.setTimeSliderSecondsPerPx({
6335
- mapId: mapId,
6336
- timeSliderSecondsPerPx: newSecondsPerPx
6337
- }));
6341
+ var onSetTimeSliderSpan = React.useCallback(function (newSpan) {
6338
6342
  dispatch(mapActions.setTimeSliderSpan({
6339
6343
  mapId: mapId,
6340
6344
  timeSliderSpan: newSpan
6341
6345
  }));
6342
- dispatch(mapActions.setTimeSliderCenterTime({
6343
- mapId: mapId,
6344
- timeSliderCenterTime: newCenterTime
6345
- }));
6346
6346
  }, [dispatch, mapId]);
6347
6347
  var timeStep = useSelector(function (store) {
6348
6348
  return mapSelectors.getMapTimeStep(store, mapId);
@@ -6384,7 +6384,9 @@ var TimeSliderConnect = function TimeSliderConnect(_ref) {
6384
6384
  dispatch(genericActions.setTime({
6385
6385
  sourceId: sourceId,
6386
6386
  origin: 'TimeSliderConnect',
6387
- value: handleDateUtilsISOString(newDate)
6387
+ value: {
6388
+ currentTime: handleDateUtilsISOString(newDate)
6389
+ }
6388
6390
  }));
6389
6391
  }, [dispatch, isAnimating, mapId, sourceId]);
6390
6392
  // Update local state when time is updated outside of this component, e.g. during animation or syncgroups
@@ -7586,32 +7588,27 @@ var OpenLayersFeatureLayerConnect = function OpenLayersFeatureLayerConnect(_ref)
7586
7588
  * Copyright 2025 - Finnish Meteorological Institute (FMI)
7587
7589
  * Copyright 2025 - The Norwegian Meteorological Institute (MET Norway)
7588
7590
  * */
7589
- var makePrefetchTimeSpan = function makePrefetchTimeSpan(timeSliderStartCenterEndTime, animationStartTime, animationEndTime, isAnimating) {
7590
- var timeSliderTimeStepInS = timeSliderStartCenterEndTime.step * 60;
7591
- var animationTimeStartInS = dateUtils.parseISO(animationStartTime).getTime() / 1000;
7592
- var animationTimeEndInS = dateUtils.parseISO(animationEndTime).getTime() / 1000;
7593
- var prefetchStart = isAnimating ? animationTimeStartInS : timeSliderStartCenterEndTime.start;
7594
- var prefetchEnd = isAnimating ? animationTimeEndInS : timeSliderStartCenterEndTime.end;
7595
- if (!prefetchStart || !prefetchEnd) {
7591
+ var makePrefetchTimeSpan = function makePrefetchTimeSpan(timeSliderStartCenterEndTime, isAnimating, prefetchList) {
7592
+ var timeSliderTimeStepInS = timeSliderStartCenterEndTime.step * 60 * 1000;
7593
+ var prefetchStart = timeSliderStartCenterEndTime.start * 1000;
7594
+ var prefetchEnd = timeSliderStartCenterEndTime.end * 1000;
7595
+ if (isAnimating || !prefetchStart || !prefetchEnd) {
7596
7596
  return {
7597
- timespan: {
7598
- start: 0,
7599
- end: 0,
7600
- step: 0
7601
- },
7602
- isAnimating: isAnimating
7597
+ isAnimating: isAnimating,
7598
+ prefetchList: prefetchList
7603
7599
  };
7604
7600
  }
7605
7601
  var roundStart = Math.round(prefetchStart / timeSliderTimeStepInS) * timeSliderTimeStepInS;
7606
- var roundEnd = Math.round(prefetchEnd / timeSliderTimeStepInS) * timeSliderTimeStepInS;
7602
+ var roundEnd = Math.round(prefetchEnd / timeSliderTimeStepInS) * timeSliderTimeStepInS + timeSliderTimeStepInS;
7603
+ var timeSpanList = makeTimeList({
7604
+ start: roundStart,
7605
+ end: roundEnd,
7606
+ step: timeSliderTimeStepInS
7607
+ });
7607
7608
  // eslint-disable-next-line no-constant-condition
7608
7609
  return {
7609
- timespan: {
7610
- start: roundStart * 1000,
7611
- end: roundEnd * 1000,
7612
- step: timeSliderTimeStepInS * 1000
7613
- },
7614
- isAnimating: isAnimating
7610
+ isAnimating: isAnimating,
7611
+ prefetchList: timeSpanList
7615
7612
  };
7616
7613
  };
7617
7614
  var makeLayerInfoPayload = function makeLayerInfoPayload(payload, mapDimensions, mapId) {
@@ -7820,7 +7817,7 @@ var useGetOpenLayersView = function useGetOpenLayersView(mapId, store) {
7820
7817
  * @param {object} [controls.zoomControls] **optional** controls: object - toggle the map controls, zoomControls defaults to true
7821
7818
  */
7822
7819
  var OlMapViewConnect = function OlMapViewConnect(_ref) {
7823
- var _featureProperties$va;
7820
+ var _useSelector2, _featureProperties$va;
7824
7821
  var mapId = _ref.mapId,
7825
7822
  children = _ref.children,
7826
7823
  _ref$controls = _ref.controls,
@@ -7917,16 +7914,10 @@ var OlMapViewConnect = function OlMapViewConnect(_ref) {
7917
7914
  var timeSliderStartCenterEndTime = useSelector(function (store) {
7918
7915
  return mapSelectors.getMapTimeSliderStartCenterEndAndStep(store, mapId);
7919
7916
  });
7920
- var animationStartTime = useSelector(function (store) {
7921
- return mapSelectors.getAnimationStartTime(store, mapId);
7922
- });
7923
- var animationEndTime = useSelector(function (store) {
7924
- return mapSelectors.getAnimationEndTime(store, mapId);
7925
- });
7926
7917
  var isTimeScrollingEnabled = useSelector(syncGroupsSelectors.isTimeScrollingEnabled);
7927
- var isAnimating = useSelector(function (store) {
7928
- return mapSelectors.isAnimating(store, mapId);
7929
- });
7918
+ var isAnimating = (_useSelector2 = useSelector(function (store) {
7919
+ return mapSelectors.linkedMapAnimationInfo(store, mapId);
7920
+ })) == null ? void 0 : _useSelector2.isAnimating;
7930
7921
  var dispatch = useDispatch();
7931
7922
  var updateLayerInformation = React.useCallback(function (payload) {
7932
7923
  var _payload$layerDimensi, _payload$layerDimensi2;
@@ -7999,6 +7990,9 @@ var OlMapViewConnect = function OlMapViewConnect(_ref) {
7999
7990
  var isActiveWindowId = useSelector(function (store) {
8000
7991
  return uiSelectors.getIsActiveWindowId(store, mapId);
8001
7992
  });
7993
+ var animationList = useSelector(function (store) {
7994
+ return mapSelectors.getAnimationListAsEpochTimes(store, mapId);
7995
+ });
8002
7996
  React.useEffect(function () {
8003
7997
  registerMap({
8004
7998
  mapId: mapId
@@ -8085,7 +8079,7 @@ var OlMapViewConnect = function OlMapViewConnect(_ref) {
8085
8079
  }
8086
8080
  }));
8087
8081
  }, [hoverId, previousHoverId, hoverLinkedFeature, featureProperties, linkedPanelId, dispatch]);
8088
- var prefetchTimespan = makePrefetchTimeSpan(timeSliderStartCenterEndTime, animationStartTime, animationEndTime, isAnimating);
8082
+ var prefetchTimespan = makePrefetchTimeSpan(timeSliderStartCenterEndTime, isAnimating, animationList);
8089
8083
  var layerIds = mapLayerIds.join();
8090
8084
  var refetchLayers = React.useCallback(function () {
8091
8085
  mapLayerIds == null || mapLayerIds.forEach(/*#__PURE__*/function () {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opengeoweb/core",
3
- "version": "12.13.0",
3
+ "version": "13.1.0",
4
4
  "description": "GeoWeb Core library for the opengeoweb project",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
@@ -8,22 +8,22 @@
8
8
  "url": "git@gitlab.com:opengeoweb/opengeoweb.git"
9
9
  },
10
10
  "dependencies": {
11
- "@opengeoweb/shared": "12.13.0",
11
+ "@opengeoweb/shared": "13.1.0",
12
12
  "react-redux": "^9.2.0",
13
- "@opengeoweb/store": "12.13.0",
14
- "@opengeoweb/timeslider": "12.13.0",
13
+ "@opengeoweb/store": "13.1.0",
14
+ "@opengeoweb/time-slider": "13.1.0",
15
15
  "@reduxjs/toolkit": "^2.6.1",
16
- "@opengeoweb/webmap-react": "12.13.0",
17
- "@opengeoweb/webmap": "12.13.0",
18
- "@opengeoweb/theme": "12.13.0",
16
+ "@opengeoweb/webmap-react": "13.1.0",
17
+ "@opengeoweb/webmap": "13.1.0",
18
+ "@opengeoweb/theme": "13.1.0",
19
19
  "axios": "^1.7.7",
20
- "@opengeoweb/layer-select": "12.13.0",
20
+ "@opengeoweb/layer-select": "13.1.0",
21
21
  "lodash": "^4.17.21",
22
22
  "ol": "^10.4.0",
23
23
  "react-sortablejs": "^6.1.4",
24
24
  "sortablejs": "^1.15.1",
25
- "@mui/system": "^7.3.1",
26
- "@opengeoweb/snackbar": "12.13.0",
25
+ "@mui/system": "^7.3.2",
26
+ "@opengeoweb/snackbar": "13.1.0",
27
27
  "react-router-dom": "^6.21.0",
28
28
  "react-draggable": "^4.4.6",
29
29
  "i18next": "^25.0.1",
@@ -31,8 +31,8 @@
31
31
  "dompurify": "^3.0.6",
32
32
  "@mui/material": "^7.0.1",
33
33
  "@sentry/react": "^8.34.0",
34
- "@tanstack/react-query": "^5.69.2",
35
- "@opengeoweb/api": "12.13.0",
34
+ "@tanstack/react-query": "^5.85.5",
35
+ "@opengeoweb/api": "13.1.0",
36
36
  "@types/geojson": "^7946.0.14"
37
37
  },
38
38
  "peerDependencies": {
@@ -0,0 +1,15 @@
1
+ import * as React from 'react';
2
+ import { TimeAwareEDRLocationLayer } from '@opengeoweb/webmap-react';
3
+ import type { Meta } from '@storybook/react-webpack5';
4
+ declare const meta: Meta<typeof TimeAwareEDRLocationLayer>;
5
+ export default meta;
6
+ export declare const EDRLayerSymbols: {
7
+ (): React.ReactElement;
8
+ parameters: {
9
+ msw: {
10
+ handlers: {
11
+ locations: import("msw").HttpHandler[];
12
+ };
13
+ };
14
+ };
15
+ };
@@ -1,6 +1,12 @@
1
1
  import { ElementType, FC } from 'react';
2
2
  import { layerTypes, mapTypes } from '@opengeoweb/store';
3
3
  import { DimensionValueMappings } from '../../../LayerManagerUtils';
4
+ export declare enum LatestOptions {
5
+ LATEST_0 = "Latest",
6
+ LATEST_1 = "Latest -1",
7
+ LATEST_2 = "Latest -2",
8
+ LATEST_3 = "Latest -3"
9
+ }
4
10
  declare const DimensionSelectValue: FC<{
5
11
  selectedDimension?: mapTypes.Dimension;
6
12
  generatedValues: string[];
@@ -1,9 +1,11 @@
1
1
  import * as React from 'react';
2
- import { LayerProps } from '@opengeoweb/webmap';
2
+ import { EDRFeatureLayerOptions, LayerProps } from '@opengeoweb/webmap';
3
3
  export interface RenderEDRLayersProps {
4
- onChangeLayerName: (name: string) => void;
4
+ onChangeLayerOptions: (options: EDRFeatureLayerOptions) => void;
5
5
  selectedParams: string[];
6
6
  layers: LayerProps[];
7
+ layerName: string;
8
+ collectionId: string;
7
9
  isEnabled?: boolean;
8
10
  tooltipPrefix?: string;
9
11
  skipLocalStyling?: boolean;
@@ -2,7 +2,7 @@ import { TimeSliderStartCenterEndTime } from '@opengeoweb/store';
2
2
  import { Dimension } from '@opengeoweb/webmap';
3
3
  import { MapLocation, OnInitializeLayerProps, TimeContextType, UpdateLayerInfoPayload } from '@opengeoweb/webmap-react';
4
4
  import { Feature, View } from 'ol';
5
- export declare const makePrefetchTimeSpan: (timeSliderStartCenterEndTime: TimeSliderStartCenterEndTime, animationStartTime: string | undefined, animationEndTime: string | undefined, isAnimating: boolean) => TimeContextType;
5
+ export declare const makePrefetchTimeSpan: (timeSliderStartCenterEndTime: TimeSliderStartCenterEndTime, isAnimating: boolean, prefetchList: number[]) => TimeContextType;
6
6
  export declare const makeLayerInfoPayload: (payload: OnInitializeLayerProps, mapDimensions: Dimension[], mapId: string) => UpdateLayerInfoPayload;
7
7
  export declare const getCenterOfLinkedFeature: (feature: Feature | undefined, srs: string) => MapLocation | null;
8
8
  interface UseFitAndHighlightWarningFeatureOptions {
@@ -1,6 +1,6 @@
1
1
  import * as React from 'react';
2
2
  export declare const useUpdateTimestep: (mapId: string) => void;
3
- export declare const useUpdateTimeSpan: (mapId: string, myOnSetTimeSliderSpan: (newSpan: number, newCenterTime: number, newSecondsPerPx: number) => void) => void;
3
+ export declare const useUpdateTimeSpan: (mapId: string, myOnSetTimeSliderSpan: (newSpan: number, newCenterTime: number) => void) => void;
4
4
  interface TimeSliderConnectProps {
5
5
  sourceId: string;
6
6
  mapId: string;
@@ -1,7 +1,7 @@
1
1
  import * as React from 'react';
2
2
  interface TimeSliderLegendConnectProps {
3
3
  mapId: string;
4
- onSetTimeSliderSpan?: (newSpan: number, newCenterTime: number, newSecondsPerPx: number) => void;
4
+ onSetTimeSliderSpan?: (newSpan: number, newCenterTime: number) => void;
5
5
  unfilteredSelectedTime: number;
6
6
  setUnfilteredSelectedTime: (unfilteredSelectedTime: number) => void;
7
7
  mapWindowRef?: React.MutableRefObject<HTMLElement | null>;
@@ -1,5 +1,5 @@
1
1
  import { mapTypes } from '@opengeoweb/store';
2
- import { TimeBounds } from '@opengeoweb/timeslider';
2
+ import { TimeBounds } from '@opengeoweb/time-slider';
3
3
  /**
4
4
  * Returns time bounds from the given dimension. If no time dimension given, current time is returned as default
5
5
  */