@opengeoweb/core 15.1.0 → 15.3.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 (20) hide show
  1. package/index.esm.js +622 -280
  2. package/package.json +10 -10
  3. package/src/lib/components/LayerInfoConnect/LayerInfoButtonConnect.d.ts +1 -0
  4. package/src/lib/components/LayerManager/LayerContainerRow/LayerRow/LayerRow.d.ts +1 -0
  5. package/src/lib/components/LayerManager/LayerContainerRow/LayerRow/LayerService/LayerService.d.ts +8 -0
  6. package/src/lib/components/LayerManager/LayerManager.d.ts +6 -2
  7. package/src/lib/components/LayerManager/LayerManagerUtils.d.ts +20 -4
  8. package/src/lib/components/MapViewConnect/olMapUtils.d.ts +5 -3
  9. package/src/lib/utils/defaultTestSettings.d.ts +3 -1
  10. package/src/lib/components/WMSLoader/WMSLoader.d.ts +0 -11
  11. package/src/lib/components/WMSLoader/WMSLoader.stories.d.ts +0 -12
  12. package/src/lib/components/WMSLoader/WMSLoaderConnect.d.ts +0 -21
  13. /package/src/lib/components/{WMSLoader → LayerManager/AddLayersPopup}/WMSLayerTree/WMSLayerTree.d.ts +0 -0
  14. /package/src/lib/components/{WMSLoader → LayerManager/AddLayersPopup}/WMSLayerTree/WMSLayerTree.spec.d.ts +0 -0
  15. /package/src/lib/components/{WMSLoader → LayerManager/AddLayersPopup}/WMSLayerTree/WMSLayerTreeConnect.d.ts +0 -0
  16. /package/src/lib/components/{WMSLoader → LayerManager/AddLayersPopup}/WMSLayerTree/WMSLayerTreeConnect.spec.d.ts +0 -0
  17. /package/src/lib/components/{WMSLoader → LayerManager/AddLayersPopup}/WMSLayerTree/WMSLayerTreeHeader.d.ts +0 -0
  18. /package/src/lib/components/{WMSLoader → LayerManager/AddLayersPopup}/WMSServerList/WMSServerList.d.ts +0 -0
  19. /package/src/lib/components/{WMSLoader → LayerManager/AddLayersPopup}/WMSServerList/WMSServerList.spec.d.ts +0 -0
  20. /package/src/lib/components/{WMSLoader/WMSLoader.spec.d.ts → LayerManager/LayerManagerConnect.persistence.spec.d.ts} +0 -0
package/index.esm.js CHANGED
@@ -1,16 +1,16 @@
1
- import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
2
- import { Grid, InputLabel, Paper, Box, Typography, CircularProgress, List, ListSubheader, ListItemButton, ListItemText, DialogContentText, TextField, InputAdornment, Button, FormControl, MenuItem, useTheme, Tooltip, ListItem, ListItemIcon, Checkbox, Popper, Fade, styled, LinearProgress, Autocomplete, Switch, Select } from '@mui/material';
1
+ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
2
+ import { FormControl, MenuItem, Grid, InputLabel, Paper, Box, Typography, CircularProgress, List, ListSubheader, ListItemButton, ListItemText, DialogContentText, TextField, InputAdornment, Button, useTheme, Tooltip, ListItem, ListItemIcon, Checkbox, Popper, Fade, styled, LinearProgress, Autocomplete, Switch, Select } from '@mui/material';
3
3
  import React, { useMemo, useState, useCallback, useEffect, useContext } from 'react';
4
- import { safelyInitI18nForTestsAndStories, sharedTranslations, SHARED_NAMESPACE, CustomIconButton, CustomDialog, TooltipSelect, CustomTooltip, ToggleMenu, AlertIcon, useConfirmationDialog, useScrollingInIsolation, sliderHeaderStyle, CustomSlider, tooltipContainerStyles, renderCounter, AlertBanner, CustomAccordion, PROJECTION, calculateStartSize, useWheelStopPropagation, ToolContainerDraggable, sessionStorageProvider, useDebounce, usePrevious, dateUtils } from '@opengeoweb/shared';
5
- import { queryWMSLayersTree, invalidateWMSGetCapabilities, LayerType, webmapUtils, queryWMSServiceInfo, queryWMSLayers, getWMSServiceId, generateLayerId, WMJSDimension, getWMLayerById, getMapDimURL, handleDateUtilsISOString, WMLayer } from '@opengeoweb/webmap';
6
- import { filterLayers, mapSelectors, layerActions, layerTypes, layerSelectors, mapActions, mapEnums, loadingIndicatorSelectors, layerUtils, serviceSelectors, serviceActions, uiSelectors, uiTypes, useSetupDialog, getUserAddedServices, uiActions, drawingToolSelectors, syncGroupsSelectors, syncConstants, getViewObjectForSyncGroup, getViewObjectForMapId, loadingIndicatorActions, genericSelectors, genericActions, defaultLayers, getSingularDrawtoolDrawLayerId, syncGroupsSelector, syncGroupsActions, routerUtils, mapUtils } from '@opengeoweb/store';
7
- import { connect, useDispatch, useSelector, useStore, Provider } from 'react-redux';
4
+ import { safelyInitI18nForTestsAndStories, sharedTranslations, SHARED_NAMESPACE, TooltipSelect, CustomIconButton, CustomDialog, CustomTooltip, ToggleMenu, AlertIcon, useConfirmationDialog, useScrollingInIsolation, sliderHeaderStyle, CustomSlider, tooltipContainerStyles, renderCounter, AlertBanner, CustomAccordion, PROJECTION, calculateStartSize, useWheelStopPropagation, ToolContainerDraggable, sessionStorageProvider, useDebounce, dateUtils, usePrevious } from '@opengeoweb/shared';
5
+ import { webmapUtils, queryWMSLayersTree, invalidateWMSGetCapabilities, LayerType, queryWMSServiceInfo, queryWMSLayers, getWMSServiceId, generateLayerId, WMJSDimension, getWMLayerById, getMapDimURL, handleDateUtilsISOString, WMLayer } from '@opengeoweb/webmap';
8
6
  import _, { isEqual, isArray, range, zip, throttle } from 'lodash';
9
- import { Cached, Add, MapAdd, CollapseSmall, CollapseMedium, CollapseLarge, CollapseWindow, ExpandWindow, LayersAdd, CloudLoading, ColumnCollapsed, ColumnCollapse, DragHandle as DragHandle$1, None, FastForward, AutoUpdateActive, Both, Delete, Visibility, VisibilityOff, Copy, Overlayers, WorldMapProjection, Layers, Search, Exclamation, MyLocation, Airplane, Region, Pinned, Close, ExitDomain, LocationInfo, Measure, Options, Info, ThemeWrapper, lightTheme, FlagBritain, FlagNetherlands, FlagFinland, FlagNorway } from '@opengeoweb/theme';
7
+ import { useDispatch, useSelector, connect, useStore, Provider } from 'react-redux';
8
+ import { mapSelectors, layerSelectors, layerActions, layerTypes, filterLayers, mapActions, mapEnums, loadingIndicatorSelectors, layerUtils, serviceSelectors, serviceActions, uiSelectors, uiTypes, useSetupDialog, getUserAddedServices, uiActions, drawingToolSelectors, syncGroupsSelectors, syncConstants, getViewObjectForSyncGroup, getViewObjectForMapId, loadingIndicatorActions, genericSelectors, genericActions, defaultLayers, getSingularDrawtoolDrawLayerId, syncGroupsSelector, syncGroupsActions, routerUtils, mapUtils } from '@opengeoweb/store';
10
9
  import i18n from 'i18next';
11
10
  import { useTranslation, I18nextProvider } from 'react-i18next';
12
- import { TIME_SLIDER_NAMESPACE, timesliderTranslations, defaultTimeSpan, AutoUpdateButton, BackwardForwardStepButton, NowButton, handleSetNowEvent, AnimationLengthButton, AnimationLength, SpeedButton, TimeSpanButton, secondsPerPxFromCanvasWidth, getNewCenterOfFixedPointZoom, TimeStepButton, OptionsMenuButton, PlayButton, defaultTimeStep, TimeSliderButtons, TimeSliderCurrentTimeBox, TimeSliderLegend, onsetNewDateDebounced, defaultSecondsPerPx, moveSelectedTimePx, TimeSlider, getFilteredTime } from '@opengeoweb/time-slider';
11
+ import { TIME_SLIDER_NAMESPACE, timesliderTranslations, defaultTimeSpan, AutoUpdateButton, BackwardForwardStepButton, NowButton, handleSetNowEvent, AnimationLengthButton, AnimationLength, SpeedButton, TimeSpanButton, secondsPerPxFromCanvasWidth, getNewCenterOfFixedPointZoom, TimeStepButton, OptionsMenuButton, PlayButton, defaultTimeStep, TimeSliderButtons, TimeSliderCurrentTimeBox, TimeSliderLegend, onsetNewDateDebounced, getFilteredTime, defaultSecondsPerPx, moveSelectedTimePx, TimeSlider } from '@opengeoweb/time-slider';
13
12
  import { webmapReactTranslations, WEBMAP_REACT_NAMESPACE, webmapTranslations, WEBMAP_NAMESPACE, openLayersGetMapImageStore, LayerInfoButton, useEDRGetCollectionDetails, defaultEdrStyles, LayerInfoDialog, MapControlButton, MapDimensionSelect, dimensionConfig, DimensionSelectDialog, DimensionSelectButton, Clock, LegendDialog, LegendButton, MapContext, emptyGeoJSON, MapFeatureClass, setMapCenter, OpenLayersFeatureLayer, OpenLayersMapDraw, makeTimeList, useGetWMLayerInstance, getIsInsideAcceptanceTime, OpenLayersLayer, MapMeasure, useSetIntervalWhenVisible, TimeContext, OpenLayersMapView, WMSLayer, genericOpenLayersFeatureStyle, OpenLayersGetFeatureInfo, MapControls, OpenLayersZoomControl, getLayerUpdateInfo, publicLayers } from '@opengeoweb/webmap-react';
13
+ import { Cached, Add, MapAdd, CollapseSmall, CollapseMedium, CollapseLarge, CollapseWindow, ExpandWindow, LayersAdd, CloudLoading, ColumnCollapsed, ColumnCollapse, DragHandle as DragHandle$1, None, FastForward, AutoUpdateActive, Both, Delete, Visibility, VisibilityOff, Copy, Overlayers, WorldMapProjection, Layers, Search, Exclamation, MyLocation, Airplane, Region, Pinned, Close, ExitDomain, LocationInfo, Measure, Options, Info, ThemeWrapper, lightTheme, FlagBritain, FlagNetherlands, FlagFinland, FlagNorway } from '@opengeoweb/theme';
14
14
  import { ReactSortable } from 'react-sortablejs';
15
15
  import Sortable from 'sortablejs';
16
16
  import { Box as Box$1, Stack } from '@mui/system';
@@ -48,6 +48,7 @@ var en = {
48
48
  "layermanager-title": "Layer Manager",
49
49
  "layermanager-baselayers-title": "Base layer",
50
50
  "layermanager-baselayers-no-available": "No service available",
51
+ "layermanager-sourcename-no-available": "No source available",
51
52
  "layermanager-overlayers-title": "Select overlayer",
52
53
  "layermanager-overlayers-overlayer": "Overlayer",
53
54
  "layermanager-acceptance-time": "Acc Time",
@@ -58,6 +59,7 @@ var en = {
58
59
  "layermanager-opacity-tooltip-prefix": "Opacity: ",
59
60
  "layermanager-style-title": "Style",
60
61
  "layermanager-layer-error": "This layer could not be loaded: does not exist on the server.",
62
+ "layermanager-service": "Source",
61
63
  "layermanager-layer": "Layer",
62
64
  "layermanager-layer-multi": "Layers",
63
65
  "layermanager-layer-toggle": "Toggle visibility",
@@ -128,7 +130,8 @@ var en = {
128
130
  "delete-dialog-cancel": "Cancel",
129
131
  "delete-dialog-confirm": "Delete",
130
132
  "map-options-button": "Location or Measuring tool",
131
- "map-measure-tool": "Measuring tool"
133
+ "map-measure-tool": "Measuring tool",
134
+ "data-outdated": "Outdated data"
132
135
  };
133
136
  var fi = {
134
137
  feature_info_title: "Napsauta karttaa nähdäksesi lisätietoja.",
@@ -312,6 +315,7 @@ var nl = {
312
315
  "layermanager-title": "Lagen Manager",
313
316
  "layermanager-baselayers-title": "Basislaag",
314
317
  "layermanager-baselayers-no-available": "Geen service beschikbaar",
318
+ "layermanager-sourcename-no-available": "Geen bron beschikbaar",
315
319
  "layermanager-overlayers-title": "Selecteer een overlayer",
316
320
  "layermanager-overlayers-overlayer": "Overlayer",
317
321
  "layermanager-acceptance-time": "Acc Tijd",
@@ -322,6 +326,7 @@ var nl = {
322
326
  "layermanager-opacity-tooltip-prefix": "Dekking: ",
323
327
  "layermanager-style-title": "Stijl",
324
328
  "layermanager-layer-error": "Deze laag kon niet geladen worden: bestaat niet op de server.",
329
+ "layermanager-service": "Bron",
325
330
  "layermanager-layer": "Laag",
326
331
  "layermanager-layer-toggle": "Zichtbaarheid aan/uit",
327
332
  "layermanager-layer-select": "Open de Layer Select",
@@ -389,7 +394,8 @@ var nl = {
389
394
  "delete-dialog-cancel": "Annuleren",
390
395
  "delete-dialog-confirm": "Verwijderen",
391
396
  "map-options-button": "Locatie informatie en Meten",
392
- "map-measure-tool": "Meten"
397
+ "map-measure-tool": "Meten",
398
+ "data-outdated": "Data is niet actueel"
393
399
  };
394
400
  var coreTranslations = {
395
401
  en: en,
@@ -708,6 +714,192 @@ function _regeneratorRuntime() {
708
714
  })();
709
715
  }
710
716
 
717
+ /* *
718
+ * Licensed under the Apache License, Version 2.0 (the "License");
719
+ * you may not use this file except in compliance with the License.
720
+ * You may obtain a copy of the License at
721
+ *
722
+ * http://www.apache.org/licenses/LICENSE-2.0
723
+ *
724
+ * Unless required by applicable law or agreed to in writing, software
725
+ * distributed under the License is distributed on an "AS IS" BASIS,
726
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
727
+ * See the License for the specific language governing permissions and
728
+ * limitations under the License.
729
+ *
730
+ * Copyright 2023 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
731
+ * Copyright 2023 - Finnish Meteorological Institute (FMI)
732
+ * Copyright 2024 - The Norwegian Meteorological Institute (MET Norway)
733
+ * */
734
+ var CORE_NAMESPACE = 'core';
735
+ var initCoreReactI18n = function initCoreReactI18n() {
736
+ safelyInitI18nForTestsAndStories(i18n, CORE_NAMESPACE, [{
737
+ ns: CORE_NAMESPACE,
738
+ translations: coreTranslations
739
+ }, {
740
+ ns: WEBMAP_REACT_NAMESPACE,
741
+ translations: webmapReactTranslations
742
+ }, {
743
+ ns: WEBMAP_NAMESPACE,
744
+ translations: webmapTranslations
745
+ }, {
746
+ ns: SHARED_NAMESPACE,
747
+ translations: sharedTranslations
748
+ }, {
749
+ ns: TIME_SLIDER_NAMESPACE,
750
+ translations: timesliderTranslations
751
+ }]);
752
+ };
753
+ var ns = [CORE_NAMESPACE, TIME_SLIDER_NAMESPACE];
754
+ var useCoreTranslation = function useCoreTranslation() {
755
+ return useTranslation(ns);
756
+ };
757
+
758
+ var BaseLayers = function BaseLayers(_ref) {
759
+ var _availableBaseLayers$;
760
+ var selectedBaseLayers = _ref.selectedBaseLayers,
761
+ availableBaseLayers = _ref.availableBaseLayers,
762
+ onChangeBaseLayers = _ref.onChangeBaseLayers,
763
+ icon = _ref.icon,
764
+ tooltipPrefix = _ref.tooltipPrefix;
765
+ var _useCoreTranslation = useCoreTranslation(),
766
+ t = _useCoreTranslation.t;
767
+ if (!(availableBaseLayers != null && availableBaseLayers.length)) {
768
+ return jsx("div", {
769
+ children: t('layermanager-baselayers-no-available')
770
+ });
771
+ }
772
+ var nonEmptyTooltipPrefix = tooltipPrefix != null ? tooltipPrefix : t('layermanager-layer') + ": ";
773
+ var selectedBaseLayerId = typeof selectedBaseLayers[0] !== 'undefined' ? selectedBaseLayers[0].id : '';
774
+ var list = availableBaseLayers.map(function (layer) {
775
+ return {
776
+ value: layer.id
777
+ };
778
+ });
779
+ var currentIndex = availableBaseLayers.findIndex(function (layer) {
780
+ return selectedBaseLayerId === layer.id;
781
+ });
782
+ return jsx(FormControl, {
783
+ style: {
784
+ width: '100%'
785
+ },
786
+ children: jsxs(TooltipSelect, {
787
+ IconComponent: icon,
788
+ currentIndex: currentIndex,
789
+ disableUnderline: true,
790
+ inputProps: {
791
+ SelectDisplayProps: {
792
+ 'data-testid': 'selectBaseLayer'
793
+ }
794
+ },
795
+ isEnabled: true,
796
+ list: list,
797
+ onChange: function onChange(event) {
798
+ onChangeBaseLayers(event.target.value);
799
+ },
800
+ onChangeMouseWheel: function onChangeMouseWheel(e) {
801
+ return onChangeBaseLayers(e.value);
802
+ },
803
+ style: {
804
+ maxWidth: '100%'
805
+ },
806
+ tooltip: "" + nonEmptyTooltipPrefix + ((_availableBaseLayers$ = availableBaseLayers[currentIndex]) == null ? void 0 : _availableBaseLayers$.name),
807
+ value: selectedBaseLayerId,
808
+ children: [jsx(MenuItem, {
809
+ disabled: true,
810
+ children: t('layermanager-baselayers-title')
811
+ }), availableBaseLayers.map(function (baseLayer) {
812
+ return jsx(MenuItem, {
813
+ value: baseLayer.id,
814
+ children: baseLayer.name
815
+ }, baseLayer.id);
816
+ })]
817
+ })
818
+ });
819
+ };
820
+
821
+ // Generate a layer id for an available baselayer to ensure same available baselayers have unique id's in case of multiple maps
822
+ // If already in selectedBaseLayers based on name or id, keep current id
823
+ var constructLayerId = function constructLayerId(baseLayer, selectedBaseLayers) {
824
+ var foundLayer = selectedBaseLayers.find(function (selectedBaseLayer) {
825
+ return (baseLayer == null ? void 0 : baseLayer.id) === (selectedBaseLayer == null ? void 0 : selectedBaseLayer.id) || baseLayer.name === selectedBaseLayer.name;
826
+ });
827
+ return foundLayer ? foundLayer.id : webmapUtils.generateLayerId();
828
+ };
829
+ var constructListAvailableBaseLayers = function constructListAvailableBaseLayers(selectedBaseLayers, preloadedAvailableBaseLayers, mapId) {
830
+ // Ensure we use unique id's for the base layers - excepting the ones that are currently selected, reuse the existing ids
831
+ // Add mapId of map these available base layers are added for
832
+ var baseLayersWithMapId = preloadedAvailableBaseLayers.map(function (baseLayer) {
833
+ var layerId = constructLayerId(baseLayer, selectedBaseLayers);
834
+ return Object.assign({}, baseLayer, {
835
+ mapId: mapId,
836
+ id: layerId
837
+ });
838
+ });
839
+ // Ensure that current selected baselayer(s) are in the baseLayersWithMapId array, otherwise add them
840
+ return selectedBaseLayers.reduce(function (list, selectedBaseLayer) {
841
+ var foundLayer = baseLayersWithMapId.find(function (layer) {
842
+ return layer.id === (selectedBaseLayer == null ? void 0 : selectedBaseLayer.id);
843
+ });
844
+ if (foundLayer) {
845
+ return list;
846
+ }
847
+ return list.concat(Object.assign({}, selectedBaseLayer, {
848
+ mapId: mapId
849
+ }));
850
+ }, baseLayersWithMapId);
851
+ };
852
+ var areAvailableBaseLayersSame = function areAvailableBaseLayersSame(availableBaseLayerList, newBaseLayerList) {
853
+ var availableList = availableBaseLayerList.map(function (layer) {
854
+ return layer.name;
855
+ });
856
+ var newList = newBaseLayerList.map(function (layer) {
857
+ return layer.name;
858
+ });
859
+ return isEqual(availableList, newList);
860
+ };
861
+ var BaseLayersConnect = function BaseLayersConnect(_ref) {
862
+ var mapId = _ref.mapId,
863
+ preloadedAvailableBaseLayers = _ref.preloadedAvailableBaseLayers,
864
+ tooltipPrefix = _ref.tooltipPrefix,
865
+ icon = _ref.icon;
866
+ var dispatch = useDispatch();
867
+ var selectedBaseLayers = useSelector(function (store) {
868
+ return mapSelectors.getMapBaseLayers(store, mapId);
869
+ });
870
+ var currentAvailableBaseLayers = useSelector(function (store) {
871
+ return layerSelectors.getAvailableBaseLayersForMap(store, mapId);
872
+ });
873
+ React.useEffect(function () {
874
+ var availableBaseLayersToBeAdded = constructListAvailableBaseLayers(selectedBaseLayers, preloadedAvailableBaseLayers, mapId);
875
+ var areBaseLayersSame = areAvailableBaseLayersSame(availableBaseLayersToBeAdded, currentAvailableBaseLayers);
876
+ if (!areBaseLayersSame) {
877
+ dispatch(layerActions.setAvailableBaseLayers({
878
+ layers: availableBaseLayersToBeAdded,
879
+ mapId: mapId
880
+ }));
881
+ }
882
+ // eslint-disable-next-line react-hooks/exhaustive-deps
883
+ }, [mapId, preloadedAvailableBaseLayers]);
884
+ var onChangeBaseLayers = function onChangeBaseLayers(newSelectedLayerId) {
885
+ var newBaseLayer = currentAvailableBaseLayers.filter(function (layer) {
886
+ return layer.id === newSelectedLayerId;
887
+ });
888
+ dispatch(layerActions.setBaseLayers({
889
+ mapId: mapId,
890
+ layers: newBaseLayer,
891
+ origin: layerTypes.LayerActionOrigin.layerManager
892
+ }));
893
+ };
894
+ return jsx(BaseLayers, {
895
+ availableBaseLayers: currentAvailableBaseLayers,
896
+ icon: icon,
897
+ onChangeBaseLayers: onChangeBaseLayers,
898
+ selectedBaseLayers: selectedBaseLayers,
899
+ tooltipPrefix: tooltipPrefix
900
+ });
901
+ };
902
+
711
903
  var preset = {
712
904
  presetType: "mapPreset",
713
905
  presetId: "mapPreset-1",
@@ -928,47 +1120,6 @@ var defaultConfigurations = /*#__PURE__*/Object.freeze({
928
1120
  preloadedDefaultMapServices: preloadedDefaultMapServices
929
1121
  });
930
1122
 
931
- /* *
932
- * Licensed under the Apache License, Version 2.0 (the "License");
933
- * you may not use this file except in compliance with the License.
934
- * You may obtain a copy of the License at
935
- *
936
- * http://www.apache.org/licenses/LICENSE-2.0
937
- *
938
- * Unless required by applicable law or agreed to in writing, software
939
- * distributed under the License is distributed on an "AS IS" BASIS,
940
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
941
- * See the License for the specific language governing permissions and
942
- * limitations under the License.
943
- *
944
- * Copyright 2023 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
945
- * Copyright 2023 - Finnish Meteorological Institute (FMI)
946
- * Copyright 2024 - The Norwegian Meteorological Institute (MET Norway)
947
- * */
948
- var CORE_NAMESPACE = 'core';
949
- var initCoreReactI18n = function initCoreReactI18n() {
950
- safelyInitI18nForTestsAndStories(i18n, CORE_NAMESPACE, [{
951
- ns: CORE_NAMESPACE,
952
- translations: coreTranslations
953
- }, {
954
- ns: WEBMAP_REACT_NAMESPACE,
955
- translations: webmapReactTranslations
956
- }, {
957
- ns: WEBMAP_NAMESPACE,
958
- translations: webmapTranslations
959
- }, {
960
- ns: SHARED_NAMESPACE,
961
- translations: sharedTranslations
962
- }, {
963
- ns: TIME_SLIDER_NAMESPACE,
964
- translations: timesliderTranslations
965
- }]);
966
- };
967
- var ns = [CORE_NAMESPACE, TIME_SLIDER_NAMESPACE];
968
- var useCoreTranslation = function useCoreTranslation() {
969
- return useTranslation(ns);
970
- };
971
-
972
1123
  var WMSLayerTreeHeader = function WMSLayerTreeHeader(_ref) {
973
1124
  var serviceName = _ref.serviceName,
974
1125
  onClickReload = _ref.onClickReload;
@@ -1612,6 +1763,7 @@ var HeaderOptions = function HeaderOptions(_ref) {
1612
1763
  var iconButtonSize = 30;
1613
1764
  var columnClasses = {
1614
1765
  column1: 'column-1',
1766
+ columnService: 'column-service',
1615
1767
  column2: 'column-2',
1616
1768
  column3: 'column-3',
1617
1769
  column4: 'column-4',
@@ -1627,9 +1779,10 @@ var DELETE_MORE_BUTTONS = 3;
1627
1779
  var MISSING = 4;
1628
1780
  var leftButtonsWidth = iconButtonSize * DRAG_VISIBILITY_LEADING_BUTTONS + MISSING;
1629
1781
  var rightButtonsWidth = iconButtonSize * DELETE_MORE_BUTTONS;
1782
+ var opacityWidth = 45;
1630
1783
  var acceptanceTimeWidth = 65;
1631
1784
  var loadDurationWidth = 50;
1632
- var nonFlexibleAreaWidth = leftButtonsWidth + rightButtonsWidth + acceptanceTimeWidth + loadDurationWidth;
1785
+ var nonFlexibleAreaWidth = leftButtonsWidth + rightButtonsWidth + opacityWidth + acceptanceTimeWidth + loadDurationWidth;
1633
1786
  var flexibleAreaWidth = "(100% - " + nonFlexibleAreaWidth + "px)";
1634
1787
  var leftButtonsStyle = {
1635
1788
  width: leftButtonsWidth,
@@ -1674,18 +1827,24 @@ var layerManagerStyle = {
1674
1827
  '.baseLayer': {
1675
1828
  width: "calc(" + flexibleAreaWidth + " * 0.25)"
1676
1829
  },
1830
+ // layerService
1831
+ '.column-service': Object.assign({
1832
+ width: "calc(" + flexibleAreaWidth + " * 0.20)"
1833
+ }, columnCollapseStyle),
1677
1834
  // layerName
1678
1835
  '.column-2': Object.assign({
1679
1836
  width: "calc(" + flexibleAreaWidth + " * 0.25)"
1680
1837
  }, columnCollapseStyle),
1681
1838
  // style
1682
1839
  '.column-3': Object.assign({
1683
- width: "calc(" + flexibleAreaWidth + " * 0.25)"
1840
+ width: "calc(" + flexibleAreaWidth + " * 0.20)"
1684
1841
  }, columnCollapseStyle),
1685
1842
  // opacity
1686
1843
  '.column-4': Object.assign({
1687
- width: "calc(" + flexibleAreaWidth + " * 0.15)"
1688
- }, columnCollapseStyle),
1844
+ width: opacityWidth
1845
+ }, columnCollapseStyle, {
1846
+ flexGrow: 0
1847
+ }),
1689
1848
  // dimensions
1690
1849
  '.column-5': Object.assign({
1691
1850
  width: "calc(" + flexibleAreaWidth + " * 0.35)"
@@ -1707,7 +1866,7 @@ var layerManagerStyle = {
1707
1866
  },
1708
1867
  // layer missing warning
1709
1868
  '.column-7': {
1710
- width: "calc(" + flexibleAreaWidth + " * 0.75 + " + acceptanceTimeWidth + "px + " + loadDurationWidth + "px)"
1869
+ width: "calc(" + flexibleAreaWidth + " * 0.65 + " + opacityWidth + "px + " + acceptanceTimeWidth + "px + " + loadDurationWidth + "px)"
1711
1870
  },
1712
1871
  // sizes: mini
1713
1872
  '.enable-btn-mini': {
@@ -1730,7 +1889,7 @@ var layerManagerStyle = {
1730
1889
  '.enable-btn-mini': {
1731
1890
  display: 'inline-flex'
1732
1891
  },
1733
- '.activateLayer-btn, .enable-btn, .column-2, .column-3, .column-4, .column-5, .column-6, .column-7, .column-acceptanceTime, .column-loadDuration': {
1892
+ '.activateLayer-btn, .enable-btn, .column-service, .column-2, .column-3, .column-4, .column-5, .column-6, .column-7, .column-acceptanceTime, .column-loadDuration': {
1734
1893
  display: 'none'
1735
1894
  },
1736
1895
  '.addLayer-column, .setProjection-column, .overlayers-column': {
@@ -1764,7 +1923,7 @@ var layerManagerStyle = {
1764
1923
  // sizes: medium
1765
1924
  '@container (max-width: 600px)': {
1766
1925
  '.layermanager': {
1767
- '.column-2, .column-3, .column-4, .column-5, .column-6, .column-7, .column-acceptanceTime, .column-loadDuration': {
1926
+ '.column-service, .column-2, .column-3, .column-4, .column-5, .column-6, .column-7, .column-acceptanceTime, .column-loadDuration': {
1768
1927
  display: 'none'
1769
1928
  },
1770
1929
  '.columnLayerName, .baseLayer': {
@@ -1794,173 +1953,28 @@ var layerManagerStyle = {
1794
1953
  '.column-1': {
1795
1954
  display: 'none'
1796
1955
  },
1797
- '.column-2': {
1798
- display: 'none'
1799
- }
1800
- },
1801
- '.header-layermanager': {
1802
- '.collapseMedium-btn': {
1803
- display: 'none'
1804
- }
1805
- }
1806
- }
1807
- };
1808
- var returnCorrectSize = function returnCorrectSize(sizeResult) {
1809
- if (sizeResult === 'sizeSmall') {
1810
- return sizeSmall;
1811
- }
1812
- if (sizeResult === 'sizeMedium') {
1813
- return sizeMedium;
1814
- }
1815
- if (sizeResult === 'sizeLarge') {
1816
- return sizeLarge;
1817
- }
1818
- return sizeSmall;
1819
- };
1820
-
1821
- var BaseLayers = function BaseLayers(_ref) {
1822
- var _availableBaseLayers$;
1823
- var selectedBaseLayers = _ref.selectedBaseLayers,
1824
- availableBaseLayers = _ref.availableBaseLayers,
1825
- onChangeBaseLayers = _ref.onChangeBaseLayers,
1826
- icon = _ref.icon,
1827
- tooltipPrefix = _ref.tooltipPrefix;
1828
- var _useCoreTranslation = useCoreTranslation(),
1829
- t = _useCoreTranslation.t;
1830
- if (!(availableBaseLayers != null && availableBaseLayers.length)) {
1831
- return jsx("div", {
1832
- children: t('layermanager-baselayers-no-available')
1833
- });
1834
- }
1835
- var nonEmptyTooltipPrefix = tooltipPrefix != null ? tooltipPrefix : t('layermanager-layer') + ": ";
1836
- var selectedBaseLayerId = typeof selectedBaseLayers[0] !== 'undefined' ? selectedBaseLayers[0].id : '';
1837
- var list = availableBaseLayers.map(function (layer) {
1838
- return {
1839
- value: layer.id
1840
- };
1841
- });
1842
- var currentIndex = availableBaseLayers.findIndex(function (layer) {
1843
- return selectedBaseLayerId === layer.id;
1844
- });
1845
- return jsx(FormControl, {
1846
- style: {
1847
- width: '100%'
1848
- },
1849
- children: jsxs(TooltipSelect, {
1850
- IconComponent: icon,
1851
- currentIndex: currentIndex,
1852
- disableUnderline: true,
1853
- inputProps: {
1854
- SelectDisplayProps: {
1855
- 'data-testid': 'selectBaseLayer'
1856
- }
1857
- },
1858
- isEnabled: true,
1859
- list: list,
1860
- onChange: function onChange(event) {
1861
- onChangeBaseLayers(event.target.value);
1862
- },
1863
- onChangeMouseWheel: function onChangeMouseWheel(e) {
1864
- return onChangeBaseLayers(e.value);
1865
- },
1866
- style: {
1867
- maxWidth: '100%'
1868
- },
1869
- tooltip: "" + nonEmptyTooltipPrefix + ((_availableBaseLayers$ = availableBaseLayers[currentIndex]) == null ? void 0 : _availableBaseLayers$.name),
1870
- value: selectedBaseLayerId,
1871
- children: [jsx(MenuItem, {
1872
- disabled: true,
1873
- children: t('layermanager-baselayers-title')
1874
- }), availableBaseLayers.map(function (baseLayer) {
1875
- return jsx(MenuItem, {
1876
- value: baseLayer.id,
1877
- children: baseLayer.name
1878
- }, baseLayer.id);
1879
- })]
1880
- })
1881
- });
1882
- };
1883
-
1884
- // Generate a layer id for an available baselayer to ensure same available baselayers have unique id's in case of multiple maps
1885
- // If already in selectedBaseLayers based on name or id, keep current id
1886
- var constructLayerId = function constructLayerId(baseLayer, selectedBaseLayers) {
1887
- var foundLayer = selectedBaseLayers.find(function (selectedBaseLayer) {
1888
- return (baseLayer == null ? void 0 : baseLayer.id) === (selectedBaseLayer == null ? void 0 : selectedBaseLayer.id) || baseLayer.name === selectedBaseLayer.name;
1889
- });
1890
- return foundLayer ? foundLayer.id : webmapUtils.generateLayerId();
1891
- };
1892
- var constructListAvailableBaseLayers = function constructListAvailableBaseLayers(selectedBaseLayers, preloadedAvailableBaseLayers, mapId) {
1893
- // Ensure we use unique id's for the base layers - excepting the ones that are currently selected, reuse the existing ids
1894
- // Add mapId of map these available base layers are added for
1895
- var baseLayersWithMapId = preloadedAvailableBaseLayers.map(function (baseLayer) {
1896
- var layerId = constructLayerId(baseLayer, selectedBaseLayers);
1897
- return Object.assign({}, baseLayer, {
1898
- mapId: mapId,
1899
- id: layerId
1900
- });
1901
- });
1902
- // Ensure that current selected baselayer(s) are in the baseLayersWithMapId array, otherwise add them
1903
- return selectedBaseLayers.reduce(function (list, selectedBaseLayer) {
1904
- var foundLayer = baseLayersWithMapId.find(function (layer) {
1905
- return layer.id === (selectedBaseLayer == null ? void 0 : selectedBaseLayer.id);
1906
- });
1907
- if (foundLayer) {
1908
- return list;
1956
+ '.column-2': {
1957
+ display: 'none'
1958
+ }
1959
+ },
1960
+ '.header-layermanager': {
1961
+ '.collapseMedium-btn': {
1962
+ display: 'none'
1963
+ }
1909
1964
  }
1910
- return list.concat(Object.assign({}, selectedBaseLayer, {
1911
- mapId: mapId
1912
- }));
1913
- }, baseLayersWithMapId);
1914
- };
1915
- var areAvailableBaseLayersSame = function areAvailableBaseLayersSame(availableBaseLayerList, newBaseLayerList) {
1916
- var availableList = availableBaseLayerList.map(function (layer) {
1917
- return layer.name;
1918
- });
1919
- var newList = newBaseLayerList.map(function (layer) {
1920
- return layer.name;
1921
- });
1922
- return isEqual(availableList, newList);
1965
+ }
1923
1966
  };
1924
- var BaseLayersConnect = function BaseLayersConnect(_ref) {
1925
- var mapId = _ref.mapId,
1926
- preloadedAvailableBaseLayers = _ref.preloadedAvailableBaseLayers,
1927
- tooltipPrefix = _ref.tooltipPrefix,
1928
- icon = _ref.icon;
1929
- var dispatch = useDispatch();
1930
- var selectedBaseLayers = useSelector(function (store) {
1931
- return mapSelectors.getMapBaseLayers(store, mapId);
1932
- });
1933
- var currentAvailableBaseLayers = useSelector(function (store) {
1934
- return layerSelectors.getAvailableBaseLayersForMap(store, mapId);
1935
- });
1936
- React.useEffect(function () {
1937
- var availableBaseLayersToBeAdded = constructListAvailableBaseLayers(selectedBaseLayers, preloadedAvailableBaseLayers, mapId);
1938
- var areBaseLayersSame = areAvailableBaseLayersSame(availableBaseLayersToBeAdded, currentAvailableBaseLayers);
1939
- if (!areBaseLayersSame) {
1940
- dispatch(layerActions.setAvailableBaseLayers({
1941
- layers: availableBaseLayersToBeAdded,
1942
- mapId: mapId
1943
- }));
1944
- }
1945
- // eslint-disable-next-line react-hooks/exhaustive-deps
1946
- }, [mapId, preloadedAvailableBaseLayers]);
1947
- var onChangeBaseLayers = function onChangeBaseLayers(newSelectedLayerId) {
1948
- var newBaseLayer = currentAvailableBaseLayers.filter(function (layer) {
1949
- return layer.id === newSelectedLayerId;
1950
- });
1951
- dispatch(layerActions.setBaseLayers({
1952
- mapId: mapId,
1953
- layers: newBaseLayer,
1954
- origin: layerTypes.LayerActionOrigin.layerManager
1955
- }));
1956
- };
1957
- return jsx(BaseLayers, {
1958
- availableBaseLayers: currentAvailableBaseLayers,
1959
- icon: icon,
1960
- onChangeBaseLayers: onChangeBaseLayers,
1961
- selectedBaseLayers: selectedBaseLayers,
1962
- tooltipPrefix: tooltipPrefix
1963
- });
1967
+ var returnCorrectSize = function returnCorrectSize(sizeResult) {
1968
+ if (sizeResult === 'sizeSmall') {
1969
+ return sizeSmall;
1970
+ }
1971
+ if (sizeResult === 'sizeMedium') {
1972
+ return sizeMedium;
1973
+ }
1974
+ if (sizeResult === 'sizeLarge') {
1975
+ return sizeLarge;
1976
+ }
1977
+ return sizeSmall;
1964
1978
  };
1965
1979
 
1966
1980
  var _excluded$6 = ["mapId", "preloadedAvailableBaseLayers", "preloadedServices", "tooltip", "settings"];
@@ -2105,7 +2119,7 @@ var styles$2 = {
2105
2119
  }
2106
2120
  };
2107
2121
  var DescriptionRow = function DescriptionRow(_ref2) {
2108
- var _settings$addLayer, _settings$addLayer2, _settings$layerName$t, _settings$layerName, _settings$layerName$t2, _settings$layerName2, _settings$layerStyle$, _settings$layerStyle, _settings$opacity$tit, _settings$opacity, _settings$dimensions$, _settings$dimensions, _settings$acceptanceT, _settings$acceptanceT2;
2122
+ var _settings$addLayer, _settings$addLayer2, _settings$layerName$t, _settings$layerName, _settings$layerServic, _settings$layerServic2, _settings$layerName$t2, _settings$layerName2, _settings$layerStyle$, _settings$layerStyle, _settings$opacity$tit, _settings$opacity, _settings$dimensions$, _settings$dimensions, _settings$acceptanceT, _settings$acceptanceT2;
2109
2123
  var settings = _ref2.settings,
2110
2124
  addLayerComponent = _ref2.addLayerComponent,
2111
2125
  _ref2$onToggleCollaps = _ref2.onToggleCollapsed,
@@ -2136,6 +2150,11 @@ var DescriptionRow = function DescriptionRow(_ref2) {
2136
2150
  sx: styles$2.text,
2137
2151
  children: (_settings$layerName$t = settings == null || (_settings$layerName = settings.layerName) == null ? void 0 : _settings$layerName.title) != null ? _settings$layerName$t : t('layermanager-layer')
2138
2152
  })
2153
+ }), jsx(RowItemCollapse$1, {
2154
+ className: columnClasses.columnService,
2155
+ collapsedColumns: collapsedColumns,
2156
+ onToggleCollapsed: onToggleCollapsed,
2157
+ title: (_settings$layerServic = settings == null || (_settings$layerServic2 = settings.layerService) == null ? void 0 : _settings$layerServic2.title) != null ? _settings$layerServic : t('layermanager-service')
2139
2158
  }), jsx(RowItemCollapse$1, {
2140
2159
  className: columnClasses.column2,
2141
2160
  collapsedColumns: collapsedColumns,
@@ -2248,6 +2267,12 @@ var AcceptanceTime = function AcceptanceTime(_ref) {
2248
2267
  }, {
2249
2268
  value: '10',
2250
2269
  text: '00:10'
2270
+ }, {
2271
+ value: '15',
2272
+ text: '00:15'
2273
+ }, {
2274
+ value: '20',
2275
+ text: '00:20'
2251
2276
  }, {
2252
2277
  value: '30',
2253
2278
  text: '00:30'
@@ -3181,6 +3206,30 @@ var EnableLayerConnect = function EnableLayerConnect(_ref) {
3181
3206
  });
3182
3207
  };
3183
3208
 
3209
+ var LayerService = function LayerService(_ref) {
3210
+ var serviceName = _ref.serviceName,
3211
+ _ref$isEnabled = _ref.isEnabled,
3212
+ isEnabled = _ref$isEnabled === void 0 ? true : _ref$isEnabled,
3213
+ tooltipPrefix = _ref.tooltipPrefix;
3214
+ var _useCoreTranslation = useCoreTranslation(),
3215
+ t = _useCoreTranslation.t;
3216
+ var nonEmptyTooltipPrefix = tooltipPrefix != null ? tooltipPrefix : t('layermanager-service') + ":";
3217
+ return jsx(Tooltip, {
3218
+ title: nonEmptyTooltipPrefix + " " + (serviceName === '' ? t('layermanager-sourcename-no-available') : serviceName),
3219
+ children: jsx(Typography, {
3220
+ sx: {
3221
+ fontSize: 12,
3222
+ fontWeight: 500,
3223
+ color: isEnabled ? 'geowebColors.layerManager.tableRowDefaultText.color' : 'geowebColors.layerManager.tableRowDisabledText.color',
3224
+ textOverflow: 'ellipsis',
3225
+ overflow: 'hidden',
3226
+ whiteSpace: 'nowrap'
3227
+ },
3228
+ children: serviceName === '' ? t('layermanager-sourcename-no-available') : serviceName
3229
+ })
3230
+ });
3231
+ };
3232
+
3184
3233
  /* *
3185
3234
  * Licensed under the Apache License, Version 2.0 (the "License");
3186
3235
  * you may not use this file except in compliance with the License.
@@ -3982,6 +4031,8 @@ var LayerRowUnstyled = function LayerRowUnstyled(_ref8) {
3982
4031
  var layerId = _ref8.layerId,
3983
4032
  layer = _ref8.layer,
3984
4033
  layerName = _ref8.layerName,
4034
+ _ref8$layerServiceNam = _ref8.layerServiceName,
4035
+ layerServiceName = _ref8$layerServiceNam === void 0 ? '' : _ref8$layerServiceNam,
3985
4036
  services = _ref8.services,
3986
4037
  mapId = _ref8.mapId,
3987
4038
  _ref8$isEDRLayer = _ref8.isEDRLayer,
@@ -4099,7 +4150,9 @@ var LayerRowUnstyled = function LayerRowUnstyled(_ref8) {
4099
4150
  style: layer.style
4100
4151
  }),
4101
4152
  isEDRLayer: isEDRLayer,
4102
- layerName: layerName
4153
+ isEnabled: isEnabled,
4154
+ layerName: layerName,
4155
+ layerServiceName: layerServiceName
4103
4156
  }), jsx(Grid, {
4104
4157
  alignItems: "center",
4105
4158
  className: columnClasses.column1,
@@ -4114,6 +4167,13 @@ var LayerRowUnstyled = function LayerRowUnstyled(_ref8) {
4114
4167
  onChangeActive: onClickRow,
4115
4168
  onChangeEnable: changeEnable
4116
4169
  })
4170
+ }), jsx(RowItemCollapse, {
4171
+ className: columnClasses.columnService,
4172
+ collapsedColumns: collapsedColumns,
4173
+ children: jsx(LayerService, {
4174
+ isEnabled: isEnabled,
4175
+ serviceName: layerServiceName
4176
+ })
4117
4177
  }), jsx(RowItemCollapse, {
4118
4178
  className: columnClasses.column2,
4119
4179
  collapsedColumns: collapsedColumns,
@@ -4225,7 +4285,9 @@ var Accordion = function Accordion(_ref0) {
4225
4285
  LeftButtons = _ref0.LeftButtons,
4226
4286
  LoadDuration = _ref0.LoadDuration,
4227
4287
  _ref0$isEDRLayer = _ref0.isEDRLayer,
4228
- isEDRLayer = _ref0$isEDRLayer === void 0 ? false : _ref0$isEDRLayer;
4288
+ isEDRLayer = _ref0$isEDRLayer === void 0 ? false : _ref0$isEDRLayer,
4289
+ layerServiceName = _ref0.layerServiceName,
4290
+ isEnabled = _ref0.isEnabled;
4229
4291
  var _useCoreTranslation3 = useCoreTranslation(),
4230
4292
  t = _useCoreTranslation3.t;
4231
4293
  var displayLayerName = isEDRLayer ? t('layermanager-EDR') + layerName : layerName;
@@ -4256,11 +4318,23 @@ var Accordion = function Accordion(_ref0) {
4256
4318
  }),
4257
4319
  children: jsxs(Grid, {
4258
4320
  container: true,
4259
- spacing: 3,
4321
+ spacing: 2,
4260
4322
  sx: {
4261
4323
  padding: '16px 32px'
4262
4324
  },
4263
4325
  children: [jsxs(Grid, {
4326
+ container: true,
4327
+ direction: "column",
4328
+ size: 12,
4329
+ children: [jsx(Grid, {
4330
+ children: t('layermanager-service')
4331
+ }), jsx(Grid, {
4332
+ children: jsx(LayerService, {
4333
+ isEnabled: isEnabled,
4334
+ serviceName: layerServiceName
4335
+ })
4336
+ })]
4337
+ }), jsxs(Grid, {
4264
4338
  container: true,
4265
4339
  children: [jsx(Grid, {
4266
4340
  children: t('layermanager-style-title')
@@ -4780,6 +4854,7 @@ var LayerInfoButtonConnect = function LayerInfoButtonConnect(_ref) {
4780
4854
  mapId = _ref.mapId,
4781
4855
  serviceUrl = _ref.serviceUrl,
4782
4856
  layerName = _ref.layerName,
4857
+ layerId = _ref.layerId,
4783
4858
  _ref$source = _ref.source,
4784
4859
  source = _ref$source === void 0 ? 'app' : _ref$source;
4785
4860
  var dispatch = useDispatch();
@@ -4789,6 +4864,9 @@ var LayerInfoButtonConnect = function LayerInfoButtonConnect(_ref) {
4789
4864
  var currentLayerInfo = useSelector(function (store) {
4790
4865
  return layerSelectors.getActiveLayerInfo(store);
4791
4866
  });
4867
+ var currentLayerStyle = useSelector(function (store) {
4868
+ return layerSelectors.getLayerStyle(store, layerId);
4869
+ });
4792
4870
  var isActive = layerName === (currentLayerInfo == null ? void 0 : currentLayerInfo.layerName) && serviceUrl === (currentLayerInfo == null ? void 0 : currentLayerInfo.serviceUrl) && isOpenInStore;
4793
4871
  var onClick = function onClick() {
4794
4872
  if (!isActive) {
@@ -4796,7 +4874,8 @@ var LayerInfoButtonConnect = function LayerInfoButtonConnect(_ref) {
4796
4874
  layerName: layerName,
4797
4875
  serviceUrl: serviceUrl,
4798
4876
  source: source,
4799
- mapId: mapId
4877
+ mapId: mapId,
4878
+ style: currentLayerStyle
4800
4879
  }));
4801
4880
  } else {
4802
4881
  dispatch(layerActions.hideLayerInfo());
@@ -4834,6 +4913,7 @@ var LayerInfoDialogConnect = function LayerInfoDialogConnect(_ref) {
4834
4913
  onClose: onCloseDialog,
4835
4914
  onMouseDown: setDialogOrder,
4836
4915
  order: dialogOrder,
4916
+ selectedStyle: layerInfo == null ? void 0 : layerInfo.style,
4837
4917
  serviceName: currentService == null ? void 0 : currentService.name,
4838
4918
  serviceUrl: currentService == null ? void 0 : currentService.serviceUrl,
4839
4919
  source: source
@@ -4863,6 +4943,9 @@ var LayerRowConnect = /*#__PURE__*/React.memo(function (_ref) {
4863
4943
  var layerDisplayName = useSelector(function (store) {
4864
4944
  return layerSelectors.getLayerDisplayName(store, layerId);
4865
4945
  });
4946
+ var layerServiceName = useSelector(function (store) {
4947
+ return layerSelectors.getLayerServiceName(store, layerId);
4948
+ });
4866
4949
  var layerType = useSelector(function (store) {
4867
4950
  return layerSelectors.getLayerType(store, layerId);
4868
4951
  });
@@ -4927,6 +5010,7 @@ var LayerRowConnect = /*#__PURE__*/React.memo(function (_ref) {
4927
5010
  mapId: mapId,
4928
5011
  tooltipPrefix: settings == null || (_settings$opacity = settings.opacity) == null ? void 0 : _settings$opacity.tooltipPrefix
4929
5012
  }),
5013
+ layerServiceName: layerServiceName,
4930
5014
  layerServicesLayout: settings != null && (_settings$renderLayer = settings.renderLayer) != null && _settings$renderLayer.Element ? jsx(settings.renderLayer.Element, {
4931
5015
  layerId: layerId,
4932
5016
  mapId: mapId
@@ -4939,6 +5023,7 @@ var LayerRowConnect = /*#__PURE__*/React.memo(function (_ref) {
4939
5023
  layerShowLayerInfoLayout: jsx(LayerInfoButtonConnect, {
4940
5024
  isFeatureLayer: isFeatureLayer,
4941
5025
  isLayerMissing: isLayerMissing,
5026
+ layerId: layerId,
4942
5027
  layerName: layerName,
4943
5028
  mapId: mapId,
4944
5029
  serviceUrl: layerServiceUrl
@@ -5483,6 +5568,10 @@ var styles$1 = {
5483
5568
  display: 'inline-block',
5484
5569
  padding: '0 6px'
5485
5570
  }};
5571
+ var minSize = {
5572
+ width: 100,
5573
+ height: 126
5574
+ };
5486
5575
  var getLayerManagerSizeValue = function getLayerManagerSizeValue(size) {
5487
5576
  if (!size.width || typeof size.width !== 'number') {
5488
5577
  return 'sizeLarge';
@@ -5517,8 +5606,19 @@ var LayerManager = function LayerManager(_ref) {
5517
5606
  isDockedLayerManager = _ref$isDockedLayerMan === void 0 ? false : _ref$isDockedLayerMan,
5518
5607
  _ref$onToggleDock = _ref.onToggleDock,
5519
5608
  onToggleDock = _ref$onToggleDock === void 0 ? function () {} : _ref$onToggleDock,
5609
+ _ref$onDockedLayerMan = _ref.onDockedLayerManagerDragEnd,
5610
+ onDockedLayerManagerDragEnd = _ref$onDockedLayerMan === void 0 ? function () {} : _ref$onDockedLayerMan,
5611
+ _ref$onDockedLayerMan2 = _ref.onDockedLayerManagerSizeChange,
5612
+ onDockedLayerManagerSizeChange = _ref$onDockedLayerMan2 === void 0 ? function () {} : _ref$onDockedLayerMan2,
5613
+ _ref$onDockedLayerMan3 = _ref.onDockedLayerManagerDimensionsChange,
5614
+ onDockedLayerManagerDimensionsChange = _ref$onDockedLayerMan3 === void 0 ? function () {} : _ref$onDockedLayerMan3,
5520
5615
  _ref$size = _ref.size,
5521
5616
  size = _ref$size === void 0 ? sizeLarge : _ref$size,
5617
+ _ref$startDraggablePo = _ref.startDraggablePosition,
5618
+ startDraggablePosition = _ref$startDraggablePo === void 0 ? {
5619
+ x: 0,
5620
+ y: 0
5621
+ } : _ref$startDraggablePo,
5522
5622
  _ref$startPosition = _ref.startPosition,
5523
5623
  startPosition = _ref$startPosition === void 0 ? {
5524
5624
  top: 85,
@@ -5532,10 +5632,6 @@ var LayerManager = function LayerManager(_ref) {
5532
5632
  defaultCollapsedColumns = _ref$defaultCollapsed === void 0 ? {} : _ref$defaultCollapsed;
5533
5633
  var _useCoreTranslation = useCoreTranslation(),
5534
5634
  t = _useCoreTranslation.t;
5535
- var minSize = {
5536
- width: 100,
5537
- height: 126
5538
- };
5539
5635
  var theme = useTheme();
5540
5636
  renderCounter.count(LayerManager.name);
5541
5637
  var nonEmptyTitle = title != null ? title : t('layermanager-title');
@@ -5544,10 +5640,63 @@ var LayerManager = function LayerManager(_ref) {
5544
5640
  sizeInState = _React$useState[0],
5545
5641
  setSizeInState = _React$useState[1];
5546
5642
  var dataSize = getLayerManagerSizeValue(sizeInState);
5643
+ var wasOpenRef = React.useRef(isOpen);
5644
+ React.useLayoutEffect(function () {
5645
+ var isOpening = isOpen && !wasOpenRef.current;
5646
+ if (isDockedLayerManager && isOpening) {
5647
+ setSizeInState(calculateStartSize(minSize, size, startPosition));
5648
+ }
5649
+ wasOpenRef.current = isOpen;
5650
+ }, [isDockedLayerManager, isOpen, size, startPosition]);
5547
5651
  var _React$useState2 = React.useState(defaultCollapsedColumns),
5548
5652
  collapsedColumns = _React$useState2[0],
5549
5653
  setCollapsedColumns = _React$useState2[1];
5550
5654
  var stopWheelEventPropagationRef = useWheelStopPropagation();
5655
+ var handleDragEnd = React.useCallback(function (_position, dragSize) {
5656
+ if (isDockedLayerManager) {
5657
+ onDockedLayerManagerDragEnd(_position);
5658
+ onDockedLayerManagerSizeChange(getLayerManagerSizeValue(dragSize));
5659
+ onDockedLayerManagerDimensionsChange({
5660
+ width: dragSize.width,
5661
+ height: dragSize.height
5662
+ });
5663
+ }
5664
+ if (dragSize !== sizeInState) {
5665
+ setSizeInState(dragSize);
5666
+ }
5667
+ }, [isDockedLayerManager, onDockedLayerManagerDimensionsChange, onDockedLayerManagerDragEnd, onDockedLayerManagerSizeChange, sizeInState]);
5668
+ var handleResizeStop = React.useCallback(function (_event, _direction, node) {
5669
+ var width = node.offsetWidth,
5670
+ height = node.offsetHeight;
5671
+ setSizeInState({
5672
+ width: width,
5673
+ height: height
5674
+ });
5675
+ if (isDockedLayerManager) {
5676
+ onDockedLayerManagerSizeChange(getLayerManagerSizeValue({
5677
+ width: width}));
5678
+ onDockedLayerManagerDimensionsChange({
5679
+ width: width,
5680
+ height: height
5681
+ });
5682
+ }
5683
+ }, [isDockedLayerManager, onDockedLayerManagerDimensionsChange, onDockedLayerManagerSizeChange]);
5684
+ var handleChangeSize = React.useCallback(function (_ref2) {
5685
+ var width = _ref2.width;
5686
+ setSizeInState(function (prevSizeInState) {
5687
+ var nextSizeInState = Object.assign({}, prevSizeInState, {
5688
+ width: width
5689
+ });
5690
+ if (isDockedLayerManager) {
5691
+ onDockedLayerManagerSizeChange(getLayerManagerSizeValue(Object.assign({}, nextSizeInState)));
5692
+ onDockedLayerManagerDimensionsChange({
5693
+ width: width,
5694
+ height: nextSizeInState.height
5695
+ });
5696
+ }
5697
+ return nextSizeInState;
5698
+ });
5699
+ }, [isDockedLayerManager, onDockedLayerManagerDimensionsChange, onDockedLayerManagerSizeChange]);
5551
5700
  return jsx(ToolContainerDraggable, {
5552
5701
  bounds: bounds,
5553
5702
  className: "layermanager",
@@ -5560,34 +5709,20 @@ var LayerManager = function LayerManager(_ref) {
5560
5709
  minHeight: minSize.height,
5561
5710
  minWidth: minSize.width,
5562
5711
  onClose: onClose,
5563
- onDragEnd: function onDragEnd(_position, dragSize) {
5564
- if (dragSize !== sizeInState) {
5565
- setSizeInState(dragSize);
5566
- }
5567
- },
5712
+ onDragEnd: handleDragEnd,
5568
5713
  onMouseDown: onMouseDown,
5569
- onResizeStop: function onResizeStop(_event, _direction, node) {
5570
- var width = node.offsetWidth,
5571
- height = node.offsetHeight;
5572
- setSizeInState({
5573
- width: width,
5574
- height: height
5575
- });
5576
- },
5714
+ onResizeStop: handleResizeStop,
5577
5715
  order: order,
5716
+ resetPositionOnOpen: isDockedLayerManager,
5578
5717
  rightHeaderComponent: jsx(HeaderOptionsConnect, {
5579
5718
  buttonSettings: settings == null || (_settings$toolbar3 = settings.toolbar) == null ? void 0 : _settings$toolbar3.controlButtonSettings,
5580
5719
  isDockedLayerManager: isDockedLayerManager,
5581
5720
  mapId: mapId,
5582
- onChangeSize: function onChangeSize(_ref2) {
5583
- var width = _ref2.width;
5584
- setSizeInState(Object.assign({}, sizeInState, {
5585
- width: width
5586
- }));
5587
- },
5721
+ onChangeSize: handleChangeSize,
5588
5722
  onClickDockButton: onToggleDock
5589
5723
  }),
5590
5724
  source: source,
5725
+ startDraggablePosition: startDraggablePosition,
5591
5726
  startPosition: startPosition,
5592
5727
  startSize: sizeInState,
5593
5728
  sx: Object.assign({}, layerManagerStyle, theme.palette.geowebColors.layerManager.root),
@@ -5771,6 +5906,12 @@ var LayerManagerConnect = function LayerManagerConnect(_ref) {
5771
5906
  var dockedLayerManagerSize = useSelector(function (store) {
5772
5907
  return mapSelectors.getDockedLayerManagerSize(store, mapId);
5773
5908
  });
5909
+ var dockedLayerManagerPosition = useSelector(function (store) {
5910
+ return mapSelectors.getDockedLayerManagerPosition(store, mapId);
5911
+ });
5912
+ var dockedLayerManagerDimensions = useSelector(function (store) {
5913
+ return mapSelectors.getDockedLayerManagerDimensions(store, mapId);
5914
+ });
5774
5915
  var _useSetupDialog = useSetupDialog(dialogType, source),
5775
5916
  dialogOrder = _useSetupDialog.dialogOrder,
5776
5917
  setDialogOrder = _useSetupDialog.setDialogOrder,
@@ -5789,13 +5930,16 @@ var LayerManagerConnect = function LayerManagerConnect(_ref) {
5789
5930
  type: uiTypes.DialogTypes.LayerManager,
5790
5931
  mapId: mapId,
5791
5932
  setOpen: true,
5792
- source: source
5933
+ source: source,
5934
+ origin: mapEnums.MapActionOrigin.map
5793
5935
  }));
5794
5936
  } else {
5795
5937
  // Close the floating layer manager and open docked layer manager
5796
5938
  dispatch(uiActions.setToggleOpenDialog({
5797
5939
  type: uiTypes.DialogTypes.DockedLayerManager + "-" + mapId,
5798
- setOpen: true
5940
+ setOpen: true,
5941
+ mapId: mapId,
5942
+ origin: mapEnums.MapActionOrigin.map
5799
5943
  }));
5800
5944
  }
5801
5945
  }, [dispatch, isDocked, mapId, onCloseDialog, source]);
@@ -5816,13 +5960,50 @@ var LayerManagerConnect = function LayerManagerConnect(_ref) {
5816
5960
  isOpen: isDialogOpen,
5817
5961
  mapId: mapId || initialMapId,
5818
5962
  onClose: onCloseDialog,
5963
+ onDockedLayerManagerDimensionsChange: function onDockedLayerManagerDimensionsChange(dimensions) {
5964
+ if (!isDocked) {
5965
+ return;
5966
+ }
5967
+ dispatch(mapActions.setDockedLayerManagerDimensions({
5968
+ mapId: mapId,
5969
+ dockedLayerManagerDimensions: dimensions,
5970
+ origin: mapEnums.MapActionOrigin.map
5971
+ }));
5972
+ },
5973
+ onDockedLayerManagerDragEnd: function onDockedLayerManagerDragEnd(position) {
5974
+ if (!isDocked) {
5975
+ return;
5976
+ }
5977
+ dispatch(mapActions.setDockedLayerManagerPosition({
5978
+ mapId: mapId,
5979
+ dockedLayerManagerPosition: {
5980
+ x: position.x,
5981
+ y: position.y
5982
+ },
5983
+ origin: mapEnums.MapActionOrigin.map
5984
+ }));
5985
+ },
5986
+ onDockedLayerManagerSizeChange: function onDockedLayerManagerSizeChange(size) {
5987
+ if (!isDocked) {
5988
+ return;
5989
+ }
5990
+ dispatch(mapActions.setDockedLayerManagerSize({
5991
+ mapId: mapId,
5992
+ dockedLayerManagerSize: size,
5993
+ origin: mapEnums.MapActionOrigin.map
5994
+ }));
5995
+ },
5819
5996
  onMouseDown: setDialogOrder,
5820
5997
  onToggleDock: onToggleDock,
5821
5998
  order: dialogOrder,
5822
5999
  preloadedAvailableBaseLayers: preloadedAvailableBaseLayers,
5823
6000
  preloadedBaseServices: preloadedBaseServices,
5824
- size: isDocked ? returnCorrectSize(dockedLayerManagerSize) : sizeLarge,
6001
+ size: isDocked ? dockedLayerManagerDimensions || returnCorrectSize(dockedLayerManagerSize) : sizeLarge,
5825
6002
  source: uiSource,
6003
+ startDraggablePosition: isDocked ? dockedLayerManagerPosition : {
6004
+ x: 0,
6005
+ y: 0
6006
+ },
5826
6007
  startPosition: isDocked ? {
5827
6008
  top: 60,
5828
6009
  right: 16
@@ -5835,7 +6016,7 @@ var LayerManagerConnect = function LayerManagerConnect(_ref) {
5835
6016
  source: uiSource
5836
6017
  }), !isDocked && jsx(LayerSelectConnect, {})]
5837
6018
  });
5838
- }, [bounds, dialogOrder, dockedLayerManagerSize, initialMapId, isDialogOpen, isDocked, isMultiMap, mapId, onCloseDialog, onToggleDock, preloadedAvailableBaseLayers, preloadedBaseServices, setDialogOrder, showMapIdInTitle, nonEmptyTitle, uiError, uiIsLoading, uiSource]);
6019
+ }, [bounds, dialogOrder, dispatch, dockedLayerManagerPosition, dockedLayerManagerDimensions, dockedLayerManagerSize, initialMapId, isDialogOpen, isDocked, isMultiMap, mapId, onCloseDialog, onToggleDock, preloadedAvailableBaseLayers, preloadedBaseServices, setDialogOrder, showMapIdInTitle, nonEmptyTitle, uiError, uiIsLoading, uiSource]);
5839
6020
  };
5840
6021
 
5841
6022
  var LayerManagerMapButtonConnect = function LayerManagerMapButtonConnect(_ref) {
@@ -6086,6 +6267,12 @@ var ClockConnect = function ClockConnect(_ref) {
6086
6267
  var isMapClockVisible = useSelector(function (store) {
6087
6268
  return mapSelectors.getIsClockVisible(store, mapId);
6088
6269
  });
6270
+ var clockPosition = useSelector(function (store) {
6271
+ return mapSelectors.getClockPosition(store, mapId);
6272
+ });
6273
+ var clockSize = useSelector(function (store) {
6274
+ return mapSelectors.getClockSize(store, mapId);
6275
+ });
6089
6276
  var onToggleClock = function onToggleClock(isClockVisible) {
6090
6277
  dispatch(mapActions.toggleClock({
6091
6278
  mapId: mapId,
@@ -6093,9 +6280,27 @@ var ClockConnect = function ClockConnect(_ref) {
6093
6280
  origin: mapEnums.MapActionOrigin.map
6094
6281
  }));
6095
6282
  };
6283
+ var onSetPosition = function onSetPosition(position) {
6284
+ dispatch(mapActions.setClockPositionSize({
6285
+ mapId: mapId,
6286
+ position: position,
6287
+ origin: mapEnums.MapActionOrigin.map
6288
+ }));
6289
+ };
6290
+ var onSetSize = function onSetSize(size) {
6291
+ dispatch(mapActions.setClockPositionSize({
6292
+ mapId: mapId,
6293
+ size: size,
6294
+ origin: mapEnums.MapActionOrigin.map
6295
+ }));
6296
+ };
6096
6297
  return jsx(Clock, {
6097
6298
  isVisible: isMapClockVisible,
6299
+ onSetPosition: onSetPosition,
6300
+ onSetSize: onSetSize,
6098
6301
  onToggleClock: onToggleClock,
6302
+ position: clockPosition,
6303
+ size: clockSize,
6099
6304
  time: selectedTime
6100
6305
  });
6101
6306
  };
@@ -6929,16 +7134,34 @@ var OpenLayersFeatureLayerConnect = function OpenLayersFeatureLayerConnect(_ref)
6929
7134
  hoverSelect = _ref.hoverSelect;
6930
7135
  var store = useStore();
6931
7136
  var dispatch = useDispatch();
7137
+ var activeDrawToolId = useSelector(drawingToolSelectors.getActiveDrawToolId);
7138
+ var activeDrawMode = useSelector(function (store) {
7139
+ return drawingToolSelectors.getActiveDrawMode(store, activeDrawToolId);
7140
+ });
7141
+ var shouldAllowMultipleShapes = useSelector(function (store) {
7142
+ return drawingToolSelectors.getShouldAllowMultipleShapes(store, activeDrawToolId);
7143
+ });
7144
+ var geoJSONIntersectionLayerId = useSelector(function (store) {
7145
+ return drawingToolSelectors.getGeoJSONIntersectionLayerId(store, activeDrawToolId);
7146
+ });
7147
+ var geoJSONIntersectionBoundsLayerId = useSelector(function (store) {
7148
+ return drawingToolSelectors.getGeoJSONIntersectionBoundsLayerId(store, activeDrawToolId);
7149
+ });
6932
7150
  var onFeatureClick = React.useCallback(function (feature) {
6933
7151
  var previouslySelectedFeatureIndex = layer.selectedFeatureIndex;
6934
7152
  var selectedFeatureIndex = layer.geojson.features.findIndex(function (feat) {
6935
7153
  return feature[0] && feat.id === feature[0].getId();
6936
7154
  });
6937
- if (selectedFeatureIndex !== -1 && selectedFeatureIndex !== previouslySelectedFeatureIndex) {
7155
+ if (selectedFeatureIndex !== -1) {
6938
7156
  dispatch(layerActions.setSelectedFeature({
6939
7157
  layerId: layerId,
6940
7158
  selectedFeatureIndex: selectedFeatureIndex
6941
7159
  }));
7160
+ dispatch(layerActions.toggleFeatureMode({
7161
+ layerId: layerId,
7162
+ isInEditMode: true,
7163
+ drawMode: ''
7164
+ }));
6942
7165
  dispatch(layerActions.updateFeatureProperties({
6943
7166
  layerId: layerId,
6944
7167
  properties: {
@@ -6957,23 +7180,39 @@ var OpenLayersFeatureLayerConnect = function OpenLayersFeatureLayerConnect(_ref)
6957
7180
  }
6958
7181
  }
6959
7182
  }, [dispatch, layer.geojson, layer.selectedFeatureIndex, layerId]);
7183
+ var onNoFeatureClick = React.useCallback(function () {
7184
+ if (activeDrawToolId) {
7185
+ // do not disable edit mode when a drawing tool is active
7186
+ return;
7187
+ }
7188
+ dispatch(layerActions.toggleFeatureMode({
7189
+ layerId: layerId,
7190
+ isInEditMode: false,
7191
+ drawMode: ''
7192
+ }));
7193
+ }, [activeDrawToolId, dispatch, layerId]);
7194
+ var onViewOnlyFeatureClick = React.useCallback(function (feature) {
7195
+ if (activeDrawToolId) {
7196
+ // do not select another feature when a drawing tool is active
7197
+ return;
7198
+ }
7199
+ onFeatureClick(feature);
7200
+ }, [activeDrawToolId, onFeatureClick]);
6960
7201
  var updateFeature = React.useCallback(function (geojson, reason) {
6961
7202
  if (!layerId) {
6962
7203
  window.console.error('updateFeature without layerId');
6963
7204
  return;
6964
7205
  }
6965
- var activeDrawToolId = drawingToolSelectors.getActiveDrawToolId(store.getState());
6966
- var activeDrawMode = drawingToolSelectors.getActiveDrawMode(store.getState(), activeDrawToolId);
6967
7206
  dispatch(layerActions.updateFeature({
6968
7207
  geojson: geojson,
6969
7208
  reason: reason,
6970
7209
  layerId: layerId,
6971
- shouldAllowMultipleShapes: drawingToolSelectors.getShouldAllowMultipleShapes(store.getState(), activeDrawToolId),
6972
- geoJSONIntersectionLayerId: drawingToolSelectors.getGeoJSONIntersectionLayerId(store.getState(), activeDrawToolId),
6973
- geoJSONIntersectionBoundsLayerId: drawingToolSelectors.getGeoJSONIntersectionBoundsLayerId(store.getState(), activeDrawToolId),
7210
+ shouldAllowMultipleShapes: shouldAllowMultipleShapes,
7211
+ geoJSONIntersectionLayerId: geoJSONIntersectionLayerId,
7212
+ geoJSONIntersectionBoundsLayerId: geoJSONIntersectionBoundsLayerId,
6974
7213
  selectionType: activeDrawMode == null ? void 0 : activeDrawMode.selectionType
6975
7214
  }));
6976
- }, [dispatch, store, layerId]);
7215
+ }, [layerId, dispatch, shouldAllowMultipleShapes, geoJSONIntersectionLayerId, geoJSONIntersectionBoundsLayerId, activeDrawMode == null ? void 0 : activeDrawMode.selectionType]);
6977
7216
  var exitFeatureDrawMode = React.useCallback(function (reason) {
6978
7217
  if (!layerId) {
6979
7218
  window.console.error('exitFeatureDrawMode without layerId');
@@ -7003,6 +7242,8 @@ var OpenLayersFeatureLayerConnect = function OpenLayersFeatureLayerConnect(_ref)
7003
7242
  exitDrawModeCallback: exitFeatureDrawMode,
7004
7243
  geojson: layer.geojson,
7005
7244
  isInEditMode: layer.isInEditMode || false,
7245
+ onNoFeatureClick: onNoFeatureClick,
7246
+ onViewOnlyFeatureClick: onViewOnlyFeatureClick,
7006
7247
  selectedFeatureIndex: layer.selectedFeatureIndex || 0,
7007
7248
  updateGeojson: updateFeature,
7008
7249
  viewOnlyStyle: style
@@ -7185,6 +7426,15 @@ function useFitAndHighlightWarningFeature(_ref) {
7185
7426
  }
7186
7427
  }, [view, warningDialogFeatures, srs, dispatch, mapId]);
7187
7428
  }
7429
+ /** Compare value with current time and if difference is more than factor times timeStep returns true */
7430
+ var getIsOutdated = function getIsOutdated(compareValue, timeStep, factor) {
7431
+ var currentDate = dateUtils.utc();
7432
+ var diff = dateUtils.differenceInMinutes(currentDate, dateUtils.createDate(compareValue));
7433
+ if (diff > timeStep * factor) {
7434
+ return true;
7435
+ }
7436
+ return false;
7437
+ };
7188
7438
 
7189
7439
  var OlMapViewLayerConnect = function OlMapViewLayerConnect(layerProps) {
7190
7440
  var layerId = layerProps.layerId,
@@ -7819,7 +8069,7 @@ var MapOptionsButtonConnect = function MapOptionsButtonConnect(_ref) {
7819
8069
  * @param {object} [controls.zoomControls] **optional** controls: object - toggle the map controls, zoomControls defaults to true
7820
8070
  */
7821
8071
  var OlMapViewConnect = function OlMapViewConnect(_ref) {
7822
- var _useSelector2, _featureProperties$va;
8072
+ var _useSelector2, _useSelector3, _featureProperties$va;
7823
8073
  var mapId = _ref.mapId,
7824
8074
  children = _ref.children,
7825
8075
  _ref$controls = _ref.controls,
@@ -7921,7 +8171,21 @@ var OlMapViewConnect = function OlMapViewConnect(_ref) {
7921
8171
  var isAnimating = (_useSelector2 = useSelector(function (store) {
7922
8172
  return mapSelectors.linkedMapAnimationInfo(store, mapId);
7923
8173
  })) == null ? void 0 : _useSelector2.isAnimating;
8174
+ var autoUpdateLayerId = useSelector(function (store) {
8175
+ return mapSelectors.getAutoUpdateLayerId(store, mapId);
8176
+ });
8177
+ var shouldAutoUpdate = useSelector(function (store) {
8178
+ return mapSelectors.isAutoUpdating(store, mapId);
8179
+ });
8180
+ var autoUpdateLayerMaxValue = (_useSelector3 = useSelector(function (store) {
8181
+ return layerSelectors.getLayerTimeDimension(store, autoUpdateLayerId);
8182
+ })) == null ? void 0 : _useSelector3.maxValue;
8183
+ var autoUpdateTimeStep = useSelector(function (store) {
8184
+ return layerSelectors.getTimeStepForLayerId(store, autoUpdateLayerId);
8185
+ });
7924
8186
  var dispatch = useDispatch();
8187
+ var _useCoreTranslation = useCoreTranslation(),
8188
+ t = _useCoreTranslation.t;
7925
8189
  var updateLayerInformation = React.useCallback(function (payload) {
7926
8190
  var _payload$layerDimensi, _payload$layerDimensi2;
7927
8191
  var updatedPayLoad = Object.assign({}, payload, {
@@ -8122,6 +8386,28 @@ var OlMapViewConnect = function OlMapViewConnect(_ref) {
8122
8386
  // eslint-disable-next-line react-hooks/exhaustive-deps
8123
8387
  }, [mapId, updateLayerInformation, layerIds]);
8124
8388
  useSetIntervalWhenVisible(refetchLayers, 60000);
8389
+ /** Check if the autoUpdate layer has outdated data and inform the user by setting the map error */
8390
+ var checkIfDataOutdated = React.useCallback(function () {
8391
+ if (!shouldAutoUpdate || !autoUpdateLayerId || !autoUpdateLayerMaxValue || !autoUpdateTimeStep) {
8392
+ dispatch(mapActions.setMapPresetError({
8393
+ mapId: mapId,
8394
+ error: undefined
8395
+ }));
8396
+ return;
8397
+ }
8398
+ // check that the difference is more than 4 timesteps with the current time
8399
+ var isOutdated = getIsOutdated(autoUpdateLayerMaxValue, autoUpdateTimeStep, 4);
8400
+ dispatch(mapActions.setMapPresetError({
8401
+ mapId: mapId,
8402
+ error: isOutdated ? t('data-outdated') : undefined
8403
+ }));
8404
+ }, [autoUpdateLayerId, autoUpdateLayerMaxValue, autoUpdateTimeStep, dispatch, mapId, shouldAutoUpdate, t]);
8405
+ // Check every minute if data is outdated
8406
+ useSetIntervalWhenVisible(checkIfDataOutdated, 60000);
8407
+ // Recheck if data is outdated if the function is updated
8408
+ React.useEffect(function () {
8409
+ checkIfDataOutdated();
8410
+ }, [checkIfDataOutdated]);
8125
8411
  useMapViewLoadingIndicator(mapId, mapLayerIds);
8126
8412
  var _React$useState2 = React.useState({
8127
8413
  debugMode: false
@@ -9040,8 +9326,15 @@ var TimeSliderConnect = function TimeSliderConnect(_ref) {
9040
9326
  var _React$useState = React.useState(selectedTime),
9041
9327
  unfilteredSelectedTime = _React$useState[0],
9042
9328
  setUnfilteredSelectedTime = _React$useState[1];
9329
+ // Store unfilteredSelectedTime in a ref for callbacks
9330
+ var unfilteredSelectedTimeRef = React.useRef(unfilteredSelectedTime);
9331
+ React.useEffect(function () {
9332
+ unfilteredSelectedTimeRef.current = unfilteredSelectedTime;
9333
+ }, [unfilteredSelectedTime]);
9043
9334
  // Reference to the last time value set by this timeslider
9044
9335
  var lastTimeValueAsSetByThisTimeSlider = React.useRef();
9336
+ // Track the last selectedTime we processed to avoid unnecessary updates
9337
+ var lastProcessedSelectedTime = React.useRef(selectedTime);
9045
9338
  // Set new time in the redux state
9046
9339
  var _onSetNewDate = React.useCallback(function (newDate) {
9047
9340
  // Remember that this timeslider has set this time
@@ -9061,22 +9354,59 @@ var TimeSliderConnect = function TimeSliderConnect(_ref) {
9061
9354
  }, [dispatch, isAnimating, mapId, sourceId]);
9062
9355
  // Update local state when time is updated outside of this component, e.g. during animation or syncgroups
9063
9356
  React.useEffect(function () {
9357
+ // Only update if selectedTime has actually changed (not just timeStep)
9358
+ if (lastProcessedSelectedTime.current === selectedTime) {
9359
+ return;
9360
+ }
9064
9361
  var selectedTimeAsIsoString = timeToIso(selectedTime);
9065
- if (selectedTimeAsIsoString !== lastTimeValueAsSetByThisTimeSlider.current) {
9362
+ // Check if this is our own update bouncing back
9363
+ var isOurOwnUpdate = selectedTimeAsIsoString === lastTimeValueAsSetByThisTimeSlider.current;
9364
+ if (isOurOwnUpdate) {
9365
+ // Our update was processed, clear the flag and update tracking
9366
+ lastTimeValueAsSetByThisTimeSlider.current = undefined;
9367
+ lastProcessedSelectedTime.current = selectedTime;
9368
+ } else {
9369
+ // Time changed from outside this component (e.g., backward/forward buttons, animation)
9370
+ // Cancel any pending debounced updates and sync local state
9371
+ onsetNewDateDebounced.cancel();
9372
+ lastProcessedSelectedTime.current = selectedTime;
9066
9373
  setUnfilteredSelectedTime(selectedTime);
9374
+ // Clear the flag so we don't block future external updates to this same time
9375
+ lastTimeValueAsSetByThisTimeSlider.current = undefined;
9067
9376
  }
9068
9377
  }, [selectedTime]);
9378
+ // Store timeStep in a ref so we can use the latest value without causing re-renders
9379
+ var timeStepRef = React.useRef(timeStep);
9380
+ var prevTimeStepRef = React.useRef(timeStep);
9381
+ React.useEffect(function () {
9382
+ var timeStepChanged = prevTimeStepRef.current !== timeStep;
9383
+ prevTimeStepRef.current = timeStep;
9384
+ timeStepRef.current = timeStep;
9385
+ // When timestep changes, apply smart rounding to current time
9386
+ // For large timesteps (>12h), round to nearest hour instead of timestep
9387
+ if (timeStepChanged) {
9388
+ var roundingStep = timeStep > 12 * 60 ? 60 : timeStep;
9389
+ var snappedTime = getFilteredTime(unfilteredSelectedTime, roundingStep, dataStartTime, dataEndTime);
9390
+ if (snappedTime !== unfilteredSelectedTime) {
9391
+ setUnfilteredSelectedTime(snappedTime);
9392
+ onsetNewDateDebounced(timeToIso(snappedTime), _onSetNewDate);
9393
+ }
9394
+ }
9395
+ }, [timeStep, unfilteredSelectedTime, dataStartTime, dataEndTime, _onSetNewDate]);
9069
9396
  // Function used by timeslider components to update the unfiltered selected time
9070
9397
  var setUnfilteredSelectedTimeFn = React.useCallback(function (unfilteredSelectedTimeFromComponents) {
9071
- var makeFilteredSelectedTime = function makeFilteredSelectedTime(timeValue) {
9072
- return getFilteredTime(timeValue, timeStep, dataStartTime, dataEndTime);
9073
- };
9074
- setUnfilteredSelectedTime(unfilteredSelectedTimeFromComponents);
9075
- var filteredIsoTime = makeFilteredSelectedTime(unfilteredSelectedTimeFromComponents);
9076
- if (selectedTime !== filteredIsoTime) {
9077
- onsetNewDateDebounced(timeToIso(filteredIsoTime), _onSetNewDate);
9398
+ // Only update if the value has actually changed
9399
+ if (unfilteredSelectedTimeFromComponents === unfilteredSelectedTimeRef.current) {
9400
+ return;
9078
9401
  }
9079
- }, [dataEndTime, dataStartTime, _onSetNewDate, selectedTime, timeStep]);
9402
+ // Snap to nearest timestep when clicking/dragging on timeslider
9403
+ // For timesteps >= 1 hour, snap to nearest hour
9404
+ // For smaller timesteps, snap to the timestep itself (e.g., 5min, 10min, 15min)
9405
+ var roundingStep = timeStepRef.current >= 60 ? 60 : timeStepRef.current;
9406
+ var timeToSet = getFilteredTime(unfilteredSelectedTimeFromComponents, roundingStep, dataStartTime, dataEndTime);
9407
+ setUnfilteredSelectedTime(timeToSet);
9408
+ onsetNewDateDebounced(timeToIso(timeToSet), _onSetNewDate);
9409
+ }, [dataEndTime, dataStartTime, _onSetNewDate]);
9080
9410
  // Move animation bar when user changes time using time picker
9081
9411
  // Animation bar however cannot be moved into a time where there is no data
9082
9412
  var moveAnimationUsingCalendar = function moveAnimationUsingCalendar(newTime) {
@@ -9099,8 +9429,13 @@ var TimeSliderConnect = function TimeSliderConnect(_ref) {
9099
9429
  }));
9100
9430
  };
9101
9431
  var onCalendarSelect = function onCalendarSelect(newSelectedTime) {
9102
- setUnfilteredSelectedTimeFn(newSelectedTime);
9103
- moveAnimationUsingCalendar(newSelectedTime);
9432
+ // When user explicitly sets time via calendar, snap to nearest available timestep
9433
+ // For large timesteps (>12h), round to nearest hour instead of timestep
9434
+ var roundingStep = timeStep > 12 * 60 ? 60 : timeStep;
9435
+ var snappedTime = getFilteredTime(newSelectedTime, roundingStep, dataStartTime, dataEndTime);
9436
+ setUnfilteredSelectedTime(snappedTime);
9437
+ onsetNewDateDebounced(timeToIso(snappedTime), _onSetNewDate);
9438
+ moveAnimationUsingCalendar(snappedTime);
9104
9439
  };
9105
9440
  var secondsPerPx = useSelector(function (store) {
9106
9441
  return mapSelectors.getMapTimeSliderSecondsPerPx(store, mapId);
@@ -9116,10 +9451,15 @@ var TimeSliderConnect = function TimeSliderConnect(_ref) {
9116
9451
  var event = _ref2.event,
9117
9452
  deltaY = _ref2.deltaY;
9118
9453
  if (!(event.ctrlKey || event.metaKey || event.shiftKey || event.altKey)) {
9119
- var pixelsPerScroll = -deltaY * timeStep / (2 * secondsPerPx);
9120
- moveSelectedTimePx(pixelsPerScroll, timeSliderWidth, centerTime, dataStartTime, dataEndTime, secondsPerPx, timeStep, unfilteredSelectedTime, setUnfilteredSelectedTimeFn);
9454
+ if (deltaY === 0) {
9455
+ return;
9456
+ }
9457
+ // timeStepRef.current is in minutes, convert to seconds
9458
+ var timeStepInSeconds = timeStepRef.current * 60;
9459
+ var pixelsPerScroll = -deltaY / Math.abs(deltaY) * (timeStepInSeconds / secondsPerPx);
9460
+ moveSelectedTimePx(pixelsPerScroll, timeSliderWidth, centerTime, dataStartTime, dataEndTime, secondsPerPx, timeStepRef.current, unfilteredSelectedTimeRef.current, setUnfilteredSelectedTimeFn);
9121
9461
  }
9122
- }, [timeSliderWidth, centerTime, dataEndTime, dataStartTime, secondsPerPx, setUnfilteredSelectedTimeFn, timeStep, unfilteredSelectedTime]);
9462
+ }, [timeSliderWidth, centerTime, dataEndTime, dataStartTime, secondsPerPx, setUnfilteredSelectedTimeFn]);
9123
9463
  React.useEffect(function () {
9124
9464
  if (isTimeScrollingEnabled && mapWindowRef != null && mapWindowRef.current) {
9125
9465
  var handleWheel = function handleWheel(event) {
@@ -9328,7 +9668,9 @@ var ConfigurableMapConnect = function ConfigurableMapConnect(_ref) {
9328
9668
  mapId: mapId,
9329
9669
  layer: {
9330
9670
  geojson: emptyGeoJSON,
9331
- layerType: LayerType.featureLayer
9671
+ layerType: LayerType.featureLayer,
9672
+ isSelectable: false,
9673
+ isInEditMode: false
9332
9674
  },
9333
9675
  layerId: getSingularDrawtoolDrawLayerId(mapId),
9334
9676
  origin: 'ConfigurableMapConnect'
@@ -10501,7 +10843,7 @@ var SelectedFeature = function SelectedFeature(_ref) {
10501
10843
  return Math.abs(lat) + "\xB0 " + latHemisphere + ", " + Math.abs(lon) + "\xB0 " + lonHemisphere;
10502
10844
  };
10503
10845
  var formattedCoordinates = useMemo(function () {
10504
- if (feature && feature.geometry.type === 'Point') {
10846
+ if ((feature == null ? void 0 : feature.geometry.type) === 'Point') {
10505
10847
  var latitude = feature.geometry.coordinates[1];
10506
10848
  var longitude = feature.geometry.coordinates[0];
10507
10849
  return getFormattedCoordinates(latitude, longitude);
@@ -11035,4 +11377,4 @@ var storyUtils = /*#__PURE__*/Object.freeze({
11035
11377
  useDefaultMapSettings: useDefaultMapSettings
11036
11378
  });
11037
11379
 
11038
- export { CORE_NAMESPACE, ConfigurableMapConnect, CoreI18nProvider, CoreStoreProvider, CoreThemeProvider, CoreThemeStoreProvider, DemoWrapper, DemoWrapperConnect, HarmonieTempAndPrecipPreset, LanguageSelect, LayerInfoButtonConnect, LayerInfoDialogConnect, LayerManager, BaseLayerRow as LayerManagerBaseLayerRow, LayerManagerConnect, DescriptionRow as LayerManagerDescriptionRow, HeaderOptions as LayerManagerHeaderOptions, LayerContainerRow as LayerManagerLayerContainerRow, LayerManagerMapButtonConnect, LegendConnect, LegendMapButtonConnect, LoadingIndicatorProgressBar, LocationSearch, LocationSearchConnect, MultiDimensionSelectMapButtonsConnect, MultiMapMultiDimensionSelectConnect as MultiMapDimensionSelectConnect, MultiMapViewConnect, MyMapLocation, OlMapViewConnect, RouterWrapperConnect, SearchControlButtonConnect, SelectedFeaturesDialogConnect, SyncGroupViewerConnect, TimeSliderConnect, componentsLookUp, coreTranslations, defaultBbox, defaultConfigurations, fakeLocationDetailList, fakeLocationList, filterMapPresets, filterServices, filterTimeSeriesServices, getCenterOfLinkedFeature, getLanguageFromLocalStorage, languageLocalStorageKey, locationApiEndpoints, makeLayerInfoPayload, makePrefetchTimeSpan, saveLanguageToLocalStorage, storyUtils, testLayers, useFetchServices, useFitAndHighlightWarningFeature, useGetOpenLayersView, useLocationDetail, useLocationList, usePrefetchTimeSpan, useUpdateTimeSpan, useUpdateTimestep };
11380
+ export { CORE_NAMESPACE, ConfigurableMapConnect, CoreI18nProvider, CoreStoreProvider, CoreThemeProvider, CoreThemeStoreProvider, DemoWrapper, DemoWrapperConnect, HarmonieTempAndPrecipPreset, LanguageSelect, LayerInfoButtonConnect, LayerInfoDialogConnect, LayerManager, BaseLayerRow as LayerManagerBaseLayerRow, LayerManagerConnect, DescriptionRow as LayerManagerDescriptionRow, HeaderOptions as LayerManagerHeaderOptions, LayerContainerRow as LayerManagerLayerContainerRow, LayerManagerMapButtonConnect, LegendConnect, LegendMapButtonConnect, LoadingIndicatorProgressBar, LocationSearch, LocationSearchConnect, MultiDimensionSelectMapButtonsConnect, MultiMapMultiDimensionSelectConnect as MultiMapDimensionSelectConnect, MultiMapViewConnect, MyMapLocation, OlMapViewConnect, RouterWrapperConnect, SearchControlButtonConnect, SelectedFeaturesDialogConnect, SyncGroupViewerConnect, TimeSliderConnect, componentsLookUp, coreTranslations, defaultBbox, defaultConfigurations, fakeLocationDetailList, fakeLocationList, filterMapPresets, filterServices, filterTimeSeriesServices, getCenterOfLinkedFeature, getIsOutdated, getLanguageFromLocalStorage, languageLocalStorageKey, locationApiEndpoints, makeLayerInfoPayload, makePrefetchTimeSpan, saveLanguageToLocalStorage, storyUtils, testLayers, useFetchServices, useFitAndHighlightWarningFeature, useGetOpenLayersView, useLocationDetail, useLocationList, usePrefetchTimeSpan, useUpdateTimeSpan, useUpdateTimestep };