@opengeoweb/core 15.0.0 → 15.2.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 (22) hide show
  1. package/index.esm.js +403 -302
  2. package/package.json +10 -11
  3. package/src/lib/components/ComponentsLookUp/componentsLookUp.d.ts +8 -2
  4. package/src/lib/components/LayerInfoConnect/LayerInfoButtonConnect.d.ts +1 -0
  5. package/src/lib/components/MapViewConnect/MapViewConnect.DisplayClock.stories.d.ts +8 -0
  6. package/src/lib/components/MapViewConnect/olMapUtils.d.ts +2 -0
  7. package/src/lib/index.d.ts +0 -1
  8. package/src/lib/utils/defaultTestSettings.d.ts +3 -1
  9. package/src/lib/components/SentryRecordButton/SentryRecordButton.d.ts +0 -3
  10. package/src/lib/components/SentryRecordButton/SentryRecordButton.spec.d.ts +0 -1
  11. package/src/lib/components/SentryRecordButton/index.d.ts +0 -1
  12. package/src/lib/components/WMSLoader/WMSLoader.d.ts +0 -11
  13. package/src/lib/components/WMSLoader/WMSLoader.spec.d.ts +0 -1
  14. package/src/lib/components/WMSLoader/WMSLoader.stories.d.ts +0 -12
  15. package/src/lib/components/WMSLoader/WMSLoaderConnect.d.ts +0 -21
  16. /package/src/lib/components/{WMSLoader → LayerManager/AddLayersPopup}/WMSLayerTree/WMSLayerTree.d.ts +0 -0
  17. /package/src/lib/components/{WMSLoader → LayerManager/AddLayersPopup}/WMSLayerTree/WMSLayerTree.spec.d.ts +0 -0
  18. /package/src/lib/components/{WMSLoader → LayerManager/AddLayersPopup}/WMSLayerTree/WMSLayerTreeConnect.d.ts +0 -0
  19. /package/src/lib/components/{WMSLoader → LayerManager/AddLayersPopup}/WMSLayerTree/WMSLayerTreeConnect.spec.d.ts +0 -0
  20. /package/src/lib/components/{WMSLoader → LayerManager/AddLayersPopup}/WMSLayerTree/WMSLayerTreeHeader.d.ts +0 -0
  21. /package/src/lib/components/{WMSLoader → LayerManager/AddLayersPopup}/WMSServerList/WMSServerList.d.ts +0 -0
  22. /package/src/lib/components/{WMSLoader → LayerManager/AddLayersPopup}/WMSServerList/WMSServerList.spec.d.ts +0 -0
package/index.esm.js CHANGED
@@ -1,19 +1,19 @@
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, ErrorBoundary } 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
- import { Box as Box$1, Stack, styled as styled$1 } from '@mui/system';
16
+ import { Box as Box$1, Stack } from '@mui/system';
17
17
  import { LayerSelectButtonConnect, LayerSelectConnect, DataExplorerButtonConnect } from '@opengeoweb/layer-select';
18
18
  import { unByKey } from 'ol/Observable';
19
19
  import { useQuery, QueryClient, QueryClientProvider } from '@tanstack/react-query';
@@ -28,7 +28,6 @@ import { ImageWMS } from 'ol/source';
28
28
  import DOMPurify from 'dompurify';
29
29
  import { snackbarTypes, snackbarActions, SnackbarWrapperConnect } from '@opengeoweb/snackbar';
30
30
  import { useNavigate } from 'react-router-dom';
31
- import { getReplay } from '@sentry/react';
32
31
  import { http, HttpResponse, passthrough } from 'msw';
33
32
  import Button$1 from '@mui/material/Button';
34
33
  import ButtonGroup from '@mui/material/ButtonGroup';
@@ -104,8 +103,6 @@ var en = {
104
103
  "syncgroups-add-group": "Add new group to list",
105
104
  "syncgroups-remove-group": "Remove group from list",
106
105
  "actions-close": "Close",
107
- "sentry-start-recording": "Start Recording",
108
- "sentry-stop-recording": "Stop Recording",
109
106
  "layermanager-acceptance-time-within": "Layer: within the data acceptance window",
110
107
  "layermanager-acceptance-time-outside": "Layer: out of date",
111
108
  "layermanager-acceptance-time-updated": "Layer: updated",
@@ -131,7 +128,8 @@ var en = {
131
128
  "delete-dialog-cancel": "Cancel",
132
129
  "delete-dialog-confirm": "Delete",
133
130
  "map-options-button": "Location or Measuring tool",
134
- "map-measure-tool": "Measuring tool"
131
+ "map-measure-tool": "Measuring tool",
132
+ "data-outdated": "Outdated data"
135
133
  };
136
134
  var fi = {
137
135
  feature_info_title: "Napsauta karttaa nähdäksesi lisätietoja.",
@@ -198,8 +196,6 @@ var fi = {
198
196
  "syncgroups-add-group": "Lisää uusi ryhmä listaan",
199
197
  "syncgroups-remove-group": "Poista ryhmä listasta",
200
198
  "actions-close": "Sulje",
201
- "sentry-start-recording": "Aloita tallennus",
202
- "sentry-stop-recording": "Pysäytä tallennus",
203
199
  "layermanager-acceptance-time-within": "Karttataso: on tietojen hyväksymisrajojen sisäpuolella",
204
200
  "layermanager-acceptance-time-outside": "Karttataso: on vanhentunut",
205
201
  "layermanager-acceptance-time-updated": "Karttataso: on päivitetty",
@@ -285,8 +281,6 @@ var no = {
285
281
  "syncgroups-add-group": "Legg til ny gruppe til listen",
286
282
  "syncgroups-remove-group": "Fjern gruppen fra listen",
287
283
  "actions-close": "Lukk",
288
- "sentry-start-recording": "Start opptak",
289
- "sentry-stop-recording": "Stopp opptak",
290
284
  "layermanager-acceptance-time-within": "Lag: innenfor akseptabelt tidsvundu",
291
285
  "layermanager-acceptance-time-outside": "Lag: utenfor akseptabelt tidsvundu",
292
286
  "layermanager-acceptance-time-updated": "Lag: oppdatert",
@@ -372,8 +366,6 @@ var nl = {
372
366
  "syncgroups-add-group": "Groep toevoegen",
373
367
  "syncgroups-remove-group": "Groep verwijderen",
374
368
  "actions-close": "Sluiten",
375
- "sentry-start-recording": "Start opname",
376
- "sentry-stop-recording": "Stop opname",
377
369
  "layermanager-acceptance-time-within": "Laag: binnen de data acceptatie norm",
378
370
  "layermanager-acceptance-time-outside": "Laag: verouderd",
379
371
  "layermanager-acceptance-time-updated": "Laag: bijgewerkt",
@@ -398,7 +390,8 @@ var nl = {
398
390
  "delete-dialog-cancel": "Annuleren",
399
391
  "delete-dialog-confirm": "Verwijderen",
400
392
  "map-options-button": "Locatie informatie en Meten",
401
- "map-measure-tool": "Meten"
393
+ "map-measure-tool": "Meten",
394
+ "data-outdated": "Data is niet actueel"
402
395
  };
403
396
  var coreTranslations = {
404
397
  en: en,
@@ -717,6 +710,192 @@ function _regeneratorRuntime() {
717
710
  })();
718
711
  }
719
712
 
713
+ /* *
714
+ * Licensed under the Apache License, Version 2.0 (the "License");
715
+ * you may not use this file except in compliance with the License.
716
+ * You may obtain a copy of the License at
717
+ *
718
+ * http://www.apache.org/licenses/LICENSE-2.0
719
+ *
720
+ * Unless required by applicable law or agreed to in writing, software
721
+ * distributed under the License is distributed on an "AS IS" BASIS,
722
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
723
+ * See the License for the specific language governing permissions and
724
+ * limitations under the License.
725
+ *
726
+ * Copyright 2023 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
727
+ * Copyright 2023 - Finnish Meteorological Institute (FMI)
728
+ * Copyright 2024 - The Norwegian Meteorological Institute (MET Norway)
729
+ * */
730
+ var CORE_NAMESPACE = 'core';
731
+ var initCoreReactI18n = function initCoreReactI18n() {
732
+ safelyInitI18nForTestsAndStories(i18n, CORE_NAMESPACE, [{
733
+ ns: CORE_NAMESPACE,
734
+ translations: coreTranslations
735
+ }, {
736
+ ns: WEBMAP_REACT_NAMESPACE,
737
+ translations: webmapReactTranslations
738
+ }, {
739
+ ns: WEBMAP_NAMESPACE,
740
+ translations: webmapTranslations
741
+ }, {
742
+ ns: SHARED_NAMESPACE,
743
+ translations: sharedTranslations
744
+ }, {
745
+ ns: TIME_SLIDER_NAMESPACE,
746
+ translations: timesliderTranslations
747
+ }]);
748
+ };
749
+ var ns = [CORE_NAMESPACE, TIME_SLIDER_NAMESPACE];
750
+ var useCoreTranslation = function useCoreTranslation() {
751
+ return useTranslation(ns);
752
+ };
753
+
754
+ var BaseLayers = function BaseLayers(_ref) {
755
+ var _availableBaseLayers$;
756
+ var selectedBaseLayers = _ref.selectedBaseLayers,
757
+ availableBaseLayers = _ref.availableBaseLayers,
758
+ onChangeBaseLayers = _ref.onChangeBaseLayers,
759
+ icon = _ref.icon,
760
+ tooltipPrefix = _ref.tooltipPrefix;
761
+ var _useCoreTranslation = useCoreTranslation(),
762
+ t = _useCoreTranslation.t;
763
+ if (!(availableBaseLayers != null && availableBaseLayers.length)) {
764
+ return jsx("div", {
765
+ children: t('layermanager-baselayers-no-available')
766
+ });
767
+ }
768
+ var nonEmptyTooltipPrefix = tooltipPrefix != null ? tooltipPrefix : t('layermanager-layer') + ": ";
769
+ var selectedBaseLayerId = typeof selectedBaseLayers[0] !== 'undefined' ? selectedBaseLayers[0].id : '';
770
+ var list = availableBaseLayers.map(function (layer) {
771
+ return {
772
+ value: layer.id
773
+ };
774
+ });
775
+ var currentIndex = availableBaseLayers.findIndex(function (layer) {
776
+ return selectedBaseLayerId === layer.id;
777
+ });
778
+ return jsx(FormControl, {
779
+ style: {
780
+ width: '100%'
781
+ },
782
+ children: jsxs(TooltipSelect, {
783
+ IconComponent: icon,
784
+ currentIndex: currentIndex,
785
+ disableUnderline: true,
786
+ inputProps: {
787
+ SelectDisplayProps: {
788
+ 'data-testid': 'selectBaseLayer'
789
+ }
790
+ },
791
+ isEnabled: true,
792
+ list: list,
793
+ onChange: function onChange(event) {
794
+ onChangeBaseLayers(event.target.value);
795
+ },
796
+ onChangeMouseWheel: function onChangeMouseWheel(e) {
797
+ return onChangeBaseLayers(e.value);
798
+ },
799
+ style: {
800
+ maxWidth: '100%'
801
+ },
802
+ tooltip: "" + nonEmptyTooltipPrefix + ((_availableBaseLayers$ = availableBaseLayers[currentIndex]) == null ? void 0 : _availableBaseLayers$.name),
803
+ value: selectedBaseLayerId,
804
+ children: [jsx(MenuItem, {
805
+ disabled: true,
806
+ children: t('layermanager-baselayers-title')
807
+ }), availableBaseLayers.map(function (baseLayer) {
808
+ return jsx(MenuItem, {
809
+ value: baseLayer.id,
810
+ children: baseLayer.name
811
+ }, baseLayer.id);
812
+ })]
813
+ })
814
+ });
815
+ };
816
+
817
+ // Generate a layer id for an available baselayer to ensure same available baselayers have unique id's in case of multiple maps
818
+ // If already in selectedBaseLayers based on name or id, keep current id
819
+ var constructLayerId = function constructLayerId(baseLayer, selectedBaseLayers) {
820
+ var foundLayer = selectedBaseLayers.find(function (selectedBaseLayer) {
821
+ return (baseLayer == null ? void 0 : baseLayer.id) === (selectedBaseLayer == null ? void 0 : selectedBaseLayer.id) || baseLayer.name === selectedBaseLayer.name;
822
+ });
823
+ return foundLayer ? foundLayer.id : webmapUtils.generateLayerId();
824
+ };
825
+ var constructListAvailableBaseLayers = function constructListAvailableBaseLayers(selectedBaseLayers, preloadedAvailableBaseLayers, mapId) {
826
+ // Ensure we use unique id's for the base layers - excepting the ones that are currently selected, reuse the existing ids
827
+ // Add mapId of map these available base layers are added for
828
+ var baseLayersWithMapId = preloadedAvailableBaseLayers.map(function (baseLayer) {
829
+ var layerId = constructLayerId(baseLayer, selectedBaseLayers);
830
+ return Object.assign({}, baseLayer, {
831
+ mapId: mapId,
832
+ id: layerId
833
+ });
834
+ });
835
+ // Ensure that current selected baselayer(s) are in the baseLayersWithMapId array, otherwise add them
836
+ return selectedBaseLayers.reduce(function (list, selectedBaseLayer) {
837
+ var foundLayer = baseLayersWithMapId.find(function (layer) {
838
+ return layer.id === (selectedBaseLayer == null ? void 0 : selectedBaseLayer.id);
839
+ });
840
+ if (foundLayer) {
841
+ return list;
842
+ }
843
+ return list.concat(Object.assign({}, selectedBaseLayer, {
844
+ mapId: mapId
845
+ }));
846
+ }, baseLayersWithMapId);
847
+ };
848
+ var areAvailableBaseLayersSame = function areAvailableBaseLayersSame(availableBaseLayerList, newBaseLayerList) {
849
+ var availableList = availableBaseLayerList.map(function (layer) {
850
+ return layer.name;
851
+ });
852
+ var newList = newBaseLayerList.map(function (layer) {
853
+ return layer.name;
854
+ });
855
+ return isEqual(availableList, newList);
856
+ };
857
+ var BaseLayersConnect = function BaseLayersConnect(_ref) {
858
+ var mapId = _ref.mapId,
859
+ preloadedAvailableBaseLayers = _ref.preloadedAvailableBaseLayers,
860
+ tooltipPrefix = _ref.tooltipPrefix,
861
+ icon = _ref.icon;
862
+ var dispatch = useDispatch();
863
+ var selectedBaseLayers = useSelector(function (store) {
864
+ return mapSelectors.getMapBaseLayers(store, mapId);
865
+ });
866
+ var currentAvailableBaseLayers = useSelector(function (store) {
867
+ return layerSelectors.getAvailableBaseLayersForMap(store, mapId);
868
+ });
869
+ React.useEffect(function () {
870
+ var availableBaseLayersToBeAdded = constructListAvailableBaseLayers(selectedBaseLayers, preloadedAvailableBaseLayers, mapId);
871
+ var areBaseLayersSame = areAvailableBaseLayersSame(availableBaseLayersToBeAdded, currentAvailableBaseLayers);
872
+ if (!areBaseLayersSame) {
873
+ dispatch(layerActions.setAvailableBaseLayers({
874
+ layers: availableBaseLayersToBeAdded,
875
+ mapId: mapId
876
+ }));
877
+ }
878
+ // eslint-disable-next-line react-hooks/exhaustive-deps
879
+ }, [mapId, preloadedAvailableBaseLayers]);
880
+ var onChangeBaseLayers = function onChangeBaseLayers(newSelectedLayerId) {
881
+ var newBaseLayer = currentAvailableBaseLayers.filter(function (layer) {
882
+ return layer.id === newSelectedLayerId;
883
+ });
884
+ dispatch(layerActions.setBaseLayers({
885
+ mapId: mapId,
886
+ layers: newBaseLayer,
887
+ origin: layerTypes.LayerActionOrigin.layerManager
888
+ }));
889
+ };
890
+ return jsx(BaseLayers, {
891
+ availableBaseLayers: currentAvailableBaseLayers,
892
+ icon: icon,
893
+ onChangeBaseLayers: onChangeBaseLayers,
894
+ selectedBaseLayers: selectedBaseLayers,
895
+ tooltipPrefix: tooltipPrefix
896
+ });
897
+ };
898
+
720
899
  var preset = {
721
900
  presetType: "mapPreset",
722
901
  presetId: "mapPreset-1",
@@ -937,47 +1116,6 @@ var defaultConfigurations = /*#__PURE__*/Object.freeze({
937
1116
  preloadedDefaultMapServices: preloadedDefaultMapServices
938
1117
  });
939
1118
 
940
- /* *
941
- * Licensed under the Apache License, Version 2.0 (the "License");
942
- * you may not use this file except in compliance with the License.
943
- * You may obtain a copy of the License at
944
- *
945
- * http://www.apache.org/licenses/LICENSE-2.0
946
- *
947
- * Unless required by applicable law or agreed to in writing, software
948
- * distributed under the License is distributed on an "AS IS" BASIS,
949
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
950
- * See the License for the specific language governing permissions and
951
- * limitations under the License.
952
- *
953
- * Copyright 2023 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
954
- * Copyright 2023 - Finnish Meteorological Institute (FMI)
955
- * Copyright 2024 - The Norwegian Meteorological Institute (MET Norway)
956
- * */
957
- var CORE_NAMESPACE = 'core';
958
- var initCoreReactI18n = function initCoreReactI18n() {
959
- safelyInitI18nForTestsAndStories(i18n, CORE_NAMESPACE, [{
960
- ns: CORE_NAMESPACE,
961
- translations: coreTranslations
962
- }, {
963
- ns: WEBMAP_REACT_NAMESPACE,
964
- translations: webmapReactTranslations
965
- }, {
966
- ns: WEBMAP_NAMESPACE,
967
- translations: webmapTranslations
968
- }, {
969
- ns: SHARED_NAMESPACE,
970
- translations: sharedTranslations
971
- }, {
972
- ns: TIME_SLIDER_NAMESPACE,
973
- translations: timesliderTranslations
974
- }]);
975
- };
976
- var ns = [CORE_NAMESPACE, TIME_SLIDER_NAMESPACE];
977
- var useCoreTranslation = function useCoreTranslation() {
978
- return useTranslation(ns);
979
- };
980
-
981
1119
  var WMSLayerTreeHeader = function WMSLayerTreeHeader(_ref) {
982
1120
  var serviceName = _ref.serviceName,
983
1121
  onClickReload = _ref.onClickReload;
@@ -1827,151 +1965,6 @@ var returnCorrectSize = function returnCorrectSize(sizeResult) {
1827
1965
  return sizeSmall;
1828
1966
  };
1829
1967
 
1830
- var BaseLayers = function BaseLayers(_ref) {
1831
- var _availableBaseLayers$;
1832
- var selectedBaseLayers = _ref.selectedBaseLayers,
1833
- availableBaseLayers = _ref.availableBaseLayers,
1834
- onChangeBaseLayers = _ref.onChangeBaseLayers,
1835
- icon = _ref.icon,
1836
- tooltipPrefix = _ref.tooltipPrefix;
1837
- var _useCoreTranslation = useCoreTranslation(),
1838
- t = _useCoreTranslation.t;
1839
- if (!(availableBaseLayers != null && availableBaseLayers.length)) {
1840
- return jsx("div", {
1841
- children: t('layermanager-baselayers-no-available')
1842
- });
1843
- }
1844
- var nonEmptyTooltipPrefix = tooltipPrefix != null ? tooltipPrefix : t('layermanager-layer') + ": ";
1845
- var selectedBaseLayerId = typeof selectedBaseLayers[0] !== 'undefined' ? selectedBaseLayers[0].id : '';
1846
- var list = availableBaseLayers.map(function (layer) {
1847
- return {
1848
- value: layer.id
1849
- };
1850
- });
1851
- var currentIndex = availableBaseLayers.findIndex(function (layer) {
1852
- return selectedBaseLayerId === layer.id;
1853
- });
1854
- return jsx(FormControl, {
1855
- style: {
1856
- width: '100%'
1857
- },
1858
- children: jsxs(TooltipSelect, {
1859
- IconComponent: icon,
1860
- currentIndex: currentIndex,
1861
- disableUnderline: true,
1862
- inputProps: {
1863
- SelectDisplayProps: {
1864
- 'data-testid': 'selectBaseLayer'
1865
- }
1866
- },
1867
- isEnabled: true,
1868
- list: list,
1869
- onChange: function onChange(event) {
1870
- onChangeBaseLayers(event.target.value);
1871
- },
1872
- onChangeMouseWheel: function onChangeMouseWheel(e) {
1873
- return onChangeBaseLayers(e.value);
1874
- },
1875
- style: {
1876
- maxWidth: '100%'
1877
- },
1878
- tooltip: "" + nonEmptyTooltipPrefix + ((_availableBaseLayers$ = availableBaseLayers[currentIndex]) == null ? void 0 : _availableBaseLayers$.name),
1879
- value: selectedBaseLayerId,
1880
- children: [jsx(MenuItem, {
1881
- disabled: true,
1882
- children: t('layermanager-baselayers-title')
1883
- }), availableBaseLayers.map(function (baseLayer) {
1884
- return jsx(MenuItem, {
1885
- value: baseLayer.id,
1886
- children: baseLayer.name
1887
- }, baseLayer.id);
1888
- })]
1889
- })
1890
- });
1891
- };
1892
-
1893
- // Generate a layer id for an available baselayer to ensure same available baselayers have unique id's in case of multiple maps
1894
- // If already in selectedBaseLayers based on name or id, keep current id
1895
- var constructLayerId = function constructLayerId(baseLayer, selectedBaseLayers) {
1896
- var foundLayer = selectedBaseLayers.find(function (selectedBaseLayer) {
1897
- return (baseLayer == null ? void 0 : baseLayer.id) === (selectedBaseLayer == null ? void 0 : selectedBaseLayer.id) || baseLayer.name === selectedBaseLayer.name;
1898
- });
1899
- return foundLayer ? foundLayer.id : webmapUtils.generateLayerId();
1900
- };
1901
- var constructListAvailableBaseLayers = function constructListAvailableBaseLayers(selectedBaseLayers, preloadedAvailableBaseLayers, mapId) {
1902
- // Ensure we use unique id's for the base layers - excepting the ones that are currently selected, reuse the existing ids
1903
- // Add mapId of map these available base layers are added for
1904
- var baseLayersWithMapId = preloadedAvailableBaseLayers.map(function (baseLayer) {
1905
- var layerId = constructLayerId(baseLayer, selectedBaseLayers);
1906
- return Object.assign({}, baseLayer, {
1907
- mapId: mapId,
1908
- id: layerId
1909
- });
1910
- });
1911
- // Ensure that current selected baselayer(s) are in the baseLayersWithMapId array, otherwise add them
1912
- return selectedBaseLayers.reduce(function (list, selectedBaseLayer) {
1913
- var foundLayer = baseLayersWithMapId.find(function (layer) {
1914
- return layer.id === (selectedBaseLayer == null ? void 0 : selectedBaseLayer.id);
1915
- });
1916
- if (foundLayer) {
1917
- return list;
1918
- }
1919
- return list.concat(Object.assign({}, selectedBaseLayer, {
1920
- mapId: mapId
1921
- }));
1922
- }, baseLayersWithMapId);
1923
- };
1924
- var areAvailableBaseLayersSame = function areAvailableBaseLayersSame(availableBaseLayerList, newBaseLayerList) {
1925
- var availableList = availableBaseLayerList.map(function (layer) {
1926
- return layer.name;
1927
- });
1928
- var newList = newBaseLayerList.map(function (layer) {
1929
- return layer.name;
1930
- });
1931
- return isEqual(availableList, newList);
1932
- };
1933
- var BaseLayersConnect = function BaseLayersConnect(_ref) {
1934
- var mapId = _ref.mapId,
1935
- preloadedAvailableBaseLayers = _ref.preloadedAvailableBaseLayers,
1936
- tooltipPrefix = _ref.tooltipPrefix,
1937
- icon = _ref.icon;
1938
- var dispatch = useDispatch();
1939
- var selectedBaseLayers = useSelector(function (store) {
1940
- return mapSelectors.getMapBaseLayers(store, mapId);
1941
- });
1942
- var currentAvailableBaseLayers = useSelector(function (store) {
1943
- return layerSelectors.getAvailableBaseLayersForMap(store, mapId);
1944
- });
1945
- React.useEffect(function () {
1946
- var availableBaseLayersToBeAdded = constructListAvailableBaseLayers(selectedBaseLayers, preloadedAvailableBaseLayers, mapId);
1947
- var areBaseLayersSame = areAvailableBaseLayersSame(availableBaseLayersToBeAdded, currentAvailableBaseLayers);
1948
- if (!areBaseLayersSame) {
1949
- dispatch(layerActions.setAvailableBaseLayers({
1950
- layers: availableBaseLayersToBeAdded,
1951
- mapId: mapId
1952
- }));
1953
- }
1954
- // eslint-disable-next-line react-hooks/exhaustive-deps
1955
- }, [mapId, preloadedAvailableBaseLayers]);
1956
- var onChangeBaseLayers = function onChangeBaseLayers(newSelectedLayerId) {
1957
- var newBaseLayer = currentAvailableBaseLayers.filter(function (layer) {
1958
- return layer.id === newSelectedLayerId;
1959
- });
1960
- dispatch(layerActions.setBaseLayers({
1961
- mapId: mapId,
1962
- layers: newBaseLayer,
1963
- origin: layerTypes.LayerActionOrigin.layerManager
1964
- }));
1965
- };
1966
- return jsx(BaseLayers, {
1967
- availableBaseLayers: currentAvailableBaseLayers,
1968
- icon: icon,
1969
- onChangeBaseLayers: onChangeBaseLayers,
1970
- selectedBaseLayers: selectedBaseLayers,
1971
- tooltipPrefix: tooltipPrefix
1972
- });
1973
- };
1974
-
1975
1968
  var _excluded$6 = ["mapId", "preloadedAvailableBaseLayers", "preloadedServices", "tooltip", "settings"];
1976
1969
  var _onRenderTree = function onRenderTree(_ref) {
1977
1970
  var service = _ref.service,
@@ -2257,6 +2250,12 @@ var AcceptanceTime = function AcceptanceTime(_ref) {
2257
2250
  }, {
2258
2251
  value: '10',
2259
2252
  text: '00:10'
2253
+ }, {
2254
+ value: '15',
2255
+ text: '00:15'
2256
+ }, {
2257
+ value: '20',
2258
+ text: '00:20'
2260
2259
  }, {
2261
2260
  value: '30',
2262
2261
  text: '00:30'
@@ -4789,6 +4788,7 @@ var LayerInfoButtonConnect = function LayerInfoButtonConnect(_ref) {
4789
4788
  mapId = _ref.mapId,
4790
4789
  serviceUrl = _ref.serviceUrl,
4791
4790
  layerName = _ref.layerName,
4791
+ layerId = _ref.layerId,
4792
4792
  _ref$source = _ref.source,
4793
4793
  source = _ref$source === void 0 ? 'app' : _ref$source;
4794
4794
  var dispatch = useDispatch();
@@ -4798,6 +4798,9 @@ var LayerInfoButtonConnect = function LayerInfoButtonConnect(_ref) {
4798
4798
  var currentLayerInfo = useSelector(function (store) {
4799
4799
  return layerSelectors.getActiveLayerInfo(store);
4800
4800
  });
4801
+ var currentLayerStyle = useSelector(function (store) {
4802
+ return layerSelectors.getLayerStyle(store, layerId);
4803
+ });
4801
4804
  var isActive = layerName === (currentLayerInfo == null ? void 0 : currentLayerInfo.layerName) && serviceUrl === (currentLayerInfo == null ? void 0 : currentLayerInfo.serviceUrl) && isOpenInStore;
4802
4805
  var onClick = function onClick() {
4803
4806
  if (!isActive) {
@@ -4805,7 +4808,8 @@ var LayerInfoButtonConnect = function LayerInfoButtonConnect(_ref) {
4805
4808
  layerName: layerName,
4806
4809
  serviceUrl: serviceUrl,
4807
4810
  source: source,
4808
- mapId: mapId
4811
+ mapId: mapId,
4812
+ style: currentLayerStyle
4809
4813
  }));
4810
4814
  } else {
4811
4815
  dispatch(layerActions.hideLayerInfo());
@@ -4843,6 +4847,7 @@ var LayerInfoDialogConnect = function LayerInfoDialogConnect(_ref) {
4843
4847
  onClose: onCloseDialog,
4844
4848
  onMouseDown: setDialogOrder,
4845
4849
  order: dialogOrder,
4850
+ selectedStyle: layerInfo == null ? void 0 : layerInfo.style,
4846
4851
  serviceName: currentService == null ? void 0 : currentService.name,
4847
4852
  serviceUrl: currentService == null ? void 0 : currentService.serviceUrl,
4848
4853
  source: source
@@ -4948,6 +4953,7 @@ var LayerRowConnect = /*#__PURE__*/React.memo(function (_ref) {
4948
4953
  layerShowLayerInfoLayout: jsx(LayerInfoButtonConnect, {
4949
4954
  isFeatureLayer: isFeatureLayer,
4950
4955
  isLayerMissing: isLayerMissing,
4956
+ layerId: layerId,
4951
4957
  layerName: layerName,
4952
4958
  mapId: mapId,
4953
4959
  serviceUrl: layerServiceUrl
@@ -6095,6 +6101,12 @@ var ClockConnect = function ClockConnect(_ref) {
6095
6101
  var isMapClockVisible = useSelector(function (store) {
6096
6102
  return mapSelectors.getIsClockVisible(store, mapId);
6097
6103
  });
6104
+ var clockPosition = useSelector(function (store) {
6105
+ return mapSelectors.getClockPosition(store, mapId);
6106
+ });
6107
+ var clockSize = useSelector(function (store) {
6108
+ return mapSelectors.getClockSize(store, mapId);
6109
+ });
6098
6110
  var onToggleClock = function onToggleClock(isClockVisible) {
6099
6111
  dispatch(mapActions.toggleClock({
6100
6112
  mapId: mapId,
@@ -6102,9 +6114,27 @@ var ClockConnect = function ClockConnect(_ref) {
6102
6114
  origin: mapEnums.MapActionOrigin.map
6103
6115
  }));
6104
6116
  };
6117
+ var onSetPosition = function onSetPosition(position) {
6118
+ dispatch(mapActions.setClockPositionSize({
6119
+ mapId: mapId,
6120
+ position: position,
6121
+ origin: mapEnums.MapActionOrigin.map
6122
+ }));
6123
+ };
6124
+ var onSetSize = function onSetSize(size) {
6125
+ dispatch(mapActions.setClockPositionSize({
6126
+ mapId: mapId,
6127
+ size: size,
6128
+ origin: mapEnums.MapActionOrigin.map
6129
+ }));
6130
+ };
6105
6131
  return jsx(Clock, {
6106
6132
  isVisible: isMapClockVisible,
6133
+ onSetPosition: onSetPosition,
6134
+ onSetSize: onSetSize,
6107
6135
  onToggleClock: onToggleClock,
6136
+ position: clockPosition,
6137
+ size: clockSize,
6108
6138
  time: selectedTime
6109
6139
  });
6110
6140
  };
@@ -6938,16 +6968,34 @@ var OpenLayersFeatureLayerConnect = function OpenLayersFeatureLayerConnect(_ref)
6938
6968
  hoverSelect = _ref.hoverSelect;
6939
6969
  var store = useStore();
6940
6970
  var dispatch = useDispatch();
6971
+ var activeDrawToolId = useSelector(drawingToolSelectors.getActiveDrawToolId);
6972
+ var activeDrawMode = useSelector(function (store) {
6973
+ return drawingToolSelectors.getActiveDrawMode(store, activeDrawToolId);
6974
+ });
6975
+ var shouldAllowMultipleShapes = useSelector(function (store) {
6976
+ return drawingToolSelectors.getShouldAllowMultipleShapes(store, activeDrawToolId);
6977
+ });
6978
+ var geoJSONIntersectionLayerId = useSelector(function (store) {
6979
+ return drawingToolSelectors.getGeoJSONIntersectionLayerId(store, activeDrawToolId);
6980
+ });
6981
+ var geoJSONIntersectionBoundsLayerId = useSelector(function (store) {
6982
+ return drawingToolSelectors.getGeoJSONIntersectionBoundsLayerId(store, activeDrawToolId);
6983
+ });
6941
6984
  var onFeatureClick = React.useCallback(function (feature) {
6942
6985
  var previouslySelectedFeatureIndex = layer.selectedFeatureIndex;
6943
6986
  var selectedFeatureIndex = layer.geojson.features.findIndex(function (feat) {
6944
6987
  return feature[0] && feat.id === feature[0].getId();
6945
6988
  });
6946
- if (selectedFeatureIndex !== -1 && selectedFeatureIndex !== previouslySelectedFeatureIndex) {
6989
+ if (selectedFeatureIndex !== -1) {
6947
6990
  dispatch(layerActions.setSelectedFeature({
6948
6991
  layerId: layerId,
6949
6992
  selectedFeatureIndex: selectedFeatureIndex
6950
6993
  }));
6994
+ dispatch(layerActions.toggleFeatureMode({
6995
+ layerId: layerId,
6996
+ isInEditMode: true,
6997
+ drawMode: ''
6998
+ }));
6951
6999
  dispatch(layerActions.updateFeatureProperties({
6952
7000
  layerId: layerId,
6953
7001
  properties: {
@@ -6966,23 +7014,39 @@ var OpenLayersFeatureLayerConnect = function OpenLayersFeatureLayerConnect(_ref)
6966
7014
  }
6967
7015
  }
6968
7016
  }, [dispatch, layer.geojson, layer.selectedFeatureIndex, layerId]);
7017
+ var onNoFeatureClick = React.useCallback(function () {
7018
+ if (activeDrawToolId) {
7019
+ // do not disable edit mode when a drawing tool is active
7020
+ return;
7021
+ }
7022
+ dispatch(layerActions.toggleFeatureMode({
7023
+ layerId: layerId,
7024
+ isInEditMode: false,
7025
+ drawMode: ''
7026
+ }));
7027
+ }, [activeDrawToolId, dispatch, layerId]);
7028
+ var onViewOnlyFeatureClick = React.useCallback(function (feature) {
7029
+ if (activeDrawToolId) {
7030
+ // do not select another feature when a drawing tool is active
7031
+ return;
7032
+ }
7033
+ onFeatureClick(feature);
7034
+ }, [activeDrawToolId, onFeatureClick]);
6969
7035
  var updateFeature = React.useCallback(function (geojson, reason) {
6970
7036
  if (!layerId) {
6971
7037
  window.console.error('updateFeature without layerId');
6972
7038
  return;
6973
7039
  }
6974
- var activeDrawToolId = drawingToolSelectors.getActiveDrawToolId(store.getState());
6975
- var activeDrawMode = drawingToolSelectors.getActiveDrawMode(store.getState(), activeDrawToolId);
6976
7040
  dispatch(layerActions.updateFeature({
6977
7041
  geojson: geojson,
6978
7042
  reason: reason,
6979
7043
  layerId: layerId,
6980
- shouldAllowMultipleShapes: drawingToolSelectors.getShouldAllowMultipleShapes(store.getState(), activeDrawToolId),
6981
- geoJSONIntersectionLayerId: drawingToolSelectors.getGeoJSONIntersectionLayerId(store.getState(), activeDrawToolId),
6982
- geoJSONIntersectionBoundsLayerId: drawingToolSelectors.getGeoJSONIntersectionBoundsLayerId(store.getState(), activeDrawToolId),
7044
+ shouldAllowMultipleShapes: shouldAllowMultipleShapes,
7045
+ geoJSONIntersectionLayerId: geoJSONIntersectionLayerId,
7046
+ geoJSONIntersectionBoundsLayerId: geoJSONIntersectionBoundsLayerId,
6983
7047
  selectionType: activeDrawMode == null ? void 0 : activeDrawMode.selectionType
6984
7048
  }));
6985
- }, [dispatch, store, layerId]);
7049
+ }, [layerId, dispatch, shouldAllowMultipleShapes, geoJSONIntersectionLayerId, geoJSONIntersectionBoundsLayerId, activeDrawMode == null ? void 0 : activeDrawMode.selectionType]);
6986
7050
  var exitFeatureDrawMode = React.useCallback(function (reason) {
6987
7051
  if (!layerId) {
6988
7052
  window.console.error('exitFeatureDrawMode without layerId');
@@ -7012,6 +7076,8 @@ var OpenLayersFeatureLayerConnect = function OpenLayersFeatureLayerConnect(_ref)
7012
7076
  exitDrawModeCallback: exitFeatureDrawMode,
7013
7077
  geojson: layer.geojson,
7014
7078
  isInEditMode: layer.isInEditMode || false,
7079
+ onNoFeatureClick: onNoFeatureClick,
7080
+ onViewOnlyFeatureClick: onViewOnlyFeatureClick,
7015
7081
  selectedFeatureIndex: layer.selectedFeatureIndex || 0,
7016
7082
  updateGeojson: updateFeature,
7017
7083
  viewOnlyStyle: style
@@ -7194,6 +7260,15 @@ function useFitAndHighlightWarningFeature(_ref) {
7194
7260
  }
7195
7261
  }, [view, warningDialogFeatures, srs, dispatch, mapId]);
7196
7262
  }
7263
+ /** Compare value with current time and if difference is more than factor times timeStep returns true */
7264
+ var getIsOutdated = function getIsOutdated(compareValue, timeStep, factor) {
7265
+ var currentDate = dateUtils.utc();
7266
+ var diff = dateUtils.differenceInMinutes(currentDate, dateUtils.createDate(compareValue));
7267
+ if (diff > timeStep * factor) {
7268
+ return true;
7269
+ }
7270
+ return false;
7271
+ };
7197
7272
 
7198
7273
  var OlMapViewLayerConnect = function OlMapViewLayerConnect(layerProps) {
7199
7274
  var layerId = layerProps.layerId,
@@ -7828,7 +7903,7 @@ var MapOptionsButtonConnect = function MapOptionsButtonConnect(_ref) {
7828
7903
  * @param {object} [controls.zoomControls] **optional** controls: object - toggle the map controls, zoomControls defaults to true
7829
7904
  */
7830
7905
  var OlMapViewConnect = function OlMapViewConnect(_ref) {
7831
- var _useSelector2, _featureProperties$va;
7906
+ var _useSelector2, _useSelector3, _featureProperties$va;
7832
7907
  var mapId = _ref.mapId,
7833
7908
  children = _ref.children,
7834
7909
  _ref$controls = _ref.controls,
@@ -7841,7 +7916,8 @@ var OlMapViewConnect = function OlMapViewConnect(_ref) {
7841
7916
  source = _ref.source,
7842
7917
  tileServerSettings = _ref.tileServerSettings,
7843
7918
  _ref$featureStyle = _ref.featureStyle,
7844
- featureStyle = _ref$featureStyle === void 0 ? genericOpenLayersFeatureStyle : _ref$featureStyle;
7919
+ featureStyle = _ref$featureStyle === void 0 ? genericOpenLayersFeatureStyle : _ref$featureStyle,
7920
+ displayTimeInMap = _ref.displayTimeInMap;
7845
7921
  var store = useStore();
7846
7922
  var _useGetOpenLayersView = useGetOpenLayersView(mapId, store),
7847
7923
  view = _useGetOpenLayersView.view;
@@ -7929,7 +8005,21 @@ var OlMapViewConnect = function OlMapViewConnect(_ref) {
7929
8005
  var isAnimating = (_useSelector2 = useSelector(function (store) {
7930
8006
  return mapSelectors.linkedMapAnimationInfo(store, mapId);
7931
8007
  })) == null ? void 0 : _useSelector2.isAnimating;
8008
+ var autoUpdateLayerId = useSelector(function (store) {
8009
+ return mapSelectors.getAutoUpdateLayerId(store, mapId);
8010
+ });
8011
+ var shouldAutoUpdate = useSelector(function (store) {
8012
+ return mapSelectors.isAutoUpdating(store, mapId);
8013
+ });
8014
+ var autoUpdateLayerMaxValue = (_useSelector3 = useSelector(function (store) {
8015
+ return layerSelectors.getLayerTimeDimension(store, autoUpdateLayerId);
8016
+ })) == null ? void 0 : _useSelector3.maxValue;
8017
+ var autoUpdateTimeStep = useSelector(function (store) {
8018
+ return layerSelectors.getTimeStepForLayerId(store, autoUpdateLayerId);
8019
+ });
7932
8020
  var dispatch = useDispatch();
8021
+ var _useCoreTranslation = useCoreTranslation(),
8022
+ t = _useCoreTranslation.t;
7933
8023
  var updateLayerInformation = React.useCallback(function (payload) {
7934
8024
  var _payload$layerDimensi, _payload$layerDimensi2;
7935
8025
  var updatedPayLoad = Object.assign({}, payload, {
@@ -8130,6 +8220,28 @@ var OlMapViewConnect = function OlMapViewConnect(_ref) {
8130
8220
  // eslint-disable-next-line react-hooks/exhaustive-deps
8131
8221
  }, [mapId, updateLayerInformation, layerIds]);
8132
8222
  useSetIntervalWhenVisible(refetchLayers, 60000);
8223
+ /** Check if the autoUpdate layer has outdated data and inform the user by setting the map error */
8224
+ var checkIfDataOutdated = React.useCallback(function () {
8225
+ if (!shouldAutoUpdate || !autoUpdateLayerId || !autoUpdateLayerMaxValue || !autoUpdateTimeStep) {
8226
+ dispatch(mapActions.setMapPresetError({
8227
+ mapId: mapId,
8228
+ error: undefined
8229
+ }));
8230
+ return;
8231
+ }
8232
+ // check that the difference is more than 4 timesteps with the current time
8233
+ var isOutdated = getIsOutdated(autoUpdateLayerMaxValue, autoUpdateTimeStep, 4);
8234
+ dispatch(mapActions.setMapPresetError({
8235
+ mapId: mapId,
8236
+ error: isOutdated ? t('data-outdated') : undefined
8237
+ }));
8238
+ }, [autoUpdateLayerId, autoUpdateLayerMaxValue, autoUpdateTimeStep, dispatch, mapId, shouldAutoUpdate, t]);
8239
+ // Check every minute if data is outdated
8240
+ useSetIntervalWhenVisible(checkIfDataOutdated, 60000);
8241
+ // Recheck if data is outdated if the function is updated
8242
+ React.useEffect(function () {
8243
+ checkIfDataOutdated();
8244
+ }, [checkIfDataOutdated]);
8133
8245
  useMapViewLoadingIndicator(mapId, mapLayerIds);
8134
8246
  var _React$useState2 = React.useState({
8135
8247
  debugMode: false
@@ -8275,6 +8387,8 @@ var OlMapViewConnect = function OlMapViewConnect(_ref) {
8275
8387
  bounds: "parent",
8276
8388
  isDocked: true,
8277
8389
  mapId: mapId
8390
+ }), !!displayTimeInMap && jsx(ClockConnect, {
8391
+ mapId: mapId
8278
8392
  }), children]
8279
8393
  })
8280
8394
  });
@@ -9046,8 +9160,15 @@ var TimeSliderConnect = function TimeSliderConnect(_ref) {
9046
9160
  var _React$useState = React.useState(selectedTime),
9047
9161
  unfilteredSelectedTime = _React$useState[0],
9048
9162
  setUnfilteredSelectedTime = _React$useState[1];
9163
+ // Store unfilteredSelectedTime in a ref for callbacks
9164
+ var unfilteredSelectedTimeRef = React.useRef(unfilteredSelectedTime);
9165
+ React.useEffect(function () {
9166
+ unfilteredSelectedTimeRef.current = unfilteredSelectedTime;
9167
+ }, [unfilteredSelectedTime]);
9049
9168
  // Reference to the last time value set by this timeslider
9050
9169
  var lastTimeValueAsSetByThisTimeSlider = React.useRef();
9170
+ // Track the last selectedTime we processed to avoid unnecessary updates
9171
+ var lastProcessedSelectedTime = React.useRef(selectedTime);
9051
9172
  // Set new time in the redux state
9052
9173
  var _onSetNewDate = React.useCallback(function (newDate) {
9053
9174
  // Remember that this timeslider has set this time
@@ -9067,22 +9188,59 @@ var TimeSliderConnect = function TimeSliderConnect(_ref) {
9067
9188
  }, [dispatch, isAnimating, mapId, sourceId]);
9068
9189
  // Update local state when time is updated outside of this component, e.g. during animation or syncgroups
9069
9190
  React.useEffect(function () {
9191
+ // Only update if selectedTime has actually changed (not just timeStep)
9192
+ if (lastProcessedSelectedTime.current === selectedTime) {
9193
+ return;
9194
+ }
9070
9195
  var selectedTimeAsIsoString = timeToIso(selectedTime);
9071
- if (selectedTimeAsIsoString !== lastTimeValueAsSetByThisTimeSlider.current) {
9196
+ // Check if this is our own update bouncing back
9197
+ var isOurOwnUpdate = selectedTimeAsIsoString === lastTimeValueAsSetByThisTimeSlider.current;
9198
+ if (isOurOwnUpdate) {
9199
+ // Our update was processed, clear the flag and update tracking
9200
+ lastTimeValueAsSetByThisTimeSlider.current = undefined;
9201
+ lastProcessedSelectedTime.current = selectedTime;
9202
+ } else {
9203
+ // Time changed from outside this component (e.g., backward/forward buttons, animation)
9204
+ // Cancel any pending debounced updates and sync local state
9205
+ onsetNewDateDebounced.cancel();
9206
+ lastProcessedSelectedTime.current = selectedTime;
9072
9207
  setUnfilteredSelectedTime(selectedTime);
9208
+ // Clear the flag so we don't block future external updates to this same time
9209
+ lastTimeValueAsSetByThisTimeSlider.current = undefined;
9073
9210
  }
9074
9211
  }, [selectedTime]);
9212
+ // Store timeStep in a ref so we can use the latest value without causing re-renders
9213
+ var timeStepRef = React.useRef(timeStep);
9214
+ var prevTimeStepRef = React.useRef(timeStep);
9215
+ React.useEffect(function () {
9216
+ var timeStepChanged = prevTimeStepRef.current !== timeStep;
9217
+ prevTimeStepRef.current = timeStep;
9218
+ timeStepRef.current = timeStep;
9219
+ // When timestep changes, apply smart rounding to current time
9220
+ // For large timesteps (>12h), round to nearest hour instead of timestep
9221
+ if (timeStepChanged) {
9222
+ var roundingStep = timeStep > 12 * 60 ? 60 : timeStep;
9223
+ var snappedTime = getFilteredTime(unfilteredSelectedTime, roundingStep, dataStartTime, dataEndTime);
9224
+ if (snappedTime !== unfilteredSelectedTime) {
9225
+ setUnfilteredSelectedTime(snappedTime);
9226
+ onsetNewDateDebounced(timeToIso(snappedTime), _onSetNewDate);
9227
+ }
9228
+ }
9229
+ }, [timeStep, unfilteredSelectedTime, dataStartTime, dataEndTime, _onSetNewDate]);
9075
9230
  // Function used by timeslider components to update the unfiltered selected time
9076
9231
  var setUnfilteredSelectedTimeFn = React.useCallback(function (unfilteredSelectedTimeFromComponents) {
9077
- var makeFilteredSelectedTime = function makeFilteredSelectedTime(timeValue) {
9078
- return getFilteredTime(timeValue, timeStep, dataStartTime, dataEndTime);
9079
- };
9080
- setUnfilteredSelectedTime(unfilteredSelectedTimeFromComponents);
9081
- var filteredIsoTime = makeFilteredSelectedTime(unfilteredSelectedTimeFromComponents);
9082
- if (selectedTime !== filteredIsoTime) {
9083
- onsetNewDateDebounced(timeToIso(filteredIsoTime), _onSetNewDate);
9232
+ // Only update if the value has actually changed
9233
+ if (unfilteredSelectedTimeFromComponents === unfilteredSelectedTimeRef.current) {
9234
+ return;
9084
9235
  }
9085
- }, [dataEndTime, dataStartTime, _onSetNewDate, selectedTime, timeStep]);
9236
+ // Snap to nearest timestep when clicking/dragging on timeslider
9237
+ // For timesteps >= 1 hour, snap to nearest hour
9238
+ // For smaller timesteps, snap to the timestep itself (e.g., 5min, 10min, 15min)
9239
+ var roundingStep = timeStepRef.current >= 60 ? 60 : timeStepRef.current;
9240
+ var timeToSet = getFilteredTime(unfilteredSelectedTimeFromComponents, roundingStep, dataStartTime, dataEndTime);
9241
+ setUnfilteredSelectedTime(timeToSet);
9242
+ onsetNewDateDebounced(timeToIso(timeToSet), _onSetNewDate);
9243
+ }, [dataEndTime, dataStartTime, _onSetNewDate]);
9086
9244
  // Move animation bar when user changes time using time picker
9087
9245
  // Animation bar however cannot be moved into a time where there is no data
9088
9246
  var moveAnimationUsingCalendar = function moveAnimationUsingCalendar(newTime) {
@@ -9105,8 +9263,13 @@ var TimeSliderConnect = function TimeSliderConnect(_ref) {
9105
9263
  }));
9106
9264
  };
9107
9265
  var onCalendarSelect = function onCalendarSelect(newSelectedTime) {
9108
- setUnfilteredSelectedTimeFn(newSelectedTime);
9109
- moveAnimationUsingCalendar(newSelectedTime);
9266
+ // When user explicitly sets time via calendar, snap to nearest available timestep
9267
+ // For large timesteps (>12h), round to nearest hour instead of timestep
9268
+ var roundingStep = timeStep > 12 * 60 ? 60 : timeStep;
9269
+ var snappedTime = getFilteredTime(newSelectedTime, roundingStep, dataStartTime, dataEndTime);
9270
+ setUnfilteredSelectedTime(snappedTime);
9271
+ onsetNewDateDebounced(timeToIso(snappedTime), _onSetNewDate);
9272
+ moveAnimationUsingCalendar(snappedTime);
9110
9273
  };
9111
9274
  var secondsPerPx = useSelector(function (store) {
9112
9275
  return mapSelectors.getMapTimeSliderSecondsPerPx(store, mapId);
@@ -9122,10 +9285,15 @@ var TimeSliderConnect = function TimeSliderConnect(_ref) {
9122
9285
  var event = _ref2.event,
9123
9286
  deltaY = _ref2.deltaY;
9124
9287
  if (!(event.ctrlKey || event.metaKey || event.shiftKey || event.altKey)) {
9125
- var pixelsPerScroll = -deltaY * timeStep / (2 * secondsPerPx);
9126
- moveSelectedTimePx(pixelsPerScroll, timeSliderWidth, centerTime, dataStartTime, dataEndTime, secondsPerPx, timeStep, unfilteredSelectedTime, setUnfilteredSelectedTimeFn);
9288
+ if (deltaY === 0) {
9289
+ return;
9290
+ }
9291
+ // timeStepRef.current is in minutes, convert to seconds
9292
+ var timeStepInSeconds = timeStepRef.current * 60;
9293
+ var pixelsPerScroll = -deltaY / Math.abs(deltaY) * (timeStepInSeconds / secondsPerPx);
9294
+ moveSelectedTimePx(pixelsPerScroll, timeSliderWidth, centerTime, dataStartTime, dataEndTime, secondsPerPx, timeStepRef.current, unfilteredSelectedTimeRef.current, setUnfilteredSelectedTimeFn);
9127
9295
  }
9128
- }, [timeSliderWidth, centerTime, dataEndTime, dataStartTime, secondsPerPx, setUnfilteredSelectedTimeFn, timeStep, unfilteredSelectedTime]);
9296
+ }, [timeSliderWidth, centerTime, dataEndTime, dataStartTime, secondsPerPx, setUnfilteredSelectedTimeFn]);
9129
9297
  React.useEffect(function () {
9130
9298
  if (isTimeScrollingEnabled && mapWindowRef != null && mapWindowRef.current) {
9131
9299
  var handleWheel = function handleWheel(event) {
@@ -9334,7 +9502,9 @@ var ConfigurableMapConnect = function ConfigurableMapConnect(_ref) {
9334
9502
  mapId: mapId,
9335
9503
  layer: {
9336
9504
  geojson: emptyGeoJSON,
9337
- layerType: LayerType.featureLayer
9505
+ layerType: LayerType.featureLayer,
9506
+ isSelectable: false,
9507
+ isInEditMode: false
9338
9508
  },
9339
9509
  layerId: getSingularDrawtoolDrawLayerId(mapId),
9340
9510
  origin: 'ConfigurableMapConnect'
@@ -10382,75 +10552,6 @@ var RouterWrapperConnect = function RouterWrapperConnect(props) {
10382
10552
  });
10383
10553
  };
10384
10554
 
10385
- var Circle = styled$1('div')(function (_ref) {
10386
- var isRecording = _ref.isRecording;
10387
- return {
10388
- width: '70%',
10389
- height: '70%',
10390
- borderRadius: '50%',
10391
- backgroundColor: isRecording ? 'red' : 'gray',
10392
- position: 'absolute',
10393
- top: '50%',
10394
- left: '50%',
10395
- transform: 'translate(-50%, -50%)'
10396
- };
10397
- });
10398
- var SentryRecordButton = function SentryRecordButton() {
10399
- var _useCoreTranslation = useCoreTranslation(),
10400
- t = _useCoreTranslation.t;
10401
- var _React$useState = React.useState(false),
10402
- isRecording = _React$useState[0],
10403
- setIsRecording = _React$useState[1];
10404
- var replay = getReplay();
10405
- var toggleRecord = /*#__PURE__*/function () {
10406
- var _ref2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee() {
10407
- return _regeneratorRuntime().wrap(function _callee$(_context) {
10408
- while (1) switch (_context.prev = _context.next) {
10409
- case 0:
10410
- if (isRecording) {
10411
- _context.next = 5;
10412
- break;
10413
- }
10414
- replay == null || replay.start();
10415
- setIsRecording(true);
10416
- _context.next = 8;
10417
- break;
10418
- case 5:
10419
- setIsRecording(false);
10420
- _context.next = 8;
10421
- return replay == null ? void 0 : replay.stop();
10422
- case 8:
10423
- case "end":
10424
- return _context.stop();
10425
- }
10426
- }, _callee);
10427
- }));
10428
- return function toggleRecord() {
10429
- return _ref2.apply(this, arguments);
10430
- };
10431
- }();
10432
- var title = isRecording ? t('sentry-stop-recording') : t('sentry-start-recording');
10433
- return jsx(ErrorBoundary, {
10434
- displayOnTop: true,
10435
- handlePromiseRejections: true,
10436
- children: jsx(CustomTooltip, {
10437
- title: title,
10438
- children: jsx(CustomIconButton, {
10439
- "data-testid": "sentryRecordButton",
10440
- onClick: toggleRecord,
10441
- sx: {
10442
- margin: '10px',
10443
- border: 'solid 1px gray'
10444
- },
10445
- variant: "flat",
10446
- children: jsx(Circle, {
10447
- isRecording: isRecording
10448
- })
10449
- })
10450
- })
10451
- });
10452
- };
10453
-
10454
10555
  var languages = [{
10455
10556
  language: 'English',
10456
10557
  code: 'en',
@@ -10576,7 +10677,7 @@ var SelectedFeature = function SelectedFeature(_ref) {
10576
10677
  return Math.abs(lat) + "\xB0 " + latHemisphere + ", " + Math.abs(lon) + "\xB0 " + lonHemisphere;
10577
10678
  };
10578
10679
  var formattedCoordinates = useMemo(function () {
10579
- if (feature && feature.geometry.type === 'Point') {
10680
+ if ((feature == null ? void 0 : feature.geometry.type) === 'Point') {
10580
10681
  var latitude = feature.geometry.coordinates[1];
10581
10682
  var longitude = feature.geometry.coordinates[0];
10582
10683
  return getFormattedCoordinates(latitude, longitude);
@@ -11110,4 +11211,4 @@ var storyUtils = /*#__PURE__*/Object.freeze({
11110
11211
  useDefaultMapSettings: useDefaultMapSettings
11111
11212
  });
11112
11213
 
11113
- 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, SentryRecordButton, 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 };
11214
+ 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 };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opengeoweb/core",
3
- "version": "15.0.0",
3
+ "version": "15.2.0",
4
4
  "description": "GeoWeb Core library for the opengeoweb project",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
@@ -8,31 +8,30 @@
8
8
  "url": "git@gitlab.com:opengeoweb/opengeoweb.git"
9
9
  },
10
10
  "dependencies": {
11
- "@opengeoweb/shared": "15.0.0",
11
+ "@opengeoweb/shared": "15.2.0",
12
12
  "react-redux": "^9.2.0",
13
- "@opengeoweb/store": "15.0.0",
14
- "@opengeoweb/time-slider": "15.0.0",
13
+ "@opengeoweb/store": "15.2.0",
14
+ "@opengeoweb/time-slider": "15.2.0",
15
15
  "@reduxjs/toolkit": "^2.6.1",
16
- "@opengeoweb/webmap-react": "15.0.0",
17
- "@opengeoweb/webmap": "15.0.0",
18
- "@opengeoweb/theme": "15.0.0",
16
+ "@opengeoweb/webmap-react": "15.2.0",
17
+ "@opengeoweb/webmap": "15.2.0",
18
+ "@opengeoweb/theme": "15.2.0",
19
19
  "axios": "^1.7.7",
20
- "@opengeoweb/layer-select": "15.0.0",
20
+ "@opengeoweb/layer-select": "15.2.0",
21
21
  "lodash": "^4.17.21",
22
22
  "ol": "^10.4.0",
23
23
  "react-sortablejs": "^6.1.4",
24
24
  "sortablejs": "^1.15.1",
25
25
  "@mui/system": "^7.3.2",
26
- "@opengeoweb/snackbar": "15.0.0",
26
+ "@opengeoweb/snackbar": "15.2.0",
27
27
  "react-router-dom": "^6.21.0",
28
28
  "react-draggable": "^4.4.6",
29
29
  "i18next": "^25.0.1",
30
30
  "react-i18next": "^15.1.1",
31
31
  "dompurify": "^3.0.6",
32
32
  "@mui/material": "^7.0.1",
33
- "@sentry/react": "^8.34.0",
34
33
  "@tanstack/react-query": "^5.85.5",
35
- "@opengeoweb/api": "15.0.0",
34
+ "@opengeoweb/api": "15.2.0",
36
35
  "@types/geojson": "^7946.0.14",
37
36
  "@turf/turf": "^7.2.0",
38
37
  "proj4": "^2.15.0"
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import type { PlotPreset, TimeSeriesService } from '@opengeoweb/shared';
2
+ import type { Coordinates, PlotPreset, SourceSelection, TimeSeriesService } from '@opengeoweb/shared';
3
3
  import type { mapTypes } from '@opengeoweb/store';
4
4
  import type { InitialHarmTempAndPrecipProps } from '../MultiMapViewConnect/HarmoniePresets';
5
5
  import type { ModelRunIntervalProps } from '../MultiMapViewConnect/ModelRunInterval';
@@ -27,7 +27,13 @@ export interface InitialTimeSeriesProps {
27
27
  services: TimeSeriesService[];
28
28
  hideLocationMarkers?: boolean;
29
29
  }
30
- export type InitialProps = InitialMapProps | InitialMultiMapProps | InitialHarmTempAndPrecipProps | ModelRunIntervalProps | mapTypes.MapPresetInitialProps | InitialSliderProps | InitialTimeSeriesProps | Record<string, unknown>;
30
+ export interface InitialSoundingsProps {
31
+ selectedSources: Record<string, SourceSelection>;
32
+ selectedLocations: Record<string, string | Coordinates | undefined>;
33
+ selectedTime?: string;
34
+ diagramType?: 'SKEWT' | 'BIJVOET' | 'EMAGRAM';
35
+ }
36
+ export type InitialProps = InitialMapProps | InitialMultiMapProps | InitialHarmTempAndPrecipProps | ModelRunIntervalProps | mapTypes.MapPresetInitialProps | InitialSliderProps | InitialTimeSeriesProps | InitialSoundingsProps | Record<string, unknown>;
31
37
  /**
32
38
  * The lookup table is for registering your own components with the workspace.
33
39
  * @param payload
@@ -6,6 +6,7 @@ interface LayerInfoButtonProps {
6
6
  mapId: string;
7
7
  serviceUrl: string;
8
8
  layerName: string;
9
+ layerId: string;
9
10
  source?: uiTypes.Source;
10
11
  }
11
12
  export declare const LayerInfoButtonConnect: React.FC<LayerInfoButtonProps>;
@@ -0,0 +1,8 @@
1
+ import React from 'react';
2
+ declare const _default: {
3
+ title: string;
4
+ component: React.FC<import("./OlMapViewConnect").OlMapViewConnectProps>;
5
+ tags: string[];
6
+ };
7
+ export default _default;
8
+ export declare const DisplayTimeExample: () => React.ReactElement;
@@ -17,4 +17,6 @@ interface UseFitAndHighlightWarningFeatureOptions {
17
17
  mapId: string;
18
18
  }
19
19
  export declare function useFitAndHighlightWarningFeature({ view, warningDialogFeatures, srs, mapId, }: UseFitAndHighlightWarningFeatureOptions): void;
20
+ /** Compare value with current time and if difference is more than factor times timeStep returns true */
21
+ export declare const getIsOutdated: (compareValue: string, timeStep: number, factor: number) => boolean;
20
22
  export {};
@@ -17,7 +17,6 @@ export * from './components/RouterWrapper';
17
17
  export * from './components/LocationSearch';
18
18
  export * from './components/TimeSliderConnect';
19
19
  export * from './components/LayerInfoConnect';
20
- export * from './components/SentryRecordButton';
21
20
  export * from './components/LanguageSelect';
22
21
  export * from './components/SelectedFeaturesDialog/SelectedFeaturesDialogConnect';
23
22
  export { useLocationDetail, useLocationList } from './utils/location-api/hooks';
@@ -18,7 +18,9 @@ export declare const multiDimensionLayer: {
18
18
  currentValue: string;
19
19
  values?: undefined;
20
20
  })[];
21
- }, WmdefaultReduxLayerRadarKNMI: WMLayer, defaultReduxLayerRadarKNMI: import("@opengeoweb/webmap").LayerOptions, defaultReduxLayerRadarColor: import("@opengeoweb/webmap").LayerOptions, multiDimensionLayer3: import("@opengeoweb/webmap").LayerFoundation;
21
+ }, WmdefaultReduxLayerRadarKNMI: WMLayer, defaultReduxLayerRadarKNMI: import("@opengeoweb/webmap").LayerOptions, defaultReduxLayerRadarColor: import("@opengeoweb/webmap").LayerOptions, multiDimensionLayer3: import("@opengeoweb/webmap").LayerFoundation, defaultReduxLayerRadarKNMIWithStyles: import("@opengeoweb/webmap").LayerFoundation & {
22
+ styles: import("@opengeoweb/webmap").Style[];
23
+ };
22
24
  export declare const flDimensionLayer: layerTypes.Layer;
23
25
  export declare const layerWithSingleDimensionValue: WMLayer;
24
26
  export declare const WmMultiDimensionLayer: WMLayer;
@@ -1,3 +0,0 @@
1
- import React from 'react';
2
- declare const SentryRecordButton: React.FC;
3
- export default SentryRecordButton;
@@ -1 +0,0 @@
1
- export { default as SentryRecordButton } from './SentryRecordButton';
@@ -1,11 +0,0 @@
1
- import React from 'react';
2
- import type { serviceTypes } from '@opengeoweb/store';
3
- interface WMSLoaderProps {
4
- onClickService?: (serviceURL: string, layerName: string) => void;
5
- onRenderTree?: (service: serviceTypes.InitialService) => React.ReactNode;
6
- highlightedLayers?: [];
7
- preloadedServices?: serviceTypes.InitialService[];
8
- tooltip?: string;
9
- }
10
- declare const WMSLoader: React.FC<WMSLoaderProps>;
11
- export default WMSLoader;
@@ -1 +0,0 @@
1
- export {};
@@ -1,12 +0,0 @@
1
- import type { StoryObj } from '@storybook/react-webpack5';
2
- import React from 'react';
3
- import WMSLoader from './WMSLoader';
4
- declare const _default: {
5
- title: string;
6
- tags: string[];
7
- };
8
- export default _default;
9
- type Story = StoryObj<typeof WMSLoader>;
10
- export declare const DemoWMSLoad: React.FC;
11
- export declare const WMSLoaderLight: Story;
12
- export declare const WMSLoaderDark: Story;
@@ -1,21 +0,0 @@
1
- import React from 'react';
2
- import type { serviceTypes } from '@opengeoweb/store';
3
- import { LayerType } from '@opengeoweb/webmap';
4
- interface WMSLoaderConnectProps {
5
- mapId: string;
6
- preloadedServices?: serviceTypes.InitialService[];
7
- layerType?: LayerType;
8
- tooltip?: string;
9
- }
10
- /**
11
- * A pop-up allowing you to add new WMS sources which can then be displayed on the map.
12
- * A list of preconfigured sources can be given to the component which will always be availble to retrieve layers from
13
- *
14
- * Expects the following props:
15
- * @param {string} mapId mapId: string - Id of the map
16
- * @param {ServiceRefactorMe[]} [preloadedServices] **optional** preloadedServices: array of Service objects - contains an array of Service objects that are to be loaded as preconfigured WMS services
17
- * @example
18
- * ``` <WMSLoaderConnect mapId="mapid_1" preloadedServices = {preloadedServicesList} /> ```
19
- */
20
- declare const WMSLoaderConnect: React.FC<WMSLoaderConnectProps>;
21
- export default WMSLoaderConnect;