@opengeoweb/core 9.0.0 → 9.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.
package/index.esm.js CHANGED
@@ -1,16 +1,16 @@
1
1
  import * as React from 'react';
2
- import React__default, { useState, forwardRef, useContext, useEffect, useLayoutEffect, useRef } from 'react';
2
+ import React__default, { useState, useCallback, forwardRef, useContext, useRef, useEffect, useLayoutEffect } from 'react';
3
3
  import { Grid, Box as Box$2, MenuItem, Typography, useTheme as useTheme$2, Button, Popper, ListItemText, ListItemIcon, FormControl, InputLabel, Paper, List, ListItemButton, CircularProgress, ListSubheader, Dialog, DialogTitle, DialogContent, DialogContentText, TextField, InputAdornment, DialogActions, LinearProgress, styled as styled$1, Slider, Checkbox, Card, IconButton, Select, CardContent, RadioGroup, FormControlLabel, Radio, ToggleButtonGroup, ToggleButton, Divider, Tooltip, ButtonGroup } from '@mui/material';
4
4
  import { CustomIconButton, TooltipSelect, AlertIcon, useControlledTooltip, CustomTooltip, tooltipContainerStyles, sliderHeaderStyle, CustomSlider, ToggleMenu, AlertBanner, CustomAccordion, calculateStartSize, ToolContainerDraggable, dateUtils, withEggs } from '@opengeoweb/shared';
5
5
  import { LayerSelectButtonConnect, LayerInfoButton, LayerInfoButtonConnect, getUserAddedServices, layerSelectConfig } from '@opengeoweb/layer-select';
6
- import { CollapseSmall, CollapseMedium, CollapseLarge, CollapseWindow, ExpandWindow, Copy, None, FastForward, AutoUpdateActive, Both, Visibility, VisibilityOff, Delete, DragHandle as DragHandle$1, Cached, Add, MapAdd, WorldMapProjection, Layers, Equalizer, DimensionsElevation, Link, LinkOff, List as List$1, ExitDomain, Info, Search, Close, ChevronDown, ChevronUp, StepForward, StepBackward, Pause, Play, Options, ThemeWrapper, lightTheme } from '@opengeoweb/theme';
6
+ import { CollapseSmall, CollapseMedium, CollapseLarge, CollapseWindow, ExpandWindow, Copy, None, FastForward, AutoUpdateActive, Both, Visibility, VisibilityOff, Delete, DragHandle as DragHandle$1, Cached, Add, MapAdd, WorldMapProjection, Layers, Equalizer, DimensionsElevation, Link, LinkOff, List as List$1, ExitDomain, Info, Search, MyLocation, Close, ChevronDown, ChevronUp, StepForward, StepBackward, Pause, Play, Options, ThemeWrapper, lightTheme } from '@opengeoweb/theme';
7
7
  import { useDispatch, useSelector, connect, Provider } from 'react-redux';
8
8
  import { ReactSortable } from 'react-sortablejs';
9
9
  import { layerTypes, layerUtils, layerActions, layerSelectors, serviceSelectors, serviceActions, mapSelectors, mapActions, mapEnums, mapConstants, filterLayers, uiSelectors, uiTypes, useSetupDialog, uiActions, drawtoolSelectors, genericActions, syncConstants, defaultLayers, mapStoreActions, getSingularDrawtoolDrawLayerId, syncGroupsSelectors, syncGroupsSelector, coreModuleConfig, routerUtils, routerModuleConfig, appModuleConfig, appActions } from '@opengeoweb/store';
10
10
  import { WMGetServiceFromStore, getCapabilities, webmapUtils, LayerType, handleMomentISOString, WMLayer } from '@opengeoweb/webmap';
11
11
  import { jsx } from 'react/jsx-runtime';
12
12
  import _, { isEqual, range } from 'lodash';
13
- import { MapControlButton, ZoomControls, MapView, MapViewLayer, LegendDialog, SearchDialog, emptyGeoJSON, MapControls, publicLayers } from '@opengeoweb/webmap-react';
13
+ import { MapControlButton, ZoomControls, MapView, MapViewLayer, LegendDialog, registerDrawFunction, emptyGeoJSON, MapControls, publicLayers } from '@opengeoweb/webmap-react';
14
14
  import { TIME_SLIDER_LEGEND_HEIGHT, TimeSliderConnect, TimeSliderClockConnect, speedFactors } from '@opengeoweb/timeslider';
15
15
  import axios from 'axios';
16
16
  import { useDebounce } from '@opengeoweb/api';
@@ -3851,6 +3851,139 @@ _extends$3(Remove, {
3851
3851
  Sortable.mount(new AutoScrollPlugin());
3852
3852
  Sortable.mount(Remove, Revert);
3853
3853
 
3854
+ var DimensionSelectValue = function DimensionSelectValue(_ref) {
3855
+ var isEnabled = _ref.isEnabled,
3856
+ tooltip = _ref.tooltip,
3857
+ selectedDimension = _ref.selectedDimension,
3858
+ icon = _ref.icon,
3859
+ onLayerChangeDimension = _ref.onLayerChangeDimension,
3860
+ valueMappings = _ref.valueMappings,
3861
+ hideLatestDuplicate = _ref.hideLatestDuplicate,
3862
+ setUseLatestReferenceTime = _ref.setUseLatestReferenceTime,
3863
+ useLatestReferenceTime = _ref.useLatestReferenceTime;
3864
+ var _a;
3865
+ var dimensionValuesRaw = (_a = selectedDimension === null || selectedDimension === void 0 ? void 0 : selectedDimension.values) === null || _a === void 0 ? void 0 : _a.split(',').slice(0, 100).reverse();
3866
+ if (!(selectedDimension === null || selectedDimension === void 0 ? void 0 : selectedDimension.name) || !(dimensionValuesRaw === null || dimensionValuesRaw === void 0 ? void 0 : dimensionValuesRaw.length)) {
3867
+ return null;
3868
+ }
3869
+ var isReferenceTimeDimensionAndUseLatestIsAvailable = selectedDimension.name === 'reference_time' && useLatestReferenceTime !== undefined;
3870
+ var latestValue = hideLatestDuplicate && isReferenceTimeDimensionAndUseLatestIsAvailable ? dimensionValuesRaw.shift() : dimensionValuesRaw[0];
3871
+ var setDimensionValue = function setDimensionValue(dimensionValue) {
3872
+ if (isReferenceTimeDimensionAndUseLatestIsAvailable) {
3873
+ if (dimensionValue === 'Latest') {
3874
+ setUseLatestReferenceTime === null || setUseLatestReferenceTime === void 0 ? void 0 : setUseLatestReferenceTime(true);
3875
+ onLayerChangeDimension(selectedDimension.name, dimensionValuesRaw[0], layerTypes.LayerActionOrigin.layerManager);
3876
+ return;
3877
+ }
3878
+ setUseLatestReferenceTime === null || setUseLatestReferenceTime === void 0 ? void 0 : setUseLatestReferenceTime(false);
3879
+ }
3880
+ onLayerChangeDimension(selectedDimension.name, dimensionValue, layerTypes.LayerActionOrigin.layerManager);
3881
+ };
3882
+ var dimensionValues = isReferenceTimeDimensionAndUseLatestIsAvailable ? ['Latest'].concat(_toConsumableArray(dimensionValuesRaw)) : dimensionValuesRaw.slice(0, 100).reverse();
3883
+ var isLatest = isReferenceTimeDimensionAndUseLatestIsAvailable && useLatestReferenceTime && selectedDimension.maxValue === selectedDimension.currentValue;
3884
+ return /*#__PURE__*/React__default.createElement(TooltipSelect, {
3885
+ disableUnderline: true,
3886
+ tooltip: tooltip,
3887
+ isEnabled: isEnabled,
3888
+ value: isLatest ? 'Latest' : selectedDimension.currentValue,
3889
+ list: dimensionValues.map(function (dimensionValue) {
3890
+ return {
3891
+ value: dimensionValue
3892
+ };
3893
+ }),
3894
+ currentIndex: isLatest ? 0 : dimensionValues.findIndex(function (dimensionValue) {
3895
+ return dimensionValue === selectedDimension.currentValue;
3896
+ }),
3897
+ onChange: function onChange(event) {
3898
+ event.stopPropagation();
3899
+ setDimensionValue(event.target.value);
3900
+ },
3901
+ onChangeMouseWheel: function onChangeMouseWheel(event) {
3902
+ setDimensionValue(event.value);
3903
+ },
3904
+ style: {
3905
+ maxWidth: '50%'
3906
+ },
3907
+ IconComponent: icon
3908
+ }, /*#__PURE__*/React__default.createElement(MenuItem, {
3909
+ disabled: true
3910
+ }, "Dimension value (", dimensionValues.length, " options)"), dimensionValues.map(function (dimensionValue) {
3911
+ var _a;
3912
+ return /*#__PURE__*/React__default.createElement(MenuItem, {
3913
+ key: dimensionValue,
3914
+ value: dimensionValue
3915
+ }, ((_a = valueMappings === null || valueMappings === void 0 ? void 0 : valueMappings[selectedDimension.name]) === null || _a === void 0 ? void 0 : _a.call(valueMappings, dimensionValue, isReferenceTimeDimensionAndUseLatestIsAvailable ? latestValue : undefined)) || /*#__PURE__*/React__default.createElement("span", {
3916
+ style: {
3917
+ whiteSpace: 'nowrap'
3918
+ }
3919
+ }, dimensionValue, dimensionValue !== 'Latest' && /*#__PURE__*/React__default.createElement("i", null, " ", selectedDimension.units)));
3920
+ }));
3921
+ };
3922
+
3923
+ /* *
3924
+ * Licensed under the Apache License, Version 2.0 (the "License");
3925
+ * you may not use this file except in compliance with the License.
3926
+ * You may obtain a copy of the License at
3927
+ *
3928
+ * http://www.apache.org/licenses/LICENSE-2.0
3929
+ *
3930
+ * Unless required by applicable law or agreed to in writing, software
3931
+ * distributed under the License is distributed on an "AS IS" BASIS,
3932
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
3933
+ * See the License for the specific language governing permissions and
3934
+ * limitations under the License.
3935
+ *
3936
+ * Copyright 2023 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
3937
+ * Copyright 2023 - Finnish Meteorological Institute (FMI)
3938
+ * */
3939
+ var DimensionSelectName = function DimensionSelectName(_ref) {
3940
+ var selectedDimensionName = _ref.selectedDimensionName,
3941
+ setSelectedDimensionName = _ref.setSelectedDimensionName,
3942
+ icon = _ref.icon,
3943
+ nameMappings = _ref.nameMappings,
3944
+ tooltip = _ref.tooltip,
3945
+ isEnabled = _ref.isEnabled,
3946
+ dimensionNames = _ref.dimensionNames;
3947
+ return /*#__PURE__*/React__default.createElement(TooltipSelect, {
3948
+ disableUnderline: true,
3949
+ tooltip: tooltip,
3950
+ isEnabled: isEnabled,
3951
+ value: selectedDimensionName,
3952
+ list: dimensionNames.map(function (name) {
3953
+ return {
3954
+ value: name
3955
+ };
3956
+ }),
3957
+ currentIndex: dimensionNames.findIndex(function (name) {
3958
+ return name === selectedDimensionName;
3959
+ }),
3960
+ onChange: function onChange(event) {
3961
+ event.stopPropagation();
3962
+ setSelectedDimensionName(event.target.value);
3963
+ },
3964
+ onChangeMouseWheel: function onChangeMouseWheel(event) {
3965
+ setSelectedDimensionName(event.value);
3966
+ },
3967
+ style: {
3968
+ maxWidth: '50%'
3969
+ },
3970
+ IconComponent: icon
3971
+ }, /*#__PURE__*/React__default.createElement(MenuItem, {
3972
+ disabled: true
3973
+ }, "Dimension"), dimensionNames.map(function (name) {
3974
+ return /*#__PURE__*/React__default.createElement(MenuItem, {
3975
+ key: name,
3976
+ value: name
3977
+ }, (nameMappings === null || nameMappings === void 0 ? void 0 : nameMappings[name]) || name);
3978
+ }));
3979
+ };
3980
+
3981
+ var defaultDimensionNameTooltip = function defaultDimensionNameTooltip(selectedDimension) {
3982
+ return "Dimensions: ".concat(selectedDimension.name);
3983
+ };
3984
+ var defaultDimensionValueTooltip = function defaultDimensionValueTooltip(selectedDimension) {
3985
+ return "Dimensions: ".concat(selectedDimension.name, " ").concat(selectedDimension.currentValue, " ").concat(selectedDimension.units);
3986
+ };
3854
3987
  var DimensionSelect = function DimensionSelect(_ref) {
3855
3988
  var onLayerChangeDimension = _ref.onLayerChangeDimension,
3856
3989
  _ref$layerDimensions = _ref.layerDimensions,
@@ -3860,13 +3993,12 @@ var DimensionSelect = function DimensionSelect(_ref) {
3860
3993
  icon = _ref.icon,
3861
3994
  nameMappings = _ref.nameMappings,
3862
3995
  valueMappings = _ref.valueMappings,
3863
- _ref$tooltipPrefix = _ref.tooltipPrefix,
3864
- tooltipPrefix = _ref$tooltipPrefix === void 0 ? 'Dimensions: ' : _ref$tooltipPrefix,
3996
+ tooltipGenerator = _ref.tooltipGenerator,
3865
3997
  setUseLatestReferenceTime = _ref.setUseLatestReferenceTime,
3866
3998
  useLatestReferenceTime = _ref.useLatestReferenceTime,
3867
3999
  SingleValueComponent = _ref.SingleValueComponent,
3868
- latestLabel = _ref.latestLabel;
3869
- var _a, _b;
4000
+ hideLatestDuplicate = _ref.hideLatestDuplicate;
4001
+ var _a, _b, _c, _d, _e, _f;
3870
4002
  var _useState = useState((_a = layerDimensions === null || layerDimensions === void 0 ? void 0 : layerDimensions[0]) === null || _a === void 0 ? void 0 : _a.name),
3871
4003
  _useState2 = _slicedToArray(_useState, 2),
3872
4004
  selectedDimensionName = _useState2[0],
@@ -3889,6 +4021,10 @@ var DimensionSelect = function DimensionSelect(_ref) {
3889
4021
  }
3890
4022
  var collapseDimensionDropdown = SingleValueComponent && layerDimensions.length === 1;
3891
4023
  var collapseValueDropdown = SingleValueComponent && ((_b = selectedDimension === null || selectedDimension === void 0 ? void 0 : selectedDimension.values) === null || _b === void 0 ? void 0 : _b.length) === 1;
4024
+ var defaultNameTooltip = (_c = defaultDimensionNameTooltip(selectedDimension)) !== null && _c !== void 0 ? _c : '';
4025
+ var defaultValueTooltip = (_d = defaultDimensionValueTooltip(selectedDimension)) !== null && _d !== void 0 ? _d : '';
4026
+ var nameTooltip = (_e = tooltipGenerator === null || tooltipGenerator === void 0 ? void 0 : tooltipGenerator(selectedDimension)) !== null && _e !== void 0 ? _e : defaultNameTooltip;
4027
+ var valueTooltip = (_f = tooltipGenerator === null || tooltipGenerator === void 0 ? void 0 : tooltipGenerator(selectedDimension, true)) !== null && _f !== void 0 ? _f : defaultValueTooltip;
3892
4028
  return /*#__PURE__*/React.createElement(Grid, {
3893
4029
  container: true,
3894
4030
  direction: "row",
@@ -3901,11 +4037,11 @@ var DimensionSelect = function DimensionSelect(_ref) {
3901
4037
  nameMappings: nameMappings,
3902
4038
  valueMappings: valueMappings,
3903
4039
  position: "dimension"
3904
- })) : /*#__PURE__*/React.createElement(SelectDimension, {
4040
+ })) : /*#__PURE__*/React.createElement(DimensionSelectName, {
3905
4041
  selectedDimensionName: selectedDimensionName,
3906
4042
  setSelectedDimensionName: setSelectedDimensionName,
3907
4043
  dimensionNames: dimensionNames,
3908
- tooltipPrefix: tooltipPrefix,
4044
+ tooltip: nameTooltip,
3909
4045
  isEnabled: isEnabled,
3910
4046
  icon: icon,
3911
4047
  nameMappings: nameMappings
@@ -3913,127 +4049,18 @@ var DimensionSelect = function DimensionSelect(_ref) {
3913
4049
  nameMappings: nameMappings,
3914
4050
  valueMappings: valueMappings,
3915
4051
  position: "value"
3916
- })) : /*#__PURE__*/React.createElement(SelectDimensionValue, {
4052
+ })) : /*#__PURE__*/React.createElement(DimensionSelectValue, {
3917
4053
  selectedDimension: selectedDimension,
3918
4054
  onLayerChangeDimension: onLayerChangeDimension,
3919
- tooltipPrefix: tooltipPrefix,
4055
+ tooltip: valueTooltip,
3920
4056
  isEnabled: isEnabled,
4057
+ hideLatestDuplicate: hideLatestDuplicate,
3921
4058
  icon: icon,
3922
4059
  valueMappings: valueMappings,
3923
4060
  setUseLatestReferenceTime: setUseLatestReferenceTime,
3924
- useLatestReferenceTime: useLatestReferenceTime,
3925
- latestLabel: latestLabel
4061
+ useLatestReferenceTime: useLatestReferenceTime
3926
4062
  })));
3927
4063
  };
3928
- var SelectDimension = function SelectDimension(_ref2) {
3929
- var selectedDimensionName = _ref2.selectedDimensionName,
3930
- setSelectedDimensionName = _ref2.setSelectedDimensionName,
3931
- icon = _ref2.icon,
3932
- nameMappings = _ref2.nameMappings,
3933
- tooltipPrefix = _ref2.tooltipPrefix,
3934
- isEnabled = _ref2.isEnabled,
3935
- dimensionNames = _ref2.dimensionNames;
3936
- return /*#__PURE__*/React.createElement(TooltipSelect, {
3937
- disableUnderline: true,
3938
- tooltip: "".concat(tooltipPrefix).concat(selectedDimensionName),
3939
- isEnabled: isEnabled,
3940
- value: selectedDimensionName,
3941
- list: dimensionNames.map(function (name) {
3942
- return {
3943
- value: name
3944
- };
3945
- }),
3946
- currentIndex: dimensionNames.findIndex(function (name) {
3947
- return name === selectedDimensionName;
3948
- }),
3949
- onChange: function onChange(event) {
3950
- event.stopPropagation();
3951
- setSelectedDimensionName(event.target.value);
3952
- },
3953
- onChangeMouseWheel: function onChangeMouseWheel(event) {
3954
- setSelectedDimensionName(event.value);
3955
- },
3956
- style: {
3957
- maxWidth: '50%'
3958
- },
3959
- IconComponent: icon
3960
- }, /*#__PURE__*/React.createElement(MenuItem, {
3961
- disabled: true
3962
- }, "Dimension"), dimensionNames.map(function (name) {
3963
- return /*#__PURE__*/React.createElement(MenuItem, {
3964
- key: name,
3965
- value: name
3966
- }, (nameMappings === null || nameMappings === void 0 ? void 0 : nameMappings[name]) || name);
3967
- }));
3968
- };
3969
- var SelectDimensionValue = function SelectDimensionValue(_ref3) {
3970
- var isEnabled = _ref3.isEnabled,
3971
- tooltipPrefix = _ref3.tooltipPrefix,
3972
- selectedDimension = _ref3.selectedDimension,
3973
- icon = _ref3.icon,
3974
- onLayerChangeDimension = _ref3.onLayerChangeDimension,
3975
- valueMappings = _ref3.valueMappings,
3976
- setUseLatestReferenceTime = _ref3.setUseLatestReferenceTime,
3977
- useLatestReferenceTime = _ref3.useLatestReferenceTime,
3978
- _ref3$latestLabel = _ref3.latestLabel,
3979
- latestLabel = _ref3$latestLabel === void 0 ? 'Latest' : _ref3$latestLabel;
3980
- var _a;
3981
- var dimensionValuesRaw = (_a = selectedDimension === null || selectedDimension === void 0 ? void 0 : selectedDimension.values) === null || _a === void 0 ? void 0 : _a.split(',').slice(0, 100).reverse();
3982
- if (!(selectedDimension === null || selectedDimension === void 0 ? void 0 : selectedDimension.name) || !(dimensionValuesRaw === null || dimensionValuesRaw === void 0 ? void 0 : dimensionValuesRaw.length)) {
3983
- return null;
3984
- }
3985
- var isReferenceTimeDimensionAndUseLatestIsAvailable = selectedDimension.name === 'reference_time' && useLatestReferenceTime !== undefined;
3986
- var setDimensionValue = function setDimensionValue(dimensionValue) {
3987
- if (isReferenceTimeDimensionAndUseLatestIsAvailable) {
3988
- if (dimensionValue === latestLabel) {
3989
- setUseLatestReferenceTime === null || setUseLatestReferenceTime === void 0 ? void 0 : setUseLatestReferenceTime(true);
3990
- onLayerChangeDimension(selectedDimension.name, dimensionValuesRaw[0], layerTypes.LayerActionOrigin.layerManager);
3991
- return;
3992
- }
3993
- setUseLatestReferenceTime === null || setUseLatestReferenceTime === void 0 ? void 0 : setUseLatestReferenceTime(false);
3994
- }
3995
- onLayerChangeDimension(selectedDimension.name, dimensionValue, layerTypes.LayerActionOrigin.layerManager);
3996
- };
3997
- var dimensionValues = isReferenceTimeDimensionAndUseLatestIsAvailable ? [latestLabel].concat(_toConsumableArray(dimensionValuesRaw)) : dimensionValuesRaw.slice(0, 100).reverse();
3998
- var isLatest = isReferenceTimeDimensionAndUseLatestIsAvailable && useLatestReferenceTime && selectedDimension.maxValue === selectedDimension.currentValue;
3999
- return /*#__PURE__*/React.createElement(TooltipSelect, {
4000
- disableUnderline: true,
4001
- tooltip: "".concat(tooltipPrefix).concat(selectedDimension.name, " ").concat(selectedDimension.currentValue, " ").concat(selectedDimension.units),
4002
- isEnabled: isEnabled,
4003
- value: isLatest ? latestLabel : selectedDimension.currentValue,
4004
- list: dimensionValues.map(function (dimensionValue) {
4005
- return {
4006
- value: dimensionValue
4007
- };
4008
- }),
4009
- currentIndex: isLatest ? 0 : dimensionValues.findIndex(function (dimensionValue) {
4010
- return dimensionValue === selectedDimension.currentValue;
4011
- }),
4012
- onChange: function onChange(event) {
4013
- event.stopPropagation();
4014
- setDimensionValue(event.target.value);
4015
- },
4016
- onChangeMouseWheel: function onChangeMouseWheel(event) {
4017
- setDimensionValue(event.value);
4018
- },
4019
- style: {
4020
- maxWidth: '50%'
4021
- },
4022
- IconComponent: icon
4023
- }, /*#__PURE__*/React.createElement(MenuItem, {
4024
- disabled: true
4025
- }, "Dimension value (", dimensionValues.length, " options)"), dimensionValues.map(function (dimensionValue) {
4026
- var _a;
4027
- return /*#__PURE__*/React.createElement(MenuItem, {
4028
- key: dimensionValue,
4029
- value: dimensionValue
4030
- }, ((_a = valueMappings === null || valueMappings === void 0 ? void 0 : valueMappings[selectedDimension.name]) === null || _a === void 0 ? void 0 : _a.call(valueMappings, dimensionValue)) || /*#__PURE__*/React.createElement("span", {
4031
- style: {
4032
- whiteSpace: 'nowrap'
4033
- }
4034
- }, dimensionValue, dimensionValue !== latestLabel && /*#__PURE__*/React.createElement("i", null, " ", selectedDimension.units)));
4035
- }));
4036
- };
4037
4064
 
4038
4065
  var getRenderLayersValues = function getRenderLayersValues(layerName, layers) {
4039
4066
  var serviceLayer = layers.find(function (l) {
@@ -5253,8 +5280,8 @@ var OpacitySelectConnect = function OpacitySelectConnect(_ref) {
5253
5280
  * See the License for the specific language governing permissions and
5254
5281
  * limitations under the License.
5255
5282
  *
5256
- * Copyright 2021 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
5257
- * Copyright 2021 - Finnish Meteorological Institute (FMI)
5283
+ * Copyright 2023 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
5284
+ * Copyright 2023 - Finnish Meteorological Institute (FMI)
5258
5285
  * */
5259
5286
  var useLayerDimensions = function useLayerDimensions(layerId, mapId) {
5260
5287
  var dispatch = useDispatch();
@@ -5264,7 +5291,7 @@ var useLayerDimensions = function useLayerDimensions(layerId, mapId) {
5264
5291
  var isLayerEnabled = useSelector(function (store) {
5265
5292
  return layerSelectors.getLayerEnabled(store, layerId);
5266
5293
  });
5267
- var layerChangeDimension = React.useCallback(function (_ref) {
5294
+ var layerChangeDimension = useCallback(function (_ref) {
5268
5295
  var dimension = _ref.dimension,
5269
5296
  origin = _ref.origin;
5270
5297
  return dispatch(layerActions.layerChangeDimension({
@@ -5280,13 +5307,7 @@ var useLayerDimensions = function useLayerDimensions(layerId, mapId) {
5280
5307
  layerChangeDimension: layerChangeDimension
5281
5308
  };
5282
5309
  };
5283
- var DimensionSelectConnect = function DimensionSelectConnect(_ref2) {
5284
- var layerId = _ref2.layerId,
5285
- mapId = _ref2.mapId;
5286
- var _useLayerDimensions = useLayerDimensions(layerId, mapId),
5287
- layerDimensions = _useLayerDimensions.layerDimensions,
5288
- isLayerEnabled = _useLayerDimensions.isLayerEnabled,
5289
- layerChangeDimension = _useLayerDimensions.layerChangeDimension;
5310
+ var useReferenceTimeWithLatestOption = function useReferenceTimeWithLatestOption(layerId) {
5290
5311
  var useLatestReferenceTime = useSelector(function (store) {
5291
5312
  return layerSelectors.getUseLatestReferenceTime(store, layerId);
5292
5313
  });
@@ -5297,6 +5318,38 @@ var DimensionSelectConnect = function DimensionSelectConnect(_ref2) {
5297
5318
  useLatestReferenceTime: useLatestReferenceTime
5298
5319
  }));
5299
5320
  };
5321
+ return {
5322
+ useLatestReferenceTime: useLatestReferenceTime,
5323
+ setUseLatestReferenceTime: setUseLatestReferenceTime
5324
+ };
5325
+ };
5326
+
5327
+ /* *
5328
+ * Licensed under the Apache License, Version 2.0 (the "License");
5329
+ * you may not use this file except in compliance with the License.
5330
+ * You may obtain a copy of the License at
5331
+ *
5332
+ * http://www.apache.org/licenses/LICENSE-2.0
5333
+ *
5334
+ * Unless required by applicable law or agreed to in writing, software
5335
+ * distributed under the License is distributed on an "AS IS" BASIS,
5336
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
5337
+ * See the License for the specific language governing permissions and
5338
+ * limitations under the License.
5339
+ *
5340
+ * Copyright 2021 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
5341
+ * Copyright 2021 - Finnish Meteorological Institute (FMI)
5342
+ * */
5343
+ var DimensionSelectConnect = function DimensionSelectConnect(_ref) {
5344
+ var layerId = _ref.layerId,
5345
+ mapId = _ref.mapId;
5346
+ var _useLayerDimensions = useLayerDimensions(layerId, mapId),
5347
+ layerDimensions = _useLayerDimensions.layerDimensions,
5348
+ isLayerEnabled = _useLayerDimensions.isLayerEnabled,
5349
+ layerChangeDimension = _useLayerDimensions.layerChangeDimension;
5350
+ var _useReferenceTimeWith = useReferenceTimeWithLatestOption(layerId),
5351
+ useLatestReferenceTime = _useReferenceTimeWith.useLatestReferenceTime,
5352
+ setUseLatestReferenceTime = _useReferenceTimeWith.setUseLatestReferenceTime;
5300
5353
  if (!layerDimensions.length || !layerId) {
5301
5354
  return null;
5302
5355
  }
@@ -10541,12 +10594,14 @@ var CustomDimensionSelectConnect = function CustomDimensionSelectConnect(_a) {
10541
10594
  var layerId = _a.layerId,
10542
10595
  mapId = _a.mapId,
10543
10596
  dimensionsToShow = _a.dimensionsToShow,
10544
- SingleValueComponent = _a.SingleValueComponent,
10545
- props = __rest(_a, ["layerId", "mapId", "dimensionsToShow", "SingleValueComponent"]);
10597
+ props = __rest(_a, ["layerId", "mapId", "dimensionsToShow"]);
10546
10598
  var _useLayerDimensions = useLayerDimensions(layerId, mapId),
10547
10599
  layerDimensions = _useLayerDimensions.layerDimensions,
10548
10600
  isLayerEnabled = _useLayerDimensions.isLayerEnabled,
10549
10601
  layerChangeDimension = _useLayerDimensions.layerChangeDimension;
10602
+ var _useReferenceTimeWith = useReferenceTimeWithLatestOption(layerId),
10603
+ useLatestReferenceTime = _useReferenceTimeWith.useLatestReferenceTime,
10604
+ setUseLatestReferenceTime = _useReferenceTimeWith.setUseLatestReferenceTime;
10550
10605
  var filteredDimensions = dimensionsToShow ? dimensionsToShow.map(function (dimensionName) {
10551
10606
  return layerDimensions.find(function (dimension) {
10552
10607
  return dimension.name === dimensionName;
@@ -10554,7 +10609,6 @@ var CustomDimensionSelectConnect = function CustomDimensionSelectConnect(_a) {
10554
10609
  }).filter(Boolean) : layerDimensions;
10555
10610
  return /*#__PURE__*/React.createElement(DimensionSelect, Object.assign({
10556
10611
  layerDimensions: filteredDimensions,
10557
- SingleValueComponent: SingleValueComponent,
10558
10612
  onLayerChangeDimension: function onLayerChangeDimension(dimensionName, dimensionValue, origin) {
10559
10613
  var dimension = {
10560
10614
  name: dimensionName,
@@ -10565,7 +10619,9 @@ var CustomDimensionSelectConnect = function CustomDimensionSelectConnect(_a) {
10565
10619
  origin: origin
10566
10620
  });
10567
10621
  },
10568
- isEnabled: isLayerEnabled
10622
+ isEnabled: isLayerEnabled,
10623
+ useLatestReferenceTime: useLatestReferenceTime,
10624
+ setUseLatestReferenceTime: setUseLatestReferenceTime
10569
10625
  }, props));
10570
10626
  };
10571
10627
 
@@ -11365,19 +11421,31 @@ var filterServices = function filterServices(presetArray) {
11365
11421
  var services = hasValidServices ? validServices : undefined;
11366
11422
  return services;
11367
11423
  };
11424
+ var filterTimeSeriesServices = function filterTimeSeriesServices(presetArray) {
11425
+ var hasServices = presetArray && Array.isArray(presetArray) && presetArray.length > 0;
11426
+ var validServices = hasServices ? presetArray.filter(function (preset) {
11427
+ return isValidService(preset);
11428
+ }) : null;
11429
+ var hasValidServices = validServices && validServices.length > 0;
11430
+ var services = hasValidServices ? validServices : undefined;
11431
+ return services;
11432
+ };
11368
11433
  var filterMapPresets = function filterMapPresets(initialAppPreset) {
11369
11434
  var preset = initialAppPreset && initialAppPreset.preset || {};
11370
11435
  var layers = preset.layers,
11371
11436
  services = preset.services,
11372
- baseServices = preset.baseServices;
11437
+ baseServices = preset.baseServices,
11438
+ timeSeriesServices = preset.timeSeriesServices;
11373
11439
  var _ref = layers ? filterLayers.filterLayers(layers, filterLayers.parseLayer) : filterLayers.createEmtpyFilteredList(undefined),
11374
11440
  baseLayers = _ref.baseLayers,
11375
11441
  mapLayers = _ref.mapLayers;
11376
11442
  var filterredServices = services ? filterServices(services) : undefined;
11377
11443
  var filteredBaseServices = baseServices ? filterServices(baseServices) : undefined;
11444
+ var filteredTimeSeriesServices = timeSeriesServices ? filterTimeSeriesServices(timeSeriesServices) : undefined;
11378
11445
  var filteredPreset = {
11379
11446
  services: filterredServices,
11380
11447
  baseServices: filteredBaseServices,
11448
+ timeSeriesServices: filteredTimeSeriesServices,
11381
11449
  baseLayers: baseLayers,
11382
11450
  mapLayers: mapLayers
11383
11451
  };
@@ -11388,6 +11456,32 @@ var preset = {
11388
11456
  presetType: "mapPreset",
11389
11457
  presetId: "mapPreset-1",
11390
11458
  presetName: "Layer manager preset",
11459
+ timeSeriesServices: [
11460
+ {
11461
+ name: "KNMI",
11462
+ url: "https://gw-edr-dev-add-cfn.pub.dev.knmi.cloud/edr",
11463
+ id: "knmi",
11464
+ description: "KNMI EDR",
11465
+ type: "EDR",
11466
+ scope: "system"
11467
+ },
11468
+ {
11469
+ name: "FMI",
11470
+ url: "https://opendata.fmi.fi/edr",
11471
+ id: "fmi",
11472
+ description: "FMI EDR",
11473
+ type: "EDR",
11474
+ scope: "system"
11475
+ },
11476
+ {
11477
+ name: "MET Norway",
11478
+ url: "https://interpol-b.met.no",
11479
+ id: "METNorway",
11480
+ description: "MET Norway EDR",
11481
+ type: "EDR",
11482
+ scope: "system"
11483
+ }
11484
+ ],
11391
11485
  services: [
11392
11486
  {
11393
11487
  name: "KNMIgeoservicesRadar",
@@ -13679,7 +13773,7 @@ var getLayersToUpdate = function getLayersToUpdate(layers, mapId) {
13679
13773
  });
13680
13774
  return {
13681
13775
  layerId: layer.id,
13682
- url: wmjsMap.getWMSGetFeatureInfoRequestURL(wmjsLayer, "".concat(wmjsMap.getMapPin().getXY().x), "".concat(wmjsMap.getMapPin().getXY().y), 'text/html'),
13776
+ url: wmjsMap.getWMSGetFeatureInfoRequestURL(wmjsLayer, wmjsMap.getMapPin().getXY().x, wmjsMap.getMapPin().getXY().y, 'text/html'),
13683
13777
  title: getTitle$1(layer.id)
13684
13778
  };
13685
13779
  });
@@ -15707,10 +15801,178 @@ var SearchControlButtonConnect = function SearchControlButtonConnect(_ref) {
15707
15801
  return /*#__PURE__*/React__default.createElement(MapControlButton, {
15708
15802
  onClick: openSearchDialog,
15709
15803
  title: "Search",
15710
- "aria-label": "Map search"
15804
+ "aria-label": "Map search",
15805
+ isActive: isOpenInStore
15711
15806
  }, /*#__PURE__*/React__default.createElement(Search, null));
15712
15807
  };
15713
15808
 
15809
+ /* *
15810
+ * Licensed under the Apache License, Version 2.0 (the "License");
15811
+ * you may not use this file except in compliance with the License.
15812
+ * You may obtain a copy of the License at
15813
+ *
15814
+ * http://www.apache.org/licenses/LICENSE-2.0
15815
+ *
15816
+ * Unless required by applicable law or agreed to in writing, software
15817
+ * distributed under the License is distributed on an "AS IS" BASIS,
15818
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15819
+ * See the License for the specific language governing permissions and
15820
+ * limitations under the License.
15821
+ *
15822
+ * Copyright 2023 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
15823
+ * Copyright 2023 - Finnish Meteorological Institute (FMI)
15824
+ * */
15825
+ var MY_LOCATION = 'MyLocation';
15826
+ var locationOptions = {
15827
+ enableHighAccuracy: true,
15828
+ timeout: 5000,
15829
+ maximumAge: 0
15830
+ };
15831
+ var circleDrawFunction = function circleDrawFunction(args) {
15832
+ var fillColor = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '#88F';
15833
+ var radius = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 12;
15834
+ var ctx = args.context,
15835
+ coord = args.coord;
15836
+ ctx.strokeStyle = '#000';
15837
+ ctx.fillStyle = fillColor || '#88F';
15838
+ ctx.lineWidth = 1;
15839
+ ctx.beginPath();
15840
+ ctx.arc(coord.x, coord.y, radius || 10, 0, 2 * Math.PI);
15841
+ ctx.fill();
15842
+ ctx.stroke();
15843
+ ctx.fillStyle = '#000';
15844
+ ctx.beginPath();
15845
+ ctx.arc(coord.x, coord.y, 2, 0, 2 * Math.PI);
15846
+ ctx.fill();
15847
+ };
15848
+ var MyMapLocation = function MyMapLocation(_ref) {
15849
+ var mapId = _ref.mapId;
15850
+ var dispatch = useDispatch();
15851
+ var layersBelongsToCurrentMapId = useSelector(function (store) {
15852
+ return layerSelectors.getLayersByMapId(store, mapId || '');
15853
+ });
15854
+ var layerLocation = layersBelongsToCurrentMapId.find(function (layer) {
15855
+ var _a;
15856
+ if (layer.geojson && layer.geojson.features[0] && layer.geojson.features[0].properties && ((_a = layer.geojson.features[0].properties) === null || _a === void 0 ? void 0 : _a.name)) {
15857
+ if (layer.geojson.features[0].properties.name === MY_LOCATION) {
15858
+ return layer;
15859
+ }
15860
+ }
15861
+ return undefined;
15862
+ });
15863
+ var layerLocationId = (layerLocation === null || layerLocation === void 0 ? void 0 : layerLocation.id) || '';
15864
+ var circleDrawFunctionId = useRef(registerDrawFunction(circleDrawFunction));
15865
+ var handleLocationClick = function handleLocationClick() {
15866
+ if (mapId && layerLocationId !== '') {
15867
+ dispatch(layerActions.layerDelete({
15868
+ mapId: mapId,
15869
+ layerIndex: 0,
15870
+ layerId: layerLocationId
15871
+ }));
15872
+ } else if (navigator.geolocation && mapId && layerLocationId === '' && circleDrawFunctionId) {
15873
+ navigator.geolocation.getCurrentPosition(function (success) {
15874
+ var _success$coords = success.coords,
15875
+ latitude = _success$coords.latitude,
15876
+ longitude = _success$coords.longitude;
15877
+ var geojson = {
15878
+ type: 'FeatureCollection',
15879
+ features: [{
15880
+ type: 'Feature',
15881
+ properties: {
15882
+ name: MY_LOCATION,
15883
+ drawFunctionId: circleDrawFunctionId.current
15884
+ },
15885
+ geometry: {
15886
+ type: 'Point',
15887
+ coordinates: [longitude, latitude]
15888
+ }
15889
+ }]
15890
+ };
15891
+ var layerId = webmapUtils.generateLayerId();
15892
+ dispatch(layerActions.addLayer({
15893
+ mapId: mapId,
15894
+ layer: {
15895
+ geojson: geojson,
15896
+ layerType: LayerType.featureLayer
15897
+ },
15898
+ layerId: layerId,
15899
+ origin: MY_LOCATION
15900
+ }));
15901
+ var wmjsMap = webmapUtils.getWMJSMapById(mapId);
15902
+ if (!wmjsMap) {
15903
+ return;
15904
+ }
15905
+ wmjsMap.calculateBoundingBoxAndZoom(latitude, longitude);
15906
+ }, function (error) {
15907
+ console.warn("Geolocation error: ".concat(error.message));
15908
+ }, locationOptions);
15909
+ }
15910
+ };
15911
+ return /*#__PURE__*/React__default.createElement(CustomIconButton, {
15912
+ title: "Find my location",
15913
+ "aria-label": MY_LOCATION,
15914
+ onClick: handleLocationClick,
15915
+ isSelected: layerLocationId !== '',
15916
+ size: "large"
15917
+ }, /*#__PURE__*/React__default.createElement(MyLocation, null));
15918
+ };
15919
+
15920
+ /* *
15921
+ * Licensed under the Apache License, Version 2.0 (the "License");
15922
+ * you may not use this file except in compliance with the License.
15923
+ * You may obtain a copy of the License at
15924
+ *
15925
+ * http://www.apache.org/licenses/LICENSE-2.0
15926
+ *
15927
+ * Unless required by applicable law or agreed to in writing, software
15928
+ * distributed under the License is distributed on an "AS IS" BASIS,
15929
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15930
+ * See the License for the specific language governing permissions and
15931
+ * limitations under the License.
15932
+ *
15933
+ * Copyright 2023 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
15934
+ * Copyright 2023 - Finnish Meteorological Institute (FMI)
15935
+ * */
15936
+ var SearchDialog = function SearchDialog(_ref) {
15937
+ var isOpen = _ref.isOpen,
15938
+ onClose = _ref.onClose,
15939
+ _ref$mapId = _ref.mapId,
15940
+ mapId = _ref$mapId === void 0 ? '' : _ref$mapId;
15941
+ return isOpen && mapId ? /*#__PURE__*/React__default.createElement(Box$1, {
15942
+ sx: {
15943
+ display: 'flex',
15944
+ flexDirection: 'row',
15945
+ alignItems: 'center',
15946
+ position: 'absolute',
15947
+ pointerEvents: 'all',
15948
+ zIndex: 999,
15949
+ left: 50,
15950
+ top: 15,
15951
+ borderBottom: '1px solid grey',
15952
+ backgroundColor: function backgroundColor(theme) {
15953
+ return theme.palette.background.paper;
15954
+ }
15955
+ }
15956
+ }, /*#__PURE__*/React__default.createElement(MyMapLocation, {
15957
+ mapId: mapId
15958
+ }), /*#__PURE__*/React__default.createElement(TextField, {
15959
+ id: "dummy-search-field",
15960
+ label: "Search",
15961
+ variant: "filled",
15962
+ InputProps: {
15963
+ disableUnderline: true,
15964
+ endAdornment: /*#__PURE__*/React__default.createElement(InputAdornment, {
15965
+ position: "end"
15966
+ }, /*#__PURE__*/React__default.createElement(CustomIconButton, {
15967
+ tooltipTitle: "Close",
15968
+ edge: "end",
15969
+ onClick: onClose,
15970
+ size: "large"
15971
+ }, /*#__PURE__*/React__default.createElement(Close, null)))
15972
+ }
15973
+ })) : null;
15974
+ };
15975
+
15714
15976
  /* *
15715
15977
  * Licensed under the Apache License, Version 2.0 (the "License");
15716
15978
  * you may not use this file except in compliance with the License.
@@ -15735,7 +15997,8 @@ var SearchControlConnect = function SearchControlConnect(_ref) {
15735
15997
  onCloseDialog = _useSetupDialog.onCloseDialog;
15736
15998
  return /*#__PURE__*/React__default.createElement(SearchDialog, {
15737
15999
  isOpen: isDialogOpen,
15738
- onClose: onCloseDialog
16000
+ onClose: onCloseDialog,
16001
+ mapId: mapId
15739
16002
  });
15740
16003
  };
15741
16004
 
@@ -15996,6 +16259,9 @@ var MultiMapViewConnect = function MultiMapViewConnect(_ref) {
15996
16259
  width: "".concat(Math.round(100 / cols), "%"),
15997
16260
  height: "".concat(Math.round(100 / rows), "%")
15998
16261
  };
16262
+ if (maps.length === 0) {
16263
+ return null;
16264
+ }
15999
16265
  var firstMapId = maps[0].id;
16000
16266
  return /*#__PURE__*/React__default.createElement("div", {
16001
16267
  style: {
@@ -16727,13 +16993,22 @@ var reformatFinnishDateString = function reformatFinnishDateString(dateString) {
16727
16993
  };
16728
16994
  /**
16729
16995
  * Marks UTC time with Z after hh:mm or hh.mm or appends UTC to the end of the date string
16996
+ * If two matches of time are found, the second one is marked
16730
16997
  */
16731
16998
  var shortUTCTime = function shortUTCTime(dateString) {
16732
- var result = dateString.replace(/(\d[:.]\d{2})/, '$1Z');
16733
- if (result === dateString) {
16999
+ var timeRegex = /(\d[:.]\d{2})/g;
17000
+ var match = dateString.match(timeRegex);
17001
+ if (!match) {
16734
17002
  return "".concat(dateString, " UTC");
16735
17003
  }
16736
- return result;
17004
+ var _match = _slicedToArray(match, 2),
17005
+ first = _match[0],
17006
+ second = _match[1];
17007
+ if (second) {
17008
+ var secondIndex = dateString.lastIndexOf(second);
17009
+ return "".concat(dateString.substring(0, secondIndex)).concat(second, "Z").concat(dateString.substring(secondIndex + second.length));
17010
+ }
17011
+ return dateString.replace(first, "".concat(first, "Z"));
16737
17012
  };
16738
17013
  var getMonthChanges = function getMonthChanges(startDate, endDate) {
16739
17014
  var result = [];
@@ -17802,6 +18077,8 @@ var ControlButtonGroup = function ControlButtonGroup(_a) {
17802
18077
  }), children);
17803
18078
  };
17804
18079
 
18080
+ var OBSERVED_PADDING_DAYS = 1;
18081
+ var FORECAST_PADDING_DAYS = OBSERVED_PADDING_DAYS + 2;
17805
18082
  var TICK_HEIGHT = 6;
17806
18083
  var HOUR_LABEL_OFFSET = 1.5;
17807
18084
  var MONTH_LABEL_BREAKPOINT = 65;
@@ -17847,8 +18124,8 @@ var TimeSliderLiteBackgroundSvg = function TimeSliderLiteBackgroundSvg(_ref) {
17847
18124
  var showHourLabelEveryThirdHour = limitHourLabelsToEveryThirdHour || tickSpacing < HOUR_LABEL_EVERY_THIRD_HOUR_BREAKPOINT;
17848
18125
  // Set up variables for date labels and background colors
17849
18126
  var dayLabels = [];
17850
- var dayLabelDate = new Date(startTime * SECOND_TO_MILLISECOND);
17851
- var lastDayLabelDate = new Date(endDate.getTime() + 2 * DAY_TO_MILLISECOND); // Append two more days
18127
+ var dayLabelDate = new Date(startTime * SECOND_TO_MILLISECOND - OBSERVED_PADDING_DAYS * DAY_TO_MILLISECOND);
18128
+ var lastDayLabelDate = new Date(endDate.getTime() + FORECAST_PADDING_DAYS * DAY_TO_MILLISECOND);
17852
18129
  while (dayLabelDate < lastDayLabelDate) {
17853
18130
  var dateString = dayLabelDate.toLocaleDateString(locale, {
17854
18131
  weekday: 'short',
@@ -17880,12 +18157,12 @@ var TimeSliderLiteBackgroundSvg = function TimeSliderLiteBackgroundSvg(_ref) {
17880
18157
  }
17881
18158
  }, label);
17882
18159
  }) : null;
17883
- var currentDayIndex = (currentTime - startTime) * SECOND_TO_DAY + startTimeDayOffset;
18160
+ var currentDayIndex = (currentTime - startTime) * SECOND_TO_DAY + startTimeDayOffset + OBSERVED_PADDING_DAYS;
17884
18161
  var backgroundRectangles = dayLabels.map(function (label, index) {
17885
- var observedColor = index % 2 === 0 ? timeSliderLite.timelineBackgroundObservedAlternative.fill : timeSliderLite.timelineBackgroundObserved.fill;
17886
- var forecastColor = index % 2 === 0 ? timeSliderLite.timelineBackground.fill : timeSliderLite.timelineBackgroundAlternative.fill;
18162
+ var observedColor = index % 2 === 0 ? timeSliderLite.timelineBackgroundObserved.fill : timeSliderLite.timelineBackgroundObservedAlternative.fill;
18163
+ var forecastColor = index % 2 === 0 ? timeSliderLite.timelineBackgroundAlternative.fill : timeSliderLite.timelineBackground.fill;
17887
18164
  var defaultProps = {
17888
- x: Math.floor(index * tickSpacing - tickOffset),
18165
+ x: Math.floor((index - OBSERVED_PADDING_DAYS) * tickSpacing - tickOffset),
17889
18166
  y: 0,
17890
18167
  height: height
17891
18168
  };
@@ -17908,7 +18185,7 @@ var TimeSliderLiteBackgroundSvg = function TimeSliderLiteBackgroundSvg(_ref) {
17908
18185
  }).flat();
17909
18186
  var dailyLabels = !showMonthLabel ? dayLabels.map(function (label, index) {
17910
18187
  return /*#__PURE__*/React__default.createElement("text", {
17911
- x: index * tickSpacing + 8 - tickOffset,
18188
+ x: (index - OBSERVED_PADDING_DAYS) * tickSpacing + 8 - tickOffset,
17912
18189
  y: 14,
17913
18190
  fill: timeSliderLite.timeline.fill,
17914
18191
  textAnchor: "left",
@@ -17925,7 +18202,7 @@ var TimeSliderLiteBackgroundSvg = function TimeSliderLiteBackgroundSvg(_ref) {
17925
18202
  length: hourLabelsPerDay
17926
18203
  }, function (_, value) {
17927
18204
  var defaultProps = {
17928
- x: index * tickSpacing + value * (tickSpacing / hourLabelsPerDay) - tickOffset - HOUR_LABEL_OFFSET,
18205
+ x: (index - OBSERVED_PADDING_DAYS) * tickSpacing + value * (tickSpacing / hourLabelsPerDay) - tickOffset - HOUR_LABEL_OFFSET,
17929
18206
  y: height - 10,
17930
18207
  visibility: showHourLabelEveryThirdHour && value % 3 !== 0 ? 'hidden' : 'visible',
17931
18208
  fill: timeSliderLite.timeline.fill,
@@ -17961,8 +18238,8 @@ var TimeSliderLiteBackgroundSvg = function TimeSliderLiteBackgroundSvg(_ref) {
17961
18238
  length: Math.floor(observedTicksPerDay * (currentDayIndex - index)) + 1
17962
18239
  }, function (_, value) {
17963
18240
  return /*#__PURE__*/React__default.createElement("line", Object.assign({}, defaultProps, {
17964
- x1: index * tickSpacing + value * (tickSpacing / observedTicksPerDay) - tickOffset,
17965
- x2: index * tickSpacing + value * (tickSpacing / observedTicksPerDay) - tickOffset,
18241
+ x1: (index - OBSERVED_PADDING_DAYS) * tickSpacing + value * (tickSpacing / observedTicksPerDay) - tickOffset,
18242
+ x2: (index - OBSERVED_PADDING_DAYS) * tickSpacing + value * (tickSpacing / observedTicksPerDay) - tickOffset,
17966
18243
  key: "".concat(label, "-").concat(value, "-observed-tick")
17967
18244
  }));
17968
18245
  });
@@ -17970,8 +18247,8 @@ var TimeSliderLiteBackgroundSvg = function TimeSliderLiteBackgroundSvg(_ref) {
17970
18247
  length: Math.floor(forecastTicksPerDay * (1 - (currentDayIndex - index))) + 1
17971
18248
  }, function (_, value) {
17972
18249
  return /*#__PURE__*/React__default.createElement("line", Object.assign({}, defaultProps, {
17973
- x1: (index + 1) * tickSpacing - value * (tickSpacing / forecastTicksPerDay) - tickOffset,
17974
- x2: (index + 1) * tickSpacing - value * (tickSpacing / forecastTicksPerDay) - tickOffset,
18250
+ x1: (index + 1 - OBSERVED_PADDING_DAYS) * tickSpacing - value * (tickSpacing / forecastTicksPerDay) - tickOffset,
18251
+ x2: (index + 1 - OBSERVED_PADDING_DAYS) * tickSpacing - value * (tickSpacing / forecastTicksPerDay) - tickOffset,
17975
18252
  key: "".concat(label, "-").concat(value, "-forecast-tick")
17976
18253
  }));
17977
18254
  });
@@ -17981,8 +18258,8 @@ var TimeSliderLiteBackgroundSvg = function TimeSliderLiteBackgroundSvg(_ref) {
17981
18258
  length: ticksPerDay + 1
17982
18259
  }, function (_, value) {
17983
18260
  return /*#__PURE__*/React__default.createElement("line", Object.assign({}, defaultProps, {
17984
- x1: index * tickSpacing + value * (tickSpacing / ticksPerDay) - tickOffset,
17985
- x2: index * tickSpacing + value * (tickSpacing / ticksPerDay) - tickOffset,
18261
+ x1: (index - OBSERVED_PADDING_DAYS) * tickSpacing + value * (tickSpacing / ticksPerDay) - tickOffset,
18262
+ x2: (index - OBSERVED_PADDING_DAYS) * tickSpacing + value * (tickSpacing / ticksPerDay) - tickOffset,
17986
18263
  key: "".concat(label, "-").concat(value, "-tick")
17987
18264
  }));
17988
18265
  });
@@ -18250,6 +18527,8 @@ var TimeSliderLiteBackground = function TimeSliderLiteBackground(_ref) {
18250
18527
  timeStep = _ref.timeStep,
18251
18528
  selectedTime = _ref.selectedTime,
18252
18529
  setSelectedTime = _ref.setSelectedTime;
18530
+ var _useTheme = useTheme$2(),
18531
+ timeSliderLite = _useTheme.palette.geowebColors.timeSliderLite;
18253
18532
  var sliderAreaRef = useRef(null);
18254
18533
  var _React$useState = React__default.useState(0),
18255
18534
  _React$useState2 = _slicedToArray(_React$useState, 2),
@@ -18273,7 +18552,8 @@ var TimeSliderLiteBackground = function TimeSliderLiteBackground(_ref) {
18273
18552
  position: 'relative',
18274
18553
  height: "".concat(height, "px"),
18275
18554
  overflow: 'hidden',
18276
- width: '100%'
18555
+ width: '100%',
18556
+ backgroundColor: timeSliderLite.timelineBackgroundObserved.fill
18277
18557
  },
18278
18558
  "data-testid": "TimeSliderLite-Background"
18279
18559
  }, /*#__PURE__*/React__default.createElement(TimeSliderLiteBackgroundSvg, {
@@ -18647,6 +18927,58 @@ var TimeSliderLite = function TimeSliderLite(_ref) {
18647
18927
  }))));
18648
18928
  };
18649
18929
 
18930
+ /* *
18931
+ * Licensed under the Apache License, Version 2.0 (the "License");
18932
+ * you may not use this file except in compliance with the License.
18933
+ * You may obtain a copy of the License at
18934
+ *
18935
+ * http://www.apache.org/licenses/LICENSE-2.0
18936
+ *
18937
+ * Unless required by applicable law or agreed to in writing, software
18938
+ * distributed under the License is distributed on an "AS IS" BASIS,
18939
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18940
+ * See the License for the specific language governing permissions and
18941
+ * limitations under the License.
18942
+ *
18943
+ * Copyright 2023 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
18944
+ * Copyright 2023 - Finnish Meteorological Institute (FMI)
18945
+ * */
18946
+ var useOnToggleAnimation = function useOnToggleAnimation(dispatch, mapId, selectedTime, timeStep, defaultTimeStep, startTime, endTime, isAnimating, timeSliderProps) {
18947
+ var startMapAnimation = function startMapAnimation() {
18948
+ var _a, _b, _c;
18949
+ var observedTimeStep = (_a = timeStep === null || timeStep === void 0 ? void 0 : timeStep[0]) !== null && _a !== void 0 ? _a : defaultTimeStep[0];
18950
+ var forecastTimeStep = (_b = timeStep === null || timeStep === void 0 ? void 0 : timeStep[1]) !== null && _b !== void 0 ? _b : defaultTimeStep[1];
18951
+ var floorCorrectedTimeStart = floorLocalSeconds(startTime, HOUR_TO_SECOND);
18952
+ var floorCorrectedEndTime = floorLocalSeconds(endTime, HOUR_TO_SECOND);
18953
+ var timeList = generateCustomTimeList((_c = timeSliderProps.currentTime) !== null && _c !== void 0 ? _c : Date.now() * MILLISECOND_TO_SECOND, floorCorrectedTimeStart, floorCorrectedEndTime, [observedTimeStep, forecastTimeStep]);
18954
+ dispatch(mapActions.mapStartAnimation({
18955
+ mapId: mapId,
18956
+ initialTime: new Date(selectedTime * SECOND_TO_MILLISECOND).toISOString(),
18957
+ timeList: timeList,
18958
+ origin: mapEnums.MapActionOrigin.map
18959
+ }));
18960
+ };
18961
+ var onToggleAnimation = function onToggleAnimation() {
18962
+ if (isAnimating) {
18963
+ dispatch(mapActions.mapStopAnimation({
18964
+ mapId: mapId,
18965
+ origin: mapEnums.MapActionOrigin.map
18966
+ }));
18967
+ } else {
18968
+ startMapAnimation();
18969
+ }
18970
+ };
18971
+ React__default.useEffect(function () {
18972
+ var hasTimeRange = startTime && endTime && selectedTime;
18973
+ var isInvalidAnimation = selectedTime < startTime || selectedTime > endTime;
18974
+ if (hasTimeRange && isInvalidAnimation && isAnimating) {
18975
+ startMapAnimation();
18976
+ }
18977
+ // eslint-disable-next-line react-hooks/exhaustive-deps
18978
+ }, [selectedTime, startTime, endTime]);
18979
+ return onToggleAnimation;
18980
+ };
18981
+
18650
18982
  var TimeSliderLiteConnect = function TimeSliderLiteConnect(_a) {
18651
18983
  var _b, _c, _d, _e, _f, _g;
18652
18984
  var overrideUseTimeRange = _a.overrideUseTimeRange,
@@ -18719,27 +19051,7 @@ var TimeSliderLiteConnect = function TimeSliderLiteConnect(_a) {
18719
19051
  var selectedTime = useSelector(function (store) {
18720
19052
  return mapSelectors.getSelectedTime(store, mapId);
18721
19053
  });
18722
- var onToggleAnimation = function onToggleAnimation() {
18723
- var _a, _b, _c;
18724
- if (isAnimating) {
18725
- dispatch(mapActions.mapStopAnimation({
18726
- mapId: mapId,
18727
- origin: mapEnums.MapActionOrigin.map
18728
- }));
18729
- } else {
18730
- var observedTimeStep = (_a = timeStep === null || timeStep === void 0 ? void 0 : timeStep[0]) !== null && _a !== void 0 ? _a : defaultTimeStep[0];
18731
- var forecastTimeStep = (_b = timeStep === null || timeStep === void 0 ? void 0 : timeStep[1]) !== null && _b !== void 0 ? _b : defaultTimeStep[1];
18732
- var floorCorrectedTimeStart = floorLocalSeconds(startTime, HOUR_TO_SECOND);
18733
- var floorCorrectedEndTime = floorLocalSeconds(endTime, HOUR_TO_SECOND);
18734
- var timeList = generateCustomTimeList((_c = timeSliderProps.currentTime) !== null && _c !== void 0 ? _c : Date.now() * MILLISECOND_TO_SECOND, floorCorrectedTimeStart, floorCorrectedEndTime, [observedTimeStep, forecastTimeStep]);
18735
- dispatch(mapActions.mapStartAnimation({
18736
- mapId: mapId,
18737
- initialTime: new Date(selectedTime * SECOND_TO_MILLISECOND).toISOString(),
18738
- timeList: timeList,
18739
- origin: mapEnums.MapActionOrigin.map
18740
- }));
18741
- }
18742
- };
19054
+ var onToggleAnimation = useOnToggleAnimation(dispatch, mapId, selectedTime, timeStep, defaultTimeStep, startTime, endTime, isAnimating, timeSliderProps);
18743
19055
  var handleTimeRangeChange = function handleTimeRangeChange(newTimeRange) {
18744
19056
  if (isAnimating && newTimeRange) {
18745
19057
  dispatch(mapActions.mapStopAnimation({
@@ -19519,4 +19831,4 @@ var AppWrapperConnect = withEggs([appModuleConfig])(function (_ref) {
19519
19831
  return children;
19520
19832
  });
19521
19833
 
19522
- export { AppWrapperConnect, ConfigurableMapConnect, CoreThemeProvider, CoreThemeStoreProvider, HarmonieTempAndPrecipPreset, LayerManager, BaseLayerRow as LayerManagerBaseLayerRow, LayerManagerConnect, DescriptionRow as LayerManagerDescriptionRow, HeaderOptions as LayerManagerHeaderOptions, LayerContainerRow as LayerManagerLayerContainerRow, LayerManagerMapButtonConnect, LegendConnect, LegendMapButtonConnect, MapViewConnect, MultiDimensionSelectMapButtonsConnect, MultiMapMultiDimensionSelectConnect as MultiMapDimensionSelectConnect, MultiMapViewConnect, RouterWrapperConnect, SyncGroupViewerConnect, TimeSliderLite, TimeSliderLiteConnect, TimeSliderLiteOptionsMenu, timeSliderLiteUtils as TimeSliderLiteUtils, ZoomControlConnect, componentsLookUp, defaultBbox, defaultConfigurations, filterMapPresets, filterServices, testLayers, useFetchServices };
19834
+ export { AppWrapperConnect, ConfigurableMapConnect, CoreThemeProvider, CoreThemeStoreProvider, HarmonieTempAndPrecipPreset, LayerManager, BaseLayerRow as LayerManagerBaseLayerRow, LayerManagerConnect, DescriptionRow as LayerManagerDescriptionRow, HeaderOptions as LayerManagerHeaderOptions, LayerContainerRow as LayerManagerLayerContainerRow, LayerManagerMapButtonConnect, LegendConnect, LegendMapButtonConnect, MapViewConnect, MultiDimensionSelectMapButtonsConnect, MultiMapMultiDimensionSelectConnect as MultiMapDimensionSelectConnect, MultiMapViewConnect, MyMapLocation, RouterWrapperConnect, SearchControlButtonConnect, SearchControlConnect, SearchDialog, SyncGroupViewerConnect, TimeSliderLite, TimeSliderLiteConnect, TimeSliderLiteOptionsMenu, timeSliderLiteUtils as TimeSliderLiteUtils, ZoomControlConnect, componentsLookUp, defaultBbox, defaultConfigurations, filterMapPresets, filterServices, filterTimeSeriesServices, testLayers, useFetchServices };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opengeoweb/core",
3
- "version": "9.0.0",
3
+ "version": "9.2.0",
4
4
  "description": "GeoWeb Core library for the opengeoweb project",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
@@ -7,6 +7,7 @@ export interface SingleValueComponentProps extends mapTypes.Dimension {
7
7
  nameMappings?: DimensionNameMappings;
8
8
  valueMappings?: DimensionValueMappings;
9
9
  }
10
+ export type DimensionTooltipGenerator = (selectedDimension: mapTypes.Dimension, isValue?: boolean) => string;
10
11
  export interface DimensionSelectProps {
11
12
  layerDimensions?: mapTypes.Dimension[];
12
13
  onLayerChangeDimension: (dimensionName: string, dimensionValue: string, origin?: layerTypes.LayerActionOrigin.layerManager) => void;
@@ -14,11 +15,11 @@ export interface DimensionSelectProps {
14
15
  icon?: ElementType;
15
16
  nameMappings?: DimensionNameMappings;
16
17
  valueMappings?: DimensionValueMappings;
17
- tooltipPrefix?: string;
18
+ tooltipGenerator?: DimensionTooltipGenerator;
18
19
  useLatestReferenceTime?: boolean;
19
20
  setUseLatestReferenceTime?: (useLatestReferenceTime: boolean) => void;
20
21
  SingleValueComponent?: React.FC<SingleValueComponentProps>;
21
- latestLabel?: string;
22
+ hideLatestDuplicate?: boolean;
22
23
  }
23
24
  declare const DimensionSelect: FC<DimensionSelectProps>;
24
25
  export default DimensionSelect;
@@ -1,17 +1,7 @@
1
1
  import * as React from 'react';
2
- import { layerTypes, mapTypes } from '@opengeoweb/store';
3
2
  export interface DimensionSelectProps {
4
3
  layerId: string;
5
4
  mapId: string;
6
5
  }
7
- interface LayerChangeDimensionParams {
8
- dimension: mapTypes.Dimension;
9
- origin: layerTypes.LayerActionOrigin | undefined;
10
- }
11
- export declare const useLayerDimensions: (layerId: string, mapId: string) => {
12
- layerDimensions: mapTypes.Dimension[];
13
- isLayerEnabled: boolean;
14
- layerChangeDimension: ({ dimension, origin, }: LayerChangeDimensionParams) => void;
15
- };
16
6
  declare const DimensionSelectConnect: React.FC<DimensionSelectProps>;
17
7
  export default DimensionSelectConnect;
@@ -0,0 +1,15 @@
1
+ import { ElementType, FC } from 'react';
2
+ import { layerTypes, mapTypes } from '@opengeoweb/store';
3
+ import { DimensionValueMappings } from '../../../LayerManagerUtils';
4
+ declare const DimensionSelectValue: FC<{
5
+ selectedDimension?: mapTypes.Dimension;
6
+ icon?: ElementType;
7
+ tooltip: string;
8
+ isEnabled: boolean;
9
+ onLayerChangeDimension: (dimensionName: string, dimensionValue: string, origin?: layerTypes.LayerActionOrigin.layerManager) => void;
10
+ valueMappings?: DimensionValueMappings;
11
+ hideLatestDuplicate?: boolean;
12
+ useLatestReferenceTime?: boolean;
13
+ setUseLatestReferenceTime?: (useLatestReferenceTime: boolean) => void;
14
+ }>;
15
+ export default DimensionSelectValue;
@@ -0,0 +1,12 @@
1
+ import { ElementType, FC } from 'react';
2
+ import { DimensionNameMappings } from '../../../LayerManagerUtils';
3
+ declare const DimensionSelectName: FC<{
4
+ dimensionNames: string[];
5
+ selectedDimensionName: string;
6
+ setSelectedDimensionName: (dimension: string) => void;
7
+ icon?: ElementType;
8
+ nameMappings?: DimensionNameMappings;
9
+ tooltip: string;
10
+ isEnabled: boolean;
11
+ }>;
12
+ export default DimensionSelectName;
@@ -0,0 +1,15 @@
1
+ import { layerTypes, mapTypes } from '@opengeoweb/store';
2
+ interface LayerChangeDimensionParams {
3
+ dimension: mapTypes.Dimension;
4
+ origin: layerTypes.LayerActionOrigin | undefined;
5
+ }
6
+ export declare const useLayerDimensions: (layerId: string, mapId: string) => {
7
+ layerDimensions: mapTypes.Dimension[];
8
+ isLayerEnabled: boolean;
9
+ layerChangeDimension: ({ dimension, origin, }: LayerChangeDimensionParams) => void;
10
+ };
11
+ export declare const useReferenceTimeWithLatestOption: (layerId: string) => {
12
+ useLatestReferenceTime: boolean;
13
+ setUseLatestReferenceTime: (useLatestReferenceTime: boolean) => void;
14
+ };
15
+ export {};
@@ -1,6 +1,6 @@
1
1
  /// <reference types="react" />
2
2
  import { mapTypes } from '@opengeoweb/store';
3
- import type { SingleValueComponentProps } from './LayerContainerRow/LayerRow/DimensionSelect/DimensionSelect';
3
+ import type { DimensionTooltipGenerator, SingleValueComponentProps } from './LayerContainerRow/LayerRow/DimensionSelect/DimensionSelect';
4
4
  import { Size, ToolbarButtonSettings } from './LayerManagerHeaderOptions';
5
5
  export declare const columnClasses: {
6
6
  column1: string;
@@ -163,7 +163,7 @@ export type DimensionNameMappings = {
163
163
  [dimensionName: string]: string;
164
164
  };
165
165
  export type DimensionValueMappings = {
166
- [dimensionName: string]: (value: string) => string;
166
+ [dimensionName: string]: (value: string, latest?: string) => string;
167
167
  };
168
168
  export interface LayerManagerCustomSettings {
169
169
  toolbar?: {
@@ -232,9 +232,10 @@ export interface LayerManagerCustomSettings {
232
232
  dimensionsToShow?: string[];
233
233
  SingleValueComponent?: React.FC<SingleValueComponentProps>;
234
234
  icon?: React.ElementType;
235
- tooltipPrefix?: string;
235
+ tooltipGenerator?: DimensionTooltipGenerator;
236
236
  nameMappings?: DimensionNameMappings;
237
237
  valueMappings?: DimensionValueMappings;
238
+ hideLatestDuplicate?: boolean;
238
239
  };
239
240
  deleteLayer?: {
240
241
  tooltipTitle?: string;
@@ -0,0 +1,6 @@
1
+ import React from 'react';
2
+ declare const _default: {
3
+ title: string;
4
+ };
5
+ export default _default;
6
+ export declare const MultipleDrawToolsDemo: () => React.ReactElement;
@@ -0,0 +1,6 @@
1
+ import React from 'react';
2
+ export interface MyMapLocationProps {
3
+ mapId: string | undefined;
4
+ }
5
+ export declare const MY_LOCATION = "MyLocation";
6
+ export declare const MyMapLocation: React.FC<MyMapLocationProps>;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,7 @@
1
+ import React from 'react';
2
+ export interface SearchDialogProps {
3
+ isOpen: boolean;
4
+ onClose: () => void;
5
+ mapId?: string;
6
+ }
7
+ export declare const SearchDialog: React.FC<SearchDialogProps>;
@@ -1,2 +1,4 @@
1
1
  export { SearchControlButtonConnect } from './SearchControlButtonConnect';
2
2
  export { SearchControlConnect } from './SearchControlConnect';
3
+ export { SearchDialog } from './SearchDialog';
4
+ export { MyMapLocation } from './MyMapLocation';
@@ -21,6 +21,7 @@ export declare const SEVEN_DAYS_IN_SECONDS: number;
21
21
  export declare const reformatFinnishDateString: (dateString: string) => string;
22
22
  /**
23
23
  * Marks UTC time with Z after hh:mm or hh.mm or appends UTC to the end of the date string
24
+ * If two matches of time are found, the second one is marked
24
25
  */
25
26
  export declare const shortUTCTime: (dateString: string) => string;
26
27
  export declare const getMonthChanges: (startDate: Date, endDate: Date) => number[];
@@ -0,0 +1,3 @@
1
+ import { Dispatch } from '@reduxjs/toolkit';
2
+ import { TimeSliderLiteProps } from './TimeSliderLite';
3
+ export declare const useOnToggleAnimation: (dispatch: Dispatch<any>, mapId: string, selectedTime: number, timeStep: [number, number] | null, defaultTimeStep: [number, number], startTime: number, endTime: number, isAnimating: boolean, timeSliderProps: Partial<TimeSliderLiteProps>) => (() => void);
@@ -16,4 +16,5 @@ export * from './utils/jsonPresetFilter';
16
16
  export * as defaultConfigurations from './utils/defaultConfigurations';
17
17
  export * from './components/Providers/Providers';
18
18
  export * from './components/RouterWrapper';
19
+ export * from './components/Search';
19
20
  export * from './components/AppWrapper';
@@ -1,14 +1,17 @@
1
1
  import { layerSelectTypes } from '@opengeoweb/layer-select';
2
+ import { TimeSeriesService } from '@opengeoweb/shared';
2
3
  import { filterLayers, layerTypes } from '@opengeoweb/store';
3
4
  interface FilteredMapPresets extends filterLayers.FilteredLayerList {
4
5
  services?: layerSelectTypes.LayerSelectService[];
5
6
  baseServices?: layerSelectTypes.LayerSelectService[];
7
+ timeSeriesServices?: TimeSeriesService[];
6
8
  }
7
9
  export interface InitialAppPresetProps {
8
10
  presetType?: string;
9
11
  presetId?: string;
10
12
  presetName?: string;
11
13
  services?: layerSelectTypes.LayerSelectService[];
14
+ timeSeriesServices?: TimeSeriesService[];
12
15
  baseServices?: layerSelectTypes.LayerSelectService[];
13
16
  layers?: layerTypes.Layer[];
14
17
  baseLayers?: layerTypes.Layer[];
@@ -17,5 +20,6 @@ export interface InitialAppPreset {
17
20
  preset: InitialAppPresetProps;
18
21
  }
19
22
  export declare const filterServices: (presetArray: layerSelectTypes.LayerSelectService[]) => layerSelectTypes.LayerSelectService[];
23
+ export declare const filterTimeSeriesServices: (presetArray: TimeSeriesService[]) => TimeSeriesService[];
20
24
  export declare const filterMapPresets: (initialAppPreset: InitialAppPreset) => FilteredMapPresets;
21
25
  export {};