@opengeoweb/core 4.2.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 (116) hide show
  1. package/index.esm.js +2047 -1262
  2. package/index.umd.js +2057 -1207
  3. package/lib/components/CanvasComponent/CanvasComponent.d.ts +7 -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/KeywordFilterResults/KeywordFilterResults.stories.d.ts +12 -16
  8. package/lib/components/LayerManager/LayerSelect/LayerInfo/LayerInfoLegend.d.ts +10 -0
  9. package/lib/components/{TimeSlider/TimeSliderScaleSlider/TimeSliderScaleSlider.spec.d.ts → LayerManager/LayerSelect/LayerInfo/LayerInfoLegend.spec.d.ts} +0 -0
  10. package/lib/components/LayerManager/LayerSelect/LayerInfo/LayerInfoList.d.ts +6 -5
  11. package/lib/components/LayerManager/LayerSelect/LayerInfo/LayerInfoText.d.ts +9 -0
  12. package/lib/components/LayerManager/LayerSelect/LayerInfo/LayerInfoUtils.d.ts +7 -1
  13. package/lib/components/LayerManager/LayerSelect/LayerList/LayerList.d.ts +4 -5
  14. package/lib/components/LayerManager/LayerSelect/LayerList/LayerListConnect.d.ts +1 -0
  15. package/lib/components/LayerManager/LayerSelect/LayerList/LayerListDimensions.d.ts +7 -0
  16. package/lib/components/LayerManager/LayerSelect/LayerList/LayerListRow.d.ts +1 -0
  17. package/lib/components/LayerManager/LayerSelect/LayerSelect.d.ts +4 -0
  18. package/lib/components/LayerManager/LayerSelect/LayerSelect.stories.d.ts +8 -0
  19. package/lib/components/LayerManager/LayerSelect/LayerSelectUtils.d.ts +75 -0
  20. package/lib/components/LayerManager/LayerSelect/ServiceOptionsDialog/ServiceOptionsDialog.d.ts +2 -0
  21. package/lib/components/LayerManager/LayerSelect/ServiceOptionsDialog/ServiceOptionsDialog.stories.d.ts +12 -16
  22. package/lib/components/LayerManager/LayerSelect/ServiceOptionsDialog/ServiceOptionsDialogConnect.d.ts +2 -0
  23. package/lib/components/LayerManager/LayerSelect/ServicePopup/ServicePopup.stories.d.ts +24 -32
  24. package/lib/components/LayerManager/LayerSelect/ServicePopup/utils.d.ts +2 -0
  25. package/lib/components/LayerManager/useFetchServices.d.ts +1 -1
  26. package/lib/components/Legend/LegendLayout.d.ts +13 -0
  27. package/lib/components/{TimeSlider/TimeSliderScaleSlider/TimeSliderScaleSliderConnect.spec.d.ts → Legend/LegendLayout.spec.d.ts} +0 -0
  28. package/lib/components/MapControls/MapControlButton.d.ts +1 -1
  29. package/lib/components/MultiMapView/ModelRunInterval/ModelRunInterval.d.ts +6 -0
  30. package/lib/components/MultiMapView/MultiMapViewConnect.d.ts +1 -0
  31. package/lib/components/ReactMapView/AdagucMapDraw.d.ts +1 -1
  32. package/lib/components/ReactMapView/AdagucMapDrawTools.d.ts +1 -1
  33. package/lib/components/ReactMapView/ReactMapView.d.ts +7 -6
  34. package/lib/components/ReactMapView/ReactMapViewParseLayer.d.ts +3 -3
  35. package/lib/components/SyncGroups/SimpleTimeSliderConnect.d.ts +9 -1
  36. package/lib/components/SyncGroups/selector.d.ts +6 -6
  37. package/lib/components/TimeSlider/TimeSlider.d.ts +0 -1
  38. package/lib/components/TimeSlider/TimeSlider.stories.d.ts +15 -0
  39. package/lib/components/TimeSlider/TimeSliderButtons/AutoUpdateButton/AutoUpdateButtonConnect.d.ts +13 -1
  40. package/lib/components/TimeSlider/TimeSliderButtons/BackwardForwardStepButton/BackwardForwardStepButton.d.ts +10 -0
  41. package/lib/components/TimeSlider/TimeSliderButtons/BackwardForwardStepButton/BackwardForwardStepButton.spec.d.ts +1 -0
  42. package/lib/components/TimeSlider/TimeSliderButtons/BackwardForwardStepButton/BackwardForwardStepButtonConnect.d.ts +6 -0
  43. package/lib/components/TimeSlider/TimeSliderButtons/BackwardForwardStepButton/BackwardForwardStepButtonConnect.spec.d.ts +1 -0
  44. package/lib/components/TimeSlider/TimeSliderButtons/HideSliderButton/HideSliderButton.d.ts +7 -0
  45. package/lib/components/TimeSlider/TimeSliderButtons/HideSliderButton/HideSliderButton.spec.d.ts +1 -0
  46. package/lib/components/TimeSlider/TimeSliderButtons/NowButton/NowButton.d.ts +8 -0
  47. package/lib/components/TimeSlider/TimeSliderButtons/NowButton/NowButton.spec.d.ts +1 -0
  48. package/lib/components/TimeSlider/TimeSliderButtons/NowButton/NowButtonConnect.d.ts +9 -0
  49. package/lib/components/TimeSlider/TimeSliderButtons/NowButton/NowButtonConnect.spec.d.ts +1 -0
  50. package/lib/components/TimeSlider/TimeSliderButtons/OptionsMenuButton/OptionsMenuButton.d.ts +4 -1
  51. package/lib/components/TimeSlider/TimeSliderButtons/OptionsMenuButton/OptionsMenuButton.stories.d.ts +24 -0
  52. package/lib/components/TimeSlider/TimeSliderButtons/OptionsMenuButton/OptionsMenuButtonConnect.d.ts +1 -0
  53. package/lib/components/TimeSlider/TimeSliderButtons/PlayButton/PlayButtonConnect.d.ts +19 -18
  54. package/lib/components/TimeSlider/TimeSliderButtons/TimeScaleButton/TimeScaleButton.d.ts +11 -0
  55. package/lib/components/TimeSlider/TimeSliderButtons/TimeScaleButton/TimeScaleButton.spec.d.ts +1 -0
  56. package/lib/components/TimeSlider/TimeSliderButtons/TimeScaleButton/TimeScaleButtonConnect.d.ts +4 -0
  57. package/lib/components/TimeSlider/TimeSliderButtons/TimeScaleButton/TimeScaleButtonConnect.spec.d.ts +1 -0
  58. package/lib/components/TimeSlider/TimeSliderButtons/TimeSliderButtons.d.ts +2 -0
  59. package/lib/components/TimeSlider/TimeSliderButtons/TimeSliderButtons.stories.d.ts +6 -0
  60. package/lib/components/TimeSlider/TimeSliderButtons/TimeSliderButtonsConnect.d.ts +1 -0
  61. package/lib/components/TimeSlider/TimeSliderButtons/TimeSliderMenu/TimeSliderMenu.stories.d.ts +12 -16
  62. package/lib/components/TimeSlider/TimeSliderButtons/TimeStepButton/TimeStepButton.stories.d.ts +10 -16
  63. package/lib/components/TimeSlider/TimeSliderClock/TimeSliderClock.d.ts +5 -0
  64. package/lib/components/TimeSlider/TimeSliderClock/TimeSliderClock.stories.d.ts +24 -0
  65. package/lib/components/TimeSlider/TimeSliderClock/TimeSliderClockConnect.d.ts +4 -0
  66. package/lib/components/TimeSlider/TimeSliderClock/TimeSliderClockConnect.spec.d.ts +1 -0
  67. package/lib/components/TimeSlider/TimeSliderConnect.d.ts +12 -1
  68. package/lib/components/TimeSlider/TimeSliderLegend/TimeSliderLegend.d.ts +1 -0
  69. package/lib/components/TimeSlider/TimeSliderLegend/TimeSliderLegendConnect.d.ts +22 -3
  70. package/lib/components/TimeSlider/TimeSliderLegend/TimeSliderLegendRenderFunctions.d.ts +1 -1
  71. package/lib/components/TimeSlider/TimeSliderRail/TimeSliderRailConnect.d.ts +22 -3
  72. package/lib/components/TimeSlider/TimeSliderRail/TimeSliderRailRenderFunctions.d.ts +1 -1
  73. package/lib/components/TimeSlider/TimeSliderUtils.d.ts +9 -1
  74. package/lib/components/WMSLoader/WMSLayerTree/WMSLayerTreeConnect.d.ts +11 -1
  75. package/lib/components/WMSLoader/services.d.ts +2 -1
  76. package/lib/index.d.ts +52 -52
  77. package/lib/store/coreModuleConfig.d.ts +1 -1
  78. package/lib/store/generic/actions.d.ts +2 -2
  79. package/lib/store/generic/config.d.ts +3 -2
  80. package/lib/store/generic/index.d.ts +10 -10
  81. package/lib/store/generic/selectors.d.ts +7 -7
  82. package/lib/store/generic/synchronizationGroups/reducer.d.ts +2 -2
  83. package/lib/store/generic/synchronizationGroups/selectors.d.ts +15 -15
  84. package/lib/store/layerSelect/config.d.ts +3 -2
  85. package/lib/store/layerSelect/reducer.d.ts +1 -1
  86. package/lib/store/layerSelect/sagas.d.ts +3 -1
  87. package/lib/store/layerSelect/selectors.d.ts +66 -48
  88. package/lib/store/layerSelect/types.d.ts +3 -3
  89. package/lib/store/mapStore/config.d.ts +3 -2
  90. package/lib/store/mapStore/layers/reducer.d.ts +1 -1
  91. package/lib/store/mapStore/layers/selectors.d.ts +129 -109
  92. package/lib/store/mapStore/layers/types.d.ts +2 -1
  93. package/lib/store/mapStore/map/actions.d.ts +2 -2
  94. package/lib/store/mapStore/map/reducer.d.ts +33 -33
  95. package/lib/store/mapStore/map/sagas.d.ts +3 -2
  96. package/lib/store/mapStore/map/selectors.d.ts +297 -297
  97. package/lib/store/mapStore/service/reducer.d.ts +1 -1
  98. package/lib/store/mapStore/service/selectors.d.ts +36 -63
  99. package/lib/store/mapStore/service/types.d.ts +10 -2
  100. package/lib/store/snackbar/config.d.ts +3 -2
  101. package/lib/store/snackbar/reducer.d.ts +1 -1
  102. package/lib/store/snackbar/selectors.d.ts +2 -2
  103. package/lib/store/ui/config.d.ts +3 -2
  104. package/lib/store/ui/reducer.d.ts +1 -1
  105. package/lib/store/ui/selectors.d.ts +35 -35
  106. package/lib/store/ui/types.d.ts +11 -3
  107. package/lib/store/utils.d.ts +2 -0
  108. package/lib/storybookUtils/store.d.ts +1 -1
  109. package/lib/utils/__mocks__/getCapabilities.d.ts +26 -36
  110. package/lib/utils/defaultConfigurations.d.ts +2 -2
  111. package/lib/utils/defaultTestSettings.d.ts +4 -2
  112. package/lib/utils/testUtils.d.ts +1 -1
  113. package/package.json +16 -13
  114. package/lib/components/TimeSlider/TimeSliderScaleSlider/TimeSliderScaleSlider.d.ts +0 -12
  115. package/lib/components/TimeSlider/TimeSliderScaleSlider/TimeSliderScaleSlider.stories.d.ts +0 -13
  116. package/lib/components/TimeSlider/TimeSliderScaleSlider/TimeSliderScaleSliderConnect.d.ts +0 -24
package/index.umd.js CHANGED
@@ -1,8 +1,8 @@
1
1
  (function (global, factory) {
2
- typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@reduxjs/toolkit'), require('immer'), require('moment'), require('react'), require('lodash'), require('redux-saga/effects'), require('react-redux'), require('@mui/material'), require('@opengeoweb/shared'), require('@opengeoweb/theme'), require('@opengeoweb/webmap'), require('react-sortablejs'), require('@opengeoweb/form-fields'), require('react-hook-form'), require('react-window'), require('@mui/material/Box'), require('@mui/material/Typography'), require('@mui/material/Grid'), require('throttle-debounce'), require('lodash.clonedeep'), require('proj4'), require('@turf/turf'), require('redux-dynamic-modules'), require('redux-dynamic-modules-saga')) :
3
- typeof define === 'function' && define.amd ? define(['exports', '@reduxjs/toolkit', 'immer', 'moment', 'react', 'lodash', 'redux-saga/effects', 'react-redux', '@mui/material', '@opengeoweb/shared', '@opengeoweb/theme', '@opengeoweb/webmap', 'react-sortablejs', '@opengeoweb/form-fields', 'react-hook-form', 'react-window', '@mui/material/Box', '@mui/material/Typography', '@mui/material/Grid', 'throttle-debounce', 'lodash.clonedeep', 'proj4', '@turf/turf', 'redux-dynamic-modules', 'redux-dynamic-modules-saga'], factory) :
4
- (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.Core = {}, global.toolkit, global.produce, global.moment, global.React, global._, global.effects, global.reactRedux, global.material, global.shared, global.theme, global.webmap, global.reactSortablejs, global.formFields, global.reactHookForm, global.reactWindow, global.Box, global.Typography, global.Grid, global.throttleDebounce, global.cloneDeep, global.proj4, global.turf, global.reduxDynamicModules, global.reduxDynamicModulesSaga));
5
- })(this, (function (exports, toolkit, produce, moment, React, _, effects, reactRedux, material, shared, theme, webmap, reactSortablejs, formFields, reactHookForm, reactWindow, Box, Typography, Grid, throttleDebounce, cloneDeep, proj4, turf, reduxDynamicModules, reduxDynamicModulesSaga) { 'use strict';
2
+ typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@reduxjs/toolkit'), require('immer'), require('moment'), require('react'), require('lodash'), require('redux-saga/effects'), require('react-redux'), require('@mui/material'), require('@opengeoweb/shared'), require('@opengeoweb/theme'), require('@opengeoweb/webmap'), require('react-sortablejs'), require('sortablejs'), require('@opengeoweb/form-fields'), require('react-hook-form'), require('react-window'), require('@mui/material/Box'), require('@mui/material/Typography'), require('@mui/material/Grid'), require('@mui/material/Tooltip'), require('throttle-debounce'), require('lodash.clonedeep'), require('proj4'), require('@turf/turf'), require('@mui/system'), require('react-draggable'), require('re-resizable'), require('@redux-eggs/redux-toolkit'), require('@redux-eggs/saga-extension')) :
3
+ typeof define === 'function' && define.amd ? define(['exports', '@reduxjs/toolkit', 'immer', 'moment', 'react', 'lodash', 'redux-saga/effects', 'react-redux', '@mui/material', '@opengeoweb/shared', '@opengeoweb/theme', '@opengeoweb/webmap', 'react-sortablejs', 'sortablejs', '@opengeoweb/form-fields', 'react-hook-form', 'react-window', '@mui/material/Box', '@mui/material/Typography', '@mui/material/Grid', '@mui/material/Tooltip', 'throttle-debounce', 'lodash.clonedeep', 'proj4', '@turf/turf', '@mui/system', 'react-draggable', 're-resizable', '@redux-eggs/redux-toolkit', '@redux-eggs/saga-extension'], factory) :
4
+ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.Core = {}, global.toolkit, global.produce, global.moment, global.React, global._, global.effects, global.reactRedux, global.material, global.shared, global.theme, global.webmap, global.reactSortablejs, global.Sortable, global.formFields, global.reactHookForm, global.reactWindow, global.Box, global.Typography, global.Grid, global.Tooltip, global.throttleDebounce, global.cloneDeep, global.proj4, global.turf, global.system, global.Draggable, global.reResizable, global.reduxToolkit, global.sagaExtension));
5
+ })(this, (function (exports, toolkit, produce, moment, React, _, effects, reactRedux, material, shared, theme, webmap, reactSortablejs, Sortable, formFields, reactHookForm, reactWindow, Box, Typography, Grid, Tooltip, throttleDebounce, cloneDeep, proj4, turf, system, Draggable, reResizable, reduxToolkit, sagaExtension) { 'use strict';
6
6
 
7
7
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
8
8
 
@@ -29,12 +29,15 @@
29
29
  var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
30
30
  var React__namespace = /*#__PURE__*/_interopNamespace(React);
31
31
  var ___default = /*#__PURE__*/_interopDefaultLegacy(_);
32
+ var Sortable__default = /*#__PURE__*/_interopDefaultLegacy(Sortable);
32
33
  var Box__default = /*#__PURE__*/_interopDefaultLegacy(Box);
33
34
  var Typography__default = /*#__PURE__*/_interopDefaultLegacy(Typography);
34
35
  var Grid__default = /*#__PURE__*/_interopDefaultLegacy(Grid);
36
+ var Tooltip__default = /*#__PURE__*/_interopDefaultLegacy(Tooltip);
35
37
  var cloneDeep__default = /*#__PURE__*/_interopDefaultLegacy(cloneDeep);
36
38
  var proj4__default = /*#__PURE__*/_interopDefaultLegacy(proj4);
37
39
  var turf__namespace = /*#__PURE__*/_interopNamespace(turf);
40
+ var Draggable__default = /*#__PURE__*/_interopDefaultLegacy(Draggable);
38
41
 
39
42
  /*! *****************************************************************************
40
43
  Copyright (c) Microsoft Corporation.
@@ -206,6 +209,7 @@
206
209
  LayerActionOrigin["ReactMapViewParseLayer"] = "ReactMapViewParseLayer";
207
210
  LayerActionOrigin["setLayerDimensionSaga"] = "setLayerDimensionSaga";
208
211
  LayerActionOrigin["toggleAutoUpdateSaga"] = "toggleAutoUpdateSaga";
212
+ LayerActionOrigin["unregisterMapSaga"] = "unregisterMapSaga";
209
213
  })(LayerActionOrigin || (LayerActionOrigin = {}));
210
214
 
211
215
  /* *
@@ -437,6 +441,7 @@
437
441
  get LayerActionOrigin () { return LayerActionOrigin; }
438
442
  });
439
443
 
444
+ var millisecondsInSecond = 1000;
440
445
  var defaultAnimationDelayAtStart = 250;
441
446
  var defaultDelay = 1000; // [ms]
442
447
 
@@ -453,6 +458,11 @@
453
458
  var getSpeedFactor = function getSpeedFactor(speedDelay) {
454
459
  return defaultDelay / speedDelay;
455
460
  };
461
+ var getSelectedTime = function getSelectedTime(timeDimension) {
462
+ var currentValueIsValid = timeDimension && timeDimension.currentValue && moment__default["default"].utc(timeDimension.currentValue).isValid();
463
+ var selectedTime = currentValueIsValid && timeDimension ? moment__default["default"].utc(timeDimension.currentValue).unix() : moment__default["default"].utc().unix();
464
+ return selectedTime;
465
+ };
456
466
  /**
457
467
  * Returns time bounds from the given dimension. If no time dimension given, current time is returned as default
458
468
  */
@@ -462,13 +472,12 @@
462
472
  second: 0,
463
473
  millisecond: 0
464
474
  }).unix();
465
- var timeDimension = dimensions ? dimensions.find(function (dim) {
475
+ var timeDimension = dimensions === null || dimensions === void 0 ? void 0 : dimensions.find(function (dim) {
466
476
  return dim.name === 'time';
467
- }) : null;
477
+ });
468
478
  var startTime = timeDimension && timeDimension.minValue ? moment__default["default"].utc(timeDimension.minValue).unix() : defaultStartEnd;
469
479
  var endTime = timeDimension && timeDimension.maxValue ? moment__default["default"].utc(timeDimension.maxValue).unix() : defaultStartEnd;
470
- var currentValueIsValid = timeDimension && timeDimension.currentValue && moment__default["default"].utc(timeDimension.currentValue).isValid();
471
- var selectedTime = currentValueIsValid ? moment__default["default"].utc(timeDimension.currentValue).unix() : moment__default["default"].utc().unix();
480
+ var selectedTime = getSelectedTime(timeDimension);
472
481
  return {
473
482
  selectedTime: selectedTime,
474
483
  startTime: startTime,
@@ -503,22 +512,12 @@
503
512
  var pixelToTimestamp = function pixelToTimestamp(timePx, centerTime, widthPx, secondsPerPx) {
504
513
  return centerTime - (widthPx / 2 - timePx) * secondsPerPx;
505
514
  };
506
- var onSetNewDateDebouncer;
507
515
  var onsetNewDateDebounced = function onsetNewDateDebounced(dateToSet, onSetNewDate) {
508
- /* Debounce the dateToSet with a simple timeout */
509
- if (onSetNewDateDebouncer === undefined) {
510
- onSetNewDateDebouncer = dateToSet;
516
+ _.debounce(function () {
511
517
  onSetNewDate(dateToSet);
512
- window.setTimeout(function () {
513
- if (onSetNewDateDebouncer !== undefined && onSetNewDateDebouncer !== dateToSet) {
514
- onSetNewDate(onSetNewDateDebouncer);
515
- }
516
-
517
- onSetNewDateDebouncer = undefined;
518
- }, 10);
519
- } else {
520
- onSetNewDateDebouncer = dateToSet;
521
- }
518
+ }, 10, {
519
+ leading: true
520
+ })();
522
521
  };
523
522
  var roundWithTimeStep = function roundWithTimeStep(unixTime, timeStep, type) {
524
523
  var adjustedTimeStep = timeStep * 60;
@@ -540,7 +539,9 @@
540
539
  var setNewRoundedTime = function setNewRoundedTime(x, centerTime, width, secondsPerPx, timeStep, dataStartTime, dataEndTime, onSetNewDate) {
541
540
  var unixTime = pixelToTimestamp(x, centerTime, width, secondsPerPx);
542
541
  var roundedTime = roundWithTimeStep(unixTime, timeStep);
543
- var selectedTimeString = moment__default["default"].unix(Math.min(Math.max(roundedTime, dataStartTime), dataEndTime)).toISOString();
542
+ var maxTime = Math.max(roundedTime, dataStartTime);
543
+ var newTime = Math.min(maxTime, dataEndTime || roundedTime);
544
+ var selectedTimeString = moment__default["default"].unix(newTime).toISOString();
544
545
  onsetNewDateDebounced(selectedTimeString, onSetNewDate);
545
546
  };
546
547
  var getDataLimitsFromLayers = function getDataLimitsFromLayers(layers) {
@@ -567,49 +568,31 @@
567
568
  */
568
569
  [2147483647, 0]);
569
570
  };
570
- var getNextTimeStepvalue = function getNextTimeStepvalue(value, max) {
571
- var newValue = value + 1;
572
- return newValue > max ? max : newValue;
573
- };
574
- var getPreviousTimeStepvalue = function getPreviousTimeStepvalue(value, min) {
575
- var newValue = value - 1;
576
- return newValue < min ? min : newValue;
577
- };
578
- var getValueFromKeyboardEvent = function getValueFromKeyboardEvent(event, value, min, max, supportFourDirectionNavigation) {
579
- if (supportFourDirectionNavigation === void 0) {
580
- supportFourDirectionNavigation = false;
581
- }
571
+ var setPreviousTimeStep = function setPreviousTimeStep(timeStep, curTime, dataStartTime, onSetNewDate) {
572
+ var prevTimeStep = moment__default["default"].utc(curTime).subtract(timeStep, 'm').toISOString();
582
573
 
583
- if (!supportFourDirectionNavigation) {
584
- if (event.ctrlKey || event.metaKey) {
585
- switch (event.key) {
586
- case 'ArrowDown':
587
- return getPreviousTimeStepvalue(value, min);
574
+ if (!prevTimeStep) {
575
+ return;
576
+ }
588
577
 
589
- case 'ArrowUp':
590
- return getNextTimeStepvalue(value, max);
578
+ if (moment__default["default"].utc(prevTimeStep) < moment__default["default"].utc(dataStartTime * millisecondsInSecond)) {
579
+ return;
580
+ }
591
581
 
592
- default:
593
- return null;
594
- }
595
- }
596
- } else {
597
- // currently supportFourDirectionNavigation (left/right/up/down) is only used in horizontal slider TimeSliderScaleSlider
598
- switch (event.key) {
599
- case 'ArrowDown':
600
- case 'ArrowLeft':
601
- return getPreviousTimeStepvalue(value, min);
582
+ onsetNewDateDebounced(prevTimeStep, onSetNewDate);
583
+ };
584
+ var setNextTimeStep = function setNextTimeStep(timeStep, curTime, dataEndTime, onSetNewDate) {
585
+ var nextTimeStep = moment__default["default"].utc(curTime).add(timeStep, 'm').toISOString();
602
586
 
603
- case 'ArrowUp':
604
- case 'ArrowRight':
605
- return getNextTimeStepvalue(value, max);
587
+ if (!nextTimeStep) {
588
+ return;
589
+ }
606
590
 
607
- default:
608
- return null;
609
- }
591
+ if (moment__default["default"].utc(nextTimeStep) > moment__default["default"].utc(dataEndTime * millisecondsInSecond)) {
592
+ return;
610
593
  }
611
594
 
612
- return null;
595
+ onsetNewDateDebounced(nextTimeStep, onSetNewDate);
613
596
  };
614
597
  var getTimeStepFromDataInterval = function getTimeStepFromDataInterval(timeInterval) {
615
598
  switch (timeInterval.isRegularInterval) {
@@ -768,6 +751,25 @@
768
751
  var getAutoMoveAreaWidth = function getAutoMoveAreaWidth(scale) {
769
752
  return (scale === Scale.Year ? needleGeom.largeWidth : needleGeom.smallWidth) / 2 + AUTO_MOVE_AREA_PADDING;
770
753
  };
754
+ /** Reusable business logic for how to handle events that set time to now (closest).
755
+ * Used in NowButton and TimeSliderLegend.
756
+ */
757
+
758
+ var handleSetNowEvent = function handleSetNowEvent(timeStep, dataStartTime, dataEndTime, currentTime, onSetNewDate, onSetCenterTime) {
759
+ if (dataStartTime < dataEndTime) {
760
+ if (dataEndTime < currentTime) {
761
+ onSetNewDate(moment__default["default"].utc(dataEndTime * millisecondsInSecond).toISOString());
762
+ onSetCenterTime(dataEndTime);
763
+ } else if (dataStartTime > currentTime) {
764
+ onSetNewDate(moment__default["default"].utc(dataStartTime * millisecondsInSecond).toISOString());
765
+ onSetCenterTime(dataStartTime);
766
+ } else {
767
+ var closestToCurrent = roundWithTimeStep(currentTime, timeStep);
768
+ onSetNewDate(moment__default["default"].utc(closestToCurrent * millisecondsInSecond).toISOString());
769
+ onSetCenterTime(closestToCurrent);
770
+ }
771
+ }
772
+ };
771
773
 
772
774
  var createMap = function createMap(_a) {
773
775
  var id = _a.id,
@@ -1697,6 +1699,9 @@
1697
1699
  resultEqualityCheck: _.isEqual
1698
1700
  }
1699
1701
  };
1702
+ var isUserAddedService = function isUserAddedService(scope) {
1703
+ return scope === 'user';
1704
+ };
1700
1705
 
1701
1706
  /* *
1702
1707
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -1818,25 +1823,6 @@
1818
1823
  var getLayerStyles$1 = toolkit.createSelector(getLayerFromService, function (layer) {
1819
1824
  return layer && layer.styles ? layer.styles : [];
1820
1825
  }, selectorMemoizationOptions);
1821
- /**
1822
- * Gets services and maps them into an array
1823
- *
1824
- * Example: services = getServices(store)
1825
- * @param {object} store store: object - Store object
1826
- * @returns {array} returnType: [] - array containing services
1827
- */
1828
-
1829
- toolkit.createSelector(servicesStore, function (store) {
1830
- var services = store ? store.byId : {};
1831
- var arrayOfServiceObjects = Object.keys(services).map(function (key) {
1832
- return {
1833
- name: services[key].name,
1834
- serviceUrl: services[key].serviceUrl,
1835
- isUserAddedService: services[key].isUserAddedService
1836
- };
1837
- });
1838
- return arrayOfServiceObjects;
1839
- }, selectorMemoizationOptions);
1840
1826
 
1841
1827
  /* *
1842
1828
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -2721,6 +2707,22 @@
2721
2707
  return layers[layerId];
2722
2708
  });
2723
2709
  }, selectorMemoizationOptions);
2710
+ /**
2711
+ * Retrieves all layers (including base layers and overlayers) for the given mapId
2712
+ *
2713
+ * Example: layers = getLayersByMapId(store, mapId)
2714
+ * @param {object} store store: object - object from which the layers state will be extracted
2715
+ * @param {string} mapId mapId: string - mapId
2716
+ * @returns {array} returnType: ReduxLayer[] - an array of all layers containing layer information (service, name, style, enabled etc.)
2717
+ */
2718
+
2719
+ var getLayersByMapId = toolkit.createSelector(getAllLayers, function (_store, _mapId) {
2720
+ return _mapId;
2721
+ }, function (layers, mapId) {
2722
+ return layers.filter(function (layer) {
2723
+ return layer.mapId === mapId;
2724
+ });
2725
+ }, selectorMemoizationOptions);
2724
2726
  /**
2725
2727
  * Retrieves all layers that aren't base layers and aren't overlayers
2726
2728
  *
@@ -2941,7 +2943,7 @@
2941
2943
  *
2942
2944
  * Example: getDialogDetailsByType(store, 'legend')
2943
2945
  * @param {object} store store object from which the ui state wll be extracted
2944
- * @param {string} dialogType type of the dialog 'legend' | 'layerManager' | 'dimensionSelect-elevation'
2946
+ * @param {string} dialogType type of the dialog
2945
2947
  * @returns {array} [string, boolean] first element gives the active map id, second element whether the dialog is open
2946
2948
  */
2947
2949
 
@@ -2956,7 +2958,7 @@
2956
2958
  * For a given ui component: gets wether the dialog is open or closed
2957
2959
  *
2958
2960
  * @param {object} store store object from which the ui state wll be extracted
2959
- * @param {string} dialogType type of the dialog 'legend' | 'layerManager' | 'dimensionSelect-elevation'
2961
+ * @param {string} dialogType type of the dialog
2960
2962
  * @returns {boolean} returnType: boolean
2961
2963
  */
2962
2964
 
@@ -2971,7 +2973,7 @@
2971
2973
  *For a given ui component: gets the active map Id
2972
2974
  *
2973
2975
  * @param {object} store store object from which the ui state wll be extracted
2974
- * @param {string} dialogType type of the dialog 'legend' | 'layerManager' | 'dimensionSelect-elevation'
2976
+ * @param {string} dialogType type of the dialog
2975
2977
  * @returns {string} returnType: string - the active map id
2976
2978
  */
2977
2979
 
@@ -2986,7 +2988,7 @@
2986
2988
  *For a given ui component: gets the order of visible dialog
2987
2989
  *
2988
2990
  * @param {object} store store object from which the ui state wll be extracted
2989
- * @param {DialogType} dialogType type of the dialog 'legend' | 'layerManager' | 'dimensionSelect-elevation' | dimensionSelect-ensemble_member
2991
+ * @param {DialogType} dialogType type of the dialog
2990
2992
  * @returns {number} the higher the order number the higher the zIndex
2991
2993
  */
2992
2994
 
@@ -3012,7 +3014,7 @@
3012
3014
  *For a given ui component: returns if ordered on top
3013
3015
  *
3014
3016
  * @param {object} store store object from which the ui state wll be extracted
3015
- * @param {DialogType} dialogType type of the dialog 'legend' | 'layerManager' | 'dimensionSelect-elevation' | dimensionSelect-ensemble_member
3017
+ * @param {DialogType} dialogType type of the dialog
3016
3018
  * @returns {boolean}
3017
3019
  */
3018
3020
 
@@ -4276,6 +4278,25 @@
4276
4278
  getMapPresetError: getMapPresetError
4277
4279
  });
4278
4280
 
4281
+ var DialogTypes;
4282
+
4283
+ (function (DialogTypes) {
4284
+ DialogTypes["LayerInfo"] = "layerInfo";
4285
+ DialogTypes["SyncGroups"] = "syncGroups";
4286
+ DialogTypes["TimeSeriesSelect"] = "timeSeriesSelect";
4287
+ DialogTypes["TimeSeriesManager"] = "timeSeriesManager";
4288
+ DialogTypes["KeywordFilter"] = "keywordFilter";
4289
+ DialogTypes["DimensionSelectEnsembleMember"] = "dimensionSelect-ensemble_member";
4290
+ DialogTypes["DimensionSelectElevation"] = "dimensionSelect-elevation";
4291
+ DialogTypes["LayerManager"] = "layerManager";
4292
+ DialogTypes["LayerSelect"] = "layerSelect";
4293
+ })(DialogTypes || (DialogTypes = {}));
4294
+
4295
+ var types = /*#__PURE__*/Object.freeze({
4296
+ __proto__: null,
4297
+ get DialogTypes () { return DialogTypes; }
4298
+ });
4299
+
4279
4300
  /* *
4280
4301
  * Licensed under the Apache License, Version 2.0 (the "License");
4281
4302
  * you may not use this file except in compliance with the License.
@@ -4315,7 +4336,7 @@
4315
4336
  };
4316
4337
  var slice$1 = toolkit.createSlice({
4317
4338
  initialState: initialState$1,
4318
- name: 'layerSelect',
4339
+ name: DialogTypes.LayerSelect,
4319
4340
  reducers: {
4320
4341
  setSearchFilter: function setSearchFilter(draft, action) {
4321
4342
  var filterText = action.payload.filterText;
@@ -4332,7 +4353,7 @@
4332
4353
  serviceUrl = _a.serviceUrl,
4333
4354
  _abstract = _a["abstract"],
4334
4355
  keywords = _a.keywords,
4335
- isUserAddedService = _a.isUserAddedService,
4356
+ scope = _a.scope,
4336
4357
  groups = _a.groups;
4337
4358
 
4338
4359
  if (!draft.filters.activeServices.byId[serviceId]) {
@@ -4372,7 +4393,7 @@
4372
4393
  serviceId: serviceId,
4373
4394
  enabled: draft.allServicesEnabled,
4374
4395
  filterIds: filterIds,
4375
- isUserAddedService: isUserAddedService,
4396
+ scope: scope,
4376
4397
  serviceName: serviceName,
4377
4398
  serviceUrl: serviceUrl,
4378
4399
  "abstract": _abstract
@@ -4477,6 +4498,61 @@
4477
4498
  var reducer$1 = slice$1.reducer;
4478
4499
  var layerSelectActions = slice$1.actions;
4479
4500
 
4501
+ /* *
4502
+ * Licensed under the Apache License, Version 2.0 (the "License");
4503
+ * you may not use this file except in compliance with the License.
4504
+ * You may obtain a copy of the License at
4505
+ *
4506
+ * http://www.apache.org/licenses/LICENSE-2.0
4507
+ *
4508
+ * Unless required by applicable law or agreed to in writing, software
4509
+ * distributed under the License is distributed on an "AS IS" BASIS,
4510
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
4511
+ * See the License for the specific language governing permissions and
4512
+ * limitations under the License.
4513
+ *
4514
+ * Copyright 2021 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
4515
+ * Copyright 2021 - Finnish Meteorological Institute (FMI)
4516
+ * */
4517
+ var filterLayersFromService = function filterLayersFromService(serviceId, services, filterIds, allFiltersActive, searchString) {
4518
+ var mapStoreService = services[serviceId];
4519
+ if (!mapStoreService) return [];
4520
+
4521
+ if (searchString === '' && allFiltersActive) {
4522
+ return mapStoreService.layers.filter(function (layer) {
4523
+ return layer.leaf;
4524
+ });
4525
+ }
4526
+
4527
+ var searchStringArray = searchString.split(' ');
4528
+ return mapStoreService.layers.filter(function (layer) {
4529
+ return searchStringArray.every(function (search) {
4530
+ var _a, _b, _c;
4531
+
4532
+ var searchLowercase = search.toLowerCase();
4533
+ var layerFilterIds = layer.path.map(function (group) {
4534
+ return "groups-" + group;
4535
+ }).concat(layer.keywords.map(function (keyword) {
4536
+ return "keywords-" + keyword;
4537
+ }));
4538
+ var isFilterInLayer = (layerFilterIds === null || layerFilterIds === void 0 ? void 0 : layerFilterIds.some(function (id) {
4539
+ return filterIds.includes(id);
4540
+ })) || allFiltersActive;
4541
+ var isSearchTextInLayerFilter = layerFilterIds === null || layerFilterIds === void 0 ? void 0 : layerFilterIds.some(function (filterId) {
4542
+ return filterId.toLowerCase().includes(searchLowercase);
4543
+ });
4544
+ var isSearchTextInLayerName = (_a = layer.name) === null || _a === void 0 ? void 0 : _a.toLowerCase().includes(searchLowercase);
4545
+ var isSearchTextInLayerText = (_b = layer.text) === null || _b === void 0 ? void 0 : _b.toLowerCase().includes(searchLowercase);
4546
+ var isSearchTextInLayerAbstract = (_c = layer["abstract"]) === null || _c === void 0 ? void 0 : _c.toLowerCase().includes(searchLowercase);
4547
+ var isSearchTextInServiceName = mapStoreService.name.toLowerCase().includes(searchLowercase);
4548
+ var isSearchTextInLayer = isSearchTextInLayerName || isSearchTextInLayerText || isSearchTextInLayerAbstract || isSearchTextInLayerFilter || isSearchTextInServiceName;
4549
+ return isFilterInLayer && isSearchTextInLayer;
4550
+ });
4551
+ }).filter(function (layer) {
4552
+ return layer.leaf;
4553
+ });
4554
+ };
4555
+
4480
4556
  /* *
4481
4557
  * Licensed under the Apache License, Version 2.0 (the "License");
4482
4558
  * you may not use this file except in compliance with the License.
@@ -4635,6 +4711,22 @@
4635
4711
  var getActiveLayerInfo = toolkit.createSelector(layerSelectStore, function (store) {
4636
4712
  return store === null || store === void 0 ? void 0 : store.activeLayerInfo;
4637
4713
  });
4714
+ /**
4715
+ * Returns a filtered active layer object based on the given filter settings
4716
+ * Example: layerSelectSelectors.getFilteredLayers(store, filteredSettings);
4717
+ * @param {object} store store: object - object from which the service state will be extracted
4718
+ * @returns {array} returnType: ActiveLayerObject - an array of all filtered activelayers
4719
+ */
4720
+
4721
+ var getFilteredLayers = toolkit.createSelector([getEnabledServiceIds, getServices, getCheckedFilterIds, isAllFiltersChecked, getSearchFilter], function (enabledServiceIds, servicesStore, checkedFilterIds, allFiltersActive, searchFilter) {
4722
+ return enabledServiceIds.reduce(function (layerList, serviceId) {
4723
+ return layerList.concat(filterLayersFromService(serviceId, servicesStore, checkedFilterIds, allFiltersActive, searchFilter).map(function (layer) {
4724
+ return __assign(__assign({}, layer), {
4725
+ serviceName: serviceId
4726
+ });
4727
+ }));
4728
+ }, []);
4729
+ }, selectorMemoizationOptions);
4638
4730
 
4639
4731
  /* *
4640
4732
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -4708,17 +4800,6 @@
4708
4800
  return currentMessages.length > 0 ? currentMessages[0] : undefined;
4709
4801
  });
4710
4802
 
4711
- var DialogTypes;
4712
-
4713
- (function (DialogTypes) {
4714
- DialogTypes["LayerInfo"] = "layerInfo";
4715
- })(DialogTypes || (DialogTypes = {}));
4716
-
4717
- var types = /*#__PURE__*/Object.freeze({
4718
- __proto__: null,
4719
- get DialogTypes () { return DialogTypes; }
4720
- });
4721
-
4722
4803
  /* *
4723
4804
  * Licensed under the Apache License, Version 2.0 (the "License");
4724
4805
  * you may not use this file except in compliance with the License.
@@ -4746,8 +4827,8 @@
4746
4827
  * @returns {object} returnType: SynchronizationGroupState
4747
4828
  */
4748
4829
 
4749
- toolkit.createSelector(syncGroupStore, function (store) {
4750
- return store || [];
4830
+ var getSynchronizationGroupState = toolkit.createSelector(syncGroupStore, function (store) {
4831
+ return store || null;
4751
4832
  });
4752
4833
  var getSynchronizationGroup = function getSynchronizationGroup(state, id) {
4753
4834
  return syncGroupStore(state).groups.byId[id];
@@ -5803,25 +5884,9 @@
5803
5884
  });
5804
5885
  }
5805
5886
 
5806
- /* *
5807
- * Licensed under the Apache License, Version 2.0 (the "License");
5808
- * you may not use this file except in compliance with the License.
5809
- * You may obtain a copy of the License at
5810
- *
5811
- * http://www.apache.org/licenses/LICENSE-2.0
5812
- *
5813
- * Unless required by applicable law or agreed to in writing, software
5814
- * distributed under the License is distributed on an "AS IS" BASIS,
5815
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
5816
- * See the License for the specific language governing permissions and
5817
- * limitations under the License.
5818
- *
5819
- * Copyright 2020 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
5820
- * Copyright 2020 - Finnish Meteorological Institute (FMI)
5821
- * */
5822
5887
  var synchronizationGroupConfig = {
5823
5888
  id: 'syncronizationGroupStore-module',
5824
- reducerMap: {
5889
+ reducersMap: {
5825
5890
  syncronizationGroupStore: reducer$2
5826
5891
  },
5827
5892
  sagas: [rootSaga$5, rootSaga$4]
@@ -5984,12 +6049,12 @@
5984
6049
  * See the License for the specific language governing permissions and
5985
6050
  * limitations under the License.
5986
6051
  *
5987
- * Copyright 2021 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
5988
- * Copyright 2021 - Finnish Meteorological Institute (FMI)
6052
+ * Copyright 2022 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
6053
+ * Copyright 2022 - Finnish Meteorological Institute (FMI)
5989
6054
  * */
5990
6055
  var uiModuleConfig = {
5991
6056
  id: 'ui-module',
5992
- reducerMap: {
6057
+ reducersMap: {
5993
6058
  ui: reducer$4
5994
6059
  },
5995
6060
  sagas: [rootSaga$3]
@@ -6056,9 +6121,7 @@
6056
6121
  var isAnimating = _a.isAnimating,
6057
6122
  isDisabled = _a.isDisabled,
6058
6123
  _b = _a.onTogglePlayButton,
6059
- onTogglePlayButton = _b === void 0 ? function () {
6060
- return null;
6061
- } : _b;
6124
+ onTogglePlayButton = _b === void 0 ? function () {} : _b;
6062
6125
 
6063
6126
  var onTogglePlay = function onTogglePlay() {
6064
6127
  onTogglePlayButton();
@@ -6316,7 +6379,7 @@
6316
6379
  };
6317
6380
  var KNMIgeoservicesObs = {
6318
6381
  name: 'KNMIgeoservicesObs',
6319
- url: 'https://geoservices.knmi.nl/adagucserver?dataset=OBS&service=WMS&',
6382
+ url: 'https://geoservices.knmi.nl/adagucserver?dataset=OBS',
6320
6383
  id: 'KNMIgeoservicesObs'
6321
6384
  };
6322
6385
  var KNMIgeoservicesKlimaatAtlas = {
@@ -6996,11 +7059,11 @@
6996
7059
  return;
6997
7060
  }
6998
7061
 
6999
- if (parseInt(this.ctx.canvas.height, 10) !== this.currentHeight) {
7062
+ if (this.ctx.canvas.height !== this.currentHeight) {
7000
7063
  this.ctx.canvas.height = this.currentHeight;
7001
7064
  }
7002
7065
 
7003
- if (parseInt(this.ctx.canvas.width, 10) !== this.currentWidth) {
7066
+ if (this.ctx.canvas.width !== this.currentWidth) {
7004
7067
  this.ctx.canvas.width = this.currentWidth;
7005
7068
  }
7006
7069
 
@@ -7177,6 +7240,84 @@
7177
7240
  return CanvasComponent;
7178
7241
  }(React.Component);
7179
7242
 
7243
+ /* *
7244
+ * Licensed under the Apache License, Version 2.0 (the "License");
7245
+ * you may not use this file except in compliance with the License.
7246
+ * You may obtain a copy of the License at
7247
+ *
7248
+ * http://www.apache.org/licenses/LICENSE-2.0
7249
+ *
7250
+ * Unless required by applicable law or agreed to in writing, software
7251
+ * distributed under the License is distributed on an "AS IS" BASIS,
7252
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
7253
+ * See the License for the specific language governing permissions and
7254
+ * limitations under the License.
7255
+ *
7256
+ * Copyright 2022 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
7257
+ * Copyright 2022 - Finnish Meteorological Institute (FMI)
7258
+ * */
7259
+
7260
+ var LegendLayout = function LegendLayout(_a) {
7261
+ var title = _a.title,
7262
+ name = _a.name,
7263
+ dimensions = _a.dimensions,
7264
+ children = _a.children,
7265
+ height = _a.height,
7266
+ width = _a.width,
7267
+ minWidth = _a.minWidth;
7268
+ return /*#__PURE__*/React__default["default"].createElement(material.Paper, {
7269
+ "data-testid": "legend",
7270
+ sx: {
7271
+ padding: '10px',
7272
+ border: '1px solid grey',
7273
+ backgroundColor: '#FFF',
7274
+ overflow: 'hidden',
7275
+ marginBottom: 0.5
7276
+ }
7277
+ }, /*#__PURE__*/React__default["default"].createElement(material.Box, {
7278
+ "data-testid": "legend-title"
7279
+ }, /*#__PURE__*/React__default["default"].createElement(material.Typography, {
7280
+ sx: {
7281
+ fontFamily: 'Roboto, Helvetica, Arial',
7282
+ fontSize: '10px',
7283
+ minWidth: '100%',
7284
+ wordWrap: 'break-word',
7285
+ color: 'common.black',
7286
+ whiteSpace: 'nowrap'
7287
+ },
7288
+ variant: "h3"
7289
+ }, title)), /*#__PURE__*/React__default["default"].createElement(material.Tooltip, {
7290
+ title: title || 'loading',
7291
+ placement: "top"
7292
+ }, /*#__PURE__*/React__default["default"].createElement(material.Box, {
7293
+ sx: {
7294
+ margin: '10px 0px 10px 0px',
7295
+ height: height + "px",
7296
+ width: width + "px"
7297
+ }
7298
+ }, children)), /*#__PURE__*/React__default["default"].createElement(material.Box, {
7299
+ "data-testid": "legend-info",
7300
+ sx: __assign({
7301
+ fontFamily: 'Roboto, Helvetica, Arial',
7302
+ fontSize: 10,
7303
+ color: 'common.black',
7304
+ overflowX: 'hidden',
7305
+ wordWrap: 'break-word',
7306
+ whiteSpace: 'nowrap'
7307
+ }, minWidth && {
7308
+ minWidth: minWidth + "px"
7309
+ })
7310
+ }, dimensions && dimensions.map(function (dim) {
7311
+ return /*#__PURE__*/React__default["default"].createElement(material.Box, {
7312
+ key: name + dim.name
7313
+ }, dim.name === 'time' ? "" + dim.currentValue : /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null, /*#__PURE__*/React__default["default"].createElement(material.Box, {
7314
+ style: {
7315
+ fontWeight: 500
7316
+ }
7317
+ }, dim.name, ":"), dim.currentValue, " ", dim.units));
7318
+ })));
7319
+ };
7320
+
7180
7321
  /* *
7181
7322
  * Licensed under the Apache License, Version 2.0 (the "License");
7182
7323
  * you may not use this file except in compliance with the License.
@@ -7271,46 +7412,20 @@
7271
7412
  like a title and the WMS legendgraphic url */
7272
7413
 
7273
7414
  var wmLayer = getWMLayerById(layer.id);
7274
- return /*#__PURE__*/React__default["default"].createElement(material.Paper, {
7275
- "data-testid": "legend",
7276
- sx: {
7277
- padding: '10px',
7278
- border: '1px solid grey',
7279
- display: 'inline-block',
7280
- backgroundColor: '#FFF',
7281
- overflow: 'hidden',
7282
- marginBottom: 0.5
7283
- }
7284
- }, /*#__PURE__*/React__default["default"].createElement(material.Box, {
7285
- "data-testid": "legend-title",
7286
- style: {
7287
- maxWidth: canvasContainerWidth
7288
- }
7289
- }, /*#__PURE__*/React__default["default"].createElement(material.Typography, {
7290
- sx: {
7291
- fontFamily: 'Roboto, Helvetica, Arial',
7292
- fontSize: '10px',
7293
- minWidth: defaultCanvasWidth + "px",
7294
- wordWrap: 'break-word',
7295
- color: 'common.black'
7296
- },
7297
- variant: "h3"
7298
- }, wmLayer && wmLayer.title)), /*#__PURE__*/React__default["default"].createElement(material.Tooltip, {
7299
- title: wmLayer && wmLayer.title || 'loading',
7300
- placement: "top"
7301
- }, /*#__PURE__*/React__default["default"].createElement(material.Box, {
7302
- sx: {
7303
- margin: '10px 0px 10px 0px',
7304
- height: canvasContainerHeight + "px",
7305
- width: canvasContainerWidth + "px"
7306
- }
7415
+ return /*#__PURE__*/React__default["default"].createElement(LegendLayout, {
7416
+ title: wmLayer === null || wmLayer === void 0 ? void 0 : wmLayer.title,
7417
+ name: wmLayer === null || wmLayer === void 0 ? void 0 : wmLayer.name,
7418
+ dimensions: layer === null || layer === void 0 ? void 0 : layer.dimensions,
7419
+ height: canvasContainerHeight,
7420
+ width: canvasContainerWidth,
7421
+ minWidth: defaultCanvasWidth
7307
7422
  }, /*#__PURE__*/React__default["default"].createElement(CanvasComponent, {
7308
7423
  redrawInterval: 500,
7309
7424
  onRenderCanvas: function onRenderCanvas(ctx, width, height) {
7310
7425
  /*
7311
- Check if the wmLayer is available, this happens when the WMS GetCapabilities is loaded and parsed.
7312
- Note that we cannot use the wmLayer variable above, as this one could contain a non initialized WMJSLayer.
7313
- */
7426
+ Check if the wmLayer is available, this happens when the WMS GetCapabilities is loaded and parsed.
7427
+ Note that we cannot use the wmLayer variable above, as this one could contain a non initialized WMJSLayer.
7428
+ */
7314
7429
  var legendWmLayer = getWMLayerById(layer.id);
7315
7430
  var legendUrl = webmap.getLegendGraphicURLForLayer(legendWmLayer);
7316
7431
  var image = webmap.legendImageStore.getImage(legendUrl);
@@ -7359,26 +7474,7 @@
7359
7474
  renderLegendGraphic(previousLegendImage.current, ctx, imageWidth, imageHeight);
7360
7475
  }
7361
7476
  }
7362
- }))), /*#__PURE__*/React__default["default"].createElement(material.Box, {
7363
- "data-testid": "legend-info",
7364
- sx: {
7365
- fontFamily: 'Roboto, Helvetica, Arial',
7366
- fontSize: 10,
7367
- color: 'common.black',
7368
- overflowX: 'hidden',
7369
- minWidth: defaultCanvasWidth + "px",
7370
- wordWrap: 'break-word',
7371
- maxWidth: canvasContainerWidth + "px"
7372
- }
7373
- }, layer.dimensions && layer.dimensions.map(function (dim) {
7374
- return /*#__PURE__*/React__default["default"].createElement(material.Box, {
7375
- key: layer.name + dim.name
7376
- }, dim.name === 'time' ? "" + dim.currentValue : /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null, /*#__PURE__*/React__default["default"].createElement(material.Box, {
7377
- style: {
7378
- fontWeight: 500
7379
- }
7380
- }, dim.name, ":"), dim.currentValue, " ", dim.units));
7381
- })));
7477
+ }));
7382
7478
  };
7383
7479
 
7384
7480
  /* *
@@ -7630,8 +7726,8 @@
7630
7726
  switch (_b.label) {
7631
7727
  case 0:
7632
7728
  mapId = payload.mapId, start = payload.start, end = payload.end, interval = payload.interval, timeList = payload.timeList;
7633
- roundedStart = roundWithTimeStep(start && moment__default["default"].utc(start).unix(), interval, 'ceil');
7634
- roundedEnd = roundWithTimeStep(end && moment__default["default"].utc(end).unix(), interval, 'floor');
7729
+ roundedStart = roundWithTimeStep(Number(start && moment__default["default"].utc(start).unix()), interval, 'ceil');
7730
+ roundedEnd = roundWithTimeStep(Number(end && moment__default["default"].utc(end).unix()), interval, 'floor');
7635
7731
  return [4
7636
7732
  /*yield*/
7637
7733
  , timeList || generateTimeList(moment__default["default"].utc(roundedStart * 1000), moment__default["default"].utc(roundedEnd * 1000), interval)];
@@ -8363,6 +8459,39 @@
8363
8459
  }
8364
8460
  });
8365
8461
  }
8462
+ function unregisterMapSaga(_a) {
8463
+ var mapId, layerList;
8464
+ var payload = _a.payload;
8465
+ return __generator(this, function (_b) {
8466
+ switch (_b.label) {
8467
+ case 0:
8468
+ mapId = payload.mapId;
8469
+ return [4
8470
+ /*yield*/
8471
+ , effects.select(getLayersByMapId, mapId)];
8472
+
8473
+ case 1:
8474
+ layerList = _b.sent();
8475
+ return [4
8476
+ /*yield*/
8477
+ , effects.all(layerList.map(function (layer) {
8478
+ return effects.put(layerActions.layerDelete({
8479
+ mapId: mapId,
8480
+ layerId: layer.id,
8481
+ layerIndex: 0,
8482
+ origin: LayerActionOrigin.unregisterMapSaga
8483
+ }));
8484
+ }))];
8485
+
8486
+ case 2:
8487
+ _b.sent();
8488
+
8489
+ return [2
8490
+ /*return*/
8491
+ ];
8492
+ }
8493
+ });
8494
+ }
8366
8495
  function rootSaga$2() {
8367
8496
  return __generator(this, function (_a) {
8368
8497
  switch (_a.label) {
@@ -8420,6 +8549,13 @@
8420
8549
  case 7:
8421
8550
  _a.sent();
8422
8551
 
8552
+ return [4
8553
+ /*yield*/
8554
+ , effects.takeEvery(mapActions$1.unregisterMap.type, unregisterMapSaga)];
8555
+
8556
+ case 8:
8557
+ _a.sent();
8558
+
8423
8559
  return [2
8424
8560
  /*return*/
8425
8561
  ];
@@ -8427,25 +8563,9 @@
8427
8563
  });
8428
8564
  }
8429
8565
 
8430
- /* *
8431
- * Licensed under the Apache License, Version 2.0 (the "License");
8432
- * you may not use this file except in compliance with the License.
8433
- * You may obtain a copy of the License at
8434
- *
8435
- * http://www.apache.org/licenses/LICENSE-2.0
8436
- *
8437
- * Unless required by applicable law or agreed to in writing, software
8438
- * distributed under the License is distributed on an "AS IS" BASIS,
8439
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
8440
- * See the License for the specific language governing permissions and
8441
- * limitations under the License.
8442
- *
8443
- * Copyright 2020 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
8444
- * Copyright 2020 - Finnish Meteorological Institute (FMI)
8445
- * */
8446
8566
  var moduleConfig = {
8447
8567
  id: 'webmap-module',
8448
- reducerMap: {
8568
+ reducersMap: {
8449
8569
  webmap: reducer$3,
8450
8570
  services: reducer$5,
8451
8571
  layers: reducer$6
@@ -8483,7 +8603,7 @@
8483
8603
  service = _c[1];
8484
8604
 
8485
8605
  return __assign(__assign({}, userServices), isNoIdService(service) ? (_b = {}, _b[serviceUrl] = __assign(__assign({}, service), {
8486
- isUserAddedService: true
8606
+ scope: 'user'
8487
8607
  }), _b) : {});
8488
8608
  }, {});
8489
8609
  }
@@ -8523,13 +8643,16 @@
8523
8643
  * Copyright 2022 - Finnish Meteorological Institute (FMI)
8524
8644
  * */
8525
8645
  function newServiceAddedSaga(capturedAction) {
8526
- var addedService, id, serviceUrl, name, isUserAddedService, _abstract, keywords, groups;
8646
+ var addedService, id, serviceUrl, name, scope, _abstract, isUpdating, keywords, groups;
8527
8647
 
8528
8648
  return __generator(this, function (_a) {
8529
8649
  switch (_a.label) {
8530
8650
  case 0:
8531
8651
  addedService = capturedAction.payload;
8532
- id = addedService.id, serviceUrl = addedService.serviceUrl, name = addedService.name, isUserAddedService = addedService.isUserAddedService, _abstract = addedService["abstract"];
8652
+ id = addedService.id, serviceUrl = addedService.serviceUrl, name = addedService.name, scope = addedService.scope, _abstract = addedService["abstract"], isUpdating = addedService.isUpdating;
8653
+ if (isUpdating) return [2
8654
+ /*return*/
8655
+ ];
8533
8656
  keywords = addedService.layers.reduce(function (keywords, layer) {
8534
8657
  var _a;
8535
8658
 
@@ -8555,7 +8678,7 @@
8555
8678
  serviceName: name,
8556
8679
  serviceUrl: serviceUrl,
8557
8680
  keywords: keywords,
8558
- isUserAddedService: isUserAddedService,
8681
+ scope: scope,
8559
8682
  groups: groups,
8560
8683
  "abstract": _abstract
8561
8684
  }))];
@@ -8569,6 +8692,131 @@
8569
8692
  }
8570
8693
  });
8571
8694
  }
8695
+ function layerSelectCloseInfoDialogSaga(_a) {
8696
+ var _b, togglePayload, activeMapIdPayload, isLayerInfoDialogOpen, isLayerInfoDialogOpen, filteredLayers, dialogInfo;
8697
+
8698
+ var type = _a.type,
8699
+ payload = _a.payload;
8700
+ return __generator(this, function (_c) {
8701
+ switch (_c.label) {
8702
+ case 0:
8703
+ _b = type;
8704
+
8705
+ switch (_b) {
8706
+ case uiActions.setToggleOpenDialog.type:
8707
+ return [3
8708
+ /*break*/
8709
+ , 1];
8710
+
8711
+ case uiActions.setActiveMapIdForDialog.type:
8712
+ return [3
8713
+ /*break*/
8714
+ , 4];
8715
+ }
8716
+
8717
+ return [3
8718
+ /*break*/
8719
+ , 8];
8720
+
8721
+ case 1:
8722
+ togglePayload = payload;
8723
+ if (!(!togglePayload.setOpen && togglePayload.type === DialogTypes.LayerSelect)) return [3
8724
+ /*break*/
8725
+ , 3];
8726
+ return [4
8727
+ /*yield*/
8728
+ , effects.put(uiActions.setToggleOpenDialog({
8729
+ type: DialogTypes.LayerInfo,
8730
+ setOpen: false
8731
+ }))];
8732
+
8733
+ case 2:
8734
+ _c.sent();
8735
+
8736
+ _c.label = 3;
8737
+
8738
+ case 3:
8739
+ return [3
8740
+ /*break*/
8741
+ , 13];
8742
+
8743
+ case 4:
8744
+ activeMapIdPayload = payload;
8745
+ if (!!activeMapIdPayload.setOpen) return [3
8746
+ /*break*/
8747
+ , 7];
8748
+ return [4
8749
+ /*yield*/
8750
+ , effects.select(getisDialogOpen, DialogTypes.LayerInfo)];
8751
+
8752
+ case 5:
8753
+ isLayerInfoDialogOpen = _c.sent();
8754
+ if (!isLayerInfoDialogOpen) return [3
8755
+ /*break*/
8756
+ , 7];
8757
+ return [4
8758
+ /*yield*/
8759
+ , effects.put(uiActions.setToggleOpenDialog({
8760
+ type: DialogTypes.LayerInfo,
8761
+ setOpen: false
8762
+ }))];
8763
+
8764
+ case 6:
8765
+ _c.sent();
8766
+
8767
+ _c.label = 7;
8768
+
8769
+ case 7:
8770
+ return [3
8771
+ /*break*/
8772
+ , 13];
8773
+
8774
+ case 8:
8775
+ return [4
8776
+ /*yield*/
8777
+ , effects.select(getisDialogOpen, DialogTypes.LayerInfo)];
8778
+
8779
+ case 9:
8780
+ isLayerInfoDialogOpen = _c.sent();
8781
+ if (!isLayerInfoDialogOpen) return [3
8782
+ /*break*/
8783
+ , 13];
8784
+ return [4
8785
+ /*yield*/
8786
+ , effects.select(getFilteredLayers)];
8787
+
8788
+ case 10:
8789
+ filteredLayers = _c.sent();
8790
+ return [4
8791
+ /*yield*/
8792
+ , effects.select(getActiveLayerInfo)];
8793
+
8794
+ case 11:
8795
+ dialogInfo = _c.sent();
8796
+ if (!!filteredLayers.map(function (layer) {
8797
+ return layer.text;
8798
+ }).includes(dialogInfo.text)) return [3
8799
+ /*break*/
8800
+ , 13];
8801
+ return [4
8802
+ /*yield*/
8803
+ , effects.put(uiActions.setToggleOpenDialog({
8804
+ type: DialogTypes.LayerInfo,
8805
+ setOpen: false
8806
+ }))];
8807
+
8808
+ case 12:
8809
+ _c.sent();
8810
+
8811
+ _c.label = 13;
8812
+
8813
+ case 13:
8814
+ return [2
8815
+ /*return*/
8816
+ ];
8817
+ }
8818
+ });
8819
+ }
8572
8820
  function layerSelectRemoveServiceSaga(capturedAction) {
8573
8821
  var removedService, serviceId, serviceUrl, results, services, servicesEnabled;
8574
8822
  return __generator(this, function (_a) {
@@ -8628,11 +8876,11 @@
8628
8876
  var _b;
8629
8877
 
8630
8878
  var payload = _a.payload;
8631
- var isUserAddedService = payload.isUserAddedService,
8879
+ var scope = payload.scope,
8632
8880
  name = payload.name,
8633
8881
  serviceUrl = payload.serviceUrl,
8634
8882
  _abstract2 = payload["abstract"];
8635
- if (!isUserAddedService) return;
8883
+ if (!isUserAddedService(scope)) return;
8636
8884
  var localStorageServices = getUserAddedServices();
8637
8885
  setUserAddedServices(__assign(__assign({}, localStorageServices), (_b = {}, _b[serviceUrl] = {
8638
8886
  name: name,
@@ -8683,6 +8931,13 @@
8683
8931
  case 4:
8684
8932
  _a.sent();
8685
8933
 
8934
+ return [4
8935
+ /*yield*/
8936
+ , effects.takeEvery([uiActions.setToggleOpenDialog.type, uiActions.setActiveMapIdForDialog.type, layerSelectActions.disableActiveService.type, layerSelectActions.toggleFilter.type, layerSelectActions.setSearchFilter.type], layerSelectCloseInfoDialogSaga)];
8937
+
8938
+ case 5:
8939
+ _a.sent();
8940
+
8686
8941
  return [2
8687
8942
  /*return*/
8688
8943
  ];
@@ -8690,25 +8945,9 @@
8690
8945
  });
8691
8946
  }
8692
8947
 
8693
- /* *
8694
- * Licensed under the Apache License, Version 2.0 (the "License");
8695
- * you may not use this file except in compliance with the License.
8696
- * You may obtain a copy of the License at
8697
- *
8698
- * http://www.apache.org/licenses/LICENSE-2.0
8699
- *
8700
- * Unless required by applicable law or agreed to in writing, software
8701
- * distributed under the License is distributed on an "AS IS" BASIS,
8702
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
8703
- * See the License for the specific language governing permissions and
8704
- * limitations under the License.
8705
- *
8706
- * Copyright 2021 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
8707
- * Copyright 2021 - Finnish Meteorological Institute (FMI)
8708
- * */
8709
8948
  var layerSelectConfig = {
8710
8949
  id: 'layerSelect-module',
8711
- reducerMap: {
8950
+ reducersMap: {
8712
8951
  layerSelect: reducer$1
8713
8952
  },
8714
8953
  sagas: [rootSaga$1]
@@ -8839,7 +9078,7 @@
8839
9078
  * */
8840
9079
  var snackbarModuleConfig = {
8841
9080
  id: 'snackbar-module',
8842
- reducerMap: {
9081
+ reducersMap: {
8843
9082
  snackbar: reducer
8844
9083
  },
8845
9084
  sagas: [rootSaga]
@@ -8920,6 +9159,7 @@
8920
9159
  return new Promise(function (resolve, reject) {
8921
9160
  var serviceObject = webmap.WMGetServiceFromStore(serviceUrl);
8922
9161
  serviceObject.getNodes(function (nodes) {
9162
+ // TODO: Maarten Plieger, 2022-11-02: Harmonize types and use correct types: https://gitlab.com/opengeoweb/opengeoweb/-/issues/2817
8923
9163
  var layerTree = recurseNodes(nodes);
8924
9164
  resolve(layerTree);
8925
9165
  }, function (error) {
@@ -9339,7 +9579,7 @@
9339
9579
  },
9340
9580
  {
9341
9581
  name: "KNMIgeoservicesObs",
9342
- url: "https://geoservices.knmi.nl/adagucserver?dataset=OBS&service=WMS&",
9582
+ url: "https://geoservices.knmi.nl/adagucserver?dataset=OBS",
9343
9583
  id: "KNMIgeoservicesObs"
9344
9584
  },
9345
9585
  {
@@ -9818,14 +10058,14 @@
9818
10058
  source = _b === void 0 ? 'app' : _b;
9819
10059
  var dispatch = reactRedux.useDispatch();
9820
10060
  var currentActiveMapId = reactRedux.useSelector(function (store) {
9821
- return getDialogMapId(store, 'layerSelect');
10061
+ return getDialogMapId(store, DialogTypes.LayerSelect);
9822
10062
  });
9823
10063
  var isOpenInStore = reactRedux.useSelector(function (store) {
9824
- return getisDialogOpen(store, 'layerSelect');
10064
+ return getisDialogOpen(store, DialogTypes.LayerSelect);
9825
10065
  });
9826
10066
  var openLayerSelectDialog = React__namespace.useCallback(function () {
9827
10067
  dispatch(uiActions.setActiveMapIdForDialog({
9828
- type: 'layerSelect',
10068
+ type: DialogTypes.LayerSelect,
9829
10069
  mapId: mapId,
9830
10070
  setOpen: currentActiveMapId !== mapId ? true : !isOpenInStore,
9831
10071
  source: source
@@ -10155,7 +10395,9 @@
10155
10395
  }, /*#__PURE__*/React__namespace.createElement(material.Typography, {
10156
10396
  variant: "body1",
10157
10397
  sx: {
10158
- fontSize: 'geowebColors.layerManager.tableRowDefaultText.fontSize',
10398
+ fontSize: function fontSize(theme) {
10399
+ return theme.palette.geowebColors.layerManager.tableRowDefaultText.fontSize;
10400
+ },
10159
10401
  color: 'geowebColors.layerManager.tableRowDefaultText.rgba',
10160
10402
  fontWeight: 500
10161
10403
  }
@@ -10558,9 +10800,7 @@
10558
10800
  services = _a.services,
10559
10801
  mapId = _a.mapId,
10560
10802
  _b = _a.onLayerRowClick,
10561
- onLayerRowClick = _b === void 0 ? function () {
10562
- return null;
10563
- } : _b,
10803
+ onLayerRowClick = _b === void 0 ? function () {} : _b,
10564
10804
  _c = _a.isEnabled,
10565
10805
  isEnabled = _c === void 0 ? true : _c,
10566
10806
  _d = _a.isLayerMissing,
@@ -10970,6 +11210,60 @@
10970
11210
  var isLayerEnabled = reactRedux.useSelector(function (store) {
10971
11211
  return getLayerEnabled(store, layerId);
10972
11212
  });
11213
+ var service = reactRedux.useSelector(function (store) {
11214
+ return getServiceByName(store, layerService);
11215
+ });
11216
+ var serviceSetLayers = React__namespace.useCallback(function (payload) {
11217
+ dispatch(serviceActions.serviceSetLayers(payload));
11218
+ }, [dispatch]);
11219
+
11220
+ var addService = function addService(serviceUrl) {
11221
+ return __awaiter(void 0, void 0, void 0, function () {
11222
+ var layers_1, wmService, error_1;
11223
+ return __generator(this, function (_a) {
11224
+ switch (_a.label) {
11225
+ case 0:
11226
+ _a.trys.push([0, 2,, 3]);
11227
+
11228
+ return [4
11229
+ /*yield*/
11230
+ , getLayersFlattenedFromService(serviceUrl)];
11231
+
11232
+ case 1:
11233
+ layers_1 = _a.sent();
11234
+ wmService = webmap.WMGetServiceFromStore(serviceUrl);
11235
+ serviceSetLayers({
11236
+ id: wmService.id,
11237
+ name: wmService.title,
11238
+ serviceUrl: serviceUrl,
11239
+ layers: layers_1,
11240
+ scope: 'user',
11241
+ "abstract": wmService["abstract"]
11242
+ });
11243
+ return [3
11244
+ /*break*/
11245
+ , 3];
11246
+
11247
+ case 2:
11248
+ error_1 = _a.sent();
11249
+ console.warn(error_1.message);
11250
+ return [3
11251
+ /*break*/
11252
+ , 3];
11253
+
11254
+ case 3:
11255
+ return [2
11256
+ /*return*/
11257
+ ];
11258
+ }
11259
+ });
11260
+ });
11261
+ };
11262
+
11263
+ if (!service) {
11264
+ addService(layerService);
11265
+ }
11266
+
10973
11267
  var layers = reactRedux.useSelector(function (store) {
10974
11268
  return getLayersFromService$1(store, layerService);
10975
11269
  });
@@ -11288,7 +11582,7 @@
11288
11582
  var onStart = React__namespace.useCallback(function (_a) {
11289
11583
  var oldIndex = _a.oldIndex;
11290
11584
  setActiveDragIndex(oldIndex);
11291
- reactSortablejs.Sortable.ghost.style.opacity = '1';
11585
+ Sortable__default["default"].ghost.style.opacity = '1';
11292
11586
  }, []);
11293
11587
  var onEnd = React__namespace.useCallback(function () {
11294
11588
  if (activeDragIndex !== null) {
@@ -11786,14 +12080,14 @@
11786
12080
  source = _b === void 0 ? 'app' : _b;
11787
12081
  var dispatch = reactRedux.useDispatch();
11788
12082
  var currentActiveMapId = reactRedux.useSelector(function (store) {
11789
- return getDialogMapId(store, 'keywordFilter');
12083
+ return getDialogMapId(store, DialogTypes.KeywordFilter);
11790
12084
  });
11791
12085
  var isOpenInStore = reactRedux.useSelector(function (store) {
11792
- return getisDialogOpen(store, 'keywordFilter');
12086
+ return getisDialogOpen(store, DialogTypes.KeywordFilter);
11793
12087
  });
11794
12088
  var openFilterResultsDialog = React__namespace.useCallback(function () {
11795
12089
  dispatch(uiActions.setActiveMapIdForDialog({
11796
- type: 'keywordFilter',
12090
+ type: DialogTypes.KeywordFilter,
11797
12091
  mapId: mapId,
11798
12092
  setOpen: currentActiveMapId !== mapId ? true : !isOpenInStore,
11799
12093
  source: source
@@ -11933,6 +12227,37 @@
11933
12227
 
11934
12228
  return true;
11935
12229
  };
12230
+ var loadWMSService = function loadWMSService(serviceUrl, forceReload) {
12231
+ if (forceReload === void 0) {
12232
+ forceReload = false;
12233
+ }
12234
+
12235
+ return __awaiter(void 0, void 0, void 0, function () {
12236
+ var layers, service;
12237
+ return __generator(this, function (_a) {
12238
+ switch (_a.label) {
12239
+ case 0:
12240
+ return [4
12241
+ /*yield*/
12242
+ , getLayersFlattenedFromService(serviceUrl, forceReload)];
12243
+
12244
+ case 1:
12245
+ layers = _a.sent();
12246
+ service = webmap.WMGetServiceFromStore(serviceUrl);
12247
+ return [2
12248
+ /*return*/
12249
+ , {
12250
+ id: service.id,
12251
+ name: service.title,
12252
+ serviceUrl: serviceUrl,
12253
+ "abstract": service["abstract"],
12254
+ layers: layers,
12255
+ scope: 'user'
12256
+ }];
12257
+ }
12258
+ });
12259
+ });
12260
+ };
11936
12261
 
11937
12262
  /* *
11938
12263
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -12087,77 +12412,40 @@
12087
12412
 
12088
12413
  var addNewService = function addNewService(formValues) {
12089
12414
  return __awaiter(void 0, void 0, void 0, function () {
12090
- var layers, serviceLayers, _a, _b, object, service;
12091
-
12092
- var e_1, _c;
12093
-
12094
- return __generator(this, function (_d) {
12095
- switch (_d.label) {
12415
+ var layersForService;
12416
+ return __generator(this, function (_a) {
12417
+ switch (_a.label) {
12096
12418
  case 0:
12097
12419
  clearErrors(fields.serviceUrl.name);
12098
12420
  setIsLoading(true);
12099
- _d.label = 1;
12421
+ _a.label = 1;
12100
12422
 
12101
12423
  case 1:
12102
- _d.trys.push([1, 3,, 4]);
12424
+ _a.trys.push([1, 3,, 4]);
12103
12425
 
12104
12426
  return [4
12105
12427
  /*yield*/
12106
- , getLayersFromService(formValues.serviceUrl)];
12428
+ , loadWMSService(formValues.serviceUrl, true)];
12107
12429
 
12108
12430
  case 2:
12109
- layers = _d.sent();
12110
-
12111
- if (layers.children) {
12112
- serviceLayers = [];
12113
-
12114
- try {
12115
- for (_a = __values(layers.children), _b = _a.next(); !_b.done; _b = _a.next()) {
12116
- object = _b.value;
12117
- serviceLayers.push({
12118
- name: object.name,
12119
- text: object.title,
12120
- leaf: object.leaf,
12121
- path: object.path,
12122
- keywords: object.keywords ? object.keywords : [],
12123
- "abstract": object["abstract"] ? object["abstract"] : '',
12124
- styles: object.styles ? object.styles : [],
12125
- dimensions: object.dimensions || [],
12126
- geographicBoundingBox: object.geographicBoundingBox || null
12127
- });
12128
- }
12129
- } catch (e_1_1) {
12130
- e_1 = {
12131
- error: e_1_1
12132
- };
12133
- } finally {
12134
- try {
12135
- if (_b && !_b.done && (_c = _a["return"])) _c.call(_a);
12136
- } finally {
12137
- if (e_1) throw e_1.error;
12138
- }
12139
- }
12140
-
12141
- service = webmap.WMGetServiceFromStore(formValues.serviceUrl);
12142
- serviceSetLayers({
12143
- id: service.id,
12144
- name: formValues.serviceName,
12145
- serviceUrl: formValues.serviceUrl,
12146
- "abstract": formValues.serviceAbstracts,
12147
- layers: serviceLayers,
12148
- isUserAddedService: true
12149
- });
12150
- setIsLoading(false);
12151
- showSnackbar(getSuccesMessage(formValues.serviceName));
12152
- closePopup();
12153
- }
12154
-
12431
+ layersForService = _a.sent();
12432
+ serviceSetLayers({
12433
+ id: layersForService.id,
12434
+ name: formValues.serviceName,
12435
+ serviceUrl: formValues.serviceUrl,
12436
+ "abstract": formValues.serviceAbstracts,
12437
+ layers: layersForService.layers,
12438
+ scope: 'user'
12439
+ });
12440
+ setIsLoading(false);
12441
+ showSnackbar(getSuccesMessage(formValues.serviceName));
12442
+ closePopup();
12155
12443
  return [3
12156
12444
  /*break*/
12157
12445
  , 4];
12158
12446
 
12159
12447
  case 3:
12160
- _d.sent();
12448
+ _a.sent();
12161
12449
  setIsLoading(false);
12162
12450
  setError(fields.serviceUrl.name, {
12163
12451
  message: VALIDATIONS_REQUEST_FAILED,
@@ -12301,8 +12589,8 @@
12301
12589
  })
12302
12590
  },
12303
12591
  disabled: isServiceUrlDisabled || isLoading,
12592
+ isReadOnly: isShowPopup,
12304
12593
  InputProps: {
12305
- readOnly: isShowPopup,
12306
12594
  disableUnderline: isShowPopup,
12307
12595
  endAdornment: isShowPopup && /*#__PURE__*/React__namespace.createElement(material.InputAdornment, {
12308
12596
  position: "end"
@@ -12325,8 +12613,8 @@
12325
12613
  }
12326
12614
  },
12327
12615
  disabled: isShowPopup || isLoading,
12616
+ isReadOnly: isShowPopup,
12328
12617
  InputProps: {
12329
- readOnly: isShowPopup,
12330
12618
  disableUnderline: isShowPopup
12331
12619
  },
12332
12620
  sx: style$1.textField,
@@ -12337,12 +12625,11 @@
12337
12625
  name: fields.serviceAbstracts.name,
12338
12626
  label: fields.serviceAbstracts.label,
12339
12627
  disabled: isShowPopup || isLoading,
12340
- rules: {},
12628
+ isReadOnly: isShowPopup,
12341
12629
  InputProps: {
12342
- readOnly: isShowPopup,
12343
12630
  disableUnderline: isShowPopup
12344
12631
  },
12345
- helperText: !isShowPopup && 'Short description of what this service does',
12632
+ helperText: !isShowPopup ? 'Short description of what this service does' : '',
12346
12633
  sx: style$1.textField,
12347
12634
  defaultValue: ""
12348
12635
  }), !isServiceUrlDisabled && /*#__PURE__*/React__namespace.createElement(InitialValidationsTrigger, {
@@ -12585,63 +12872,8 @@
12585
12872
  * See the License for the specific language governing permissions and
12586
12873
  * limitations under the License.
12587
12874
  *
12588
- * Copyright 2021 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
12589
- * Copyright 2021 - Finnish Meteorological Institute (FMI)
12590
- * */
12591
- var filterLayersFromService = function filterLayersFromService(serviceId, services, filterIds, allFiltersActive, searchString) {
12592
- var mapStoreService = services[serviceId];
12593
- if (!mapStoreService) return [];
12594
-
12595
- if (searchString === '' && allFiltersActive) {
12596
- return mapStoreService.layers.filter(function (layer) {
12597
- return layer.leaf;
12598
- });
12599
- }
12600
-
12601
- var searchStringArray = searchString.split(' ');
12602
- return mapStoreService.layers.filter(function (layer) {
12603
- return searchStringArray.every(function (search) {
12604
- var _a, _b, _c;
12605
-
12606
- var searchLowercase = search.toLowerCase();
12607
- var layerFilterIds = layer.path.map(function (group) {
12608
- return "group-" + group;
12609
- }).concat(layer.keywords.map(function (keyword) {
12610
- return "keyword-" + keyword;
12611
- }));
12612
- var isFilterInLayer = (layerFilterIds === null || layerFilterIds === void 0 ? void 0 : layerFilterIds.some(function (id) {
12613
- return filterIds.includes(id);
12614
- })) || allFiltersActive;
12615
- var isSearchTextInLayerFilter = layerFilterIds === null || layerFilterIds === void 0 ? void 0 : layerFilterIds.some(function (filterId) {
12616
- return filterId.toLowerCase().includes(searchLowercase);
12617
- });
12618
- var isSearchTextInLayerName = (_a = layer.name) === null || _a === void 0 ? void 0 : _a.toLowerCase().includes(searchLowercase);
12619
- var isSearchTextInLayerText = (_b = layer.text) === null || _b === void 0 ? void 0 : _b.toLowerCase().includes(searchLowercase);
12620
- var isSearchTextInLayerAbstract = (_c = layer["abstract"]) === null || _c === void 0 ? void 0 : _c.toLowerCase().includes(searchLowercase);
12621
- var isSearchTextInServiceName = mapStoreService.name.toLowerCase().includes(searchLowercase);
12622
- var isSearchTextInLayer = isSearchTextInLayerName || isSearchTextInLayerText || isSearchTextInLayerAbstract || isSearchTextInLayerFilter || isSearchTextInServiceName;
12623
- return isFilterInLayer && isSearchTextInLayer;
12624
- });
12625
- }).filter(function (layer) {
12626
- return layer.leaf;
12627
- });
12628
- };
12629
-
12630
- /* *
12631
- * Licensed under the Apache License, Version 2.0 (the "License");
12632
- * you may not use this file except in compliance with the License.
12633
- * You may obtain a copy of the License at
12634
- *
12635
- * http://www.apache.org/licenses/LICENSE-2.0
12636
- *
12637
- * Unless required by applicable law or agreed to in writing, software
12638
- * distributed under the License is distributed on an "AS IS" BASIS,
12639
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12640
- * See the License for the specific language governing permissions and
12641
- * limitations under the License.
12642
- *
12643
- * Copyright 2022 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
12644
- * Copyright 2022 - Finnish Meteorological Institute (FMI)
12875
+ * Copyright 2022 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
12876
+ * Copyright 2022 - Finnish Meteorological Institute (FMI)
12645
12877
  * */
12646
12878
 
12647
12879
  var LayerAddRemoveButton = function LayerAddRemoveButton(_a) {
@@ -12764,12 +12996,11 @@
12764
12996
  * Copyright 2022 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
12765
12997
  * Copyright 2022 - Finnish Meteorological Institute (FMI)
12766
12998
  * */
12767
- var textStyle$1 = {
12999
+ var textStyle = {
12768
13000
  lineHeight: '20px',
12769
13001
  letterSpacing: '0.25px'
12770
13002
  };
12771
-
12772
- var textStyleWithMargin = __assign(__assign({}, textStyle$1), {
13003
+ var textStyleWithMargin = __assign(__assign({}, textStyle), {
12773
13004
  marginBottom: 1
12774
13005
  });
12775
13006
 
@@ -12778,7 +13009,7 @@
12778
13009
  value = _a.value;
12779
13010
  return /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null, /*#__PURE__*/React__default["default"].createElement(Typography__default["default"], {
12780
13011
  variant: "subtitle2",
12781
- sx: textStyle$1
13012
+ sx: textStyle
12782
13013
  }, label), /*#__PURE__*/React__default["default"].createElement(Typography__default["default"], {
12783
13014
  variant: "body2",
12784
13015
  sx: textStyleWithMargin
@@ -12801,10 +13032,6 @@
12801
13032
  * Copyright 2022 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
12802
13033
  * Copyright 2022 - Finnish Meteorological Institute (FMI)
12803
13034
  * */
12804
- var textStyle = {
12805
- lineHeight: '20px',
12806
- letterSpacing: '0.25px'
12807
- };
12808
13035
 
12809
13036
  var valueStyle = __assign(__assign({}, textStyle), {
12810
13037
  overflowWrap: 'break-word'
@@ -12816,12 +13043,15 @@
12816
13043
  return /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null, /*#__PURE__*/React__default["default"].createElement(Typography__default["default"], {
12817
13044
  variant: "subtitle2",
12818
13045
  sx: textStyle
12819
- }, label), /*#__PURE__*/React__default["default"].createElement(Grid__default["default"], {
13046
+ }, label), list.length === 0 ? /*#__PURE__*/React__default["default"].createElement(Typography__default["default"], {
13047
+ variant: "body2",
13048
+ sx: textStyleWithMargin
13049
+ }, "-") : /*#__PURE__*/React__default["default"].createElement(Grid__default["default"], {
12820
13050
  container: true,
12821
13051
  direction: "column"
12822
13052
  }, list.map(function (item) {
12823
13053
  return /*#__PURE__*/React__default["default"].createElement("div", {
12824
- key: item.name
13054
+ key: item.label
12825
13055
  }, /*#__PURE__*/React__default["default"].createElement(Grid__default["default"], {
12826
13056
  item: true,
12827
13057
  container: true,
@@ -12834,7 +13064,7 @@
12834
13064
  }, /*#__PURE__*/React__default["default"].createElement(Typography__default["default"], {
12835
13065
  variant: "body2",
12836
13066
  sx: textStyle
12837
- }, item.name, ":"))), /*#__PURE__*/React__default["default"].createElement(Grid__default["default"], {
13067
+ }, item.label, ":"))), /*#__PURE__*/React__default["default"].createElement(Grid__default["default"], {
12838
13068
  item: true,
12839
13069
  container: true,
12840
13070
  direction: "row",
@@ -12849,6 +13079,41 @@
12849
13079
  })));
12850
13080
  };
12851
13081
 
13082
+ /* *
13083
+ * Licensed under the Apache License, Version 2.0 (the "License");
13084
+ * you may not use this file except in compliance with the License.
13085
+ * You may obtain a copy of the License at
13086
+ *
13087
+ * http://www.apache.org/licenses/LICENSE-2.0
13088
+ *
13089
+ * Unless required by applicable law or agreed to in writing, software
13090
+ * distributed under the License is distributed on an "AS IS" BASIS,
13091
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13092
+ * See the License for the specific language governing permissions and
13093
+ * limitations under the License.
13094
+ *
13095
+ * Copyright 2022 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
13096
+ * Copyright 2022 - Finnish Meteorological Institute (FMI)
13097
+ * */
13098
+
13099
+ var LayerInfoLegend = function LayerInfoLegend(_a) {
13100
+ var title = _a.title,
13101
+ name = _a.name,
13102
+ dimensions = _a.dimensions,
13103
+ legendURL = _a.legendURL;
13104
+ return /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null, /*#__PURE__*/React__default["default"].createElement(Typography__default["default"], {
13105
+ variant: "subtitle2",
13106
+ sx: textStyleWithMargin
13107
+ }, "Legend"), /*#__PURE__*/React__default["default"].createElement(LegendLayout, {
13108
+ title: title,
13109
+ name: name,
13110
+ dimensions: dimensions
13111
+ }, legendURL ? /*#__PURE__*/React__default["default"].createElement("img", {
13112
+ alt: title,
13113
+ src: legendURL
13114
+ }) : '-'));
13115
+ };
13116
+
12852
13117
  /* *
12853
13118
  * Licensed under the Apache License, Version 2.0 (the "License");
12854
13119
  * you may not use this file except in compliance with the License.
@@ -12880,22 +13145,19 @@
12880
13145
 
12881
13146
  return styles.join(', ');
12882
13147
  };
12883
- var getDimensionValue = function getDimensionValue(name, layer, breakAt, includeUnit) {
12884
- var _a;
12885
-
12886
- if (includeUnit === void 0) {
12887
- includeUnit = false;
12888
- }
12889
-
12890
- var dimension = (_a = layer.dimensions) === null || _a === void 0 ? void 0 : _a.find(function (dimension) {
12891
- return dimension.name.toLowerCase() === name;
13148
+ var getDimensionValue = function getDimensionValue(name, dimensions) {
13149
+ var dimension = dimensions === null || dimensions === void 0 ? void 0 : dimensions.find(function (dimension) {
13150
+ return dimension.name.toLowerCase() === name.toLowerCase();
12892
13151
  });
12893
13152
 
12894
- if (!dimension) {
12895
- return '-';
13153
+ if (!dimension || !dimension.currentValue) {
13154
+ return null;
12896
13155
  }
12897
13156
 
12898
- var dimValue = dimension === null || dimension === void 0 ? void 0 : dimension.currentValue.split(breakAt).join(breakAt + " ");
13157
+ var dimName = dimension.name.toLowerCase();
13158
+ var breakAt = dimName === 'time' ? '/' : ',';
13159
+ var includeUnit = dimName !== 'time' && dimName !== 'reference_time';
13160
+ var dimValue = dimension.currentValue.split(breakAt).join(breakAt + " ");
12899
13161
 
12900
13162
  if (includeUnit) {
12901
13163
  return dimValue + " " + dimension.units;
@@ -12906,6 +13168,64 @@
12906
13168
  var getLayerBbox = function getLayerBbox(layer) {
12907
13169
  return layer.geographicBoundingBox ? "west " + layer.geographicBoundingBox.west + ", east " + layer.geographicBoundingBox.east + ", north " + layer.geographicBoundingBox.north + ", south " + layer.geographicBoundingBox.south : '-';
12908
13170
  };
13171
+ var getDimensionIcon$1 = function getDimensionIcon(name, dimensions) {
13172
+ var dimension = dimensions === null || dimensions === void 0 ? void 0 : dimensions.find(function (dimension) {
13173
+ return dimension.name.toLowerCase() === name.toLowerCase();
13174
+ });
13175
+
13176
+ if (!dimension) {
13177
+ return null;
13178
+ }
13179
+
13180
+ switch (dimension.name.toLowerCase()) {
13181
+ case 'time':
13182
+ return /*#__PURE__*/React__default["default"].createElement(theme.DimensionsTime, null);
13183
+
13184
+ case 'reference_time':
13185
+ return /*#__PURE__*/React__default["default"].createElement(theme.DimensionsRefTime, null);
13186
+
13187
+ case 'elevation':
13188
+ return /*#__PURE__*/React__default["default"].createElement(theme.DimensionsElevation, null);
13189
+
13190
+ default:
13191
+ return /*#__PURE__*/React__default["default"].createElement(theme.DimensionsOther, null);
13192
+ }
13193
+ };
13194
+ var getDimensionLabel = function getDimensionLabel(name) {
13195
+ var dimName = name.toLowerCase().split('_').join(' ');
13196
+ return dimName.charAt(0).toUpperCase() + dimName.slice(1);
13197
+ };
13198
+ var getDimensionsList = function getDimensionsList(dimensions) {
13199
+ var result = [];
13200
+ dimensions === null || dimensions === void 0 ? void 0 : dimensions.forEach(function (_a) {
13201
+ var name = _a.name;
13202
+ var value = getDimensionValue(name, dimensions);
13203
+
13204
+ if (!value) {
13205
+ return;
13206
+ }
13207
+
13208
+ var icon = getDimensionIcon$1(name, dimensions);
13209
+ var label = getDimensionLabel(name);
13210
+ result.push({
13211
+ label: label,
13212
+ value: value,
13213
+ icon: icon
13214
+ });
13215
+ }); // sort alphabetically so other dimensions are sorted
13216
+
13217
+ result.sort(function (a, b) {
13218
+ return a.label.localeCompare(b.label);
13219
+ }); // sort by fixed order
13220
+
13221
+ var preferredOrder = ['Time', 'Reference time', 'Elevation']; // using reverse ordering to make sure the other dimensions come last
13222
+
13223
+ preferredOrder.reverse();
13224
+ result.sort(function (a, b) {
13225
+ return preferredOrder.indexOf(b.label) - preferredOrder.indexOf(a.label);
13226
+ });
13227
+ return result;
13228
+ };
12909
13229
 
12910
13230
  /* *
12911
13231
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -12925,23 +13245,21 @@
12925
13245
  * */
12926
13246
 
12927
13247
  var LayerInfoDialog = function LayerInfoDialog(_a) {
12928
- var _b;
13248
+ var _b, _c;
12929
13249
 
12930
13250
  var onClose = _a.onClose,
12931
13251
  layer = _a.layer,
12932
13252
  isOpen = _a.isOpen,
12933
- _c = _a.onMouseDown,
12934
- onMouseDown = _c === void 0 ? function () {} : _c,
12935
- _d = _a.order,
12936
- order = _d === void 0 ? 0 : _d,
12937
- _e = _a.source,
12938
- source = _e === void 0 ? 'app' : _e,
13253
+ _d = _a.onMouseDown,
13254
+ onMouseDown = _d === void 0 ? function () {} : _d,
13255
+ _e = _a.order,
13256
+ order = _e === void 0 ? 0 : _e,
13257
+ _f = _a.source,
13258
+ source = _f === void 0 ? 'app' : _f,
12939
13259
  dialogHeight = _a.dialogHeight;
12940
13260
  var styles = getLayerStyles(layer);
12941
13261
  var bbox = getLayerBbox(layer);
12942
- var timeValue = getDimensionValue('time', layer, '/');
12943
- var refTimeValue = getDimensionValue('reference_time', layer, ',');
12944
- var elevationValue = getDimensionValue('elevation', layer, ',', true);
13262
+ var dimensions = getDimensionsList(layer.dimensions);
12945
13263
  return /*#__PURE__*/React__default["default"].createElement(shared.ToolContainerDraggable, {
12946
13264
  onClose: onClose,
12947
13265
  headerSize: "xs",
@@ -12976,23 +13294,7 @@
12976
13294
  value: layer["abstract"] || '-'
12977
13295
  }), /*#__PURE__*/React__default["default"].createElement(LayerInfoList, {
12978
13296
  label: "Dimensions",
12979
- list: [{
12980
- name: 'Time',
12981
- value: timeValue,
12982
- icon: /*#__PURE__*/React__default["default"].createElement(theme.DimensionsTime, null)
12983
- }, {
12984
- name: 'Reference Time',
12985
- value: refTimeValue,
12986
- icon: /*#__PURE__*/React__default["default"].createElement(theme.DimensionsRefTime, null)
12987
- }, {
12988
- name: 'Elevation',
12989
- value: elevationValue,
12990
- icon: /*#__PURE__*/React__default["default"].createElement(theme.DimensionsElevation, null)
12991
- }, {
12992
- name: 'Other dimensions',
12993
- value: '-',
12994
- icon: /*#__PURE__*/React__default["default"].createElement(theme.DimensionsOther, null)
12995
- }]
13297
+ list: dimensions
12996
13298
  }), /*#__PURE__*/React__default["default"].createElement(LayerInfoText, {
12997
13299
  label: "Styles",
12998
13300
  value: styles
@@ -13005,9 +13307,152 @@
13005
13307
  }), /*#__PURE__*/React__default["default"].createElement(LayerInfoText, {
13006
13308
  label: "Keywords",
13007
13309
  value: ((_b = layer.keywords) === null || _b === void 0 ? void 0 : _b.join(', ')) || '-'
13310
+ }), /*#__PURE__*/React__default["default"].createElement(LayerInfoLegend, {
13311
+ title: layer.text,
13312
+ name: layer.name,
13313
+ dimensions: layer.dimensions,
13314
+ legendURL: ((_c = layer.styles) === null || _c === void 0 ? void 0 : _c.length) ? layer.styles[0].legendURL : undefined
13008
13315
  })));
13009
13316
  };
13010
13317
 
13318
+ /* *
13319
+ * Licensed under the Apache License, Version 2.0 (the "License");
13320
+ * you may not use this file except in compliance with the License.
13321
+ * You may obtain a copy of the License at
13322
+ *
13323
+ * http://www.apache.org/licenses/LICENSE-2.0
13324
+ *
13325
+ * Unless required by applicable law or agreed to in writing, software
13326
+ * distributed under the License is distributed on an "AS IS" BASIS,
13327
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13328
+ * See the License for the specific language governing permissions and
13329
+ * limitations under the License.
13330
+ *
13331
+ * Copyright 2022 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
13332
+ * Copyright 2022 - Finnish Meteorological Institute (FMI)
13333
+ * */
13334
+
13335
+ var LayerListDimensions = function LayerListDimensions(_a) {
13336
+ var dimensions = _a.dimensions;
13337
+
13338
+ if (!dimensions || !dimensions.length) {
13339
+ return null;
13340
+ }
13341
+
13342
+ return /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null, dimensions.map(function (dimension) {
13343
+ return /*#__PURE__*/React__default["default"].createElement(Tooltip__default["default"], {
13344
+ key: dimension.label,
13345
+ title: dimension.label + ": " + dimension.value
13346
+ }, /*#__PURE__*/React__default["default"].createElement("span", {
13347
+ style: {
13348
+ marginRight: 4
13349
+ }
13350
+ }, dimension.icon));
13351
+ }));
13352
+ };
13353
+
13354
+ /* *
13355
+ * Licensed under the Apache License, Version 2.0 (the "License");
13356
+ * you may not use this file except in compliance with the License.
13357
+ * You may obtain a copy of the License at
13358
+ *
13359
+ * http://www.apache.org/licenses/LICENSE-2.0
13360
+ *
13361
+ * Unless required by applicable law or agreed to in writing, software
13362
+ * distributed under the License is distributed on an "AS IS" BASIS,
13363
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13364
+ * See the License for the specific language governing permissions and
13365
+ * limitations under the License.
13366
+ *
13367
+ * Copyright 2022 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
13368
+ * Copyright 2022 - Finnish Meteorological Institute (FMI)
13369
+ * */
13370
+ var buttonLarge = 80;
13371
+ var buttonSmall = 60;
13372
+ var layerSelectColumnsLarge = {
13373
+ column1: {
13374
+ width: 112
13375
+ },
13376
+ column2: {
13377
+ marginTop: '6px',
13378
+ width: "calc(100% - 112px)",
13379
+ height: '36px',
13380
+ paddingLeft: '20px'
13381
+ },
13382
+ column3: {
13383
+ height: '12px'
13384
+ },
13385
+ column4: {
13386
+ height: '24px'
13387
+ },
13388
+ column5: {
13389
+ height: '24px',
13390
+ width: 140
13391
+ },
13392
+ column6: {
13393
+ height: '24px',
13394
+ width: "calc(100% - 140px)"
13395
+ },
13396
+ column7: {
13397
+ height: '48px',
13398
+ width: buttonLarge,
13399
+ marginRight: 1,
13400
+ marginLeft: 2
13401
+ },
13402
+ column8: {
13403
+ width: "calc(100% - " + buttonLarge + "px - 24px)"
13404
+ },
13405
+ column9: {
13406
+ width: "calc(" + buttonLarge + "px + 24px)"
13407
+ }
13408
+ };
13409
+ var layerSelectColumnsSmall = {
13410
+ column1: {
13411
+ width: '100%'
13412
+ },
13413
+ column2: {
13414
+ marginTop: '4px',
13415
+ width: "calc(100% - 20px)"
13416
+ },
13417
+ column3: {
13418
+ height: '12px'
13419
+ },
13420
+ column4: {
13421
+ height: '48px'
13422
+ },
13423
+ column5: {
13424
+ height: '24px',
13425
+ width: '100%'
13426
+ },
13427
+ column6: {
13428
+ height: '24px',
13429
+ width: '100%'
13430
+ },
13431
+ column7: {
13432
+ height: '48px',
13433
+ width: buttonSmall,
13434
+ marginRight: 0,
13435
+ marginLeft: 1
13436
+ },
13437
+ column8: {
13438
+ width: "calc(100% - " + buttonSmall + "px - 8px)"
13439
+ },
13440
+ column9: {
13441
+ width: "calc(" + buttonSmall + "px + 8px)"
13442
+ }
13443
+ };
13444
+ var breakpoint = 500;
13445
+ var widthToColumns = function widthToColumns(width) {
13446
+ if (width <= breakpoint) return layerSelectColumnsSmall;
13447
+ return layerSelectColumnsLarge;
13448
+ };
13449
+ var rowHeightLarge = 68;
13450
+ var rowHeightSmall = 136;
13451
+ var widthToRowHeight = function widthToRowHeight(width) {
13452
+ if (width <= breakpoint) return rowHeightSmall;
13453
+ return rowHeightLarge;
13454
+ };
13455
+
13011
13456
  /* *
13012
13457
  * Licensed under the Apache License, Version 2.0 (the "License");
13013
13458
  * you may not use this file except in compliance with the License.
@@ -13028,11 +13473,12 @@
13028
13473
  fontSize: '10px',
13029
13474
  textOverflow: 'ellipsis',
13030
13475
  overflow: 'hidden',
13031
- whiteSpace: 'nowrap'
13476
+ whiteSpace: 'nowrap',
13477
+ lineHeight: 1
13032
13478
  };
13033
13479
 
13034
13480
  var LayerListRow = function LayerListRow(_a) {
13035
- var _b, _c, _d;
13481
+ var _b;
13036
13482
 
13037
13483
  var layer = _a.layer,
13038
13484
  layerIndex = _a.layerIndex,
@@ -13040,28 +13486,29 @@
13040
13486
  addLayer = _a.addLayer,
13041
13487
  deleteLayer = _a.deleteLayer,
13042
13488
  mapLayers = _a.mapLayers,
13043
- mapId = _a.mapId;
13489
+ mapId = _a.mapId,
13490
+ layerSelectWidth = _a.layerSelectWidth;
13491
+ var rowHeight = widthToRowHeight(layerSelectWidth);
13492
+ var columns = widthToColumns(layerSelectWidth);
13493
+ var dimensions = getDimensionsList(layer.dimensions);
13044
13494
  return /*#__PURE__*/React__default["default"].createElement(material.Grid, {
13045
13495
  "data-testid": "layerListLayerRow",
13046
13496
  container: true,
13047
- item: true,
13048
- xs: 12,
13049
13497
  justifyContent: "center",
13050
13498
  alignItems: "center",
13051
13499
  sx: {
13052
13500
  backgroundColor: 'geowebColors.cards.cardContainer',
13053
13501
  padding: '8px',
13054
13502
  marginBottom: '4px',
13055
- height: '68px',
13503
+ height: rowHeight,
13056
13504
  border: 'solid 1px',
13057
13505
  borderColor: 'geowebColors.cards.cardContainerBorder'
13058
13506
  }
13059
13507
  }, /*#__PURE__*/React__default["default"].createElement(material.Grid, {
13060
13508
  container: true,
13061
13509
  item: true,
13062
- xs: 10
13510
+ sx: columns.column8
13063
13511
  }, /*#__PURE__*/React__default["default"].createElement(material.Grid, {
13064
- container: true,
13065
13512
  item: true,
13066
13513
  xs: 12
13067
13514
  }, /*#__PURE__*/React__default["default"].createElement(material.Box, {
@@ -13070,25 +13517,19 @@
13070
13517
  height: '14px',
13071
13518
  lineHeight: '14px',
13072
13519
  fontWeight: 500,
13073
- WebkitLineClamp: 1,
13074
- display: '-webkit-box',
13075
- WebkitBoxOrient: 'vertical',
13076
13520
  textOverflow: 'ellipsis',
13077
13521
  overflow: 'hidden'
13078
13522
  }
13079
13523
  }, layer.text)), /*#__PURE__*/React__default["default"].createElement(material.Grid, {
13080
- container: true,
13081
13524
  item: true,
13082
- xs: 4,
13083
- direction: "column"
13525
+ container: true,
13526
+ direction: "column",
13527
+ sx: columns.column1
13084
13528
  }, /*#__PURE__*/React__default["default"].createElement(material.Box, {
13085
13529
  sx: {
13086
13530
  fontSize: '12px',
13087
13531
  height: '18px',
13088
13532
  lineHeight: '18px',
13089
- WebkitLineClamp: 1,
13090
- display: '-webkit-box',
13091
- WebkitBoxOrient: 'vertical',
13092
13533
  textOverflow: 'ellipsis',
13093
13534
  overflow: 'hidden'
13094
13535
  }
@@ -13096,44 +13537,41 @@
13096
13537
  layer: layer,
13097
13538
  mapId: mapId,
13098
13539
  serviceName: service.name
13099
- })), layer["abstract"] || ((_b = layer.keywords) === null || _b === void 0 ? void 0 : _b.length) || layer.path.length ? /*#__PURE__*/React__default["default"].createElement(material.Grid, {
13540
+ })), /*#__PURE__*/React__default["default"].createElement(material.Grid, {
13541
+ item: true,
13542
+ sx: columns.column2
13543
+ }, /*#__PURE__*/React__default["default"].createElement(material.Grid, {
13544
+ item: true,
13545
+ sx: columns.column3
13546
+ }, layer["abstract"] && /*#__PURE__*/React__default["default"].createElement(material.Typography, {
13100
13547
  "data-testid": "layerAbstract",
13548
+ sx: layerInfoStyle
13549
+ }, layer["abstract"])), /*#__PURE__*/React__default["default"].createElement(material.Grid, {
13550
+ item: true,
13101
13551
  container: true,
13552
+ sx: columns.column4
13553
+ }, /*#__PURE__*/React__default["default"].createElement(material.Grid, {
13102
13554
  item: true,
13103
- xs: 8,
13104
- sx: {
13105
- height: '45px',
13106
- paddingLeft: '20px',
13107
- WebkitLineClamp: 2,
13108
- display: '-webkit-box',
13109
- WebkitBoxOrient: 'vertical'
13110
- }
13111
- }, layer["abstract"] && /*#__PURE__*/React__default["default"].createElement(material.Typography, {
13112
- sx: __assign(__assign({}, layerInfoStyle), {
13113
- height: 15
13114
- })
13115
- }, layer["abstract"]), layer.path.length > 0 && /*#__PURE__*/React__default["default"].createElement(material.Typography, {
13116
- sx: __assign(__assign({}, layerInfoStyle), {
13117
- height: ((_c = layer.keywords) === null || _c === void 0 ? void 0 : _c.length) ? 15 : 30
13118
- })
13119
- }, "Groups: ", layer.path.join(' / ')), ((_d = layer.keywords) === null || _d === void 0 ? void 0 : _d.length) > 0 && /*#__PURE__*/React__default["default"].createElement(material.Typography, {
13120
- sx: __assign(__assign({}, layerInfoStyle), {
13121
- height: layer.path.length ? 15 : 30
13122
- })
13555
+ sx: columns.column5
13556
+ }, /*#__PURE__*/React__default["default"].createElement(LayerListDimensions, {
13557
+ dimensions: dimensions
13558
+ })), /*#__PURE__*/React__default["default"].createElement(material.Grid, {
13559
+ item: true,
13560
+ sx: columns.column6
13561
+ }, layer.path.length > 0 && /*#__PURE__*/React__default["default"].createElement(material.Typography, {
13562
+ sx: layerInfoStyle
13563
+ }, "Groups: ", layer.path.join(' / ')), ((_b = layer.keywords) === null || _b === void 0 ? void 0 : _b.length) > 0 && /*#__PURE__*/React__default["default"].createElement(material.Typography, {
13564
+ sx: layerInfoStyle
13123
13565
  }, "Keywords:", ' ', layer.keywords.slice().sort(function (a, b) {
13124
13566
  return a.localeCompare(b);
13125
- }).join(', '))) : null), /*#__PURE__*/React__default["default"].createElement(material.Grid, {
13567
+ }).join(', ')))))), /*#__PURE__*/React__default["default"].createElement(material.Grid, {
13126
13568
  container: true,
13127
13569
  item: true,
13128
- xs: 2,
13570
+ sx: columns.column9,
13129
13571
  justifyContent: "flex-end",
13130
13572
  alignItems: "center"
13131
13573
  }, /*#__PURE__*/React__default["default"].createElement(material.Box, {
13132
- sx: {
13133
- width: '80px',
13134
- height: '48px',
13135
- marginRight: '8px'
13136
- }
13574
+ sx: columns.column7
13137
13575
  }, /*#__PURE__*/React__default["default"].createElement(LayerAddRemoveButton, {
13138
13576
  layer: layer,
13139
13577
  layerIndex: layerIndex,
@@ -13163,38 +13601,17 @@
13163
13601
 
13164
13602
  var LayerList = function LayerList(_a) {
13165
13603
  var services = _a.services,
13166
- serviceIds = _a.serviceIds,
13604
+ filteredLayers = _a.filteredLayers,
13167
13605
  layerSelectHeight = _a.layerSelectHeight,
13168
13606
  serviceListHeight = _a.serviceListHeight,
13607
+ layerSelectWidth = _a.layerSelectWidth,
13169
13608
  addLayer = _a.addLayer,
13170
13609
  deleteLayer = _a.deleteLayer,
13171
- searchString = _a.searchString,
13172
13610
  mapLayers = _a.mapLayers,
13173
- filterIds = _a.filterIds,
13174
- allFiltersActive = _a.allFiltersActive,
13175
13611
  mapId = _a.mapId;
13612
+ var rowMargin = 4;
13613
+ var rowHeight = widthToRowHeight(layerSelectWidth);
13176
13614
  var layerSelectFilterHeight = 155 + serviceListHeight;
13177
-
13178
- var _b = __read(React__namespace.useState(0), 2),
13179
- numberOfLayers = _b[0],
13180
- setNumberOfLayers = _b[1];
13181
-
13182
- var _c = __read(React__namespace.useState([]), 2),
13183
- layersFilteredFromService = _c[0],
13184
- setLayersFilteredFromService = _c[1];
13185
-
13186
- React__namespace.useEffect(function () {
13187
- setNumberOfLayers(serviceIds.reduce(function (totalNumberOfLayers, serviceId) {
13188
- return totalNumberOfLayers + filterLayersFromService(serviceId, services, filterIds, allFiltersActive, searchString).length;
13189
- }, 0));
13190
- setLayersFilteredFromService(serviceIds.reduce(function (layerList, serviceId) {
13191
- return layerList.concat(filterLayersFromService(serviceId, services, filterIds, allFiltersActive, searchString).map(function (layer) {
13192
- return __assign(__assign({}, layer), {
13193
- serviceId: serviceId
13194
- });
13195
- }));
13196
- }, []));
13197
- }, [serviceIds, filterIds, services, searchString, allFiltersActive]);
13198
13615
  return /*#__PURE__*/React__namespace.createElement(material.Box, {
13199
13616
  "data-testid": "layerList"
13200
13617
  }, /*#__PURE__*/React__namespace.createElement(material.Box, {
@@ -13202,24 +13619,27 @@
13202
13619
  marginBottom: '4px',
13203
13620
  fontSize: '12px'
13204
13621
  }
13205
- }, numberOfLayers, " results"), /*#__PURE__*/React__namespace.createElement(reactWindow.FixedSizeList, {
13622
+ }, filteredLayers.length, " results"), /*#__PURE__*/React__namespace.createElement(reactWindow.FixedSizeList, {
13206
13623
  height: layerSelectHeight - layerSelectFilterHeight,
13207
- itemCount: numberOfLayers,
13208
- itemSize: 72
13624
+ itemCount: filteredLayers.length,
13625
+ itemSize: rowHeight + rowMargin
13209
13626
  }, function (_a) {
13210
13627
  var index = _a.index,
13211
13628
  style = _a.style;
13629
+ var filter = filteredLayers[index];
13630
+ var service = services[filter.serviceName];
13212
13631
  return /*#__PURE__*/React__namespace.createElement("div", {
13213
13632
  style: style,
13214
- key: layersFilteredFromService[index].name
13215
- }, services[layersFilteredFromService[index].serviceId] && /*#__PURE__*/React__namespace.createElement(LayerListRow, {
13216
- layer: layersFilteredFromService[index],
13633
+ key: filter.name
13634
+ }, service && /*#__PURE__*/React__namespace.createElement(LayerListRow, {
13635
+ layer: filter,
13217
13636
  layerIndex: index,
13218
- service: services[layersFilteredFromService[index].serviceId],
13637
+ service: service,
13219
13638
  addLayer: addLayer,
13220
13639
  deleteLayer: deleteLayer,
13221
13640
  mapLayers: mapLayers,
13222
- mapId: mapId
13641
+ mapId: mapId,
13642
+ layerSelectWidth: layerSelectWidth
13223
13643
  }));
13224
13644
  }));
13225
13645
  };
@@ -13244,14 +13664,12 @@
13244
13664
  var LayerListConnect = function LayerListConnect(_a) {
13245
13665
  var mapId = _a.mapId,
13246
13666
  layerSelectHeight = _a.layerSelectHeight,
13247
- serviceListHeight = _a.serviceListHeight;
13667
+ serviceListHeight = _a.serviceListHeight,
13668
+ layerSelectWidth = _a.layerSelectWidth;
13669
+ var dispatch = reactRedux.useDispatch();
13248
13670
  var services = reactRedux.useSelector(function (store) {
13249
13671
  return getServices(store);
13250
13672
  });
13251
- var dispatch = reactRedux.useDispatch();
13252
- var enabledServiceIds = reactRedux.useSelector(function (store) {
13253
- return getEnabledServiceIds(store);
13254
- });
13255
13673
  var mapLayers = reactRedux.useSelector(function (store) {
13256
13674
  return getMapLayers(store, mapId);
13257
13675
  });
@@ -13266,7 +13684,6 @@
13266
13684
  layerType: webmap.LayerType.mapLayer
13267
13685
  };
13268
13686
  addMapLayer({
13269
- mapId: mapId,
13270
13687
  layerId: layer.id,
13271
13688
  layer: layer,
13272
13689
  origin: LayerActionOrigin.layerManager
@@ -13294,25 +13711,17 @@
13294
13711
  origin: LayerActionOrigin.layerManager
13295
13712
  }));
13296
13713
  }, [dispatch, mapId]);
13297
- var checkedFilterIds = reactRedux.useSelector(function (store) {
13298
- return getCheckedFilterIds(store);
13299
- });
13300
- var allFiltersActive = reactRedux.useSelector(function (store) {
13301
- return isAllFiltersChecked(store);
13302
- });
13303
- var searchString = reactRedux.useSelector(function (store) {
13304
- return getSearchFilter(store);
13714
+ var filteredLayers = reactRedux.useSelector(function (store) {
13715
+ return getFilteredLayers(store);
13305
13716
  });
13306
13717
  return /*#__PURE__*/React__namespace.createElement(LayerList, {
13718
+ filteredLayers: filteredLayers,
13307
13719
  services: services,
13308
- serviceIds: enabledServiceIds,
13309
13720
  layerSelectHeight: layerSelectHeight,
13310
13721
  serviceListHeight: serviceListHeight,
13722
+ layerSelectWidth: layerSelectWidth,
13311
13723
  addLayer: addLayer,
13312
13724
  deleteLayer: deleteLayer,
13313
- filterIds: checkedFilterIds,
13314
- allFiltersActive: allFiltersActive,
13315
- searchString: searchString,
13316
13725
  mapLayers: mapLayers,
13317
13726
  mapId: mapId
13318
13727
  });
@@ -13336,13 +13745,13 @@
13336
13745
  * */
13337
13746
  var style = {
13338
13747
  borderRadius: '20px!important',
13339
- marginRight: '8px',
13748
+ marginRight: '4px',
13340
13749
  whiteSpace: 'nowrap',
13341
- height: '32px!important',
13750
+ height: '24px!important',
13342
13751
  padding: '5px 12px!important',
13343
13752
  textTransform: 'none!important',
13344
13753
  fontWeight: 'normal',
13345
- marginBottom: '5px'
13754
+ marginBottom: '4px'
13346
13755
  };
13347
13756
 
13348
13757
  var ServiceChip = function ServiceChip(_a) {
@@ -13352,6 +13761,7 @@
13352
13761
  isSelected = _a.isSelected,
13353
13762
  isDisabled = _a.isDisabled,
13354
13763
  toggleChip = _a.toggleChip;
13764
+ var chip = all ? 'all' : service && service.serviceUrl;
13355
13765
  return /*#__PURE__*/React__namespace.createElement(material.Tooltip, {
13356
13766
  title: (service === null || service === void 0 ? void 0 : service["abstract"]) ? "Abstract: " + service["abstract"] : ''
13357
13767
  }, /*#__PURE__*/React__namespace.createElement(shared.CustomToggleButton, {
@@ -13360,10 +13770,10 @@
13360
13770
  tabIndex: 0,
13361
13771
  "data-testid": all ? 'serviceChipAll' : 'serviceChip',
13362
13772
  onClick: function onClick() {
13363
- return toggleChip(all ? 'all' : service && service.serviceUrl);
13773
+ return toggleChip(chip);
13364
13774
  },
13365
13775
  onKeyPress: function onKeyPress() {
13366
- return toggleChip(all ? 'all' : service && service.serviceUrl);
13776
+ return toggleChip(chip);
13367
13777
  },
13368
13778
  disabled: isDisabled,
13369
13779
  sx: style
@@ -13530,9 +13940,9 @@
13530
13940
  display: 'block',
13531
13941
  alignItems: 'center',
13532
13942
  "float": 'left',
13533
- paddingLeft: '40px',
13534
- paddingRight: '30px',
13535
- marginBottom: '5px',
13943
+ paddingLeft: '48px',
13944
+ paddingRight: '40px',
13945
+ marginBottom: '8px',
13536
13946
  fontSize: '0.875rem'
13537
13947
  },
13538
13948
  ref: ref
@@ -13620,7 +14030,7 @@
13620
14030
  * */
13621
14031
  var styles$1 = {
13622
14032
  servicesContainer: {
13623
- width: '300px',
14033
+ width: '360px',
13624
14034
  maxHeight: '380px',
13625
14035
  top: '140px',
13626
14036
  backgroundColor: 'geowebColors.background.surface',
@@ -13635,6 +14045,10 @@
13635
14045
  backgroundColor: 'geowebColors.background.surface',
13636
14046
  zIndex: 100
13637
14047
  },
14048
+ loading: {
14049
+ position: 'absolute',
14050
+ zIndex: 101
14051
+ },
13638
14052
  footer: {
13639
14053
  display: 'flex',
13640
14054
  justifyContent: 'center',
@@ -13655,8 +14069,11 @@
13655
14069
  var ServiceOptionsDialog = function ServiceOptionsDialog(_a) {
13656
14070
  var services = _a.services,
13657
14071
  layerSelectRemoveService = _a.layerSelectRemoveService,
14072
+ layerSelectReloadService = _a.layerSelectReloadService,
13658
14073
  selectedLayers = _a.selectedLayers,
13659
- setServicePopupInfo = _a.setServicePopupInfo;
14074
+ setServicePopupInfo = _a.setServicePopupInfo,
14075
+ _b = _a.isLoading,
14076
+ isLoading = _b === void 0 ? false : _b;
13660
14077
 
13661
14078
  var openAddService = function openAddService() {
13662
14079
  setServicePopupInfo({
@@ -13670,9 +14087,13 @@
13670
14087
  "data-testid": "ServiceDialog"
13671
14088
  }, /*#__PURE__*/React__namespace.createElement(material.Box, {
13672
14089
  sx: styles$1.header
13673
- }, "Services"), /*#__PURE__*/React__namespace.createElement(Rows, {
14090
+ }, "Services"), /*#__PURE__*/React__namespace.createElement(material.Backdrop, {
14091
+ sx: styles$1.loading,
14092
+ open: isLoading
14093
+ }, /*#__PURE__*/React__namespace.createElement(material.CircularProgress, null)), /*#__PURE__*/React__namespace.createElement(Rows, {
13674
14094
  services: services,
13675
14095
  layerSelectRemoveService: layerSelectRemoveService,
14096
+ layerSelectReloadService: layerSelectReloadService,
13676
14097
  setServicePopupInfo: setServicePopupInfo,
13677
14098
  selectedLayers: selectedLayers
13678
14099
  }), /*#__PURE__*/React__namespace.createElement(material.Box, {
@@ -13688,6 +14109,7 @@
13688
14109
 
13689
14110
  var Rows = function Rows(_a) {
13690
14111
  var services = _a.services,
14112
+ layerSelectReloadService = _a.layerSelectReloadService,
13691
14113
  layerSelectRemoveService = _a.layerSelectRemoveService,
13692
14114
  setServicePopupInfo = _a.setServicePopupInfo,
13693
14115
  selectedLayers = _a.selectedLayers;
@@ -13706,8 +14128,9 @@
13706
14128
  var _a = services[serviceId],
13707
14129
  serviceUrl = _a.serviceUrl,
13708
14130
  serviceName = _a.serviceName,
13709
- isUserAddedService = _a.isUserAddedService;
14131
+ scope = _a.scope;
13710
14132
  var serviceHasActiveLayers = checkIfServiceHasActiveLayers(serviceUrl);
14133
+ var userAddedService = isUserAddedService(scope);
13711
14134
  return /*#__PURE__*/React__namespace.createElement(material.ListItem, {
13712
14135
  key: serviceUrl
13713
14136
  }, /*#__PURE__*/React__namespace.createElement(material.ListItemText, {
@@ -13718,19 +14141,32 @@
13718
14141
  noWrap: true,
13719
14142
  style: {
13720
14143
  textOverflow: 'ellipsis',
13721
- paddingRight: '60px'
14144
+ paddingRight: '70px'
13722
14145
  }
13723
14146
  }, serviceName)), /*#__PURE__*/React__namespace.createElement(material.ListItemSecondaryAction, {
13724
14147
  style: {
13725
- marginRight: '-10px',
13726
- width: 90
14148
+ marginRight: '0px',
14149
+ width: 100
13727
14150
  }
13728
14151
  }, /*#__PURE__*/React__namespace.createElement(material.Grid, {
13729
14152
  container: true
13730
14153
  }, /*#__PURE__*/React__namespace.createElement(material.Grid, {
13731
14154
  item: true,
13732
- xs: 6
13733
- }, isUserAddedService ? /*#__PURE__*/React__namespace.createElement(material.Tooltip, {
14155
+ xs: 4
14156
+ }, /*#__PURE__*/React__namespace.createElement(material.Tooltip, {
14157
+ title: "Update layers from WMS service",
14158
+ "data-testid": "updateServiceTooltip"
14159
+ }, /*#__PURE__*/React__namespace.createElement(material.IconButton, {
14160
+ "data-testid": "updateServiceButton",
14161
+ "aria-label": "Update layers from WMS service",
14162
+ size: "large",
14163
+ onClick: function onClick() {
14164
+ return layerSelectReloadService(serviceUrl);
14165
+ }
14166
+ }, /*#__PURE__*/React__namespace.createElement(theme.Cached, null)))), /*#__PURE__*/React__namespace.createElement(material.Grid, {
14167
+ item: true,
14168
+ xs: 4
14169
+ }, userAddedService ? /*#__PURE__*/React__namespace.createElement(material.Tooltip, {
13734
14170
  title: "Edit Service"
13735
14171
  }, /*#__PURE__*/React__namespace.createElement("span", null, /*#__PURE__*/React__namespace.createElement(material.IconButton, {
13736
14172
  "aria-label": "edit service",
@@ -13760,8 +14196,8 @@
13760
14196
  }
13761
14197
  }, /*#__PURE__*/React__namespace.createElement(theme.Visibility, null))))), /*#__PURE__*/React__namespace.createElement(material.Grid, {
13762
14198
  item: true,
13763
- xs: 6
13764
- }, isUserAddedService && /*#__PURE__*/React__namespace.createElement(material.Box, null, /*#__PURE__*/React__namespace.createElement(material.Tooltip, {
14199
+ xs: 4
14200
+ }, userAddedService && /*#__PURE__*/React__namespace.createElement(material.Box, null, /*#__PURE__*/React__namespace.createElement(material.Tooltip, {
13765
14201
  title: serviceHasActiveLayers ? 'Service has active layers. Cannot remove this service' : 'Delete Service',
13766
14202
  "data-testid": "removeServiceTooltip"
13767
14203
  }, /*#__PURE__*/React__namespace.createElement("span", null, /*#__PURE__*/React__namespace.createElement(material.IconButton, {
@@ -13793,9 +14229,30 @@
13793
14229
  * Copyright 2022 - Finnish Meteorological Institute (FMI)
13794
14230
  * */
13795
14231
 
14232
+ var getService = function getService(services, serviceUrl) {
14233
+ var serviceIds = Object.keys(services);
14234
+ var serviceIndex = serviceIds.findIndex(function (serviceId) {
14235
+ return services[serviceId].serviceUrl === serviceUrl;
14236
+ });
14237
+ if (serviceIndex < 0) return null;
14238
+ return services[serviceIds[serviceIndex]];
14239
+ };
14240
+
14241
+ var getServiceSuccesUpdateMessage = function getServiceSuccesUpdateMessage(serviceName) {
14242
+ return "Service \"" + serviceName + "\" has been succesfully updated";
14243
+ };
14244
+ var getServiceFailedUpdateMessage = function getServiceFailedUpdateMessage(error) {
14245
+ return "Unable to update service, reason: \"" + error.message + "\"";
14246
+ };
14247
+
13796
14248
  var ServiceOptionsDialogConnect = function ServiceOptionsDialogConnect(_a) {
13797
14249
  var mapId = _a.mapId,
13798
14250
  setServicePopupInfo = _a.setServicePopupInfo;
14251
+
14252
+ var _b = __read(React__namespace.useState(false), 2),
14253
+ isLoading = _b[0],
14254
+ setIsLoading = _b[1];
14255
+
13799
14256
  var dispatch = reactRedux.useDispatch();
13800
14257
  var layerSelectRemoveService = React__namespace.useCallback(function (serviceId, serviceUrl) {
13801
14258
  dispatch(layerSelectActions.layerSelectRemoveService({
@@ -13803,17 +14260,87 @@
13803
14260
  serviceUrl: serviceUrl
13804
14261
  }));
13805
14262
  }, [dispatch]);
14263
+ var serviceSetLayers = React__namespace.useCallback(function (payload) {
14264
+ dispatch(serviceActions.serviceSetLayers(__assign(__assign({}, payload), {
14265
+ isUpdating: true
14266
+ })));
14267
+ }, [dispatch]);
14268
+ var showSnackbar = React__namespace.useCallback(function (message) {
14269
+ dispatch(snackbarActions.openSnackbar({
14270
+ message: message
14271
+ }));
14272
+ }, [dispatch]);
13806
14273
  var services = reactRedux.useSelector(function (store) {
13807
14274
  return getActiveServices(store);
13808
14275
  });
13809
14276
  var selectedLayers = reactRedux.useSelector(function (store) {
13810
14277
  return getMapLayers(store, mapId);
13811
14278
  });
14279
+ var layerSelectReloadService = React__namespace.useCallback(function (serviceUrl) {
14280
+ return __awaiter(void 0, void 0, void 0, function () {
14281
+ var layersForService, service, serviceTitle, error_1;
14282
+ return __generator(this, function (_a) {
14283
+ switch (_a.label) {
14284
+ case 0:
14285
+ setIsLoading(true);
14286
+ _a.label = 1;
14287
+
14288
+ case 1:
14289
+ _a.trys.push([1, 3, 4, 5]);
14290
+
14291
+ return [4
14292
+ /*yield*/
14293
+ , loadWMSService(serviceUrl, true)];
14294
+
14295
+ case 2:
14296
+ layersForService = _a.sent();
14297
+ service = getService(services, serviceUrl);
14298
+ serviceSetLayers({
14299
+ id: layersForService.id,
14300
+ name: service && service.serviceName || layersForService.name,
14301
+ serviceUrl: serviceUrl,
14302
+ "abstract": service && service["abstract"] || layersForService["abstract"],
14303
+ layers: layersForService.layers,
14304
+ scope: service && service.scope || 'user',
14305
+ isUpdating: true
14306
+ });
14307
+ webmap.clearImageCache();
14308
+ serviceTitle = service && service.serviceName || layersForService.name;
14309
+ showSnackbar(getServiceSuccesUpdateMessage(serviceTitle));
14310
+ return [3
14311
+ /*break*/
14312
+ , 5];
14313
+
14314
+ case 3:
14315
+ error_1 = _a.sent(); // TODO: Maarten Plieger 2022-11-02: Snackbars should not be used to inform the user that something went wrong.
14316
+ // https://gitlab.com/opengeoweb/opengeoweb/-/issues/2819
14317
+
14318
+ showSnackbar(getServiceFailedUpdateMessage(error_1));
14319
+ return [3
14320
+ /*break*/
14321
+ , 5];
14322
+
14323
+ case 4:
14324
+ setIsLoading(false);
14325
+ return [7
14326
+ /*endfinally*/
14327
+ ];
14328
+
14329
+ case 5:
14330
+ return [2
14331
+ /*return*/
14332
+ ];
14333
+ }
14334
+ });
14335
+ });
14336
+ }, [serviceSetLayers, services, showSnackbar]);
13812
14337
  return /*#__PURE__*/React__namespace.createElement(ServiceOptionsDialog, {
13813
14338
  selectedLayers: selectedLayers,
13814
14339
  services: services,
13815
14340
  layerSelectRemoveService: layerSelectRemoveService,
13816
- setServicePopupInfo: setServicePopupInfo
14341
+ layerSelectReloadService: layerSelectReloadService,
14342
+ setServicePopupInfo: setServicePopupInfo,
14343
+ isLoading: isLoading
13817
14344
  });
13818
14345
  };
13819
14346
 
@@ -13893,20 +14420,25 @@
13893
14420
  _d = _a.order,
13894
14421
  order = _d === void 0 ? 0 : _d,
13895
14422
  _e = _a.source,
13896
- source = _e === void 0 ? 'module' : _e;
14423
+ source = _e === void 0 ? 'module' : _e,
14424
+ _f = _a.startSize,
14425
+ startSize = _f === void 0 ? {
14426
+ width: 750,
14427
+ height: 500
14428
+ } : _f;
13897
14429
  var initialServiceListHeight = 37;
13898
14430
 
13899
- var _f = __read(React__namespace.useState(500), 2),
13900
- height = _f[0],
13901
- setHeight = _f[1];
14431
+ var _g = __read(React__namespace.useState(startSize.height), 2),
14432
+ height = _g[0],
14433
+ setHeight = _g[1];
13902
14434
 
13903
- var _g = __read(React__namespace.useState(750), 2),
13904
- width = _g[0],
13905
- setWidth = _g[1];
14435
+ var _h = __read(React__namespace.useState(startSize.width), 2),
14436
+ width = _h[0],
14437
+ setWidth = _h[1];
13906
14438
 
13907
- var _h = __read(React__namespace.useState(initialServiceListHeight), 2),
13908
- serviceListHeight = _h[0],
13909
- setServiceListHeight = _h[1];
14439
+ var _j = __read(React__namespace.useState(initialServiceListHeight), 2),
14440
+ serviceListHeight = _j[0],
14441
+ setServiceListHeight = _j[1];
13910
14442
 
13911
14443
  var onChangeSize = function onChangeSize(_a) {
13912
14444
  var height = _a.height,
@@ -13927,7 +14459,7 @@
13927
14459
  width: width,
13928
14460
  height: height
13929
14461
  },
13930
- minWidth: 390,
14462
+ minWidth: 320,
13931
14463
  minHeight: 126,
13932
14464
  startPosition: {
13933
14465
  top: 150,
@@ -13944,13 +14476,13 @@
13944
14476
  source: source
13945
14477
  }, /*#__PURE__*/React__namespace.createElement(material.Box, {
13946
14478
  sx: {
13947
- padding: '6px'
14479
+ padding: '4px 16px 0 16px'
13948
14480
  }
13949
14481
  }, /*#__PURE__*/React__namespace.createElement(SearchFieldConnect, null)), /*#__PURE__*/React__namespace.createElement(material.Box, {
13950
14482
  sx: {
13951
14483
  "float": 'left',
13952
14484
  position: 'absolute',
13953
- margin: '12px 0 0 8px',
14485
+ margin: '8px 8px 0 16px',
13954
14486
  zIndex: 2
13955
14487
  }
13956
14488
  }, /*#__PURE__*/React__namespace.createElement(KeywordFilterButtonConnect, {
@@ -13958,7 +14490,7 @@
13958
14490
  })), /*#__PURE__*/React__namespace.createElement(material.Box, {
13959
14491
  sx: {
13960
14492
  position: 'absolute',
13961
- margin: '12px 0 0 calc(100% - 36px)',
14493
+ margin: '8px 0 0 calc(100% - 40px)',
13962
14494
  zIndex: 2
13963
14495
  }
13964
14496
  }, /*#__PURE__*/React__namespace.createElement(ServiceOptionsButton, {
@@ -13967,12 +14499,13 @@
13967
14499
  setHeight: handleHeightChange
13968
14500
  })), /*#__PURE__*/React__namespace.createElement(material.Box, {
13969
14501
  sx: {
13970
- padding: '0 8px'
14502
+ padding: '0 16px'
13971
14503
  }
13972
14504
  }, /*#__PURE__*/React__namespace.createElement(LayerListConnect, {
13973
14505
  mapId: mapId,
13974
14506
  layerSelectHeight: height,
13975
- serviceListHeight: serviceListHeight
14507
+ serviceListHeight: serviceListHeight,
14508
+ layerSelectWidth: width
13976
14509
  })));
13977
14510
  };
13978
14511
 
@@ -14396,7 +14929,7 @@
14396
14929
  var KeywordFilterResultsConnect = function KeywordFilterResultsConnect(_a) {
14397
14930
  var bounds = _a.bounds;
14398
14931
 
14399
- var _b = useSetupDialog('keywordFilter'),
14932
+ var _b = useSetupDialog(DialogTypes.KeywordFilter),
14400
14933
  dialogOrder = _b.dialogOrder,
14401
14934
  onCloseDialog = _b.onCloseDialog,
14402
14935
  setDialogOrder = _b.setDialogOrder,
@@ -14483,10 +15016,10 @@
14483
15016
  _b = _a.showTitle,
14484
15017
  showTitle = _b === void 0 ? false : _b;
14485
15018
  var mapId = reactRedux.useSelector(function (store) {
14486
- return getDialogMapId(store, 'layerSelect');
15019
+ return getDialogMapId(store, DialogTypes.LayerSelect);
14487
15020
  });
14488
15021
 
14489
- var _c = useSetupDialog('layerSelect'),
15022
+ var _c = useSetupDialog(DialogTypes.LayerSelect),
14490
15023
  dialogOrder = _c.dialogOrder,
14491
15024
  isDialogOpen = _c.isDialogOpen,
14492
15025
  onCloseDialog = _c.onCloseDialog,
@@ -14534,11 +15067,6 @@
14534
15067
  var serviceSetLayers = React__namespace.useCallback(function (payload) {
14535
15068
  dispatch(serviceActions.serviceSetLayers(payload));
14536
15069
  }, [dispatch]);
14537
-
14538
- var checkIfUserAddedService = function checkIfUserAddedService(service) {
14539
- return !!service.isUserAddedService;
14540
- };
14541
-
14542
15070
  React__namespace.useEffect(function () {
14543
15071
  if (isOpenInStore && preloadedServices && preloadedServices.length > 0) {
14544
15072
  mergePresetsAndUserAddedServices(preloadedServices, getUserAddedServices()).forEach(function (service) {
@@ -14550,7 +15078,7 @@
14550
15078
  name: service.name,
14551
15079
  serviceUrl: service.url,
14552
15080
  layers: layers,
14553
- isUserAddedService: checkIfUserAddedService(service),
15081
+ scope: service.scope ? service.scope : 'system',
14554
15082
  // first try to load the user abstract, otherwise the service abstract
14555
15083
  "abstract": service["abstract"] || wmService["abstract"]
14556
15084
  });
@@ -14587,7 +15115,7 @@
14587
15115
  * Copyright 2021 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
14588
15116
  * Copyright 2021 - Finnish Meteorological Institute (FMI)
14589
15117
  * */
14590
- var dialogType = 'layerManager';
15118
+ var dialogType = DialogTypes.LayerManager;
14591
15119
  /**
14592
15120
  * Layer Managerconnected to the store displaying the layers forthe active map Id
14593
15121
  * Please note that in order to use this and open/close the dialog, every map on the screen that should be able to show
@@ -14748,7 +15276,7 @@
14748
15276
  }, [mapId]);
14749
15277
 
14750
15278
  var onZoomIn = function onZoomIn() {
14751
- return adagucRef.current.zoomIn();
15279
+ return adagucRef.current.zoomIn(undefined);
14752
15280
  };
14753
15281
 
14754
15282
  var onZoomOut = function onZoomOut() {
@@ -14835,14 +15363,14 @@
14835
15363
  source = _b === void 0 ? 'app' : _b;
14836
15364
  var dispatch = reactRedux.useDispatch();
14837
15365
  var currentActiveMapId = reactRedux.useSelector(function (store) {
14838
- return getDialogMapId(store, 'layerManager');
15366
+ return getDialogMapId(store, DialogTypes.LayerManager);
14839
15367
  });
14840
15368
  var isOpenInStore = reactRedux.useSelector(function (store) {
14841
- return getisDialogOpen(store, 'layerManager');
15369
+ return getisDialogOpen(store, DialogTypes.LayerManager);
14842
15370
  });
14843
15371
  var openLayerManagerDialog = React__namespace.useCallback(function () {
14844
15372
  dispatch(uiActions.setActiveMapIdForDialog({
14845
- type: 'layerManager',
15373
+ type: DialogTypes.LayerManager,
14846
15374
  mapId: mapId,
14847
15375
  setOpen: currentActiveMapId !== mapId ? true : !isOpenInStore,
14848
15376
  source: source
@@ -14973,7 +15501,7 @@
14973
15501
  }
14974
15502
 
14975
15503
  var sortedMarks = __spreadArray([], __read(marks)).sort(function (a, b) {
14976
- return typeof a.value === 'number' && typeof b.value === 'number' && a.value - b.value;
15504
+ return Number(typeof a.value === 'number' && typeof b.value === 'number' && a.value - b.value);
14977
15505
  });
14978
15506
 
14979
15507
  var adaptedMarks = reverse ? sortedMarks.reverse() : sortedMarks;
@@ -15460,9 +15988,7 @@
15460
15988
 
15461
15989
  var AutoUpdateButton = function AutoUpdateButton(_a) {
15462
15990
  var _b = _a.toggleAutoUpdate,
15463
- toggleAutoUpdate = _b === void 0 ? function () {
15464
- return null;
15465
- } : _b,
15991
+ toggleAutoUpdate = _b === void 0 ? function () {} : _b,
15466
15992
  _c = _a.isAutoUpdating,
15467
15993
  isAutoUpdating = _c === void 0 ? false : _c,
15468
15994
  _d = _a.disabled,
@@ -15749,9 +16275,7 @@
15749
16275
  timeDimension = _a.timeDimension,
15750
16276
  onChangeTimeStep = _a.onChangeTimeStep,
15751
16277
  _d = _a.onToggleTimestepAuto,
15752
- onToggleTimestepAuto = _d === void 0 ? function () {
15753
- return null;
15754
- } : _d,
16278
+ onToggleTimestepAuto = _d === void 0 ? function () {} : _d,
15755
16279
  _e = _a.isOpenByDefault,
15756
16280
  isOpenByDefault = _e === void 0 ? false : _e;
15757
16281
  var timeStepFromLayer = getActiveLayerTimeStep(timeDimension) || timeStep;
@@ -15798,82 +16322,245 @@
15798
16322
  * Copyright 2022 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
15799
16323
  * Copyright 2022 - Finnish Meteorological Institute (FMI)
15800
16324
  * */
15801
- var OptionsPopOver = material.styled(material.Popover)(function (_a) {
15802
- var theme = _a.theme;
15803
- return {
15804
- '& .MuiPaper-root': {
15805
- padding: '5px',
15806
- overflow: 'visible',
15807
- backgroundColor: theme.palette.geowebColors.background.surface
15808
- }
15809
- };
16325
+ var marks = [{
16326
+ label: '5 min',
16327
+ value: Scale.Minutes5,
16328
+ text: '5m'
16329
+ }, {
16330
+ label: '1 h',
16331
+ value: Scale.Hour,
16332
+ text: '1h'
16333
+ }, {
16334
+ label: '3 h',
16335
+ value: Scale.Hours3,
16336
+ text: '3h'
16337
+ }, {
16338
+ label: '6 h',
16339
+ value: Scale.Hours6,
16340
+ text: '6h'
16341
+ }, {
16342
+ label: 'day',
16343
+ value: Scale.Day,
16344
+ text: 'd'
16345
+ }, {
16346
+ label: 'week',
16347
+ value: Scale.Week,
16348
+ text: 'w'
16349
+ }, {
16350
+ label: 'month',
16351
+ value: Scale.Month,
16352
+ text: 'm'
16353
+ }, {
16354
+ label: 'year',
16355
+ value: Scale.Year,
16356
+ text: 'y'
16357
+ }, {
16358
+ label: 'data',
16359
+ value: Scale.DataScale,
16360
+ text: 'data'
16361
+ }].sort(function (a, b) {
16362
+ return b.value - a.value;
15810
16363
  });
16364
+ var TimeScaleButton = function TimeScaleButton(_a) {
16365
+ var layers = _a.layers,
16366
+ _b = _a.timeSliderScale,
16367
+ timeSliderScale = _b === void 0 ? Scale.Hour : _b,
16368
+ centerTime = _a.centerTime,
16369
+ secondsPerPx = _a.secondsPerPx,
16370
+ selectedTime = _a.selectedTime,
16371
+ onChangeTimeSliderScale = _a.onChangeTimeSliderScale;
16372
+
16373
+ var onChangeSliderValue = function onChangeSliderValue(mark) {
16374
+ var newSliderValue = mark.value;
16375
+ var newValue = newSliderValue ? Math.round(newSliderValue) : 0;
16376
+ var newScale = marks.find(function (el) {
16377
+ return el.value === newValue;
16378
+ }).value;
16379
+ var scaleToSecPerPx = newScale === Scale.DataScale ? getScaleToSecondsPerPxForDataScale(layers) : scaleToSecondsPerPx[newScale];
16380
+ var newCenterTime = getNewCenterOfFixedPointZoom(selectedTime, secondsPerPx, scaleToSecPerPx, centerTime);
16381
+ onChangeTimeSliderScale(newScale, newCenterTime, scaleToSecPerPx);
16382
+ };
16383
+
16384
+ return /*#__PURE__*/React__namespace.createElement(TimeSliderMenu, {
16385
+ handleMenuItemClick: onChangeSliderValue,
16386
+ icon: /*#__PURE__*/React__namespace.createElement(theme.Clock, null),
16387
+ marks: marks,
16388
+ title: "Time scale",
16389
+ value: timeSliderScale
16390
+ });
16391
+ };
16392
+
16393
+ /* *
16394
+ * Licensed under the Apache License, Version 2.0 (the "License");
16395
+ * you may not use this file except in compliance with the License.
16396
+ * You may obtain a copy of the License at
16397
+ *
16398
+ * http://www.apache.org/licenses/LICENSE-2.0
16399
+ *
16400
+ * Unless required by applicable law or agreed to in writing, software
16401
+ * distributed under the License is distributed on an "AS IS" BASIS,
16402
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16403
+ * See the License for the specific language governing permissions and
16404
+ * limitations under the License.
16405
+ *
16406
+ * Copyright 2022 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
16407
+ * Copyright 2022 - Finnish Meteorological Institute (FMI)
16408
+ * */
16409
+ var title = 'Now';
16410
+
16411
+ var NowButton = function NowButton(_a) {
16412
+ var _b = _a.onSetNow,
16413
+ onSetNow = _b === void 0 ? function () {} : _b,
16414
+ _c = _a.disabled,
16415
+ disabled = _c === void 0 ? false : _c;
16416
+ return /*#__PURE__*/React__namespace.createElement(material.Tooltip, {
16417
+ title: title,
16418
+ "data-testid": "nowButtonTooltip"
16419
+ }, /*#__PURE__*/React__namespace.createElement("span", null, /*#__PURE__*/React__namespace.createElement(shared.ToolButton, {
16420
+ disabled: disabled,
16421
+ onClick: function onClick() {
16422
+ return onSetNow();
16423
+ },
16424
+ "aria-label": "now"
16425
+ }, /*#__PURE__*/React__namespace.createElement(theme.Now, {
16426
+ "data-testid": "now-svg"
16427
+ }))));
16428
+ };
16429
+
16430
+ /* *
16431
+ * Licensed under the Apache License, Version 2.0 (the "License");
16432
+ * you may not use this file except in compliance with the License.
16433
+ * You may obtain a copy of the License at
16434
+ *
16435
+ * http://www.apache.org/licenses/LICENSE-2.0
16436
+ *
16437
+ * Unless required by applicable law or agreed to in writing, software
16438
+ * distributed under the License is distributed on an "AS IS" BASIS,
16439
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16440
+ * See the License for the specific language governing permissions and
16441
+ * limitations under the License.
16442
+ *
16443
+ * Copyright 2022 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
16444
+ * Copyright 2022 - Finnish Meteorological Institute (FMI)
16445
+ * */
15811
16446
 
15812
16447
  var OptionsMenuButton = function OptionsMenuButton(_a) {
15813
- var autoUpdateBtn = _a.autoUpdateBtn,
16448
+ var nowBtn = _a.nowBtn,
16449
+ autoUpdateBtn = _a.autoUpdateBtn,
15814
16450
  speedBtn = _a.speedBtn,
15815
- timeStepBtn = _a.timeStepBtn;
16451
+ timeStepBtn = _a.timeStepBtn,
16452
+ timeScaleBtn = _a.timeScaleBtn,
16453
+ _b = _a.isOpenByDefault,
16454
+ isOpenByDefault = _b === void 0 ? false : _b;
15816
16455
 
15817
- var _b = __read(React__namespace.useState(null), 2),
15818
- anchorEl = _b[0],
15819
- setAnchorEl = _b[1];
15820
-
15821
- var onClickButton = function onClickButton(event) {
15822
- setAnchorEl(event.currentTarget);
15823
- };
16456
+ var _c = __read(React.useState(null), 2),
16457
+ anchorEl = _c[0],
16458
+ setAnchorEl = _c[1];
15824
16459
 
15825
- var handleClose = function handleClose() {
15826
- setAnchorEl(null);
15827
- };
16460
+ var _d = __read(React.useState(false), 2),
16461
+ open = _d[0],
16462
+ setOpen = _d[1];
15828
16463
 
15829
- var open = Boolean(anchorEl);
15830
- var id = open ? 'simple-popover' : undefined;
15831
- return /*#__PURE__*/React__namespace.createElement("div", null, /*#__PURE__*/React__namespace.createElement(material.Tooltip, {
16464
+ React.useEffect(function () {
16465
+ if (anchorEl && isOpenByDefault) {
16466
+ setOpen(true);
16467
+ }
16468
+ }, [anchorEl, isOpenByDefault]);
16469
+ return /*#__PURE__*/React__default["default"].createElement("div", null, /*#__PURE__*/React__default["default"].createElement(material.Tooltip, {
15832
16470
  title: "Animation options",
15833
16471
  placement: "bottom"
15834
- }, /*#__PURE__*/React__namespace.createElement("span", null, /*#__PURE__*/React__namespace.createElement(shared.ToolButton, {
15835
- onClick: onClickButton,
16472
+ }, /*#__PURE__*/React__default["default"].createElement("span", {
16473
+ ref: function ref(_ref) {
16474
+ setAnchorEl(_ref);
16475
+ }
16476
+ }, /*#__PURE__*/React__default["default"].createElement(shared.ToolButton, {
16477
+ onClick: function onClick() {
16478
+ setOpen(!open);
16479
+ },
15836
16480
  "data-testid": "optionsMenuButton",
15837
- active: open
15838
- }, /*#__PURE__*/React__namespace.createElement(theme.Options, {
15839
- "data-testid": "optionsIcon"
15840
- })))), /*#__PURE__*/React__namespace.createElement(OptionsPopOver, {
15841
- id: id,
16481
+ active: open,
16482
+ "aria-label": "animation options"
16483
+ }, /*#__PURE__*/React__default["default"].createElement(theme.Options, null)))), /*#__PURE__*/React__default["default"].createElement(material.Popper, {
16484
+ sx: {
16485
+ zIndex: 3
16486
+ },
16487
+ placement: "top-start",
15842
16488
  open: open,
15843
16489
  "data-testid": "optionsMenuPopOver",
15844
- anchorEl: anchorEl,
15845
- onClose: handleClose,
15846
- anchorOrigin: {
15847
- vertical: -5,
15848
- horizontal: 'left'
16490
+ anchorEl: anchorEl
16491
+ }, /*#__PURE__*/React__default["default"].createElement(material.Paper, {
16492
+ elevation: 3
16493
+ }, /*#__PURE__*/React__default["default"].createElement(material.Grid, {
16494
+ sx: {
16495
+ padding: '0px 10px 10px'
15849
16496
  },
15850
- transformOrigin: {
15851
- vertical: 'bottom',
15852
- horizontal: 'left'
15853
- }
15854
- }, /*#__PURE__*/React__namespace.createElement(material.Grid, {
15855
16497
  container: true,
15856
16498
  spacing: 1
15857
- }, /*#__PURE__*/React__namespace.createElement(material.Grid, {
16499
+ }, /*#__PURE__*/React__default["default"].createElement(material.Grid, {
16500
+ item: true,
16501
+ xs: "auto"
16502
+ }, nowBtn || /*#__PURE__*/React__default["default"].createElement(NowButton, null)), /*#__PURE__*/React__default["default"].createElement(material.Grid, {
16503
+ item: true,
16504
+ xs: "auto"
16505
+ }, timeScaleBtn || /*#__PURE__*/React__default["default"].createElement(TimeScaleButton, {
16506
+ centerTime: 0,
16507
+ onChangeTimeSliderScale: function onChangeTimeSliderScale() {},
16508
+ secondsPerPx: 0,
16509
+ selectedTime: 0,
16510
+ timeSliderScale: 0
16511
+ })), /*#__PURE__*/React__default["default"].createElement(material.Grid, {
15858
16512
  item: true,
15859
16513
  xs: "auto"
15860
- }, timeStepBtn || /*#__PURE__*/React__namespace.createElement(TimeStepButton, {
16514
+ }, timeStepBtn || /*#__PURE__*/React__default["default"].createElement(TimeStepButton, {
15861
16515
  timeStep: 0,
15862
- onChangeTimeStep: function onChangeTimeStep() {
15863
- return null;
15864
- }
15865
- })), /*#__PURE__*/React__namespace.createElement(material.Grid, {
16516
+ onChangeTimeStep: function onChangeTimeStep() {}
16517
+ })), /*#__PURE__*/React__default["default"].createElement(material.Grid, {
15866
16518
  item: true,
15867
16519
  xs: "auto"
15868
- }, speedBtn || /*#__PURE__*/React__namespace.createElement(SpeedButton, {
16520
+ }, speedBtn || /*#__PURE__*/React__default["default"].createElement(SpeedButton, {
15869
16521
  animationDelay: defaultAnimationDelayAtStart,
15870
- setMapAnimationDelay: function setMapAnimationDelay() {
15871
- return null;
15872
- }
15873
- })), /*#__PURE__*/React__namespace.createElement(material.Grid, {
16522
+ setMapAnimationDelay: function setMapAnimationDelay() {}
16523
+ })), /*#__PURE__*/React__default["default"].createElement(material.Grid, {
15874
16524
  item: true,
15875
16525
  xs: "auto"
15876
- }, autoUpdateBtn || /*#__PURE__*/React__namespace.createElement(AutoUpdateButton, null)))));
16526
+ }, autoUpdateBtn || /*#__PURE__*/React__default["default"].createElement(AutoUpdateButton, null))))));
16527
+ };
16528
+
16529
+ /* *
16530
+ * Licensed under the Apache License, Version 2.0 (the "License");
16531
+ * you may not use this file except in compliance with the License.
16532
+ * You may obtain a copy of the License at
16533
+ *
16534
+ * http://www.apache.org/licenses/LICENSE-2.0
16535
+ *
16536
+ * Unless required by applicable law or agreed to in writing, software
16537
+ * distributed under the License is distributed on an "AS IS" BASIS,
16538
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16539
+ * See the License for the specific language governing permissions and
16540
+ * limitations under the License.
16541
+ *
16542
+ * Copyright 2022 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
16543
+ * Copyright 2022 - Finnish Meteorological Institute (FMI)
16544
+ * */
16545
+ var forwardTooltipTitle = 'Forward';
16546
+ var backwardTooltipTitle = 'Backward';
16547
+
16548
+ var BackwardForwardStepButton = function BackwardForwardStepButton(_a) {
16549
+ var isForwardStep = _a.isForwardStep,
16550
+ isDisabled = _a.isDisabled,
16551
+ _b = _a.onClickBFButton,
16552
+ onClickBFButton = _b === void 0 ? function () {} : _b;
16553
+ return /*#__PURE__*/React__namespace.createElement(material.Tooltip, {
16554
+ title: isForwardStep ? forwardTooltipTitle : backwardTooltipTitle
16555
+ }, /*#__PURE__*/React__namespace.createElement("span", null, /*#__PURE__*/React__namespace.createElement(shared.ToolButton, {
16556
+ disabled: isDisabled,
16557
+ "aria-label": isForwardStep ? 'forward' : 'backward',
16558
+ onClick: onClickBFButton
16559
+ }, isForwardStep ? /*#__PURE__*/React__namespace.createElement(theme.StepForward, {
16560
+ "data-testid": "step-forward-svg-path"
16561
+ }) : /*#__PURE__*/React__namespace.createElement(theme.StepBackward, {
16562
+ "data-testid": "step-backward-svg-path"
16563
+ }))));
15877
16564
  };
15878
16565
 
15879
16566
  /* *
@@ -15895,19 +16582,28 @@
15895
16582
 
15896
16583
  var TimeSliderButtons = function TimeSliderButtons(_a) {
15897
16584
  var optionsMenuBtn = _a.optionsMenuBtn,
15898
- playBtn = _a.playBtn;
16585
+ playBtn = _a.playBtn,
16586
+ backwardBtn = _a.backwardBtn,
16587
+ forwardBtn = _a.forwardBtn;
15899
16588
  return /*#__PURE__*/React__namespace.createElement("div", {
15900
16589
  "data-testid": "timeSliderButtons"
15901
16590
  }, /*#__PURE__*/React__namespace.createElement(material.Grid, {
15902
16591
  container: true,
15903
- spacing: 2,
15904
- sx: {
15905
- padding: '20px 0px 0px 16px'
15906
- }
16592
+ spacing: 0.5,
16593
+ alignItems: "center",
16594
+ justifyContent: "center"
15907
16595
  }, /*#__PURE__*/React__namespace.createElement(material.Grid, {
15908
16596
  item: true
15909
16597
  }, optionsMenuBtn || /*#__PURE__*/React__namespace.createElement(OptionsMenuButton, null)), /*#__PURE__*/React__namespace.createElement(material.Grid, {
15910
16598
  item: true
16599
+ }, backwardBtn || /*#__PURE__*/React__namespace.createElement(BackwardForwardStepButton, {
16600
+ isForwardStep: false
16601
+ })), /*#__PURE__*/React__namespace.createElement(material.Grid, {
16602
+ item: true
16603
+ }, forwardBtn || /*#__PURE__*/React__namespace.createElement(BackwardForwardStepButton, {
16604
+ isForwardStep: true
16605
+ })), /*#__PURE__*/React__namespace.createElement(material.Grid, {
16606
+ item: true
15911
16607
  }, playBtn || /*#__PURE__*/React__namespace.createElement(PlayButton, null))));
15912
16608
  };
15913
16609
 
@@ -16478,13 +17174,30 @@
16478
17174
  }
16479
17175
  };
16480
17176
 
16481
- var drawBackground = function drawBackground(context, theme, visibleTimeStart, visibleTimeEnd, animationStartPx, animationEndPx, canvasWidth, height, scale) {
17177
+ var drawBackground = function drawBackground(context, theme, visibleTimeStart, visibleTimeEnd, animationStartPx, animationEndPx, canvasWidth, height, scale, dataStartPx, dataEndPx, currentTimePx) {
16482
17178
  var ctx = context;
16483
17179
  var _a = theme.palette.geowebColors.timeSlider,
16484
- timelineTimelineSurface = _a.timelineTimelineSurface,
16485
- timelineNightTime = _a.timelineNightTime;
16486
- ctx.fillStyle = timelineTimelineSurface.fill;
16487
- ctx.fillRect(0, 0, canvasWidth, height);
17180
+ timelineNightTime = _a.timelineNightTime,
17181
+ ledgendObservedBackground = _a.ledgendObservedBackground,
17182
+ legendForecastBackground = _a.legendForecastBackground,
17183
+ legendNoDataBackground = _a.legendNoDataBackground; // top spacing
17184
+
17185
+ var y = 0;
17186
+ ctx.fillStyle = legendNoDataBackground.rgba;
17187
+ ctx.fillRect(0, y, canvasWidth, height); // observed data
17188
+
17189
+ if (dataStartPx < currentTimePx) {
17190
+ ctx.fillStyle = ledgendObservedBackground.fill;
17191
+ ctx.fillRect(Math.max(dataStartPx, 0), y, Math.min(currentTimePx, dataEndPx) - Math.max(dataStartPx, 0), height);
17192
+ } // forecast data
17193
+
17194
+
17195
+ if (dataEndPx > currentTimePx) {
17196
+ ctx.fillStyle = legendForecastBackground.fill;
17197
+ ctx.fillRect(Math.max(currentTimePx, dataStartPx), y, Math.min(canvasWidth, dataEndPx) - Math.max(currentTimePx, dataStartPx), height);
17198
+ } // hovered area
17199
+
17200
+
16488
17201
  ctx.fillStyle = theme.palette.geowebColors.timeSlider.timelineSelectionBackground.rgba;
16489
17202
  ctx.fillRect(animationStartPx, 0, Math.max(animationEndPx - animationStartPx, 0), height);
16490
17203
  var colorChangeUnit = getColorChangeTimestepUnit(scale);
@@ -16580,7 +17293,7 @@
16580
17293
  drawLeftSideDateText(ctx, theme, dateText, height);
16581
17294
  };
16582
17295
 
16583
- var renderTimeSliderLegend = function renderTimeSliderLegend(context, theme, canvasWidth, height, centerTime, secondsPerPx, dataScaleToSecondsPerPx, selectedTimeUnix, scale, currentTimeUnix, animationStartTime, animationEndTime) {
17296
+ var renderTimeSliderLegend = function renderTimeSliderLegend(context, theme, canvasWidth, height, centerTime, secondsPerPx, dataScaleToSecondsPerPx, selectedTimeUnix, scale, currentTimeUnix, animationStartTime, animationEndTime, dataStartTime, dataEndTime) {
16584
17297
  var ctx = context;
16585
17298
 
16586
17299
  var _a = __read([0, canvasWidth].map(function (px) {
@@ -16589,13 +17302,17 @@
16589
17302
  visibleTimeStart = _a[0],
16590
17303
  visibleTimeEnd = _a[1];
16591
17304
 
16592
- var _b = __read([animationStartTime, animationEndTime].map(function (time) {
17305
+ var _b = __read([animationStartTime, animationEndTime, dataStartTime, dataEndTime, currentTimeUnix].map(function (time) {
16593
17306
  return timestampToPixel(time, centerTime, canvasWidth, secondsPerPx);
16594
- }), 2),
17307
+ }), 5),
16595
17308
  animationStartPx = _b[0],
16596
- animationEndPx = _b[1];
17309
+ animationEndPx = _b[1],
17310
+ dataStartPx = _b[2],
17311
+ dataEndPx = _b[3],
17312
+ currentTimePx = _b[4];
16597
17313
 
16598
- drawBackground(ctx, theme, visibleTimeStart, visibleTimeEnd, animationStartPx, animationEndPx, canvasWidth, height, scale);
17314
+ ctx.clearRect(0, 0, canvasWidth, height);
17315
+ drawBackground(ctx, theme, visibleTimeStart, visibleTimeEnd, animationStartPx, animationEndPx, canvasWidth, height, scale, dataStartPx, dataEndPx, currentTimePx);
16599
17316
  drawTimeScale(ctx, theme, visibleTimeStart, visibleTimeEnd, canvasWidth, height, scale, dataScaleToSecondsPerPx);
16600
17317
  drawNeedle(ctx, theme, canvasWidth, height, visibleTimeStart, visibleTimeEnd, selectedTimeUnix);
16601
17318
  drawCurrentTime(ctx, theme, canvasWidth, height, visibleTimeStart, visibleTimeEnd, currentTimeUnix);
@@ -16687,19 +17404,7 @@
16687
17404
  React__namespace.useEffect(function () {
16688
17405
  var handleKeyDown = function handleKeyDown(event) {
16689
17406
  if (event.key === 'Home' && mapIsActive) {
16690
- if (dataStartTime < dataEndTime) {
16691
- if (dataEndTime < currentTime) {
16692
- onSetNewDate(moment__default["default"].utc(dataEndTime * 1000).toISOString());
16693
- onSetCenterTime(dataEndTime);
16694
- } else if (dataStartTime > currentTime) {
16695
- onSetNewDate(moment__default["default"].utc(dataStartTime * 1000).toISOString());
16696
- onSetCenterTime(dataStartTime);
16697
- } else {
16698
- var closestToCurrent = roundWithTimeStep(currentTime, timeStep);
16699
- onSetNewDate(moment__default["default"].utc(closestToCurrent * 1000).toISOString());
16700
- onSetCenterTime(closestToCurrent);
16701
- }
16702
- }
17407
+ handleSetNowEvent(timeStep, dataStartTime, dataEndTime, currentTime, onSetNewDate, onSetCenterTime);
16703
17408
  }
16704
17409
  };
16705
17410
 
@@ -16731,7 +17436,9 @@
16731
17436
  return /*#__PURE__*/React__namespace.createElement(material.Box, {
16732
17437
  "data-testid": "timeSliderLegend",
16733
17438
  sx: {
16734
- height: '50px'
17439
+ height: TIME_SLIDER_LEGEND_HEIGHT + "px",
17440
+ borderRadius: '4.5px',
17441
+ overflow: 'hidden'
16735
17442
  }
16736
17443
  }, /*#__PURE__*/React__namespace.createElement(CanvasComponent, {
16737
17444
  ref: node,
@@ -16783,238 +17490,14 @@
16783
17490
  }
16784
17491
  },
16785
17492
  onRenderCanvas: function onRenderCanvas(ctx, width, height) {
16786
- renderTimeSliderLegend(ctx, theme, width, height, centerTime, secondsPerPx, dataScaleToSecondsPerPx, selectedTime, scale, currentTime, localAnimationStartTime, localAnimationEndTime);
17493
+ renderTimeSliderLegend(ctx, theme, width, height, centerTime, secondsPerPx, dataScaleToSecondsPerPx, selectedTime, scale, currentTime, localAnimationStartTime, localAnimationEndTime, dataStartTime, dataEndTime);
16787
17494
  }
16788
17495
  }));
16789
17496
  };
16790
17497
 
16791
- /* *
16792
- * Licensed under the Apache License, Version 2.0 (the "License");
16793
- * you may not use this file except in compliance with the License.
16794
- * You may obtain a copy of the License at
16795
- *
16796
- * http://www.apache.org/licenses/LICENSE-2.0
16797
- *
16798
- * Unless required by applicable law or agreed to in writing, software
16799
- * distributed under the License is distributed on an "AS IS" BASIS,
16800
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16801
- * See the License for the specific language governing permissions and
16802
- * limitations under the License.
16803
- *
16804
- * Copyright 2022 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
16805
- * Copyright 2022 - Finnish Meteorological Institute (FMI)
16806
- * */
16807
- var scaleSliderOtherSettings = {
16808
- LEFT_PADDING: '10%'
16809
- };
16810
-
16811
- var thumbComponent = function thumbComponent(props) {
16812
- var children = props.children,
16813
- other = __rest(props, ["children"]);
17498
+ var TIME_SLIDER_LEGEND_HEIGHT = 24;
16814
17499
 
16815
- return /*#__PURE__*/React__namespace.createElement(material.SliderThumb, __assign({}, other, {
16816
- "data-testid": "scaleSliderSliderThumb",
16817
- tabIndex: 0
16818
- }), children, /*#__PURE__*/React__namespace.createElement(theme.SliderThumb, null));
16819
- };
16820
-
16821
- var marks = [{
16822
- text: '5 min scale',
16823
- paddingLeft: '2px',
16824
- value: Scale.Minutes5
16825
- }, {
16826
- text: '1 h scale',
16827
- paddingLeft: '25px',
16828
- value: Scale.Hour
16829
- }, {
16830
- text: '3 h scale',
16831
- paddingLeft: '45px',
16832
- value: Scale.Hours3
16833
- }, {
16834
- text: '6 h scale',
16835
- paddingLeft: '65px',
16836
- value: Scale.Hours6
16837
- }, {
16838
- text: 'day scale',
16839
- paddingLeft: '80px',
16840
- value: Scale.Day
16841
- }, {
16842
- text: 'week scale',
16843
- paddingLeft: '92px',
16844
- value: Scale.Week
16845
- }, {
16846
- text: 'month scale',
16847
- paddingLeft: '107px',
16848
- value: Scale.Month
16849
- }, {
16850
- text: 'year scale',
16851
- paddingLeft: '130px',
16852
- value: Scale.Year
16853
- }, {
16854
- text: 'data scale',
16855
- paddingLeft: '140px',
16856
- value: Scale.DataScale
16857
- }];
16858
-
16859
- var valueLabelFormat = function valueLabelFormat(value) {
16860
- var valueNew = value.toString();
16861
- return valueNew;
16862
- };
16863
-
16864
- var GeoWebScaleSlider = material.styled(material.Slider)(function (_a) {
16865
- var theme = _a.theme;
16866
- return {
16867
- '&.MuiSlider-root': {
16868
- height: 4,
16869
- width: 167,
16870
- margin: "0 0 18px " + scaleSliderOtherSettings.LEFT_PADDING
16871
- },
16872
- '& .MuiSlider-thumb': {
16873
- backgroundColor: 'rgba(0,0,0,0)',
16874
- marginTop: 0,
16875
- width: 12,
16876
- height: 12,
16877
- color: theme.palette.geowebColors.timeSlider.timeScalePointer.fill,
16878
- '& svg polygon': {
16879
- filter: theme.palette.geowebColors.timeSlider.timeScaleShadowButtonScale.filter
16880
- },
16881
- '&:before': {
16882
- display: 'none'
16883
- }
16884
- },
16885
- '& .MuiSlider-valueLabel': {
16886
- left: '20px'
16887
- },
16888
- '& .MuiSlider-rail': {
16889
- color: theme.palette.geowebColors.timeSlider.timeScaleHorizontalScale.fill,
16890
- height: 4,
16891
- width: 170,
16892
- borderRadius: 4.5,
16893
- opacity: theme.palette.geowebColors.timeSlider.timeScaleHorizontalScale.opacity
16894
- },
16895
- '& .MuiSlider-mark': {
16896
- backgroundColor: theme.palette.geowebColors.timeSlider.timeScaleTimeIndicators.fill,
16897
- height: 6,
16898
- width: 2,
16899
- marginTop: -9,
16900
- '&.MuiSlider-markActive': {
16901
- backgroundColor: theme.palette.geowebColors.timeSlider.timeScaleTimeIndicatorsActive.fill,
16902
- height: 6,
16903
- width: 2,
16904
- marginTop: -9
16905
- }
16906
- },
16907
- '@media (max-width: 585px)': {
16908
- '&.MuiSlider-root': {
16909
- width: 110
16910
- },
16911
- '& .MuiSlider-rail': {
16912
- width: 110
16913
- }
16914
- },
16915
- '@media (max-width: 395px)': {
16916
- '&.MuiSlider-root': {
16917
- width: 60
16918
- },
16919
- '& .MuiSlider-rail': {
16920
- width: 60
16921
- }
16922
- }
16923
- };
16924
- });
16925
- var RAIL_GUTTER_OFFSET = 0.4;
16926
-
16927
- var TimeSliderScaleSlider = function TimeSliderScaleSlider(_a) {
16928
- var layers = _a.layers,
16929
- _b = _a.timeSliderScale,
16930
- timeSliderScale = _b === void 0 ? Scale.Hour : _b,
16931
- centerTime = _a.centerTime,
16932
- secondsPerPx = _a.secondsPerPx,
16933
- selectedTime = _a.selectedTime,
16934
- onChangeTimeSliderScale = _a.onChangeTimeSliderScale;
16935
- var min = 0;
16936
- var max = marks.length - 1;
16937
- var value = marks.findIndex(function (mark) {
16938
- return mark.value === timeSliderScale;
16939
- });
16940
-
16941
- var onChangeSliderValue = function onChangeSliderValue(newSliderValue) {
16942
- var newValue = newSliderValue ? Math.round(newSliderValue) : 0;
16943
- var newScale = marks.find(function (el) {
16944
- return el.value === newValue;
16945
- }).value;
16946
- var scaleToSecPerPx = newScale === Scale.DataScale ? getScaleToSecondsPerPxForDataScale(layers) : scaleToSecondsPerPx[newScale];
16947
- var newCenterTime = getNewCenterOfFixedPointZoom(selectedTime, secondsPerPx, scaleToSecPerPx, centerTime);
16948
- onChangeTimeSliderScale(newScale, newCenterTime, scaleToSecPerPx);
16949
- };
16950
-
16951
- var onChange = function onChange(event, value) {
16952
- if (event.type !== 'keydown') {
16953
- onChangeSliderValue(value);
16954
- }
16955
- };
16956
-
16957
- var onKeyDown = function onKeyDown(event) {
16958
- // disable default Slider behavior
16959
- event.preventDefault();
16960
- event.stopPropagation(); // custom logic
16961
-
16962
- var newValue = getValueFromKeyboardEvent(event, value, min, max, true);
16963
-
16964
- if (newValue !== null) {
16965
- onChangeSliderValue(newValue);
16966
- }
16967
- };
16968
-
16969
- var _c = marks.find(function (mark) {
16970
- return mark.value === value;
16971
- }),
16972
- paddingLeft = _c.paddingLeft,
16973
- text = _c.text;
16974
-
16975
- var scaleTextPadding = {
16976
- paddingLeft: paddingLeft
16977
- };
16978
- return /*#__PURE__*/React__namespace.createElement(material.Box, {
16979
- "data-testid": "scaleSlider",
16980
- sx: {
16981
- backgroundColor: 'geowebColors.background.surface',
16982
- width: '229px',
16983
- height: '40px',
16984
- paddingTop: '4px',
16985
- paddingBottom: '7px',
16986
- boxSizing: 'content-box'
16987
- }
16988
- }, /*#__PURE__*/React__namespace.createElement("div", null, /*#__PURE__*/React__namespace.createElement(material.Box, {
16989
- "data-testid": "scaleSliderText",
16990
- sx: {
16991
- width: '67px',
16992
- height: '15px',
16993
- padding: '0px 10px 0 8px',
16994
- color: 'geowebColors.typographyAndIcons.text',
16995
- font: '12px Roboto'
16996
- },
16997
- style: scaleTextPadding
16998
- }, text)), /*#__PURE__*/React__namespace.createElement("div", null, /*#__PURE__*/React__namespace.createElement(GeoWebScaleSlider, {
16999
- "data-testid": "scaleSliderSlider",
17000
- defaultValue: Scale.Hour,
17001
- value: value,
17002
- min: min - RAIL_GUTTER_OFFSET,
17003
- step: 1,
17004
- max: max + RAIL_GUTTER_OFFSET,
17005
- getAriaValueText: valueLabelFormat,
17006
- onChange: onChange,
17007
- onKeyDown: onKeyDown,
17008
- "aria-labelledby": "scale-slider",
17009
- components: {
17010
- Thumb: thumbComponent
17011
- },
17012
- marks: marks,
17013
- track: false
17014
- })));
17015
- };
17016
-
17017
- /* eslint-disable no-param-reassign */
17500
+ /* eslint-disable no-param-reassign */
17018
17501
 
17019
17502
  var drawRoundedRectangle = function drawRoundedRectangle(ctx, x, y, width, height, cornerRadius, theme) {
17020
17503
  ctx.save();
@@ -17219,21 +17702,6 @@
17219
17702
  * Copyright 2022 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
17220
17703
  * Copyright 2022 - Finnish Meteorological Institute (FMI)
17221
17704
  * */
17222
-
17223
- var setPreviousTimeStep = function setPreviousTimeStep(timeStep, curTime, dataStartTime, onSetNewDate) {
17224
- var prevTimeStep = moment__default["default"].utc(curTime).subtract(timeStep, 'm').toISOString();
17225
- if (!prevTimeStep) return;
17226
- if (moment__default["default"].utc(prevTimeStep) < moment__default["default"].utc(dataStartTime * 1000)) return;
17227
- onsetNewDateDebounced(prevTimeStep, onSetNewDate);
17228
- };
17229
-
17230
- var setNextTimeStep = function setNextTimeStep(timeStep, curTime, dataEndTime, onSetNewDate) {
17231
- var nextTimeStep = moment__default["default"].utc(curTime).add(timeStep, 'm').toISOString();
17232
- if (!nextTimeStep) return;
17233
- if (moment__default["default"].utc(nextTimeStep) > moment__default["default"].utc(dataEndTime * 1000)) return;
17234
- onsetNewDateDebounced(nextTimeStep, onSetNewDate);
17235
- };
17236
-
17237
17705
  var DRAG_AREA_WIDTH = 10;
17238
17706
  var DRAG_HANDLER_AREA_WIDTH = 30;
17239
17707
 
@@ -17277,11 +17745,11 @@
17277
17745
 
17278
17746
  var curTime = selectedTime !== undefined ? selectedTime.toISOString() : moment__default["default"].utc().toISOString();
17279
17747
 
17280
- var _e = __read(React__namespace.useState(animationStartTime && moment__default["default"].utc(animationStartTime).unix()), 2),
17748
+ var _e = __read(React__namespace.useState(animationStartTime ? moment__default["default"].utc(animationStartTime).unix() : undefined), 2),
17281
17749
  localAnimationStartTime = _e[0],
17282
17750
  setLocalAnimationStartTime = _e[1];
17283
17751
 
17284
- var _f = __read(React__namespace.useState(animationEndTime && moment__default["default"].utc(animationEndTime).unix()), 2),
17752
+ var _f = __read(React__namespace.useState(animationEndTime ? moment__default["default"].utc(animationEndTime).unix() : undefined), 2),
17285
17753
  localAnimationEndTime = _f[0],
17286
17754
  setLocalAnimationEndTime = _f[1];
17287
17755
 
@@ -17416,8 +17884,8 @@
17416
17884
  };
17417
17885
 
17418
17886
  React__namespace.useEffect(function () {
17419
- setLocalAnimationStartTime(animationStartTime && moment__default["default"].utc(animationStartTime).unix());
17420
- setLocalAnimationEndTime(animationEndTime && moment__default["default"].utc(animationEndTime).unix());
17887
+ setLocalAnimationStartTime(animationStartTime ? moment__default["default"].utc(animationStartTime).unix() : undefined);
17888
+ setLocalAnimationEndTime(animationEndTime ? moment__default["default"].utc(animationEndTime).unix() : undefined);
17421
17889
  }, [animationStartTime, animationEndTime]);
17422
17890
  var handleKeyDown = React__namespace.useCallback(function (event) {
17423
17891
  if (event.ctrlKey && dataStartTime && dataEndTime && mapIsActive) {
@@ -17521,6 +17989,37 @@
17521
17989
  }));
17522
17990
  };
17523
17991
 
17992
+ /* *
17993
+ * Licensed under the Apache License, Version 2.0 (the "License");
17994
+ * you may not use this file except in compliance with the License.
17995
+ * You may obtain a copy of the License at
17996
+ *
17997
+ * http://www.apache.org/licenses/LICENSE-2.0
17998
+ *
17999
+ * Unless required by applicable law or agreed to in writing, software
18000
+ * distributed under the License is distributed on an "AS IS" BASIS,
18001
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18002
+ * See the License for the specific language governing permissions and
18003
+ * limitations under the License.
18004
+ *
18005
+ * Copyright 2022 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
18006
+ * Copyright 2022 - Finnish Meteorological Institute (FMI)
18007
+ * */
18008
+
18009
+ var HideSliderButton = function HideSliderButton(_a) {
18010
+ var isVisible = _a.isVisible,
18011
+ toggleTimeSliderIsVisible = _a.toggleTimeSliderIsVisible;
18012
+ return /*#__PURE__*/React__default["default"].createElement(material.Tooltip, {
18013
+ title: isVisible ? 'Hide timeslider' : 'Show timeslider',
18014
+ "data-testid": "autoUpdateButtonTooltip"
18015
+ }, /*#__PURE__*/React__default["default"].createElement("span", null, /*#__PURE__*/React__default["default"].createElement(shared.ToolButton, {
18016
+ onClick: function onClick() {
18017
+ toggleTimeSliderIsVisible(!isVisible);
18018
+ },
18019
+ "data-testid": "hideTimeSliderButton"
18020
+ }, isVisible ? /*#__PURE__*/React__default["default"].createElement(theme.ChevronDown, null) : /*#__PURE__*/React__default["default"].createElement(theme.ChevronUp, null))));
18021
+ };
18022
+
17524
18023
  /* *
17525
18024
  * Licensed under the Apache License, Version 2.0 (the "License");
17526
18025
  * you may not use this file except in compliance with the License.
@@ -17565,7 +18064,6 @@
17565
18064
  var TimeSlider = function TimeSlider(_a) {
17566
18065
  var buttons = _a.buttons,
17567
18066
  rail = _a.rail,
17568
- scaleSlider = _a.scaleSlider,
17569
18067
  legend = _a.legend,
17570
18068
  _b = _a.mapIsActive,
17571
18069
  mapIsActive = _b === void 0 ? true : _b,
@@ -17574,38 +18072,54 @@
17574
18072
  _d = _a.onToggleTimeSlider,
17575
18073
  onToggleTimeSlider = _d === void 0 ? function () {} : _d;
17576
18074
  useTimeSliderKeyBoardControl(mapIsActive, isVisible, onToggleTimeSlider);
18075
+ var visibilityState = isVisible ? 'visible' : 'hidden';
17577
18076
  return isVisible ? /*#__PURE__*/React__namespace.createElement(material.Grid, {
18077
+ style: {
18078
+ visibility: visibilityState
18079
+ },
17578
18080
  container: true,
17579
- "data-testid": "timeSlider",
17580
18081
  sx: {
17581
18082
  display: 'grid',
17582
- gridTemplateColumns: 'minmax(100px, 210px) minmax(66%, 1fr)',
17583
- gridTemplateRows: '50px'
17584
- }
18083
+ gridTemplateColumns: 'minmax(100px, 210px) minmax(66%, 1fr) minmax(40px, 40px)',
18084
+ gridTemplateRows: 24,
18085
+ paddingBottom: 1,
18086
+ alignItems: 'center',
18087
+ justifyContent: 'center'
18088
+ },
18089
+ "data-testid": "timeSlider",
18090
+ spacing: 1
17585
18091
  }, /*#__PURE__*/React__namespace.createElement(material.Grid, {
17586
18092
  item: true
17587
- }, " ", buttons || /*#__PURE__*/React__namespace.createElement(TimeSliderButtons, null), " "), /*#__PURE__*/React__namespace.createElement(material.Grid, {
18093
+ }), /*#__PURE__*/React__namespace.createElement(material.Grid, {
17588
18094
  item: true
17589
18095
  }, rail || /*#__PURE__*/React__namespace.createElement(TimeSliderRail, __assign({}, defaultProps, {
17590
18096
  selectedTime: defaultProps.selectedTime,
17591
18097
  mapIsActive: mapIsActive
17592
18098
  })), ' '), /*#__PURE__*/React__namespace.createElement(material.Grid, {
17593
- item: true,
17594
- sx: {
17595
- height: '50px'
17596
- }
17597
- }, scaleSlider || /*#__PURE__*/React__namespace.createElement(TimeSliderScaleSlider, __assign({}, defaultProps, {
17598
- selectedTime: defaultProps.selectedTime.unix(),
17599
- timeSliderScale: Scale.Hour,
17600
- onChangeTimeSliderScale: function onChangeTimeSliderScale() {
17601
- return null;
17602
- }
17603
- }))), /*#__PURE__*/React__namespace.createElement(material.Grid, {
18099
+ item: true
18100
+ }), /*#__PURE__*/React__namespace.createElement(material.Grid, {
18101
+ item: true
18102
+ }, buttons || /*#__PURE__*/React__namespace.createElement(TimeSliderButtons, null)), /*#__PURE__*/React__namespace.createElement(material.Grid, {
17604
18103
  item: true
17605
18104
  }, legend || /*#__PURE__*/React__namespace.createElement(TimeSliderLegend, __assign({}, defaultProps, {
17606
18105
  selectedTime: defaultProps.selectedTime.unix(),
17607
18106
  mapIsActive: mapIsActive
17608
- })), ' ')) : null;
18107
+ })), ' '), /*#__PURE__*/React__namespace.createElement(material.Grid, {
18108
+ item: true
18109
+ }, /*#__PURE__*/React__namespace.createElement(HideSliderButton, {
18110
+ toggleTimeSliderIsVisible: onToggleTimeSlider,
18111
+ isVisible: isVisible
18112
+ }))) : /*#__PURE__*/React__namespace.createElement(material.Grid, {
18113
+ sx: {
18114
+ paddingRight: 1
18115
+ },
18116
+ container: true,
18117
+ alignItems: "center",
18118
+ justifyContent: "flex-end"
18119
+ }, /*#__PURE__*/React__namespace.createElement(HideSliderButton, {
18120
+ toggleTimeSliderIsVisible: onToggleTimeSlider,
18121
+ isVisible: isVisible
18122
+ }));
17609
18123
  };
17610
18124
 
17611
18125
  /* *
@@ -17750,6 +18264,136 @@
17750
18264
  });
17751
18265
  };
17752
18266
 
18267
+ /* *
18268
+ * Licensed under the Apache License, Version 2.0 (the "License");
18269
+ * you may not use this file except in compliance with the License.
18270
+ * You may obtain a copy of the License at
18271
+ *
18272
+ * http://www.apache.org/licenses/LICENSE-2.0
18273
+ *
18274
+ * Unless required by applicable law or agreed to in writing, software
18275
+ * distributed under the License is distributed on an "AS IS" BASIS,
18276
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18277
+ * See the License for the specific language governing permissions and
18278
+ * limitations under the License.
18279
+ *
18280
+ * Copyright 2020 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
18281
+ * Copyright 2020 - Finnish Meteorological Institute (FMI)
18282
+ * */
18283
+ var TimeScaleButtonConnect = function TimeScaleButtonConnect(_a) {
18284
+ var mapId = _a.mapId;
18285
+ var layers = reactRedux.useSelector(function (store) {
18286
+ return getMapLayers(store, mapId);
18287
+ });
18288
+ var timeSliderScale = reactRedux.useSelector(function (store) {
18289
+ return getMapTimeSliderScale(store, mapId);
18290
+ });
18291
+ var centerTime = reactRedux.useSelector(function (store) {
18292
+ return getMapTimeSliderCenterTime(store, mapId);
18293
+ });
18294
+ var secondsPerPx = reactRedux.useSelector(function (store) {
18295
+ return getMapTimeSliderSecondsPerPx(store, mapId);
18296
+ });
18297
+ var dimensions = reactRedux.useSelector(function (store) {
18298
+ return getMapDimensions(store, mapId);
18299
+ });
18300
+ var dispatch = reactRedux.useDispatch();
18301
+
18302
+ var onSetTimeSliderScale = function onSetTimeSliderScale(scale, newCenterTime, scaleToSecPerPx) {
18303
+ if (scale === Scale.DataScale) {
18304
+ dispatch(mapActions$1.setTimeSliderDataScaleToSecondsPerPx({
18305
+ mapId: mapId,
18306
+ timeSliderDataScaleToSecondsPerPx: scaleToSecPerPx
18307
+ }));
18308
+ }
18309
+
18310
+ dispatch(mapActions$1.setTimeSliderScale({
18311
+ mapId: mapId,
18312
+ timeSliderScale: scale
18313
+ }));
18314
+ dispatch(mapActions$1.setTimeSliderCenterTime({
18315
+ mapId: mapId,
18316
+ timeSliderCenterTime: newCenterTime
18317
+ }));
18318
+ };
18319
+
18320
+ var selectedTime = getTimeBounds(dimensions).selectedTime;
18321
+ return /*#__PURE__*/React__namespace.createElement(TimeScaleButton, {
18322
+ layers: layers,
18323
+ timeSliderScale: timeSliderScale,
18324
+ onChangeTimeSliderScale: onSetTimeSliderScale,
18325
+ secondsPerPx: secondsPerPx,
18326
+ centerTime: centerTime,
18327
+ selectedTime: selectedTime
18328
+ });
18329
+ };
18330
+
18331
+ /* *
18332
+ * Licensed under the Apache License, Version 2.0 (the "License");
18333
+ * you may not use this file except in compliance with the License.
18334
+ * You may obtain a copy of the License at
18335
+ *
18336
+ * http://www.apache.org/licenses/LICENSE-2.0
18337
+ *
18338
+ * Unless required by applicable law or agreed to in writing, software
18339
+ * distributed under the License is distributed on an "AS IS" BASIS,
18340
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18341
+ * See the License for the specific language governing permissions and
18342
+ * limitations under the License.
18343
+ *
18344
+ * Copyright 2022 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
18345
+ * Copyright 2022 - Finnish Meteorological Institute (FMI)
18346
+ * */
18347
+
18348
+ var NowButtonConnect = function NowButtonConnect(_a) {
18349
+ var sourceId = _a.sourceId,
18350
+ mapId = _a.mapId,
18351
+ isDisabled = _a.isDisabled;
18352
+ var dispatch = reactRedux.useDispatch();
18353
+ var currentTime = moment__default["default"].utc().unix();
18354
+ var timeStep = reactRedux.useSelector(function (store) {
18355
+ return getMapTimeStep(store, mapId);
18356
+ });
18357
+
18358
+ var _b = __read(getDataLimitsFromLayers(reactRedux.useSelector(function (store) {
18359
+ return getMapLayers(store, mapId);
18360
+ })), 2),
18361
+ dataStartTime = _b[0],
18362
+ dataEndTime = _b[1];
18363
+
18364
+ var isAnimating$1 = reactRedux.useSelector(function (store) {
18365
+ return isAnimating(store, mapId);
18366
+ });
18367
+
18368
+ var onSetNewDate = function onSetNewDate(newDate) {
18369
+ if (isAnimating$1) {
18370
+ dispatch(mapActions$1.mapStopAnimation({
18371
+ mapId: mapId
18372
+ }));
18373
+ }
18374
+
18375
+ dispatch(genericActions.setTime({
18376
+ sourceId: sourceId,
18377
+ origin: 'NowButtonConnect, 140',
18378
+ value: handleMomentISOString(newDate)
18379
+ }));
18380
+ };
18381
+
18382
+ var onSetCenterTime = function onSetCenterTime(newTime) {
18383
+ dispatch(mapActions$1.setTimeSliderCenterTime({
18384
+ mapId: mapId,
18385
+ timeSliderCenterTime: newTime
18386
+ }));
18387
+ };
18388
+
18389
+ return /*#__PURE__*/React__namespace.createElement(NowButton, {
18390
+ disabled: isDisabled,
18391
+ onSetNow: function onSetNow() {
18392
+ return handleSetNowEvent(timeStep, dataStartTime, dataEndTime, currentTime, onSetNewDate, onSetCenterTime);
18393
+ }
18394
+ });
18395
+ };
18396
+
17753
18397
  /* *
17754
18398
  * Licensed under the Apache License, Version 2.0 (the "License");
17755
18399
  * you may not use this file except in compliance with the License.
@@ -17775,18 +18419,99 @@
17775
18419
  * ``` <OptionsMenuButtonConnect mapId={mapId} />```
17776
18420
  */
17777
18421
 
17778
- var OptionsMenuButtonConnect = function OptionsMenuButtonConnect(_a) {
17779
- var mapId = _a.mapId;
17780
- return /*#__PURE__*/React__namespace.createElement(OptionsMenuButton, {
17781
- autoUpdateBtn: /*#__PURE__*/React__namespace.createElement(AutoUpdateButtonConnect, {
17782
- mapId: mapId
17783
- }),
17784
- speedBtn: /*#__PURE__*/React__namespace.createElement(SpeedButtonConnect, {
17785
- mapId: mapId
17786
- }),
17787
- timeStepBtn: /*#__PURE__*/React__namespace.createElement(TimeStepButtonComponent, {
17788
- mapId: mapId
17789
- })
18422
+ var OptionsMenuButtonConnect = function OptionsMenuButtonConnect(_a) {
18423
+ var sourceId = _a.sourceId,
18424
+ mapId = _a.mapId;
18425
+ return /*#__PURE__*/React__namespace.createElement(OptionsMenuButton, {
18426
+ nowBtn: /*#__PURE__*/React__namespace.createElement(NowButtonConnect, {
18427
+ mapId: mapId,
18428
+ sourceId: sourceId
18429
+ }),
18430
+ autoUpdateBtn: /*#__PURE__*/React__namespace.createElement(AutoUpdateButtonConnect, {
18431
+ mapId: mapId
18432
+ }),
18433
+ speedBtn: /*#__PURE__*/React__namespace.createElement(SpeedButtonConnect, {
18434
+ mapId: mapId
18435
+ }),
18436
+ timeStepBtn: /*#__PURE__*/React__namespace.createElement(TimeStepButtonComponent, {
18437
+ mapId: mapId
18438
+ }),
18439
+ timeScaleBtn: /*#__PURE__*/React__namespace.createElement(TimeScaleButtonConnect, {
18440
+ mapId: mapId
18441
+ })
18442
+ });
18443
+ };
18444
+
18445
+ /* *
18446
+ * Licensed under the Apache License, Version 2.0 (the "License");
18447
+ * you may not use this file except in compliance with the License.
18448
+ * You may obtain a copy of the License at
18449
+ *
18450
+ * http://www.apache.org/licenses/LICENSE-2.0
18451
+ *
18452
+ * Unless required by applicable law or agreed to in writing, software
18453
+ * distributed under the License is distributed on an "AS IS" BASIS,
18454
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18455
+ * See the License for the specific language governing permissions and
18456
+ * limitations under the License.
18457
+ *
18458
+ * Copyright 2022 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
18459
+ * Copyright 2022 - Finnish Meteorological Institute (FMI)
18460
+ * */
18461
+
18462
+ var BackwardForwardStepButtonConnect = function BackwardForwardStepButtonConnect(_a) {
18463
+ var isForwardStep = _a.isForwardStep,
18464
+ mapId = _a.mapId;
18465
+ var timeStep = reactRedux.useSelector(function (store) {
18466
+ return getMapTimeStep(store, mapId);
18467
+ });
18468
+ var dispatch = reactRedux.useDispatch();
18469
+
18470
+ var setTime = function setTime(newDate) {
18471
+ dispatch(genericActions.setTime({
18472
+ origin: '',
18473
+ sourceId: mapId,
18474
+ value: handleMomentISOString(newDate)
18475
+ }));
18476
+ };
18477
+
18478
+ var stopAnimation = function stopAnimation() {
18479
+ dispatch(mapActions$1.mapStopAnimation({
18480
+ mapId: mapId,
18481
+ origin: MapActionOrigin.map
18482
+ }));
18483
+ };
18484
+
18485
+ var isAnimating$1 = reactRedux.useSelector(function (store) {
18486
+ return isAnimating(store, mapId);
18487
+ });
18488
+ var timedim = reactRedux.useSelector(function (store) {
18489
+ return getMapDimension(store, mapId, 'time');
18490
+ });
18491
+ var selectedTime = getSelectedTime(timedim);
18492
+ var curTime = moment__default["default"].unix(selectedTime).toISOString();
18493
+ var layers = reactRedux.useSelector(function (store) {
18494
+ return getMapLayers(store, mapId);
18495
+ });
18496
+
18497
+ var _b = __read(getDataLimitsFromLayers(layers), 2),
18498
+ dataStartTime = _b[0],
18499
+ dataEndTime = _b[1];
18500
+
18501
+ var onClickBF = function onClickBF() {
18502
+ if (isAnimating$1) {
18503
+ stopAnimation();
18504
+ }
18505
+
18506
+ isForwardStep ? setNextTimeStep(timeStep, curTime, dataEndTime, setTime) : setPreviousTimeStep(timeStep, curTime, dataStartTime, setTime);
18507
+ };
18508
+
18509
+ return /*#__PURE__*/React__default["default"].createElement(BackwardForwardStepButton, {
18510
+ isDisabled: false,
18511
+ isForwardStep: isForwardStep,
18512
+ onClickBFButton: function onClickBFButton() {
18513
+ onClickBF();
18514
+ }
17790
18515
  });
17791
18516
  };
17792
18517
 
@@ -17816,13 +18541,23 @@
17816
18541
  */
17817
18542
 
17818
18543
  var TimeSliderButtonsConnect = function TimeSliderButtonsConnect(_a) {
17819
- var mapId = _a.mapId;
18544
+ var sourceId = _a.sourceId,
18545
+ mapId = _a.mapId;
17820
18546
  return /*#__PURE__*/React__namespace.createElement(TimeSliderButtons, {
17821
18547
  optionsMenuBtn: /*#__PURE__*/React__namespace.createElement(OptionsMenuButtonConnect, {
17822
- mapId: mapId
18548
+ mapId: mapId,
18549
+ sourceId: sourceId
17823
18550
  }),
17824
18551
  playBtn: /*#__PURE__*/React__namespace.createElement(PlayButtonConnect, {
17825
18552
  mapId: mapId
18553
+ }),
18554
+ backwardBtn: /*#__PURE__*/React__namespace.createElement(BackwardForwardStepButtonConnect, {
18555
+ mapId: mapId,
18556
+ isForwardStep: false
18557
+ }),
18558
+ forwardBtn: /*#__PURE__*/React__namespace.createElement(BackwardForwardStepButtonConnect, {
18559
+ mapId: mapId,
18560
+ isForwardStep: true
17826
18561
  })
17827
18562
  });
17828
18563
  };
@@ -17862,8 +18597,6 @@
17862
18597
  }, {
17863
18598
  stopMapAnimation: mapActions$1.mapStopAnimation,
17864
18599
  setTime: genericActions.setTime,
17865
- syncGroupAddSource: genericActions.syncGroupAddSource,
17866
- syncGroupRemoveSource: genericActions.syncGroupRemoveSource,
17867
18600
  mapSetTimeSliderCenterTime: mapActions$1.setTimeSliderCenterTime,
17868
18601
  mapSetTimeSliderSecondsPerPx: mapActions$1.setTimeSliderSecondsPerPx
17869
18602
  });
@@ -17885,8 +18618,6 @@
17885
18618
  activeWindowId = _a.activeWindowId,
17886
18619
  stopMapAnimation = _a.stopMapAnimation,
17887
18620
  setTime = _a.setTime,
17888
- syncGroupAddSource = _a.syncGroupAddSource,
17889
- syncGroupRemoveSource = _a.syncGroupRemoveSource,
17890
18621
  mapSetTimeSliderCenterTime = _a.mapSetTimeSliderCenterTime,
17891
18622
  mapSetTimeSliderSecondsPerPx = _a.mapSetTimeSliderSecondsPerPx;
17892
18623
  var selectedTime = getTimeBounds(dimensions).selectedTime;
@@ -17897,17 +18628,6 @@
17897
18628
  dataEndTime = _b[1];
17898
18629
 
17899
18630
  var mapIsActive = mapId === activeWindowId;
17900
- React__namespace.useEffect(function () {
17901
- syncGroupAddSource({
17902
- id: sourceId,
17903
- type: [SYNCGROUPS_TYPE_SETTIME]
17904
- });
17905
- return function () {
17906
- syncGroupRemoveSource({
17907
- id: sourceId
17908
- });
17909
- };
17910
- }, [sourceId, syncGroupAddSource, syncGroupRemoveSource]);
17911
18631
  return /*#__PURE__*/React__namespace.createElement(TimeSliderLegend, {
17912
18632
  centerTime: centerTime,
17913
18633
  secondsPerPx: secondsPerPx,
@@ -18001,8 +18721,6 @@
18001
18721
  setAnimationEndTime: mapActions$1.setAnimationEndTime,
18002
18722
  setTime: genericActions.setTime,
18003
18723
  stopMapAnimation: mapActions$1.mapStopAnimation,
18004
- syncGroupAddSource: genericActions.syncGroupAddSource,
18005
- syncGroupRemoveSource: genericActions.syncGroupRemoveSource,
18006
18724
  mapSetTimeSliderCenterTime: mapActions$1.setTimeSliderCenterTime
18007
18725
  });
18008
18726
 
@@ -18024,8 +18742,6 @@
18024
18742
  setAnimationEndTime = _a.setAnimationEndTime,
18025
18743
  stopMapAnimation = _a.stopMapAnimation,
18026
18744
  setTime = _a.setTime,
18027
- syncGroupAddSource = _a.syncGroupAddSource,
18028
- syncGroupRemoveSource = _a.syncGroupRemoveSource,
18029
18745
  mapSetTimeSliderCenterTime = _a.mapSetTimeSliderCenterTime;
18030
18746
  var selectedTime = getMomentTimeBounds(dimensions).selectedTime;
18031
18747
  var currentTime = moment__default["default"].utc().unix();
@@ -18035,17 +18751,6 @@
18035
18751
  dataEndTime = _b[1];
18036
18752
 
18037
18753
  var mapIsActive = activeWindowId === mapId;
18038
- React__namespace.useEffect(function () {
18039
- syncGroupAddSource({
18040
- id: sourceId,
18041
- type: [SYNCGROUPS_TYPE_SETTIME]
18042
- });
18043
- return function () {
18044
- syncGroupRemoveSource({
18045
- id: sourceId
18046
- });
18047
- };
18048
- }, [sourceId, syncGroupAddSource, syncGroupRemoveSource]);
18049
18754
  return /*#__PURE__*/React__namespace.createElement(TimeSliderRail, {
18050
18755
  centerTime: centerTime,
18051
18756
  secondsPerPx: secondsPerPx,
@@ -18095,87 +18800,6 @@
18095
18800
 
18096
18801
  var TimeSliderRailConnect = connectRedux$1(TimeSliderRailConnectComponent);
18097
18802
 
18098
- /* *
18099
- * Licensed under the Apache License, Version 2.0 (the "License");
18100
- * you may not use this file except in compliance with the License.
18101
- * You may obtain a copy of the License at
18102
- *
18103
- * http://www.apache.org/licenses/LICENSE-2.0
18104
- *
18105
- * Unless required by applicable law or agreed to in writing, software
18106
- * distributed under the License is distributed on an "AS IS" BASIS,
18107
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18108
- * See the License for the specific language governing permissions and
18109
- * limitations under the License.
18110
- *
18111
- * Copyright 2020 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
18112
- * Copyright 2020 - Finnish Meteorological Institute (FMI)
18113
- * */
18114
- var connectReduxTimeSliderScaleSlider = reactRedux.connect(function (store, props) {
18115
- return {
18116
- layers: getMapLayers(store, props.mapId),
18117
- timeSliderScale: getMapTimeSliderScale(store, props.mapId),
18118
- centerTime: getMapTimeSliderCenterTime(store, props.mapId),
18119
- secondsPerPx: getMapTimeSliderSecondsPerPx(store, props.mapId),
18120
- dimensions: getMapDimensions(store, props.mapId)
18121
- };
18122
- }, {
18123
- mapSetTimeSliderScale: mapActions$1.setTimeSliderScale,
18124
- mapSetTimeSliderDataScaleToSecondsPerPx: mapActions$1.setTimeSliderDataScaleToSecondsPerPx,
18125
- mapSetTimeSliderCenterTime: mapActions$1.setTimeSliderCenterTime
18126
- });
18127
-
18128
- var TimeSliderScaleSliderComponent = function TimeSliderScaleSliderComponent(_a) {
18129
- var timeSliderScale = _a.timeSliderScale,
18130
- mapId = _a.mapId,
18131
- layers = _a.layers,
18132
- centerTime = _a.centerTime,
18133
- secondsPerPx = _a.secondsPerPx,
18134
- dimensions = _a.dimensions,
18135
- mapSetTimeSliderScale = _a.mapSetTimeSliderScale,
18136
- mapSetTimeSliderDataScaleToSecondsPerPx = _a.mapSetTimeSliderDataScaleToSecondsPerPx,
18137
- mapSetTimeSliderCenterTime = _a.mapSetTimeSliderCenterTime;
18138
-
18139
- var onSetTimeSliderScale = function onSetTimeSliderScale(scale, newCenterTime, scaleToSecPerPx) {
18140
- if (scale === Scale.DataScale) {
18141
- mapSetTimeSliderDataScaleToSecondsPerPx({
18142
- mapId: mapId,
18143
- timeSliderDataScaleToSecondsPerPx: scaleToSecPerPx
18144
- });
18145
- }
18146
-
18147
- mapSetTimeSliderScale({
18148
- mapId: mapId,
18149
- timeSliderScale: scale
18150
- });
18151
- mapSetTimeSliderCenterTime({
18152
- mapId: mapId,
18153
- timeSliderCenterTime: newCenterTime
18154
- });
18155
- };
18156
-
18157
- var selectedTime = getTimeBounds(dimensions).selectedTime;
18158
- return /*#__PURE__*/React__namespace.createElement(TimeSliderScaleSlider, {
18159
- layers: layers,
18160
- timeSliderScale: timeSliderScale,
18161
- onChangeTimeSliderScale: onSetTimeSliderScale,
18162
- secondsPerPx: secondsPerPx,
18163
- centerTime: centerTime,
18164
- selectedTime: selectedTime
18165
- });
18166
- };
18167
- /**
18168
- * TimeSliderScaleSlider component connected to the store displaying a scale slider of the time slider
18169
- *
18170
- * Expects the following props:
18171
- * @param {string} mapId mapId: string - Id of the map
18172
- * @example
18173
- * ``` <TimeSliderScaleSliderConnect mapId={mapId} />```
18174
- */
18175
-
18176
-
18177
- var TimeSliderScaleSliderConnect = connectReduxTimeSliderScaleSlider(TimeSliderScaleSliderComponent);
18178
-
18179
18803
  /* *
18180
18804
  * Licensed under the Apache License, Version 2.0 (the "License");
18181
18805
  * you may not use this file except in compliance with the License.
@@ -18243,15 +18867,13 @@
18243
18867
 
18244
18868
  return /*#__PURE__*/React__namespace.createElement(TimeSlider, {
18245
18869
  buttons: /*#__PURE__*/React__namespace.createElement(TimeSliderButtonsConnect, {
18246
- mapId: mapId
18870
+ mapId: mapId,
18871
+ sourceId: sourceId
18247
18872
  }),
18248
18873
  rail: /*#__PURE__*/React__namespace.createElement(TimeSliderRailConnect, {
18249
18874
  mapId: mapId,
18250
18875
  sourceId: sourceId
18251
18876
  }),
18252
- scaleSlider: /*#__PURE__*/React__namespace.createElement(TimeSliderScaleSliderConnect, {
18253
- mapId: mapId
18254
- }),
18255
18877
  legend: /*#__PURE__*/React__namespace.createElement(TimeSliderLegendConnect$1, {
18256
18878
  mapId: mapId,
18257
18879
  sourceId: sourceId
@@ -18744,7 +19366,7 @@
18744
19366
  id: service.id,
18745
19367
  serviceUrl: wmLayer.service,
18746
19368
  layers: layers,
18747
- isUserAddedService: false
19369
+ scope: 'system'
18748
19370
  },
18749
19371
  layerStyle: {
18750
19372
  origin: origin,
@@ -19452,7 +20074,7 @@
19452
20074
  }
19453
20075
 
19454
20076
  if (!featureCoords) {
19455
- return;
20077
+ return undefined;
19456
20078
  }
19457
20079
 
19458
20080
  var vertexSelected = mouseDown === true && this.mouseIsOverVertexNr !== VERTEX.NONE;
@@ -19476,6 +20098,8 @@
19476
20098
 
19477
20099
  return false;
19478
20100
  }
20101
+
20102
+ return undefined;
19479
20103
  };
19480
20104
 
19481
20105
  AdagucMapDraw.prototype.hoverVertex = function (feature, mouseX, mouseY) {
@@ -19590,7 +20214,7 @@
19590
20214
  isInEditMode = _a.isInEditMode,
19591
20215
  featureNrToEdit = _a.featureNrToEdit,
19592
20216
  onHoverFeature = _a.onHoverFeature;
19593
- if (event && event.rightButton === true) return;
20217
+ if (event && event.rightButton === true) return undefined;
19594
20218
  /* adagucMouseMove is an event callback function which is triggered when the mouse moves over the map
19595
20219
  This event is only triggered if the map is in hover state.
19596
20220
  E.g. when the map is dragging/panning, this event is not triggerd
@@ -19631,11 +20255,11 @@
19631
20255
  }
19632
20256
 
19633
20257
  if (isInEditMode === false) {
19634
- return;
20258
+ return undefined;
19635
20259
  }
19636
20260
 
19637
20261
  var feature = this.geojson.features[featureNrToEdit];
19638
- if (!feature) return;
20262
+ if (!feature) return undefined;
19639
20263
  var webmapjs = this.props.webmapjs;
19640
20264
  this.mouseGeoCoord = webmapjs.getLatLongFromPixelCoord({
19641
20265
  x: mouseX,
@@ -19701,6 +20325,8 @@
19701
20325
  /* False means that this component will take over entire controll.
19702
20326
  True means that it is still possible to pan and drag the map while editing */
19703
20327
  }
20328
+
20329
+ return undefined;
19704
20330
  };
19705
20331
  /* Returns true if double click is detected */
19706
20332
 
@@ -19994,6 +20620,8 @@
19994
20620
  return false;
19995
20621
  }
19996
20622
  }
20623
+
20624
+ return undefined;
19997
20625
  };
19998
20626
 
19999
20627
  AdagucMapDraw.prototype.addPointToLineStringFeature = function (event) {
@@ -20762,7 +21390,7 @@
20762
21390
  /* After the image is loaded the canvas will be redrawn and drawIcon will be triggered again
20763
21391
  via the beforecanvasdisplay listener. */
20764
21392
 
20765
- return;
21393
+ return undefined;
20766
21394
  }
20767
21395
 
20768
21396
  if (image.isLoaded()) {
@@ -20775,6 +21403,8 @@
20775
21403
  ctx.strokeRect(parseInt(_coord.x, 10) - imageWidth / 2, parseInt(_coord.y, 10) - imageHeight / 2, imageWidth, imageHeight);
20776
21404
  }
20777
21405
  }
21406
+
21407
+ return undefined;
20778
21408
  };
20779
21409
 
20780
21410
  AdagucMapDraw.prototype.drawMarker = function (ctx, _coord, selected, middle, isInEditMode, featureProperties) {
@@ -21979,12 +22609,8 @@
21979
22609
  shouldAutoFetch: true,
21980
22610
  displayMapPin: false,
21981
22611
  disableMapPin: false,
21982
- onMount: function onMount() {
21983
- return null;
21984
- },
21985
- onUnMount: function onUnMount() {
21986
- return null;
21987
- },
22612
+ onMount: function onMount() {},
22613
+ onUnMount: function onUnMount() {},
21988
22614
  onMapChangeDimension: function onMapChangeDimension() {
21989
22615
  /* nothing */
21990
22616
  },
@@ -22096,7 +22722,7 @@
22096
22722
  }
22097
22723
  }, /*#__PURE__*/React__namespace.createElement(ZoomControls, {
22098
22724
  onZoomIn: function onZoomIn() {
22099
- return adagucRef.current.zoomIn();
22725
+ return adagucRef.current.zoomIn(undefined);
22100
22726
  },
22101
22727
  onZoomOut: function onZoomOut() {
22102
22728
  return adagucRef.current.zoomOut();
@@ -22165,10 +22791,10 @@
22165
22791
  return (touches === null || touches === void 0 ? void 0 : touches.length) === 2;
22166
22792
  };
22167
22793
 
22168
- var isValidMap = React__namespace.useCallback(function (map, event) {
22794
+ var isCanvasElement = React__namespace.useCallback(function (event) {
22169
22795
  var target = event.target;
22170
- return map && target.tagName !== 'INPUT' && mapIsActive;
22171
- }, [mapIsActive]);
22796
+ return target.tagName === 'CANVAS';
22797
+ }, []);
22172
22798
 
22173
22799
  var distance = function distance(x1, y1, x2, y2) {
22174
22800
  var dx = x1 - x2;
@@ -22176,9 +22802,32 @@
22176
22802
  return Math.sqrt(dx * dx + dy * dy);
22177
22803
  };
22178
22804
 
22805
+ var isMatchingWebMapNumbers = function isMatchingWebMapNumbers(firstStr, secondStr) {
22806
+ // Returns true if the same web map (id) number were encountered in both given strings, false otherwise.
22807
+ var webMapNumberBaseFormat = 'WebMapJSMapNo_';
22808
+
22809
+ if (!firstStr.includes(webMapNumberBaseFormat) || !secondStr.includes(webMapNumberBaseFormat)) {
22810
+ return false;
22811
+ }
22812
+
22813
+ var numberMatcher = /\d+/;
22814
+ var firstNumber = firstStr.match(numberMatcher)[0];
22815
+ var secondNumber = secondStr.match(numberMatcher)[0];
22816
+ return Boolean(firstNumber && secondNumber && firstNumber === secondNumber);
22817
+ };
22818
+
22819
+ var isTouchInsideTargetElement = function isTouchInsideTargetElement(elem, touchX, touchY) {
22820
+ var _a = elem.getBoundingClientRect(),
22821
+ left = _a.left,
22822
+ top = _a.top,
22823
+ width = _a.width,
22824
+ height = _a.height;
22825
+
22826
+ var leftMarginWidth = 0.02 * document.body.getBoundingClientRect().width;
22827
+ return touchY > window.scrollY + top && touchY < window.scrollY + top + height - TIME_SLIDER_LEGEND_HEIGHT && touchX > window.scrollX + left + leftMarginWidth && touchX < window.scrollX + left + width;
22828
+ };
22829
+
22179
22830
  var handleStart = React__namespace.useCallback(function (event) {
22180
- var map = getWMJSMapById(mapId);
22181
- if (!isValidMap(map, event)) return;
22182
22831
  var targetTouches = event.targetTouches;
22183
22832
  var firstTouch = targetTouches === null || targetTouches === void 0 ? void 0 : targetTouches.item(0);
22184
22833
  setFirstTouchX(firstTouch === null || firstTouch === void 0 ? void 0 : firstTouch.clientX);
@@ -22189,10 +22838,31 @@
22189
22838
  setSecondTouchX(secondTouch === null || secondTouch === void 0 ? void 0 : secondTouch.clientX);
22190
22839
  setSecondTouchY(secondTouch === null || secondTouch === void 0 ? void 0 : secondTouch.clientY);
22191
22840
  }
22192
- }, [isValidMap, mapId]);
22841
+ }, []);
22193
22842
  var handleMove = React__namespace.useCallback(function (event) {
22194
22843
  var map = getWMJSMapById(mapId);
22195
- if (!isValidMap(map, event)) return;
22844
+ var targetElem = event.target;
22845
+
22846
+ if (!isCanvasElement(event)) {
22847
+ // Elements other than canvas elements are not allowed to be zoomed/panned
22848
+ return;
22849
+ }
22850
+
22851
+ var targetMapId = map.getId();
22852
+ var targetElemId = targetElem.parentElement.id;
22853
+
22854
+ if (!isMatchingWebMapNumbers(targetMapId, targetElemId)) {
22855
+ // Current map (given by map id) was not coupled to the canvas element user touched.
22856
+ // This web map id number comparison is of importance when dealing with multi-window presentations.
22857
+ return;
22858
+ }
22859
+
22860
+ if (!isTouchInsideTargetElement(targetElem, firstTouchX, firstTouchY)) {
22861
+ // A user touch outside the current canvas element will be rejected
22862
+ return;
22863
+ } // Start zooming/panning by touch
22864
+
22865
+
22196
22866
  event.preventDefault();
22197
22867
  var targetTouches = event.targetTouches;
22198
22868
  var firstTouch = targetTouches === null || targetTouches === void 0 ? void 0 : targetTouches.item(0);
@@ -22234,7 +22904,7 @@
22234
22904
  setPrevDist(dist);
22235
22905
  }
22236
22906
  }
22237
- }, [firstTouchX, firstTouchY, isValidMap, mapId, prevDist, secondTouchX, secondTouchY]);
22907
+ }, [mapId, isCanvasElement, firstTouchX, firstTouchY, secondTouchX, secondTouchY, prevDist]);
22238
22908
  var handleEnd = React__namespace.useCallback(function () {}, []);
22239
22909
  React__namespace.useEffect(function () {
22240
22910
  document.addEventListener('touchstart', handleStart, {
@@ -22483,7 +23153,7 @@
22483
23153
  },
22484
23154
  srs: srs,
22485
23155
  bbox: bbox,
22486
- mapPinLocation: displayMapPin && mapPinLocation,
23156
+ mapPinLocation: displayMapPin ? mapPinLocation : undefined,
22487
23157
  dimensions: mapDimensions,
22488
23158
  activeLayerId: activeLayerId,
22489
23159
  animationDelay: animationDelay,
@@ -22567,40 +23237,185 @@
22567
23237
  * See the License for the specific language governing permissions and
22568
23238
  * limitations under the License.
22569
23239
  *
22570
- * Copyright 2021 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
22571
- * Copyright 2021 - Finnish Meteorological Institute (FMI)
23240
+ * Copyright 2021 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
23241
+ * Copyright 2021 - Finnish Meteorological Institute (FMI)
23242
+ * */
23243
+
23244
+ var LegendMapButtonConnect = function LegendMapButtonConnect(_a) {
23245
+ var mapId = _a.mapId,
23246
+ _b = _a.source,
23247
+ source = _b === void 0 ? 'app' : _b,
23248
+ _c = _a.multiLegend,
23249
+ multiLegend = _c === void 0 ? false : _c;
23250
+ var dispatch = reactRedux.useDispatch();
23251
+ var legendType = multiLegend ? "legend-" + mapId : "legend";
23252
+ var currentActiveMapId = reactRedux.useSelector(function (store) {
23253
+ return getDialogMapId(store, legendType);
23254
+ });
23255
+ var isOpenInStore = reactRedux.useSelector(function (store) {
23256
+ return getisDialogOpen(store, legendType);
23257
+ });
23258
+ var openLegendDialog = React__namespace.useCallback(function () {
23259
+ dispatch(uiActions.setActiveMapIdForDialog({
23260
+ type: legendType,
23261
+ mapId: mapId,
23262
+ setOpen: currentActiveMapId !== mapId ? true : !isOpenInStore,
23263
+ source: source,
23264
+ origin: MapActionOrigin.map
23265
+ }));
23266
+ }, [currentActiveMapId, dispatch, isOpenInStore, mapId, source, legendType]);
23267
+ var isOpen = currentActiveMapId === mapId && isOpenInStore;
23268
+ return /*#__PURE__*/React__namespace.createElement(MapControlButton, {
23269
+ title: "Legend",
23270
+ "data-testid": "open-Legend",
23271
+ onClick: openLegendDialog,
23272
+ isActive: isOpen
23273
+ }, /*#__PURE__*/React__namespace.createElement(theme.List, null));
23274
+ };
23275
+
23276
+ /* *
23277
+ * Licensed under the Apache License, Version 2.0 (the "License");
23278
+ * you may not use this file except in compliance with the License.
23279
+ * You may obtain a copy of the License at
23280
+ *
23281
+ * http://www.apache.org/licenses/LICENSE-2.0
23282
+ *
23283
+ * Unless required by applicable law or agreed to in writing, software
23284
+ * distributed under the License is distributed on an "AS IS" BASIS,
23285
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
23286
+ * See the License for the specific language governing permissions and
23287
+ * limitations under the License.
23288
+ *
23289
+ * Copyright 2022 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
23290
+ * Copyright 2022 - Finnish Meteorological Institute (FMI)
23291
+ * */
23292
+ var MIN_WIDTH = 170;
23293
+ var MIN_HEIGHT = 32;
23294
+ var MIN_FONT_SIZE = 14;
23295
+ var FONT_SIZE_WIDTH_RATIO = MIN_FONT_SIZE / MIN_WIDTH;
23296
+ var TimeSliderClock = function TimeSliderClock(_a) {
23297
+ var time = _a.time;
23298
+ var nodeRef = React__namespace.useRef(null);
23299
+
23300
+ var _b = __read(React__namespace.useState({
23301
+ x: 0,
23302
+ y: 0
23303
+ }), 2),
23304
+ position = _b[0],
23305
+ setPosition = _b[1];
23306
+
23307
+ shared.useMakeSureContainerStaysInsideWindow(nodeRef, position, setPosition);
23308
+
23309
+ var _c = __read(React__namespace.useState({
23310
+ width: MIN_WIDTH,
23311
+ height: MIN_HEIGHT
23312
+ }), 2),
23313
+ size = _c[0],
23314
+ setSize = _c[1];
23315
+
23316
+ var _d = __read(React__namespace.useState(MIN_FONT_SIZE), 2),
23317
+ fontSize = _d[0],
23318
+ setFontSize = _d[1];
23319
+
23320
+ return /*#__PURE__*/React__namespace.createElement(Draggable__default["default"], {
23321
+ nodeRef: nodeRef,
23322
+ bounds: "parent",
23323
+ position: position,
23324
+ onStop: function onStop(_event, position) {
23325
+ setPosition(position);
23326
+ }
23327
+ }, /*#__PURE__*/React__namespace.createElement("div", {
23328
+ style: {
23329
+ position: 'absolute',
23330
+ zIndex: 100,
23331
+ top: '10px',
23332
+ right: '10px'
23333
+ },
23334
+ ref: nodeRef
23335
+ }, /*#__PURE__*/React__namespace.createElement(reResizable.Resizable, {
23336
+ onResizeStart: function onResizeStart(event) {
23337
+ event.stopPropagation();
23338
+ },
23339
+ onResize: function onResize(_event, _direction, _ref, delta) {
23340
+ var width = size.width + delta.width;
23341
+ var fontSize = FONT_SIZE_WIDTH_RATIO * width;
23342
+ setFontSize(fontSize);
23343
+ },
23344
+ onResizeStop: function onResizeStop(_event, _direction, _ref, delta) {
23345
+ var width = size.width + delta.width;
23346
+ var height = size.height + delta.height;
23347
+ setSize({
23348
+ width: width,
23349
+ height: height
23350
+ });
23351
+ },
23352
+ lockAspectRatio: true,
23353
+ minHeight: MIN_HEIGHT,
23354
+ minWidth: MIN_WIDTH,
23355
+ size: size,
23356
+ handleComponent: {
23357
+ bottomLeft: /*#__PURE__*/React__namespace.createElement(theme.Resize, {
23358
+ isRightAligned: true,
23359
+ style: {
23360
+ fill: '#FFFFFF'
23361
+ }
23362
+ })
23363
+ },
23364
+ enable: {
23365
+ top: false,
23366
+ right: false,
23367
+ bottom: false,
23368
+ left: false,
23369
+ topRight: false,
23370
+ bottomRight: false,
23371
+ bottomLeft: true,
23372
+ topLeft: false
23373
+ }
23374
+ }, /*#__PURE__*/React__namespace.createElement(system.Box, {
23375
+ display: "flex",
23376
+ justifyContent: "center",
23377
+ alignItems: "center",
23378
+ sx: {
23379
+ cursor: 'move',
23380
+ height: '100%',
23381
+ width: '100%',
23382
+ backgroundColor: '#051039',
23383
+ borderRadius: '5px'
23384
+ }
23385
+ }, /*#__PURE__*/React__namespace.createElement(material.Typography, {
23386
+ variant: "subtitle2",
23387
+ sx: {
23388
+ color: '#FFFFFF',
23389
+ fontSize: fontSize
23390
+ }
23391
+ }, moment__default["default"].utc(time).format('ddd DD MMM HH:mm z'))))));
23392
+ };
23393
+
23394
+ /* *
23395
+ * Licensed under the Apache License, Version 2.0 (the "License");
23396
+ * you may not use this file except in compliance with the License.
23397
+ * You may obtain a copy of the License at
23398
+ *
23399
+ * http://www.apache.org/licenses/LICENSE-2.0
23400
+ *
23401
+ * Unless required by applicable law or agreed to in writing, software
23402
+ * distributed under the License is distributed on an "AS IS" BASIS,
23403
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
23404
+ * See the License for the specific language governing permissions and
23405
+ * limitations under the License.
23406
+ *
23407
+ * Copyright 2022 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
23408
+ * Copyright 2022 - Finnish Meteorological Institute (FMI)
22572
23409
  * */
22573
-
22574
- var LegendMapButtonConnect = function LegendMapButtonConnect(_a) {
22575
- var mapId = _a.mapId,
22576
- _b = _a.source,
22577
- source = _b === void 0 ? 'app' : _b,
22578
- _c = _a.multiLegend,
22579
- multiLegend = _c === void 0 ? false : _c;
22580
- var dispatch = reactRedux.useDispatch();
22581
- var legendType = multiLegend ? "legend-" + mapId : "legend";
22582
- var currentActiveMapId = reactRedux.useSelector(function (store) {
22583
- return getDialogMapId(store, legendType);
23410
+ var TimeSliderClockConnect = function TimeSliderClockConnect(_a) {
23411
+ var mapId = _a.mapId;
23412
+ var dimensions = reactRedux.useSelector(function (store) {
23413
+ return getMapDimensions(store, mapId);
22584
23414
  });
22585
- var isOpenInStore = reactRedux.useSelector(function (store) {
22586
- return getisDialogOpen(store, legendType);
23415
+ var selectedTime = getMomentTimeBounds(dimensions).selectedTime;
23416
+ return /*#__PURE__*/React__default["default"].createElement(TimeSliderClock, {
23417
+ time: selectedTime
22587
23418
  });
22588
- var openLegendDialog = React__namespace.useCallback(function () {
22589
- dispatch(uiActions.setActiveMapIdForDialog({
22590
- type: legendType,
22591
- mapId: mapId,
22592
- setOpen: currentActiveMapId !== mapId ? true : !isOpenInStore,
22593
- source: source,
22594
- origin: MapActionOrigin.map
22595
- }));
22596
- }, [currentActiveMapId, dispatch, isOpenInStore, mapId, source, legendType]);
22597
- var isOpen = currentActiveMapId === mapId && isOpenInStore;
22598
- return /*#__PURE__*/React__namespace.createElement(MapControlButton, {
22599
- title: "Legend",
22600
- "data-testid": "open-Legend",
22601
- onClick: openLegendDialog,
22602
- isActive: isOpen
22603
- }, /*#__PURE__*/React__namespace.createElement(theme.List, null));
22604
23419
  };
22605
23420
 
22606
23421
  /* *
@@ -22669,7 +23484,9 @@
22669
23484
  _p = _a.multiLegend,
22670
23485
  multiLegend = _p === void 0 ? true : _p,
22671
23486
  shouldShowLayerManager = _a.shouldShowLayerManager,
22672
- props = __rest(_a, ["id", "title", "layers", "shouldAutoUpdate", "shouldAnimate", "bbox", "srs", "shouldShowZoomControls", "displayMapPin", "showTimeSlider", "disableTimeSlider", "displayTimeInMap", "displayLayerManagerAndLegendButtonInMap", "displayDimensionSelectButtonInMap", "multiLegend", "shouldShowLayerManager"]);
23487
+ _q = _a.showClock,
23488
+ showClock = _q === void 0 ? true : _q,
23489
+ props = __rest(_a, ["id", "title", "layers", "shouldAutoUpdate", "shouldAnimate", "bbox", "srs", "shouldShowZoomControls", "displayMapPin", "showTimeSlider", "disableTimeSlider", "displayTimeInMap", "displayLayerManagerAndLegendButtonInMap", "displayDimensionSelectButtonInMap", "multiLegend", "shouldShowLayerManager", "showClock"]);
22673
23490
 
22674
23491
  var dispatch = reactRedux.useDispatch();
22675
23492
  var mapId = React__default["default"].useRef(id || generateMapId()).current;
@@ -22704,7 +23521,7 @@
22704
23521
 
22705
23522
  if (shouldShowLayerManager !== undefined) {
22706
23523
  dispatch(uiActions.setActiveMapIdForDialog({
22707
- type: 'layerManager',
23524
+ type: DialogTypes.LayerManager,
22708
23525
  mapId: mapId,
22709
23526
  setOpen: shouldShowLayerManager,
22710
23527
  source: 'app'
@@ -22757,6 +23574,8 @@
22757
23574
  showMapId: true,
22758
23575
  mapId: mapId,
22759
23576
  multiLegend: multiLegend
23577
+ }), showClock && /*#__PURE__*/React__default["default"].createElement(TimeSliderClockConnect, {
23578
+ mapId: mapId
22760
23579
  }));
22761
23580
  };
22762
23581
 
@@ -22796,7 +23615,9 @@
22796
23615
  _c = _a.showZoomControls,
22797
23616
  showZoomControls = _c === void 0 ? true : _c,
22798
23617
  _d = _a.multiLegend,
22799
- multiLegend = _d === void 0 ? false : _d;
23618
+ multiLegend = _d === void 0 ? false : _d,
23619
+ _e = _a.showClock,
23620
+ showClock = _e === void 0 ? true : _e;
22800
23621
  var dispatch = reactRedux.useDispatch();
22801
23622
  var syncGroupAddTarget = React__default["default"].useCallback(function (payload) {
22802
23623
  dispatch(genericActions.syncGroupAddTarget(payload));
@@ -22839,6 +23660,8 @@
22839
23660
  showMapId: true,
22840
23661
  mapId: firstMapId,
22841
23662
  multiLegend: multiLegend
23663
+ }), showClock && /*#__PURE__*/React__default["default"].createElement(TimeSliderClockConnect, {
23664
+ mapId: firstMapId
22842
23665
  }), maps.map(function (map, mapIndex) {
22843
23666
  var mapId = map.id;
22844
23667
  return /*#__PURE__*/React__default["default"].createElement(material.Box, {
@@ -22858,112 +23681,12 @@
22858
23681
  shouldShowZoomControls: showZoomControls && mapIndex === 0,
22859
23682
  showTimeSlider: false,
22860
23683
  disableTimeSlider: true,
23684
+ showClock: false,
22861
23685
  multiLegend: multiLegend
22862
23686
  }));
22863
23687
  }));
22864
23688
  };
22865
23689
 
22866
- /* *
22867
- * Licensed under the Apache License, Version 2.0 (the "License");
22868
- * you may not use this file except in compliance with the License.
22869
- * You may obtain a copy of the License at
22870
- *
22871
- * http://www.apache.org/licenses/LICENSE-2.0
22872
- *
22873
- * Unless required by applicable law or agreed to in writing, software
22874
- * distributed under the License is distributed on an "AS IS" BASIS,
22875
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
22876
- * See the License for the specific language governing permissions and
22877
- * limitations under the License.
22878
- *
22879
- * Copyright 2021 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
22880
- * Copyright 2021 - Finnish Meteorological Institute (FMI)
22881
- * */
22882
-
22883
- var useGetReferenceTimes = function useGetReferenceTimes(inputLayer) {
22884
- var _a = __read(React__namespace.useState([]), 2),
22885
- referenceTimes = _a[0],
22886
- setReferenceTimes = _a[1];
22887
-
22888
- React__namespace.useEffect(function () {
22889
- var referenceTimes = [];
22890
- var wmLayer = new webmap.WMLayer(__assign({}, inputLayer));
22891
- wmLayer.parseLayerPromise().then(function (layer) {
22892
- var refTimeDim = layer.getDimension('reference_time');
22893
- /* Loop through all values of the dimension.
22894
- A map cannot be used for iterating, as the dimension values are not in an array (it is an API). */
22895
-
22896
- for (var j = 0; j < refTimeDim.size(); j += 1) {
22897
- var referenceTimeValue = refTimeDim.getValueForIndex(j);
22898
- referenceTimes.push(referenceTimeValue);
22899
- }
22900
-
22901
- setReferenceTimes(referenceTimes);
22902
- });
22903
- }, [inputLayer]);
22904
- return referenceTimes;
22905
- };
22906
-
22907
- var HarmonieTempAndPrecipPreset = function HarmonieTempAndPrecipPreset(_a) {
22908
- var layers = _a.layers,
22909
- _b = _a.multiLegend,
22910
- multiLegend = _b === void 0 ? false : _b;
22911
- /* Get all the reference times for this layer */
22912
-
22913
- var referenceTimes = useGetReferenceTimes(layers.topRow);
22914
- if (referenceTimes.length === 0) return /*#__PURE__*/React__namespace.createElement("div", null, "Loading...");
22915
- /* Helper to make a map layer prest */
22916
-
22917
- var makeMapPreset = function makeMapPreset(referenceTime, uniqueId, layer, syncGroupsIds, col) {
22918
- return {
22919
- id: uniqueId,
22920
- title: "Harmonie run " + ("" + referenceTime.substring(8, 13).replace('T', ' / ')),
22921
- bbox: {
22922
- left: -450651.2255879827,
22923
- bottom: 6490531.093143953,
22924
- right: 1428345.8183648037,
22925
- top: 7438773.776232235
22926
- },
22927
- srs: 'EPSG:3857',
22928
- layers: [__assign(__assign({}, layer), {
22929
- id: uniqueId,
22930
- dimensions: [{
22931
- name: 'reference_time',
22932
- currentValue: referenceTime
22933
- }]
22934
- })],
22935
- syncGroupsIds: syncGroupsIds,
22936
- displayLayerManagerAndLegendButtonInMap: col === 0 || !syncGroupsIds,
22937
- displayDimensionSelectButtonInMap: col === 0 || !syncGroupsIds
22938
- };
22939
- };
22940
- /* Make the preset */
22941
-
22942
-
22943
- var nCols = 5;
22944
- /* Add the harmonie air temperature layers with the different referencetimes */
22945
-
22946
- var mapsTemperature = __spreadArray([], __read(Array(nCols))).map(function (_, index) {
22947
- var refTime = referenceTimes[referenceTimes.length - nCols + index];
22948
- return makeMapPreset(refTime, "harm_air" + index, layers.topRow, layers.topRowSyncGroups, index);
22949
- });
22950
- /* Add the harmonie precipitation layers with the different referencetimes */
22951
-
22952
-
22953
- var mapsPrecipitation = __spreadArray([], __read(Array(nCols))).map(function (_, index) {
22954
- var refTime = referenceTimes[referenceTimes.length - nCols + index];
22955
- return makeMapPreset(refTime, "harm_precip" + index, layers.bottomRow, layers.bottomRowSyncGroups, index);
22956
- });
22957
-
22958
- var maps = mapsTemperature.concat(mapsPrecipitation);
22959
- return /*#__PURE__*/React__namespace.createElement(MultiMapViewConnect, {
22960
- rows: 2,
22961
- cols: 5,
22962
- maps: maps,
22963
- multiLegend: multiLegend
22964
- });
22965
- };
22966
-
22967
23690
  /* *
22968
23691
  * Licensed under the Apache License, Version 2.0 (the "License");
22969
23692
  * you may not use this file except in compliance with the License.
@@ -22996,9 +23719,31 @@
22996
23719
  }, [inputLayer]);
22997
23720
  return latestReferenceTime;
22998
23721
  };
22999
- /* Helper to make a map layer preset */
23722
+ /**
23723
+ * Custom hook to find out if the list of syncgroup id's contains a group which is of type SYNCGROUPS_TYPE_SETLAYERACTIONS
23724
+ * @param syncGroupsIds A string array of syncgroup ids
23725
+ * @returns True if indeed a group is included which is of type SYNCGROUPS_TYPE_SETLAYERACTIONS
23726
+ */
23000
23727
 
23001
23728
 
23729
+ var useHasSyncGroupWithLayerActions = function useHasSyncGroupWithLayerActions(syncGroupsIds) {
23730
+ /* Get Syncgroupstate */
23731
+ var syncGroupState = reactRedux.useSelector(function (store) {
23732
+ return getSynchronizationGroupState(store);
23733
+ });
23734
+ if (!syncGroupState) return false;
23735
+ /* Return all syncgroups configured for this component of type SYNCGROUPS_TYPE_SETLAYERACTIONS */
23736
+
23737
+ var syncGroupsWithLayerActions = syncGroupState.groups.allIds.filter(function (syncGroupId) {
23738
+ return syncGroupsIds && syncGroupsIds.includes(syncGroupId) && syncGroupState.groups.byId[syncGroupId].type === 'SYNCGROUPS_TYPE_SETLAYERACTIONS';
23739
+ });
23740
+ /* Figure out if there is a syncgroup which controls layeractions. */
23741
+
23742
+ var displayLayerManagerAndLegendButtonInAllMaps = syncGroupsIds ? syncGroupsWithLayerActions.length === 1 : false;
23743
+ return displayLayerManagerAndLegendButtonInAllMaps;
23744
+ };
23745
+ /* Helper to make a map layer preset */
23746
+
23002
23747
  var makeMapPreset = function makeMapPreset(timeIncrement, uniqueId, referenceTime, layers, syncGroupsIds, displayLayerManagerAndLegendButtonInMap, displayDimensionSelectButtonInMap) {
23003
23748
  var mapTime = moment__default["default"].utc(referenceTime).add(timeIncrement, 'h').format('YYYY-MM-DDTHH:mm:ss[Z]');
23004
23749
  return {
@@ -23039,6 +23784,7 @@
23039
23784
  startTimeIncrement = _d === void 0 ? 3 : _d,
23040
23785
  _e = _a.multiLegend,
23041
23786
  multiLegend = _e === void 0 ? false : _e;
23787
+ var displayLayerManagerAndLegendButtonInAllMaps = !useHasSyncGroupWithLayerActions(syncGroupsIds);
23042
23788
  /* Get latest reference time for this layer */
23043
23789
 
23044
23790
  var latestReferenceTime = useGetLatestReferenceTime(layers[0]);
@@ -23053,7 +23799,7 @@
23053
23799
 
23054
23800
 
23055
23801
  var maps = timeIncrements.map(function (increment, index) {
23056
- return makeMapPreset(increment, "harm_precip" + increment, latestReferenceTime, layers, syncGroupsIds, index === 0 || !syncGroupsIds, index === 0 || !syncGroupsIds);
23802
+ return makeMapPreset(increment, "harm_precip" + increment, latestReferenceTime, layers, syncGroupsIds, index === 0 || displayLayerManagerAndLegendButtonInAllMaps, index === 0 || displayLayerManagerAndLegendButtonInAllMaps);
23057
23803
  });
23058
23804
  return /*#__PURE__*/React__namespace.createElement(MultiMapViewConnect, {
23059
23805
  rows: 3,
@@ -23061,6 +23807,110 @@
23061
23807
  maps: maps,
23062
23808
  syncTime: false,
23063
23809
  showTimeSlider: false,
23810
+ multiLegend: multiLegend,
23811
+ showClock: false
23812
+ });
23813
+ };
23814
+
23815
+ /* *
23816
+ * Licensed under the Apache License, Version 2.0 (the "License");
23817
+ * you may not use this file except in compliance with the License.
23818
+ * You may obtain a copy of the License at
23819
+ *
23820
+ * http://www.apache.org/licenses/LICENSE-2.0
23821
+ *
23822
+ * Unless required by applicable law or agreed to in writing, software
23823
+ * distributed under the License is distributed on an "AS IS" BASIS,
23824
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
23825
+ * See the License for the specific language governing permissions and
23826
+ * limitations under the License.
23827
+ *
23828
+ * Copyright 2021 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
23829
+ * Copyright 2021 - Finnish Meteorological Institute (FMI)
23830
+ * */
23831
+
23832
+ var useGetReferenceTimes = function useGetReferenceTimes(inputLayer) {
23833
+ var _a = __read(React__namespace.useState([]), 2),
23834
+ referenceTimes = _a[0],
23835
+ setReferenceTimes = _a[1];
23836
+
23837
+ React__namespace.useEffect(function () {
23838
+ var referenceTimes = [];
23839
+ var wmLayer = new webmap.WMLayer(__assign({}, inputLayer));
23840
+ wmLayer.parseLayerPromise().then(function (layer) {
23841
+ var refTimeDim = layer.getDimension('reference_time');
23842
+ /* Loop through all values of the dimension.
23843
+ A map cannot be used for iterating, as the dimension values are not in an array (it is an API). */
23844
+
23845
+ for (var j = 0; j < refTimeDim.size(); j += 1) {
23846
+ var referenceTimeValue = refTimeDim.getValueForIndex(j);
23847
+ referenceTimes.push(referenceTimeValue);
23848
+ }
23849
+
23850
+ setReferenceTimes(referenceTimes);
23851
+ });
23852
+ }, [inputLayer]);
23853
+ return referenceTimes;
23854
+ };
23855
+
23856
+ var HarmonieTempAndPrecipPreset = function HarmonieTempAndPrecipPreset(_a) {
23857
+ var layers = _a.layers,
23858
+ _b = _a.multiLegend,
23859
+ multiLegend = _b === void 0 ? false : _b;
23860
+ var displayLayerManagerAndLegendButtonInAllTopRows = !useHasSyncGroupWithLayerActions(layers && layers.topRowSyncGroups);
23861
+ var displayLayerManagerAndLegendButtonInAllBottomRows = !useHasSyncGroupWithLayerActions(layers && layers.bottomRowSyncGroups);
23862
+ /* Get all the reference times for this layer */
23863
+
23864
+ var referenceTimes = useGetReferenceTimes(layers.topRow);
23865
+ if (referenceTimes.length === 0) return /*#__PURE__*/React__namespace.createElement("div", null, "Loading...");
23866
+ /* Helper to make a map layer prest */
23867
+
23868
+ var makeMapPreset = function makeMapPreset(referenceTime, uniqueId, layer, syncGroupsIds, col) {
23869
+ return {
23870
+ id: uniqueId,
23871
+ title: "Harmonie run " + ("" + referenceTime.substring(8, 13).replace('T', ' / ')),
23872
+ bbox: {
23873
+ left: -450651.2255879827,
23874
+ bottom: 6490531.093143953,
23875
+ right: 1428345.8183648037,
23876
+ top: 7438773.776232235
23877
+ },
23878
+ srs: 'EPSG:3857',
23879
+ layers: [__assign(__assign({}, layer), {
23880
+ id: uniqueId,
23881
+ dimensions: [{
23882
+ name: 'reference_time',
23883
+ currentValue: referenceTime
23884
+ }]
23885
+ })],
23886
+ syncGroupsIds: syncGroupsIds,
23887
+ displayLayerManagerAndLegendButtonInMap: col === 0 || displayLayerManagerAndLegendButtonInAllTopRows,
23888
+ displayDimensionSelectButtonInMap: col === 0 || displayLayerManagerAndLegendButtonInAllBottomRows
23889
+ };
23890
+ };
23891
+ /* Make the preset */
23892
+
23893
+
23894
+ var nCols = 5;
23895
+ /* Add the harmonie air temperature layers with the different referencetimes */
23896
+
23897
+ var mapsTemperature = __spreadArray([], __read(Array(nCols))).map(function (_, index) {
23898
+ var refTime = referenceTimes[referenceTimes.length - nCols + index];
23899
+ return makeMapPreset(refTime, "harm_air" + index, layers.topRow, layers.topRowSyncGroups, index);
23900
+ });
23901
+ /* Add the harmonie precipitation layers with the different referencetimes */
23902
+
23903
+
23904
+ var mapsPrecipitation = __spreadArray([], __read(Array(nCols))).map(function (_, index) {
23905
+ var refTime = referenceTimes[referenceTimes.length - nCols + index];
23906
+ return makeMapPreset(refTime, "harm_precip" + index, layers.bottomRow, layers.bottomRowSyncGroups, index);
23907
+ });
23908
+
23909
+ var maps = mapsTemperature.concat(mapsPrecipitation);
23910
+ return /*#__PURE__*/React__namespace.createElement(MultiMapViewConnect, {
23911
+ rows: 2,
23912
+ cols: 5,
23913
+ maps: maps,
23064
23914
  multiLegend: multiLegend
23065
23915
  });
23066
23916
  };
@@ -23497,7 +24347,7 @@
23497
24347
  dispatch(actions.syncGroupRemoveTarget(payload));
23498
24348
  }, [dispatch]);
23499
24349
 
23500
- var _a = useSetupDialog('syncGroups'),
24350
+ var _a = useSetupDialog(DialogTypes.SyncGroups),
23501
24351
  dialogOrder = _a.dialogOrder,
23502
24352
  isDialogOpen = _a.isDialogOpen,
23503
24353
  onCloseDialog = _a.onCloseDialog,
@@ -23532,9 +24382,8 @@
23532
24382
  * Copyright 2020 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
23533
24383
  * Copyright 2020 - Finnish Meteorological Institute (FMI)
23534
24384
  * */
23535
- var store = reduxDynamicModules.createStore({
23536
- initialState: {},
23537
- extensions: [reduxDynamicModulesSaga.getSagaExtension({})]
24385
+ var store = reduxToolkit.createStore({
24386
+ extensions: [sagaExtension.getSagaExtension()]
23538
24387
  });
23539
24388
 
23540
24389
  /* *
@@ -23715,9 +24564,7 @@
23715
24564
  * Copyright 2022 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
23716
24565
  * Copyright 2022 - Finnish Meteorological Institute (FMI)
23717
24566
  * */
23718
- var SnackbarWrapperConnect = function SnackbarWrapperConnect(_a) {
23719
- var props = __rest(_a, []);
23720
-
24567
+ var SnackbarWrapperConnect = shared.withEggs([snackbarModuleConfig])(function (props) {
23721
24568
  var dispatch = reactRedux.useDispatch();
23722
24569
 
23723
24570
  var onCloseSnackbar = function onCloseSnackbar() {
@@ -23727,15 +24574,13 @@
23727
24574
  var currentSnackbarMessage = reactRedux.useSelector(function (store) {
23728
24575
  return getFirstSnackbarMessage(store);
23729
24576
  });
23730
- return /*#__PURE__*/React__namespace.createElement(reduxDynamicModules.DynamicModuleLoader, {
23731
- modules: [snackbarModuleConfig]
23732
- }, /*#__PURE__*/React__namespace.createElement(SnackbarWrapper, __assign({
24577
+ return /*#__PURE__*/React__namespace.createElement(SnackbarWrapper, __assign({
23733
24578
  isOpen: !!currentSnackbarMessage,
23734
24579
  onCloseSnackbar: onCloseSnackbar,
23735
24580
  message: currentSnackbarMessage ? currentSnackbarMessage.message : '',
23736
24581
  id: currentSnackbarMessage ? currentSnackbarMessage.id : ''
23737
- }, props)));
23738
- };
24582
+ }, props));
24583
+ });
23739
24584
 
23740
24585
  /* *
23741
24586
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -23767,6 +24612,13 @@
23767
24612
  theme: theme$1
23768
24613
  }, children);
23769
24614
  };
24615
+ var ThemeWrapperWithModules = shared.withEggs(coreModuleConfig)(function (_a) {
24616
+ var theme = _a.theme,
24617
+ children = _a.children;
24618
+ return /*#__PURE__*/React__default["default"].createElement(CoreThemeProvider, {
24619
+ theme: theme
24620
+ }, children, " ");
24621
+ });
23770
24622
  /**
23771
24623
  * A Provider component which provides the GeoWeb theme and store for the core.
23772
24624
  * Note: Should only be used with core components, as the provided store is only for core.
@@ -23781,11 +24633,9 @@
23781
24633
  store = _a.store;
23782
24634
  return /*#__PURE__*/React__default["default"].createElement(reactRedux.Provider, {
23783
24635
  store: store
23784
- }, /*#__PURE__*/React__default["default"].createElement(reduxDynamicModules.DynamicModuleLoader, {
23785
- modules: coreModuleConfig
23786
- }, /*#__PURE__*/React__default["default"].createElement(CoreThemeProvider, {
24636
+ }, /*#__PURE__*/React__default["default"].createElement(ThemeWrapperWithModules, {
23787
24637
  theme: theme$1
23788
- }, /*#__PURE__*/React__default["default"].createElement(SnackbarWrapperConnect, null, children))));
24638
+ }, /*#__PURE__*/React__default["default"].createElement(SnackbarWrapperConnect, null, children)));
23789
24639
  };
23790
24640
 
23791
24641
  /* *