@opengeoweb/core 2.3.0 → 2.5.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 (36) hide show
  1. package/index.esm.js +960 -689
  2. package/index.umd.js +965 -669
  3. package/lib/components/LayerManager/LayerContainerRow/LayerRow/LayerRow.d.ts +1 -0
  4. package/lib/components/LayerManager/LayerContainerRow/{LayerManagerButton.spec.d.ts → LayerRow/LayerRowConnect.spec.d.ts} +0 -0
  5. package/lib/components/LayerManager/LayerManagerUtils.d.ts +2 -2
  6. package/lib/components/MapView/MapViewLayer.d.ts +3 -0
  7. package/lib/components/ReactMapView/AdagucMapDraw.d.ts +12 -7
  8. package/lib/components/ReactMapView/AdagucMapDraw.stories.d.ts +4 -0
  9. package/lib/components/ReactMapView/AdagucMapDrawContainer.d.ts +2 -1
  10. package/lib/components/ReactMapView/AdagucMapDrawTools.d.ts +9 -0
  11. package/lib/components/{LayerManager/LayerContainerRow/LayerRow/DeleteLayer/DeleteLayer.spec.d.ts → ReactMapView/AdagucMapDrawTools.spec.d.ts} +0 -0
  12. package/lib/components/SyncGroups/SyncGroupViewer.d.ts +2 -0
  13. package/lib/components/SyncGroups/SyncGroupViewerConnect.d.ts +1 -6
  14. package/lib/components/SyncGroups/selector.d.ts +4 -4
  15. package/lib/components/TimeSlider/TimeSliderButtons/PlayButton/PlayButtonConnect.d.ts +1 -0
  16. package/lib/components/TimeSlider/TimeSliderLegend/TimeSliderLegend.d.ts +2 -0
  17. package/lib/components/TimeSlider/TimeSliderLegend/TimeSliderLegendRenderFunctions.d.ts +1 -1
  18. package/lib/components/TooltipSelect/TooltipSelect.d.ts +0 -1
  19. package/lib/store/generic/selectors.d.ts +1 -0
  20. package/lib/store/generic/synchronizationGroups/actions.d.ts +2 -1
  21. package/lib/store/generic/synchronizationGroups/constants.d.ts +1 -0
  22. package/lib/store/generic/synchronizationGroups/sagas.d.ts +1 -0
  23. package/lib/store/generic/synchronizationGroups/selectors.d.ts +13 -0
  24. package/lib/store/generic/synchronizationGroups/types.d.ts +11 -2
  25. package/lib/store/layerSelect/sagas.d.ts +2 -1
  26. package/lib/store/mapStore/map/selectors.d.ts +30 -0
  27. package/lib/store/mapStore/service/types.d.ts +2 -1
  28. package/lib/store/ui/types.d.ts +1 -1
  29. package/lib/utils/localStorage.d.ts +3 -0
  30. package/lib/utils/testUtils.d.ts +2 -1
  31. package/package.json +7 -6
  32. package/lib/components/LayerManager/LayerContainerRow/LayerManagerButton.d.ts +0 -13
  33. package/lib/components/LayerManager/LayerContainerRow/LayerRow/DeleteLayer/DeleteLayer.d.ts +0 -8
  34. package/lib/components/LayerManager/LayerContainerRow/LayerRow/EnableLayer/EnableLayer.d.ts +0 -8
  35. package/lib/components/LayerManager/LayerContainerRow/LayerRow/EnableLayer/EnableLayer.spec.d.ts +0 -1
  36. package/lib/components/LayerManager/LayerContainerRow/LayerRow/styles.d.ts +0 -5
package/index.esm.js CHANGED
@@ -6,17 +6,18 @@ import React__default, { useState, Component, useRef, useEffect } from 'react';
6
6
  import produce, { produce as produce$1 } from 'immer';
7
7
  import { takeLatest, put, select, call, takeEvery } from 'redux-saga/effects';
8
8
  import { WMGetServiceFromStore, LayerType as LayerType$1, getMapImageStore, WMBBOX, debug, DebugType, WMJSMap, WMLayer, legendImageStore, WMImageEventType, getLegendGraphicURLForLayer } from '@opengeoweb/webmap';
9
- import { Tooltip, Select, Grid, InputLabel, IconButton, Paper, Box, Typography, CircularProgress, List, ListSubheader, ListItem, ListItemText, Dialog, DialogTitle, DialogContent, DialogContentText, TextField, DialogActions, Button, MenuItem, Checkbox, SvgIcon, FormControl, InputAdornment, ListItemSecondaryAction, ListItemIcon, Switch, Slider, FormControlLabel, Popover, useMediaQuery, useTheme, SliderThumb } from '@mui/material';
10
- import makeStyles from '@mui/styles/makeStyles';
9
+ import { Tooltip, Select, Grid, InputLabel, IconButton, Paper, Box, Typography, CircularProgress, List, ListSubheader, ListItem, ListItemText, Dialog, DialogTitle, DialogContent, DialogContentText, TextField, DialogActions, Button, MenuItem, SvgIcon, FormControl, InputAdornment, ListItemSecondaryAction, ListItemIcon, Checkbox, Switch, Slider, FormControlLabel, Popover, useMediaQuery, useTheme, SliderThumb } from '@mui/material';
11
10
  import { connect, useDispatch, useSelector, Provider } from 'react-redux';
12
- import { sliderStyles, CustomSlider, ToggleMenu, ToolContainerDraggable, ToolButton, CustomToggleButton, useIsMounted } from '@opengeoweb/shared';
13
- import { Cached, Add, Delete, DragIndicator, Close, ChevronLeft, ChevronRight, Link, LinkOff, MoreVert, DeleteForever } from '@mui/icons-material';
11
+ import makeStyles from '@mui/styles/makeStyles';
12
+ import { sliderStyles, CustomSlider, ToggleMenu, ManagerButton, EnableButton, AlertBanner, ManagerDeleteButton, ToolContainerDraggable, ToolButton, CustomToggleButton, useIsMounted } from '@opengeoweb/shared';
13
+ import { Cached, Add, DragIndicator, Close, ChevronLeft, ChevronRight, Link, LinkOff, MoreVert, DeleteForever } from '@mui/icons-material';
14
14
  import { Sortable, ReactSortable } from 'react-sortablejs';
15
15
  import createStyles from '@mui/styles/createStyles';
16
16
  import withStyles from '@mui/styles/withStyles';
17
17
  import { debounce as debounce$1 } from 'throttle-debounce';
18
18
  import cloneDeep from 'lodash.clonedeep';
19
19
  import proj4 from 'proj4';
20
+ import * as turf from '@turf/turf';
20
21
  import { createStore, DynamicModuleLoader } from 'redux-dynamic-modules';
21
22
  import { getSagaExtension } from 'redux-dynamic-modules-saga';
22
23
  import { ThemeWrapper, lightTheme } from '@opengeoweb/theme';
@@ -1293,6 +1294,103 @@ var getAvailableBaseLayersForMap = createSelector(layerStore, function (_store,
1293
1294
  return [];
1294
1295
  }, selectorMemoizationOptions);
1295
1296
 
1297
+ /* *
1298
+ * Licensed under the Apache License, Version 2.0 (the "License");
1299
+ * you may not use this file except in compliance with the License.
1300
+ * You may obtain a copy of the License at
1301
+ *
1302
+ * http://www.apache.org/licenses/LICENSE-2.0
1303
+ *
1304
+ * Unless required by applicable law or agreed to in writing, software
1305
+ * distributed under the License is distributed on an "AS IS" BASIS,
1306
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1307
+ * See the License for the specific language governing permissions and
1308
+ * limitations under the License.
1309
+ *
1310
+ * Copyright 2020 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
1311
+ * Copyright 2020 - Finnish Meteorological Institute (FMI)
1312
+ * */
1313
+
1314
+ /* Action constants for sources */
1315
+ var SYNCGROUPS_ADD_SOURCE = 'SYNCGROUPS_ADD_SOURCE';
1316
+ var SYNCGROUPS_REMOVE_SOURCE = 'SYNCGROUPS_REMOVE_SOURCE';
1317
+ /* Action constants for groups */
1318
+
1319
+ var SYNCGROUPS_TOGGLE_LINK_TARGET = 'SYNCGROUPS_TOGGLE_LINK_TARGET';
1320
+ var SYNCGROUPS_ADD_TARGET = 'SYNCGROUPS_ADD_TARGET';
1321
+ var SYNCGROUPS_REMOVE_TARGET = 'SYNCGROUPS_REMOVE_TARGET';
1322
+ var SYNCGROUPS_ADD_GROUP = 'SYNCGROUPS_ADD_GROUP';
1323
+ var SYNCGROUPS_REMOVE_GROUP = 'SYNCGROUPS_REMOVE_GROUP';
1324
+ var SYNCGROUPS_CLEAR = 'SYNCGROUPS_CLEAR';
1325
+ /* Type constants */
1326
+
1327
+ var SYNCGROUPS_TYPE_SETTIME = 'SYNCGROUPS_TYPE_SETTIME';
1328
+ var SYNCGROUPS_TYPE_SETBBOX = 'SYNCGROUPS_TYPE_SETBBOX';
1329
+ var SYNCGROUPS_TYPE_SETLAYERACTIONS = 'SYNCGROUPS_TYPE_SETLAYERACTIONS';
1330
+ var SYNCGROUPS_SET_VIEW_STATE = 'SYNCGROUPS_SET_VIEW_STATE';
1331
+
1332
+ var constants$1 = /*#__PURE__*/Object.freeze({
1333
+ __proto__: null,
1334
+ SYNCGROUPS_ADD_SOURCE: SYNCGROUPS_ADD_SOURCE,
1335
+ SYNCGROUPS_REMOVE_SOURCE: SYNCGROUPS_REMOVE_SOURCE,
1336
+ SYNCGROUPS_TOGGLE_LINK_TARGET: SYNCGROUPS_TOGGLE_LINK_TARGET,
1337
+ SYNCGROUPS_ADD_TARGET: SYNCGROUPS_ADD_TARGET,
1338
+ SYNCGROUPS_REMOVE_TARGET: SYNCGROUPS_REMOVE_TARGET,
1339
+ SYNCGROUPS_ADD_GROUP: SYNCGROUPS_ADD_GROUP,
1340
+ SYNCGROUPS_REMOVE_GROUP: SYNCGROUPS_REMOVE_GROUP,
1341
+ SYNCGROUPS_CLEAR: SYNCGROUPS_CLEAR,
1342
+ SYNCGROUPS_TYPE_SETTIME: SYNCGROUPS_TYPE_SETTIME,
1343
+ SYNCGROUPS_TYPE_SETBBOX: SYNCGROUPS_TYPE_SETBBOX,
1344
+ SYNCGROUPS_TYPE_SETLAYERACTIONS: SYNCGROUPS_TYPE_SETLAYERACTIONS,
1345
+ SYNCGROUPS_SET_VIEW_STATE: SYNCGROUPS_SET_VIEW_STATE
1346
+ });
1347
+
1348
+ /* *
1349
+ * Licensed under the Apache License, Version 2.0 (the "License");
1350
+ * you may not use this file except in compliance with the License.
1351
+ * You may obtain a copy of the License at
1352
+ *
1353
+ * http://www.apache.org/licenses/LICENSE-2.0
1354
+ *
1355
+ * Unless required by applicable law or agreed to in writing, software
1356
+ * distributed under the License is distributed on an "AS IS" BASIS,
1357
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1358
+ * See the License for the specific language governing permissions and
1359
+ * limitations under the License.
1360
+ *
1361
+ * Copyright 2020 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
1362
+ * Copyright 2020 - Finnish Meteorological Institute (FMI)
1363
+ * */
1364
+
1365
+ var synchronizationGroupStore = function synchronizationGroupStore(store) {
1366
+ return store && store.syncronizationGroupStore ? store.syncronizationGroupStore : null;
1367
+ };
1368
+
1369
+ var getSynchronizationGroupStore = createSelector(synchronizationGroupStore, function (store) {
1370
+ return store;
1371
+ });
1372
+ /**
1373
+ * Returns the synchronization source by id
1374
+ * @param store The app store
1375
+ * @param id The source id to find
1376
+ */
1377
+
1378
+ var getSyncSourceBySourceId = function getSyncSourceBySourceId(state, id) {
1379
+ if (state && state.sources) {
1380
+ var sources = state.sources;
1381
+
1382
+ if (sources.byId[id]) {
1383
+ return sources.byId[id];
1384
+ }
1385
+ }
1386
+
1387
+ return null;
1388
+ };
1389
+
1390
+ var getTime = createSelector(getSyncSourceBySourceId, function (store) {
1391
+ return store && store.payloadByType && store.payloadByType[SYNCGROUPS_TYPE_SETTIME] ? store.payloadByType[SYNCGROUPS_TYPE_SETTIME].value : null;
1392
+ });
1393
+
1296
1394
  function _typeof(obj) {
1297
1395
  "@babel/helpers - typeof";
1298
1396
 
@@ -2361,6 +2459,34 @@ var getBbox = createSelector(getMapById, function (store) {
2361
2459
  var isAnimating = createSelector(getMapById, function (store) {
2362
2460
  return store ? store.isAnimating : false;
2363
2461
  });
2462
+ /**
2463
+ * Gets if any linked map is animating
2464
+ *
2465
+ * Example: linkedMapIsAnimating = linkedMapAnimationInfo(store, 'mapid_1')
2466
+ * @param {object} store store: object - store object
2467
+ * @param {string} mapId mapId: string - Id of the map
2468
+ * @returns {object} returnType: object - object containing isAnimating boolean and id string
2469
+ */
2470
+
2471
+ var linkedMapAnimationInfo = createSelector(function (store, mapId) {
2472
+ var animationInfo = {
2473
+ isAnimating: isAnimating(store, mapId),
2474
+ id: mapId
2475
+ };
2476
+ getSynchronizationGroupStore(store).groups.allIds.forEach(function (groupId) {
2477
+ if (getSynchronizationGroupStore(store).groups.byId[groupId].targets.byId[animationInfo.id] && getSynchronizationGroupStore(store).groups.byId[groupId].targets.byId[animationInfo.id].linked) {
2478
+ getSynchronizationGroupStore(store).groups.byId[groupId].targets.allIds.forEach(function (id) {
2479
+ if (isAnimating(store, id) === true) {
2480
+ animationInfo.isAnimating = true;
2481
+ animationInfo.id = id;
2482
+ }
2483
+ });
2484
+ }
2485
+ });
2486
+ return animationInfo;
2487
+ }, function (animationInfo) {
2488
+ return animationInfo;
2489
+ });
2364
2490
  /**
2365
2491
  * Gets start time of animation
2366
2492
  *
@@ -2820,6 +2946,7 @@ var selectors$1 = /*#__PURE__*/Object.freeze({
2820
2946
  getSrs: getSrs,
2821
2947
  getBbox: getBbox,
2822
2948
  isAnimating: isAnimating,
2949
+ linkedMapAnimationInfo: linkedMapAnimationInfo,
2823
2950
  getAnimationStartTime: getAnimationStartTime,
2824
2951
  getAnimationEndTime: getAnimationEndTime,
2825
2952
  isAutoUpdating: isAutoUpdating,
@@ -2885,7 +3012,7 @@ var selectors$1 = /*#__PURE__*/Object.freeze({
2885
3012
  * Copyright 2020 - Finnish Meteorological Institute (FMI)
2886
3013
  * */
2887
3014
 
2888
- var constants$1 = /*#__PURE__*/Object.freeze({
3015
+ var constants = /*#__PURE__*/Object.freeze({
2889
3016
  __proto__: null,
2890
3017
  WEBMAP_REGISTER_MAP: WEBMAP_REGISTER_MAP,
2891
3018
  WEBMAP_UNREGISTER_MAP: WEBMAP_UNREGISTER_MAP,
@@ -3207,55 +3334,6 @@ var types$1 = /*#__PURE__*/Object.freeze({
3207
3334
  var GENERIC_SETTIME = 'GENERIC_SETTIME';
3208
3335
  var GENERIC_SETBBOX = 'GENERIC_SETBBOX';
3209
3336
 
3210
- /* *
3211
- * Licensed under the Apache License, Version 2.0 (the "License");
3212
- * you may not use this file except in compliance with the License.
3213
- * You may obtain a copy of the License at
3214
- *
3215
- * http://www.apache.org/licenses/LICENSE-2.0
3216
- *
3217
- * Unless required by applicable law or agreed to in writing, software
3218
- * distributed under the License is distributed on an "AS IS" BASIS,
3219
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
3220
- * See the License for the specific language governing permissions and
3221
- * limitations under the License.
3222
- *
3223
- * Copyright 2020 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
3224
- * Copyright 2020 - Finnish Meteorological Institute (FMI)
3225
- * */
3226
-
3227
- /* Action constants for sources */
3228
- var SYNCGROUPS_ADD_SOURCE = 'SYNCGROUPS_ADD_SOURCE';
3229
- var SYNCGROUPS_REMOVE_SOURCE = 'SYNCGROUPS_REMOVE_SOURCE';
3230
- /* Action constants for groups */
3231
-
3232
- var SYNCGROUPS_TOGGLE_LINK_TARGET = 'SYNCGROUPS_TOGGLE_LINK_TARGET';
3233
- var SYNCGROUPS_ADD_TARGET = 'SYNCGROUPS_ADD_TARGET';
3234
- var SYNCGROUPS_REMOVE_TARGET = 'SYNCGROUPS_REMOVE_TARGET';
3235
- var SYNCGROUPS_ADD_GROUP = 'SYNCGROUPS_ADD_GROUP';
3236
- var SYNCGROUPS_REMOVE_GROUP = 'SYNCGROUPS_REMOVE_GROUP';
3237
- var SYNCGROUPS_CLEAR = 'SYNCGROUPS_CLEAR';
3238
- /* Type constants */
3239
-
3240
- var SYNCGROUPS_TYPE_SETTIME = 'SYNCGROUPS_TYPE_SETTIME';
3241
- var SYNCGROUPS_TYPE_SETBBOX = 'SYNCGROUPS_TYPE_SETBBOX';
3242
- var SYNCGROUPS_TYPE_SETLAYERACTIONS = 'SYNCGROUPS_TYPE_SETLAYERACTIONS';
3243
-
3244
- var constants = /*#__PURE__*/Object.freeze({
3245
- __proto__: null,
3246
- SYNCGROUPS_ADD_SOURCE: SYNCGROUPS_ADD_SOURCE,
3247
- SYNCGROUPS_REMOVE_SOURCE: SYNCGROUPS_REMOVE_SOURCE,
3248
- SYNCGROUPS_TOGGLE_LINK_TARGET: SYNCGROUPS_TOGGLE_LINK_TARGET,
3249
- SYNCGROUPS_ADD_TARGET: SYNCGROUPS_ADD_TARGET,
3250
- SYNCGROUPS_REMOVE_TARGET: SYNCGROUPS_REMOVE_TARGET,
3251
- SYNCGROUPS_ADD_GROUP: SYNCGROUPS_ADD_GROUP,
3252
- SYNCGROUPS_REMOVE_GROUP: SYNCGROUPS_REMOVE_GROUP,
3253
- SYNCGROUPS_CLEAR: SYNCGROUPS_CLEAR,
3254
- SYNCGROUPS_TYPE_SETTIME: SYNCGROUPS_TYPE_SETTIME,
3255
- SYNCGROUPS_TYPE_SETBBOX: SYNCGROUPS_TYPE_SETBBOX,
3256
- SYNCGROUPS_TYPE_SETLAYERACTIONS: SYNCGROUPS_TYPE_SETLAYERACTIONS
3257
- });
3258
-
3259
3337
  /* *
3260
3338
  * Licensed under the Apache License, Version 2.0 (the "License");
3261
3339
  * you may not use this file except in compliance with the License.
@@ -3401,6 +3479,12 @@ var syncGroupClear = function syncGroupClear() {
3401
3479
  type: SYNCGROUPS_CLEAR
3402
3480
  };
3403
3481
  };
3482
+ var syncGroupSetViewState = function syncGroupSetViewState(payload) {
3483
+ return {
3484
+ type: SYNCGROUPS_SET_VIEW_STATE,
3485
+ payload: payload
3486
+ };
3487
+ };
3404
3488
 
3405
3489
  var actions$1 = /*#__PURE__*/Object.freeze({
3406
3490
  __proto__: null,
@@ -3411,7 +3495,8 @@ var actions$1 = /*#__PURE__*/Object.freeze({
3411
3495
  syncGroupLinkTarget: syncGroupLinkTarget,
3412
3496
  syncGroupAddGroup: syncGroupAddGroup,
3413
3497
  syncGroupRemoveGroup: syncGroupRemoveGroup,
3414
- syncGroupClear: syncGroupClear
3498
+ syncGroupClear: syncGroupClear,
3499
+ syncGroupSetViewState: syncGroupSetViewState
3415
3500
  });
3416
3501
 
3417
3502
  /* *
@@ -3481,7 +3566,8 @@ var actions = /*#__PURE__*/Object.freeze({
3481
3566
  syncGroupLinkTarget: syncGroupLinkTarget,
3482
3567
  syncGroupAddGroup: syncGroupAddGroup,
3483
3568
  syncGroupRemoveGroup: syncGroupRemoveGroup,
3484
- syncGroupClear: syncGroupClear
3569
+ syncGroupClear: syncGroupClear,
3570
+ syncGroupSetViewState: syncGroupSetViewState
3485
3571
  });
3486
3572
 
3487
3573
  /*! *****************************************************************************
@@ -4119,6 +4205,20 @@ var initialState$4 = {
4119
4205
  groups: {
4120
4206
  byId: {},
4121
4207
  allIds: []
4208
+ },
4209
+ viewState: {
4210
+ timeslider: {
4211
+ groups: [],
4212
+ sourcesById: []
4213
+ },
4214
+ zoompane: {
4215
+ groups: [],
4216
+ sourcesById: []
4217
+ },
4218
+ level: {
4219
+ groups: [],
4220
+ sourcesById: []
4221
+ }
4122
4222
  }
4123
4223
  };
4124
4224
  var reducer$4 = function reducer() {
@@ -4338,6 +4438,12 @@ var reducer$4 = function reducer() {
4338
4438
  case SYNCGROUPS_CLEAR:
4339
4439
  return initialState$4;
4340
4440
 
4441
+ case SYNCGROUPS_SET_VIEW_STATE:
4442
+ return produce(state, function (draft) {
4443
+ var viewState = action.payload.viewState;
4444
+ draft.viewState = viewState;
4445
+ });
4446
+
4341
4447
  default:
4342
4448
  return state;
4343
4449
  }
@@ -4449,6 +4555,9 @@ var getTargetGroups = function getTargetGroups(state, payload, actionType) {
4449
4555
  }, []);
4450
4556
  return groups;
4451
4557
  };
4558
+ var syncGroupGetViewState = createSelector(syncGroupStore, function (store) {
4559
+ return store.viewState;
4560
+ });
4452
4561
 
4453
4562
  /* *
4454
4563
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -4758,7 +4867,8 @@ var setServiceMetadata = function setServiceMetadata(wmLayer, mapId, webMapJSIns
4758
4867
  id: wmLayer.service,
4759
4868
  name: wmLayer.title,
4760
4869
  service: wmLayer.service,
4761
- layers: layers
4870
+ layers: layers,
4871
+ isUserAddedService: false
4762
4872
  },
4763
4873
  layerStyle: {
4764
4874
  origin: origin,
@@ -4819,7 +4929,7 @@ var _marked$4 = /*#__PURE__*/regeneratorRuntime.mark(setTimeSaga),
4819
4929
  _marked2$4 = /*#__PURE__*/regeneratorRuntime.mark(setBBoxSaga),
4820
4930
  _marked3$4 = /*#__PURE__*/regeneratorRuntime.mark(layerActionsSaga),
4821
4931
  _marked4$2 = /*#__PURE__*/regeneratorRuntime.mark(addLayerActionsSaga),
4822
- _marked5$1 = /*#__PURE__*/regeneratorRuntime.mark(deleteLayerActionsSaga),
4932
+ _marked5$2 = /*#__PURE__*/regeneratorRuntime.mark(deleteLayerActionsSaga),
4823
4933
  _marked6$1 = /*#__PURE__*/regeneratorRuntime.mark(moveLayerActionsSaga),
4824
4934
  _marked7$1 = /*#__PURE__*/regeneratorRuntime.mark(setActiveLayerIdActionsSaga),
4825
4935
  _marked8 = /*#__PURE__*/regeneratorRuntime.mark(mapBaseLayerActionsSaga),
@@ -5001,7 +5111,7 @@ function deleteLayerActionsSaga(_ref5) {
5001
5111
  return _context5.stop();
5002
5112
  }
5003
5113
  }
5004
- }, _marked5$1);
5114
+ }, _marked5$2);
5005
5115
  }
5006
5116
  function moveLayerActionsSaga(_ref6) {
5007
5117
  var payload, type, targets;
@@ -5165,32 +5275,132 @@ function rootSaga$4() {
5165
5275
  }, _marked9);
5166
5276
  }
5167
5277
 
5168
- var _marked$3 = /*#__PURE__*/regeneratorRuntime.mark(updateSourceValueWhenLinkingComponentToGroupSaga),
5169
- _marked2$3 = /*#__PURE__*/regeneratorRuntime.mark(addGroupTargetSaga),
5170
- _marked3$3 = /*#__PURE__*/regeneratorRuntime.mark(linkGroupTargetSaga),
5171
- _marked4$1 = /*#__PURE__*/regeneratorRuntime.mark(rootSaga$3);
5172
- function updateSourceValueWhenLinkingComponentToGroupSaga(groupId, targetToUpdate) {
5173
- var group;
5174
- return regeneratorRuntime.wrap(function updateSourceValueWhenLinkingComponentToGroupSaga$(_context) {
5175
- while (1) {
5176
- switch (_context.prev = _context.next) {
5177
- case 0:
5178
- _context.next = 2;
5179
- return select(getSynchronizationGroup, groupId);
5278
+ /* *
5279
+ * Licensed under the Apache License, Version 2.0 (the "License");
5280
+ * you may not use this file except in compliance with the License.
5281
+ * You may obtain a copy of the License at
5282
+ *
5283
+ * http://www.apache.org/licenses/LICENSE-2.0
5284
+ *
5285
+ * Unless required by applicable law or agreed to in writing, software
5286
+ * distributed under the License is distributed on an "AS IS" BASIS,
5287
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
5288
+ * See the License for the specific language governing permissions and
5289
+ * limitations under the License.
5290
+ *
5291
+ * Copyright 2021 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
5292
+ * Copyright 2021 - Finnish Meteorological Institute (FMI)
5293
+ * */
5294
+ var emptyState = {
5295
+ timeslider: {
5296
+ groups: [],
5297
+ sourcesById: []
5298
+ },
5299
+ zoompane: {
5300
+ groups: [],
5301
+ sourcesById: []
5302
+ },
5303
+ level: {
5304
+ groups: [],
5305
+ sourcesById: []
5306
+ }
5307
+ };
5308
+ var groupTypes = [{
5309
+ title: 'Timeslider',
5310
+ syncType: 'SYNCGROUPS_TYPE_SETTIME',
5311
+ groupType: 'timeslider'
5312
+ }, {
5313
+ title: 'Zoompane',
5314
+ syncType: 'SYNCGROUPS_TYPE_SETBBOX',
5315
+ groupType: 'zoompane'
5316
+ }];
5317
+ /*
5318
+ _____ Creates viewState _____
5319
+ - Runs Each time viewState is created:
5320
+ - Fill arrays inside initialState with objects containing new values from Redux
5321
+ */
5180
5322
 
5181
- case 2:
5182
- group = _context.sent;
5323
+ var createSyncGroupViewState = function createSyncGroupViewState(groups, sources) {
5324
+ var initialState = produce(emptyState, function (draft) {
5325
+ /*
5326
+ _____ 1. Fill groups _____
5327
+ 1. Goes through all groups by ID
5328
+ 2. Collects original timeslider or zoompane values into an array
5329
+ 3. Sorts and adds selected sources to ViewState based on ID type
5330
+ */
5331
+ Object.keys(groups.byId).forEach(function (id) {
5332
+ var _a;
5183
5333
 
5184
- if (group) {
5185
- _context.next = 5;
5186
- break;
5187
- }
5334
+ var groupType = (_a = groupTypes.find(function (object) {
5335
+ return object.syncType === groups.byId[id].type;
5336
+ })) === null || _a === void 0 ? void 0 : _a.groupType;
5188
5337
 
5189
- return _context.abrupt("return");
5338
+ if (groupType) {
5339
+ draft[groupType].groups.push({
5340
+ id: id,
5341
+ selected: groups.byId[id].targets.allIds
5342
+ });
5343
+ }
5344
+ });
5345
+ /*
5346
+ _____ 2. Fill sourcesById _____
5347
+ 1. Loop though sources and add source to each group type
5348
+ */
5190
5349
 
5191
- case 5:
5192
- _context.t0 = group.type;
5193
- _context.next = _context.t0 === SYNCGROUPS_TYPE_SETTIME ? 8 : _context.t0 === SYNCGROUPS_TYPE_SETBBOX ? 13 : 18;
5350
+ Object.keys(sources.byId).forEach(function (id) {
5351
+ groupTypes.forEach(function (_ref) {
5352
+ var syncType = _ref.syncType,
5353
+ groupType = _ref.groupType;
5354
+
5355
+ if (sources.byId[id].types.includes(syncType)) {
5356
+ draft[groupType].sourcesById.push({
5357
+ id: id,
5358
+ name: id
5359
+ });
5360
+ }
5361
+ });
5362
+ });
5363
+ });
5364
+ return initialState;
5365
+ };
5366
+
5367
+ var groups = function groups(store) {
5368
+ return store.syncronizationGroupStore.groups;
5369
+ };
5370
+
5371
+ var sources = function sources(store) {
5372
+ return store.syncronizationGroupStore.sources;
5373
+ };
5374
+
5375
+ var createSyncGroupViewStateSelector = createSelector(groups, sources, createSyncGroupViewState);
5376
+
5377
+ var _marked$3 = /*#__PURE__*/regeneratorRuntime.mark(updateSourceValueWhenLinkingComponentToGroupSaga),
5378
+ _marked2$3 = /*#__PURE__*/regeneratorRuntime.mark(addGroupTargetSaga),
5379
+ _marked3$3 = /*#__PURE__*/regeneratorRuntime.mark(linkGroupTargetSaga),
5380
+ _marked4$1 = /*#__PURE__*/regeneratorRuntime.mark(updateViewStateSaga),
5381
+ _marked5$1 = /*#__PURE__*/regeneratorRuntime.mark(rootSaga$3);
5382
+ function updateSourceValueWhenLinkingComponentToGroupSaga(groupId, targetToUpdate) {
5383
+ var group;
5384
+ return regeneratorRuntime.wrap(function updateSourceValueWhenLinkingComponentToGroupSaga$(_context) {
5385
+ while (1) {
5386
+ switch (_context.prev = _context.next) {
5387
+ case 0:
5388
+ _context.next = 2;
5389
+ return select(getSynchronizationGroup, groupId);
5390
+
5391
+ case 2:
5392
+ group = _context.sent;
5393
+
5394
+ if (group) {
5395
+ _context.next = 5;
5396
+ break;
5397
+ }
5398
+
5399
+ return _context.abrupt("return");
5400
+
5401
+ case 5:
5402
+ _context.t0 = group.type;
5403
+ _context.next = _context.t0 === SYNCGROUPS_TYPE_SETTIME ? 8 : _context.t0 === SYNCGROUPS_TYPE_SETBBOX ? 13 : 18;
5194
5404
  break;
5195
5405
 
5196
5406
  case 8:
@@ -5285,25 +5495,76 @@ function linkGroupTargetSaga(_ref2) {
5285
5495
  }
5286
5496
  }, _marked3$3);
5287
5497
  }
5288
-
5289
- function rootSaga$3() {
5290
- return regeneratorRuntime.wrap(function rootSaga$(_context4) {
5498
+ function updateViewStateSaga() {
5499
+ var viewState;
5500
+ return regeneratorRuntime.wrap(function updateViewStateSaga$(_context4) {
5291
5501
  while (1) {
5292
5502
  switch (_context4.prev = _context4.next) {
5293
5503
  case 0:
5294
5504
  _context4.next = 2;
5505
+ return select(createSyncGroupViewStateSelector);
5506
+
5507
+ case 2:
5508
+ viewState = _context4.sent;
5509
+ _context4.next = 5;
5510
+ return put(syncGroupSetViewState({
5511
+ viewState: viewState
5512
+ }));
5513
+
5514
+ case 5:
5515
+ case "end":
5516
+ return _context4.stop();
5517
+ }
5518
+ }
5519
+ }, _marked4$1);
5520
+ }
5521
+
5522
+ function rootSaga$3() {
5523
+ return regeneratorRuntime.wrap(function rootSaga$(_context5) {
5524
+ while (1) {
5525
+ switch (_context5.prev = _context5.next) {
5526
+ case 0:
5527
+ _context5.next = 2;
5295
5528
  return takeLatest(SYNCGROUPS_ADD_TARGET, addGroupTargetSaga);
5296
5529
 
5297
5530
  case 2:
5298
- _context4.next = 4;
5531
+ _context5.next = 4;
5299
5532
  return takeLatest(SYNCGROUPS_TOGGLE_LINK_TARGET, linkGroupTargetSaga);
5300
5533
 
5301
5534
  case 4:
5535
+ _context5.next = 6;
5536
+ return takeLatest(SYNCGROUPS_ADD_GROUP, updateViewStateSaga);
5537
+
5538
+ case 6:
5539
+ _context5.next = 8;
5540
+ return takeLatest(SYNCGROUPS_REMOVE_GROUP, updateViewStateSaga);
5541
+
5542
+ case 8:
5543
+ _context5.next = 10;
5544
+ return takeLatest(SYNCGROUPS_ADD_SOURCE, updateViewStateSaga);
5545
+
5546
+ case 10:
5547
+ _context5.next = 12;
5548
+ return takeLatest(SYNCGROUPS_REMOVE_SOURCE, updateViewStateSaga);
5549
+
5550
+ case 12:
5551
+ _context5.next = 14;
5552
+ return takeLatest(SYNCGROUPS_ADD_TARGET, updateViewStateSaga);
5553
+
5554
+ case 14:
5555
+ _context5.next = 16;
5556
+ return takeLatest(SYNCGROUPS_REMOVE_TARGET, updateViewStateSaga);
5557
+
5558
+ case 16:
5559
+ _context5.next = 18;
5560
+ return takeLatest(SYNCGROUPS_TOGGLE_LINK_TARGET, updateViewStateSaga);
5561
+
5562
+ case 18:
5302
5563
  case "end":
5303
- return _context4.stop();
5564
+ return _context5.stop();
5304
5565
  }
5305
5566
  }
5306
- }, _marked4$1);
5567
+ }, _marked5$1);
5307
5568
  }
5308
5569
 
5309
5570
  /* *
@@ -5330,41 +5591,6 @@ var synchronizationGroupConfig = {
5330
5591
  sagas: [rootSaga$4, rootSaga$3]
5331
5592
  };
5332
5593
 
5333
- var useStyles$B = makeStyles(function (theme) {
5334
- return {
5335
- select: {
5336
- '& ul': {
5337
- backgroundColor: theme.palette.geowebColors.background.surface
5338
- },
5339
- '& li': {
5340
- fontSize: 16,
5341
- padding: 12,
5342
- '&:hover': {
5343
- backgroundColor: theme.palette.geowebColors.layerManager.tableRowMouseover.rgba
5344
- },
5345
- '&.Mui-selected': {
5346
- color: theme.palette.common.white,
5347
- backgroundColor: theme.palette.geowebColors.buttons.primary.active.fill,
5348
- boxShadow: "none",
5349
- '&:hover': {
5350
- color: theme.palette.common.white,
5351
- backgroundColor: theme.palette.geowebColors.buttons.primary.mouseOver.fill
5352
- }
5353
- },
5354
- '&:after': {
5355
- background: 'none!important'
5356
- },
5357
- // (optional) header
5358
- '&.Mui-disabled': {
5359
- fontSize: 12,
5360
- opacity: 0.67,
5361
- padding: '0 12px'
5362
- }
5363
- }
5364
- }
5365
- };
5366
- });
5367
-
5368
5594
  var TooltipSelect = function TooltipSelect(_a) {
5369
5595
  var tooltip = _a.tooltip,
5370
5596
  _a$list = _a.list,
@@ -5390,8 +5616,6 @@ var TooltipSelect = function TooltipSelect(_a) {
5390
5616
  tooltipOpen = _React$useState4[0],
5391
5617
  setTooltipOpen = _React$useState4[1];
5392
5618
 
5393
- var classes = useStyles$B();
5394
-
5395
5619
  var preventDefault = function preventDefault(event) {
5396
5620
  event.preventDefault();
5397
5621
  event.stopPropagation();
@@ -5456,8 +5680,46 @@ var TooltipSelect = function TooltipSelect(_a) {
5456
5680
  onBlur: onBlur,
5457
5681
  onWheel: onWheel,
5458
5682
  MenuProps: {
5459
- classes: {
5460
- paper: classes.select
5683
+ BackdropProps: {
5684
+ sx: {
5685
+ '&.MuiBackdrop-root': {
5686
+ backgroundColor: 'transparent'
5687
+ }
5688
+ }
5689
+ },
5690
+ sx: {
5691
+ '& ul': {
5692
+ backgroundColor: 'geowebColors.background.surface'
5693
+ },
5694
+ '& li': {
5695
+ fontSize: '16px',
5696
+ padding: '12px',
5697
+ '&:hover': {
5698
+ backgroundColor: 'geowebColors.buttons.tool.mouseOver.fill'
5699
+ },
5700
+ '&.Mui-selected': {
5701
+ color: 'geowebColors.buttons.tool.active.color',
5702
+ backgroundColor: 'geowebColors.buttons.tool.active.fill',
5703
+ boxShadow: "none",
5704
+ '&:hover': {
5705
+ backgroundColor: 'geowebColors.buttons.tool.activeMouseOver.fill'
5706
+ },
5707
+ '&:focus': {
5708
+ backgroundColor: 'geowebColors.buttons.tool.activeMouseOver.fill'
5709
+ }
5710
+ },
5711
+ '&:after': {
5712
+ background: 'none!important'
5713
+ },
5714
+ '&.Mui-disabled': {
5715
+ fontSize: '12px',
5716
+ opacity: 0.67,
5717
+ padding: '0px 12px',
5718
+ '&.MuiMenuItem-root': {
5719
+ minHeight: '30px!important'
5720
+ }
5721
+ }
5722
+ }
5461
5723
  }
5462
5724
  }
5463
5725
  }, otherProps)));
@@ -5506,7 +5768,7 @@ var types = /*#__PURE__*/Object.freeze({
5506
5768
  var index = /*#__PURE__*/Object.freeze({
5507
5769
  __proto__: null,
5508
5770
  actions: actions$1,
5509
- constants: constants,
5771
+ constants: constants$1,
5510
5772
  types: types,
5511
5773
  initialState: initialState$4
5512
5774
  });
@@ -6300,7 +6562,20 @@ var reducer$2 = function reducer() {
6300
6562
  case GENERIC_SYNC_SETBBOX:
6301
6563
  {
6302
6564
  return produce$1(state, function (draft) {
6303
- action.payload.targets.forEach(function (payload) {
6565
+ var _action$payload21 = action.payload,
6566
+ targetsFromAction = _action$payload21.targets,
6567
+ source = _action$payload21.source;
6568
+ /* Because we want backwards compatibility with the previous code, we also need to listen to the original source action */
6569
+
6570
+ var targets = [{
6571
+ targetId: source.payload.sourceId,
6572
+ bbox: source.payload.bbox,
6573
+ srs: source.payload.srs
6574
+ }];
6575
+ /* And then append the targets form the action */
6576
+
6577
+ targets.push.apply(targets, _toConsumableArray(targetsFromAction));
6578
+ targets.forEach(function (payload) {
6304
6579
  var targetId = payload.targetId,
6305
6580
  bbox = payload.bbox,
6306
6581
  srs = payload.srs;
@@ -6318,9 +6593,9 @@ var reducer$2 = function reducer() {
6318
6593
 
6319
6594
  case WEBMAP_TOGGLE_AUTO_UPDATE:
6320
6595
  {
6321
- var _action$payload21 = action.payload,
6322
- _mapId23 = _action$payload21.mapId,
6323
- shouldAutoUpdate = _action$payload21.shouldAutoUpdate;
6596
+ var _action$payload22 = action.payload,
6597
+ _mapId23 = _action$payload22.mapId,
6598
+ shouldAutoUpdate = _action$payload22.shouldAutoUpdate;
6324
6599
 
6325
6600
  if (!state.byId[_mapId23]) {
6326
6601
  return state;
@@ -6333,9 +6608,9 @@ var reducer$2 = function reducer() {
6333
6608
 
6334
6609
  case WEBMAP_TOGGLE_LOOP:
6335
6610
  {
6336
- var _action$payload22 = action.payload,
6337
- _mapId24 = _action$payload22.mapId,
6338
- shouldLoop = _action$payload22.shouldLoop;
6611
+ var _action$payload23 = action.payload,
6612
+ _mapId24 = _action$payload23.mapId,
6613
+ shouldLoop = _action$payload23.shouldLoop;
6339
6614
 
6340
6615
  if (!state.byId[_mapId24]) {
6341
6616
  return state;
@@ -6348,9 +6623,9 @@ var reducer$2 = function reducer() {
6348
6623
 
6349
6624
  case WEBMAP_TOGGLE_TIMESTEP_AUTO:
6350
6625
  {
6351
- var _action$payload23 = action.payload,
6352
- _mapId25 = _action$payload23.mapId,
6353
- timestepAuto = _action$payload23.timestepAuto;
6626
+ var _action$payload24 = action.payload,
6627
+ _mapId25 = _action$payload24.mapId,
6628
+ timestepAuto = _action$payload24.timestepAuto;
6354
6629
 
6355
6630
  if (!state.byId[_mapId25]) {
6356
6631
  return state;
@@ -6363,9 +6638,9 @@ var reducer$2 = function reducer() {
6363
6638
 
6364
6639
  case WEBMAP_TOGGLE_TIME_SLIDER_HOVER:
6365
6640
  {
6366
- var _action$payload24 = action.payload,
6367
- _mapId26 = _action$payload24.mapId,
6368
- isTimeSliderHoverOn = _action$payload24.isTimeSliderHoverOn;
6641
+ var _action$payload25 = action.payload,
6642
+ _mapId26 = _action$payload25.mapId,
6643
+ isTimeSliderHoverOn = _action$payload25.isTimeSliderHoverOn;
6369
6644
 
6370
6645
  if (!state.byId[_mapId26]) {
6371
6646
  return state;
@@ -6378,9 +6653,9 @@ var reducer$2 = function reducer() {
6378
6653
 
6379
6654
  case WEBMAP_SET_PIN:
6380
6655
  {
6381
- var _action$payload25 = action.payload,
6382
- _mapId27 = _action$payload25.mapId,
6383
- mapPinLocation = _action$payload25.mapPinLocation;
6656
+ var _action$payload26 = action.payload,
6657
+ _mapId27 = _action$payload26.mapId,
6658
+ mapPinLocation = _action$payload26.mapPinLocation;
6384
6659
 
6385
6660
  if (!state.byId[_mapId27]) {
6386
6661
  return state;
@@ -6393,9 +6668,9 @@ var reducer$2 = function reducer() {
6393
6668
 
6394
6669
  case WEBMAP_DISABLE_PIN:
6395
6670
  {
6396
- var _action$payload26 = action.payload,
6397
- _mapId28 = _action$payload26.mapId,
6398
- disableMapPin = _action$payload26.disableMapPin;
6671
+ var _action$payload27 = action.payload,
6672
+ _mapId28 = _action$payload27.mapId,
6673
+ disableMapPin = _action$payload27.disableMapPin;
6399
6674
 
6400
6675
  if (!state.byId[_mapId28]) {
6401
6676
  return state;
@@ -6414,9 +6689,9 @@ var reducer$2 = function reducer() {
6414
6689
  * These targets can be used as payloads in new Layer actions.
6415
6690
  * These actions are here handled via the layer reducer, as it is the same logic
6416
6691
  */
6417
- var _action$payload27 = action.payload,
6418
- targets = _action$payload27.targets,
6419
- source = _action$payload27.source;
6692
+ var _action$payload28 = action.payload,
6693
+ targets = _action$payload28.targets,
6694
+ source = _action$payload28.source;
6420
6695
  return targets.reduce(function (prevState, target) {
6421
6696
  var action = {
6422
6697
  payload: target,
@@ -7244,6 +7519,39 @@ var enableOnlyOneKeyword = function enableOnlyOneKeyword(payload) {
7244
7519
  };
7245
7520
  };
7246
7521
 
7522
+ /* *
7523
+ * Licensed under the Apache License, Version 2.0 (the "License");
7524
+ * you may not use this file except in compliance with the License.
7525
+ * You may obtain a copy of the License at
7526
+ *
7527
+ * http://www.apache.org/licenses/LICENSE-2.0
7528
+ *
7529
+ * Unless required by applicable law or agreed to in writing, software
7530
+ * distributed under the License is distributed on an "AS IS" BASIS,
7531
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
7532
+ * See the License for the specific language governing permissions and
7533
+ * limitations under the License.
7534
+ *
7535
+ * Copyright 2022 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
7536
+ * Copyright 2022 - Finnish Meteorological Institute (FMI)
7537
+ * */
7538
+ var getUserAddedServices = function getUserAddedServices() {
7539
+ try {
7540
+ return JSON.parse(window.localStorage.getItem('userAddedServices')) || {};
7541
+ } catch (e) {
7542
+ console.error('Unable to read services from localStorage: ', e);
7543
+ }
7544
+
7545
+ return {};
7546
+ };
7547
+ var setUserAddedServices = function setUserAddedServices(services) {
7548
+ try {
7549
+ window.localStorage.setItem('userAddedServices', JSON.stringify(services));
7550
+ } catch (e) {
7551
+ console.error('Unable to write services to localStorage: ', e);
7552
+ }
7553
+ };
7554
+
7247
7555
  var _marked = /*#__PURE__*/regeneratorRuntime.mark(newServiceAddedSaga),
7248
7556
  _marked2 = /*#__PURE__*/regeneratorRuntime.mark(layerSelectServiceRemovedSaga),
7249
7557
  _marked3 = /*#__PURE__*/regeneratorRuntime.mark(rootSaga);
@@ -7291,6 +7599,23 @@ function layerSelectServiceRemovedSaga(capturedAction) {
7291
7599
  }
7292
7600
  }, _marked2);
7293
7601
  }
7602
+ function addServiceToLocalStorageSaga(_ref) {
7603
+ var payload = _ref.payload;
7604
+ var id = payload.id,
7605
+ isUserAddedService = payload.isUserAddedService,
7606
+ name = payload.name,
7607
+ service = payload.service;
7608
+ if (!isUserAddedService) return;
7609
+ var localStorageServices = getUserAddedServices();
7610
+ setUserAddedServices({
7611
+ byId: Object.assign(Object.assign({}, localStorageServices.byId), _defineProperty({}, service, {
7612
+ id: id,
7613
+ name: name,
7614
+ service: service
7615
+ })),
7616
+ allIds: _toConsumableArray(new Set([].concat(_toConsumableArray(localStorageServices.allIds || []), [service])))
7617
+ });
7618
+ }
7294
7619
  function rootSaga() {
7295
7620
  return regeneratorRuntime.wrap(function rootSaga$(_context3) {
7296
7621
  while (1) {
@@ -7304,6 +7629,10 @@ function rootSaga() {
7304
7629
  return takeEvery(MAP_SERVICES_REMOVE_SERVICE, layerSelectServiceRemovedSaga);
7305
7630
 
7306
7631
  case 4:
7632
+ _context3.next = 6;
7633
+ return takeEvery(MAP_SERVICES_SET_LAYERS, addServiceToLocalStorageSaga);
7634
+
7635
+ case 6:
7307
7636
  case "end":
7308
7637
  return _context3.stop();
7309
7638
  }
@@ -8065,7 +8394,7 @@ var defaultConfigurations = /*#__PURE__*/Object.freeze({
8065
8394
  preloadedDefaultMapServices: preloadedDefaultMapServices
8066
8395
  });
8067
8396
 
8068
- var useStyles$A = makeStyles({
8397
+ var useStyles$w = makeStyles({
8069
8398
  buttonDiv: {
8070
8399
  position: 'relative'
8071
8400
  },
@@ -8101,7 +8430,7 @@ var AddLayersPopup = function AddLayersPopup(_ref) {
8101
8430
  handleClose = _ref.handleClose,
8102
8431
  _ref$layerType = _ref.layerType,
8103
8432
  layerType = _ref$layerType === void 0 ? LayerType.mapLayer : _ref$layerType;
8104
- var classes = useStyles$A();
8433
+ var classes = useStyles$w();
8105
8434
 
8106
8435
  var _React$useState = React.useState(''),
8107
8436
  _React$useState2 = _slicedToArray(_React$useState, 2),
@@ -8254,7 +8583,7 @@ var AddLayersPopup = function AddLayersPopup(_ref) {
8254
8583
  }, "Close")));
8255
8584
  };
8256
8585
 
8257
- var styles = {
8586
+ var styles$1 = {
8258
8587
  buttonDiv: {
8259
8588
  position: 'relative'
8260
8589
  },
@@ -8306,7 +8635,7 @@ var AddLayersButton = function AddLayersButton(_ref) {
8306
8635
  title: tooltip
8307
8636
  }, /*#__PURE__*/React.createElement(IconButton, {
8308
8637
  onClick: handleClose,
8309
- sx: styles.button,
8638
+ sx: styles$1.button,
8310
8639
  disableRipple: true,
8311
8640
  "data-testid": "addLayersButton",
8312
8641
  ref: ref,
@@ -8360,6 +8689,9 @@ var LayerManagerColumnsLarge = makeStyles({
8360
8689
  column6: {
8361
8690
  width: iconButtonSize * 2,
8362
8691
  display: 'inline-flex'
8692
+ },
8693
+ columns35: {
8694
+ width: "calc((100% - ".concat(iconButtonSize * totalButtons, "px) * 0.75)")
8363
8695
  }
8364
8696
  });
8365
8697
  var LayerManagerColumnsSmall = makeStyles({
@@ -8381,6 +8713,9 @@ var LayerManagerColumnsSmall = makeStyles({
8381
8713
  column6: {
8382
8714
  width: iconButtonSize * 2,
8383
8715
  display: 'inline-flex'
8716
+ },
8717
+ columns35: {
8718
+ display: 'none'
8384
8719
  }
8385
8720
  });
8386
8721
  var LayerManagerWidth;
@@ -8465,7 +8800,7 @@ var LayerSelectButtonConnect = function LayerSelectButtonConnect(_ref) {
8465
8800
  * Copyright 2021 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
8466
8801
  * Copyright 2021 - Finnish Meteorological Institute (FMI)
8467
8802
  * */
8468
- var useStyles$z = makeStyles({
8803
+ var useStyles$v = makeStyles({
8469
8804
  row: {
8470
8805
  height: '32px'
8471
8806
  },
@@ -8489,7 +8824,7 @@ var DescriptionRow = function DescriptionRow(_ref) {
8489
8824
  layerManagerWidth = _ref.layerManagerWidth,
8490
8825
  _ref$layerSelect = _ref.layerSelect,
8491
8826
  layerSelect = _ref$layerSelect === void 0 ? false : _ref$layerSelect;
8492
- var classes = useStyles$z();
8827
+ var classes = useStyles$v();
8493
8828
  var columnSizes = layerManagerWidth === LayerManagerWidth.sm ? LayerManagerColumnsSmall() : LayerManagerColumnsLarge();
8494
8829
  return /*#__PURE__*/React.createElement(Grid, {
8495
8830
  container: true,
@@ -8566,18 +8901,18 @@ var useTooltipContainerStyles = makeStyles(function (theme) {
8566
8901
  borderColor: 'transparent!important'
8567
8902
  },
8568
8903
  '&:hover .MuiSelect-select': {
8569
- backgroundColor: theme.palette.geowebColors.layerManager.tableRowMouseover.rgba
8904
+ backgroundColor: theme.palette.geowebColors.buttons.tool.mouseOver.fill
8570
8905
  },
8571
8906
  '&.Mui-focused .MuiSelect-select': {
8572
8907
  outline: theme.palette.geowebColors.buttons.focusDefault.outline,
8573
- backgroundColor: theme.palette.geowebColors.layerManager.tableRowMouseover.rgba
8908
+ backgroundColor: theme.palette.geowebColors.buttons.tool.mouseOver.fill
8574
8909
  },
8575
8910
  '&:hover&.MuiButton-root': {
8576
- backgroundColor: theme.palette.geowebColors.layerManager.tableRowMouseover.rgba
8911
+ backgroundColor: theme.palette.geowebColors.buttons.tool.mouseOver.fill
8577
8912
  },
8578
8913
  '&:focus&.MuiButton-root': {
8579
8914
  outline: theme.palette.geowebColors.buttons.focusDefault.outline,
8580
- backgroundColor: theme.palette.geowebColors.layerManager.tableRowMouseover.rgba
8915
+ backgroundColor: theme.palette.geowebColors.buttons.tool.mouseOver.fill
8581
8916
  },
8582
8917
  '& .MuiSvgIcon-root': {
8583
8918
  transition: 'none',
@@ -8697,7 +9032,7 @@ var DimensionSelect = function DimensionSelect(_ref) {
8697
9032
  }
8698
9033
  }, /*#__PURE__*/React.createElement(MenuItem, {
8699
9034
  disabled: true
8700
- }, "Select dimension"), layerDimensions.map(function (dimension) {
9035
+ }, "Dimension"), layerDimensions.map(function (dimension) {
8701
9036
  return /*#__PURE__*/React.createElement(MenuItem, {
8702
9037
  key: dimension.name,
8703
9038
  value: dimension.name
@@ -8723,7 +9058,7 @@ var DimensionSelect = function DimensionSelect(_ref) {
8723
9058
  }
8724
9059
  }, /*#__PURE__*/React.createElement(MenuItem, {
8725
9060
  disabled: true
8726
- }, "Select dimension value. (", valuesToDisplay.length, " options)"), valuesToDisplay.map(function (dimValue) {
9061
+ }, "Dimension value (", valuesToDisplay.length, " options)"), valuesToDisplay.map(function (dimValue) {
8727
9062
  return /*#__PURE__*/React.createElement(MenuItem, {
8728
9063
  key: dimValue,
8729
9064
  value: dimValue
@@ -8731,194 +9066,7 @@ var DimensionSelect = function DimensionSelect(_ref) {
8731
9066
  }))));
8732
9067
  };
8733
9068
 
8734
- /* *
8735
- * Licensed under the Apache License, Version 2.0 (the "License");
8736
- * you may not use this file except in compliance with the License.
8737
- * You may obtain a copy of the License at
8738
- *
8739
- * http://www.apache.org/licenses/LICENSE-2.0
8740
- *
8741
- * Unless required by applicable law or agreed to in writing, software
8742
- * distributed under the License is distributed on an "AS IS" BASIS,
8743
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
8744
- * See the License for the specific language governing permissions and
8745
- * limitations under the License.
8746
- *
8747
- * Copyright 2021 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
8748
- * Copyright 2021 - Finnish Meteorological Institute (FMI)
8749
- * */
8750
- var useStyles$y = makeStyles(function (theme) {
8751
- return createStyles({
8752
- button: {
8753
- height: 28,
8754
- width: 28,
8755
- borderRadius: 5,
8756
- marginTop: 2,
8757
- color: function color(_ref) {
8758
- var isActive = _ref.isActive,
8759
- isAccessible = _ref.isAccessible,
8760
- isEnabled = _ref.isEnabled;
8761
-
8762
- if (!isEnabled) {
8763
- return theme.palette.geowebColors.buttons.flat.disabled.color;
8764
- }
8765
-
8766
- if (isAccessible) {
8767
- return theme.palette.geowebColors.greys.accessible;
8768
- }
8769
-
8770
- if (isActive) {
8771
- return theme.palette.common.white;
8772
- }
8773
-
8774
- return theme.palette.geowebColors.buttons.flat["default"].color;
8775
- },
8776
- backgroundColor: function backgroundColor(_ref2) {
8777
- var isActive = _ref2.isActive;
8778
- return isActive ? theme.palette.geowebColors.buttons.primary.active.fill : 'inherit';
8779
- },
8780
- '&:focus': {
8781
- backgroundColor: function backgroundColor(_ref3) {
8782
- var isActive = _ref3.isActive;
8783
- return isActive ? theme.palette.geowebColors.buttons.primary.mouseOver.fill : theme.palette.geowebColors.buttons.flat.mouseOver.fill;
8784
- },
8785
- outline: theme.palette.geowebColors.buttons.focusDefault.outline,
8786
- borderRadius: 0
8787
- },
8788
- '&:hover': {
8789
- backgroundColor: function backgroundColor(_ref4) {
8790
- var isActive = _ref4.isActive;
8791
- return isActive ? theme.palette.geowebColors.buttons.primary.mouseOver.fill : theme.palette.geowebColors.buttons.flat.mouseOver.fill;
8792
- }
8793
- }
8794
- },
8795
- popper: {
8796
- pointerEvents: 'none'
8797
- }
8798
- });
8799
- });
8800
-
8801
- var LayerManagerButton = function LayerManagerButton(_a) {
8802
- var _a$tooltipTitle = _a.tooltipTitle,
8803
- tooltipTitle = _a$tooltipTitle === void 0 ? '' : _a$tooltipTitle,
8804
- _a$onClick = _a.onClick,
8805
- onClick = _a$onClick === void 0 ? function () {} : _a$onClick,
8806
- _a$isActive = _a.isActive,
8807
- isActive = _a$isActive === void 0 ? false : _a$isActive,
8808
- _a$isEnabled = _a.isEnabled,
8809
- isEnabled = _a$isEnabled === void 0 ? true : _a$isEnabled,
8810
- icon = _a.icon,
8811
- testId = _a.testId,
8812
- _a$isAccessible = _a.isAccessible,
8813
- isAccessible = _a$isAccessible === void 0 ? false : _a$isAccessible,
8814
- className = _a.className,
8815
- props = __rest(_a, ["tooltipTitle", "onClick", "isActive", "isEnabled", "icon", "testId", "isAccessible", "className"]);
8816
-
8817
- var classes = useStyles$y({
8818
- isActive: isActive,
8819
- isEnabled: isEnabled,
8820
- isAccessible: isAccessible
8821
- });
8822
-
8823
- var handleClick = function handleClick(event) {
8824
- onClick(event);
8825
- };
8826
-
8827
- return /*#__PURE__*/React.createElement(Tooltip, {
8828
- title: tooltipTitle,
8829
- placement: "top",
8830
- classes: {
8831
- popper: classes.popper
8832
- }
8833
- }, /*#__PURE__*/React.createElement(IconButton, Object.assign({
8834
- size: "small",
8835
- onClick: handleClick,
8836
- "data-testid": testId,
8837
- className: "".concat(classes.button, " ").concat(className),
8838
- disableFocusRipple: true
8839
- }, props), icon));
8840
- };
8841
-
8842
- /* *
8843
- * Licensed under the Apache License, Version 2.0 (the "License");
8844
- * you may not use this file except in compliance with the License.
8845
- * You may obtain a copy of the License at
8846
- *
8847
- * http://www.apache.org/licenses/LICENSE-2.0
8848
- *
8849
- * Unless required by applicable law or agreed to in writing, software
8850
- * distributed under the License is distributed on an "AS IS" BASIS,
8851
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
8852
- * See the License for the specific language governing permissions and
8853
- * limitations under the License.
8854
- *
8855
- * Copyright 2021 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
8856
- * Copyright 2021 - Finnish Meteorological Institute (FMI)
8857
- * */
8858
- var useStyles$x = makeStyles(function (theme) {
8859
- return createStyles({
8860
- checkbox: {
8861
- color: 'inherit',
8862
- padding: 4,
8863
- borderRadius: 5,
8864
- '&.Mui-focusVisible': {
8865
- backgroundColor: theme.palette.geowebColors.layerManager.tableRowMouseover.rgba
8866
- },
8867
- '&:hover': {
8868
- backgroundColor: 'transparent!important'
8869
- },
8870
- '&.Mui-checked': {
8871
- color: 'inherit'
8872
- }
8873
- }
8874
- });
8875
- });
8876
-
8877
- var EnableLayer = function EnableLayer(_ref) {
8878
- var isEnabled = _ref.isEnabled,
8879
- title = _ref.title,
8880
- onChangeEnableLayer = _ref.onChangeEnableLayer;
8881
- var classes = useStyles$x(isEnabled);
8882
-
8883
- var onClick = function onClick() {
8884
- onChangeEnableLayer(!isEnabled);
8885
- };
8886
-
8887
- var visibilityIcon = /*#__PURE__*/React.createElement(SvgIcon, null, /*#__PURE__*/React.createElement("rect", {
8888
- width: 24,
8889
- height: 24,
8890
- fill: "transparent"
8891
- }), /*#__PURE__*/React.createElement("path", {
8892
- d: "M14.4980749,15.8618431 C15.8661433,15.0851043 16.779689,13.6936347 16.779689,12.1014551 C16.779689,10.5092755 15.8661433,9.11870594 14.4980749,8.34106705 C17.6257313,9.18620931 19.3529176,11.4300215 19.8092405,12.1014551 C19.3529176,12.7719886 17.6266313,15.0167008 14.4980749,15.8618431 L14.4980749,15.8618431 Z M4.18985949,12.1014551 C4.64618231,11.4300215 6.37336867,9.18710936 9.49922496,8.3419671 C8.13295665,9.11870594 7.21851093,10.5101755 7.21851093,12.1014551 C7.21851093,13.6936347 8.13295665,15.0842042 9.49922496,15.8618431 C6.37336867,15.0167008 4.64618231,12.7728886 4.18985949,12.1014551 L4.18985949,12.1014551 Z M11.99955,13.8583429 C10.9950998,13.8583429 10.180559,13.0717036 10.180559,12.1014551 C10.180559,11.1312066 10.9950998,10.3445672 11.99955,10.3445672 C13.0031002,10.3445672 13.8176409,11.1312066 13.8176409,12.1014551 C13.8176409,13.0717036 13.0031002,13.8583429 11.99955,13.8583429 L11.99955,13.8583429 Z M20.7983899,11.7666383 C20.6813841,11.5713286 17.8696435,7 11.99955,7 C6.12945647,7 3.31681584,11.5713286 3.19980999,11.7666383 L3,12.1014551 L3.19980999,12.4362718 C3.31681584,12.6306815 6.12945647,17.2020101 11.99955,17.2020101 C17.8696435,17.2020101 20.6813841,12.6306815 20.7983899,12.4362718 L21,12.1014551 L20.7983899,11.7666383 Z"
8893
- }));
8894
- var visibilityOffIcon = /*#__PURE__*/React.createElement(SvgIcon, {
8895
- style: {
8896
- marginTop: 2
8897
- }
8898
- }, /*#__PURE__*/React.createElement("rect", {
8899
- width: 24,
8900
- height: 24,
8901
- fill: "transparent"
8902
- }), /*#__PURE__*/React.createElement("path", {
8903
- d: "M12 15.309c-.755 0-1.45-.088-2.092-.236l.798-.797c.41.124.844.192 1.294.192 2.453 0 4.442-1.988 4.442-4.44 0-.495-.085-.907-.234-1.255l.03-.03c1.72.906 2.781 2.167 3.218 2.766-.724.992-3.151 3.8-7.456 3.8zm-7.456-3.8c.442-.607 1.522-1.89 3.276-2.796-.166.36-.261.79-.261 1.315 0 1.228.499 2.34 1.305 3.144l-1.102 1.104c-1.72-.906-2.78-2.169-3.218-2.767zm5.646-3.524c.818 0 1.482.665 1.482 1.483 0 .818-.664 1.481-1.482 1.481s-1.482-.663-1.482-1.481c0-.818.664-1.483 1.482-1.483zm10.608 3.19c-.073-.125-1.245-2.026-3.603-3.388l2.009-2.01c.406-.406.406-1.065 0-1.473-.407-.405-1.066-.405-1.473 0l-2.58 2.582c-.93-.295-1.98-.478-3.151-.478-5.87 0-8.681 4.57-8.798 4.766L3 11.51l.202.335c.073.124 1.244 2.025 3.603 3.387l-2.009 2.01c-.406.406-.406 1.065 0 1.472.204.203.47.305.737.305.266 0 .532-.102.736-.305l2.58-2.58c.93.293 1.98.476 3.151.476 5.87 0 8.681-4.57 8.798-4.765l.202-.335-.202-.335z"
8904
- }));
8905
- return /*#__PURE__*/React.createElement(LayerManagerButton, {
8906
- tooltipTitle: title,
8907
- onClick: onClick,
8908
- icon: /*#__PURE__*/React.createElement(Checkbox, {
8909
- className: classes.checkbox,
8910
- icon: visibilityOffIcon,
8911
- checkedIcon: visibilityIcon,
8912
- checked: isEnabled,
8913
- disableFocusRipple: true,
8914
- tabIndex: -1
8915
- }),
8916
- testId: "enableLayer",
8917
- isEnabled: isEnabled
8918
- });
8919
- };
8920
-
8921
- var useStyles$w = makeStyles(function (theme) {
9069
+ var useStyles$u = makeStyles(function (theme) {
8922
9070
  return createStyles({
8923
9071
  dropdownEmpty: {
8924
9072
  paddingLeft: 8,
@@ -8968,7 +9116,7 @@ var RenderLayers = function RenderLayers(_ref) {
8968
9116
  layers = _ref$layers === void 0 ? [] : _ref$layers,
8969
9117
  _ref$isEnabled = _ref.isEnabled,
8970
9118
  isEnabled = _ref$isEnabled === void 0 ? true : _ref$isEnabled;
8971
- var classes = useStyles$w();
9119
+ var classes = useStyles$u();
8972
9120
  var containerClass = useTooltipContainerStyles(isEnabled);
8973
9121
 
8974
9122
  if (!layers || !layers.length) {
@@ -9014,7 +9162,7 @@ var RenderLayers = function RenderLayers(_ref) {
9014
9162
  requiresCtrlToChange: true
9015
9163
  }, /*#__PURE__*/React.createElement(MenuItem, {
9016
9164
  disabled: true
9017
- }, "Select layer"), extendedLayers.map(function (layerFromServiceLayers) {
9165
+ }, "Layer"), extendedLayers.map(function (layerFromServiceLayers) {
9018
9166
  return /*#__PURE__*/React.createElement(MenuItem, {
9019
9167
  key: layerFromServiceLayers.name,
9020
9168
  value: layerFromServiceLayers.name,
@@ -9023,7 +9171,7 @@ var RenderLayers = function RenderLayers(_ref) {
9023
9171
  }));
9024
9172
  };
9025
9173
 
9026
- var useStyles$v = makeStyles(function (theme) {
9174
+ var useStyles$t = makeStyles(function (theme) {
9027
9175
  return {
9028
9176
  opacityDiv: {
9029
9177
  height: 'calc(100% - 5px)',
@@ -9046,7 +9194,7 @@ var useStyles$v = makeStyles(function (theme) {
9046
9194
  position: 'fixed',
9047
9195
  top: '-5px',
9048
9196
  boxSizing: 'initial',
9049
- zIndex: 1,
9197
+ zIndex: 2,
9050
9198
  boxShadow: theme.shadows[8]
9051
9199
  }
9052
9200
  };
@@ -9084,7 +9232,7 @@ var OpacitySelect = function OpacitySelect(_ref) {
9084
9232
  onLayerChangeOpacity = _ref.onLayerChangeOpacity,
9085
9233
  _ref$isEnabled = _ref.isEnabled,
9086
9234
  isEnabled = _ref$isEnabled === void 0 ? true : _ref$isEnabled;
9087
- var classes = useStyles$v();
9235
+ var classes = useStyles$t();
9088
9236
  var sliderClasses = sliderStyles();
9089
9237
  var containerClass = useTooltipContainerStyles(isEnabled);
9090
9238
 
@@ -9288,7 +9436,7 @@ var RenderStyles = function RenderStyles(_ref) {
9288
9436
  requiresCtrlToChange: true
9289
9437
  }, /*#__PURE__*/React.createElement(MenuItem, {
9290
9438
  disabled: true
9291
- }, "Select style"), styles.map(function (styleFromlayer) {
9439
+ }, "Style"), styles.map(function (styleFromlayer) {
9292
9440
  return /*#__PURE__*/React.createElement(MenuItem, {
9293
9441
  key: styleFromlayer.name,
9294
9442
  value: styleFromlayer.name
@@ -9312,59 +9460,22 @@ var RenderStyles = function RenderStyles(_ref) {
9312
9460
  * Copyright 2021 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
9313
9461
  * Copyright 2021 - Finnish Meteorological Institute (FMI)
9314
9462
  * */
9315
- var useStyles$u = makeStyles(function () {
9316
- return createStyles({
9317
- icon: {
9318
- width: 20,
9319
- height: 20
9320
- }
9321
- });
9322
- });
9323
-
9324
- var DeleteButton = function DeleteButton(_ref) {
9325
- var tooltipTitle = _ref.tooltipTitle,
9326
- onClickDelete = _ref.onClickDelete,
9327
- _ref$isEnabled = _ref.isEnabled,
9328
- isEnabled = _ref$isEnabled === void 0 ? true : _ref$isEnabled;
9329
- var classes = useStyles$u();
9330
- return /*#__PURE__*/React.createElement(LayerManagerButton, {
9331
- tooltipTitle: tooltipTitle,
9332
- onClick: onClickDelete,
9333
- icon: /*#__PURE__*/React.createElement(Delete, {
9334
- className: classes.icon
9335
- }),
9336
- testId: "deleteButton",
9337
- isEnabled: isEnabled
9338
- });
9339
- };
9340
-
9341
- /* *
9342
- * Licensed under the Apache License, Version 2.0 (the "License");
9343
- * you may not use this file except in compliance with the License.
9344
- * You may obtain a copy of the License at
9345
- *
9346
- * http://www.apache.org/licenses/LICENSE-2.0
9347
- *
9348
- * Unless required by applicable law or agreed to in writing, software
9349
- * distributed under the License is distributed on an "AS IS" BASIS,
9350
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
9351
- * See the License for the specific language governing permissions and
9352
- * limitations under the License.
9353
- *
9354
- * Copyright 2021 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
9355
- * Copyright 2021 - Finnish Meteorological Institute (FMI)
9356
- * */
9357
- var useStyles$t = makeStyles(function (theme) {
9463
+ var useStyles$s = makeStyles(function (theme) {
9358
9464
  return createStyles({
9359
9465
  svgIcon: {
9360
9466
  fill: function fill(_ref) {
9361
- var isActive = _ref.isActive;
9467
+ var isActive = _ref.isActive,
9468
+ isEnabled = _ref.isEnabled;
9362
9469
 
9363
9470
  if (isActive) {
9364
9471
  return theme.palette.common.white;
9365
9472
  }
9366
9473
 
9367
- return theme.palette.geowebColors.buttons.flat["default"].color;
9474
+ if (isEnabled) {
9475
+ return theme.palette.geowebColors.buttons.flat["default"].color;
9476
+ }
9477
+
9478
+ return theme.palette.geowebColors.buttons.flat.disabled.color;
9368
9479
  }
9369
9480
  }
9370
9481
  });
@@ -9378,7 +9489,7 @@ var ActivateLayer = function ActivateLayer(_ref2) {
9378
9489
  isActive = _ref2$isActive === void 0 ? false : _ref2$isActive,
9379
9490
  _ref2$isEnabled = _ref2.isEnabled,
9380
9491
  isEnabled = _ref2$isEnabled === void 0 ? true : _ref2$isEnabled;
9381
- var classes = useStyles$t({
9492
+ var classes = useStyles$s({
9382
9493
  isActive: isActive,
9383
9494
  isEnabled: isEnabled
9384
9495
  });
@@ -9406,7 +9517,7 @@ var ActivateLayer = function ActivateLayer(_ref2) {
9406
9517
  }))));
9407
9518
  };
9408
9519
 
9409
- return /*#__PURE__*/React.createElement(LayerManagerButton, {
9520
+ return /*#__PURE__*/React.createElement(ManagerButton, {
9410
9521
  tooltipTitle: tooltipTitle,
9411
9522
  onClick: onClickActivate,
9412
9523
  icon: /*#__PURE__*/React.createElement(Icon, null),
@@ -9431,7 +9542,7 @@ var ActivateLayer = function ActivateLayer(_ref2) {
9431
9542
  * Copyright 2021 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
9432
9543
  * Copyright 2021 - Finnish Meteorological Institute (FMI)
9433
9544
  * */
9434
- var useStyles$s = makeStyles(function (theme) {
9545
+ var useStyles$r = makeStyles(function (theme) {
9435
9546
  return createStyles({
9436
9547
  row: {
9437
9548
  background: function background(isEnabled) {
@@ -9465,6 +9576,8 @@ var LayerRow = function LayerRow(_ref) {
9465
9576
  } : _ref$onLayerRowClick,
9466
9577
  _ref$isEnabled = _ref.isEnabled,
9467
9578
  isEnabled = _ref$isEnabled === void 0 ? true : _ref$isEnabled,
9579
+ _ref$isLayerMissing = _ref.isLayerMissing,
9580
+ isLayerMissing = _ref$isLayerMissing === void 0 ? false : _ref$isLayerMissing,
9468
9581
  onLayerEnable = _ref.onLayerEnable,
9469
9582
  onLayerChangeName = _ref.onLayerChangeName,
9470
9583
  onLayerChangeStyle = _ref.onLayerChangeStyle,
@@ -9482,7 +9595,7 @@ var LayerRow = function LayerRow(_ref) {
9482
9595
  layerActiveLayout = _ref.layerActiveLayout,
9483
9596
  layerManagerWidth = _ref.layerManagerWidth,
9484
9597
  dragHandle = _ref.dragHandle;
9485
- var classes = useStyles$s(isEnabled);
9598
+ var classes = useStyles$r(isEnabled);
9486
9599
  var columnSizes = layerManagerWidth === LayerManagerWidth.sm ? LayerManagerColumnsSmall() : LayerManagerColumnsLarge();
9487
9600
 
9488
9601
  var onClickRow = function onClickRow() {
@@ -9497,7 +9610,7 @@ var LayerRow = function LayerRow(_ref) {
9497
9610
  }, /*#__PURE__*/React__default.createElement(Grid, {
9498
9611
  item: true,
9499
9612
  className: columnSizes.column1
9500
- }, dragHandle, layerEnableLayout || /*#__PURE__*/React__default.createElement(EnableLayer, {
9613
+ }, dragHandle, layerEnableLayout || /*#__PURE__*/React__default.createElement(EnableButton, {
9501
9614
  isEnabled: layer.enabled,
9502
9615
  title: layer.name,
9503
9616
  onChangeEnableLayer: function onChangeEnableLayer() {
@@ -9520,7 +9633,13 @@ var LayerRow = function LayerRow(_ref) {
9520
9633
  name: name
9521
9634
  });
9522
9635
  }
9523
- })), /*#__PURE__*/React__default.createElement(Grid, {
9636
+ })), isLayerMissing ? /*#__PURE__*/React__default.createElement(Grid, {
9637
+ item: true,
9638
+ className: "".concat(columnSizes.columns35)
9639
+ }, /*#__PURE__*/React__default.createElement(AlertBanner, {
9640
+ title: "This layer could not be loaded: does not exist on the server.",
9641
+ isCompact: true
9642
+ })) : /*#__PURE__*/React__default.createElement(React__default.Fragment, null, /*#__PURE__*/React__default.createElement(Grid, {
9524
9643
  item: true,
9525
9644
  className: "".concat(columnSizes.column3)
9526
9645
  }, layerStylesLayout || /*#__PURE__*/React__default.createElement(RenderStyles, {
@@ -9563,10 +9682,10 @@ var LayerRow = function LayerRow(_ref) {
9563
9682
  dimension: dimension
9564
9683
  });
9565
9684
  }
9566
- })), /*#__PURE__*/React__default.createElement(Grid, {
9685
+ }))), /*#__PURE__*/React__default.createElement(Grid, {
9567
9686
  item: true,
9568
9687
  className: columnSizes.column6
9569
- }, layerDeleteLayout || /*#__PURE__*/React__default.createElement(DeleteButton, {
9688
+ }, layerDeleteLayout || /*#__PURE__*/React__default.createElement(ManagerDeleteButton, {
9570
9689
  tooltipTitle: "Remove layer",
9571
9690
  onClickDelete: function onClickDelete() {
9572
9691
  onLayerDelete({
@@ -9616,7 +9735,7 @@ var DeleteLayerConnect = function DeleteLayerConnect(_ref) {
9616
9735
  var isLayerEnabled = useSelector(function (store) {
9617
9736
  return getLayerEnabled(store, layerId);
9618
9737
  });
9619
- return /*#__PURE__*/React.createElement(DeleteButton, {
9738
+ return /*#__PURE__*/React.createElement(ManagerDeleteButton, {
9620
9739
  tooltipTitle: "Remove layer",
9621
9740
  onClickDelete: function onClickDelete() {
9622
9741
  layerDelete$1({
@@ -9660,7 +9779,7 @@ var EnableLayerConnect = function EnableLayerConnect(_ref) {
9660
9779
  enabled: enabled
9661
9780
  }));
9662
9781
  }, [dispatch]);
9663
- return /*#__PURE__*/React.createElement(EnableLayer, {
9782
+ return /*#__PURE__*/React.createElement(EnableButton, {
9664
9783
  isEnabled: isEnabled,
9665
9784
  title: "Toggle this layer's visibility",
9666
9785
  onChangeEnableLayer: function onChangeEnableLayer(enable) {
@@ -10004,10 +10123,23 @@ var LayerRowConnect = function LayerRowConnect(_ref) {
10004
10123
  var isEnabled = useSelector(function (store) {
10005
10124
  return getLayerEnabled(store, layerId);
10006
10125
  });
10126
+ var layerName = useSelector(function (store) {
10127
+ return getLayerName(store, layerId);
10128
+ });
10129
+ var layerService = useSelector(function (store) {
10130
+ return getLayerService(store, layerId);
10131
+ });
10132
+ var layers = useSelector(function (store) {
10133
+ return getLayersFromService$1(store, layerService);
10134
+ });
10135
+ var isLayerMissing = layers && layers.length > 0 && !layers.some(function (l) {
10136
+ return l.name === layerName;
10137
+ });
10007
10138
  return /*#__PURE__*/React.createElement(LayerRow, {
10008
10139
  isEnabled: isEnabled,
10009
10140
  mapId: mapId,
10010
10141
  layerId: layerId,
10142
+ isLayerMissing: isLayerMissing,
10011
10143
  layerEnableLayout: /*#__PURE__*/React.createElement(EnableLayerConnect, {
10012
10144
  layerId: layerId
10013
10145
  }),
@@ -10067,7 +10199,7 @@ var DragHandle = function DragHandle(_ref) {
10067
10199
  _ref$hideTooltip = _ref.hideTooltip,
10068
10200
  hideTooltip = _ref$hideTooltip === void 0 ? false : _ref$hideTooltip;
10069
10201
  var tooltipTitle = hideTooltip ? '' : TOOLTIP_TITLE;
10070
- return /*#__PURE__*/React__default.createElement(LayerManagerButton, {
10202
+ return /*#__PURE__*/React__default.createElement(ManagerButton, {
10071
10203
  tooltipTitle: tooltipTitle,
10072
10204
  icon: /*#__PURE__*/React__default.createElement(DragIndicator, null),
10073
10205
  testId: "dragHandle".concat(index !== undefined ? "-".concat(index) : ''),
@@ -10089,7 +10221,7 @@ var DragHandle = function DragHandle(_ref) {
10089
10221
  });
10090
10222
  };
10091
10223
 
10092
- var useStyles$r = makeStyles(function () {
10224
+ var useStyles$q = makeStyles(function () {
10093
10225
  return {
10094
10226
  layerRows: {
10095
10227
  width: '100%',
@@ -10156,7 +10288,7 @@ var LayerContainerRow = function LayerContainerRow(_ref) {
10156
10288
 
10157
10289
  var isSorting = activeDragIndex !== null;
10158
10290
  var isDragDisabled = layerIds.length === 1;
10159
- var classes = useStyles$r(isSorting);
10291
+ var classes = useStyles$q(isSorting);
10160
10292
  return /*#__PURE__*/React.createElement(Grid, {
10161
10293
  container: true,
10162
10294
  item: true,
@@ -10254,7 +10386,7 @@ var BaseLayers = function BaseLayers(_ref) {
10254
10386
  }
10255
10387
  }, /*#__PURE__*/React.createElement(MenuItem, {
10256
10388
  disabled: true
10257
- }, "Select base layer"), availableBaseLayers.map(function (baseLayer) {
10389
+ }, "Base layer"), availableBaseLayers.map(function (baseLayer) {
10258
10390
  return /*#__PURE__*/React.createElement(MenuItem, {
10259
10391
  key: baseLayer.id,
10260
10392
  value: baseLayer.id
@@ -10366,7 +10498,7 @@ var BaseLayersConnect = function BaseLayersConnect(_ref) {
10366
10498
  * Copyright 2021 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
10367
10499
  * Copyright 2021 - Finnish Meteorological Institute (FMI)
10368
10500
  * */
10369
- var useStyles$q = makeStyles({
10501
+ var useStyles$p = makeStyles({
10370
10502
  layerRow: {
10371
10503
  width: '100%',
10372
10504
  height: '36px'
@@ -10389,7 +10521,7 @@ var BaseLayerRow = function BaseLayerRow(_ref) {
10389
10521
  layerManagerWidth = _ref.layerManagerWidth,
10390
10522
  _ref$tooltip = _ref.tooltip,
10391
10523
  tooltip = _ref$tooltip === void 0 ? '' : _ref$tooltip;
10392
- var classes = useStyles$q();
10524
+ var classes = useStyles$p();
10393
10525
  var columnSizes = layerManagerWidth === LayerManagerWidth.sm ? LayerManagerColumnsSmall() : LayerManagerColumnsLarge();
10394
10526
  return /*#__PURE__*/React.createElement(Grid, {
10395
10527
  container: true,
@@ -10418,7 +10550,7 @@ var BaseLayerRow = function BaseLayerRow(_ref) {
10418
10550
  })));
10419
10551
  };
10420
10552
 
10421
- var useStyles$p = makeStyles({
10553
+ var useStyles$o = makeStyles({
10422
10554
  layerRowContainer: {
10423
10555
  position: 'relative',
10424
10556
  width: '100%',
@@ -10453,7 +10585,7 @@ var LayerManager = function LayerManager(_ref) {
10453
10585
  layerSelect = _ref$layerSelect === void 0 ? false : _ref$layerSelect,
10454
10586
  _ref$showAddLayersToo = _ref.showAddLayersTooltip,
10455
10587
  showAddLayersTooltip = _ref$showAddLayersToo === void 0 ? true : _ref$showAddLayersToo;
10456
- var classes = useStyles$p();
10588
+ var classes = useStyles$o();
10457
10589
 
10458
10590
  var _React$useState = React.useState(LayerManagerWidth.lg),
10459
10591
  _React$useState2 = _slicedToArray(_React$useState, 2),
@@ -10860,7 +10992,8 @@ var ServicePopup = function ServicePopup(_ref) {
10860
10992
  id: serviceUrl,
10861
10993
  name: serviceName,
10862
10994
  service: serviceUrl,
10863
- layers: serviceLayers
10995
+ layers: serviceLayers,
10996
+ isUserAddedService: true
10864
10997
  });
10865
10998
  setIsLoading(false);
10866
10999
  closePopupAndResetState();
@@ -11325,7 +11458,7 @@ var filterLayersFromService = function filterLayersFromService(serviceId, servic
11325
11458
  });
11326
11459
  };
11327
11460
 
11328
- var useStyles$o = makeStyles(function (theme) {
11461
+ var useStyles$n = makeStyles(function (theme) {
11329
11462
  return {
11330
11463
  layerRow: {
11331
11464
  background: theme.palette.geowebColors.cards.cardContainer,
@@ -11383,7 +11516,7 @@ var LayerList = function LayerList(_ref) {
11383
11516
  mapLayers = _ref.mapLayers,
11384
11517
  keywordIds = _ref.keywordIds,
11385
11518
  allKeywordsActive = _ref.allKeywordsActive;
11386
- var classes = useStyles$o();
11519
+ var classes = useStyles$n();
11387
11520
 
11388
11521
  var _React$useState = React.useState(0),
11389
11522
  _React$useState2 = _slicedToArray(_React$useState, 2),
@@ -11638,7 +11771,7 @@ var ServiceChipConnect = function ServiceChipConnect(_ref) {
11638
11771
  });
11639
11772
  };
11640
11773
 
11641
- var useStyles$n = makeStyles(function (theme) {
11774
+ var useStyles$m = makeStyles(function (theme) {
11642
11775
  return createStyles({
11643
11776
  serviceChips: {
11644
11777
  width: '100%',
@@ -11662,7 +11795,7 @@ var useStyles$n = makeStyles(function (theme) {
11662
11795
  fontSize: '0.875rem'
11663
11796
  },
11664
11797
  scrollArrowLeft: {
11665
- width: '120px',
11798
+ width: '100px',
11666
11799
  marginBottom: '-12px',
11667
11800
  height: '34px',
11668
11801
  backgroundImage: "linear-gradient(to left, rgba(0, 0, 0, 0), ".concat(theme.palette.geowebColors.background.surfaceApp, " 51%)"),
@@ -11670,7 +11803,10 @@ var useStyles$n = makeStyles(function (theme) {
11670
11803
  marginRight: '-120px',
11671
11804
  "float": 'left',
11672
11805
  zIndex: 1,
11673
- position: 'relative'
11806
+ position: 'relative',
11807
+ '&:hover': {
11808
+ color: theme.palette.geowebColors.buttons.tertiary.activeMouseOver.color
11809
+ }
11674
11810
  },
11675
11811
  serviceList: {
11676
11812
  height: '32px',
@@ -11679,13 +11815,16 @@ var useStyles$n = makeStyles(function (theme) {
11679
11815
  overflow: 'hidden'
11680
11816
  },
11681
11817
  scrollArrowRight: {
11682
- width: '120px',
11818
+ width: '100px',
11683
11819
  marginBottom: '-12px',
11684
11820
  height: '34px',
11685
11821
  backgroundImage: "linear-gradient(to right, rgba(0, 0, 0, 0), ".concat(theme.palette.geowebColors.background.surfaceApp, " 51%)"),
11686
11822
  right: '0px',
11687
11823
  position: 'fixed',
11688
- cursor: 'pointer'
11824
+ cursor: 'pointer',
11825
+ '&:hover': {
11826
+ color: theme.palette.geowebColors.buttons.tertiary.activeMouseOver.color
11827
+ }
11689
11828
  }
11690
11829
  });
11691
11830
  });
@@ -11713,7 +11852,7 @@ var ServiceList = function ServiceList(_ref4) {
11713
11852
  var ref = React.useRef(null);
11714
11853
  var scrollSpeed = 5;
11715
11854
  var maxWidthValue = ref && ref.current && ref.current.scrollWidth && ref.current.scrollWidth >= layerSelectWidth - margin && ref.current.scrollWidth || layerSelectWidth - 50;
11716
- var classes = useStyles$n({
11855
+ var classes = useStyles$m({
11717
11856
  margin: margin,
11718
11857
  maxWidthValue: maxWidthValue
11719
11858
  });
@@ -11827,63 +11966,49 @@ var ServiceListConnect = function ServiceListConnect(_ref) {
11827
11966
  });
11828
11967
  };
11829
11968
 
11830
- var useStyles$m = makeStyles(function (theme) {
11831
- return createStyles({
11832
- servicesContainer: {
11833
- width: '300px',
11834
- maxHeight: '380px',
11835
- top: '140px',
11836
- backgroundColor: theme.palette.geowebColors.background.surface,
11837
- boxShadow: theme.shadows[6],
11838
- overflow: 'auto'
11839
- },
11840
- header: {
11841
- position: 'sticky',
11842
- top: 0,
11843
- fontSize: theme.typography.fontSize,
11844
- padding: '12px',
11845
- backgroundColor: theme.palette.geowebColors.background.surface,
11846
- zIndex: 100
11847
- },
11848
- footer: {
11849
- display: 'flex',
11850
- justifyContent: 'center',
11851
- alignItems: 'center',
11852
- position: 'sticky',
11853
- bottom: 0,
11854
- backgroundColor: theme.palette.geowebColors.background.surface,
11855
- zIndex: 100
11856
- },
11857
- iconFill: {
11858
- color: theme.palette.geowebColors.typographyAndIcons.icon
11859
- },
11860
- button: {
11861
- margin: '16px',
11862
- width: '80%',
11863
- fontSize: '12px',
11864
- textTransform: 'none'
11865
- },
11866
- text: {
11867
- paddingTop: '3px',
11868
- fontSize: '12px',
11869
- fontFamily: theme.typography.fontFamily,
11870
- fontWeight: theme.typography.fontWeightRegular,
11871
- textTransform: 'none',
11872
- color: '#575f7a'
11873
- },
11874
- icon: {
11875
- width: '24px',
11876
- height: '24px'
11877
- }
11878
- });
11879
- });
11969
+ var styles = {
11970
+ servicesContainer: {
11971
+ width: '300px',
11972
+ maxHeight: '380px',
11973
+ top: '140px',
11974
+ backgroundColor: 'geowebColors.background.surface',
11975
+ boxShadow: 6,
11976
+ overflow: 'auto'
11977
+ },
11978
+ header: {
11979
+ position: 'sticky',
11980
+ top: 0,
11981
+ fontSize: 'default',
11982
+ padding: '12px',
11983
+ backgroundColor: 'geowebColors.background.surface',
11984
+ zIndex: 100
11985
+ },
11986
+ footer: {
11987
+ display: 'flex',
11988
+ justifyContent: 'center',
11989
+ alignItems: 'center',
11990
+ position: 'sticky',
11991
+ bottom: 0,
11992
+ backgroundColor: 'geowebColors.background.surface',
11993
+ zIndex: 100
11994
+ },
11995
+ button: {
11996
+ margin: '16px',
11997
+ width: '80%',
11998
+ fontSize: '12px',
11999
+ textTransform: 'none'
12000
+ },
12001
+ icon: {
12002
+ width: '24px',
12003
+ height: '24px'
12004
+ }
12005
+ };
11880
12006
 
11881
12007
  var ServiceOptionsDialog = function ServiceOptionsDialog(_ref) {
11882
12008
  var services = _ref.services,
11883
12009
  mapStoreRemoveService = _ref.mapStoreRemoveService,
11884
12010
  _ref$layers = _ref.layers,
11885
12011
  layers = _ref$layers === void 0 ? [] : _ref$layers;
11886
- var classes = useStyles$m();
11887
12012
 
11888
12013
  var _React$useState = React.useState(false),
11889
12014
  _React$useState2 = _slicedToArray(_React$useState, 2),
@@ -11907,11 +12032,11 @@ var ServiceOptionsDialog = function ServiceOptionsDialog(_ref) {
11907
12032
  };
11908
12033
 
11909
12034
  return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Box, {
11910
- className: classes.servicesContainer,
12035
+ sx: styles.servicesContainer,
11911
12036
  "data-testid": "ServiceDialog"
11912
- }, /*#__PURE__*/React.createElement("div", {
11913
- className: classes.header
11914
- }, " Services"), /*#__PURE__*/React.createElement(List, {
12037
+ }, /*#__PURE__*/React.createElement(Box, {
12038
+ sx: styles.header
12039
+ }, "Services"), /*#__PURE__*/React.createElement(List, {
11915
12040
  disablePadding: true
11916
12041
  }, services.map(function (service) {
11917
12042
  return /*#__PURE__*/React.createElement(ListItem, {
@@ -11938,7 +12063,6 @@ var ServiceOptionsDialog = function ServiceOptionsDialog(_ref) {
11938
12063
  size: "large"
11939
12064
  }, /*#__PURE__*/React.createElement(SvgIcon, null, /*#__PURE__*/React.createElement("g", null, /*#__PURE__*/React.createElement("path", {
11940
12065
  d: "m8.332 17.09-.005.001-2.652.604.956-2.542.001-.001.001-.001.857-.744 1.69 1.945-.848.738zm.71.815L20.932 7.577 17.823 4 5.933 14.329l-.01.008.005.005L4.173 19l4.857-1.09-.004-.02.019.02-.002-.005z",
11941
- fill: classes.iconFill,
11942
12066
  fillRule: "evenodd"
11943
12067
  })))))), /*#__PURE__*/React.createElement(Tooltip, {
11944
12068
  title: "Delete Service"
@@ -11951,18 +12075,17 @@ var ServiceOptionsDialog = function ServiceOptionsDialog(_ref) {
11951
12075
  "data-testid": "removeServiceButton"
11952
12076
  }, /*#__PURE__*/React.createElement(SvgIcon, null, /*#__PURE__*/React.createElement("g", null, /*#__PURE__*/React.createElement("path", {
11953
12077
  d: "M17.504 8.228c.588 0 1.027.48.973 1.066l-.876 9.64A1.197 1.197 0 0 1 16.434 20H8.41c-.59 0-1.115-.48-1.167-1.066l-.877-9.64a.962.962 0 0 1 .973-1.066zm-2.115 1.228a.82.82 0 0 0-.819.82v7.674a.818.818 0 0 0 1.638 0v-7.675a.819.819 0 0 0-.819-.819zm-2.968 0a.819.819 0 0 0-.819.82v7.674a.818.818 0 1 0 1.638 0v-7.675a.82.82 0 0 0-.82-.819zm-2.968 0a.819.819 0 0 0-.818.82v7.674a.818.818 0 1 0 1.637 0v-7.675a.82.82 0 0 0-.82-.819zM13.432 4c.21 0 .404.168.436.376l.107.758 3.256-.01a1.606 1.606 0 0 1 1.61 1.6l.001.535-12.841.038L6 6.76a1.605 1.605 0 0 1 1.6-1.61l3.262-.008.103-.758a.454.454 0 0 1 .434-.38z",
11954
- fill: classes.iconFill,
11955
12078
  fillRule: "evenodd"
11956
12079
  }))))))));
11957
- })), /*#__PURE__*/React.createElement("div", {
11958
- className: classes.footer
12080
+ })), /*#__PURE__*/React.createElement(Box, {
12081
+ sx: styles.footer
11959
12082
  }, /*#__PURE__*/React.createElement(Button, {
11960
12083
  onClick: openAddService,
11961
12084
  "data-testid": "openAddServiceButton",
11962
- className: classes.button,
12085
+ sx: styles.button,
11963
12086
  variant: "tertiary",
11964
12087
  startIcon: /*#__PURE__*/React.createElement(SvgIcon, {
11965
- className: classes.icon
12088
+ sx: styles.icon
11966
12089
  }, /*#__PURE__*/React.createElement("g", null, /*#__PURE__*/React.createElement("path", {
11967
12090
  d: "M13.647 13.647h6.82a1.276 1.276 0 1 0 0-2.552h-6.82v-6.82a1.276 1.276 0 1 0-2.552 0v6.82h-6.82a1.276 1.276 0 1 0 0 2.552h6.82v6.82a1.274 1.274 0 0 0 1.276 1.275c.705 0 1.276-.571 1.276-1.276v-6.82z",
11968
12091
  fillRule: "evenodd"
@@ -12639,7 +12762,8 @@ var LayerSelectConnect = function LayerSelectConnect(_ref) {
12639
12762
  id: service.id,
12640
12763
  name: service.name,
12641
12764
  service: service.url,
12642
- layers: layers
12765
+ layers: layers,
12766
+ isUserAddedService: false
12643
12767
  });
12644
12768
  }
12645
12769
  })["catch"](function () {
@@ -14962,13 +15086,15 @@ var isColorIntervalEven = function isColorIntervalEven(scale, timestep) {
14962
15086
  }
14963
15087
  };
14964
15088
 
14965
- var drawBackground = function drawBackground(context, theme, visibleTimeStart, visibleTimeEnd, canvasWidth, height, scale) {
15089
+ var drawBackground = function drawBackground(context, theme, visibleTimeStart, visibleTimeEnd, animationStartPx, animationEndPx, canvasWidth, height, scale) {
14966
15090
  var ctx = context;
14967
15091
  var _theme$palette$geoweb7 = theme.palette.geowebColors.timeSlider,
14968
15092
  timelineTimelineSurface = _theme$palette$geoweb7.timelineTimelineSurface,
14969
15093
  timelineNightTime = _theme$palette$geoweb7.timelineNightTime;
14970
15094
  ctx.fillStyle = timelineTimelineSurface.fill;
14971
15095
  ctx.fillRect(0, 0, canvasWidth, height);
15096
+ ctx.fillStyle = theme.palette.geowebColors.timeSlider.timelineSelectionBackground.rgba;
15097
+ ctx.fillRect(animationStartPx, 0, Math.max(animationEndPx - animationStartPx, 0), height);
14972
15098
  var colorChangeUnit = getColorChangeTimestepUnit(scale);
14973
15099
 
14974
15100
  var _getCustomRoundedStar = getCustomRoundedStartAndEnd(visibleTimeStart, visibleTimeEnd, colorChangeUnit),
@@ -15067,7 +15193,7 @@ var drawTimeScale = function drawTimeScale(context, theme, visibleTimeStart, vis
15067
15193
  drawLeftSideDateText(ctx, theme, dateText, height);
15068
15194
  };
15069
15195
 
15070
- var renderTimeSliderLegend = function renderTimeSliderLegend(context, theme, canvasWidth, height, centerTime, secondsPerPx, dataScaleToSecondsPerPx, selectedTimeUnix, scale, currentTimeUnix) {
15196
+ var renderTimeSliderLegend = function renderTimeSliderLegend(context, theme, canvasWidth, height, centerTime, secondsPerPx, dataScaleToSecondsPerPx, selectedTimeUnix, scale, currentTimeUnix, animationStartTime, animationEndTime) {
15071
15197
  var ctx = context;
15072
15198
 
15073
15199
  var _map3 = [0, canvasWidth].map(function (px) {
@@ -15077,7 +15203,14 @@ var renderTimeSliderLegend = function renderTimeSliderLegend(context, theme, can
15077
15203
  visibleTimeStart = _map4[0],
15078
15204
  visibleTimeEnd = _map4[1];
15079
15205
 
15080
- drawBackground(ctx, theme, visibleTimeStart, visibleTimeEnd, canvasWidth, height, scale);
15206
+ var _map5 = [animationStartTime, animationEndTime].map(function (time) {
15207
+ return timestampToPixel(time, centerTime, canvasWidth, secondsPerPx);
15208
+ }),
15209
+ _map6 = _slicedToArray(_map5, 2),
15210
+ animationStartPx = _map6[0],
15211
+ animationEndPx = _map6[1];
15212
+
15213
+ drawBackground(ctx, theme, visibleTimeStart, visibleTimeEnd, animationStartPx, animationEndPx, canvasWidth, height, scale);
15081
15214
  drawTimeScale(ctx, theme, visibleTimeStart, visibleTimeEnd, canvasWidth, height, scale, dataScaleToSecondsPerPx);
15082
15215
  drawNeedle(ctx, theme, canvasWidth, height, visibleTimeStart, visibleTimeEnd, selectedTimeUnix);
15083
15216
  drawCurrentTime(ctx, theme, canvasWidth, height, visibleTimeStart, visibleTimeEnd, currentTimeUnix);
@@ -15498,6 +15631,8 @@ var TimeSliderLegend = function TimeSliderLegend(_ref) {
15498
15631
  currentTime = _ref.currentTime,
15499
15632
  dataStartTime = _ref.dataStartTime,
15500
15633
  dataEndTime = _ref.dataEndTime,
15634
+ animationStartTime = _ref.animationStartTime,
15635
+ animationEndTime = _ref.animationEndTime,
15501
15636
  isTimeSliderHoverOn = _ref.isTimeSliderHoverOn,
15502
15637
  timeStep = _ref.timeStep,
15503
15638
  onSetNewDate = _ref.onSetNewDate,
@@ -15525,6 +15660,20 @@ var TimeSliderLegend = function TimeSliderLegend(_ref) {
15525
15660
  isNewSelectionTimeRequested = _React$useState6[0],
15526
15661
  setNewSelectionTimeRequested = _React$useState6[1];
15527
15662
 
15663
+ var _React$useState7 = React.useState(animationStartTime && moment.utc(animationStartTime).unix()),
15664
+ _React$useState8 = _slicedToArray(_React$useState7, 2),
15665
+ localAnimationStartTime = _React$useState8[0],
15666
+ setLocalAnimationStartTime = _React$useState8[1];
15667
+
15668
+ var _React$useState9 = React.useState(animationEndTime && moment.utc(animationEndTime).unix()),
15669
+ _React$useState10 = _slicedToArray(_React$useState9, 2),
15670
+ localAnimationEndTime = _React$useState10[0],
15671
+ setLocalAnimationEndTime = _React$useState10[1];
15672
+
15673
+ React.useEffect(function () {
15674
+ setLocalAnimationStartTime(animationStartTime && moment.utc(animationStartTime).unix());
15675
+ setLocalAnimationEndTime(animationEndTime && moment.utc(animationEndTime).unix());
15676
+ }, [animationStartTime, animationEndTime]);
15528
15677
  React.useEffect(function () {
15529
15678
  var handleKeyDown = function handleKeyDown(event) {
15530
15679
  if (event.key === 'Home') {
@@ -15622,7 +15771,7 @@ var TimeSliderLegend = function TimeSliderLegend(_ref) {
15622
15771
  }
15623
15772
  },
15624
15773
  onRenderCanvas: function onRenderCanvas(ctx, width, height) {
15625
- renderTimeSliderLegend(ctx, theme, width, height, centerTime, secondsPerPx, dataScaleToSecondsPerPx, selectedTime, scale, currentTime);
15774
+ renderTimeSliderLegend(ctx, theme, width, height, centerTime, secondsPerPx, dataScaleToSecondsPerPx, selectedTime, scale, currentTime, localAnimationStartTime, localAnimationEndTime);
15626
15775
  }
15627
15776
  }));
15628
15777
  };
@@ -15914,6 +16063,9 @@ var drawPlayerLoopIcon = function drawPlayerLoopIcon(ctx, x, y, theme) {
15914
16063
  var svgIconPath = new Path2D('M8.843 1.029c-.56 0-.814.362-.814.699 0 .179.065.36.19.54l3.06 4.34c.065.093.14.171.221.234v8.373c-.082.064-.156.142-.22.234L8.219 19.79c-.125.18-.19.361-.19.54 0 .337.255.699.814.699h6.373c.56 0 .813-.361.813-.7 0-.178-.064-.36-.19-.538l-3.06-4.343c-.08-.112-.174-.204-.278-.273V6.883c.104-.069.199-.16.278-.273l3.06-4.343c.126-.179.19-.36.19-.539 0-.338-.254-.7-.813-.7z');
15915
16064
  ctx.fillStyle = playerTimeMarkers.fill;
15916
16065
  ctx.fill(svgIconPath);
16066
+ ctx.strokeStyle = theme.palette.geowebColors.timeSlider.playerNeedlePlayer.rgba;
16067
+ ctx.lineWidth = 1;
16068
+ ctx.stroke(svgIconPath);
15917
16069
  ctx.restore();
15918
16070
  };
15919
16071
 
@@ -16690,10 +16842,10 @@ var OptionsMenuButtonConnect = function OptionsMenuButtonConnect(_ref) {
16690
16842
  var animationIntervalDefault = 5;
16691
16843
  var connectRedux$3 = connect(function (store, props) {
16692
16844
  return {
16693
- isAnimating: isAnimating(store, props.mapId),
16694
16845
  animationStartTime: getAnimationStartTime(store, props.mapId),
16695
16846
  animationEndTime: getAnimationEndTime(store, props.mapId),
16696
- timeStep: getMapTimeStep(store, props.mapId)
16847
+ timeStep: getMapTimeStep(store, props.mapId),
16848
+ linkedMapAnimationInfo: linkedMapAnimationInfo(store, props.mapId)
16697
16849
  };
16698
16850
  }, {
16699
16851
  mapStartAnimation: mapStartAnimation,
@@ -16701,19 +16853,19 @@ var connectRedux$3 = connect(function (store, props) {
16701
16853
  });
16702
16854
  var PlayButtonConnect = connectRedux$3(function (_ref) {
16703
16855
  var mapId = _ref.mapId,
16704
- isAnimating = _ref.isAnimating,
16705
16856
  animationStartTime = _ref.animationStartTime,
16706
16857
  animationEndTime = _ref.animationEndTime,
16707
16858
  isDisabled = _ref.isDisabled,
16708
16859
  timeStep = _ref.timeStep,
16860
+ linkedMapAnimationInfo = _ref.linkedMapAnimationInfo,
16709
16861
  mapStartAnimation = _ref.mapStartAnimation,
16710
16862
  mapStopAnimation = _ref.mapStopAnimation;
16711
16863
  var animationInterval = timeStep || animationIntervalDefault;
16712
16864
 
16713
16865
  var onTogglePlay = function onTogglePlay() {
16714
- if (isAnimating) {
16866
+ if (linkedMapAnimationInfo.isAnimating) {
16715
16867
  mapStopAnimation({
16716
- mapId: mapId
16868
+ mapId: linkedMapAnimationInfo.id
16717
16869
  });
16718
16870
  } else {
16719
16871
  mapStartAnimation({
@@ -16726,7 +16878,7 @@ var PlayButtonConnect = connectRedux$3(function (_ref) {
16726
16878
  };
16727
16879
 
16728
16880
  return /*#__PURE__*/React__default.createElement(PlayButton, {
16729
- isAnimating: isAnimating,
16881
+ isAnimating: linkedMapAnimationInfo.isAnimating,
16730
16882
  isDisabled: isDisabled,
16731
16883
  onTogglePlayButton: function onTogglePlayButton() {
16732
16884
  onTogglePlay();
@@ -16783,52 +16935,6 @@ var TimeSliderButtonsConnect = function TimeSliderButtonsConnect(_ref) {
16783
16935
  });
16784
16936
  };
16785
16937
 
16786
- /* *
16787
- * Licensed under the Apache License, Version 2.0 (the "License");
16788
- * you may not use this file except in compliance with the License.
16789
- * You may obtain a copy of the License at
16790
- *
16791
- * http://www.apache.org/licenses/LICENSE-2.0
16792
- *
16793
- * Unless required by applicable law or agreed to in writing, software
16794
- * distributed under the License is distributed on an "AS IS" BASIS,
16795
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16796
- * See the License for the specific language governing permissions and
16797
- * limitations under the License.
16798
- *
16799
- * Copyright 2020 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
16800
- * Copyright 2020 - Finnish Meteorological Institute (FMI)
16801
- * */
16802
-
16803
- var synchronizationGroupStore = function synchronizationGroupStore(store) {
16804
- return store && store.syncronizationGroupStore ? store.syncronizationGroupStore : null;
16805
- };
16806
-
16807
- var getSynchronizationGroupStore = createSelector(synchronizationGroupStore, function (store) {
16808
- return store;
16809
- });
16810
- /**
16811
- * Returns the synchronization source by id
16812
- * @param store The app store
16813
- * @param id The source id to find
16814
- */
16815
-
16816
- var getSyncSourceBySourceId = function getSyncSourceBySourceId(state, id) {
16817
- if (state && state.sources) {
16818
- var sources = state.sources;
16819
-
16820
- if (sources.byId[id]) {
16821
- return sources.byId[id];
16822
- }
16823
- }
16824
-
16825
- return null;
16826
- };
16827
-
16828
- var getTime = createSelector(getSyncSourceBySourceId, function (store) {
16829
- return store && store.payloadByType && store.payloadByType[SYNCGROUPS_TYPE_SETTIME] ? store.payloadByType[SYNCGROUPS_TYPE_SETTIME].value : null;
16830
- });
16831
-
16832
16938
  var connectRedux$2 = connect(function (store, props) {
16833
16939
  return {
16834
16940
  layers: getMapLayers(store, props.mapId),
@@ -16840,7 +16946,9 @@ var connectRedux$2 = connect(function (store, props) {
16840
16946
  isAnimating: isAnimating(store, props.mapId),
16841
16947
  timeStep: getMapTimeStep(store, props.mapId),
16842
16948
  isTimeSliderHoverOn: isTimeSliderHoverOn(store, props.mapId),
16843
- timeValue: getTime(getSynchronizationGroupStore(store), props.sourceId)
16949
+ timeValue: getTime(getSynchronizationGroupStore(store), props.sourceId),
16950
+ animationStartTime: getAnimationStartTime(store, props.mapId),
16951
+ animationEndTime: getAnimationEndTime(store, props.mapId)
16844
16952
  };
16845
16953
  }, {
16846
16954
  stopMapAnimation: mapStopAnimation,
@@ -16863,6 +16971,8 @@ var TimeSliderLegendConnect = function TimeSliderLegendConnect(_ref) {
16863
16971
  isAnimating = _ref.isAnimating,
16864
16972
  timeStep = _ref.timeStep,
16865
16973
  isTimeSliderHoverOn = _ref.isTimeSliderHoverOn,
16974
+ animationStartTime = _ref.animationStartTime,
16975
+ animationEndTime = _ref.animationEndTime,
16866
16976
  stopMapAnimation = _ref.stopMapAnimation,
16867
16977
  setTime = _ref.setTime,
16868
16978
  syncGroupAddSource = _ref.syncGroupAddSource,
@@ -16901,6 +17011,8 @@ var TimeSliderLegendConnect = function TimeSliderLegendConnect(_ref) {
16901
17011
  isTimeSliderHoverOn: isTimeSliderHoverOn,
16902
17012
  dataStartTime: dataStartTime,
16903
17013
  dataEndTime: dataEndTime,
17014
+ animationStartTime: animationStartTime,
17015
+ animationEndTime: animationEndTime,
16904
17016
  timeStep: timeStep,
16905
17017
  onSetNewDate: function onSetNewDate(newDate) {
16906
17018
  if (isAnimating) {
@@ -18188,6 +18300,172 @@ var tileRenderSettings = {
18188
18300
  }
18189
18301
  };
18190
18302
 
18303
+ /* *
18304
+ * Licensed under the Apache License, Version 2.0 (the "License");
18305
+ * you may not use this file except in compliance with the License.
18306
+ * You may obtain a copy of the License at
18307
+ *
18308
+ * http://www.apache.org/licenses/LICENSE-2.0
18309
+ *
18310
+ * Unless required by applicable law or agreed to in writing, software
18311
+ * distributed under the License is distributed on an "AS IS" BASIS,
18312
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18313
+ * See the License for the specific language governing permissions and
18314
+ * limitations under the License.
18315
+ *
18316
+ * Copyright 2020 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
18317
+ * Copyright 2020 - Finnish Meteorological Institute (FMI)
18318
+ * */
18319
+ /* Function which calculates the distance between two points */
18320
+ // eslint-disable-next-line class-methods-use-this
18321
+
18322
+ var distance = function distance(a, b) {
18323
+ return Math.sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y));
18324
+ };
18325
+
18326
+ var checkHoverVertice = function checkHoverVertice(feature, mouseX, mouseY, convertGeoCoordsToScreenCoords) {
18327
+ var maxDistance = 20;
18328
+
18329
+ if (feature.geometry.type === 'Point') {
18330
+ var featureCoords = feature.geometry.coordinates;
18331
+ /* Get all vertexes */
18332
+
18333
+ var XYCoords = convertGeoCoordsToScreenCoords([featureCoords]);
18334
+
18335
+ if (XYCoords.length > 0 && distance(XYCoords[0], {
18336
+ x: mouseX,
18337
+ y: mouseY
18338
+ }) < maxDistance) {
18339
+ return {
18340
+ coordinateIndexInFeature: 0
18341
+ };
18342
+ }
18343
+ }
18344
+
18345
+ if (feature.geometry.type === 'MultiPoint') {
18346
+ for (var polygonIndex = feature.geometry.coordinates.length - 1; polygonIndex >= 0; polygonIndex -= 1) {
18347
+ var _featureCoords = feature.geometry.coordinates[polygonIndex];
18348
+
18349
+ if (_featureCoords === undefined) {
18350
+ // eslint-disable-next-line no-continue
18351
+ continue;
18352
+ }
18353
+ /* Get all vertexes */
18354
+
18355
+
18356
+ var _XYCoords = convertGeoCoordsToScreenCoords([_featureCoords]);
18357
+
18358
+ if (_XYCoords.length > 0 && distance(_XYCoords[0], {
18359
+ x: mouseX,
18360
+ y: mouseY
18361
+ }) < maxDistance) {
18362
+ return {
18363
+ coordinateIndexInFeature: polygonIndex
18364
+ };
18365
+ }
18366
+ }
18367
+ }
18368
+
18369
+ if (feature.geometry.type === 'Polygon') {
18370
+ var point = [mouseX, mouseY];
18371
+
18372
+ for (var _polygonIndex = feature.geometry.coordinates.length - 1; _polygonIndex >= 0; _polygonIndex -= 1) {
18373
+ var _featureCoords2 = feature.geometry.coordinates[_polygonIndex];
18374
+
18375
+ if (_featureCoords2 === undefined) {
18376
+ // eslint-disable-next-line no-continue
18377
+ continue;
18378
+ }
18379
+ /* Get all vertexes */
18380
+
18381
+
18382
+ var poly = [convertGeoCoordsToScreenCoords(_featureCoords2).map(function (coord) {
18383
+ return [coord.x, coord.y];
18384
+ })];
18385
+
18386
+ try {
18387
+ var isPointInPoly = turf.booleanPointInPolygon(turf.point(point), turf.polygon(poly));
18388
+
18389
+ if (isPointInPoly) {
18390
+ return {
18391
+ coordinateIndexInFeature: _polygonIndex
18392
+ };
18393
+ } // eslint-disable-next-line no-empty
18394
+
18395
+ } catch (e) {}
18396
+ }
18397
+ }
18398
+
18399
+ if (feature.geometry.type === 'MultiPolygon') {
18400
+ var _point = [mouseX, mouseY];
18401
+
18402
+ for (var _polygonIndex2 = feature.geometry.coordinates.length - 1; _polygonIndex2 >= 0; _polygonIndex2 -= 1) {
18403
+ var _featureCoords3 = feature.geometry.coordinates[_polygonIndex2][0];
18404
+
18405
+ if (_featureCoords3 === undefined) {
18406
+ // eslint-disable-next-line no-continue
18407
+ continue;
18408
+ }
18409
+
18410
+ var _poly = [convertGeoCoordsToScreenCoords(_featureCoords3).map(function (coord) {
18411
+ return [coord.x, coord.y];
18412
+ })];
18413
+
18414
+ try {
18415
+ var _isPointInPoly = turf.booleanPointInPolygon(turf.point(_point), turf.polygon(_poly));
18416
+
18417
+ if (_isPointInPoly) {
18418
+ return {
18419
+ coordinateIndexInFeature: _polygonIndex2
18420
+ };
18421
+ } // eslint-disable-next-line no-empty
18422
+
18423
+ } catch (e) {}
18424
+ }
18425
+ }
18426
+
18427
+ if (feature.geometry.type === 'LineString') {
18428
+ var _featureCoords4 = feature.geometry.coordinates;
18429
+ /* Get all vertexes */
18430
+
18431
+ var _XYCoords2 = convertGeoCoordsToScreenCoords(_featureCoords4);
18432
+ /* Snap to the vertex closer than specified pixels */
18433
+
18434
+
18435
+ for (var j = 0; j < _XYCoords2.length; j += 1) {
18436
+ var coord = _XYCoords2[j];
18437
+
18438
+ if (distance(coord, {
18439
+ x: mouseX,
18440
+ y: mouseY
18441
+ }) < maxDistance) {
18442
+ return {
18443
+ coordinateIndexInFeature: j
18444
+ };
18445
+ }
18446
+ }
18447
+ }
18448
+
18449
+ return null;
18450
+ };
18451
+
18452
+ var checkHoverFeatures = function checkHoverFeatures(geojson, mouseX, mouseY, convertGeoCoordsToScreenCoords) {
18453
+ for (var j = 0; j < geojson.features.length; j += 1) {
18454
+ var feature = geojson.features[j];
18455
+ var hoverResult = checkHoverVertice(feature, mouseX, mouseY, convertGeoCoordsToScreenCoords);
18456
+
18457
+ if (hoverResult != null) {
18458
+ return {
18459
+ coordinateIndexInFeature: hoverResult.coordinateIndexInFeature,
18460
+ featureIndex: j,
18461
+ feature: feature
18462
+ };
18463
+ }
18464
+ }
18465
+
18466
+ return null;
18467
+ };
18468
+
18191
18469
  var Proj4js = proj4; // Cache for for storing and reusing Proj4 instances
18192
18470
 
18193
18471
  var projectorCache = {}; // Ensure that you have a Proj4 object, pulling from the cache if necessary
@@ -18799,9 +19077,12 @@ var AdagucMapDraw = /*#__PURE__*/function (_React$PureComponent) {
18799
19077
  }, {
18800
19078
  key: "adagucMouseMove",
18801
19079
  value: function adagucMouseMove(event) {
19080
+ var _this2 = this;
19081
+
18802
19082
  var _this$props2 = this.props,
18803
19083
  isInEditMode = _this$props2.isInEditMode,
18804
- featureNrToEdit = _this$props2.featureNrToEdit;
19084
+ featureNrToEdit = _this$props2.featureNrToEdit,
19085
+ onHoverFeature = _this$props2.onHoverFeature;
18805
19086
  if (event && event.rightButton === true) return;
18806
19087
  /* adagucMouseMove is an event callback function which is triggered when the mouse moves over the map
18807
19088
  This event is only triggered if the map is in hover state.
@@ -18814,6 +19095,29 @@ var AdagucMapDraw = /*#__PURE__*/function (_React$PureComponent) {
18814
19095
  this.mouseX = mouseX;
18815
19096
  this.mouseY = mouseY;
18816
19097
 
19098
+ if (onHoverFeature) {
19099
+ var handleMouseStoppedTimer = function handleMouseStoppedTimer() {
19100
+ var result = checkHoverFeatures(_this2.geojson, mouseX, mouseY, function (coordinates) {
19101
+ return _this2.convertGeoCoordsToScreenCoords(coordinates);
19102
+ });
19103
+
19104
+ if (result) {
19105
+ var featureEvent = {
19106
+ coordinateIndexInFeature: result.coordinateIndexInFeature,
19107
+ featureIndex: result.featureIndex,
19108
+ mouseX: mouseX,
19109
+ mouseY: mouseY,
19110
+ isInEditMode: isInEditMode,
19111
+ feature: result.feature
19112
+ };
19113
+ onHoverFeature(featureEvent);
19114
+ }
19115
+ };
19116
+
19117
+ window.clearTimeout(this.mouseStoppedTimer);
19118
+ this.mouseStoppedTimer = window.setTimeout(handleMouseStoppedTimer, 20);
19119
+ }
19120
+
18817
19121
  if (isInEditMode === false) {
18818
19122
  return;
18819
19123
  }
@@ -18891,14 +19195,14 @@ var AdagucMapDraw = /*#__PURE__*/function (_React$PureComponent) {
18891
19195
  }, {
18892
19196
  key: "triggerMouseDownTimer",
18893
19197
  value: function triggerMouseDownTimer(event) {
18894
- var _this2 = this;
19198
+ var _this3 = this;
18895
19199
 
18896
19200
  if (!this.doubleClickTimer) this.doubleClickTimer = {};
18897
19201
  var mouseX = event.mouseX,
18898
19202
  mouseY = event.mouseY;
18899
19203
 
18900
19204
  var checkTimeOut = function checkTimeOut() {
18901
- _this2.doubleClickTimer.isRunning = false;
19205
+ _this3.doubleClickTimer.isRunning = false;
18902
19206
  };
18903
19207
  /* Reset the timer */
18904
19208
 
@@ -19333,9 +19637,35 @@ var AdagucMapDraw = /*#__PURE__*/function (_React$PureComponent) {
19333
19637
  }, {
19334
19638
  key: "adagucMouseUp",
19335
19639
  value: function adagucMouseUp(event) {
19336
- var isInEditMode = this.props.isInEditMode;
19640
+ var _this4 = this;
19641
+
19642
+ var _this$props10 = this.props,
19643
+ isInEditMode = _this$props10.isInEditMode,
19644
+ onClickFeature = _this$props10.onClickFeature;
19337
19645
  if (event && event.rightButton === true) return;
19338
19646
 
19647
+ if (onClickFeature) {
19648
+ var mouseX = event.mouseX,
19649
+ mouseY = event.mouseY;
19650
+ var result = checkHoverFeatures(this.geojson, mouseX, mouseY, function (coordinates) {
19651
+ return _this4.convertGeoCoordsToScreenCoords(coordinates);
19652
+ });
19653
+
19654
+ if (result) {
19655
+ var featureEvent = {
19656
+ coordinateIndexInFeature: result.coordinateIndexInFeature,
19657
+ featureIndex: result.featureIndex,
19658
+ mouseX: mouseX,
19659
+ mouseY: mouseY,
19660
+ isInEditMode: isInEditMode,
19661
+ feature: result.feature
19662
+ };
19663
+ onClickFeature(featureEvent);
19664
+ } else {
19665
+ onClickFeature(null);
19666
+ }
19667
+ }
19668
+
19339
19669
  if (isInEditMode === false) {
19340
19670
  return;
19341
19671
  }
@@ -19369,9 +19699,9 @@ var AdagucMapDraw = /*#__PURE__*/function (_React$PureComponent) {
19369
19699
  }, {
19370
19700
  key: "cancelEdit",
19371
19701
  value: function cancelEdit(cancelLastPoint) {
19372
- var _this$props10 = this.props,
19373
- isInEditMode = _this$props10.isInEditMode,
19374
- featureNrToEdit = _this$props10.featureNrToEdit;
19702
+ var _this$props11 = this.props,
19703
+ isInEditMode = _this$props11.isInEditMode,
19704
+ featureNrToEdit = _this$props11.featureNrToEdit;
19375
19705
 
19376
19706
  if (isInEditMode === false) {
19377
19707
  return;
@@ -19544,14 +19874,14 @@ var AdagucMapDraw = /*#__PURE__*/function (_React$PureComponent) {
19544
19874
  just before adagucviewer will flip the back canvas buffer to the front.
19545
19875
  You are free to draw anything you like on the canvas.
19546
19876
  */
19547
- var _this$props11 = this.props,
19548
- featureNrToEdit = _this$props11.featureNrToEdit,
19549
- isInEditMode = _this$props11.isInEditMode,
19550
- hoverFeatureCallback = _this$props11.hoverFeatureCallback;
19877
+ var _this$props12 = this.props,
19878
+ featureNrToEdit = _this$props12.featureNrToEdit,
19879
+ isInEditMode = _this$props12.isInEditMode;
19551
19880
  if (!this.geojson || !this.geojson.features || !this.geojson.features.length) return;
19552
19881
  this.textPositions = [];
19553
19882
  this.mouseOverPolygonCoordinates = [];
19554
19883
  this.mouseOverPolygonFeatureIndex = -1;
19884
+ this.mouseOverPolygonIndex = -1;
19555
19885
  /* Current selected feature from GeoJSON */
19556
19886
 
19557
19887
  for (var featureIndex = 0; featureIndex < this.geojson.features.length; featureIndex += 1) {
@@ -19744,19 +20074,6 @@ var AdagucMapDraw = /*#__PURE__*/function (_React$PureComponent) {
19744
20074
  ctx.globalAlpha = 1;
19745
20075
  ctx.stroke();
19746
20076
  }
19747
- } // if (isInEditMode === true &&
19748
- // this.mouseOverPolygonFeatureIndex === this.props.featureNrToEdit &&
19749
-
19750
-
19751
- if (hoverFeatureCallback) {
19752
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
19753
- // @ts-ignore
19754
- hoverFeatureCallback({
19755
- polygonIndex: this.mouseOverPolygonFeatureIndex,
19756
- featureIndex: this.mouseOverPolygonFeatureIndex,
19757
- mouseX: this.mouseX,
19758
- mouseY: this.mouseY
19759
- });
19760
20077
  }
19761
20078
  /* Draw labels */
19762
20079
 
@@ -20034,9 +20351,9 @@ var AdagucMapDraw = /*#__PURE__*/function (_React$PureComponent) {
20034
20351
  }, {
20035
20352
  key: "drawLine",
20036
20353
  value: function drawLine(ctx, XYCoords, featureIndex, lineStringIndex) {
20037
- var _this$props12 = this.props,
20038
- isInEditMode = _this$props12.isInEditMode,
20039
- featureNrToEdit = _this$props12.featureNrToEdit;
20354
+ var _this$props13 = this.props,
20355
+ isInEditMode = _this$props13.isInEditMode,
20356
+ featureNrToEdit = _this$props13.featureNrToEdit;
20040
20357
  var feature = this.geojson.features[featureIndex];
20041
20358
  if (!feature || !feature.geometry) return;
20042
20359
  if (feature.geometry.type !== 'LineString') return;
@@ -20080,7 +20397,8 @@ var AdagucMapDraw = /*#__PURE__*/function (_React$PureComponent) {
20080
20397
  // if (test) {
20081
20398
 
20082
20399
  this.mouseOverPolygonCoordinates = 0;
20083
- this.mouseOverPolygonFeatureIndex = 0; // }
20400
+ this.mouseOverPolygonFeatureIndex = 0;
20401
+ this.mouseOverPolygonIndex = 0; // }
20084
20402
  // eslint-disable-next-line @typescript-eslint/ban-ts-comment
20085
20403
  // @ts-ignore
20086
20404
 
@@ -20109,9 +20427,9 @@ var AdagucMapDraw = /*#__PURE__*/function (_React$PureComponent) {
20109
20427
  }, {
20110
20428
  key: "drawPolygon",
20111
20429
  value: function drawPolygon(ctx, XYCoords, featureIndex, polygonIndex) {
20112
- var _this$props13 = this.props,
20113
- isInEditMode = _this$props13.isInEditMode,
20114
- featureNrToEdit = _this$props13.featureNrToEdit;
20430
+ var _this$props14 = this.props,
20431
+ isInEditMode = _this$props14.isInEditMode,
20432
+ featureNrToEdit = _this$props14.featureNrToEdit;
20115
20433
  var feature = this.geojson.features[featureIndex];
20116
20434
  if (!feature || !feature.geometry) return;
20117
20435
  if (feature.geometry.type !== 'Polygon' && feature.geometry.type !== 'MultiPolygon') return;
@@ -20158,6 +20476,7 @@ var AdagucMapDraw = /*#__PURE__*/function (_React$PureComponent) {
20158
20476
  if (test) {
20159
20477
  this.mouseOverPolygonCoordinates = XYCoords;
20160
20478
  this.mouseOverPolygonFeatureIndex = featureIndex;
20479
+ this.mouseOverPolygonIndex = polygonIndex;
20161
20480
  } // eslint-disable-next-line @typescript-eslint/ban-ts-comment
20162
20481
  // @ts-ignore
20163
20482
 
@@ -20312,9 +20631,9 @@ var AdagucMapDraw = /*#__PURE__*/function (_React$PureComponent) {
20312
20631
  }, {
20313
20632
  key: "render",
20314
20633
  value: function render() {
20315
- var _this$props14 = this.props,
20316
- webmapjs = _this$props14.webmapjs,
20317
- isInDeleteMode = _this$props14.isInDeleteMode;
20634
+ var _this$props15 = this.props,
20635
+ webmapjs = _this$props15.webmapjs,
20636
+ isInDeleteMode = _this$props15.isInDeleteMode;
20318
20637
 
20319
20638
  if (this.disabled === undefined) {
20320
20639
  this.disabled = isInDeleteMode;
@@ -20379,9 +20698,14 @@ var AdagucMapDrawContainer = function AdagucMapDrawContainer(_ref) {
20379
20698
  isInDeleteMode: layer.isInDeleteMode,
20380
20699
  drawMode: layer.drawMode,
20381
20700
  webmapjs: webMapJS,
20382
- hoverFeatureCallback: function hoverFeatureCallback(hoverInfo) {
20383
- if (layer.hoverFeatureCallback) {
20384
- layer.hoverFeatureCallback(hoverInfo);
20701
+ onHoverFeature: function onHoverFeature(hoverInfo) {
20702
+ if (layer.onHoverFeature) {
20703
+ layer.onHoverFeature(hoverInfo);
20704
+ }
20705
+ },
20706
+ onClickFeature: function onClickFeature(hoverInfo) {
20707
+ if (layer.onClickFeature) {
20708
+ layer.onClickFeature(hoverInfo);
20385
20709
  }
20386
20710
  },
20387
20711
  updateGeojson: function updateGeojson(geojson) {
@@ -22825,103 +23149,6 @@ var useStyles = makeStyles(function (theme) {
22825
23149
  });
22826
23150
  });
22827
23151
 
22828
- /* *
22829
- * Licensed under the Apache License, Version 2.0 (the "License");
22830
- * you may not use this file except in compliance with the License.
22831
- * You may obtain a copy of the License at
22832
- *
22833
- * http://www.apache.org/licenses/LICENSE-2.0
22834
- *
22835
- * Unless required by applicable law or agreed to in writing, software
22836
- * distributed under the License is distributed on an "AS IS" BASIS,
22837
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
22838
- * See the License for the specific language governing permissions and
22839
- * limitations under the License.
22840
- *
22841
- * Copyright 2021 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
22842
- * Copyright 2021 - Finnish Meteorological Institute (FMI)
22843
- * */
22844
- var emptyState = {
22845
- timeslider: {
22846
- groups: [],
22847
- sourcesById: []
22848
- },
22849
- zoompane: {
22850
- groups: [],
22851
- sourcesById: []
22852
- },
22853
- level: {
22854
- groups: [],
22855
- sourcesById: []
22856
- }
22857
- };
22858
- var groupTypes = [{
22859
- title: 'Timeslider',
22860
- syncType: 'SYNCGROUPS_TYPE_SETTIME',
22861
- groupType: 'timeslider'
22862
- }, {
22863
- title: 'Zoompane',
22864
- syncType: 'SYNCGROUPS_TYPE_SETBBOX',
22865
- groupType: 'zoompane'
22866
- }];
22867
- /*
22868
- _____ Creates viewState _____
22869
- - Runs Each time viewState is created:
22870
- - Fill arrays inside initialState with objects containing new values from Redux
22871
- */
22872
-
22873
- var createSyncGroupViewState = function createSyncGroupViewState(syncState) {
22874
- var initialState = produce(emptyState, function (draft) {
22875
- /*
22876
- _____ 1. Fill groups _____
22877
- 1. Goes through all groups by ID
22878
- 2. Collects original timeslider or zoompane values into an array
22879
- 3. Sorts and adds selected sources to ViewState based on ID type
22880
- */
22881
- Object.keys(syncState.groups.byId).forEach(function (id) {
22882
- var _a;
22883
-
22884
- var groupType = (_a = groupTypes.find(function (object) {
22885
- return object.syncType === syncState.groups.byId[id].type;
22886
- })) === null || _a === void 0 ? void 0 : _a.groupType;
22887
-
22888
- if (groupType) {
22889
- draft[groupType].groups.push({
22890
- id: id,
22891
- selected: syncState.groups.byId[id].targets.allIds
22892
- });
22893
- }
22894
- });
22895
- /*
22896
- _____ 2. Fill sourcesById _____
22897
- 1. Loop though sources and add source to each group type
22898
- */
22899
-
22900
- Object.keys(syncState.sources.byId).forEach(function (id) {
22901
- groupTypes.forEach(function (_ref) {
22902
- var syncType = _ref.syncType,
22903
- groupType = _ref.groupType;
22904
-
22905
- if (syncState.sources.byId[id].types.includes(syncType)) {
22906
- draft[groupType].sourcesById.push({
22907
- id: id,
22908
- name: id
22909
- });
22910
- }
22911
- });
22912
- });
22913
- });
22914
- return initialState;
22915
- }; // TODO
22916
- // Improve selector to reduce unnecessary re-rendering
22917
- // https://gitlab.com/opengeoweb/opengeoweb/-/issues/1333
22918
-
22919
- var syncState = function syncState(store) {
22920
- return store.syncronizationGroupStore;
22921
- };
22922
-
22923
- var createSyncGroupViewStateSelector = createSelector(syncState, createSyncGroupViewState);
22924
-
22925
23152
  var SyncGroupViewer = function SyncGroupViewer(_ref) {
22926
23153
  var onClose = _ref.onClose,
22927
23154
  isOpen = _ref.isOpen,
@@ -22929,7 +23156,10 @@ var SyncGroupViewer = function SyncGroupViewer(_ref) {
22929
23156
  syncGroupAddTarget = _ref.syncGroupAddTarget,
22930
23157
  syncGroupRemoveTarget = _ref.syncGroupRemoveTarget,
22931
23158
  syncGroupAddGroup = _ref.syncGroupAddGroup,
22932
- syncGroupRemoveGroup = _ref.syncGroupRemoveGroup;
23159
+ syncGroupRemoveGroup = _ref.syncGroupRemoveGroup,
23160
+ onMouseDown = _ref.onMouseDown,
23161
+ _ref$order = _ref.order,
23162
+ order = _ref$order === void 0 ? 0 : _ref$order;
22933
23163
 
22934
23164
  /*
22935
23165
  _____ Handle Toggle _____
@@ -23030,7 +23260,9 @@ var SyncGroupViewer = function SyncGroupViewer(_ref) {
23030
23260
  headerSize: "medium",
23031
23261
  isOpen: isOpen,
23032
23262
  onClose: onClose,
23033
- "data-testid": "syncGroupViewer"
23263
+ "data-testid": "syncGroupViewer",
23264
+ onMouseDown: onMouseDown,
23265
+ order: order
23034
23266
  }, /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement(SyncGroupList, {
23035
23267
  viewStateData: syncGroupViewState.zoompane,
23036
23268
  title: "ZoomPane",
@@ -23086,14 +23318,12 @@ var SyncGroupViewer = function SyncGroupViewer(_ref) {
23086
23318
  * Copyright 2021 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
23087
23319
  * Copyright 2021 - Finnish Meteorological Institute (FMI)
23088
23320
  * */
23089
- var SyncGroupViewerConnect = function SyncGroupViewerConnect(_ref) {
23090
- var onClose = _ref.onClose,
23091
- isOpen = _ref.isOpen;
23321
+ var SyncGroupViewerConnect = function SyncGroupViewerConnect() {
23092
23322
  var dispatch = useDispatch(); // TODO
23093
23323
  // Improve the selector to prevent re-renders
23094
23324
  // For example dusting anination syncgroups should not re-render
23095
23325
 
23096
- var viewState = useSelector(createSyncGroupViewStateSelector);
23326
+ var viewState = useSelector(syncGroupGetViewState);
23097
23327
  var syncGroupAddGroup$1 = React.useCallback(function (payload) {
23098
23328
  return dispatch(syncGroupAddGroup(payload));
23099
23329
  }, [dispatch]);
@@ -23106,14 +23336,55 @@ var SyncGroupViewerConnect = function SyncGroupViewerConnect(_ref) {
23106
23336
  var syncGroupRemoveTarget$1 = React.useCallback(function (payload) {
23107
23337
  return dispatch(syncGroupRemoveTarget(payload));
23108
23338
  }, [dispatch]);
23339
+ var isOpenInStore = useSelector(function (store) {
23340
+ return getisDialogOpen(store, 'syncGroups');
23341
+ });
23342
+ var onClose = React.useCallback(function () {
23343
+ return dispatch(setToggleOpenDialog({
23344
+ type: 'syncGroups',
23345
+ setOpen: false
23346
+ }));
23347
+ }, [dispatch]);
23348
+ var uiOrder = useSelector(function (store) {
23349
+ return getDialogOrder(store, 'syncGroups');
23350
+ });
23351
+ var uiIsOrderedOnTop = useSelector(function (store) {
23352
+ return getDialogIsOrderedOnTop(store, 'syncGroups');
23353
+ });
23354
+ var registerDialog$1 = React.useCallback(function () {
23355
+ return dispatch(registerDialog({
23356
+ type: 'syncGroups',
23357
+ setOpen: false
23358
+ }));
23359
+ }, [dispatch]);
23360
+ var unregisterDialog$1 = React.useCallback(function () {
23361
+ return dispatch(unregisterDialog({
23362
+ type: 'syncGroups'
23363
+ }));
23364
+ }, [dispatch]);
23365
+ var onOrderDialog = React.useCallback(function () {
23366
+ if (!uiIsOrderedOnTop) {
23367
+ dispatch(orderDialog({
23368
+ type: 'syncGroups'
23369
+ }));
23370
+ }
23371
+ }, [dispatch, uiIsOrderedOnTop]);
23372
+ React.useEffect(function () {
23373
+ registerDialog$1();
23374
+ return function () {
23375
+ unregisterDialog$1();
23376
+ }; // eslint-disable-next-line react-hooks/exhaustive-deps
23377
+ }, []);
23109
23378
  return /*#__PURE__*/React.createElement(SyncGroupViewer, {
23110
23379
  onClose: onClose,
23111
- isOpen: isOpen,
23380
+ isOpen: isOpenInStore,
23112
23381
  syncGroupViewState: viewState,
23113
23382
  syncGroupAddTarget: syncGroupAddTarget$1,
23114
23383
  syncGroupRemoveTarget: syncGroupRemoveTarget$1,
23115
23384
  syncGroupAddGroup: syncGroupAddGroup$1,
23116
- syncGroupRemoveGroup: syncGroupRemoveGroup$1
23385
+ syncGroupRemoveGroup: syncGroupRemoveGroup$1,
23386
+ order: uiOrder,
23387
+ onMouseDown: onOrderDialog
23117
23388
  });
23118
23389
  };
23119
23390
 
@@ -23305,4 +23576,4 @@ var CoreThemeStoreProvider = function CoreThemeStoreProvider(_ref2) {
23305
23576
  }, children)));
23306
23577
  };
23307
23578
 
23308
- export { ConfigurableConnectedMap, ConfigurableMapWithSliderConnect, CoreThemeProvider, CoreThemeStoreProvider, HarmRefTimePreset, HarmonieTempAndPrecipPreset, LayerManagerConnect, LayerManagerMapButtonConnect, Legend, LegendConnect, LegendMapButtonConnect, MapControls, MapView, MapViewConnect, MapViewLayer, MultiDimensionSelectMapButtonsConnect, MultiMapMultiDimensionSelectConnect as MultiMapDimensionSelectConnect, MultiMapViewConnect, ReactMapView, ReactMapViewLayer, SyncGroupViewerConnect, index as SyncGroups, TimeSliderConnect, TooltipSelect, ZoomControlConnect, ZoomControls, componentsLookUp, coreModuleConfig, dateFormat, defaultConfigurations, filterBaseLayers, filterBbox, filterDimensions, filterMapLayers, filterMapPresets, filterNonTimeDimensions, filterServices, filterSrs, generateLayerId, generateMapId, generateTimesliderId, getFirstTimeStepForLayerId, getInitialPresets, getLastTimeStepForLayerId, getNextTimeStepForLayerId, getPreviousTimeStepForLayerId, getWMJSDimensionForLayerAndDimension, getWMJSMapById, getWMJSTimeDimensionForLayerId, getWMLayerById, reducer$6 as layerReducer, makeMapPreset, actions$3 as mapActions, constants$1 as mapConstants, moduleConfig as mapModuleConfig, selectors$1 as mapSelectors, types$2 as mapTypes, utils as mapUtils, publicLayers, publicServices, registerWMJSMap, registerWMLayer, store, actions as syncGroupActions, synchronizationGroupConfig as synchronizationGroupModuleConfig, testLayers, actions$2 as uiActions, uiModuleConfig, selectors as uiSelectors, types$1 as uiTypes, useStyles$3 as useStyles };
23579
+ export { ConfigurableConnectedMap, ConfigurableMapWithSliderConnect, CoreThemeProvider, CoreThemeStoreProvider, HarmRefTimePreset, HarmonieTempAndPrecipPreset, LayerManagerConnect, LayerManagerMapButtonConnect, Legend, LegendConnect, LegendMapButtonConnect, MapControls, MapView, MapViewConnect, MapViewLayer, MultiDimensionSelectMapButtonsConnect, MultiMapMultiDimensionSelectConnect as MultiMapDimensionSelectConnect, MultiMapViewConnect, ReactMapView, ReactMapViewLayer, SyncGroupViewerConnect, index as SyncGroups, TimeSliderConnect, TooltipSelect, ZoomControlConnect, ZoomControls, componentsLookUp, coreModuleConfig, dateFormat, defaultConfigurations, filterBaseLayers, filterBbox, filterDimensions, filterMapLayers, filterMapPresets, filterNonTimeDimensions, filterServices, filterSrs, generateLayerId, generateMapId, generateTimesliderId, getFirstTimeStepForLayerId, getInitialPresets, getLastTimeStepForLayerId, getNextTimeStepForLayerId, getPreviousTimeStepForLayerId, getWMJSDimensionForLayerAndDimension, getWMJSMapById, getWMJSTimeDimensionForLayerId, getWMLayerById, reducer$6 as layerReducer, makeMapPreset, actions$3 as mapActions, constants as mapConstants, moduleConfig as mapModuleConfig, selectors$1 as mapSelectors, types$2 as mapTypes, utils as mapUtils, publicLayers, publicServices, registerWMJSMap, registerWMLayer, store, actions as syncGroupActions, synchronizationGroupConfig as synchronizationGroupModuleConfig, testLayers, actions$2 as uiActions, uiModuleConfig, selectors as uiSelectors, types$1 as uiTypes, useStyles$3 as useStyles };