@opengeoweb/core 4.3.0 → 4.4.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.
Files changed (77) hide show
  1. package/index.esm.js +1055 -459
  2. package/index.umd.js +1108 -443
  3. package/lib/components/CanvasComponent/CanvasComponent.d.ts +6 -6
  4. package/lib/components/ConfigurableMap/ConfigurableMapConnect.d.ts +1 -0
  5. package/lib/components/LayerManager/LayerContainerRow/LayerRow/RenderLayers/RenderLayers.d.ts +1 -1
  6. package/lib/components/LayerManager/LayerContainerRow/LayerRow/RenderStyles/RenderStyles.d.ts +1 -1
  7. package/lib/components/LayerManager/LayerSelect/ServiceOptionsDialog/ServiceOptionsDialog.d.ts +2 -0
  8. package/lib/components/LayerManager/LayerSelect/ServiceOptionsDialog/ServiceOptionsDialogConnect.d.ts +2 -0
  9. package/lib/components/LayerManager/LayerSelect/ServicePopup/utils.d.ts +2 -0
  10. package/lib/components/LayerManager/useFetchServices.d.ts +1 -1
  11. package/lib/components/MultiMapView/ModelRunInterval/ModelRunInterval.d.ts +6 -0
  12. package/lib/components/MultiMapView/MultiMapViewConnect.d.ts +1 -0
  13. package/lib/components/ReactMapView/AdagucMapDraw.d.ts +1 -1
  14. package/lib/components/ReactMapView/AdagucMapDrawTools.d.ts +1 -1
  15. package/lib/components/ReactMapView/ReactMapView.d.ts +5 -5
  16. package/lib/components/ReactMapView/ReactMapViewParseLayer.d.ts +2 -2
  17. package/lib/components/SyncGroups/SimpleTimeSliderConnect.d.ts +9 -1
  18. package/lib/components/SyncGroups/selector.d.ts +6 -6
  19. package/lib/components/TimeSlider/TimeSlider.stories.d.ts +15 -0
  20. package/lib/components/TimeSlider/TimeSliderButtons/AutoUpdateButton/AutoUpdateButtonConnect.d.ts +13 -1
  21. package/lib/components/TimeSlider/TimeSliderButtons/BackwardForwardStepButton/BackwardForwardStepButton.d.ts +10 -0
  22. package/lib/components/TimeSlider/TimeSliderButtons/BackwardForwardStepButton/BackwardForwardStepButton.spec.d.ts +1 -0
  23. package/lib/components/TimeSlider/TimeSliderButtons/BackwardForwardStepButton/BackwardForwardStepButtonConnect.d.ts +6 -0
  24. package/lib/components/TimeSlider/TimeSliderButtons/BackwardForwardStepButton/BackwardForwardStepButtonConnect.spec.d.ts +1 -0
  25. package/lib/components/TimeSlider/TimeSliderButtons/HideSliderButton/HideSliderButton.d.ts +7 -0
  26. package/lib/components/TimeSlider/TimeSliderButtons/HideSliderButton/HideSliderButton.spec.d.ts +1 -0
  27. package/lib/components/TimeSlider/TimeSliderButtons/OptionsMenuButton/OptionsMenuButton.d.ts +2 -1
  28. package/lib/components/TimeSlider/TimeSliderButtons/OptionsMenuButton/OptionsMenuButton.stories.d.ts +24 -0
  29. package/lib/components/TimeSlider/TimeSliderButtons/PlayButton/PlayButtonConnect.d.ts +19 -18
  30. package/lib/components/TimeSlider/TimeSliderButtons/TimeSliderButtons.d.ts +2 -0
  31. package/lib/components/TimeSlider/TimeSliderClock/TimeSliderClock.d.ts +5 -0
  32. package/lib/components/TimeSlider/TimeSliderClock/TimeSliderClock.stories.d.ts +24 -0
  33. package/lib/components/TimeSlider/TimeSliderClock/TimeSliderClockConnect.d.ts +4 -0
  34. package/lib/components/TimeSlider/TimeSliderClock/TimeSliderClockConnect.spec.d.ts +1 -0
  35. package/lib/components/TimeSlider/TimeSliderConnect.d.ts +12 -1
  36. package/lib/components/TimeSlider/TimeSliderLegend/TimeSliderLegend.d.ts +1 -1
  37. package/lib/components/TimeSlider/TimeSliderLegend/TimeSliderLegendConnect.d.ts +22 -3
  38. package/lib/components/TimeSlider/TimeSliderLegend/TimeSliderLegendRenderFunctions.d.ts +1 -1
  39. package/lib/components/TimeSlider/TimeSliderRail/TimeSliderRailConnect.d.ts +22 -3
  40. package/lib/components/TimeSlider/TimeSliderRail/TimeSliderRailRenderFunctions.d.ts +1 -1
  41. package/lib/components/TimeSlider/TimeSliderUtils.d.ts +4 -1
  42. package/lib/components/WMSLoader/WMSLayerTree/WMSLayerTreeConnect.d.ts +11 -1
  43. package/lib/index.d.ts +52 -52
  44. package/lib/store/coreModuleConfig.d.ts +1 -1
  45. package/lib/store/generic/actions.d.ts +2 -2
  46. package/lib/store/generic/config.d.ts +3 -2
  47. package/lib/store/generic/index.d.ts +10 -10
  48. package/lib/store/generic/selectors.d.ts +7 -7
  49. package/lib/store/generic/synchronizationGroups/reducer.d.ts +2 -2
  50. package/lib/store/generic/synchronizationGroups/selectors.d.ts +13 -13
  51. package/lib/store/layerSelect/config.d.ts +3 -2
  52. package/lib/store/layerSelect/reducer.d.ts +1 -1
  53. package/lib/store/layerSelect/sagas.d.ts +3 -1
  54. package/lib/store/layerSelect/selectors.d.ts +54 -54
  55. package/lib/store/mapStore/config.d.ts +3 -2
  56. package/lib/store/mapStore/layers/reducer.d.ts +1 -1
  57. package/lib/store/mapStore/layers/selectors.d.ts +129 -109
  58. package/lib/store/mapStore/layers/types.d.ts +2 -1
  59. package/lib/store/mapStore/map/actions.d.ts +2 -2
  60. package/lib/store/mapStore/map/reducer.d.ts +33 -33
  61. package/lib/store/mapStore/map/sagas.d.ts +2 -1
  62. package/lib/store/mapStore/map/selectors.d.ts +297 -297
  63. package/lib/store/mapStore/service/reducer.d.ts +1 -1
  64. package/lib/store/mapStore/service/selectors.d.ts +36 -36
  65. package/lib/store/mapStore/service/types.d.ts +1 -0
  66. package/lib/store/snackbar/config.d.ts +3 -2
  67. package/lib/store/snackbar/reducer.d.ts +1 -1
  68. package/lib/store/snackbar/selectors.d.ts +2 -2
  69. package/lib/store/ui/config.d.ts +3 -2
  70. package/lib/store/ui/reducer.d.ts +1 -1
  71. package/lib/store/ui/selectors.d.ts +30 -30
  72. package/lib/storybookUtils/store.d.ts +1 -1
  73. package/lib/utils/__mocks__/getCapabilities.d.ts +24 -22
  74. package/lib/utils/defaultConfigurations.d.ts +2 -2
  75. package/lib/utils/defaultTestSettings.d.ts +1 -1
  76. package/lib/utils/testUtils.d.ts +1 -1
  77. package/package.json +11 -9
package/index.esm.js CHANGED
@@ -3,13 +3,13 @@ import produce$1, { current, produce } from 'immer';
3
3
  import moment from 'moment';
4
4
  import * as React from 'react';
5
5
  import React__default, { Component, useRef, useState, useEffect, useCallback } from 'react';
6
- import _, { isEqual, debounce, groupBy, throttle, range } from 'lodash';
7
- import { takeLatest, put, select, call, all, takeEvery, delay } from 'redux-saga/effects';
6
+ import _, { debounce, isEqual, groupBy, throttle, range } from 'lodash';
7
+ import { takeLatest, put, select, call, takeEvery, all, delay } from 'redux-saga/effects';
8
8
  import { connect, useDispatch, useSelector, Provider } from 'react-redux';
9
- import { Tooltip, Paper, Box, Typography, Grid, InputLabel, IconButton, CircularProgress, List, ListSubheader, ListItem, ListItemText, Dialog, DialogTitle, DialogContent, DialogContentText, TextField, DialogActions, Button, MenuItem, FormControl, LinearProgress, InputAdornment, ListItemSecondaryAction, ListItemIcon, Checkbox, Switch, styled, Slider, Menu, Popover, useTheme, Snackbar } from '@mui/material';
10
- import { ToolButton, ToolContainerDraggable, TooltipSelect, AlertIcon, tooltipContainerStyles, sliderHeaderStyle, CustomSlider, ToggleMenu, ManagerButton, EnableButton, AlertBanner, ManagerDeleteButton, calculateDialogSizeAndPosition, CustomToggleButton, useIsMounted } from '@opengeoweb/shared';
11
- import { Pause, Play, Cached, Add, Copy, Flag, DragHandle as DragHandle$1, Filter, Search, Clear, Close, Info, DimensionsOther, DimensionsElevation, DimensionsRefTime, DimensionsTime, Edit, Visibility, Delete, Home, Minus, Layers, Equalizer, Link, LinkOff, AutoUpdateActive, AutoUpdateInActive, TextIcon, Speed, FastForward, Clock, Now, Options, List as List$1, ThemeWrapper, lightTheme } from '@opengeoweb/theme';
12
- import { legendImageStore, WMImageEventType, getLegendGraphicURLForLayer, WMGetServiceFromStore, LayerType as LayerType$1, getMapImageStore, WMBBOX, debug, DebugType, WMJSMap, WMLayer } from '@opengeoweb/webmap';
9
+ import { Tooltip, Paper, Box, Typography, Grid, InputLabel, IconButton, CircularProgress, List, ListSubheader, ListItem, ListItemText, Dialog, DialogTitle, DialogContent, DialogContentText, TextField, DialogActions, Button, MenuItem, FormControl, LinearProgress, InputAdornment, Backdrop, ListItemSecondaryAction, ListItemIcon, Checkbox, Switch, styled, Slider, Menu, Popper, useTheme, Snackbar } from '@mui/material';
10
+ import { ToolButton, ToolContainerDraggable, TooltipSelect, AlertIcon, tooltipContainerStyles, sliderHeaderStyle, CustomSlider, ToggleMenu, ManagerButton, EnableButton, AlertBanner, ManagerDeleteButton, calculateDialogSizeAndPosition, CustomToggleButton, useIsMounted, useMakeSureContainerStaysInsideWindow, withEggs } from '@opengeoweb/shared';
11
+ import { Pause, Play, Cached, Add, Copy, Flag, DragHandle as DragHandle$1, Filter, Search, Clear, Close, Info, DimensionsOther, DimensionsElevation, DimensionsRefTime, DimensionsTime, Edit, Visibility, Delete, Home, Minus, Layers, Equalizer, Link, LinkOff, AutoUpdateActive, AutoUpdateInActive, TextIcon, Speed, FastForward, Clock, Now, Options, StepForward, StepBackward, ChevronDown, ChevronUp, List as List$1, Resize, ThemeWrapper, lightTheme } from '@opengeoweb/theme';
12
+ import { legendImageStore, WMImageEventType, getLegendGraphicURLForLayer, WMGetServiceFromStore, LayerType as LayerType$1, clearImageCache, getMapImageStore, WMBBOX, debug, DebugType, WMJSMap, WMLayer } from '@opengeoweb/webmap';
13
13
  import { ReactSortable } from 'react-sortablejs';
14
14
  import Sortable from 'sortablejs';
15
15
  import { ReactHookFormProvider, defaultFormOptions, ReactHookFormTextField } from '@opengeoweb/form-fields';
@@ -23,8 +23,11 @@ import { debounce as debounce$1 } from 'throttle-debounce';
23
23
  import cloneDeep from 'lodash.clonedeep';
24
24
  import proj4 from 'proj4';
25
25
  import * as turf from '@turf/turf';
26
- import { createStore, DynamicModuleLoader } from 'redux-dynamic-modules';
27
- import { getSagaExtension } from 'redux-dynamic-modules-saga';
26
+ import { Box as Box$2 } from '@mui/system';
27
+ import Draggable from 'react-draggable';
28
+ import { Resizable } from 're-resizable';
29
+ import { createStore } from '@redux-eggs/redux-toolkit';
30
+ import { getSagaExtension } from '@redux-eggs/saga-extension';
28
31
 
29
32
  function _typeof(obj) {
30
33
  "@babel/helpers - typeof";
@@ -363,6 +366,7 @@ var LayerActionOrigin;
363
366
  LayerActionOrigin["ReactMapViewParseLayer"] = "ReactMapViewParseLayer";
364
367
  LayerActionOrigin["setLayerDimensionSaga"] = "setLayerDimensionSaga";
365
368
  LayerActionOrigin["toggleAutoUpdateSaga"] = "toggleAutoUpdateSaga";
369
+ LayerActionOrigin["unregisterMapSaga"] = "unregisterMapSaga";
366
370
  })(LayerActionOrigin || (LayerActionOrigin = {}));
367
371
 
368
372
  /* *
@@ -611,6 +615,11 @@ var getSpeedDelay = function getSpeedDelay(speedFactor) {
611
615
  var getSpeedFactor = function getSpeedFactor(speedDelay) {
612
616
  return defaultDelay / speedDelay;
613
617
  };
618
+ var getSelectedTime = function getSelectedTime(timeDimension) {
619
+ var currentValueIsValid = timeDimension && timeDimension.currentValue && moment.utc(timeDimension.currentValue).isValid();
620
+ var selectedTime = currentValueIsValid && timeDimension ? moment.utc(timeDimension.currentValue).unix() : moment.utc().unix();
621
+ return selectedTime;
622
+ };
614
623
  /**
615
624
  * Returns time bounds from the given dimension. If no time dimension given, current time is returned as default
616
625
  */
@@ -620,13 +629,12 @@ var getTimeBounds = function getTimeBounds(dimensions) {
620
629
  second: 0,
621
630
  millisecond: 0
622
631
  }).unix();
623
- var timeDimension = dimensions ? dimensions.find(function (dim) {
632
+ var timeDimension = dimensions === null || dimensions === void 0 ? void 0 : dimensions.find(function (dim) {
624
633
  return dim.name === 'time';
625
- }) : null;
634
+ });
626
635
  var startTime = timeDimension && timeDimension.minValue ? moment.utc(timeDimension.minValue).unix() : defaultStartEnd;
627
636
  var endTime = timeDimension && timeDimension.maxValue ? moment.utc(timeDimension.maxValue).unix() : defaultStartEnd;
628
- var currentValueIsValid = timeDimension && timeDimension.currentValue && moment.utc(timeDimension.currentValue).isValid();
629
- var selectedTime = currentValueIsValid ? moment.utc(timeDimension.currentValue).unix() : moment.utc().unix();
637
+ var selectedTime = getSelectedTime(timeDimension);
630
638
  return {
631
639
  selectedTime: selectedTime,
632
640
  startTime: startTime,
@@ -661,22 +669,12 @@ var timestampToPixel = function timestampToPixel(timestamp, centerTime, widthPx,
661
669
  var pixelToTimestamp = function pixelToTimestamp(timePx, centerTime, widthPx, secondsPerPx) {
662
670
  return centerTime - (widthPx / 2 - timePx) * secondsPerPx;
663
671
  };
664
- var onSetNewDateDebouncer;
665
672
  var onsetNewDateDebounced = function onsetNewDateDebounced(dateToSet, onSetNewDate) {
666
- /* Debounce the dateToSet with a simple timeout */
667
- if (onSetNewDateDebouncer === undefined) {
668
- onSetNewDateDebouncer = dateToSet;
673
+ debounce(function () {
669
674
  onSetNewDate(dateToSet);
670
- window.setTimeout(function () {
671
- if (onSetNewDateDebouncer !== undefined && onSetNewDateDebouncer !== dateToSet) {
672
- onSetNewDate(onSetNewDateDebouncer);
673
- }
674
-
675
- onSetNewDateDebouncer = undefined;
676
- }, 10);
677
- } else {
678
- onSetNewDateDebouncer = dateToSet;
679
- }
675
+ }, 10, {
676
+ leading: true
677
+ })();
680
678
  };
681
679
  var roundWithTimeStep = function roundWithTimeStep(unixTime, timeStep, type) {
682
680
  var adjustedTimeStep = timeStep * 60;
@@ -698,7 +696,9 @@ var roundWithTimeStep = function roundWithTimeStep(unixTime, timeStep, type) {
698
696
  var setNewRoundedTime = function setNewRoundedTime(x, centerTime, width, secondsPerPx, timeStep, dataStartTime, dataEndTime, onSetNewDate) {
699
697
  var unixTime = pixelToTimestamp(x, centerTime, width, secondsPerPx);
700
698
  var roundedTime = roundWithTimeStep(unixTime, timeStep);
701
- var selectedTimeString = moment.unix(Math.min(Math.max(roundedTime, dataStartTime), dataEndTime)).toISOString();
699
+ var maxTime = Math.max(roundedTime, dataStartTime);
700
+ var newTime = Math.min(maxTime, dataEndTime || roundedTime);
701
+ var selectedTimeString = moment.unix(newTime).toISOString();
702
702
  onsetNewDateDebounced(selectedTimeString, onSetNewDate);
703
703
  };
704
704
  var getDataLimitsFromLayers = function getDataLimitsFromLayers(layers) {
@@ -725,6 +725,32 @@ var getDataLimitsFromLayers = function getDataLimitsFromLayers(layers) {
725
725
  */
726
726
  [2147483647, 0]);
727
727
  };
728
+ var setPreviousTimeStep = function setPreviousTimeStep(timeStep, curTime, dataStartTime, onSetNewDate) {
729
+ var prevTimeStep = moment.utc(curTime).subtract(timeStep, 'm').toISOString();
730
+
731
+ if (!prevTimeStep) {
732
+ return;
733
+ }
734
+
735
+ if (moment.utc(prevTimeStep) < moment.utc(dataStartTime * millisecondsInSecond)) {
736
+ return;
737
+ }
738
+
739
+ onsetNewDateDebounced(prevTimeStep, onSetNewDate);
740
+ };
741
+ var setNextTimeStep = function setNextTimeStep(timeStep, curTime, dataEndTime, onSetNewDate) {
742
+ var nextTimeStep = moment.utc(curTime).add(timeStep, 'm').toISOString();
743
+
744
+ if (!nextTimeStep) {
745
+ return;
746
+ }
747
+
748
+ if (moment.utc(nextTimeStep) > moment.utc(dataEndTime * millisecondsInSecond)) {
749
+ return;
750
+ }
751
+
752
+ onsetNewDateDebounced(nextTimeStep, onSetNewDate);
753
+ };
728
754
  var getTimeStepFromDataInterval = function getTimeStepFromDataInterval(timeInterval) {
729
755
  switch (timeInterval.isRegularInterval) {
730
756
  case false:
@@ -2787,6 +2813,22 @@ var getAllLayers = createSelector(getLayersIds, getLayersById, function (ids, la
2787
2813
  return layers[layerId];
2788
2814
  });
2789
2815
  }, selectorMemoizationOptions);
2816
+ /**
2817
+ * Retrieves all layers (including base layers and overlayers) for the given mapId
2818
+ *
2819
+ * Example: layers = getLayersByMapId(store, mapId)
2820
+ * @param {object} store store: object - object from which the layers state will be extracted
2821
+ * @param {string} mapId mapId: string - mapId
2822
+ * @returns {array} returnType: ReduxLayer[] - an array of all layers containing layer information (service, name, style, enabled etc.)
2823
+ */
2824
+
2825
+ var getLayersByMapId = createSelector(getAllLayers, function (_store, _mapId) {
2826
+ return _mapId;
2827
+ }, function (layers, mapId) {
2828
+ return layers.filter(function (layer) {
2829
+ return layer.mapId === mapId;
2830
+ });
2831
+ }, selectorMemoizationOptions);
2790
2832
  /**
2791
2833
  * Retrieves all layers that aren't base layers and aren't overlayers
2792
2834
  *
@@ -4850,8 +4892,8 @@ var syncGroupStore = function syncGroupStore(store) {
4850
4892
  * @returns {object} returnType: SynchronizationGroupState
4851
4893
  */
4852
4894
 
4853
- createSelector(syncGroupStore, function (store) {
4854
- return store || [];
4895
+ var getSynchronizationGroupState = createSelector(syncGroupStore, function (store) {
4896
+ return store || null;
4855
4897
  });
4856
4898
  var getSynchronizationGroup = function getSynchronizationGroup(state, id) {
4857
4899
  return syncGroupStore(state).groups.byId[id];
@@ -5153,7 +5195,7 @@ var getMapBaseLayerActionsTargets = function getMapBaseLayerActionsTargets(state
5153
5195
  var _marked$5 = /*#__PURE__*/regeneratorRuntime.mark(setTimeSaga),
5154
5196
  _marked2$5 = /*#__PURE__*/regeneratorRuntime.mark(setBBoxSaga),
5155
5197
  _marked3$4 = /*#__PURE__*/regeneratorRuntime.mark(layerActionsSaga),
5156
- _marked4$2 = /*#__PURE__*/regeneratorRuntime.mark(addLayerActionsSaga),
5198
+ _marked4$3 = /*#__PURE__*/regeneratorRuntime.mark(addLayerActionsSaga),
5157
5199
  _marked5$2 = /*#__PURE__*/regeneratorRuntime.mark(deleteLayerActionsSaga),
5158
5200
  _marked6$1 = /*#__PURE__*/regeneratorRuntime.mark(moveLayerActionsSaga),
5159
5201
  _marked7$1 = /*#__PURE__*/regeneratorRuntime.mark(setActiveLayerIdActionsSaga),
@@ -5307,7 +5349,7 @@ function addLayerActionsSaga(_ref4) {
5307
5349
  return _context4.stop();
5308
5350
  }
5309
5351
  }
5310
- }, _marked4$2);
5352
+ }, _marked4$3);
5311
5353
  }
5312
5354
  function deleteLayerActionsSaga(_ref5) {
5313
5355
  var payload, type, targets;
@@ -5610,7 +5652,7 @@ var createSyncGroupViewStateSelector = createSelector(groups, sources, createSyn
5610
5652
  var _marked$4 = /*#__PURE__*/regeneratorRuntime.mark(updateSourceValueWhenLinkingComponentToGroupSaga),
5611
5653
  _marked2$4 = /*#__PURE__*/regeneratorRuntime.mark(addGroupTargetSaga),
5612
5654
  _marked3$3 = /*#__PURE__*/regeneratorRuntime.mark(linkGroupTargetSaga),
5613
- _marked4$1 = /*#__PURE__*/regeneratorRuntime.mark(updateViewStateSaga),
5655
+ _marked4$2 = /*#__PURE__*/regeneratorRuntime.mark(updateViewStateSaga),
5614
5656
  _marked5$1 = /*#__PURE__*/regeneratorRuntime.mark(rootSaga$4);
5615
5657
  function updateSourceValueWhenLinkingComponentToGroupSaga(groupId, targetToUpdate) {
5616
5658
  var group;
@@ -5749,7 +5791,7 @@ function updateViewStateSaga() {
5749
5791
  return _context4.stop();
5750
5792
  }
5751
5793
  }
5752
- }, _marked4$1);
5794
+ }, _marked4$2);
5753
5795
  }
5754
5796
 
5755
5797
  function rootSaga$4() {
@@ -5800,25 +5842,9 @@ function rootSaga$4() {
5800
5842
  }, _marked5$1);
5801
5843
  }
5802
5844
 
5803
- /* *
5804
- * Licensed under the Apache License, Version 2.0 (the "License");
5805
- * you may not use this file except in compliance with the License.
5806
- * You may obtain a copy of the License at
5807
- *
5808
- * http://www.apache.org/licenses/LICENSE-2.0
5809
- *
5810
- * Unless required by applicable law or agreed to in writing, software
5811
- * distributed under the License is distributed on an "AS IS" BASIS,
5812
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
5813
- * See the License for the specific language governing permissions and
5814
- * limitations under the License.
5815
- *
5816
- * Copyright 2020 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
5817
- * Copyright 2020 - Finnish Meteorological Institute (FMI)
5818
- * */
5819
5845
  var synchronizationGroupConfig = {
5820
5846
  id: 'syncronizationGroupStore-module',
5821
- reducerMap: {
5847
+ reducersMap: {
5822
5848
  syncronizationGroupStore: reducer$2
5823
5849
  },
5824
5850
  sagas: [rootSaga$5, rootSaga$4]
@@ -5949,12 +5975,12 @@ function rootSaga$3() {
5949
5975
  * See the License for the specific language governing permissions and
5950
5976
  * limitations under the License.
5951
5977
  *
5952
- * Copyright 2021 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
5953
- * Copyright 2021 - Finnish Meteorological Institute (FMI)
5978
+ * Copyright 2022 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
5979
+ * Copyright 2022 - Finnish Meteorological Institute (FMI)
5954
5980
  * */
5955
5981
  var uiModuleConfig = {
5956
5982
  id: 'ui-module',
5957
- reducerMap: {
5983
+ reducersMap: {
5958
5984
  ui: reducer$4
5959
5985
  },
5960
5986
  sagas: [rootSaga$3]
@@ -6273,7 +6299,7 @@ var KNMIgeoservicesRadar = {
6273
6299
  };
6274
6300
  var KNMIgeoservicesObs = {
6275
6301
  name: 'KNMIgeoservicesObs',
6276
- url: 'https://geoservices.knmi.nl/adagucserver?dataset=OBS&service=WMS&',
6302
+ url: 'https://geoservices.knmi.nl/adagucserver?dataset=OBS',
6277
6303
  id: 'KNMIgeoservicesObs'
6278
6304
  };
6279
6305
  var KNMIgeoservicesKlimaatAtlas = {
@@ -6950,11 +6976,11 @@ var CanvasComponent = /*#__PURE__*/function (_Component) {
6950
6976
  return;
6951
6977
  }
6952
6978
 
6953
- if (parseInt(this.ctx.canvas.height, 10) !== this.currentHeight) {
6979
+ if (this.ctx.canvas.height !== this.currentHeight) {
6954
6980
  this.ctx.canvas.height = this.currentHeight;
6955
6981
  }
6956
6982
 
6957
- if (parseInt(this.ctx.canvas.width, 10) !== this.currentWidth) {
6983
+ if (this.ctx.canvas.width !== this.currentWidth) {
6958
6984
  this.ctx.canvas.width = this.currentWidth;
6959
6985
  }
6960
6986
 
@@ -7552,13 +7578,14 @@ var LegendConnect = function LegendConnect(_a) {
7552
7578
  var _marked$2 = /*#__PURE__*/regeneratorRuntime.mark(startAnimationSaga),
7553
7579
  _marked2$2 = /*#__PURE__*/regeneratorRuntime.mark(stopAnimationSaga),
7554
7580
  _marked3$1 = /*#__PURE__*/regeneratorRuntime.mark(deleteLayerSaga),
7555
- _marked4 = /*#__PURE__*/regeneratorRuntime.mark(updateAnimation),
7581
+ _marked4$1 = /*#__PURE__*/regeneratorRuntime.mark(updateAnimation),
7556
7582
  _marked5 = /*#__PURE__*/regeneratorRuntime.mark(setLayerDimensionsSaga),
7557
7583
  _marked6 = /*#__PURE__*/regeneratorRuntime.mark(toggleAutoUpdateSaga),
7558
7584
  _marked7 = /*#__PURE__*/regeneratorRuntime.mark(handleBaseLayersSaga),
7559
7585
  _marked8 = /*#__PURE__*/regeneratorRuntime.mark(setMapPresetSaga),
7560
7586
  _marked9 = /*#__PURE__*/regeneratorRuntime.mark(checkMapPresetForChangesSaga),
7561
- _marked10 = /*#__PURE__*/regeneratorRuntime.mark(rootSaga$2);
7587
+ _marked10 = /*#__PURE__*/regeneratorRuntime.mark(unregisterMapSaga),
7588
+ _marked11 = /*#__PURE__*/regeneratorRuntime.mark(rootSaga$2);
7562
7589
 
7563
7590
  var generateTimeList = function generateTimeList(start, end, interval) {
7564
7591
  var timeList = [];
@@ -7724,7 +7751,7 @@ function updateAnimation(mapId, maxValue) {
7724
7751
  return _context4.stop();
7725
7752
  }
7726
7753
  }
7727
- }, _marked4);
7754
+ }, _marked4$1);
7728
7755
  }
7729
7756
  function setLayerDimensionsSaga(_ref4) {
7730
7757
  var payload, layerDimensions, dimensions, layerId, layer, newTimeDimension, mapId, activeLayerId, shouldAutoUpdate, prevTimeDimension, isAnimating$1, webmapInstance;
@@ -8234,67 +8261,85 @@ function checkMapPresetForChangesSaga(action) {
8234
8261
  }
8235
8262
  }, _marked9);
8236
8263
  }
8237
- function rootSaga$2() {
8238
- return regeneratorRuntime.wrap(function rootSaga$(_context10) {
8264
+ function unregisterMapSaga(_ref7) {
8265
+ var payload, mapId, layerList;
8266
+ return regeneratorRuntime.wrap(function unregisterMapSaga$(_context10) {
8239
8267
  while (1) {
8240
8268
  switch (_context10.prev = _context10.next) {
8241
8269
  case 0:
8242
- _context10.next = 2;
8270
+ payload = _ref7.payload;
8271
+ mapId = payload.mapId;
8272
+ _context10.next = 4;
8273
+ return select(getLayersByMapId, mapId);
8274
+
8275
+ case 4:
8276
+ layerList = _context10.sent;
8277
+ _context10.next = 7;
8278
+ return all(layerList.map(function (layer) {
8279
+ return put(layerActions.layerDelete({
8280
+ mapId: mapId,
8281
+ layerId: layer.id,
8282
+ layerIndex: 0,
8283
+ origin: LayerActionOrigin.unregisterMapSaga
8284
+ }));
8285
+ }));
8286
+
8287
+ case 7:
8288
+ case "end":
8289
+ return _context10.stop();
8290
+ }
8291
+ }
8292
+ }, _marked10);
8293
+ }
8294
+ function rootSaga$2() {
8295
+ return regeneratorRuntime.wrap(function rootSaga$(_context11) {
8296
+ while (1) {
8297
+ switch (_context11.prev = _context11.next) {
8298
+ case 0:
8299
+ _context11.next = 2;
8243
8300
  return all([takeLatest(mapActions$1.mapStopAnimation.type, stopAnimationSaga), takeLatest(mapActions$1.setActiveMapPresetId.type, stopAnimationSaga)]);
8244
8301
 
8245
8302
  case 2:
8246
- _context10.next = 4;
8303
+ _context11.next = 4;
8247
8304
  return takeLatest(mapActions$1.mapStartAnimation.type, startAnimationSaga);
8248
8305
 
8249
8306
  case 4:
8250
- _context10.next = 6;
8307
+ _context11.next = 6;
8251
8308
  return takeLatest(layerActions.layerDelete.type, deleteLayerSaga);
8252
8309
 
8253
8310
  case 6:
8254
- _context10.next = 8;
8311
+ _context11.next = 8;
8255
8312
  return takeLatest(layerActions.onUpdateLayerInformation.type, setLayerDimensionsSaga);
8256
8313
 
8257
8314
  case 8:
8258
- _context10.next = 10;
8315
+ _context11.next = 10;
8259
8316
  return takeLatest(mapActions$1.toggleAutoUpdate.type, toggleAutoUpdateSaga);
8260
8317
 
8261
8318
  case 10:
8262
- _context10.next = 12;
8319
+ _context11.next = 12;
8263
8320
  return takeEvery(mapActions$1.setMapPreset.type, setMapPresetSaga);
8264
8321
 
8265
8322
  case 12:
8266
- _context10.next = 14;
8323
+ _context11.next = 14;
8267
8324
  return all(mapPresetChangeActions.map(function (action) {
8268
8325
  return takeEvery(action, checkMapPresetForChangesSaga);
8269
8326
  }));
8270
8327
 
8271
8328
  case 14:
8329
+ _context11.next = 16;
8330
+ return takeEvery(mapActions$1.unregisterMap.type, unregisterMapSaga);
8331
+
8332
+ case 16:
8272
8333
  case "end":
8273
- return _context10.stop();
8334
+ return _context11.stop();
8274
8335
  }
8275
8336
  }
8276
- }, _marked10);
8337
+ }, _marked11);
8277
8338
  }
8278
8339
 
8279
- /* *
8280
- * Licensed under the Apache License, Version 2.0 (the "License");
8281
- * you may not use this file except in compliance with the License.
8282
- * You may obtain a copy of the License at
8283
- *
8284
- * http://www.apache.org/licenses/LICENSE-2.0
8285
- *
8286
- * Unless required by applicable law or agreed to in writing, software
8287
- * distributed under the License is distributed on an "AS IS" BASIS,
8288
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
8289
- * See the License for the specific language governing permissions and
8290
- * limitations under the License.
8291
- *
8292
- * Copyright 2020 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
8293
- * Copyright 2020 - Finnish Meteorological Institute (FMI)
8294
- * */
8295
8340
  var moduleConfig = {
8296
8341
  id: 'webmap-module',
8297
- reducerMap: {
8342
+ reducersMap: {
8298
8343
  webmap: reducer$3,
8299
8344
  services: reducer$5,
8300
8345
  layers: reducer$6
@@ -8354,17 +8399,27 @@ var isNoIdService = function isNoIdService(param) {
8354
8399
  };
8355
8400
 
8356
8401
  var _marked$1 = /*#__PURE__*/regeneratorRuntime.mark(newServiceAddedSaga),
8357
- _marked2$1 = /*#__PURE__*/regeneratorRuntime.mark(layerSelectRemoveServiceSaga),
8358
- _marked3 = /*#__PURE__*/regeneratorRuntime.mark(rootSaga$1);
8402
+ _marked2$1 = /*#__PURE__*/regeneratorRuntime.mark(layerSelectCloseInfoDialogSaga),
8403
+ _marked3 = /*#__PURE__*/regeneratorRuntime.mark(layerSelectRemoveServiceSaga),
8404
+ _marked4 = /*#__PURE__*/regeneratorRuntime.mark(rootSaga$1);
8359
8405
  function newServiceAddedSaga(capturedAction) {
8360
- var addedService, id, serviceUrl, name, scope, _abstract, keywords, groups;
8406
+ var addedService, id, serviceUrl, name, scope, _abstract, isUpdating, keywords, groups;
8361
8407
 
8362
8408
  return regeneratorRuntime.wrap(function newServiceAddedSaga$(_context) {
8363
8409
  while (1) {
8364
8410
  switch (_context.prev = _context.next) {
8365
8411
  case 0:
8366
8412
  addedService = capturedAction.payload;
8367
- id = addedService.id, serviceUrl = addedService.serviceUrl, name = addedService.name, scope = addedService.scope, _abstract = addedService["abstract"];
8413
+ id = addedService.id, serviceUrl = addedService.serviceUrl, name = addedService.name, scope = addedService.scope, _abstract = addedService["abstract"], isUpdating = addedService.isUpdating;
8414
+
8415
+ if (!isUpdating) {
8416
+ _context.next = 4;
8417
+ break;
8418
+ }
8419
+
8420
+ return _context.abrupt("return");
8421
+
8422
+ case 4:
8368
8423
  keywords = addedService.layers.reduce(function (keywords, layer) {
8369
8424
  var _a;
8370
8425
 
@@ -8383,7 +8438,7 @@ function newServiceAddedSaga(capturedAction) {
8383
8438
 
8384
8439
  return groups;
8385
8440
  }, []);
8386
- _context.next = 6;
8441
+ _context.next = 8;
8387
8442
  return put(layerSelectActions.addFiltersAndActiveServices({
8388
8443
  serviceId: id,
8389
8444
  serviceName: name,
@@ -8394,41 +8449,141 @@ function newServiceAddedSaga(capturedAction) {
8394
8449
  "abstract": _abstract
8395
8450
  }));
8396
8451
 
8397
- case 6:
8452
+ case 8:
8398
8453
  case "end":
8399
8454
  return _context.stop();
8400
8455
  }
8401
8456
  }
8402
8457
  }, _marked$1);
8403
8458
  }
8459
+ function layerSelectCloseInfoDialogSaga(_ref) {
8460
+ var type, payload, togglePayload, activeMapIdPayload, isLayerInfoDialogOpen, _isLayerInfoDialogOpen, filteredLayers, dialogInfo;
8461
+
8462
+ return regeneratorRuntime.wrap(function layerSelectCloseInfoDialogSaga$(_context2) {
8463
+ while (1) {
8464
+ switch (_context2.prev = _context2.next) {
8465
+ case 0:
8466
+ type = _ref.type, payload = _ref.payload;
8467
+ _context2.t0 = type;
8468
+ _context2.next = _context2.t0 === uiActions.setToggleOpenDialog.type ? 4 : _context2.t0 === uiActions.setActiveMapIdForDialog.type ? 9 : 18;
8469
+ break;
8470
+
8471
+ case 4:
8472
+ togglePayload = payload;
8473
+
8474
+ if (!(!togglePayload.setOpen && togglePayload.type === DialogTypes.LayerSelect)) {
8475
+ _context2.next = 8;
8476
+ break;
8477
+ }
8478
+
8479
+ _context2.next = 8;
8480
+ return put(uiActions.setToggleOpenDialog({
8481
+ type: DialogTypes.LayerInfo,
8482
+ setOpen: false
8483
+ }));
8484
+
8485
+ case 8:
8486
+ return _context2.abrupt("break", 31);
8487
+
8488
+ case 9:
8489
+ activeMapIdPayload = payload;
8490
+
8491
+ if (activeMapIdPayload.setOpen) {
8492
+ _context2.next = 17;
8493
+ break;
8494
+ }
8495
+
8496
+ _context2.next = 13;
8497
+ return select(getisDialogOpen, DialogTypes.LayerInfo);
8498
+
8499
+ case 13:
8500
+ isLayerInfoDialogOpen = _context2.sent;
8501
+
8502
+ if (!isLayerInfoDialogOpen) {
8503
+ _context2.next = 17;
8504
+ break;
8505
+ }
8506
+
8507
+ _context2.next = 17;
8508
+ return put(uiActions.setToggleOpenDialog({
8509
+ type: DialogTypes.LayerInfo,
8510
+ setOpen: false
8511
+ }));
8512
+
8513
+ case 17:
8514
+ return _context2.abrupt("break", 31);
8515
+
8516
+ case 18:
8517
+ _context2.next = 20;
8518
+ return select(getisDialogOpen, DialogTypes.LayerInfo);
8519
+
8520
+ case 20:
8521
+ _isLayerInfoDialogOpen = _context2.sent;
8522
+
8523
+ if (!_isLayerInfoDialogOpen) {
8524
+ _context2.next = 31;
8525
+ break;
8526
+ }
8527
+
8528
+ _context2.next = 24;
8529
+ return select(getFilteredLayers);
8530
+
8531
+ case 24:
8532
+ filteredLayers = _context2.sent;
8533
+ _context2.next = 27;
8534
+ return select(getActiveLayerInfo);
8535
+
8536
+ case 27:
8537
+ dialogInfo = _context2.sent;
8538
+
8539
+ if (filteredLayers.map(function (layer) {
8540
+ return layer.text;
8541
+ }).includes(dialogInfo.text)) {
8542
+ _context2.next = 31;
8543
+ break;
8544
+ }
8545
+
8546
+ _context2.next = 31;
8547
+ return put(uiActions.setToggleOpenDialog({
8548
+ type: DialogTypes.LayerInfo,
8549
+ setOpen: false
8550
+ }));
8551
+
8552
+ case 31:
8553
+ case "end":
8554
+ return _context2.stop();
8555
+ }
8556
+ }
8557
+ }, _marked2$1);
8558
+ }
8404
8559
  function layerSelectRemoveServiceSaga(capturedAction) {
8405
8560
  var removedService, serviceId, serviceUrl, results, services, servicesEnabled;
8406
- return regeneratorRuntime.wrap(function layerSelectRemoveServiceSaga$(_context2) {
8561
+ return regeneratorRuntime.wrap(function layerSelectRemoveServiceSaga$(_context3) {
8407
8562
  while (1) {
8408
- switch (_context2.prev = _context2.next) {
8563
+ switch (_context3.prev = _context3.next) {
8409
8564
  case 0:
8410
8565
  removedService = capturedAction.payload;
8411
8566
  serviceId = removedService.serviceId, serviceUrl = removedService.serviceUrl;
8412
- _context2.next = 4;
8567
+ _context3.next = 4;
8413
8568
  return select(getActiveServices);
8414
8569
 
8415
8570
  case 4:
8416
- results = _context2.sent;
8571
+ results = _context3.sent;
8417
8572
  services = results;
8418
8573
  servicesEnabled = Object.values(services).find(function (service) {
8419
8574
  return service.enabled;
8420
8575
  });
8421
8576
 
8422
8577
  if (!(servicesEnabled === undefined)) {
8423
- _context2.next = 10;
8578
+ _context3.next = 10;
8424
8579
  break;
8425
8580
  }
8426
8581
 
8427
- _context2.next = 10;
8428
- return all(Object.entries(services).map(function (_ref) {
8429
- var _ref2 = _slicedToArray(_ref, 2),
8430
- serviceId = _ref2[0],
8431
- service = _ref2[1];
8582
+ _context3.next = 10;
8583
+ return all(Object.entries(services).map(function (_ref2) {
8584
+ var _ref3 = _slicedToArray(_ref2, 2),
8585
+ serviceId = _ref3[0],
8586
+ service = _ref3[1];
8432
8587
 
8433
8588
  return put(layerSelectActions.enableActiveService({
8434
8589
  serviceId: serviceId,
@@ -8437,7 +8592,7 @@ function layerSelectRemoveServiceSaga(capturedAction) {
8437
8592
  }));
8438
8593
 
8439
8594
  case 10:
8440
- _context2.next = 12;
8595
+ _context3.next = 12;
8441
8596
  return put(serviceActions.mapStoreRemoveService({
8442
8597
  id: serviceId,
8443
8598
  serviceUrl: serviceUrl
@@ -8445,13 +8600,13 @@ function layerSelectRemoveServiceSaga(capturedAction) {
8445
8600
 
8446
8601
  case 12:
8447
8602
  case "end":
8448
- return _context2.stop();
8603
+ return _context3.stop();
8449
8604
  }
8450
8605
  }
8451
- }, _marked2$1);
8606
+ }, _marked3);
8452
8607
  }
8453
- function addServiceToLocalStorageSaga(_ref3) {
8454
- var payload = _ref3.payload;
8608
+ function addServiceToLocalStorageSaga(_ref4) {
8609
+ var payload = _ref4.payload;
8455
8610
  var scope = payload.scope,
8456
8611
  name = payload.name,
8457
8612
  serviceUrl = payload.serviceUrl,
@@ -8464,8 +8619,8 @@ function addServiceToLocalStorageSaga(_ref3) {
8464
8619
  "abstract": _abstract2
8465
8620
  })));
8466
8621
  }
8467
- function removeServiceFromLocalStorageSaga(_ref4) {
8468
- var payload = _ref4.payload;
8622
+ function removeServiceFromLocalStorageSaga(_ref5) {
8623
+ var payload = _ref5.payload;
8469
8624
  var serviceUrl = payload.serviceUrl;
8470
8625
  var localStorageServices = getUserAddedServices();
8471
8626
  if (!localStorageServices[serviceUrl]) return;
@@ -8474,52 +8629,40 @@ function removeServiceFromLocalStorageSaga(_ref4) {
8474
8629
  setUserAddedServices(updatedServices);
8475
8630
  }
8476
8631
  function rootSaga$1() {
8477
- return regeneratorRuntime.wrap(function rootSaga$(_context3) {
8632
+ return regeneratorRuntime.wrap(function rootSaga$(_context4) {
8478
8633
  while (1) {
8479
- switch (_context3.prev = _context3.next) {
8634
+ switch (_context4.prev = _context4.next) {
8480
8635
  case 0:
8481
- _context3.next = 2;
8636
+ _context4.next = 2;
8482
8637
  return takeEvery(serviceActions.serviceSetLayers.type, newServiceAddedSaga);
8483
8638
 
8484
8639
  case 2:
8485
- _context3.next = 4;
8640
+ _context4.next = 4;
8486
8641
  return takeEvery(layerSelectActions.layerSelectRemoveService.type, layerSelectRemoveServiceSaga);
8487
8642
 
8488
8643
  case 4:
8489
- _context3.next = 6;
8644
+ _context4.next = 6;
8490
8645
  return takeEvery(serviceActions.serviceSetLayers.type, addServiceToLocalStorageSaga);
8491
8646
 
8492
8647
  case 6:
8493
- _context3.next = 8;
8648
+ _context4.next = 8;
8494
8649
  return takeEvery(serviceActions.mapStoreRemoveService.type, removeServiceFromLocalStorageSaga);
8495
8650
 
8496
8651
  case 8:
8652
+ _context4.next = 10;
8653
+ return takeEvery([uiActions.setToggleOpenDialog.type, uiActions.setActiveMapIdForDialog.type, layerSelectActions.disableActiveService.type, layerSelectActions.toggleFilter.type, layerSelectActions.setSearchFilter.type], layerSelectCloseInfoDialogSaga);
8654
+
8655
+ case 10:
8497
8656
  case "end":
8498
- return _context3.stop();
8657
+ return _context4.stop();
8499
8658
  }
8500
8659
  }
8501
- }, _marked3);
8660
+ }, _marked4);
8502
8661
  }
8503
8662
 
8504
- /* *
8505
- * Licensed under the Apache License, Version 2.0 (the "License");
8506
- * you may not use this file except in compliance with the License.
8507
- * You may obtain a copy of the License at
8508
- *
8509
- * http://www.apache.org/licenses/LICENSE-2.0
8510
- *
8511
- * Unless required by applicable law or agreed to in writing, software
8512
- * distributed under the License is distributed on an "AS IS" BASIS,
8513
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
8514
- * See the License for the specific language governing permissions and
8515
- * limitations under the License.
8516
- *
8517
- * Copyright 2021 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
8518
- * Copyright 2021 - Finnish Meteorological Institute (FMI)
8519
- * */
8520
8663
  var layerSelectConfig = {
8521
8664
  id: 'layerSelect-module',
8522
- reducerMap: {
8665
+ reducersMap: {
8523
8666
  layerSelect: reducer$1
8524
8667
  },
8525
8668
  sagas: [rootSaga$1]
@@ -8620,7 +8763,7 @@ function rootSaga() {
8620
8763
  * */
8621
8764
  var snackbarModuleConfig = {
8622
8765
  id: 'snackbar-module',
8623
- reducerMap: {
8766
+ reducersMap: {
8624
8767
  snackbar: reducer
8625
8768
  },
8626
8769
  sagas: [rootSaga]
@@ -8698,6 +8841,7 @@ var getLayersFromService = function getLayersFromService(serviceUrl) {
8698
8841
  return new Promise(function (resolve, reject) {
8699
8842
  var serviceObject = WMGetServiceFromStore(serviceUrl);
8700
8843
  serviceObject.getNodes(function (nodes) {
8844
+ // TODO: Maarten Plieger, 2022-11-02: Harmonize types and use correct types: https://gitlab.com/opengeoweb/opengeoweb/-/issues/2817
8701
8845
  var layerTree = recurseNodes(nodes);
8702
8846
  resolve(layerTree);
8703
8847
  }, function (error) {
@@ -9084,7 +9228,7 @@ var preset = {
9084
9228
  },
9085
9229
  {
9086
9230
  name: "KNMIgeoservicesObs",
9087
- url: "https://geoservices.knmi.nl/adagucserver?dataset=OBS&service=WMS&",
9231
+ url: "https://geoservices.knmi.nl/adagucserver?dataset=OBS",
9088
9232
  id: "KNMIgeoservicesObs"
9089
9233
  },
9090
9234
  {
@@ -9841,7 +9985,9 @@ var RenderLayers = function RenderLayers(_ref) {
9841
9985
  }, /*#__PURE__*/React.createElement(Typography, {
9842
9986
  variant: "body1",
9843
9987
  sx: {
9844
- fontSize: 'geowebColors.layerManager.tableRowDefaultText.fontSize',
9988
+ fontSize: function fontSize(theme) {
9989
+ return theme.palette.geowebColors.layerManager.tableRowDefaultText.fontSize;
9990
+ },
9845
9991
  color: 'geowebColors.layerManager.tableRowDefaultText.rgba',
9846
9992
  fontWeight: 500
9847
9993
  }
@@ -10231,9 +10377,7 @@ var LayerRow = function LayerRow(_ref) {
10231
10377
  services = _ref.services,
10232
10378
  mapId = _ref.mapId,
10233
10379
  _ref$onLayerRowClick = _ref.onLayerRowClick,
10234
- onLayerRowClick = _ref$onLayerRowClick === void 0 ? function () {
10235
- return null;
10236
- } : _ref$onLayerRowClick,
10380
+ onLayerRowClick = _ref$onLayerRowClick === void 0 ? function () {} : _ref$onLayerRowClick,
10237
10381
  _ref$isEnabled = _ref.isEnabled,
10238
10382
  isEnabled = _ref$isEnabled === void 0 ? true : _ref$isEnabled,
10239
10383
  _ref$isLayerMissing = _ref.isLayerMissing,
@@ -10642,6 +10786,57 @@ var RenderLayersConnect = function RenderLayersConnect(_ref) {
10642
10786
  var isLayerEnabled = useSelector(function (store) {
10643
10787
  return getLayerEnabled(store, layerId);
10644
10788
  });
10789
+ var service = useSelector(function (store) {
10790
+ return getServiceByName(store, layerService);
10791
+ });
10792
+ var serviceSetLayers = React.useCallback(function (payload) {
10793
+ dispatch(serviceActions.serviceSetLayers(payload));
10794
+ }, [dispatch]);
10795
+
10796
+ var addService = function addService(serviceUrl) {
10797
+ return __awaiter(void 0, void 0, void 0, /*#__PURE__*/regeneratorRuntime.mark(function _callee() {
10798
+ var _layers, wmService;
10799
+
10800
+ return regeneratorRuntime.wrap(function _callee$(_context) {
10801
+ while (1) {
10802
+ switch (_context.prev = _context.next) {
10803
+ case 0:
10804
+ _context.prev = 0;
10805
+ _context.next = 3;
10806
+ return getLayersFlattenedFromService(serviceUrl);
10807
+
10808
+ case 3:
10809
+ _layers = _context.sent;
10810
+ wmService = WMGetServiceFromStore(serviceUrl);
10811
+ serviceSetLayers({
10812
+ id: wmService.id,
10813
+ name: wmService.title,
10814
+ serviceUrl: serviceUrl,
10815
+ layers: _layers,
10816
+ scope: 'user',
10817
+ "abstract": wmService["abstract"]
10818
+ });
10819
+ _context.next = 11;
10820
+ break;
10821
+
10822
+ case 8:
10823
+ _context.prev = 8;
10824
+ _context.t0 = _context["catch"](0);
10825
+ console.warn(_context.t0.message);
10826
+
10827
+ case 11:
10828
+ case "end":
10829
+ return _context.stop();
10830
+ }
10831
+ }
10832
+ }, _callee, null, [[0, 8]]);
10833
+ }));
10834
+ };
10835
+
10836
+ if (!service) {
10837
+ addService(layerService);
10838
+ }
10839
+
10645
10840
  var layers = useSelector(function (store) {
10646
10841
  return getLayersFromService$1(store, layerService);
10647
10842
  });
@@ -11572,6 +11767,37 @@ var validateServiceUrl = function validateServiceUrl(value, services) {
11572
11767
 
11573
11768
  return true;
11574
11769
  };
11770
+ var loadWMSService = function loadWMSService(serviceUrl) {
11771
+ var forceReload = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
11772
+ return __awaiter(void 0, void 0, void 0, /*#__PURE__*/regeneratorRuntime.mark(function _callee() {
11773
+ var layers, service;
11774
+ return regeneratorRuntime.wrap(function _callee$(_context) {
11775
+ while (1) {
11776
+ switch (_context.prev = _context.next) {
11777
+ case 0:
11778
+ _context.next = 2;
11779
+ return getLayersFlattenedFromService(serviceUrl, forceReload);
11780
+
11781
+ case 2:
11782
+ layers = _context.sent;
11783
+ service = WMGetServiceFromStore(serviceUrl);
11784
+ return _context.abrupt("return", {
11785
+ id: service.id,
11786
+ name: service.title,
11787
+ serviceUrl: serviceUrl,
11788
+ "abstract": service["abstract"],
11789
+ layers: layers,
11790
+ scope: 'user'
11791
+ });
11792
+
11793
+ case 5:
11794
+ case "end":
11795
+ return _context.stop();
11796
+ }
11797
+ }
11798
+ }, _callee);
11799
+ }));
11800
+ };
11575
11801
 
11576
11802
  var style$1 = {
11577
11803
  textField: {
@@ -11705,8 +11931,7 @@ var ServicePopup = function ServicePopup(_ref2) {
11705
11931
 
11706
11932
  var addNewService = function addNewService(formValues) {
11707
11933
  return __awaiter(void 0, void 0, void 0, /*#__PURE__*/regeneratorRuntime.mark(function _callee2() {
11708
- var layers, serviceLayers, _iterator, _step, object, service;
11709
-
11934
+ var layersForService;
11710
11935
  return regeneratorRuntime.wrap(function _callee2$(_context2) {
11711
11936
  while (1) {
11712
11937
  switch (_context2.prev = _context2.next) {
@@ -11715,55 +11940,26 @@ var ServicePopup = function ServicePopup(_ref2) {
11715
11940
  setIsLoading(true);
11716
11941
  _context2.prev = 2;
11717
11942
  _context2.next = 5;
11718
- return getLayersFromService(formValues.serviceUrl);
11943
+ return loadWMSService(formValues.serviceUrl, true);
11719
11944
 
11720
11945
  case 5:
11721
- layers = _context2.sent;
11722
-
11723
- if (layers.children) {
11724
- serviceLayers = [];
11725
- _iterator = _createForOfIteratorHelper(layers.children);
11726
-
11727
- try {
11728
- for (_iterator.s(); !(_step = _iterator.n()).done;) {
11729
- object = _step.value;
11730
- serviceLayers.push({
11731
- name: object.name,
11732
- text: object.title,
11733
- leaf: object.leaf,
11734
- path: object.path,
11735
- keywords: object.keywords ? object.keywords : [],
11736
- "abstract": object["abstract"] ? object["abstract"] : '',
11737
- styles: object.styles ? object.styles : [],
11738
- dimensions: object.dimensions || [],
11739
- geographicBoundingBox: object.geographicBoundingBox || null
11740
- });
11741
- }
11742
- } catch (err) {
11743
- _iterator.e(err);
11744
- } finally {
11745
- _iterator.f();
11746
- }
11747
-
11748
- service = WMGetServiceFromStore(formValues.serviceUrl);
11749
- serviceSetLayers({
11750
- id: service.id,
11751
- name: formValues.serviceName,
11752
- serviceUrl: formValues.serviceUrl,
11753
- "abstract": formValues.serviceAbstracts,
11754
- layers: serviceLayers,
11755
- scope: 'user'
11756
- });
11757
- setIsLoading(false);
11758
- showSnackbar(getSuccesMessage(formValues.serviceName));
11759
- closePopup();
11760
- }
11761
-
11762
- _context2.next = 13;
11946
+ layersForService = _context2.sent;
11947
+ serviceSetLayers({
11948
+ id: layersForService.id,
11949
+ name: formValues.serviceName,
11950
+ serviceUrl: formValues.serviceUrl,
11951
+ "abstract": formValues.serviceAbstracts,
11952
+ layers: layersForService.layers,
11953
+ scope: 'user'
11954
+ });
11955
+ setIsLoading(false);
11956
+ showSnackbar(getSuccesMessage(formValues.serviceName));
11957
+ closePopup();
11958
+ _context2.next = 16;
11763
11959
  break;
11764
11960
 
11765
- case 9:
11766
- _context2.prev = 9;
11961
+ case 12:
11962
+ _context2.prev = 12;
11767
11963
  _context2.t0 = _context2["catch"](2);
11768
11964
  setIsLoading(false);
11769
11965
  setError(fields.serviceUrl.name, {
@@ -11771,12 +11967,12 @@ var ServicePopup = function ServicePopup(_ref2) {
11771
11967
  type: 'SYSTEM'
11772
11968
  });
11773
11969
 
11774
- case 13:
11970
+ case 16:
11775
11971
  case "end":
11776
11972
  return _context2.stop();
11777
11973
  }
11778
11974
  }
11779
- }, _callee2, null, [[2, 9]]);
11975
+ }, _callee2, null, [[2, 12]]);
11780
11976
  }));
11781
11977
  };
11782
11978
 
@@ -11945,7 +12141,7 @@ var ServicePopup = function ServicePopup(_ref2) {
11945
12141
  InputProps: {
11946
12142
  disableUnderline: isShowPopup
11947
12143
  },
11948
- helperText: !isShowPopup && 'Short description of what this service does',
12144
+ helperText: !isShowPopup ? 'Short description of what this service does' : '',
11949
12145
  sx: style$1.textField,
11950
12146
  defaultValue: ""
11951
12147
  }), !isServiceUrlDisabled && /*#__PURE__*/React.createElement(InitialValidationsTrigger, {
@@ -12557,7 +12753,7 @@ var LayerInfoDialog = function LayerInfoDialog(_ref) {
12557
12753
  source = _ref$source === void 0 ? 'app' : _ref$source,
12558
12754
  dialogHeight = _ref.dialogHeight;
12559
12755
 
12560
- var _a;
12756
+ var _a, _b;
12561
12757
 
12562
12758
  var styles = getLayerStyles(layer);
12563
12759
  var bbox = getLayerBbox(layer);
@@ -12613,7 +12809,7 @@ var LayerInfoDialog = function LayerInfoDialog(_ref) {
12613
12809
  title: layer.text,
12614
12810
  name: layer.name,
12615
12811
  dimensions: layer.dimensions,
12616
- legendURL: layer.styles && layer.styles.length && layer.styles[0].legendURL
12812
+ legendURL: ((_b = layer.styles) === null || _b === void 0 ? void 0 : _b.length) ? layer.styles[0].legendURL : undefined
12617
12813
  })));
12618
12814
  };
12619
12815
 
@@ -13064,6 +13260,7 @@ var ServiceChip = function ServiceChip(_ref) {
13064
13260
  isSelected = _ref.isSelected,
13065
13261
  isDisabled = _ref.isDisabled,
13066
13262
  toggleChip = _ref.toggleChip;
13263
+ var chip = all ? 'all' : service && service.serviceUrl;
13067
13264
  return /*#__PURE__*/React.createElement(Tooltip, {
13068
13265
  title: (service === null || service === void 0 ? void 0 : service["abstract"]) ? "Abstract: ".concat(service["abstract"]) : ''
13069
13266
  }, /*#__PURE__*/React.createElement(CustomToggleButton, {
@@ -13072,10 +13269,10 @@ var ServiceChip = function ServiceChip(_ref) {
13072
13269
  tabIndex: 0,
13073
13270
  "data-testid": all ? 'serviceChipAll' : 'serviceChip',
13074
13271
  onClick: function onClick() {
13075
- return toggleChip(all ? 'all' : service && service.serviceUrl);
13272
+ return toggleChip(chip);
13076
13273
  },
13077
13274
  onKeyPress: function onKeyPress() {
13078
- return toggleChip(all ? 'all' : service && service.serviceUrl);
13275
+ return toggleChip(chip);
13079
13276
  },
13080
13277
  disabled: isDisabled,
13081
13278
  sx: style
@@ -13281,7 +13478,7 @@ var ServiceListConnect = function ServiceListConnect(_ref7) {
13281
13478
  * */
13282
13479
  var styles$1 = {
13283
13480
  servicesContainer: {
13284
- width: '300px',
13481
+ width: '360px',
13285
13482
  maxHeight: '380px',
13286
13483
  top: '140px',
13287
13484
  backgroundColor: 'geowebColors.background.surface',
@@ -13296,6 +13493,10 @@ var styles$1 = {
13296
13493
  backgroundColor: 'geowebColors.background.surface',
13297
13494
  zIndex: 100
13298
13495
  },
13496
+ loading: {
13497
+ position: 'absolute',
13498
+ zIndex: 101
13499
+ },
13299
13500
  footer: {
13300
13501
  display: 'flex',
13301
13502
  justifyContent: 'center',
@@ -13316,8 +13517,11 @@ var styles$1 = {
13316
13517
  var ServiceOptionsDialog = function ServiceOptionsDialog(_ref) {
13317
13518
  var services = _ref.services,
13318
13519
  layerSelectRemoveService = _ref.layerSelectRemoveService,
13520
+ layerSelectReloadService = _ref.layerSelectReloadService,
13319
13521
  selectedLayers = _ref.selectedLayers,
13320
- setServicePopupInfo = _ref.setServicePopupInfo;
13522
+ setServicePopupInfo = _ref.setServicePopupInfo,
13523
+ _ref$isLoading = _ref.isLoading,
13524
+ isLoading = _ref$isLoading === void 0 ? false : _ref$isLoading;
13321
13525
 
13322
13526
  var openAddService = function openAddService() {
13323
13527
  setServicePopupInfo({
@@ -13331,9 +13535,13 @@ var ServiceOptionsDialog = function ServiceOptionsDialog(_ref) {
13331
13535
  "data-testid": "ServiceDialog"
13332
13536
  }, /*#__PURE__*/React.createElement(Box, {
13333
13537
  sx: styles$1.header
13334
- }, "Services"), /*#__PURE__*/React.createElement(Rows, {
13538
+ }, "Services"), /*#__PURE__*/React.createElement(Backdrop, {
13539
+ sx: styles$1.loading,
13540
+ open: isLoading
13541
+ }, /*#__PURE__*/React.createElement(CircularProgress, null)), /*#__PURE__*/React.createElement(Rows, {
13335
13542
  services: services,
13336
13543
  layerSelectRemoveService: layerSelectRemoveService,
13544
+ layerSelectReloadService: layerSelectReloadService,
13337
13545
  setServicePopupInfo: setServicePopupInfo,
13338
13546
  selectedLayers: selectedLayers
13339
13547
  }), /*#__PURE__*/React.createElement(Box, {
@@ -13349,6 +13557,7 @@ var ServiceOptionsDialog = function ServiceOptionsDialog(_ref) {
13349
13557
 
13350
13558
  var Rows = function Rows(_ref2) {
13351
13559
  var services = _ref2.services,
13560
+ layerSelectReloadService = _ref2.layerSelectReloadService,
13352
13561
  layerSelectRemoveService = _ref2.layerSelectRemoveService,
13353
13562
  setServicePopupInfo = _ref2.setServicePopupInfo,
13354
13563
  selectedLayers = _ref2.selectedLayers;
@@ -13380,18 +13589,31 @@ var Rows = function Rows(_ref2) {
13380
13589
  noWrap: true,
13381
13590
  style: {
13382
13591
  textOverflow: 'ellipsis',
13383
- paddingRight: '60px'
13592
+ paddingRight: '70px'
13384
13593
  }
13385
13594
  }, serviceName)), /*#__PURE__*/React.createElement(ListItemSecondaryAction, {
13386
13595
  style: {
13387
- marginRight: '-10px',
13388
- width: 90
13596
+ marginRight: '0px',
13597
+ width: 100
13389
13598
  }
13390
13599
  }, /*#__PURE__*/React.createElement(Grid, {
13391
13600
  container: true
13392
13601
  }, /*#__PURE__*/React.createElement(Grid, {
13393
13602
  item: true,
13394
- xs: 6
13603
+ xs: 4
13604
+ }, /*#__PURE__*/React.createElement(Tooltip, {
13605
+ title: "Update layers from WMS service",
13606
+ "data-testid": "updateServiceTooltip"
13607
+ }, /*#__PURE__*/React.createElement(IconButton, {
13608
+ "data-testid": "updateServiceButton",
13609
+ "aria-label": "Update layers from WMS service",
13610
+ size: "large",
13611
+ onClick: function onClick() {
13612
+ return layerSelectReloadService(serviceUrl);
13613
+ }
13614
+ }, /*#__PURE__*/React.createElement(Cached, null)))), /*#__PURE__*/React.createElement(Grid, {
13615
+ item: true,
13616
+ xs: 4
13395
13617
  }, userAddedService ? /*#__PURE__*/React.createElement(Tooltip, {
13396
13618
  title: "Edit Service"
13397
13619
  }, /*#__PURE__*/React.createElement("span", null, /*#__PURE__*/React.createElement(IconButton, {
@@ -13422,7 +13644,7 @@ var Rows = function Rows(_ref2) {
13422
13644
  }
13423
13645
  }, /*#__PURE__*/React.createElement(Visibility, null))))), /*#__PURE__*/React.createElement(Grid, {
13424
13646
  item: true,
13425
- xs: 6
13647
+ xs: 4
13426
13648
  }, userAddedService && /*#__PURE__*/React.createElement(Box, null, /*#__PURE__*/React.createElement(Tooltip, {
13427
13649
  title: serviceHasActiveLayers ? 'Service has active layers. Cannot remove this service' : 'Delete Service',
13428
13650
  "data-testid": "removeServiceTooltip"
@@ -13438,26 +13660,31 @@ var Rows = function Rows(_ref2) {
13438
13660
  }));
13439
13661
  };
13440
13662
 
13441
- /* *
13442
- * Licensed under the Apache License, Version 2.0 (the "License");
13443
- * you may not use this file except in compliance with the License.
13444
- * You may obtain a copy of the License at
13445
- *
13446
- * http://www.apache.org/licenses/LICENSE-2.0
13447
- *
13448
- * Unless required by applicable law or agreed to in writing, software
13449
- * distributed under the License is distributed on an "AS IS" BASIS,
13450
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13451
- * See the License for the specific language governing permissions and
13452
- * limitations under the License.
13453
- *
13454
- * Copyright 2022 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
13455
- * Copyright 2022 - Finnish Meteorological Institute (FMI)
13456
- * */
13663
+ var getService = function getService(services, serviceUrl) {
13664
+ var serviceIds = Object.keys(services);
13665
+ var serviceIndex = serviceIds.findIndex(function (serviceId) {
13666
+ return services[serviceId].serviceUrl === serviceUrl;
13667
+ });
13668
+ if (serviceIndex < 0) return null;
13669
+ return services[serviceIds[serviceIndex]];
13670
+ };
13671
+
13672
+ var getServiceSuccesUpdateMessage = function getServiceSuccesUpdateMessage(serviceName) {
13673
+ return "Service \"".concat(serviceName, "\" has been succesfully updated");
13674
+ };
13675
+ var getServiceFailedUpdateMessage = function getServiceFailedUpdateMessage(error) {
13676
+ return "Unable to update service, reason: \"".concat(error.message, "\"");
13677
+ };
13457
13678
 
13458
13679
  var ServiceOptionsDialogConnect = function ServiceOptionsDialogConnect(_ref) {
13459
13680
  var mapId = _ref.mapId,
13460
13681
  setServicePopupInfo = _ref.setServicePopupInfo;
13682
+
13683
+ var _React$useState = React.useState(false),
13684
+ _React$useState2 = _slicedToArray(_React$useState, 2),
13685
+ isLoading = _React$useState2[0],
13686
+ setIsLoading = _React$useState2[1];
13687
+
13461
13688
  var dispatch = useDispatch();
13462
13689
  var layerSelectRemoveService = React.useCallback(function (serviceId, serviceUrl) {
13463
13690
  dispatch(layerSelectActions.layerSelectRemoveService({
@@ -13465,17 +13692,79 @@ var ServiceOptionsDialogConnect = function ServiceOptionsDialogConnect(_ref) {
13465
13692
  serviceUrl: serviceUrl
13466
13693
  }));
13467
13694
  }, [dispatch]);
13695
+ var serviceSetLayers = React.useCallback(function (payload) {
13696
+ dispatch(serviceActions.serviceSetLayers(Object.assign(Object.assign({}, payload), {
13697
+ isUpdating: true
13698
+ })));
13699
+ }, [dispatch]);
13700
+ var showSnackbar = React.useCallback(function (message) {
13701
+ dispatch(snackbarActions.openSnackbar({
13702
+ message: message
13703
+ }));
13704
+ }, [dispatch]);
13468
13705
  var services = useSelector(function (store) {
13469
13706
  return getActiveServices(store);
13470
13707
  });
13471
13708
  var selectedLayers = useSelector(function (store) {
13472
13709
  return getMapLayers(store, mapId);
13473
13710
  });
13711
+ var layerSelectReloadService = React.useCallback(function (serviceUrl) {
13712
+ return __awaiter(void 0, void 0, void 0, /*#__PURE__*/regeneratorRuntime.mark(function _callee() {
13713
+ var layersForService, service, serviceTitle;
13714
+ return regeneratorRuntime.wrap(function _callee$(_context) {
13715
+ while (1) {
13716
+ switch (_context.prev = _context.next) {
13717
+ case 0:
13718
+ setIsLoading(true);
13719
+ _context.prev = 1;
13720
+ _context.next = 4;
13721
+ return loadWMSService(serviceUrl, true);
13722
+
13723
+ case 4:
13724
+ layersForService = _context.sent;
13725
+ service = getService(services, serviceUrl);
13726
+ serviceSetLayers({
13727
+ id: layersForService.id,
13728
+ name: service && service.serviceName || layersForService.name,
13729
+ serviceUrl: serviceUrl,
13730
+ "abstract": service && service["abstract"] || layersForService["abstract"],
13731
+ layers: layersForService.layers,
13732
+ scope: service && service.scope || 'user',
13733
+ isUpdating: true
13734
+ });
13735
+ clearImageCache();
13736
+ serviceTitle = service && service.serviceName || layersForService.name;
13737
+ showSnackbar(getServiceSuccesUpdateMessage(serviceTitle));
13738
+ _context.next = 15;
13739
+ break;
13740
+
13741
+ case 12:
13742
+ _context.prev = 12;
13743
+ _context.t0 = _context["catch"](1);
13744
+ // TODO: Maarten Plieger 2022-11-02: Snackbars should not be used to inform the user that something went wrong.
13745
+ // https://gitlab.com/opengeoweb/opengeoweb/-/issues/2819
13746
+ showSnackbar(getServiceFailedUpdateMessage(_context.t0));
13747
+
13748
+ case 15:
13749
+ _context.prev = 15;
13750
+ setIsLoading(false);
13751
+ return _context.finish(15);
13752
+
13753
+ case 18:
13754
+ case "end":
13755
+ return _context.stop();
13756
+ }
13757
+ }
13758
+ }, _callee, null, [[1, 12, 15, 18]]);
13759
+ }));
13760
+ }, [serviceSetLayers, services, showSnackbar]);
13474
13761
  return /*#__PURE__*/React.createElement(ServiceOptionsDialog, {
13475
13762
  selectedLayers: selectedLayers,
13476
13763
  services: services,
13477
13764
  layerSelectRemoveService: layerSelectRemoveService,
13478
- setServicePopupInfo: setServicePopupInfo
13765
+ layerSelectReloadService: layerSelectReloadService,
13766
+ setServicePopupInfo: setServicePopupInfo,
13767
+ isLoading: isLoading
13479
13768
  });
13480
13769
  };
13481
13770
 
@@ -15422,9 +15711,7 @@ var title = 'Now';
15422
15711
 
15423
15712
  var NowButton = function NowButton(_ref) {
15424
15713
  var _ref$onSetNow = _ref.onSetNow,
15425
- onSetNow = _ref$onSetNow === void 0 ? function () {
15426
- return null;
15427
- } : _ref$onSetNow,
15714
+ onSetNow = _ref$onSetNow === void 0 ? function () {} : _ref$onSetNow,
15428
15715
  _ref$disabled = _ref.disabled,
15429
15716
  disabled = _ref$disabled === void 0 ? false : _ref$disabled;
15430
15717
  return /*#__PURE__*/React.createElement(Tooltip, {
@@ -15441,92 +15728,125 @@ var NowButton = function NowButton(_ref) {
15441
15728
  }))));
15442
15729
  };
15443
15730
 
15444
- var OptionsPopOver = styled(Popover)(function (_ref) {
15445
- var theme = _ref.theme;
15446
- return {
15447
- '& .MuiPaper-root': {
15448
- padding: '5px',
15449
- overflow: 'visible',
15450
- backgroundColor: theme.palette.geowebColors.background.surface
15451
- }
15452
- };
15453
- });
15454
-
15455
- var OptionsMenuButton = function OptionsMenuButton(_ref2) {
15456
- var nowBtn = _ref2.nowBtn,
15457
- autoUpdateBtn = _ref2.autoUpdateBtn,
15458
- speedBtn = _ref2.speedBtn,
15459
- timeStepBtn = _ref2.timeStepBtn,
15460
- timeScaleBtn = _ref2.timeScaleBtn;
15461
-
15462
- var _React$useState = React.useState(null),
15463
- _React$useState2 = _slicedToArray(_React$useState, 2),
15464
- anchorEl = _React$useState2[0],
15465
- setAnchorEl = _React$useState2[1];
15731
+ var OptionsMenuButton = function OptionsMenuButton(_ref) {
15732
+ var nowBtn = _ref.nowBtn,
15733
+ autoUpdateBtn = _ref.autoUpdateBtn,
15734
+ speedBtn = _ref.speedBtn,
15735
+ timeStepBtn = _ref.timeStepBtn,
15736
+ timeScaleBtn = _ref.timeScaleBtn,
15737
+ _ref$isOpenByDefault = _ref.isOpenByDefault,
15738
+ isOpenByDefault = _ref$isOpenByDefault === void 0 ? false : _ref$isOpenByDefault;
15466
15739
 
15467
- var onClickButton = function onClickButton(event) {
15468
- setAnchorEl(event.currentTarget);
15469
- };
15740
+ var _useState = useState(null),
15741
+ _useState2 = _slicedToArray(_useState, 2),
15742
+ anchorEl = _useState2[0],
15743
+ setAnchorEl = _useState2[1];
15470
15744
 
15471
- var handleClose = function handleClose() {
15472
- setAnchorEl(null);
15473
- };
15745
+ var _useState3 = useState(false),
15746
+ _useState4 = _slicedToArray(_useState3, 2),
15747
+ open = _useState4[0],
15748
+ setOpen = _useState4[1];
15474
15749
 
15475
- var open = Boolean(anchorEl);
15476
- var id = open ? 'simple-popover' : undefined;
15477
- return /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement(Tooltip, {
15750
+ useEffect(function () {
15751
+ if (anchorEl && isOpenByDefault) {
15752
+ setOpen(true);
15753
+ }
15754
+ }, [anchorEl, isOpenByDefault]);
15755
+ return /*#__PURE__*/React__default.createElement("div", null, /*#__PURE__*/React__default.createElement(Tooltip, {
15478
15756
  title: "Animation options",
15479
15757
  placement: "bottom"
15480
- }, /*#__PURE__*/React.createElement("span", null, /*#__PURE__*/React.createElement(ToolButton, {
15481
- onClick: onClickButton,
15758
+ }, /*#__PURE__*/React__default.createElement("span", {
15759
+ ref: function ref(_ref2) {
15760
+ setAnchorEl(_ref2);
15761
+ }
15762
+ }, /*#__PURE__*/React__default.createElement(ToolButton, {
15763
+ onClick: function onClick() {
15764
+ setOpen(!open);
15765
+ },
15482
15766
  "data-testid": "optionsMenuButton",
15483
15767
  active: open,
15484
15768
  "aria-label": "animation options"
15485
- }, /*#__PURE__*/React.createElement(Options, null)))), /*#__PURE__*/React.createElement(OptionsPopOver, {
15486
- id: id,
15769
+ }, /*#__PURE__*/React__default.createElement(Options, null)))), /*#__PURE__*/React__default.createElement(Popper, {
15770
+ sx: {
15771
+ zIndex: 3
15772
+ },
15773
+ placement: "top-start",
15487
15774
  open: open,
15488
15775
  "data-testid": "optionsMenuPopOver",
15489
- anchorEl: anchorEl,
15490
- onClose: handleClose,
15491
- anchorOrigin: {
15492
- vertical: -5,
15493
- horizontal: 'left'
15776
+ anchorEl: anchorEl
15777
+ }, /*#__PURE__*/React__default.createElement(Paper, {
15778
+ elevation: 3
15779
+ }, /*#__PURE__*/React__default.createElement(Grid, {
15780
+ sx: {
15781
+ padding: '0px 10px 10px'
15494
15782
  },
15495
- transformOrigin: {
15496
- vertical: 'bottom',
15497
- horizontal: 'left'
15498
- }
15499
- }, /*#__PURE__*/React.createElement(Grid, {
15500
15783
  container: true,
15501
15784
  spacing: 1
15502
- }, /*#__PURE__*/React.createElement(Grid, {
15785
+ }, /*#__PURE__*/React__default.createElement(Grid, {
15503
15786
  item: true,
15504
15787
  xs: "auto"
15505
- }, nowBtn || /*#__PURE__*/React.createElement(NowButton, null)), /*#__PURE__*/React.createElement(Grid, {
15788
+ }, nowBtn || /*#__PURE__*/React__default.createElement(NowButton, null)), /*#__PURE__*/React__default.createElement(Grid, {
15506
15789
  item: true,
15507
15790
  xs: "auto"
15508
- }, timeScaleBtn || /*#__PURE__*/React.createElement(TimeScaleButton, {
15791
+ }, timeScaleBtn || /*#__PURE__*/React__default.createElement(TimeScaleButton, {
15509
15792
  centerTime: 0,
15510
15793
  onChangeTimeSliderScale: function onChangeTimeSliderScale() {},
15511
15794
  secondsPerPx: 0,
15512
15795
  selectedTime: 0,
15513
15796
  timeSliderScale: 0
15514
- })), /*#__PURE__*/React.createElement(Grid, {
15797
+ })), /*#__PURE__*/React__default.createElement(Grid, {
15515
15798
  item: true,
15516
15799
  xs: "auto"
15517
- }, timeStepBtn || /*#__PURE__*/React.createElement(TimeStepButton, {
15800
+ }, timeStepBtn || /*#__PURE__*/React__default.createElement(TimeStepButton, {
15518
15801
  timeStep: 0,
15519
15802
  onChangeTimeStep: function onChangeTimeStep() {}
15520
- })), /*#__PURE__*/React.createElement(Grid, {
15803
+ })), /*#__PURE__*/React__default.createElement(Grid, {
15521
15804
  item: true,
15522
15805
  xs: "auto"
15523
- }, speedBtn || /*#__PURE__*/React.createElement(SpeedButton, {
15806
+ }, speedBtn || /*#__PURE__*/React__default.createElement(SpeedButton, {
15524
15807
  animationDelay: defaultAnimationDelayAtStart,
15525
15808
  setMapAnimationDelay: function setMapAnimationDelay() {}
15526
- })), /*#__PURE__*/React.createElement(Grid, {
15809
+ })), /*#__PURE__*/React__default.createElement(Grid, {
15527
15810
  item: true,
15528
15811
  xs: "auto"
15529
- }, autoUpdateBtn || /*#__PURE__*/React.createElement(AutoUpdateButton, null)))));
15812
+ }, autoUpdateBtn || /*#__PURE__*/React__default.createElement(AutoUpdateButton, null))))));
15813
+ };
15814
+
15815
+ /* *
15816
+ * Licensed under the Apache License, Version 2.0 (the "License");
15817
+ * you may not use this file except in compliance with the License.
15818
+ * You may obtain a copy of the License at
15819
+ *
15820
+ * http://www.apache.org/licenses/LICENSE-2.0
15821
+ *
15822
+ * Unless required by applicable law or agreed to in writing, software
15823
+ * distributed under the License is distributed on an "AS IS" BASIS,
15824
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15825
+ * See the License for the specific language governing permissions and
15826
+ * limitations under the License.
15827
+ *
15828
+ * Copyright 2022 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
15829
+ * Copyright 2022 - Finnish Meteorological Institute (FMI)
15830
+ * */
15831
+ var forwardTooltipTitle = 'Forward';
15832
+ var backwardTooltipTitle = 'Backward';
15833
+
15834
+ var BackwardForwardStepButton = function BackwardForwardStepButton(_ref) {
15835
+ var isForwardStep = _ref.isForwardStep,
15836
+ isDisabled = _ref.isDisabled,
15837
+ _ref$onClickBFButton = _ref.onClickBFButton,
15838
+ onClickBFButton = _ref$onClickBFButton === void 0 ? function () {} : _ref$onClickBFButton;
15839
+ return /*#__PURE__*/React.createElement(Tooltip, {
15840
+ title: isForwardStep ? forwardTooltipTitle : backwardTooltipTitle
15841
+ }, /*#__PURE__*/React.createElement("span", null, /*#__PURE__*/React.createElement(ToolButton, {
15842
+ disabled: isDisabled,
15843
+ "aria-label": isForwardStep ? 'forward' : 'backward',
15844
+ onClick: onClickBFButton
15845
+ }, isForwardStep ? /*#__PURE__*/React.createElement(StepForward, {
15846
+ "data-testid": "step-forward-svg-path"
15847
+ }) : /*#__PURE__*/React.createElement(StepBackward, {
15848
+ "data-testid": "step-backward-svg-path"
15849
+ }))));
15530
15850
  };
15531
15851
 
15532
15852
  /* *
@@ -15548,16 +15868,28 @@ var OptionsMenuButton = function OptionsMenuButton(_ref2) {
15548
15868
 
15549
15869
  var TimeSliderButtons = function TimeSliderButtons(_ref) {
15550
15870
  var optionsMenuBtn = _ref.optionsMenuBtn,
15551
- playBtn = _ref.playBtn;
15871
+ playBtn = _ref.playBtn,
15872
+ backwardBtn = _ref.backwardBtn,
15873
+ forwardBtn = _ref.forwardBtn;
15552
15874
  return /*#__PURE__*/React.createElement("div", {
15553
15875
  "data-testid": "timeSliderButtons"
15554
15876
  }, /*#__PURE__*/React.createElement(Grid, {
15555
15877
  container: true,
15556
- spacing: 2
15878
+ spacing: 0.5,
15879
+ alignItems: "center",
15880
+ justifyContent: "center"
15557
15881
  }, /*#__PURE__*/React.createElement(Grid, {
15558
15882
  item: true
15559
15883
  }, optionsMenuBtn || /*#__PURE__*/React.createElement(OptionsMenuButton, null)), /*#__PURE__*/React.createElement(Grid, {
15560
15884
  item: true
15885
+ }, backwardBtn || /*#__PURE__*/React.createElement(BackwardForwardStepButton, {
15886
+ isForwardStep: false
15887
+ })), /*#__PURE__*/React.createElement(Grid, {
15888
+ item: true
15889
+ }, forwardBtn || /*#__PURE__*/React.createElement(BackwardForwardStepButton, {
15890
+ isForwardStep: true
15891
+ })), /*#__PURE__*/React.createElement(Grid, {
15892
+ item: true
15561
15893
  }, playBtn || /*#__PURE__*/React.createElement(PlayButton, null))));
15562
15894
  };
15563
15895
 
@@ -16106,13 +16438,30 @@ var isColorIntervalEven = function isColorIntervalEven(scale, timestep) {
16106
16438
  }
16107
16439
  };
16108
16440
 
16109
- var drawBackground = function drawBackground(context, theme, visibleTimeStart, visibleTimeEnd, animationStartPx, animationEndPx, canvasWidth, height, scale) {
16441
+ var drawBackground = function drawBackground(context, theme, visibleTimeStart, visibleTimeEnd, animationStartPx, animationEndPx, canvasWidth, height, scale, dataStartPx, dataEndPx, currentTimePx) {
16110
16442
  var ctx = context;
16111
16443
  var _theme$palette$geoweb7 = theme.palette.geowebColors.timeSlider,
16112
- timelineTimelineSurface = _theme$palette$geoweb7.timelineTimelineSurface,
16113
- timelineNightTime = _theme$palette$geoweb7.timelineNightTime;
16114
- ctx.fillStyle = timelineTimelineSurface.fill;
16115
- ctx.fillRect(0, 0, canvasWidth, height);
16444
+ timelineNightTime = _theme$palette$geoweb7.timelineNightTime,
16445
+ ledgendObservedBackground = _theme$palette$geoweb7.ledgendObservedBackground,
16446
+ legendForecastBackground = _theme$palette$geoweb7.legendForecastBackground,
16447
+ legendNoDataBackground = _theme$palette$geoweb7.legendNoDataBackground; // top spacing
16448
+
16449
+ var y = 0;
16450
+ ctx.fillStyle = legendNoDataBackground.rgba;
16451
+ ctx.fillRect(0, y, canvasWidth, height); // observed data
16452
+
16453
+ if (dataStartPx < currentTimePx) {
16454
+ ctx.fillStyle = ledgendObservedBackground.fill;
16455
+ ctx.fillRect(Math.max(dataStartPx, 0), y, Math.min(currentTimePx, dataEndPx) - Math.max(dataStartPx, 0), height);
16456
+ } // forecast data
16457
+
16458
+
16459
+ if (dataEndPx > currentTimePx) {
16460
+ ctx.fillStyle = legendForecastBackground.fill;
16461
+ ctx.fillRect(Math.max(currentTimePx, dataStartPx), y, Math.min(canvasWidth, dataEndPx) - Math.max(currentTimePx, dataStartPx), height);
16462
+ } // hovered area
16463
+
16464
+
16116
16465
  ctx.fillStyle = theme.palette.geowebColors.timeSlider.timelineSelectionBackground.rgba;
16117
16466
  ctx.fillRect(animationStartPx, 0, Math.max(animationEndPx - animationStartPx, 0), height);
16118
16467
  var colorChangeUnit = getColorChangeTimestepUnit(scale);
@@ -16213,7 +16562,7 @@ var drawTimeScale = function drawTimeScale(context, theme, visibleTimeStart, vis
16213
16562
  drawLeftSideDateText(ctx, theme, dateText, height);
16214
16563
  };
16215
16564
 
16216
- var renderTimeSliderLegend = function renderTimeSliderLegend(context, theme, canvasWidth, height, centerTime, secondsPerPx, dataScaleToSecondsPerPx, selectedTimeUnix, scale, currentTimeUnix, animationStartTime, animationEndTime) {
16565
+ var renderTimeSliderLegend = function renderTimeSliderLegend(context, theme, canvasWidth, height, centerTime, secondsPerPx, dataScaleToSecondsPerPx, selectedTimeUnix, scale, currentTimeUnix, animationStartTime, animationEndTime, dataStartTime, dataEndTime) {
16217
16566
  var ctx = context;
16218
16567
 
16219
16568
  var _map3 = [0, canvasWidth].map(function (px) {
@@ -16223,14 +16572,18 @@ var renderTimeSliderLegend = function renderTimeSliderLegend(context, theme, can
16223
16572
  visibleTimeStart = _map4[0],
16224
16573
  visibleTimeEnd = _map4[1];
16225
16574
 
16226
- var _map5 = [animationStartTime, animationEndTime].map(function (time) {
16575
+ var _map5 = [animationStartTime, animationEndTime, dataStartTime, dataEndTime, currentTimeUnix].map(function (time) {
16227
16576
  return timestampToPixel(time, centerTime, canvasWidth, secondsPerPx);
16228
16577
  }),
16229
- _map6 = _slicedToArray(_map5, 2),
16578
+ _map6 = _slicedToArray(_map5, 5),
16230
16579
  animationStartPx = _map6[0],
16231
- animationEndPx = _map6[1];
16580
+ animationEndPx = _map6[1],
16581
+ dataStartPx = _map6[2],
16582
+ dataEndPx = _map6[3],
16583
+ currentTimePx = _map6[4];
16232
16584
 
16233
- drawBackground(ctx, theme, visibleTimeStart, visibleTimeEnd, animationStartPx, animationEndPx, canvasWidth, height, scale);
16585
+ ctx.clearRect(0, 0, canvasWidth, height);
16586
+ drawBackground(ctx, theme, visibleTimeStart, visibleTimeEnd, animationStartPx, animationEndPx, canvasWidth, height, scale, dataStartPx, dataEndPx, currentTimePx);
16234
16587
  drawTimeScale(ctx, theme, visibleTimeStart, visibleTimeEnd, canvasWidth, height, scale, dataScaleToSecondsPerPx);
16235
16588
  drawNeedle(ctx, theme, canvasWidth, height, visibleTimeStart, visibleTimeEnd, selectedTimeUnix);
16236
16589
  drawCurrentTime(ctx, theme, canvasWidth, height, visibleTimeStart, visibleTimeEnd, currentTimeUnix);
@@ -16343,7 +16696,9 @@ var TimeSliderLegend = function TimeSliderLegend(_ref) {
16343
16696
  return /*#__PURE__*/React.createElement(Box, {
16344
16697
  "data-testid": "timeSliderLegend",
16345
16698
  sx: {
16346
- height: "".concat(TIME_SLIDER_LEGEND_HEIGHT, "px")
16699
+ height: "".concat(TIME_SLIDER_LEGEND_HEIGHT, "px"),
16700
+ borderRadius: '4.5px',
16701
+ overflow: 'hidden'
16347
16702
  }
16348
16703
  }, /*#__PURE__*/React.createElement(CanvasComponent, {
16349
16704
  ref: node,
@@ -16395,12 +16750,12 @@ var TimeSliderLegend = function TimeSliderLegend(_ref) {
16395
16750
  }
16396
16751
  },
16397
16752
  onRenderCanvas: function onRenderCanvas(ctx, width, height) {
16398
- renderTimeSliderLegend(ctx, theme, width, height, centerTime, secondsPerPx, dataScaleToSecondsPerPx, selectedTime, scale, currentTime, localAnimationStartTime, localAnimationEndTime);
16753
+ renderTimeSliderLegend(ctx, theme, width, height, centerTime, secondsPerPx, dataScaleToSecondsPerPx, selectedTime, scale, currentTime, localAnimationStartTime, localAnimationEndTime, dataStartTime, dataEndTime);
16399
16754
  }
16400
16755
  }));
16401
16756
  };
16402
16757
 
16403
- var TIME_SLIDER_LEGEND_HEIGHT = 50;
16758
+ var TIME_SLIDER_LEGEND_HEIGHT = 24;
16404
16759
 
16405
16760
  /* eslint-disable no-param-reassign */
16406
16761
 
@@ -16592,20 +16947,6 @@ var renderTimeSliderRailWithNeedle = function renderTimeSliderRailWithNeedle(ctx
16592
16947
  drawNewNeedleLabel(ctx, selected, selectedPx, animationStartPx, animationEndPx, scale, theme);
16593
16948
  };
16594
16949
 
16595
- var setPreviousTimeStep = function setPreviousTimeStep(timeStep, curTime, dataStartTime, onSetNewDate) {
16596
- var prevTimeStep = moment.utc(curTime).subtract(timeStep, 'm').toISOString();
16597
- if (!prevTimeStep) return;
16598
- if (moment.utc(prevTimeStep) < moment.utc(dataStartTime * 1000)) return;
16599
- onsetNewDateDebounced(prevTimeStep, onSetNewDate);
16600
- };
16601
-
16602
- var setNextTimeStep = function setNextTimeStep(timeStep, curTime, dataEndTime, onSetNewDate) {
16603
- var nextTimeStep = moment.utc(curTime).add(timeStep, 'm').toISOString();
16604
- if (!nextTimeStep) return;
16605
- if (moment.utc(nextTimeStep) > moment.utc(dataEndTime * 1000)) return;
16606
- onsetNewDateDebounced(nextTimeStep, onSetNewDate);
16607
- };
16608
-
16609
16950
  var DRAG_AREA_WIDTH = 10;
16610
16951
  var DRAG_HANDLER_AREA_WIDTH = 30;
16611
16952
 
@@ -16905,6 +17246,37 @@ var TimeSliderRail = function TimeSliderRail(_ref) {
16905
17246
  }));
16906
17247
  };
16907
17248
 
17249
+ /* *
17250
+ * Licensed under the Apache License, Version 2.0 (the "License");
17251
+ * you may not use this file except in compliance with the License.
17252
+ * You may obtain a copy of the License at
17253
+ *
17254
+ * http://www.apache.org/licenses/LICENSE-2.0
17255
+ *
17256
+ * Unless required by applicable law or agreed to in writing, software
17257
+ * distributed under the License is distributed on an "AS IS" BASIS,
17258
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17259
+ * See the License for the specific language governing permissions and
17260
+ * limitations under the License.
17261
+ *
17262
+ * Copyright 2022 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
17263
+ * Copyright 2022 - Finnish Meteorological Institute (FMI)
17264
+ * */
17265
+
17266
+ var HideSliderButton = function HideSliderButton(_ref) {
17267
+ var isVisible = _ref.isVisible,
17268
+ toggleTimeSliderIsVisible = _ref.toggleTimeSliderIsVisible;
17269
+ return /*#__PURE__*/React__default.createElement(Tooltip, {
17270
+ title: isVisible ? 'Hide timeslider' : 'Show timeslider',
17271
+ "data-testid": "autoUpdateButtonTooltip"
17272
+ }, /*#__PURE__*/React__default.createElement("span", null, /*#__PURE__*/React__default.createElement(ToolButton, {
17273
+ onClick: function onClick() {
17274
+ toggleTimeSliderIsVisible(!isVisible);
17275
+ },
17276
+ "data-testid": "hideTimeSliderButton"
17277
+ }, isVisible ? /*#__PURE__*/React__default.createElement(ChevronDown, null) : /*#__PURE__*/React__default.createElement(ChevronUp, null))));
17278
+ };
17279
+
16908
17280
  /* *
16909
17281
  * Licensed under the Apache License, Version 2.0 (the "License");
16910
17282
  * you may not use this file except in compliance with the License.
@@ -16957,14 +17329,22 @@ var TimeSlider = function TimeSlider(_ref) {
16957
17329
  _ref$onToggleTimeSlid = _ref.onToggleTimeSlider,
16958
17330
  onToggleTimeSlider = _ref$onToggleTimeSlid === void 0 ? function () {} : _ref$onToggleTimeSlid;
16959
17331
  useTimeSliderKeyBoardControl(mapIsActive, isVisible, onToggleTimeSlider);
17332
+ var visibilityState = isVisible ? 'visible' : 'hidden';
16960
17333
  return isVisible ? /*#__PURE__*/React.createElement(Grid, {
17334
+ style: {
17335
+ visibility: visibilityState
17336
+ },
16961
17337
  container: true,
16962
17338
  sx: {
16963
17339
  display: 'grid',
16964
- gridTemplateColumns: 'minmax(100px, 210px) minmax(66%, 1fr)',
16965
- gridTemplateRows: '50px'
17340
+ gridTemplateColumns: 'minmax(100px, 210px) minmax(66%, 1fr) minmax(40px, 40px)',
17341
+ gridTemplateRows: 24,
17342
+ paddingBottom: 1,
17343
+ alignItems: 'center',
17344
+ justifyContent: 'center'
16966
17345
  },
16967
- "data-testid": "timeSlider"
17346
+ "data-testid": "timeSlider",
17347
+ spacing: 1
16968
17348
  }, /*#__PURE__*/React.createElement(Grid, {
16969
17349
  item: true
16970
17350
  }), /*#__PURE__*/React.createElement(Grid, {
@@ -16973,19 +17353,30 @@ var TimeSlider = function TimeSlider(_ref) {
16973
17353
  selectedTime: defaultProps.selectedTime,
16974
17354
  mapIsActive: mapIsActive
16975
17355
  })), ' '), /*#__PURE__*/React.createElement(Grid, {
16976
- item: true,
16977
- sx: {
16978
- height: '50px'
16979
- },
16980
- container: true,
16981
- alignItems: "center",
16982
- justifyContent: "center"
17356
+ item: true
17357
+ }), /*#__PURE__*/React.createElement(Grid, {
17358
+ item: true
16983
17359
  }, buttons || /*#__PURE__*/React.createElement(TimeSliderButtons, null)), /*#__PURE__*/React.createElement(Grid, {
16984
17360
  item: true
16985
17361
  }, legend || /*#__PURE__*/React.createElement(TimeSliderLegend, Object.assign({}, defaultProps, {
16986
17362
  selectedTime: defaultProps.selectedTime.unix(),
16987
17363
  mapIsActive: mapIsActive
16988
- })), ' ')) : null;
17364
+ })), ' '), /*#__PURE__*/React.createElement(Grid, {
17365
+ item: true
17366
+ }, /*#__PURE__*/React.createElement(HideSliderButton, {
17367
+ toggleTimeSliderIsVisible: onToggleTimeSlider,
17368
+ isVisible: isVisible
17369
+ }))) : /*#__PURE__*/React.createElement(Grid, {
17370
+ sx: {
17371
+ paddingRight: 1
17372
+ },
17373
+ container: true,
17374
+ alignItems: "center",
17375
+ justifyContent: "flex-end"
17376
+ }, /*#__PURE__*/React.createElement(HideSliderButton, {
17377
+ toggleTimeSliderIsVisible: onToggleTimeSlider,
17378
+ isVisible: isVisible
17379
+ }));
16989
17380
  };
16990
17381
 
16991
17382
  /* *
@@ -17294,6 +17685,63 @@ var OptionsMenuButtonConnect = function OptionsMenuButtonConnect(_ref) {
17294
17685
  });
17295
17686
  };
17296
17687
 
17688
+ var BackwardForwardStepButtonConnect = function BackwardForwardStepButtonConnect(_ref) {
17689
+ var isForwardStep = _ref.isForwardStep,
17690
+ mapId = _ref.mapId;
17691
+ var timeStep = useSelector(function (store) {
17692
+ return getMapTimeStep(store, mapId);
17693
+ });
17694
+ var dispatch = useDispatch();
17695
+
17696
+ var setTime = function setTime(newDate) {
17697
+ dispatch(genericActions.setTime({
17698
+ origin: '',
17699
+ sourceId: mapId,
17700
+ value: handleMomentISOString(newDate)
17701
+ }));
17702
+ };
17703
+
17704
+ var stopAnimation = function stopAnimation() {
17705
+ dispatch(mapActions$1.mapStopAnimation({
17706
+ mapId: mapId,
17707
+ origin: MapActionOrigin.map
17708
+ }));
17709
+ };
17710
+
17711
+ var isAnimating$1 = useSelector(function (store) {
17712
+ return isAnimating(store, mapId);
17713
+ });
17714
+ var timedim = useSelector(function (store) {
17715
+ return getMapDimension(store, mapId, 'time');
17716
+ });
17717
+ var selectedTime = getSelectedTime(timedim);
17718
+ var curTime = moment.unix(selectedTime).toISOString();
17719
+ var layers = useSelector(function (store) {
17720
+ return getMapLayers(store, mapId);
17721
+ });
17722
+
17723
+ var _getDataLimitsFromLay = getDataLimitsFromLayers(layers),
17724
+ _getDataLimitsFromLay2 = _slicedToArray(_getDataLimitsFromLay, 2),
17725
+ dataStartTime = _getDataLimitsFromLay2[0],
17726
+ dataEndTime = _getDataLimitsFromLay2[1];
17727
+
17728
+ var onClickBF = function onClickBF() {
17729
+ if (isAnimating$1) {
17730
+ stopAnimation();
17731
+ }
17732
+
17733
+ isForwardStep ? setNextTimeStep(timeStep, curTime, dataEndTime, setTime) : setPreviousTimeStep(timeStep, curTime, dataStartTime, setTime);
17734
+ };
17735
+
17736
+ return /*#__PURE__*/React__default.createElement(BackwardForwardStepButton, {
17737
+ isDisabled: false,
17738
+ isForwardStep: isForwardStep,
17739
+ onClickBFButton: function onClickBFButton() {
17740
+ onClickBF();
17741
+ }
17742
+ });
17743
+ };
17744
+
17297
17745
  /* *
17298
17746
  * Licensed under the Apache License, Version 2.0 (the "License");
17299
17747
  * you may not use this file except in compliance with the License.
@@ -17329,6 +17777,14 @@ var TimeSliderButtonsConnect = function TimeSliderButtonsConnect(_ref) {
17329
17777
  }),
17330
17778
  playBtn: /*#__PURE__*/React.createElement(PlayButtonConnect, {
17331
17779
  mapId: mapId
17780
+ }),
17781
+ backwardBtn: /*#__PURE__*/React.createElement(BackwardForwardStepButtonConnect, {
17782
+ mapId: mapId,
17783
+ isForwardStep: false
17784
+ }),
17785
+ forwardBtn: /*#__PURE__*/React.createElement(BackwardForwardStepButtonConnect, {
17786
+ mapId: mapId,
17787
+ isForwardStep: true
17332
17788
  })
17333
17789
  });
17334
17790
  };
@@ -17352,8 +17808,6 @@ var connectRedux$2 = connect(function (store, props) {
17352
17808
  }, {
17353
17809
  stopMapAnimation: mapActions$1.mapStopAnimation,
17354
17810
  setTime: genericActions.setTime,
17355
- syncGroupAddSource: genericActions.syncGroupAddSource,
17356
- syncGroupRemoveSource: genericActions.syncGroupRemoveSource,
17357
17811
  mapSetTimeSliderCenterTime: mapActions$1.setTimeSliderCenterTime,
17358
17812
  mapSetTimeSliderSecondsPerPx: mapActions$1.setTimeSliderSecondsPerPx
17359
17813
  });
@@ -17375,8 +17829,6 @@ var TimeSliderLegendConnect = function TimeSliderLegendConnect(_ref) {
17375
17829
  activeWindowId = _ref.activeWindowId,
17376
17830
  stopMapAnimation = _ref.stopMapAnimation,
17377
17831
  setTime = _ref.setTime,
17378
- syncGroupAddSource = _ref.syncGroupAddSource,
17379
- syncGroupRemoveSource = _ref.syncGroupRemoveSource,
17380
17832
  mapSetTimeSliderCenterTime = _ref.mapSetTimeSliderCenterTime,
17381
17833
  mapSetTimeSliderSecondsPerPx = _ref.mapSetTimeSliderSecondsPerPx;
17382
17834
 
@@ -17391,17 +17843,6 @@ var TimeSliderLegendConnect = function TimeSliderLegendConnect(_ref) {
17391
17843
  dataEndTime = _getDataLimitsFromLay2[1];
17392
17844
 
17393
17845
  var mapIsActive = mapId === activeWindowId;
17394
- React.useEffect(function () {
17395
- syncGroupAddSource({
17396
- id: sourceId,
17397
- type: [SYNCGROUPS_TYPE_SETTIME]
17398
- });
17399
- return function () {
17400
- syncGroupRemoveSource({
17401
- id: sourceId
17402
- });
17403
- };
17404
- }, [sourceId, syncGroupAddSource, syncGroupRemoveSource]);
17405
17846
  return /*#__PURE__*/React.createElement(TimeSliderLegend, {
17406
17847
  centerTime: centerTime,
17407
17848
  secondsPerPx: secondsPerPx,
@@ -17479,8 +17920,6 @@ var connectRedux$1 = connect(function (store, props) {
17479
17920
  setAnimationEndTime: mapActions$1.setAnimationEndTime,
17480
17921
  setTime: genericActions.setTime,
17481
17922
  stopMapAnimation: mapActions$1.mapStopAnimation,
17482
- syncGroupAddSource: genericActions.syncGroupAddSource,
17483
- syncGroupRemoveSource: genericActions.syncGroupRemoveSource,
17484
17923
  mapSetTimeSliderCenterTime: mapActions$1.setTimeSliderCenterTime
17485
17924
  });
17486
17925
 
@@ -17502,8 +17941,6 @@ var TimeSliderRailConnectComponent = function TimeSliderRailConnectComponent(_re
17502
17941
  setAnimationEndTime = _ref.setAnimationEndTime,
17503
17942
  stopMapAnimation = _ref.stopMapAnimation,
17504
17943
  setTime = _ref.setTime,
17505
- syncGroupAddSource = _ref.syncGroupAddSource,
17506
- syncGroupRemoveSource = _ref.syncGroupRemoveSource,
17507
17944
  mapSetTimeSliderCenterTime = _ref.mapSetTimeSliderCenterTime;
17508
17945
 
17509
17946
  var _getMomentTimeBounds = getMomentTimeBounds(dimensions),
@@ -17514,20 +17951,9 @@ var TimeSliderRailConnectComponent = function TimeSliderRailConnectComponent(_re
17514
17951
  var _getDataLimitsFromLay = getDataLimitsFromLayers(layers),
17515
17952
  _getDataLimitsFromLay2 = _slicedToArray(_getDataLimitsFromLay, 2),
17516
17953
  dataStartTime = _getDataLimitsFromLay2[0],
17517
- dataEndTime = _getDataLimitsFromLay2[1];
17518
-
17519
- var mapIsActive = activeWindowId === mapId;
17520
- React.useEffect(function () {
17521
- syncGroupAddSource({
17522
- id: sourceId,
17523
- type: [SYNCGROUPS_TYPE_SETTIME]
17524
- });
17525
- return function () {
17526
- syncGroupRemoveSource({
17527
- id: sourceId
17528
- });
17529
- };
17530
- }, [sourceId, syncGroupAddSource, syncGroupRemoveSource]);
17954
+ dataEndTime = _getDataLimitsFromLay2[1];
17955
+
17956
+ var mapIsActive = activeWindowId === mapId;
17531
17957
  return /*#__PURE__*/React.createElement(TimeSliderRail, {
17532
17958
  centerTime: centerTime,
17533
17959
  secondsPerPx: secondsPerPx,
@@ -22122,6 +22548,141 @@ var LegendMapButtonConnect = function LegendMapButtonConnect(_ref) {
22122
22548
  }, /*#__PURE__*/React.createElement(List$1, null));
22123
22549
  };
22124
22550
 
22551
+ var MIN_WIDTH = 170;
22552
+ var MIN_HEIGHT = 32;
22553
+ var MIN_FONT_SIZE = 14;
22554
+ var FONT_SIZE_WIDTH_RATIO = MIN_FONT_SIZE / MIN_WIDTH;
22555
+ var TimeSliderClock = function TimeSliderClock(_ref2) {
22556
+ var time = _ref2.time;
22557
+ var nodeRef = React.useRef(null);
22558
+
22559
+ var _React$useState = React.useState({
22560
+ x: 0,
22561
+ y: 0
22562
+ }),
22563
+ _React$useState2 = _slicedToArray(_React$useState, 2),
22564
+ position = _React$useState2[0],
22565
+ setPosition = _React$useState2[1];
22566
+
22567
+ useMakeSureContainerStaysInsideWindow(nodeRef, position, setPosition);
22568
+
22569
+ var _React$useState3 = React.useState({
22570
+ width: MIN_WIDTH,
22571
+ height: MIN_HEIGHT
22572
+ }),
22573
+ _React$useState4 = _slicedToArray(_React$useState3, 2),
22574
+ size = _React$useState4[0],
22575
+ setSize = _React$useState4[1];
22576
+
22577
+ var _React$useState5 = React.useState(MIN_FONT_SIZE),
22578
+ _React$useState6 = _slicedToArray(_React$useState5, 2),
22579
+ fontSize = _React$useState6[0],
22580
+ setFontSize = _React$useState6[1];
22581
+
22582
+ return /*#__PURE__*/React.createElement(Draggable, {
22583
+ nodeRef: nodeRef,
22584
+ bounds: "parent",
22585
+ position: position,
22586
+ onStop: function onStop(_event, position) {
22587
+ setPosition(position);
22588
+ }
22589
+ }, /*#__PURE__*/React.createElement("div", {
22590
+ style: {
22591
+ position: 'absolute',
22592
+ zIndex: 100,
22593
+ top: '10px',
22594
+ right: '10px'
22595
+ },
22596
+ ref: nodeRef
22597
+ }, /*#__PURE__*/React.createElement(Resizable, {
22598
+ onResizeStart: function onResizeStart(event) {
22599
+ event.stopPropagation();
22600
+ },
22601
+ onResize: function onResize(_event, _direction, _ref, delta) {
22602
+ var width = size.width + delta.width;
22603
+ var fontSize = FONT_SIZE_WIDTH_RATIO * width;
22604
+ setFontSize(fontSize);
22605
+ },
22606
+ onResizeStop: function onResizeStop(_event, _direction, _ref, delta) {
22607
+ var width = size.width + delta.width;
22608
+ var height = size.height + delta.height;
22609
+ setSize({
22610
+ width: width,
22611
+ height: height
22612
+ });
22613
+ },
22614
+ lockAspectRatio: true,
22615
+ minHeight: MIN_HEIGHT,
22616
+ minWidth: MIN_WIDTH,
22617
+ size: size,
22618
+ handleComponent: {
22619
+ bottomLeft: /*#__PURE__*/React.createElement(Resize, {
22620
+ isRightAligned: true,
22621
+ style: {
22622
+ fill: '#FFFFFF'
22623
+ }
22624
+ })
22625
+ },
22626
+ enable: {
22627
+ top: false,
22628
+ right: false,
22629
+ bottom: false,
22630
+ left: false,
22631
+ topRight: false,
22632
+ bottomRight: false,
22633
+ bottomLeft: true,
22634
+ topLeft: false
22635
+ }
22636
+ }, /*#__PURE__*/React.createElement(Box$2, {
22637
+ display: "flex",
22638
+ justifyContent: "center",
22639
+ alignItems: "center",
22640
+ sx: {
22641
+ cursor: 'move',
22642
+ height: '100%',
22643
+ width: '100%',
22644
+ backgroundColor: '#051039',
22645
+ borderRadius: '5px'
22646
+ }
22647
+ }, /*#__PURE__*/React.createElement(Typography, {
22648
+ variant: "subtitle2",
22649
+ sx: {
22650
+ color: '#FFFFFF',
22651
+ fontSize: fontSize
22652
+ }
22653
+ }, moment.utc(time).format('ddd DD MMM HH:mm z'))))));
22654
+ };
22655
+
22656
+ /* *
22657
+ * Licensed under the Apache License, Version 2.0 (the "License");
22658
+ * you may not use this file except in compliance with the License.
22659
+ * You may obtain a copy of the License at
22660
+ *
22661
+ * http://www.apache.org/licenses/LICENSE-2.0
22662
+ *
22663
+ * Unless required by applicable law or agreed to in writing, software
22664
+ * distributed under the License is distributed on an "AS IS" BASIS,
22665
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
22666
+ * See the License for the specific language governing permissions and
22667
+ * limitations under the License.
22668
+ *
22669
+ * Copyright 2022 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
22670
+ * Copyright 2022 - Finnish Meteorological Institute (FMI)
22671
+ * */
22672
+ var TimeSliderClockConnect = function TimeSliderClockConnect(_ref) {
22673
+ var mapId = _ref.mapId;
22674
+ var dimensions = useSelector(function (store) {
22675
+ return getMapDimensions(store, mapId);
22676
+ });
22677
+
22678
+ var _getMomentTimeBounds = getMomentTimeBounds(dimensions),
22679
+ selectedTime = _getMomentTimeBounds.selectedTime;
22680
+
22681
+ return /*#__PURE__*/React__default.createElement(TimeSliderClock, {
22682
+ time: selectedTime
22683
+ });
22684
+ };
22685
+
22125
22686
  var titleStyle = function titleStyle(theme) {
22126
22687
  return {
22127
22688
  position: 'absolute',
@@ -22171,7 +22732,9 @@ var ConfigurableMapConnect = function ConfigurableMapConnect(_a) {
22171
22732
  _a$multiLegend = _a.multiLegend,
22172
22733
  multiLegend = _a$multiLegend === void 0 ? true : _a$multiLegend,
22173
22734
  shouldShowLayerManager = _a.shouldShowLayerManager,
22174
- props = __rest(_a, ["id", "title", "layers", "shouldAutoUpdate", "shouldAnimate", "bbox", "srs", "shouldShowZoomControls", "displayMapPin", "showTimeSlider", "disableTimeSlider", "displayTimeInMap", "displayLayerManagerAndLegendButtonInMap", "displayDimensionSelectButtonInMap", "multiLegend", "shouldShowLayerManager"]);
22735
+ _a$showClock = _a.showClock,
22736
+ showClock = _a$showClock === void 0 ? true : _a$showClock,
22737
+ props = __rest(_a, ["id", "title", "layers", "shouldAutoUpdate", "shouldAnimate", "bbox", "srs", "shouldShowZoomControls", "displayMapPin", "showTimeSlider", "disableTimeSlider", "displayTimeInMap", "displayLayerManagerAndLegendButtonInMap", "displayDimensionSelectButtonInMap", "multiLegend", "shouldShowLayerManager", "showClock"]);
22175
22738
 
22176
22739
  var dispatch = useDispatch();
22177
22740
  var mapId = React__default.useRef(id || generateMapId()).current;
@@ -22257,6 +22820,8 @@ var ConfigurableMapConnect = function ConfigurableMapConnect(_a) {
22257
22820
  showMapId: true,
22258
22821
  mapId: mapId,
22259
22822
  multiLegend: multiLegend
22823
+ }), showClock && /*#__PURE__*/React__default.createElement(TimeSliderClockConnect, {
22824
+ mapId: mapId
22260
22825
  }));
22261
22826
  };
22262
22827
 
@@ -22296,7 +22861,9 @@ var MultiMapViewConnect = function MultiMapViewConnect(_ref) {
22296
22861
  _ref$showZoomControls = _ref.showZoomControls,
22297
22862
  showZoomControls = _ref$showZoomControls === void 0 ? true : _ref$showZoomControls,
22298
22863
  _ref$multiLegend = _ref.multiLegend,
22299
- multiLegend = _ref$multiLegend === void 0 ? false : _ref$multiLegend;
22864
+ multiLegend = _ref$multiLegend === void 0 ? false : _ref$multiLegend,
22865
+ _ref$showClock = _ref.showClock,
22866
+ showClock = _ref$showClock === void 0 ? true : _ref$showClock;
22300
22867
  var dispatch = useDispatch();
22301
22868
  var syncGroupAddTarget = React__default.useCallback(function (payload) {
22302
22869
  dispatch(genericActions.syncGroupAddTarget(payload));
@@ -22339,6 +22906,8 @@ var MultiMapViewConnect = function MultiMapViewConnect(_ref) {
22339
22906
  showMapId: true,
22340
22907
  mapId: firstMapId,
22341
22908
  multiLegend: multiLegend
22909
+ }), showClock && /*#__PURE__*/React__default.createElement(TimeSliderClockConnect, {
22910
+ mapId: firstMapId
22342
22911
  }), maps.map(function (map, mapIndex) {
22343
22912
  var mapId = map.id;
22344
22913
  return /*#__PURE__*/React__default.createElement(Box, {
@@ -22358,96 +22927,12 @@ var MultiMapViewConnect = function MultiMapViewConnect(_ref) {
22358
22927
  shouldShowZoomControls: showZoomControls && mapIndex === 0,
22359
22928
  showTimeSlider: false,
22360
22929
  disableTimeSlider: true,
22930
+ showClock: false,
22361
22931
  multiLegend: multiLegend
22362
22932
  }));
22363
22933
  }));
22364
22934
  };
22365
22935
 
22366
- var useGetReferenceTimes = function useGetReferenceTimes(inputLayer) {
22367
- var _React$useState = React.useState([]),
22368
- _React$useState2 = _slicedToArray(_React$useState, 2),
22369
- referenceTimes = _React$useState2[0],
22370
- setReferenceTimes = _React$useState2[1];
22371
-
22372
- React.useEffect(function () {
22373
- var referenceTimes = [];
22374
- var wmLayer = new WMLayer(Object.assign({}, inputLayer));
22375
- wmLayer.parseLayerPromise().then(function (layer) {
22376
- var refTimeDim = layer.getDimension('reference_time');
22377
- /* Loop through all values of the dimension.
22378
- A map cannot be used for iterating, as the dimension values are not in an array (it is an API). */
22379
-
22380
- for (var j = 0; j < refTimeDim.size(); j += 1) {
22381
- var referenceTimeValue = refTimeDim.getValueForIndex(j);
22382
- referenceTimes.push(referenceTimeValue);
22383
- }
22384
-
22385
- setReferenceTimes(referenceTimes);
22386
- });
22387
- }, [inputLayer]);
22388
- return referenceTimes;
22389
- };
22390
-
22391
- var HarmonieTempAndPrecipPreset = function HarmonieTempAndPrecipPreset(_ref) {
22392
- var layers = _ref.layers,
22393
- _ref$multiLegend = _ref.multiLegend,
22394
- multiLegend = _ref$multiLegend === void 0 ? false : _ref$multiLegend;
22395
-
22396
- /* Get all the reference times for this layer */
22397
- var referenceTimes = useGetReferenceTimes(layers.topRow);
22398
- if (referenceTimes.length === 0) return /*#__PURE__*/React.createElement("div", null, "Loading...");
22399
- /* Helper to make a map layer prest */
22400
-
22401
- var makeMapPreset = function makeMapPreset(referenceTime, uniqueId, layer, syncGroupsIds, col) {
22402
- return {
22403
- id: uniqueId,
22404
- title: "Harmonie run ".concat("".concat(referenceTime.substring(8, 13).replace('T', ' / '))),
22405
- bbox: {
22406
- left: -450651.2255879827,
22407
- bottom: 6490531.093143953,
22408
- right: 1428345.8183648037,
22409
- top: 7438773.776232235
22410
- },
22411
- srs: 'EPSG:3857',
22412
- layers: [Object.assign(Object.assign({}, layer), {
22413
- id: uniqueId,
22414
- dimensions: [{
22415
- name: 'reference_time',
22416
- currentValue: referenceTime
22417
- }]
22418
- })],
22419
- syncGroupsIds: syncGroupsIds,
22420
- displayLayerManagerAndLegendButtonInMap: col === 0 || !syncGroupsIds,
22421
- displayDimensionSelectButtonInMap: col === 0 || !syncGroupsIds
22422
- };
22423
- };
22424
- /* Make the preset */
22425
-
22426
-
22427
- var nCols = 5;
22428
- /* Add the harmonie air temperature layers with the different referencetimes */
22429
-
22430
- var mapsTemperature = _toConsumableArray(Array(nCols)).map(function (_, index) {
22431
- var refTime = referenceTimes[referenceTimes.length - nCols + index];
22432
- return makeMapPreset(refTime, "harm_air".concat(index), layers.topRow, layers.topRowSyncGroups, index);
22433
- });
22434
- /* Add the harmonie precipitation layers with the different referencetimes */
22435
-
22436
-
22437
- var mapsPrecipitation = _toConsumableArray(Array(nCols)).map(function (_, index) {
22438
- var refTime = referenceTimes[referenceTimes.length - nCols + index];
22439
- return makeMapPreset(refTime, "harm_precip".concat(index), layers.bottomRow, layers.bottomRowSyncGroups, index);
22440
- });
22441
-
22442
- var maps = mapsTemperature.concat(mapsPrecipitation);
22443
- return /*#__PURE__*/React.createElement(MultiMapViewConnect, {
22444
- rows: 2,
22445
- cols: 5,
22446
- maps: maps,
22447
- multiLegend: multiLegend
22448
- });
22449
- };
22450
-
22451
22936
  var useGetLatestReferenceTime = function useGetLatestReferenceTime(inputLayer) {
22452
22937
  var _React$useState = React.useState(''),
22453
22938
  _React$useState2 = _slicedToArray(_React$useState, 2),
@@ -22464,8 +22949,30 @@ var useGetLatestReferenceTime = function useGetLatestReferenceTime(inputLayer) {
22464
22949
  }, [inputLayer]);
22465
22950
  return latestReferenceTime;
22466
22951
  };
22467
- /* Helper to make a map layer preset */
22952
+ /**
22953
+ * Custom hook to find out if the list of syncgroup id's contains a group which is of type SYNCGROUPS_TYPE_SETLAYERACTIONS
22954
+ * @param syncGroupsIds A string array of syncgroup ids
22955
+ * @returns True if indeed a group is included which is of type SYNCGROUPS_TYPE_SETLAYERACTIONS
22956
+ */
22957
+
22958
+
22959
+ var useHasSyncGroupWithLayerActions = function useHasSyncGroupWithLayerActions(syncGroupsIds) {
22960
+ /* Get Syncgroupstate */
22961
+ var syncGroupState = useSelector(function (store) {
22962
+ return getSynchronizationGroupState(store);
22963
+ });
22964
+ if (!syncGroupState) return false;
22965
+ /* Return all syncgroups configured for this component of type SYNCGROUPS_TYPE_SETLAYERACTIONS */
22468
22966
 
22967
+ var syncGroupsWithLayerActions = syncGroupState.groups.allIds.filter(function (syncGroupId) {
22968
+ return syncGroupsIds && syncGroupsIds.includes(syncGroupId) && syncGroupState.groups.byId[syncGroupId].type === 'SYNCGROUPS_TYPE_SETLAYERACTIONS';
22969
+ });
22970
+ /* Figure out if there is a syncgroup which controls layeractions. */
22971
+
22972
+ var displayLayerManagerAndLegendButtonInAllMaps = syncGroupsIds ? syncGroupsWithLayerActions.length === 1 : false;
22973
+ return displayLayerManagerAndLegendButtonInAllMaps;
22974
+ };
22975
+ /* Helper to make a map layer preset */
22469
22976
 
22470
22977
  var makeMapPreset = function makeMapPreset(timeIncrement, uniqueId, referenceTime, layers, syncGroupsIds, displayLayerManagerAndLegendButtonInMap, displayDimensionSelectButtonInMap) {
22471
22978
  var mapTime = moment.utc(referenceTime).add(timeIncrement, 'h').format('YYYY-MM-DDTHH:mm:ss[Z]');
@@ -22507,8 +23014,9 @@ var ModelRunInterval = function ModelRunInterval(_ref) {
22507
23014
  startTimeIncrement = _ref$startTimeIncreme === void 0 ? 3 : _ref$startTimeIncreme,
22508
23015
  _ref$multiLegend = _ref.multiLegend,
22509
23016
  multiLegend = _ref$multiLegend === void 0 ? false : _ref$multiLegend;
22510
-
23017
+ var displayLayerManagerAndLegendButtonInAllMaps = !useHasSyncGroupWithLayerActions(syncGroupsIds);
22511
23018
  /* Get latest reference time for this layer */
23019
+
22512
23020
  var latestReferenceTime = useGetLatestReferenceTime(layers[0]);
22513
23021
  if (latestReferenceTime === '') return /*#__PURE__*/React.createElement("div", null, "Loading...");
22514
23022
  /* Calculate the last time increment based on 15 maps */
@@ -22521,7 +23029,7 @@ var ModelRunInterval = function ModelRunInterval(_ref) {
22521
23029
 
22522
23030
 
22523
23031
  var maps = timeIncrements.map(function (increment, index) {
22524
- return makeMapPreset(increment, "harm_precip".concat(increment), latestReferenceTime, layers, syncGroupsIds, index === 0 || !syncGroupsIds, index === 0 || !syncGroupsIds);
23032
+ return makeMapPreset(increment, "harm_precip".concat(increment), latestReferenceTime, layers, syncGroupsIds, index === 0 || displayLayerManagerAndLegendButtonInAllMaps, index === 0 || displayLayerManagerAndLegendButtonInAllMaps);
22525
23033
  });
22526
23034
  return /*#__PURE__*/React.createElement(MultiMapViewConnect, {
22527
23035
  rows: 3,
@@ -22529,6 +23037,94 @@ var ModelRunInterval = function ModelRunInterval(_ref) {
22529
23037
  maps: maps,
22530
23038
  syncTime: false,
22531
23039
  showTimeSlider: false,
23040
+ multiLegend: multiLegend,
23041
+ showClock: false
23042
+ });
23043
+ };
23044
+
23045
+ var useGetReferenceTimes = function useGetReferenceTimes(inputLayer) {
23046
+ var _React$useState = React.useState([]),
23047
+ _React$useState2 = _slicedToArray(_React$useState, 2),
23048
+ referenceTimes = _React$useState2[0],
23049
+ setReferenceTimes = _React$useState2[1];
23050
+
23051
+ React.useEffect(function () {
23052
+ var referenceTimes = [];
23053
+ var wmLayer = new WMLayer(Object.assign({}, inputLayer));
23054
+ wmLayer.parseLayerPromise().then(function (layer) {
23055
+ var refTimeDim = layer.getDimension('reference_time');
23056
+ /* Loop through all values of the dimension.
23057
+ A map cannot be used for iterating, as the dimension values are not in an array (it is an API). */
23058
+
23059
+ for (var j = 0; j < refTimeDim.size(); j += 1) {
23060
+ var referenceTimeValue = refTimeDim.getValueForIndex(j);
23061
+ referenceTimes.push(referenceTimeValue);
23062
+ }
23063
+
23064
+ setReferenceTimes(referenceTimes);
23065
+ });
23066
+ }, [inputLayer]);
23067
+ return referenceTimes;
23068
+ };
23069
+
23070
+ var HarmonieTempAndPrecipPreset = function HarmonieTempAndPrecipPreset(_ref) {
23071
+ var layers = _ref.layers,
23072
+ _ref$multiLegend = _ref.multiLegend,
23073
+ multiLegend = _ref$multiLegend === void 0 ? false : _ref$multiLegend;
23074
+ var displayLayerManagerAndLegendButtonInAllTopRows = !useHasSyncGroupWithLayerActions(layers && layers.topRowSyncGroups);
23075
+ var displayLayerManagerAndLegendButtonInAllBottomRows = !useHasSyncGroupWithLayerActions(layers && layers.bottomRowSyncGroups);
23076
+ /* Get all the reference times for this layer */
23077
+
23078
+ var referenceTimes = useGetReferenceTimes(layers.topRow);
23079
+ if (referenceTimes.length === 0) return /*#__PURE__*/React.createElement("div", null, "Loading...");
23080
+ /* Helper to make a map layer prest */
23081
+
23082
+ var makeMapPreset = function makeMapPreset(referenceTime, uniqueId, layer, syncGroupsIds, col) {
23083
+ return {
23084
+ id: uniqueId,
23085
+ title: "Harmonie run ".concat("".concat(referenceTime.substring(8, 13).replace('T', ' / '))),
23086
+ bbox: {
23087
+ left: -450651.2255879827,
23088
+ bottom: 6490531.093143953,
23089
+ right: 1428345.8183648037,
23090
+ top: 7438773.776232235
23091
+ },
23092
+ srs: 'EPSG:3857',
23093
+ layers: [Object.assign(Object.assign({}, layer), {
23094
+ id: uniqueId,
23095
+ dimensions: [{
23096
+ name: 'reference_time',
23097
+ currentValue: referenceTime
23098
+ }]
23099
+ })],
23100
+ syncGroupsIds: syncGroupsIds,
23101
+ displayLayerManagerAndLegendButtonInMap: col === 0 || displayLayerManagerAndLegendButtonInAllTopRows,
23102
+ displayDimensionSelectButtonInMap: col === 0 || displayLayerManagerAndLegendButtonInAllBottomRows
23103
+ };
23104
+ };
23105
+ /* Make the preset */
23106
+
23107
+
23108
+ var nCols = 5;
23109
+ /* Add the harmonie air temperature layers with the different referencetimes */
23110
+
23111
+ var mapsTemperature = _toConsumableArray(Array(nCols)).map(function (_, index) {
23112
+ var refTime = referenceTimes[referenceTimes.length - nCols + index];
23113
+ return makeMapPreset(refTime, "harm_air".concat(index), layers.topRow, layers.topRowSyncGroups, index);
23114
+ });
23115
+ /* Add the harmonie precipitation layers with the different referencetimes */
23116
+
23117
+
23118
+ var mapsPrecipitation = _toConsumableArray(Array(nCols)).map(function (_, index) {
23119
+ var refTime = referenceTimes[referenceTimes.length - nCols + index];
23120
+ return makeMapPreset(refTime, "harm_precip".concat(index), layers.bottomRow, layers.bottomRowSyncGroups, index);
23121
+ });
23122
+
23123
+ var maps = mapsTemperature.concat(mapsPrecipitation);
23124
+ return /*#__PURE__*/React.createElement(MultiMapViewConnect, {
23125
+ rows: 2,
23126
+ cols: 5,
23127
+ maps: maps,
22532
23128
  multiLegend: multiLegend
22533
23129
  });
22534
23130
  };
@@ -22980,8 +23576,7 @@ var SyncGroupViewerConnect = function SyncGroupViewerConnect() {
22980
23576
  * Copyright 2020 - Finnish Meteorological Institute (FMI)
22981
23577
  * */
22982
23578
  var store = createStore({
22983
- initialState: {},
22984
- extensions: [getSagaExtension({})]
23579
+ extensions: [getSagaExtension()]
22985
23580
  });
22986
23581
 
22987
23582
  /* *
@@ -23162,9 +23757,7 @@ var SnackbarWrapper = function SnackbarWrapper(_a) {
23162
23757
  * Copyright 2022 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
23163
23758
  * Copyright 2022 - Finnish Meteorological Institute (FMI)
23164
23759
  * */
23165
- var SnackbarWrapperConnect = function SnackbarWrapperConnect(_a) {
23166
- var props = __rest(_a, []);
23167
-
23760
+ var SnackbarWrapperConnect = withEggs([snackbarModuleConfig])(function (props) {
23168
23761
  var dispatch = useDispatch();
23169
23762
 
23170
23763
  var onCloseSnackbar = function onCloseSnackbar() {
@@ -23174,15 +23767,13 @@ var SnackbarWrapperConnect = function SnackbarWrapperConnect(_a) {
23174
23767
  var currentSnackbarMessage = useSelector(function (store) {
23175
23768
  return getFirstSnackbarMessage(store);
23176
23769
  });
23177
- return /*#__PURE__*/React.createElement(DynamicModuleLoader, {
23178
- modules: [snackbarModuleConfig]
23179
- }, /*#__PURE__*/React.createElement(SnackbarWrapper, Object.assign({
23770
+ return /*#__PURE__*/React.createElement(SnackbarWrapper, Object.assign({
23180
23771
  isOpen: !!currentSnackbarMessage,
23181
23772
  onCloseSnackbar: onCloseSnackbar,
23182
23773
  message: currentSnackbarMessage ? currentSnackbarMessage.message : '',
23183
23774
  id: currentSnackbarMessage ? currentSnackbarMessage.id : ''
23184
- }, props)));
23185
- };
23775
+ }, props));
23776
+ });
23186
23777
 
23187
23778
  /* *
23188
23779
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -23214,6 +23805,13 @@ var CoreThemeProvider = function CoreThemeProvider(_ref) {
23214
23805
  theme: theme
23215
23806
  }, children);
23216
23807
  };
23808
+ var ThemeWrapperWithModules = withEggs(coreModuleConfig)(function (_ref2) {
23809
+ var theme = _ref2.theme,
23810
+ children = _ref2.children;
23811
+ return /*#__PURE__*/React__default.createElement(CoreThemeProvider, {
23812
+ theme: theme
23813
+ }, children, " ");
23814
+ });
23217
23815
  /**
23218
23816
  * A Provider component which provides the GeoWeb theme and store for the core.
23219
23817
  * Note: Should only be used with core components, as the provided store is only for core.
@@ -23221,18 +23819,16 @@ var CoreThemeProvider = function CoreThemeProvider(_ref) {
23221
23819
  * @returns
23222
23820
  */
23223
23821
 
23224
- var CoreThemeStoreProvider = function CoreThemeStoreProvider(_ref2) {
23225
- var children = _ref2.children,
23226
- _ref2$theme = _ref2.theme,
23227
- theme = _ref2$theme === void 0 ? lightTheme : _ref2$theme,
23228
- store = _ref2.store;
23822
+ var CoreThemeStoreProvider = function CoreThemeStoreProvider(_ref3) {
23823
+ var children = _ref3.children,
23824
+ _ref3$theme = _ref3.theme,
23825
+ theme = _ref3$theme === void 0 ? lightTheme : _ref3$theme,
23826
+ store = _ref3.store;
23229
23827
  return /*#__PURE__*/React__default.createElement(Provider, {
23230
23828
  store: store
23231
- }, /*#__PURE__*/React__default.createElement(DynamicModuleLoader, {
23232
- modules: coreModuleConfig
23233
- }, /*#__PURE__*/React__default.createElement(CoreThemeProvider, {
23829
+ }, /*#__PURE__*/React__default.createElement(ThemeWrapperWithModules, {
23234
23830
  theme: theme
23235
- }, /*#__PURE__*/React__default.createElement(SnackbarWrapperConnect, null, children))));
23831
+ }, /*#__PURE__*/React__default.createElement(SnackbarWrapperConnect, null, children)));
23236
23832
  };
23237
23833
 
23238
23834
  /* *