@opengeoweb/store 15.2.0 → 16.0.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/index.esm.js CHANGED
@@ -1,14 +1,14 @@
1
1
  import { createSlice, createSelector, createAction, createListenerMiddleware, isAnyOf, createEntityAdapter, combineReducers, configureStore } from '@reduxjs/toolkit';
2
- import { isEqual, merge, isEmpty, compact } from 'lodash';
2
+ import { isEqual, mergeWith, merge, isEmpty, compact } from 'lodash';
3
3
  import { webmapUtils, parseISO8601IntervalToDateInterval, LayerType, handleDateUtilsISOString, webmapTestSettings, WMLayer, getWMLayerById, WMInvalidDateValues, isProjectionSupported, queryWMSLayers } from '@opengeoweb/webmap';
4
- import { dateUtils, PROJECTION, defaultDelay } from '@opengeoweb/shared';
4
+ import { dateUtils, PROJECTION, defaultDelay, useDebounce } from '@opengeoweb/shared';
5
5
  import { secondsPerPxFromCanvasWidth, defaultTimeSpan, defaultSecondsPerPx, defaultAnimationDelayAtStart, defaultTimeStep, roundWithTimeStep, getSpeedDelay } from '@opengeoweb/time-slider';
6
6
  import { produce } from 'immer';
7
7
  import { getLastEmptyFeatureIndex, getGeoJson, moveFeature, createInterSections, defaultLayers, emptyGeoJSON, defaultIntersectionStyleProperties, addSelectionTypeToGeoJSON, getFeatureCollection } from '@opengeoweb/webmap-react';
8
8
  export { defaultLayers } from '@opengeoweb/webmap-react';
9
+ import React, { useEffect, useCallback } from 'react';
10
+ import { useDispatch, useSelector } from 'react-redux';
9
11
  import { center } from '@turf/turf';
10
- import { useEffect, useCallback } from 'react';
11
- import { useSelector, useDispatch } from 'react-redux';
12
12
  import { metronome } from '@opengeoweb/metronome';
13
13
  import { View, Observable } from 'ol';
14
14
  import { boundingExtent, getCenter } from 'ol/extent';
@@ -2301,13 +2301,26 @@ var slice$6 = createSlice({
2301
2301
  },
2302
2302
  hideLayerInfo: function hideLayerInfo(draft) {
2303
2303
  delete draft.activeLayerInfo;
2304
+ },
2305
+ SetLayerLegendVisibilityPayload: function SetLayerLegendVisibilityPayload(draft, action) {
2306
+ var _action$payload22 = action.payload,
2307
+ layerId = _action$payload22.layerId,
2308
+ showLayerLegend = _action$payload22.showLayerLegend;
2309
+ var layer = draft.byId[layerId];
2310
+ if (!layer) {
2311
+ return;
2312
+ }
2313
+ if (!layer.showLayerLegend) {
2314
+ layer.showLayerLegend = true;
2315
+ }
2316
+ draft.byId[layerId].showLayerLegend = showLayerLegend;
2304
2317
  }
2305
2318
  },
2306
2319
  extraReducers: function extraReducers(builder) {
2307
2320
  builder.addCase(setTimeSync, function (draft, action) {
2308
- var _action$payload22 = action.payload,
2309
- targetsFromAction = _action$payload22.targets,
2310
- source = _action$payload22.source;
2321
+ var _action$payload23 = action.payload,
2322
+ targetsFromAction = _action$payload23.targets,
2323
+ source = _action$payload23.source;
2311
2324
  /* Because we want backwards compatibility with the previous code, we also need to listen to the original source action */
2312
2325
  var targets = [];
2313
2326
  if (source) {
@@ -2337,9 +2350,9 @@ var slice$6 = createSlice({
2337
2350
  * These targets can be used as payloads in new Layer actions.
2338
2351
  * These actions are here handled via the layer reducer, as it is the same logic
2339
2352
  */
2340
- var _action$payload23 = action.payload,
2341
- targets = _action$payload23.targets,
2342
- source = _action$payload23.source;
2353
+ var _action$payload24 = action.payload,
2354
+ targets = _action$payload24.targets,
2355
+ source = _action$payload24.source;
2343
2356
  return targets.reduce(function (prevState, target) {
2344
2357
  var actionType = (source === null || source === void 0 ? void 0 : source.type) || 'GENERIC_SYNC_SETLAYERACTIONS';
2345
2358
  var action = {
@@ -2412,6 +2425,12 @@ var createLayersWithIds = function createLayersWithIds(state, layers) {
2412
2425
  }
2413
2426
  });
2414
2427
  };
2428
+ var layerHasTimeDimension = function layerHasTimeDimension(layer) {
2429
+ var _layer$dimensions;
2430
+ return !!((_layer$dimensions = layer.dimensions) !== null && _layer$dimensions !== void 0 && _layer$dimensions.some(function (dimension) {
2431
+ return dimension.name === 'time';
2432
+ }));
2433
+ };
2415
2434
  var initialState$4 = {
2416
2435
  byId: {},
2417
2436
  allIds: []
@@ -2724,33 +2743,64 @@ var slice$5 = createSlice({
2724
2743
  }
2725
2744
  draft.byId[mapId].dockedLayerManagerSize = dockedLayerManagerSize;
2726
2745
  },
2746
+ setDockedLayerManagerPosition: function setDockedLayerManagerPosition(draft, action) {
2747
+ var _action$payload25 = action.payload,
2748
+ mapId = _action$payload25.mapId,
2749
+ dockedLayerManagerPosition = _action$payload25.dockedLayerManagerPosition;
2750
+ if (!draft.byId[mapId]) {
2751
+ return;
2752
+ }
2753
+ draft.byId[mapId].dockedLayerManagerPosition = dockedLayerManagerPosition;
2754
+ },
2755
+ setDockedLayerManagerDimensions: function setDockedLayerManagerDimensions(draft, action) {
2756
+ var _action$payload26 = action.payload,
2757
+ mapId = _action$payload26.mapId,
2758
+ dockedLayerManagerDimensions = _action$payload26.dockedLayerManagerDimensions;
2759
+ if (!draft.byId[mapId]) {
2760
+ return;
2761
+ }
2762
+ draft.byId[mapId].dockedLayerManagerDimensions = dockedLayerManagerDimensions;
2763
+ },
2727
2764
  setMapPresetError: function setMapPresetError(_draft, _action) {},
2728
2765
  setDefaultMapSettings: function setDefaultMapSettings(draft, action) {
2729
2766
  draft.defaultMapSettings = action.payload.preset;
2730
2767
  },
2731
2768
  changeOverlayer: function changeOverlayer(draft, action) {
2732
- var _action$payload25 = action.payload,
2733
- mapId = _action$payload25.mapId,
2734
- selectedOverlayer = _action$payload25.selectedOverlayer;
2769
+ var _action$payload27 = action.payload,
2770
+ mapId = _action$payload27.mapId,
2771
+ selectedOverlayer = _action$payload27.selectedOverlayer;
2735
2772
  if (!draft.byId[mapId]) {
2736
2773
  return;
2737
2774
  }
2738
2775
  draft.byId[mapId].overLayers = [selectedOverlayer];
2739
2776
  },
2740
2777
  toggleClock: function toggleClock(draft, action) {
2741
- var _action$payload26 = action.payload,
2742
- mapId = _action$payload26.mapId,
2743
- isClockVisible = _action$payload26.isClockVisible;
2778
+ var _action$payload28 = action.payload,
2779
+ mapId = _action$payload28.mapId,
2780
+ isClockVisible = _action$payload28.isClockVisible;
2744
2781
  if (!draft.byId[mapId]) {
2745
2782
  return;
2746
2783
  }
2747
2784
  draft.byId[mapId].isClockVisible = isClockVisible;
2785
+ if (!isClockVisible) {
2786
+ // close options menu when clock is closed
2787
+ draft.byId[mapId].isClockOptionsMenuVisible = false;
2788
+ }
2789
+ },
2790
+ toggleClockOptions: function toggleClockOptions(draft, action) {
2791
+ var _action$payload29 = action.payload,
2792
+ mapId = _action$payload29.mapId,
2793
+ isClockOptionsMenuVisible = _action$payload29.isClockOptionsMenuVisible;
2794
+ if (!draft.byId[mapId]) {
2795
+ return;
2796
+ }
2797
+ draft.byId[mapId].isClockOptionsMenuVisible = isClockOptionsMenuVisible;
2748
2798
  },
2749
2799
  setClockPositionSize: function setClockPositionSize(draft, action) {
2750
- var _action$payload27 = action.payload,
2751
- mapId = _action$payload27.mapId,
2752
- position = _action$payload27.position,
2753
- size = _action$payload27.size;
2800
+ var _action$payload30 = action.payload,
2801
+ mapId = _action$payload30.mapId,
2802
+ position = _action$payload30.position,
2803
+ size = _action$payload30.size;
2754
2804
  if (!draft.byId[mapId]) {
2755
2805
  return;
2756
2806
  }
@@ -2764,10 +2814,10 @@ var slice$5 = createSlice({
2764
2814
  },
2765
2815
  extraReducers: function extraReducers(builder) {
2766
2816
  builder.addCase(layerActions.addLayer, function (draft, action) {
2767
- var _action$payload28 = action.payload,
2768
- layerId = _action$payload28.layerId,
2769
- mapId = _action$payload28.mapId,
2770
- layer = _action$payload28.layer;
2817
+ var _action$payload31 = action.payload,
2818
+ layerId = _action$payload31.layerId,
2819
+ mapId = _action$payload31.mapId,
2820
+ layer = _action$payload31.layer;
2771
2821
  if (!draft.byId[mapId]) {
2772
2822
  return;
2773
2823
  }
@@ -2775,21 +2825,21 @@ var slice$5 = createSlice({
2775
2825
  console.warn("Warning: Layer id ".concat(layerId, " was already taken"));
2776
2826
  return;
2777
2827
  }
2778
- if (!draft.byId[mapId].mapLayers.length) {
2828
+ var isFeatureLayer = (layer === null || layer === void 0 ? void 0 : layer.layerType) === LayerType.featureLayer;
2829
+ if (!isFeatureLayer && !draft.byId[mapId].autoUpdateLayerId && !draft.byId[mapId].autoTimeStepLayerId && layerHasTimeDimension(layer)) {
2779
2830
  draft.byId[mapId].autoUpdateLayerId = layerId;
2780
2831
  draft.byId[mapId].autoTimeStepLayerId = layerId;
2781
2832
  }
2782
- var isFeatureLayer = (layer === null || layer === void 0 ? void 0 : layer.layerType) === LayerType.featureLayer;
2783
2833
  if (isFeatureLayer) {
2784
2834
  draft.byId[mapId].featureLayers.unshift(layerId);
2785
2835
  } else {
2786
2836
  draft.byId[mapId].mapLayers.unshift(layerId);
2787
2837
  }
2788
2838
  }).addCase(layerActions.duplicateMapLayer, function (draft, action) {
2789
- var _action$payload29 = action.payload,
2790
- newLayerId = _action$payload29.newLayerId,
2791
- oldLayerId = _action$payload29.oldLayerId,
2792
- mapId = _action$payload29.mapId;
2839
+ var _action$payload32 = action.payload,
2840
+ newLayerId = _action$payload32.newLayerId,
2841
+ oldLayerId = _action$payload32.oldLayerId,
2842
+ mapId = _action$payload32.mapId;
2793
2843
  if (!draft.byId[mapId]) {
2794
2844
  return;
2795
2845
  }
@@ -2806,10 +2856,10 @@ var slice$5 = createSlice({
2806
2856
  draft.byId[mapId].featureLayers.unshift(newLayerId);
2807
2857
  }
2808
2858
  }).addCase(layerActions.addBaseLayer, function (draft, action) {
2809
- var _action$payload30 = action.payload,
2810
- layer = _action$payload30.layer,
2811
- layerId = _action$payload30.layerId,
2812
- mapId = _action$payload30.mapId;
2859
+ var _action$payload33 = action.payload,
2860
+ layer = _action$payload33.layer,
2861
+ layerId = _action$payload33.layerId,
2862
+ mapId = _action$payload33.mapId;
2813
2863
  if (!draft.byId[mapId]) {
2814
2864
  return;
2815
2865
  }
@@ -2825,23 +2875,23 @@ var slice$5 = createSlice({
2825
2875
  draft.byId[mapId].overLayers.unshift(layerId);
2826
2876
  }
2827
2877
  }).addCase(layerActions.setLayers, function (draft, action) {
2878
+ var _layersWithIds$find;
2828
2879
  var mapId = action.payload.mapId;
2829
2880
  var layersWithIds = createLayersWithIds(draft, action.payload.layers);
2830
2881
  var layerIds = layersWithIds.map(function (_ref) {
2831
2882
  var id = _ref.id;
2832
2883
  return id;
2833
2884
  });
2834
- var _layerIds = _slicedToArray(layerIds, 1),
2835
- activeLayerId = _layerIds[0];
2885
+ var activeLayerId = (_layersWithIds$find = layersWithIds.find(layerHasTimeDimension)) === null || _layersWithIds$find === void 0 ? void 0 : _layersWithIds$find.id;
2836
2886
  if (draft.byId[mapId]) {
2837
2887
  draft.byId[mapId].mapLayers = layerIds;
2838
2888
  draft.byId[mapId].autoUpdateLayerId = activeLayerId;
2839
2889
  draft.byId[mapId].autoTimeStepLayerId = activeLayerId;
2840
2890
  }
2841
2891
  }).addCase(layerActions.setBaseLayers, function (draft, action) {
2842
- var _action$payload31 = action.payload,
2843
- layers = _action$payload31.layers,
2844
- mapId = _action$payload31.mapId;
2892
+ var _action$payload34 = action.payload,
2893
+ layers = _action$payload34.layers,
2894
+ mapId = _action$payload34.mapId;
2845
2895
  // Split into base and overlayers
2846
2896
  var baseLayers = [];
2847
2897
  var overLayers = [];
@@ -2871,9 +2921,9 @@ var slice$5 = createSlice({
2871
2921
  }
2872
2922
  }
2873
2923
  }).addCase(layerActions.layerDelete, function (draft, action) {
2874
- var _action$payload32 = action.payload,
2875
- mapId = _action$payload32.mapId,
2876
- layerId = _action$payload32.layerId;
2924
+ var _action$payload35 = action.payload,
2925
+ mapId = _action$payload35.mapId,
2926
+ layerId = _action$payload35.layerId;
2877
2927
  var map = draft.byId[mapId];
2878
2928
  if (!map) {
2879
2929
  return;
@@ -2899,9 +2949,9 @@ var slice$5 = createSlice({
2899
2949
  return id !== layerId;
2900
2950
  });
2901
2951
  }).addCase(layerActions.baseLayerDelete, function (draft, action) {
2902
- var _action$payload33 = action.payload,
2903
- mapId = _action$payload33.mapId,
2904
- layerId = _action$payload33.layerId;
2952
+ var _action$payload36 = action.payload,
2953
+ mapId = _action$payload36.mapId,
2954
+ layerId = _action$payload36.layerId;
2905
2955
  if (!draft.byId[mapId]) {
2906
2956
  return;
2907
2957
  }
@@ -2912,14 +2962,14 @@ var slice$5 = createSlice({
2912
2962
  return id !== layerId;
2913
2963
  });
2914
2964
  }).addCase(layerActions.layerChangeDimension, function (draft, action) {
2915
- var _action$payload34 = action.payload,
2916
- layerId = _action$payload34.layerId,
2917
- dimension = _action$payload34.dimension;
2965
+ var _action$payload37 = action.payload,
2966
+ layerId = _action$payload37.layerId,
2967
+ dimension = _action$payload37.dimension;
2918
2968
  produceDraftStateSetMapDimensionFromLayerChangeDimension(draft, layerId, dimension);
2919
2969
  }).addCase(setTimeSync, function (draft, action) {
2920
- var _action$payload35 = action.payload,
2921
- targetsFromAction = _action$payload35.targets,
2922
- source = _action$payload35.source;
2970
+ var _action$payload38 = action.payload,
2971
+ targetsFromAction = _action$payload38.targets,
2972
+ source = _action$payload38.source;
2923
2973
  /* Because we want backwards compatibility with the previous code, we also need to listen to the original source action */
2924
2974
  var targets = [];
2925
2975
  if (source) {
@@ -2972,9 +3022,9 @@ var slice$5 = createSlice({
2972
3022
  }
2973
3023
  });
2974
3024
  }).addCase(setBboxSync, function (draft, action) {
2975
- var _action$payload36 = action.payload,
2976
- targetsFromAction = _action$payload36.targets,
2977
- source = _action$payload36.source;
3025
+ var _action$payload39 = action.payload,
3026
+ targetsFromAction = _action$payload39.targets,
3027
+ source = _action$payload39.source;
2978
3028
  /* Because we want backwards compatibility with the previous code, we also need to listen to the original source action */
2979
3029
  var targets = [];
2980
3030
  if (source) {
@@ -3006,9 +3056,9 @@ var slice$5 = createSlice({
3006
3056
  * These targets can be used as payloads in new Layer actions.
3007
3057
  * These actions are here handled via the layer reducer, as it is the same logic
3008
3058
  */
3009
- var _action$payload37 = action.payload,
3010
- targets = _action$payload37.targets,
3011
- source = _action$payload37.source;
3059
+ var _action$payload40 = action.payload,
3060
+ targets = _action$payload40.targets,
3061
+ source = _action$payload40.source;
3012
3062
  return targets.reduce(function (prevState, target) {
3013
3063
  var actionType = (source === null || source === void 0 ? void 0 : source.type) || 'GENERIC_SYNC_SETLAYERACTIONS';
3014
3064
  var action = {
@@ -3030,9 +3080,9 @@ var slice$5 = createSlice({
3030
3080
  });
3031
3081
  return draft;
3032
3082
  }).addCase(mapChangeDimension, function (draft, action) {
3033
- var _action$payload38 = action.payload,
3034
- mapId = _action$payload38.mapId,
3035
- dimensionFromAction = _action$payload38.dimension;
3083
+ var _action$payload41 = action.payload,
3084
+ mapId = _action$payload41.mapId,
3085
+ dimensionFromAction = _action$payload41.dimension;
3036
3086
  produceDraftStateSetWebMapDimension(draft, mapId, dimensionFromAction, true);
3037
3087
  }).addCase(setMapPreset, function (draft, action) {
3038
3088
  var mapId = action.payload.mapId;
@@ -3052,9 +3102,9 @@ var slice$5 = createSlice({
3052
3102
  draft.byId[mapId].animationDelay = defaultAnimationDelayAtStart;
3053
3103
  draft.byId[mapId].dockedLayerManagerSize = '';
3054
3104
  }).addCase(uiActions.registerDialog, function (draft, action) {
3055
- var _action$payload39 = action.payload,
3056
- mapId = _action$payload39.mapId,
3057
- type = _action$payload39.type;
3105
+ var _action$payload42 = action.payload,
3106
+ mapId = _action$payload42.mapId,
3107
+ type = _action$payload42.type;
3058
3108
  if (!draft.byId[mapId]) {
3059
3109
  return;
3060
3110
  }
@@ -3305,14 +3355,31 @@ var slice$4 = createSlice({
3305
3355
  if (synchronizationGroup.targets.allIds.includes(targetId)) {
3306
3356
  return;
3307
3357
  }
3308
- var isSourceLinked = (_synchronizationGroup = synchronizationGroup.targets.byId[targetId]) === null || _synchronizationGroup === void 0 ? void 0 : _synchronizationGroup.linked;
3309
3358
  synchronizationGroup.targets.allIds.push(targetId);
3310
3359
  synchronizationGroup.targets.byId[targetId] = {
3311
3360
  linked: linked !== false
3312
3361
  };
3362
+ var isSourceLinked = (_synchronizationGroup = synchronizationGroup.targets.byId[targetId]) === null || _synchronizationGroup === void 0 ? void 0 : _synchronizationGroup.linked;
3313
3363
  if (isSourceLinked) {
3314
- var type = synchronizationGroup.type;
3315
- draft.sources.byId[targetId].payloadByType[type] = synchronizationGroup.payloadByType[type];
3364
+ // In order to make syncgroup work correctly we need to have defaults
3365
+ var defaultS = {
3366
+ payloadByType: {
3367
+ SYNCGROUPS_TYPE_SETTIME: {
3368
+ value: {
3369
+ timeSliderSpan: defaultTimeSpan,
3370
+ timeSliderStep: defaultTimeStep
3371
+ }
3372
+ }
3373
+ }
3374
+ };
3375
+ if (draft.sources.byId[targetId]) {
3376
+ // Assign object based on 1: defaults, 2: The values in the group, 3: the values of the source.
3377
+ mergeWith(draft.sources.byId[targetId], defaultS, synchronizationGroup, draft.sources.byId[targetId],
3378
+ // eslint-disable-next-line id-length, @typescript-eslint/no-unsafe-return
3379
+ function (a, b) {
3380
+ return b === null ? a : undefined;
3381
+ });
3382
+ }
3316
3383
  }
3317
3384
  },
3318
3385
  syncGroupRemoveTarget: function syncGroupRemoveTarget(draft, action) {
@@ -3437,13 +3504,13 @@ var setBboxOrTimeSync = function setBboxOrTimeSync(draft, action) {
3437
3504
  }
3438
3505
  };
3439
3506
  var _slice$actions = slice$4.actions,
3440
- syncGroupAddGroup = _slice$actions.syncGroupAddGroup;
3441
- _slice$actions.syncGroupAddSource;
3442
- var syncGroupAddTarget = _slice$actions.syncGroupAddTarget;
3507
+ syncGroupAddGroup = _slice$actions.syncGroupAddGroup,
3508
+ syncGroupAddSource = _slice$actions.syncGroupAddSource,
3509
+ syncGroupAddTarget = _slice$actions.syncGroupAddTarget;
3443
3510
  _slice$actions.syncGroupClear;
3444
3511
  _slice$actions.syncGroupLinkTarget;
3445
3512
  _slice$actions.syncGroupRemoveGroup;
3446
- _slice$actions.syncGroupRemoveSource;
3513
+ var syncGroupRemoveSource = _slice$actions.syncGroupRemoveSource;
3447
3514
  _slice$actions.syncGroupRemoveTarget;
3448
3515
  _slice$actions.syncGroupSetViewState;
3449
3516
  var syncGroupsReducer = slice$4.reducer,
@@ -3503,9 +3570,16 @@ var getTargets = createSelector([syncGroupStore, function (syncGroupStore, paylo
3503
3570
  var source = syncronizationGroup.targets.byId[payload.sourceId];
3504
3571
  /* If the source is part of the target list, and is linked, continue syncing the other targets */
3505
3572
  if (source !== null && source !== void 0 && source.linked) {
3573
+ var hasLinkedPeer = syncronizationGroup.targets.allIds.some(function (targetId) {
3574
+ var _syncronizationGroup$;
3575
+ return targetId !== payload.sourceId && ((_syncronizationGroup$ = syncronizationGroup.targets.byId[targetId]) === null || _syncronizationGroup$ === void 0 ? void 0 : _syncronizationGroup$.linked);
3576
+ });
3577
+ if (!hasLinkedPeer) {
3578
+ return;
3579
+ }
3506
3580
  syncronizationGroup.targets.allIds.forEach(function (targetId) {
3507
3581
  var target = syncronizationGroup.targets.byId[targetId];
3508
- if (target.linked && !targetsInActionPayload[targetId]) {
3582
+ if (targetId !== payload.sourceId && target.linked && !targetsInActionPayload[targetId]) {
3509
3583
  /* Remember that we have already added this target in the action payloads, prevents adding it twice */
3510
3584
  targetsInActionPayload[targetId] = true;
3511
3585
  /* Compose the payload */
@@ -3602,6 +3676,44 @@ var selectors$6 = /*#__PURE__*/Object.freeze({
3602
3676
  syncGroupStore: syncGroupStore
3603
3677
  });
3604
3678
 
3679
+ /* *
3680
+ * Licensed under the Apache License, Version 2.0 (the "License");
3681
+ * you may not use this file except in compliance with the License.
3682
+ * You may obtain a copy of the License at
3683
+ *
3684
+ * http://www.apache.org/licenses/LICENSE-2.0
3685
+ *
3686
+ * Unless required by applicable law or agreed to in writing, software
3687
+ * distributed under the License is distributed on an "AS IS" BASIS,
3688
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
3689
+ * See the License for the specific language governing permissions and
3690
+ * limitations under the License.
3691
+ *
3692
+ * Copyright 2026 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
3693
+ * Copyright 2026 - Finnish Meteorological Institute (FMI)
3694
+ * Copyright 2026 - The Norwegian Meteorological Institute (MET Norway)
3695
+ * */
3696
+ var constructSyncSourceDisplayName = function constructSyncSourceDisplayName(sourceId, viewMeta, fallbackName) {
3697
+ var _viewMeta$title;
3698
+ var rawTitle = viewMeta === null || viewMeta === void 0 || (_viewMeta$title = viewMeta.title) === null || _viewMeta$title === void 0 ? void 0 : _viewMeta$title.trim();
3699
+ if (rawTitle === sourceId) {
3700
+ return sourceId;
3701
+ }
3702
+ var title = rawTitle && rawTitle !== sourceId ? rawTitle : undefined;
3703
+ if (!title) {
3704
+ return fallbackName;
3705
+ }
3706
+ var isSavedView = !!(viewMeta !== null && viewMeta !== void 0 && viewMeta.id) && viewMeta.id !== sourceId;
3707
+ if (isSavedView) {
3708
+ return title;
3709
+ }
3710
+ var isDefaultUnsavedTitle = /^New .+ preset$/i.test(title);
3711
+ if (isDefaultUnsavedTitle) {
3712
+ return title.includes(sourceId) ? title : "".concat(title, " (").concat(sourceId, ")");
3713
+ }
3714
+ return title;
3715
+ };
3716
+
3605
3717
  /* *
3606
3718
  * Licensed under the Apache License, Version 2.0 (the "License");
3607
3719
  * you may not use this file except in compliance with the License.
@@ -3647,7 +3759,7 @@ var groupTypes = [{
3647
3759
  - Runs Each time viewState is created:
3648
3760
  - Fill arrays inside initialState with objects containing new values from Redux
3649
3761
  */
3650
- var createSyncGroupViewState = function createSyncGroupViewState(groups, sources) {
3762
+ var createSyncGroupViewState = function createSyncGroupViewState(groups, sources, viewsById) {
3651
3763
  var initialState = produce(emptyState, function (draft) {
3652
3764
  /*
3653
3765
  _____ 1. Fill groups _____
@@ -3678,7 +3790,7 @@ var createSyncGroupViewState = function createSyncGroupViewState(groups, sources
3678
3790
  if (sources.byId[id].types.includes(syncType)) {
3679
3791
  draft[groupType].sourcesById.push({
3680
3792
  id: id,
3681
- name: id
3793
+ name: constructSyncSourceDisplayName(id, viewsById === null || viewsById === void 0 ? void 0 : viewsById[id], id)
3682
3794
  });
3683
3795
  }
3684
3796
  });
@@ -3692,7 +3804,12 @@ var groups = function groups(store) {
3692
3804
  var sources = function sources(store) {
3693
3805
  return store.syncGroups.sources;
3694
3806
  };
3695
- var createSyncGroupViewStateSelector = createSelector(groups, sources, createSyncGroupViewState);
3807
+ var workspaceViewsById = function workspaceViewsById(store) {
3808
+ var _storeWithWorkspace$w;
3809
+ var storeWithWorkspace = store;
3810
+ return (_storeWithWorkspace$w = storeWithWorkspace.workspace) === null || _storeWithWorkspace$w === void 0 || (_storeWithWorkspace$w = _storeWithWorkspace$w.views) === null || _storeWithWorkspace$w === void 0 ? void 0 : _storeWithWorkspace$w.byId;
3811
+ };
3812
+ var createSyncGroupViewStateSelector = createSelector(groups, sources, workspaceViewsById, createSyncGroupViewState);
3696
3813
 
3697
3814
  var selector = /*#__PURE__*/Object.freeze({
3698
3815
  __proto__: null,
@@ -3706,49 +3823,64 @@ syncGroupsListener.startListening({
3706
3823
  matcher: isAnyOf(syncGroupsActions.syncGroupAddTarget, syncGroupsActions.syncGroupLinkTarget),
3707
3824
  effect: function () {
3708
3825
  var _effect = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee(_ref, listenerApi) {
3709
- var payload, groupId, linked, targetToUpdate, group;
3826
+ var payload, type, groupId, linked, targetToUpdate, group;
3710
3827
  return _regeneratorRuntime().wrap(function _callee$(_context) {
3711
3828
  while (1) switch (_context.prev = _context.next) {
3712
3829
  case 0:
3713
- payload = _ref.payload;
3830
+ payload = _ref.payload, type = _ref.type;
3714
3831
  listenerApi.cancelActiveListeners();
3715
3832
  groupId = payload.groupId, linked = payload.linked, targetToUpdate = payload.targetId;
3716
3833
  group = getSynchronizationGroup(listenerApi.getState(), groupId);
3717
3834
  if (!(!linked && group)) {
3718
- _context.next = 17;
3835
+ _context.next = 21;
3719
3836
  break;
3720
3837
  }
3721
3838
  _context.t0 = group.type;
3722
- _context.next = _context.t0 === SYNCGROUPS_TYPE_SETTIME ? 8 : _context.t0 === SYNCGROUPS_TYPE_SETBBOX ? 12 : 16;
3839
+ _context.next = _context.t0 === SYNCGROUPS_TYPE_SETTIME ? 8 : _context.t0 === SYNCGROUPS_TYPE_SETBBOX ? 16 : 20;
3723
3840
  break;
3724
3841
  case 8:
3725
- if (group.payloadByType[SYNCGROUPS_TYPE_SETTIME]) {
3842
+ if (!(type === syncGroupsActions.syncGroupLinkTarget.type)) {
3726
3843
  _context.next = 10;
3727
3844
  break;
3728
3845
  }
3729
- return _context.abrupt("return");
3846
+ return _context.abrupt("break", 21);
3730
3847
  case 10:
3848
+ if (group.targets.allIds.some(function (targetId) {
3849
+ var _group$targets$byId$t;
3850
+ return targetId !== targetToUpdate && ((_group$targets$byId$t = group.targets.byId[targetId]) === null || _group$targets$byId$t === void 0 ? void 0 : _group$targets$byId$t.linked);
3851
+ })) {
3852
+ _context.next = 12;
3853
+ break;
3854
+ }
3855
+ return _context.abrupt("break", 21);
3856
+ case 12:
3857
+ if (group.payloadByType[SYNCGROUPS_TYPE_SETTIME]) {
3858
+ _context.next = 14;
3859
+ break;
3860
+ }
3861
+ return _context.abrupt("return");
3862
+ case 14:
3731
3863
  listenerApi.dispatch(setTimeSync(group.payloadByType[SYNCGROUPS_TYPE_SETTIME], [{
3732
3864
  targetId: targetToUpdate,
3733
3865
  value: group.payloadByType[SYNCGROUPS_TYPE_SETTIME].value
3734
3866
  }], [groupId]));
3735
- return _context.abrupt("break", 17);
3736
- case 12:
3867
+ return _context.abrupt("break", 21);
3868
+ case 16:
3737
3869
  if (group.payloadByType[SYNCGROUPS_TYPE_SETBBOX]) {
3738
- _context.next = 14;
3870
+ _context.next = 18;
3739
3871
  break;
3740
3872
  }
3741
3873
  return _context.abrupt("return");
3742
- case 14:
3874
+ case 18:
3743
3875
  listenerApi.dispatch(setBboxSync(group.payloadByType[SYNCGROUPS_TYPE_SETBBOX], [{
3744
3876
  targetId: targetToUpdate,
3745
3877
  bbox: group.payloadByType[SYNCGROUPS_TYPE_SETBBOX].bbox,
3746
3878
  srs: group.payloadByType[SYNCGROUPS_TYPE_SETBBOX].srs
3747
3879
  }], [groupId]));
3748
- return _context.abrupt("break", 17);
3749
- case 16:
3750
- return _context.abrupt("break", 17);
3751
- case 17:
3880
+ return _context.abrupt("break", 21);
3881
+ case 20:
3882
+ return _context.abrupt("break", 21);
3883
+ case 21:
3752
3884
  case "end":
3753
3885
  return _context.stop();
3754
3886
  }
@@ -3990,12 +4122,26 @@ var getSelectedFeatureAsGeoJSON = createSelector([function (state, mapId) {
3990
4122
  });
3991
4123
  return selectedFeature;
3992
4124
  });
4125
+ var getSyncedStartCenterEndStepCurrentTime = createSelector(function (coreAppStore, sourceId) {
4126
+ return getTime(getSynchronizationGroupStore(coreAppStore), sourceId);
4127
+ }, function (store) {
4128
+ if (!(store !== null && store !== void 0 && store.timeSliderCenterTime) || !(store !== null && store !== void 0 && store.timeSliderSpan)) {
4129
+ return undefined;
4130
+ }
4131
+ return {
4132
+ start: Math.round(store.timeSliderCenterTime - store.timeSliderSpan / 2),
4133
+ end: Math.round(store.timeSliderCenterTime + store.timeSliderSpan / 2),
4134
+ step: (store === null || store === void 0 ? void 0 : store.timeSliderStep) || 60,
4135
+ current: dateUtils.unixFromISOString(store === null || store === void 0 ? void 0 : store.currentTime)
4136
+ };
4137
+ }, selectorMemoizationOptions);
3993
4138
 
3994
4139
  var selectors$5 = /*#__PURE__*/Object.freeze({
3995
4140
  __proto__: null,
3996
4141
  getLinkedMaps: getLinkedMaps,
3997
4142
  getSelectedFeature: getSelectedFeature,
3998
4143
  getSelectedFeatureAsGeoJSON: getSelectedFeatureAsGeoJSON,
4144
+ getSyncedStartCenterEndStepCurrentTime: getSyncedStartCenterEndStepCurrentTime,
3999
4145
  getSynchronizationGroupStore: getSynchronizationGroupStore,
4000
4146
  getTime: getTime,
4001
4147
  selectLinkedFeatures: selectLinkedFeatures,
@@ -4005,6 +4151,136 @@ var selectors$5 = /*#__PURE__*/Object.freeze({
4005
4151
  selectSharedData: selectSharedData
4006
4152
  });
4007
4153
 
4154
+ /**
4155
+ * This registers a new syncgroup source for given panelId. The source is not synced to any group by default.
4156
+ * When the user links the source with a group, this hook returns an object with the timeslider state (start, end, step and current time) for the panel (if effectively linked).
4157
+ *
4158
+ * How it works:
4159
+ * - Registers/unregisters the source on mount/unmount.
4160
+ * - Returns `{ start, end, step, current }` when linked.
4161
+ * - Uses linked map selected time as `current` when available.
4162
+ * - Falls back to sync source "now" timestamp when
4163
+ * synced state is not initialized yet.
4164
+ *
4165
+ * @param panelId panelId to register as sync source
4166
+ * @returns timeslider state
4167
+ */
4168
+ var useSyncgroupTimeState = function useSyncgroupTimeState(panelId) {
4169
+ var _ref;
4170
+ var debounceMs = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 100;
4171
+ var dispatch = useDispatch();
4172
+ var defaultNowTime = React.useRef(Math.round(Date.now() / 1000));
4173
+ var syncGroupsAddSourceCallBack = React.useCallback(function (payload) {
4174
+ dispatch(syncGroupAddSource(payload));
4175
+ }, [dispatch]);
4176
+ var syncGroupRemoveSourceCallback = React.useCallback(function (payload) {
4177
+ dispatch(syncGroupRemoveSource(payload));
4178
+ }, [dispatch]);
4179
+ // Register
4180
+ useEffect(function () {
4181
+ syncGroupsAddSourceCallBack({
4182
+ id: panelId,
4183
+ type: [SYNCGROUPS_TYPE_SETTIME]
4184
+ });
4185
+ return function () {
4186
+ syncGroupRemoveSourceCallback({
4187
+ id: panelId
4188
+ });
4189
+ };
4190
+ }, [panelId, syncGroupsAddSourceCallBack, syncGroupRemoveSourceCallback]);
4191
+ var syncGroupTimeSliderCenterStartEndStep = useSelector(function (store) {
4192
+ return getSyncedStartCenterEndStepCurrentTime(store, panelId);
4193
+ });
4194
+ var syncSourceTime = useSelector(function (store) {
4195
+ return getTime(getSynchronizationGroupStore(store), panelId);
4196
+ });
4197
+ var syncTargets = useSelector(function (store) {
4198
+ return getAllTargetGroupsForSource(store, panelId);
4199
+ });
4200
+ var isSyncgroupLinked = useSelector(function (store) {
4201
+ return syncTargets.some(function (groupId) {
4202
+ var group = getSynchronizationGroup(store, groupId);
4203
+ if ((group === null || group === void 0 ? void 0 : group.type) !== SYNCGROUPS_TYPE_SETTIME) {
4204
+ return false;
4205
+ }
4206
+ return group.targets.allIds.some(function (targetId) {
4207
+ var _group$targets$byId$t;
4208
+ return targetId !== panelId && ((_group$targets$byId$t = group.targets.byId[targetId]) === null || _group$targets$byId$t === void 0 ? void 0 : _group$targets$byId$t.linked);
4209
+ });
4210
+ });
4211
+ });
4212
+ var linkedMapIdsInTimeGroup = useSelector(function (store) {
4213
+ var _iterator = _createForOfIteratorHelper(syncTargets),
4214
+ _step;
4215
+ try {
4216
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
4217
+ var groupId = _step.value;
4218
+ var group = getSynchronizationGroup(store, groupId);
4219
+ if ((group === null || group === void 0 ? void 0 : group.type) === SYNCGROUPS_TYPE_SETTIME) {
4220
+ var _iterator2 = _createForOfIteratorHelper(group.targets.allIds),
4221
+ _step2;
4222
+ try {
4223
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
4224
+ var _group$targets$byId$t2, _store$webmap;
4225
+ var targetId = _step2.value;
4226
+ if (targetId !== panelId && (_group$targets$byId$t2 = group.targets.byId[targetId]) !== null && _group$targets$byId$t2 !== void 0 && _group$targets$byId$t2.linked && !!((_store$webmap = store.webmap) !== null && _store$webmap !== void 0 && (_store$webmap = _store$webmap.byId) !== null && _store$webmap !== void 0 && _store$webmap[targetId])) {
4227
+ return targetId;
4228
+ }
4229
+ }
4230
+ } catch (err) {
4231
+ _iterator2.e(err);
4232
+ } finally {
4233
+ _iterator2.f();
4234
+ }
4235
+ }
4236
+ }
4237
+ } catch (err) {
4238
+ _iterator.e(err);
4239
+ } finally {
4240
+ _iterator.f();
4241
+ }
4242
+ return undefined;
4243
+ });
4244
+ var linkedMapSelectedTime = useSelector(function (store) {
4245
+ var _store$webmap2;
4246
+ if (!linkedMapIdsInTimeGroup) {
4247
+ return undefined;
4248
+ }
4249
+ var selectedTime = (_store$webmap2 = store.webmap) === null || _store$webmap2 === void 0 || (_store$webmap2 = _store$webmap2.byId) === null || _store$webmap2 === void 0 || (_store$webmap2 = _store$webmap2[linkedMapIdsInTimeGroup]) === null || _store$webmap2 === void 0 || (_store$webmap2 = _store$webmap2.dimensions) === null || _store$webmap2 === void 0 || (_store$webmap2 = _store$webmap2.find(function (dimension) {
4250
+ return dimension.name === 'time';
4251
+ })) === null || _store$webmap2 === void 0 ? void 0 : _store$webmap2.currentValue;
4252
+ if (!selectedTime) {
4253
+ return undefined;
4254
+ }
4255
+ var selectedTimeAsUnix = Date.parse(selectedTime) / 1000;
4256
+ if (!Number.isFinite(selectedTimeAsUnix)) {
4257
+ return undefined;
4258
+ }
4259
+ return Math.round(selectedTimeAsUnix);
4260
+ });
4261
+ var syncSourceCurrentTime = syncSourceTime !== null && syncSourceTime !== void 0 && syncSourceTime.currentTime ? Date.parse(syncSourceTime.currentTime) / 1000 : undefined;
4262
+ var roundedSyncSourceCurrentTime = syncSourceCurrentTime !== undefined && Number.isFinite(syncSourceCurrentTime) ? Math.round(syncSourceCurrentTime) : undefined;
4263
+ var fallbackCurrentTime = (_ref = linkedMapSelectedTime !== null && linkedMapSelectedTime !== void 0 ? linkedMapSelectedTime : roundedSyncSourceCurrentTime) !== null && _ref !== void 0 ? _ref : defaultNowTime.current;
4264
+ var fallbackState = isSyncgroupLinked ? {
4265
+ start: fallbackCurrentTime - defaultTimeSpan / 2,
4266
+ end: fallbackCurrentTime + defaultTimeSpan / 2,
4267
+ step: defaultTimeStep,
4268
+ current: fallbackCurrentTime
4269
+ } : undefined;
4270
+ var syncedState = isSyncgroupLinked ? syncGroupTimeSliderCenterStartEndStep || fallbackState : undefined;
4271
+ var mapFallbackState = linkedMapSelectedTime !== undefined ? {
4272
+ start: linkedMapSelectedTime - defaultTimeSpan / 2,
4273
+ end: linkedMapSelectedTime + defaultTimeSpan / 2,
4274
+ step: defaultTimeStep,
4275
+ current: linkedMapSelectedTime
4276
+ } : undefined;
4277
+ var baseState = syncedState || mapFallbackState;
4278
+ var stateWithAuthoritativeCurrent = baseState && linkedMapSelectedTime !== undefined ? _objectSpread2(_objectSpread2({}, baseState), {}, {
4279
+ current: linkedMapSelectedTime
4280
+ }) : baseState;
4281
+ return useDebounce(stateWithAuthoritativeCurrent, debounceMs);
4282
+ };
4283
+
4008
4284
  var useUpdateSharedData = function useUpdateSharedData(data, panelId) {
4009
4285
  var sharedData = useSelector(function (state) {
4010
4286
  return selectSharedData(state, panelId);
@@ -4772,6 +5048,20 @@ var getLayerService = createSelector(getLayerById, function (layer) {
4772
5048
  var _layer$service;
4773
5049
  return (_layer$service = layer === null || layer === void 0 ? void 0 : layer.service) !== null && _layer$service !== void 0 ? _layer$service : '';
4774
5050
  }, selectorMemoizationOptions);
5051
+ /**
5052
+ * Gets layer service name
5053
+ *
5054
+ * Example: layerService = getLayerServiceName(store, 'layerId_1')
5055
+ * @param {object} store store: object - object from which the layers state will be extracted
5056
+ * @param {string} layerId layerId: string - Id of the layer
5057
+ * @returns {string} returnType: string - layer service name
5058
+ */
5059
+ var getLayerServiceName = createSelector(function (store) {
5060
+ return store;
5061
+ }, getLayerById, getLayerService, function (store, layer, service) {
5062
+ var layerService = getServiceByUrl(store, service);
5063
+ return layerService !== null && layerService !== void 0 && layerService.name ? layerService === null || layerService === void 0 ? void 0 : layerService.name : '';
5064
+ }, selectorMemoizationOptions);
4775
5065
  /**
4776
5066
  * Gets selected style of the passed layer
4777
5067
  *
@@ -5047,6 +5337,7 @@ var selectors$2 = /*#__PURE__*/Object.freeze({
5047
5337
  getLayerOpacity: getLayerOpacity,
5048
5338
  getLayerOptions: getLayerOptions,
5049
5339
  getLayerService: getLayerService,
5340
+ getLayerServiceName: getLayerServiceName,
5050
5341
  getLayerStatus: getLayerStatus,
5051
5342
  getLayerStyle: getLayerStyle,
5052
5343
  getLayerTimeDimension: getLayerTimeDimension,
@@ -5520,7 +5811,6 @@ var getMapTimeSliderStartCenterEndAndStep = createSelector(getMapById, function
5520
5811
  var step = (_store$timeStep2 = store === null || store === void 0 ? void 0 : store.timeStep) !== null && _store$timeStep2 !== void 0 ? _store$timeStep2 : defaultTimeStep;
5521
5812
  return {
5522
5813
  start: start,
5523
- center: center,
5524
5814
  end: end,
5525
5815
  step: step
5526
5816
  };
@@ -5754,6 +6044,15 @@ var getLegendId = createSelector(getMapById, function (store) {
5754
6044
  var getIsClockVisible = createSelector(getMapById, function (store) {
5755
6045
  return store === null || store === void 0 ? void 0 : store.isClockVisible;
5756
6046
  }, selectorMemoizationOptions);
6047
+ /**
6048
+ * Returns if clock options menu is visible from webmap state
6049
+ *
6050
+ * @param {CoreAppStore} store - The Redux store from which the map state will be extracted.
6051
+ * @returns {boolean | undefined} returnType: boolean
6052
+ */
6053
+ var getIsClockOptionsMenuVisible = createSelector(getMapById, function (store) {
6054
+ return store === null || store === void 0 ? void 0 : store.isClockOptionsMenuVisible;
6055
+ }, selectorMemoizationOptions);
5757
6056
  /**
5758
6057
  * Returns if clock position from webmap state
5759
6058
  *
@@ -5781,14 +6080,26 @@ var getClockSize = createSelector(getMapById, function (store) {
5781
6080
  * @param {boolean} keepAllDims? keepAllDims: boolean - default false: whether or not to leave the time and reference_time dimentions
5782
6081
  * @returns {MapPreset} returnType: MapPreset
5783
6082
  */
5784
- var getMapPreset = createSelector(getMapLayers, getMapBaseLayers, getMapOverLayers, getBbox, getSrs, getActiveLayerId, getAutoTimeStepLayerId, getAutoUpdateLayerId, isAnimating, isAutoUpdating, isTimeSliderVisible, getDisplayMapPin, isZoomControlsVisible, getMapTimeStep, getMapAnimationDelay, getAnimationStartTime, getAnimationEndTime, getMapTimeSliderSpan, getMapDimensions, isTimestepAuto, isTimeSpanAuto, getLegendId, getIsClockVisible, getClockPosition, getClockSize, getUiStore, function (_store, mapId) {
6083
+ var getMapPreset = createSelector(getMapLayers, getMapBaseLayers, getMapOverLayers, getBbox, getSrs, getActiveLayerId, getAutoTimeStepLayerId, getAutoUpdateLayerId, isAnimating, isAutoUpdating, isTimeSliderVisible, getDisplayMapPin, isZoomControlsVisible, getMapTimeStep, getMapAnimationDelay, getAnimationStartTime, getAnimationEndTime, getMapTimeSliderSpan, getMapDimensions, isTimestepAuto, isTimeSpanAuto, getLegendId, function (store, mapId) {
6084
+ var _getMapById$dockedLay, _getMapById;
6085
+ return (_getMapById$dockedLay = (_getMapById = getMapById(store, mapId)) === null || _getMapById === void 0 ? void 0 : _getMapById.dockedLayerManagerSize) !== null && _getMapById$dockedLay !== void 0 ? _getMapById$dockedLay : 'sizeSmall';
6086
+ }, function (store, mapId) {
6087
+ var _getMapById$dockedLay2, _getMapById2;
6088
+ return (_getMapById$dockedLay2 = (_getMapById2 = getMapById(store, mapId)) === null || _getMapById2 === void 0 ? void 0 : _getMapById2.dockedLayerManagerPosition) !== null && _getMapById$dockedLay2 !== void 0 ? _getMapById$dockedLay2 : {
6089
+ x: 0,
6090
+ y: 0
6091
+ };
6092
+ }, function (store, mapId) {
6093
+ var _getMapById3;
6094
+ return (_getMapById3 = getMapById(store, mapId)) === null || _getMapById3 === void 0 ? void 0 : _getMapById3.dockedLayerManagerDimensions;
6095
+ }, getIsClockVisible, getIsClockOptionsMenuVisible, getClockPosition, getClockSize, getUiStore, function (_store, mapId) {
5785
6096
  return mapId;
5786
6097
  }, function (_store, _mapId) {
5787
6098
  var keepAllDims = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
5788
6099
  return keepAllDims;
5789
- }, function (mapLayers, baseLayers, overLayers, bbox, srs, activeLayerId, autoTimeStepLayerId, autoUpdateLayerId, isAnimating, isAutoUpdating, isTimeSliderVisible, displayMapPin, isZoomControlsVisible, mapTimeStep, mapAnimationDelay, animationStartTime, animationEndTime, timeSliderSpan, mapDimensions, isTimestepAuto, isTimeSpanAuto, legendId, isClockVisible, clockPosition, clockSize, uiStore, mapId, keepAllDims) {
6100
+ }, function (mapLayers, baseLayers, overLayers, bbox, srs, activeLayerId, autoTimeStepLayerId, autoUpdateLayerId, isAnimating, isAutoUpdating, isTimeSliderVisible, displayMapPin, isZoomControlsVisible, mapTimeStep, mapAnimationDelay, animationStartTime, animationEndTime, timeSliderSpan, mapDimensions, isTimestepAuto, isTimeSpanAuto, legendId, dockedLayerManagerSize, dockedLayerManagerPosition, dockedLayerManagerDimensions, isClockVisible, isClockOptionsMenuVisible, clockPosition, clockSize, uiStore, mapId, keepAllDims) {
5790
6101
  var _overLayers$, _uiStore$dialogs$lege;
5791
- var defaultOverlayer = arguments.length > 28 && arguments[28] !== undefined ? arguments[28] : ((_overLayers$ = overLayers[0]) === null || _overLayers$ === void 0 ? void 0 : _overLayers$.name) || 'none';
6102
+ var defaultOverlayer = arguments.length > 32 && arguments[32] !== undefined ? arguments[32] : ((_overLayers$ = overLayers[0]) === null || _overLayers$ === void 0 ? void 0 : _overLayers$.name) || 'none';
5792
6103
  var allLayers = [].concat(_toConsumableArray(baseLayers), _toConsumableArray(overLayers), _toConsumableArray(mapLayers)).map(function (_ref3) {
5793
6104
  _ref3.mapId;
5794
6105
  var layer = _objectWithoutProperties(_ref3, _excluded$2);
@@ -5816,7 +6127,19 @@ var getMapPreset = createSelector(getMapLayers, getMapBaseLayers, getMapOverLaye
5816
6127
  var shouldShowLegend = legendId ? uiStore === null || uiStore === void 0 || (_uiStore$dialogs$lege = uiStore.dialogs[legendId]) === null || _uiStore$dialogs$lege === void 0 ? void 0 : _uiStore$dialogs$lege.isOpen : false;
5817
6128
  var dataExplorerDialog = uiStore === null || uiStore === void 0 ? void 0 : uiStore.dialogs[DialogTypes.DataExplorer];
5818
6129
  var shouldShowDataExplorer = (dataExplorerDialog === null || dataExplorerDialog === void 0 ? void 0 : dataExplorerDialog.isOpen) && (dataExplorerDialog === null || dataExplorerDialog === void 0 ? void 0 : dataExplorerDialog.activeMapId) === mapId || false;
5819
- return _objectSpread2(_objectSpread2(_objectSpread2(_objectSpread2(_objectSpread2(_objectSpread2(_objectSpread2({
6130
+ var dockedLayerManagerDialog = uiStore === null || uiStore === void 0 ? void 0 : uiStore.dialogs["".concat(DialogTypes.DockedLayerManager, "-").concat(mapId)];
6131
+ var floatingLayerManagerDialog = uiStore === null || uiStore === void 0 ? void 0 : uiStore.dialogs[DialogTypes.LayerManager];
6132
+ var floatingLayerManagerMultimapDialog = uiStore === null || uiStore === void 0 ? void 0 : uiStore.dialogs["".concat(DialogTypes.LayerManager, "-").concat(mapId)];
6133
+ var isFloatingLayerManagerOpenForMap = (floatingLayerManagerDialog === null || floatingLayerManagerDialog === void 0 ? void 0 : floatingLayerManagerDialog.isOpen) && (floatingLayerManagerDialog === null || floatingLayerManagerDialog === void 0 ? void 0 : floatingLayerManagerDialog.activeMapId) === mapId || (floatingLayerManagerMultimapDialog === null || floatingLayerManagerMultimapDialog === void 0 ? void 0 : floatingLayerManagerMultimapDialog.isOpen) || false;
6134
+ var shouldShowDockedLayerManager = ((dockedLayerManagerDialog === null || dockedLayerManagerDialog === void 0 ? void 0 : dockedLayerManagerDialog.isOpen) || false) && !isFloatingLayerManagerOpenForMap;
6135
+ var dockedLayerManagerPreset = shouldShowDockedLayerManager ? _objectSpread2({
6136
+ shouldShowDockedLayerManager: shouldShowDockedLayerManager,
6137
+ dockedLayerManagerSize: dockedLayerManagerSize,
6138
+ dockedLayerManagerPosition: dockedLayerManagerPosition
6139
+ }, dockedLayerManagerDimensions && {
6140
+ dockedLayerManagerDimensions: dockedLayerManagerDimensions
6141
+ }) : {};
6142
+ return _objectSpread2(_objectSpread2(_objectSpread2(_objectSpread2(_objectSpread2(_objectSpread2(_objectSpread2(_objectSpread2(_objectSpread2({
5820
6143
  layers: allLayers
5821
6144
  }, activeLayerId && {
5822
6145
  activeLayerId: activeLayerId
@@ -5841,8 +6164,10 @@ var getMapPreset = createSelector(getMapLayers, getMapBaseLayers, getMapOverLaye
5841
6164
  timeSliderSpan: timeSliderSpan,
5842
6165
  shouldShowDataExplorer: shouldShowDataExplorer,
5843
6166
  defaultOverlayer: defaultOverlayer
5844
- }, isClockVisible !== undefined && {
6167
+ }, dockedLayerManagerPreset), isClockVisible !== undefined && {
5845
6168
  isClockVisible: isClockVisible
6169
+ }), isClockOptionsMenuVisible !== undefined && {
6170
+ isClockOptionsMenuVisible: isClockOptionsMenuVisible
5846
6171
  }), clockPosition !== undefined && {
5847
6172
  clockPosition: clockPosition
5848
6173
  }), clockSize !== undefined && {
@@ -5961,6 +6286,24 @@ var getIsEnabledLayersForMapDimension = createSelector(getMapLayerIdsEnabled, fu
5961
6286
  var getDockedLayerManagerSize = createSelector(getMapById, function (store) {
5962
6287
  return store ? store.dockedLayerManagerSize : 'sizeSmall';
5963
6288
  }, selectorMemoizationOptions);
6289
+ /**
6290
+ * Returns the dockedLayerManagerPosition originally set in mapPresets
6291
+ *
6292
+ * Example getDockedLayerManagerPosition(store);
6293
+ * @param {object} store store: object - store object
6294
+ * @param {string} mapId mapId: string - Id of the map
6295
+ * @returns {DockedLayerManagerPosition} returnType: object
6296
+ */
6297
+ var getDockedLayerManagerPosition = createSelector(getMapById, function (store) {
6298
+ var _store$dockedLayerMan;
6299
+ return (_store$dockedLayerMan = store === null || store === void 0 ? void 0 : store.dockedLayerManagerPosition) !== null && _store$dockedLayerMan !== void 0 ? _store$dockedLayerMan : {
6300
+ x: 0,
6301
+ y: 0
6302
+ };
6303
+ }, selectorMemoizationOptions);
6304
+ var getDockedLayerManagerDimensions = createSelector(getMapById, function (store) {
6305
+ return store === null || store === void 0 ? void 0 : store.dockedLayerManagerDimensions;
6306
+ }, selectorMemoizationOptions);
5964
6307
  /**
5965
6308
  * Returns the animation list for given map id
5966
6309
  * @param {object} store store: object - store object
@@ -6081,10 +6424,13 @@ var selectors$1 = /*#__PURE__*/Object.freeze({
6081
6424
  getDataLimitsFromLayers: getDataLimitsFromLayers,
6082
6425
  getDisableMapPin: getDisableMapPin,
6083
6426
  getDisplayMapPin: getDisplayMapPin,
6427
+ getDockedLayerManagerDimensions: getDockedLayerManagerDimensions,
6428
+ getDockedLayerManagerPosition: getDockedLayerManagerPosition,
6084
6429
  getDockedLayerManagerSize: getDockedLayerManagerSize,
6085
6430
  getFirstMap: getFirstMap,
6086
6431
  getFirstMapId: getFirstMapId,
6087
6432
  getHarmonieInitialProps: getHarmonieInitialProps,
6433
+ getIsClockOptionsMenuVisible: getIsClockOptionsMenuVisible,
6088
6434
  getIsClockVisible: getIsClockVisible,
6089
6435
  getIsEnabledLayersForMapDimension: getIsEnabledLayersForMapDimension,
6090
6436
  getIsLayerActiveLayer: getIsLayerActiveLayer,
@@ -6604,18 +6950,25 @@ genericListener.startListening({
6604
6950
  payload = _ref.payload;
6605
6951
  listenerApi.cancelActiveListeners();
6606
6952
  value = payload.value, origin = payload.origin;
6607
- if (value !== null && value !== void 0 && value.currentTime) {
6608
- currentTime = value.currentTime;
6609
- /* Test if the current is according to the expected time format */
6610
- if (!setTimeValidatorRexexp.test(currentTime)) {
6611
- console.error("setTime value ".concat(currentTime, " does not conform to format [YYYY-MM-DDThh:mm:ssZ]. It was triggered by ").concat(origin));
6612
- } else {
6613
- targets = getTargets(listenerApi.getState(), payload, SYNCGROUPS_TYPE_SETTIME);
6614
- groups = getTargetGroups(listenerApi.getState(), payload, SYNCGROUPS_TYPE_SETTIME);
6615
- listenerApi.dispatch(setTimeSync(payload, targets, groups));
6616
- }
6953
+ if (!(value !== null && value !== void 0 && value.currentTime)) {
6954
+ _context.next = 8;
6955
+ break;
6617
6956
  }
6618
- case 4:
6957
+ currentTime = value.currentTime;
6958
+ /* Test if the current is according to the expected time format */
6959
+ if (setTimeValidatorRexexp.test(currentTime)) {
6960
+ _context.next = 8;
6961
+ break;
6962
+ }
6963
+ console.error("setTime value ".concat(currentTime, " does not conform to format [YYYY-MM-DDThh:mm:ssZ]. It was triggered by ").concat(origin));
6964
+ // Do not do anything
6965
+ return _context.abrupt("return");
6966
+ case 8:
6967
+ // SetTimeSyncProps contains besides currenttime many other props. Set these.
6968
+ targets = getTargets(listenerApi.getState(), payload, SYNCGROUPS_TYPE_SETTIME);
6969
+ groups = getTargetGroups(listenerApi.getState(), payload, SYNCGROUPS_TYPE_SETTIME);
6970
+ listenerApi.dispatch(setTimeSync(payload, targets, groups));
6971
+ case 11:
6619
6972
  case "end":
6620
6973
  return _context.stop();
6621
6974
  }
@@ -7062,6 +7415,16 @@ var olMetronomeHandler = function olMetronomeHandler(timerIds, listenerApi) {
7062
7415
  }
7063
7416
  });
7064
7417
  }
7418
+ if (!targets.some(function (target) {
7419
+ return target.targetId === timerId;
7420
+ })) {
7421
+ targets.push({
7422
+ targetId: timerId,
7423
+ value: {
7424
+ currentTime: ''
7425
+ }
7426
+ });
7427
+ }
7065
7428
  var timerIsInDwell = handleTimerDwell(timerId, animationListValues.length);
7066
7429
  // Collect all layers for this syncgroups target
7067
7430
  var reduxLayers = [];
@@ -7156,9 +7519,23 @@ mapListener.startListening({
7156
7519
  return;
7157
7520
  }
7158
7521
  var autoUpdateLayerId = getAutoUpdateLayerId(listenerApi.getState(), mapId);
7522
+ var autoTimeStepLayerId = getAutoTimeStepLayerId(listenerApi.getState(), mapId);
7523
+ var autoUpdateLayerHasTimeDimension = autoUpdateLayerId ? getLayerHasTimeDimension(listenerApi.getState(), autoUpdateLayerId) : false;
7524
+ var autoTimeStepLayerHasTimeDimension = autoTimeStepLayerId ? getLayerHasTimeDimension(listenerApi.getState(), autoTimeStepLayerId) : false;
7159
7525
  var shouldAutoUpdate = isAutoUpdating(listenerApi.getState(), mapId);
7160
7526
  var prevTimeDimension = getLayerTimeDimension(listenerApi.getState(), layerId);
7161
- var isAutoUpdateLayer = layerId === autoUpdateLayerId;
7527
+ var hasAutoLayers = !!autoUpdateLayerId && !!autoTimeStepLayerId;
7528
+ var isAutoLayerValid = hasAutoLayers && autoUpdateLayerHasTimeDimension && autoTimeStepLayerHasTimeDimension;
7529
+ var hasTimeDimension = !!newTimeDimension;
7530
+ var shouldSetAutoLayer = !isAutoLayerValid && hasTimeDimension;
7531
+ if (shouldSetAutoLayer) {
7532
+ listenerApi.dispatch(mapActions.setAutoLayerId({
7533
+ mapId: mapId,
7534
+ layerId: layerId
7535
+ }));
7536
+ }
7537
+ var effectiveAutoUpdateLayerId = shouldSetAutoLayer ? layerId : autoUpdateLayerId;
7538
+ var isAutoUpdateLayer = layerId === effectiveAutoUpdateLayerId;
7162
7539
  var incomingMaxTime = newTimeDimension === null || newTimeDimension === void 0 ? void 0 : newTimeDimension.maxValue;
7163
7540
  var isIncomingMaxTimeLaterThanCurrentLayerTime = incomingMaxTime && (prevTimeDimension === null || prevTimeDimension === void 0 ? void 0 : prevTimeDimension.currentValue) && prevTimeDimension.currentValue !== incomingMaxTime;
7164
7541
  if (isAutoUpdateLayer &&
@@ -7380,7 +7757,7 @@ mapListener.startListening({
7380
7757
  actionCreator: mapActions.setMapPreset,
7381
7758
  effect: function () {
7382
7759
  var _effect2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee2(_ref6, listenerApi) {
7383
- var payload, mapId, initialProps, mapPreset, _mapPreset$dimensions, layers, activeLayerId, autoTimeStepLayerId, autoUpdateLayerId, proj, shouldAutoUpdate, shouldAnimate, animationPayload, toggleTimestepAuto, showTimeSlider, displayMapPin, shouldShowZoomControls, shouldShowLegend, shouldShowDataExplorer, dockedLayerManagerSize, timeSliderSpan, toggleTimeSpanAuto, defaultOverlayer, isClockVisible, clockPosition, clockSize, _filterLayers, mapLayers, baseLayers, overLayers, _newLayerIds$layers$f, _newLayerIds$layers$f2, autoTimeStepLayerIdNew, autoUpdateLayerIdNew, onlyActiveLayerIdIsSet, newLayerIds, newAutoTimeStepLayerId, newAutoUpdateLayerId, customLayers, customBaseLayer, customOverLayer, baseLayersWithDefaultLayer, overLayersWithDefaultLayer, allBaseLayers, _overlayersFromStore$, overlayersFromStore, foundOverlayerId, checkIsprojectionSupported, animationLength, animationEndTime, shouldEndtimeOverride, interval, timeAlreadySet, endTime, startTime, centerTimeInSeconds, animationEnd, _startTime, duration, _animationEnd, animationStart, shouldOpenLegend, legendId, fiveMinuteDelayForAnimation, _animationEnd2, _animationStart;
7760
+ var payload, mapId, initialProps, mapPreset, _mapPreset$dimensions, layers, activeLayerId, autoTimeStepLayerId, autoUpdateLayerId, proj, shouldAutoUpdate, shouldAnimate, animationPayload, toggleTimestepAuto, showTimeSlider, displayMapPin, shouldShowZoomControls, shouldShowLegend, shouldShowDockedLayerManager, shouldShowDataExplorer, dockedLayerManagerSize, dockedLayerManagerPosition, dockedLayerManagerDimensions, timeSliderSpan, toggleTimeSpanAuto, defaultOverlayer, isClockVisible, isClockOptionsMenuVisible, clockPosition, clockSize, _filterLayers, mapLayers, baseLayers, overLayers, _newLayerIds$layers$f, _newLayerIds$layers$f2, autoTimeStepLayerIdNew, autoUpdateLayerIdNew, onlyActiveLayerIdIsSet, newLayerIds, newAutoTimeStepLayerId, newAutoUpdateLayerId, customLayers, customBaseLayer, customOverLayer, baseLayersWithDefaultLayer, overLayersWithDefaultLayer, allBaseLayers, _overlayersFromStore$, overlayersFromStore, foundOverlayerId, checkIsprojectionSupported, animationLength, animationEndTime, shouldEndtimeOverride, interval, timeAlreadySet, endTime, startTime, centerTimeInSeconds, animationEnd, _startTime, duration, _animationEnd, animationStart, shouldOpenLegend, legendId, dockedLayerManagerType, fiveMinuteDelayForAnimation, _animationEnd2, _animationStart;
7384
7761
  return _regeneratorRuntime().wrap(function _callee2$(_context2) {
7385
7762
  while (1) switch (_context2.prev = _context2.next) {
7386
7763
  case 0:
@@ -7389,10 +7766,10 @@ mapListener.startListening({
7389
7766
  mapId = payload.mapId, initialProps = payload.initialProps;
7390
7767
  mapPreset = initialProps.mapPreset;
7391
7768
  if (!mapPreset) {
7392
- _context2.next = 56;
7769
+ _context2.next = 62;
7393
7770
  break;
7394
7771
  }
7395
- layers = mapPreset.layers, activeLayerId = mapPreset.activeLayerId, autoTimeStepLayerId = mapPreset.autoTimeStepLayerId, autoUpdateLayerId = mapPreset.autoUpdateLayerId, proj = mapPreset.proj, shouldAutoUpdate = mapPreset.shouldAutoUpdate, shouldAnimate = mapPreset.shouldAnimate, animationPayload = mapPreset.animationPayload, toggleTimestepAuto = mapPreset.toggleTimestepAuto, showTimeSlider = mapPreset.showTimeSlider, displayMapPin = mapPreset.displayMapPin, shouldShowZoomControls = mapPreset.shouldShowZoomControls, shouldShowLegend = mapPreset.shouldShowLegend, shouldShowDataExplorer = mapPreset.shouldShowDataExplorer, dockedLayerManagerSize = mapPreset.dockedLayerManagerSize, timeSliderSpan = mapPreset.timeSliderSpan, toggleTimeSpanAuto = mapPreset.toggleTimeSpanAuto, defaultOverlayer = mapPreset.defaultOverlayer, isClockVisible = mapPreset.isClockVisible, clockPosition = mapPreset.clockPosition, clockSize = mapPreset.clockSize;
7772
+ layers = mapPreset.layers, activeLayerId = mapPreset.activeLayerId, autoTimeStepLayerId = mapPreset.autoTimeStepLayerId, autoUpdateLayerId = mapPreset.autoUpdateLayerId, proj = mapPreset.proj, shouldAutoUpdate = mapPreset.shouldAutoUpdate, shouldAnimate = mapPreset.shouldAnimate, animationPayload = mapPreset.animationPayload, toggleTimestepAuto = mapPreset.toggleTimestepAuto, showTimeSlider = mapPreset.showTimeSlider, displayMapPin = mapPreset.displayMapPin, shouldShowZoomControls = mapPreset.shouldShowZoomControls, shouldShowLegend = mapPreset.shouldShowLegend, shouldShowDockedLayerManager = mapPreset.shouldShowDockedLayerManager, shouldShowDataExplorer = mapPreset.shouldShowDataExplorer, dockedLayerManagerSize = mapPreset.dockedLayerManagerSize, dockedLayerManagerPosition = mapPreset.dockedLayerManagerPosition, dockedLayerManagerDimensions = mapPreset.dockedLayerManagerDimensions, timeSliderSpan = mapPreset.timeSliderSpan, toggleTimeSpanAuto = mapPreset.toggleTimeSpanAuto, defaultOverlayer = mapPreset.defaultOverlayer, isClockVisible = mapPreset.isClockVisible, isClockOptionsMenuVisible = mapPreset.isClockOptionsMenuVisible, clockPosition = mapPreset.clockPosition, clockSize = mapPreset.clockSize;
7396
7773
  _filterLayers = filterLayers(layers), mapLayers = _filterLayers.mapLayers, baseLayers = _filterLayers.baseLayers, overLayers = _filterLayers.overLayers;
7397
7774
  if (layers) {
7398
7775
  // make sure all layers have a unique id before going forward
@@ -7525,6 +7902,13 @@ mapListener.startListening({
7525
7902
  isClockVisible: isClockVisible
7526
7903
  }));
7527
7904
  }
7905
+ if (isClockOptionsMenuVisible) {
7906
+ // toggle clock options menu visibility
7907
+ listenerApi.dispatch(mapActions.toggleClockOptions({
7908
+ mapId: mapId,
7909
+ isClockOptionsMenuVisible: isClockOptionsMenuVisible
7910
+ }));
7911
+ }
7528
7912
  if (clockPosition !== undefined) {
7529
7913
  // set clock position
7530
7914
  listenerApi.dispatch(mapActions.setClockPositionSize({
@@ -7658,15 +8042,40 @@ mapListener.startListening({
7658
8042
  dockedLayerManagerSize: dockedLayerManagerSize
7659
8043
  }));
7660
8044
  }
7661
- case 46:
8045
+ dockedLayerManagerType = "".concat(DialogTypes.DockedLayerManager, "-").concat(mapId);
8046
+ if (shouldShowDockedLayerManager !== undefined) {
8047
+ listenerApi.dispatch(uiActions.setToggleOpenDialog({
8048
+ type: dockedLayerManagerType,
8049
+ setOpen: shouldShowDockedLayerManager
8050
+ }));
8051
+ }
8052
+ if (shouldShowDockedLayerManager) {
8053
+ listenerApi.dispatch(uiActions.setToggleOpenDialog({
8054
+ type: DialogTypes.LayerManager,
8055
+ setOpen: false
8056
+ }));
8057
+ }
8058
+ if (dockedLayerManagerPosition) {
8059
+ listenerApi.dispatch(mapActions.setDockedLayerManagerPosition({
8060
+ mapId: mapId,
8061
+ dockedLayerManagerPosition: dockedLayerManagerPosition
8062
+ }));
8063
+ }
8064
+ if (dockedLayerManagerDimensions) {
8065
+ listenerApi.dispatch(mapActions.setDockedLayerManagerDimensions({
8066
+ mapId: mapId,
8067
+ dockedLayerManagerDimensions: dockedLayerManagerDimensions
8068
+ }));
8069
+ }
8070
+ case 52:
7662
8071
  if (!(animationEndTime && (shouldEndtimeOverride || !(shouldAutoUpdate || shouldAnimate)))) {
7663
- _context2.next = 56;
8072
+ _context2.next = 62;
7664
8073
  break;
7665
8074
  }
7666
8075
  fiveMinuteDelayForAnimation = 1000 * 60 * 5; // eslint-disable-next-line no-await-in-loop
7667
- _context2.next = 50;
8076
+ _context2.next = 56;
7668
8077
  return listenerApi.delay(fiveMinuteDelayForAnimation);
7669
- case 50:
8078
+ case 56:
7670
8079
  _animationEnd2 = getAnimationEndTime(listenerApi.getState(), mapId);
7671
8080
  listenerApi.dispatch(mapActions.setAnimationEndTime({
7672
8081
  mapId: mapId,
@@ -7681,13 +8090,13 @@ mapListener.startListening({
7681
8090
  minutes: 5
7682
8091
  }).toISOString()
7683
8092
  }));
7684
- _context2.next = 46;
8093
+ _context2.next = 52;
7685
8094
  break;
7686
- case 56:
7687
- _context2.next = 61;
8095
+ case 62:
8096
+ _context2.next = 67;
7688
8097
  break;
7689
- case 58:
7690
- _context2.prev = 58;
8098
+ case 64:
8099
+ _context2.prev = 64;
7691
8100
  _context2.t0 = _context2["catch"](1);
7692
8101
  if (_context2.t0 instanceof Error) {
7693
8102
  listenerApi.dispatch(mapActions.setMapPresetError({
@@ -7695,11 +8104,11 @@ mapListener.startListening({
7695
8104
  error: _context2.t0.message
7696
8105
  }));
7697
8106
  }
7698
- case 61:
8107
+ case 67:
7699
8108
  case "end":
7700
8109
  return _context2.stop();
7701
8110
  }
7702
- }, _callee2, null, [[1, 58]]);
8111
+ }, _callee2, null, [[1, 64]]);
7703
8112
  }));
7704
8113
  function effect(_x3, _x4) {
7705
8114
  return _effect2.apply(this, arguments);
@@ -7739,6 +8148,8 @@ mapListener.startListening({
7739
8148
  _mapSelectors$getData2 = _slicedToArray(_mapSelectors$getData, 2),
7740
8149
  dataStartTime = _mapSelectors$getData2[0],
7741
8150
  dataEndTime = _mapSelectors$getData2[1];
8151
+ var hasValidDataStartTime = Number.isFinite(dataStartTime) && dataStartTime > 0 && dataStartTime < 2147483647;
8152
+ var hasValidDataEndTime = Number.isFinite(dataEndTime) && dataEndTime > 0;
7742
8153
  if (dateUtils.isValid(currentTime)) {
7743
8154
  var makeForwardStep = function makeForwardStep() {
7744
8155
  // timeStep is in minutes, convert to seconds
@@ -7748,7 +8159,7 @@ mapListener.startListening({
7748
8159
  // This ensures 12:07 with 24h step goes to 12:00 next day, not 00:00
7749
8160
  var roundingStep = timeStep > 12 * 60 ? 60 : timeStep; // Use 1 hour for large steps
7750
8161
  var roundedTime = roundWithTimeStep(nextTime, roundingStep, 'round');
7751
- var newTime = Math.min(roundedTime, dataEndTime || roundedTime);
8162
+ var newTime = hasValidDataEndTime ? Math.min(roundedTime, dataEndTime) : roundedTime;
7752
8163
  return dateUtils.fromUnix(newTime).toISOString();
7753
8164
  };
7754
8165
  var makeBackwardStep = function makeBackwardStep() {
@@ -7758,7 +8169,7 @@ mapListener.startListening({
7758
8169
  // For large timesteps (>12h), round to nearest hour instead of timestep
7759
8170
  var roundingStep = timeStep > 12 * 60 ? 60 : timeStep; // Use 1 hour for large steps
7760
8171
  var roundedTime = roundWithTimeStep(nextTime, roundingStep, 'round');
7761
- var newTime = Math.max(roundedTime, dataStartTime || roundedTime);
8172
+ var newTime = hasValidDataStartTime ? Math.max(roundedTime, dataStartTime) : roundedTime;
7762
8173
  return dateUtils.fromUnix(newTime).toISOString();
7763
8174
  };
7764
8175
  var selectedTimeString = isForwardStep ? makeForwardStep() : makeBackwardStep();
@@ -9375,4 +9786,4 @@ var configureOpenGeoWebStore = function configureOpenGeoWebStore() {
9375
9786
  });
9376
9787
  };
9377
9788
 
9378
- export { IS_LEGEND_OPEN_BY_DEFAULT, SECONDS_IN_DAY, SECONDS_IN_HOUR, commonActions, commonListener, commonReducers, commonSelectors, configureOpenGeoWebStore, createMockStore, createViewObjectForNewMap, drawingToolActions, drawingToolListener, drawingToolReducer, selectors as drawingToolSelectors, filterLayers$1 as filterLayers, genericActions, genericListener, selectors$5 as genericSelectors, getSingularDrawtoolDrawLayerId, getUserAddedServices, getViewObjectForMapId, getViewObjectForSyncGroup, initialState$3 as initialState, layerActions, layerReducer, selectors$2 as layerSelectors, types$2 as layerTypes, utils$1 as layerUtils, layersListener, constants as linkComponentTypesConstants, loadingIndicatorActions, constants$1 as loadingIndicatorConstants, loadingIndicatorReducer, selectors$4 as loadingIndicatorSelectors, mapActions, enums as mapEnums, mapListener, mapReducer, selectors$1 as mapSelectors, types$3 as mapTypes, mapUtils, metronomeListener, openlayersListener, routerActions, routerListener, routerReducer, utils as routerUtils, selectorMemoizationOptions, serviceActions, serviceListener, serviceReducer, selectors$7 as serviceSelectors, setUserAddedServices, storeMiddlewares, storeReducerMap, storeTestSettings, storeTestUtils, utils$3 as storeUtils, constants$2 as syncConstants, syncGroupsActions, syncGroupsListener, syncGroupsReducer, selector as syncGroupsSelector, selectors$6 as syncGroupsSelectors, types$1 as syncGroupsTypes, types$1 as types, uiActions, uiReducer, selectors$3 as uiSelectors, types as uiTypes, unifyReducerMaps, useSetupDialog, useUpdateSharedData };
9789
+ export { IS_LEGEND_OPEN_BY_DEFAULT, SECONDS_IN_DAY, SECONDS_IN_HOUR, commonActions, commonListener, commonReducers, commonSelectors, configureOpenGeoWebStore, constructSyncSourceDisplayName, createMockStore, createViewObjectForNewMap, drawingToolActions, drawingToolListener, drawingToolReducer, selectors as drawingToolSelectors, filterLayers$1 as filterLayers, genericActions, genericListener, selectors$5 as genericSelectors, getSingularDrawtoolDrawLayerId, getUserAddedServices, getViewObjectForMapId, getViewObjectForSyncGroup, initialState$3 as initialState, layerActions, layerReducer, selectors$2 as layerSelectors, types$2 as layerTypes, utils$1 as layerUtils, layersListener, constants as linkComponentTypesConstants, loadingIndicatorActions, constants$1 as loadingIndicatorConstants, loadingIndicatorReducer, selectors$4 as loadingIndicatorSelectors, mapActions, enums as mapEnums, mapListener, mapReducer, selectors$1 as mapSelectors, types$3 as mapTypes, mapUtils, metronomeListener, openlayersListener, routerActions, routerListener, routerReducer, utils as routerUtils, selectorMemoizationOptions, serviceActions, serviceListener, serviceReducer, selectors$7 as serviceSelectors, setUserAddedServices, storeMiddlewares, storeReducerMap, storeTestSettings, storeTestUtils, utils$3 as storeUtils, constants$2 as syncConstants, syncGroupsActions, syncGroupsListener, syncGroupsReducer, selector as syncGroupsSelector, selectors$6 as syncGroupsSelectors, types$1 as syncGroupsTypes, types$1 as types, uiActions, uiReducer, selectors$3 as uiSelectors, types as uiTypes, unifyReducerMaps, useSetupDialog, useSyncgroupTimeState, useUpdateSharedData };