@opengeoweb/core 4.1.0 → 4.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. package/index.esm.js +2024 -1482
  2. package/index.umd.js +2053 -1506
  3. package/lib/components/LayerManager/LayerManager.d.ts +13 -0
  4. package/lib/components/LayerManager/LayerSelect/KeywordFilterResults/KeywordFilterResults.d.ts +4 -4
  5. package/lib/components/LayerManager/LayerSelect/KeywordFilterResults/KeywordFilterResults.stories.d.ts +18 -2
  6. package/lib/components/LayerManager/LayerSelect/KeywordFilterResults/KeywordFilterResultsConnect.d.ts +0 -1
  7. package/lib/components/LayerManager/LayerSelect/KeywordFilterResults/KeywordFilterResultsListItem.d.ts +5 -5
  8. package/lib/components/LayerManager/LayerSelect/KeywordFilterResults/KeywordFilterResultsListItemConnect.d.ts +3 -2
  9. package/lib/components/LayerManager/LayerSelect/LayerInfo/LayerInfoButtonConnect.d.ts +11 -0
  10. package/lib/components/LayerManager/LayerSelect/{LayerSelectUtils.spec.d.ts → LayerInfo/LayerInfoButtonConnect.spec.d.ts} +0 -0
  11. package/lib/components/LayerManager/LayerSelect/LayerInfo/LayerInfoDialog.d.ts +14 -0
  12. package/lib/components/LayerManager/LayerSelect/LayerInfo/LayerInfoDialog.spec.d.ts +1 -0
  13. package/lib/components/LayerManager/LayerSelect/LayerInfo/LayerInfoDialog.stories.d.ts +25 -0
  14. package/lib/components/LayerManager/LayerSelect/LayerInfo/LayerInfoDialogConnect.d.ts +3 -0
  15. package/lib/components/LayerManager/LayerSelect/LayerInfo/LayerInfoList.d.ts +11 -0
  16. package/lib/components/LayerManager/LayerSelect/LayerInfo/LayerInfoText.d.ts +7 -0
  17. package/lib/components/LayerManager/LayerSelect/LayerInfo/LayerInfoUtils.d.ts +4 -0
  18. package/lib/components/LayerManager/LayerSelect/LayerInfo/LayerInfoUtils.spec.d.ts +1 -0
  19. package/lib/components/LayerManager/LayerSelect/LayerInfo/index.d.ts +2 -0
  20. package/lib/components/LayerManager/LayerSelect/LayerList/LayerList.d.ts +5 -3
  21. package/lib/components/LayerManager/LayerSelect/LayerList/LayerListConnect.d.ts +1 -0
  22. package/lib/components/LayerManager/LayerSelect/LayerList/LayerListRow.d.ts +1 -1
  23. package/lib/components/LayerManager/LayerSelect/LayerList/LayerListUtils.d.ts +1 -1
  24. package/lib/components/LayerManager/LayerSelect/LayerSelectConnect.d.ts +0 -2
  25. package/lib/components/LayerManager/LayerSelect/SearchField/SearchFieldButtonContainer.d.ts +1 -0
  26. package/lib/components/LayerManager/LayerSelect/ServiceList/ServiceChipConnect.d.ts +2 -1
  27. package/lib/components/LayerManager/LayerSelect/ServiceList/ServiceList.d.ts +1 -1
  28. package/lib/components/LayerManager/LayerSelect/ServiceList/ServiceListConnect.d.ts +3 -1
  29. package/lib/components/LayerManager/LayerSelect/ServiceOptionsButton/ServiceOptionsButton.d.ts +4 -1
  30. package/lib/components/LayerManager/LayerSelect/ServiceOptionsDialog/ServiceOptionsDialog.d.ts +13 -3
  31. package/lib/components/LayerManager/LayerSelect/ServiceOptionsDialog/ServiceOptionsDialog.stories.d.ts +18 -2
  32. package/lib/components/LayerManager/LayerSelect/ServiceOptionsDialog/ServiceOptionsDialogConnect.d.ts +6 -1
  33. package/lib/components/LayerManager/LayerSelect/ServicePopup/ServicePopup.d.ts +11 -5
  34. package/lib/components/LayerManager/LayerSelect/ServicePopup/ServicePopup.stories.d.ts +49 -9
  35. package/lib/components/LayerManager/LayerSelect/ServicePopup/ServicePopupConnect.d.ts +2 -1
  36. package/lib/components/LayerManager/LayerSelect/ServicePopup/ServicePopupConnect.stories.d.ts +9 -0
  37. package/lib/components/LayerManager/LayerSelect/ServicePopup/utils.d.ts +8 -0
  38. package/lib/components/LayerManager/LayerSelect/ServicePopup/utils.spec.d.ts +1 -0
  39. package/lib/components/LayerManager/useFetchServices.d.ts +4 -0
  40. package/lib/components/LayerManager/useFetchServices.spec.d.ts +1 -0
  41. package/lib/components/MultiMapDimensionSelect/DimensionSelectDialogConnect.d.ts +1 -1
  42. package/lib/components/ReactMapView/types.d.ts +2 -1
  43. package/lib/components/Snackbar/SnackbarWrapperConnect.spec.d.ts +7 -0
  44. package/lib/components/TimeSlider/TimeSliderButtons/SpeedButton/SpeedButton.d.ts +1 -1
  45. package/lib/components/TimeSlider/TimeSliderButtons/SpeedButton/SpeedButtonConnect.d.ts +1 -5
  46. package/lib/components/TimeSlider/TimeSliderButtons/TimeSliderMenu/TimeSliderMenu.d.ts +18 -0
  47. package/lib/components/TimeSlider/TimeSliderButtons/TimeSliderMenu/TimeSliderMenu.spec.d.ts +1 -0
  48. package/lib/components/TimeSlider/TimeSliderButtons/TimeSliderMenu/TimeSliderMenu.stories.d.ts +28 -0
  49. package/lib/components/TimeSlider/TimeSliderButtons/TimeStepButton/TimeStepButton.d.ts +1 -1
  50. package/lib/components/TimeSlider/TimeSliderButtons/TimeStepButton/TimeStepButton.stories.d.ts +24 -3
  51. package/lib/components/WMSLoader/services.d.ts +1 -0
  52. package/lib/hooks/index.d.ts +1 -0
  53. package/lib/hooks/useSetupDialog/index.d.ts +1 -0
  54. package/lib/hooks/useSetupDialog/useSetupDialog.d.ts +9 -0
  55. package/lib/hooks/useSetupDialog/useSetupDialog.spec.d.ts +1 -0
  56. package/lib/index.d.ts +1 -0
  57. package/lib/store/layerSelect/reducer.d.ts +8 -5
  58. package/lib/store/layerSelect/sagas.d.ts +3 -2
  59. package/lib/store/layerSelect/selectors.d.ts +53 -6
  60. package/lib/store/layerSelect/types.d.ts +32 -13
  61. package/lib/store/mapStore/service/types.d.ts +4 -1
  62. package/lib/store/ui/types.d.ts +4 -1
  63. package/lib/utils/defaultTestSettings.d.ts +1 -0
  64. package/lib/utils/getCapabilities.d.ts +4 -1
  65. package/package.json +6 -6
  66. package/lib/components/LayerManager/LayerSelect/LayerSelectUtils.d.ts +0 -4
package/index.esm.js CHANGED
@@ -2,16 +2,21 @@ import { createAction, createSlice, createSelector, createEntityAdapter } from '
2
2
  import produce$1, { current, produce } from 'immer';
3
3
  import moment from 'moment';
4
4
  import * as React from 'react';
5
- import React__default, { Component, useRef, useState, useEffect } from 'react';
6
- import _, { isEqual, debounce, throttle, range } from 'lodash';
5
+ import React__default, { Component, useRef, useState, useEffect, useCallback } from 'react';
6
+ import _, { isEqual, debounce, groupBy, throttle, range } from 'lodash';
7
7
  import { takeLatest, put, select, call, all, takeEvery, delay } from 'redux-saga/effects';
8
8
  import { connect, useDispatch, useSelector, Provider } from 'react-redux';
9
9
  import { Tooltip, Paper, Box, Typography, Grid, InputLabel, IconButton, CircularProgress, List, ListSubheader, ListItem, ListItemText, Dialog, DialogTitle, DialogContent, DialogContentText, TextField, DialogActions, Button, MenuItem, FormControl, LinearProgress, InputAdornment, ListItemSecondaryAction, ListItemIcon, Checkbox, Switch, styled, Slider, Menu, Popover, useTheme, SliderThumb, Snackbar } from '@mui/material';
10
- import { ToolButton, ToolContainerDraggable, TooltipSelect, AlertIcon, tooltipContainerStyles, sliderHeaderStyle, CustomSlider, ToggleMenu, ManagerButton, EnableButton, AlertBanner, ManagerDeleteButton, CustomToggleButton, useIsMounted } from '@opengeoweb/shared';
11
- import { Pause, Play, Cached, Add, Copy, Flag, DragHandle as DragHandle$1, Filter, Close, Search, Clear, ChevronLeft, ChevronRight, Edit, Delete, Home, Minus, Layers, Equalizer, Sort, Link, LinkOff, AutoUpdateActive, AutoUpdateInActive, TextIcon, FastForward, Options, SliderThumb as SliderThumb$1, List as List$1, ThemeWrapper, lightTheme } from '@opengeoweb/theme';
10
+ import { ToolButton, ToolContainerDraggable, TooltipSelect, AlertIcon, tooltipContainerStyles, sliderHeaderStyle, CustomSlider, ToggleMenu, ManagerButton, EnableButton, AlertBanner, ManagerDeleteButton, calculateDialogSizeAndPosition, CustomToggleButton, useIsMounted } from '@opengeoweb/shared';
11
+ import { Pause, Play, Cached, Add, Copy, Flag, DragHandle as DragHandle$1, Filter, Search, Clear, Close, Info, DimensionsTime, DimensionsRefTime, DimensionsElevation, DimensionsOther, Edit, Visibility, Delete, Home, Minus, Layers, Equalizer, Link, LinkOff, AutoUpdateActive, AutoUpdateInActive, TextIcon, Speed, FastForward, Options, SliderThumb as SliderThumb$1, List as List$1, ThemeWrapper, lightTheme } from '@opengeoweb/theme';
12
12
  import { legendImageStore, WMImageEventType, getLegendGraphicURLForLayer, WMGetServiceFromStore, LayerType as LayerType$1, getMapImageStore, WMBBOX, debug, DebugType, WMJSMap, WMLayer } from '@opengeoweb/webmap';
13
13
  import { Sortable, ReactSortable } from 'react-sortablejs';
14
+ import { ReactHookFormProvider, defaultFormOptions, ReactHookFormTextField } from '@opengeoweb/form-fields';
15
+ import { useFormContext } from 'react-hook-form';
14
16
  import { FixedSizeList } from 'react-window';
17
+ import Box$1 from '@mui/material/Box';
18
+ import Typography$1 from '@mui/material/Typography';
19
+ import Grid$1 from '@mui/material/Grid';
15
20
  import { debounce as debounce$1 } from 'throttle-debounce';
16
21
  import cloneDeep from 'lodash.clonedeep';
17
22
  import proj4 from 'proj4';
@@ -1946,7 +1951,7 @@ var getLayerFromService = createSelector(function (store, serviceUrl) {
1946
1951
  * @returns {array} returnType: Style[] - array containing layer styles
1947
1952
  */
1948
1953
 
1949
- var getLayerStyles = createSelector(getLayerFromService, function (layer) {
1954
+ var getLayerStyles$1 = createSelector(getLayerFromService, function (layer) {
1950
1955
  return layer && layer.styles ? layer.styles : [];
1951
1956
  }, selectorMemoizationOptions);
1952
1957
  /**
@@ -4363,10 +4368,18 @@ var initialState$1 = {
4363
4368
  byId: {},
4364
4369
  allIds: []
4365
4370
  },
4366
- keywords: {
4371
+ filters: {
4367
4372
  byId: {},
4368
4373
  allIds: []
4369
4374
  }
4375
+ },
4376
+ allServicesEnabled: true,
4377
+ activeLayerInfo: {
4378
+ name: '',
4379
+ text: '',
4380
+ leaf: true,
4381
+ path: [],
4382
+ serviceName: ''
4370
4383
  }
4371
4384
  };
4372
4385
  var slice$1 = createSlice({
@@ -4377,86 +4390,84 @@ var slice$1 = createSlice({
4377
4390
  var filterText = action.payload.filterText;
4378
4391
  draft.filters.searchFilter = filterText;
4379
4392
  },
4380
- addKeywordsAndActiveServices: function addKeywordsAndActiveServices(draft, action) {
4393
+ setAllServicesEnabled: function setAllServicesEnabled(draft, action) {
4394
+ var allServicesEnabled = action.payload.allServicesEnabled;
4395
+ draft.allServicesEnabled = allServicesEnabled;
4396
+ },
4397
+ addFiltersAndActiveServices: function addFiltersAndActiveServices(draft, action) {
4381
4398
  var _action$payload = action.payload,
4382
4399
  serviceId = _action$payload.serviceId,
4383
4400
  serviceName = _action$payload.serviceName,
4384
4401
  serviceUrl = _action$payload.serviceUrl,
4402
+ _abstract = _action$payload["abstract"],
4385
4403
  keywords = _action$payload.keywords,
4386
- isUserAddedService = _action$payload.isUserAddedService;
4404
+ isUserAddedService = _action$payload.isUserAddedService,
4405
+ groups = _action$payload.groups;
4387
4406
 
4388
4407
  if (!draft.filters.activeServices.byId[serviceId]) {
4389
4408
  draft.filters.activeServices.byId[serviceId] = {};
4390
4409
 
4391
- var _iterator = _createForOfIteratorHelper(keywords),
4392
- _step;
4410
+ var addFilters = function addFilters(filterNames, filterType) {
4411
+ filterNames.forEach(function (filterName) {
4412
+ var id = "".concat(filterType, "-").concat(filterName);
4393
4413
 
4394
- try {
4395
- for (_iterator.s(); !(_step = _iterator.n()).done;) {
4396
- var keyword = _step.value;
4397
-
4398
- if (!draft.filters.keywords.byId[keyword]) {
4399
- draft.filters.keywords.byId[keyword] = {
4400
- id: keyword,
4414
+ if (!draft.filters.filters.byId[id]) {
4415
+ draft.filters.filters.byId[id] = {
4416
+ id: id,
4417
+ name: filterName,
4401
4418
  amount: 1,
4402
4419
  amountVisible: 1,
4403
- checked: true
4420
+ checked: true,
4421
+ type: filterType
4404
4422
  };
4405
- draft.filters.keywords.allIds.push(keyword);
4423
+ draft.filters.filters.allIds.push(id);
4406
4424
  } else {
4407
- draft.filters.keywords.byId[keyword].amount += 1;
4408
- draft.filters.keywords.byId[keyword].amountVisible += 1;
4425
+ draft.filters.filters.byId[id].amount += 1;
4426
+ draft.filters.filters.byId[id].amountVisible += 1;
4409
4427
  }
4410
- }
4411
- } catch (err) {
4412
- _iterator.e(err);
4413
- } finally {
4414
- _iterator.f();
4415
- }
4428
+ });
4429
+ };
4430
+
4431
+ addFilters(groups, 'group');
4432
+ addFilters(keywords, 'keyword');
4416
4433
  }
4417
4434
 
4418
- draft.filters.activeServices.byId[serviceId].serviceName = serviceName;
4419
- draft.filters.activeServices.byId[serviceId].serviceUrl = serviceUrl;
4420
- draft.filters.activeServices.byId[serviceId].enabled = true;
4421
- draft.filters.activeServices.byId[serviceId].isUserAddedService = isUserAddedService;
4422
- draft.filters.activeServices.byId[serviceId].keywordsPerService = keywords;
4435
+ var filterIds = groups.map(function (group) {
4436
+ return "group-".concat(group);
4437
+ }).concat(keywords.map(function (keyword) {
4438
+ return "keyword-".concat(keyword);
4439
+ }));
4440
+ draft.filters.activeServices.byId[serviceId] = {
4441
+ serviceId: serviceId,
4442
+ enabled: draft.allServicesEnabled,
4443
+ filterIds: filterIds,
4444
+ isUserAddedService: isUserAddedService,
4445
+ serviceName: serviceName,
4446
+ serviceUrl: serviceUrl,
4447
+ "abstract": _abstract
4448
+ };
4423
4449
  if (!draft.filters.activeServices.allIds.includes(serviceId)) draft.filters.activeServices.allIds.push(serviceId);
4424
4450
  },
4425
- layerSelectServiceRemoved: function layerSelectServiceRemoved(draft, action) {
4451
+ layerSelectRemoveService: function layerSelectRemoveService(draft, action) {
4426
4452
  var serviceId = action.payload.serviceId; // 1. Find a service that is to be removed
4427
4453
 
4428
4454
  var foundService = draft.filters.activeServices.byId[serviceId]; // 2. Go through all keywords for removed service, and decrement the amount of all found keywords
4429
4455
 
4430
- var _iterator2 = _createForOfIteratorHelper(foundService.keywordsPerService),
4431
- _step2;
4432
-
4433
- try {
4434
- var _loop = function _loop() {
4435
- var keyword = _step2.value;
4436
- var foundObject = draft.filters.keywords.byId[keyword];
4437
-
4438
- if (foundObject && foundObject.amount) {
4439
- foundObject.amount -= 1;
4440
- foundObject.amountVisible -= 1;
4441
- }
4442
-
4443
- if (foundObject && foundObject.amount === 0) {
4444
- delete draft.filters.keywords.byId[keyword];
4445
- draft.filters.keywords.allIds = draft.filters.keywords.allIds.filter(function (serviceId) {
4446
- return serviceId !== keyword;
4447
- });
4448
- }
4449
- };
4456
+ foundService.filterIds.forEach(function (filterId) {
4457
+ var foundObject = draft.filters.filters.byId[filterId];
4450
4458
 
4451
- for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
4452
- _loop();
4453
- } // Finally remove object from activeServices, so if the service is added again later on, new object and keywords will be re-added
4459
+ if (foundObject && foundObject.amount) {
4460
+ foundObject.amount -= 1;
4461
+ foundObject.amountVisible -= 1;
4462
+ }
4454
4463
 
4455
- } catch (err) {
4456
- _iterator2.e(err);
4457
- } finally {
4458
- _iterator2.f();
4459
- }
4464
+ if (foundObject && foundObject.amount === 0) {
4465
+ delete draft.filters.filters.byId[filterId];
4466
+ draft.filters.filters.allIds = draft.filters.filters.allIds.filter(function (serviceId) {
4467
+ return serviceId !== filterId;
4468
+ });
4469
+ }
4470
+ }); // Finally remove object from activeServices, so if the service is added again later on, new object and keywords will be re-added
4460
4471
 
4461
4472
  delete draft.filters.activeServices.byId[serviceId];
4462
4473
  draft.filters.activeServices.allIds = draft.filters.activeServices.allIds.filter(function (id) {
@@ -4466,66 +4477,59 @@ var slice$1 = createSlice({
4466
4477
  enableActiveService: function enableActiveService(draft, action) {
4467
4478
  var _action$payload2 = action.payload,
4468
4479
  serviceId = _action$payload2.serviceId,
4469
- keywords = _action$payload2.keywords;
4480
+ keywords = _action$payload2.filters;
4470
4481
  draft.filters.activeServices.byId[serviceId].enabled = true;
4471
4482
 
4472
- var _iterator3 = _createForOfIteratorHelper(keywords),
4473
- _step3;
4483
+ var _iterator = _createForOfIteratorHelper(keywords),
4484
+ _step;
4474
4485
 
4475
4486
  try {
4476
- for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
4477
- var keyword = _step3.value;
4478
- draft.filters.keywords.byId[keyword].amountVisible += 1;
4487
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
4488
+ var keyword = _step.value;
4489
+ draft.filters.filters.byId[keyword].amountVisible += 1;
4479
4490
  }
4480
4491
  } catch (err) {
4481
- _iterator3.e(err);
4492
+ _iterator.e(err);
4482
4493
  } finally {
4483
- _iterator3.f();
4494
+ _iterator.f();
4484
4495
  }
4485
4496
  },
4486
4497
  disableActiveService: function disableActiveService(draft, action) {
4487
4498
  var _action$payload3 = action.payload,
4488
4499
  serviceId = _action$payload3.serviceId,
4489
- keywords = _action$payload3.keywords;
4500
+ keywords = _action$payload3.filters;
4490
4501
  draft.filters.activeServices.byId[serviceId].enabled = false;
4491
4502
 
4492
- var _iterator4 = _createForOfIteratorHelper(keywords),
4493
- _step4;
4503
+ var _iterator2 = _createForOfIteratorHelper(keywords),
4504
+ _step2;
4494
4505
 
4495
4506
  try {
4496
- for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
4497
- var keyword = _step4.value;
4498
- draft.filters.keywords.byId[keyword].amountVisible -= 1;
4507
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
4508
+ var keyword = _step2.value;
4509
+ draft.filters.filters.byId[keyword].amountVisible -= 1;
4499
4510
  }
4500
4511
  } catch (err) {
4501
- _iterator4.e(err);
4512
+ _iterator2.e(err);
4502
4513
  } finally {
4503
- _iterator4.f();
4514
+ _iterator2.f();
4504
4515
  }
4505
4516
  },
4506
- toggleKeywords: function toggleKeywords(draft, action) {
4507
- var keywords = action.payload.keywords;
4508
-
4509
- var _iterator5 = _createForOfIteratorHelper(keywords),
4510
- _step5;
4511
-
4512
- try {
4513
- for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {
4514
- var keyword = _step5.value;
4515
- draft.filters.keywords.byId[keyword].checked = !draft.filters.keywords.byId[keyword].checked;
4516
- }
4517
- } catch (err) {
4518
- _iterator5.e(err);
4519
- } finally {
4520
- _iterator5.f();
4521
- }
4517
+ toggleFilter: function toggleFilter(draft, action) {
4518
+ var filterIds = action.payload.filterIds;
4519
+ filterIds.forEach(function (filterId) {
4520
+ draft.filters.filters.byId[filterId].checked = !draft.filters.filters.byId[filterId].checked;
4521
+ });
4522
4522
  },
4523
- enableOnlyOneKeyword: function enableOnlyOneKeyword(draft, action) {
4524
- var keyword = action.payload.keyword;
4525
- draft.filters.keywords.allIds.forEach(function (serviceId) {
4526
- draft.filters.keywords.byId[serviceId].checked = false;
4523
+ enableOnlyOneFilter: function enableOnlyOneFilter(draft, action) {
4524
+ var filterId = action.payload.filterId;
4525
+ draft.filters.filters.allIds.forEach(function (filterId) {
4526
+ draft.filters.filters.byId[filterId].checked = false;
4527
4527
  });
4528
- draft.filters.keywords.byId[keyword].checked = true;
4528
+ draft.filters.filters.byId[filterId].checked = true;
4529
+ },
4530
+ setActiveLayerInfo: function setActiveLayerInfo(draft, action) {
4531
+ var layer = action.payload.layer;
4532
+ draft.activeLayerInfo = layer;
4529
4533
  }
4530
4534
  }
4531
4535
  });
@@ -4577,6 +4581,21 @@ var getActiveServices = createSelector(layerSelectStore, function (store) {
4577
4581
 
4578
4582
  return store ? (_a = store === null || store === void 0 ? void 0 : store.filters) === null || _a === void 0 ? void 0 : _a.activeServices.byId : {};
4579
4583
  }, selectorMemoizationOptions);
4584
+ /**
4585
+ * Returns active services by id
4586
+ *
4587
+ * Example getActiveServices(store, 'server-id');
4588
+ * @param {object} store store: object - store object
4589
+ * @param {serverId} serverId serverId: string - active server id
4590
+ * @returns {object} returnType: object of active service
4591
+ */
4592
+
4593
+ var getActiveServiceById = function getActiveServiceById(store, serviceId) {
4594
+ var _a, _b;
4595
+
4596
+ var enabledServices = ((_b = (_a = store === null || store === void 0 ? void 0 : store.layerSelect) === null || _a === void 0 ? void 0 : _a.filters) === null || _b === void 0 ? void 0 : _b.activeServices.byId[serviceId]) || {};
4597
+ return enabledServices;
4598
+ };
4580
4599
  /**
4581
4600
  * Returns all ids of enabled services
4582
4601
  *
@@ -4603,18 +4622,18 @@ var getEnabledServiceIds = createSelector(layerSelectStore, function (store) {
4603
4622
  * @returns {array} returnType: array of keyword ids that are checked
4604
4623
  */
4605
4624
 
4606
- var getCheckedKeywordIds = createSelector(layerSelectStore, function (store) {
4625
+ var getCheckedFilterIds = createSelector(layerSelectStore, function (store) {
4607
4626
  var _a, _b;
4608
4627
 
4609
- var checkedKeywords = (_b = (_a = store === null || store === void 0 ? void 0 : store.filters) === null || _a === void 0 ? void 0 : _a.keywords.allIds.filter(function (keyword) {
4610
- var _a;
4628
+ var checkedFilters = (_b = (_a = store === null || store === void 0 ? void 0 : store.filters) === null || _a === void 0 ? void 0 : _a.filters.allIds.filter(function (filterId) {
4629
+ var _a, _b;
4611
4630
 
4612
- return (_a = store === null || store === void 0 ? void 0 : store.filters) === null || _a === void 0 ? void 0 : _a.keywords.byId[keyword].checked;
4631
+ return (_b = (_a = store === null || store === void 0 ? void 0 : store.filters) === null || _a === void 0 ? void 0 : _a.filters.byId[filterId]) === null || _b === void 0 ? void 0 : _b.checked;
4613
4632
  })) !== null && _b !== void 0 ? _b : [];
4614
- return checkedKeywords.map(function (keyword) {
4633
+ return checkedFilters.map(function (filterId) {
4615
4634
  var _a;
4616
4635
 
4617
- return (_a = store === null || store === void 0 ? void 0 : store.filters) === null || _a === void 0 ? void 0 : _a.keywords.byId[keyword].id;
4636
+ return (_a = store === null || store === void 0 ? void 0 : store.filters) === null || _a === void 0 ? void 0 : _a.filters.byId[filterId].id;
4618
4637
  });
4619
4638
  }, selectorMemoizationOptions);
4620
4639
  /**
@@ -4625,11 +4644,28 @@ var getCheckedKeywordIds = createSelector(layerSelectStore, function (store) {
4625
4644
  * @returns {array} returnType: array of all keyword ids
4626
4645
  */
4627
4646
 
4628
- var getAllKeywordIds = createSelector(layerSelectStore, function (store) {
4647
+ var getAllFilterIds = createSelector(layerSelectStore, function (store) {
4629
4648
  var _a, _b;
4630
4649
 
4631
- return (_b = (_a = store === null || store === void 0 ? void 0 : store.filters) === null || _a === void 0 ? void 0 : _a.keywords.allIds) !== null && _b !== void 0 ? _b : [];
4650
+ return (_b = (_a = store === null || store === void 0 ? void 0 : store.filters) === null || _a === void 0 ? void 0 : _a.filters.allIds) !== null && _b !== void 0 ? _b : [];
4632
4651
  }, selectorMemoizationOptions);
4652
+ /**
4653
+ * Returns all filters
4654
+ *
4655
+ * Example getAllFilters(store);
4656
+ * @param {object} store store: object - store object
4657
+ * @returns {array} returnType: array of all filters
4658
+ */
4659
+
4660
+ var getAllFilters = createSelector(layerSelectStore, function (store) {
4661
+ var filters = store === null || store === void 0 ? void 0 : store.filters.filters.byId;
4662
+
4663
+ if (filters) {
4664
+ return Object.values(filters);
4665
+ }
4666
+
4667
+ return [];
4668
+ });
4633
4669
  /**
4634
4670
  * Returns if all keywords are checked
4635
4671
  *
@@ -4638,29 +4674,26 @@ var getAllKeywordIds = createSelector(layerSelectStore, function (store) {
4638
4674
  * @returns {array} returnType: boolean if all keywords are checked
4639
4675
  */
4640
4676
 
4641
- var isAllKeywordsChecked = createSelector(layerSelectStore, function (store) {
4677
+ var isAllFiltersChecked = createSelector(layerSelectStore, function (store) {
4642
4678
  var _a, _b;
4643
4679
 
4644
- return (_b = (_a = store === null || store === void 0 ? void 0 : store.filters) === null || _a === void 0 ? void 0 : _a.keywords) === null || _b === void 0 ? void 0 : _b.allIds.every(function (keyword) {
4645
- var _a, _b;
4680
+ return (_b = (_a = store === null || store === void 0 ? void 0 : store.filters) === null || _a === void 0 ? void 0 : _a.filters) === null || _b === void 0 ? void 0 : _b.allIds.every(function (filterId) {
4681
+ var _a, _b, _c;
4646
4682
 
4647
- return (_b = (_a = store === null || store === void 0 ? void 0 : store.filters) === null || _a === void 0 ? void 0 : _a.keywords) === null || _b === void 0 ? void 0 : _b.byId[keyword].checked;
4683
+ return (_c = (_b = (_a = store === null || store === void 0 ? void 0 : store.filters) === null || _a === void 0 ? void 0 : _a.filters) === null || _b === void 0 ? void 0 : _b.byId[filterId]) === null || _c === void 0 ? void 0 : _c.checked;
4648
4684
  });
4649
4685
  });
4650
4686
  /**
4651
- * Gets a KeywordObject by its id
4687
+ * Returns the active layer info
4652
4688
  *
4653
- * Example: keywordObject = getKeywordObjectById(store, 'keywordId')
4654
- * @param {object} store object from which the keyword state will be extracted
4655
- * @param {string} keywordId Id of the keyword
4656
- * @returns {object} object containing keyword information (id, amount, amountVisible, checked)
4689
+ * Example getActiveLayerInfo(store);
4690
+ * @param {object} store store: object - store object
4691
+ * @returns {object} returnType: ActiveLayerObject
4657
4692
  */
4658
4693
 
4659
- var getKeywordObjectById = function getKeywordObjectById(store, keywordId) {
4660
- var _a, _b, _c, _d;
4661
-
4662
- return (_d = (_c = (_b = (_a = store === null || store === void 0 ? void 0 : store.layerSelect) === null || _a === void 0 ? void 0 : _a.filters) === null || _b === void 0 ? void 0 : _b.keywords) === null || _c === void 0 ? void 0 : _c.byId[keywordId]) !== null && _d !== void 0 ? _d : {};
4663
- };
4694
+ var getActiveLayerInfo = createSelector(layerSelectStore, function (store) {
4695
+ return store === null || store === void 0 ? void 0 : store.activeLayerInfo;
4696
+ });
4664
4697
 
4665
4698
  /* *
4666
4699
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -4736,8 +4769,15 @@ var getFirstSnackbarMessage = createSelector(getCurrentSnackbarMessages, functio
4736
4769
  return currentMessages.length > 0 ? currentMessages[0] : undefined;
4737
4770
  });
4738
4771
 
4772
+ var DialogTypes;
4773
+
4774
+ (function (DialogTypes) {
4775
+ DialogTypes["LayerInfo"] = "layerInfo";
4776
+ })(DialogTypes || (DialogTypes = {}));
4777
+
4739
4778
  var types = /*#__PURE__*/Object.freeze({
4740
- __proto__: null
4779
+ __proto__: null,
4780
+ get DialogTypes () { return DialogTypes; }
4741
4781
  });
4742
4782
 
4743
4783
  /* *
@@ -5977,7 +6017,7 @@ var PlayButton = function PlayButton(_ref) {
5977
6017
  * Copyright 2020 - Finnish Meteorological Institute (FMI)
5978
6018
  * */
5979
6019
  var animationIntervalDefault = 5;
5980
- var connectRedux$6 = connect(function (store, props) {
6020
+ var connectRedux$5 = connect(function (store, props) {
5981
6021
  return {
5982
6022
  animationStartTime: getAnimationStartTime(store, props.mapId),
5983
6023
  animationEndTime: getAnimationEndTime(store, props.mapId),
@@ -5988,7 +6028,7 @@ var connectRedux$6 = connect(function (store, props) {
5988
6028
  mapStartAnimation: mapActions$1.mapStartAnimation,
5989
6029
  mapStopAnimation: mapActions$1.mapStopAnimation
5990
6030
  });
5991
- var PlayButtonConnect = connectRedux$6(function (_ref) {
6031
+ var PlayButtonConnect = connectRedux$5(function (_ref) {
5992
6032
  var mapId = _ref.mapId,
5993
6033
  animationStartTime = _ref.animationStartTime,
5994
6034
  animationEndTime = _ref.animationEndTime,
@@ -8204,16 +8244,6 @@ var moduleConfig = {
8204
8244
  * Copyright 2022 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
8205
8245
  * Copyright 2022 - Finnish Meteorological Institute (FMI)
8206
8246
  * */
8207
- var mergePresetsAndUserAddedServices = function mergePresetsAndUserAddedServices(presets, userAddedServices) {
8208
- return Object.values(Object.assign(Object.assign({}, presets.reduce(function (byUrl, preset) {
8209
- return Object.assign(Object.assign({}, byUrl), _defineProperty({}, preset.url, preset));
8210
- }, {})), userAddedServices));
8211
- };
8212
- var isNoIdService = function isNoIdService(param) {
8213
- var serviceParam = param;
8214
- return !!((serviceParam === null || serviceParam === void 0 ? void 0 : serviceParam.name) && (serviceParam === null || serviceParam === void 0 ? void 0 : serviceParam.url));
8215
- };
8216
-
8217
8247
  var getUserAddedServices = function getUserAddedServices() {
8218
8248
  try {
8219
8249
  var storedString = window.localStorage.getItem('userAddedServices');
@@ -8244,70 +8274,124 @@ var setUserAddedServices = function setUserAddedServices(services) {
8244
8274
  }
8245
8275
  };
8246
8276
 
8277
+ var isNoIdService = function isNoIdService(param) {
8278
+ var serviceParam = param;
8279
+ return !!((serviceParam === null || serviceParam === void 0 ? void 0 : serviceParam.name) && (serviceParam === null || serviceParam === void 0 ? void 0 : serviceParam.url));
8280
+ };
8281
+
8247
8282
  var _marked$1 = /*#__PURE__*/regeneratorRuntime.mark(newServiceAddedSaga),
8248
- _marked2$1 = /*#__PURE__*/regeneratorRuntime.mark(layerSelectServiceRemovedSaga),
8283
+ _marked2$1 = /*#__PURE__*/regeneratorRuntime.mark(layerSelectRemoveServiceSaga),
8249
8284
  _marked3 = /*#__PURE__*/regeneratorRuntime.mark(rootSaga$1);
8250
8285
  function newServiceAddedSaga(capturedAction) {
8251
- var addedService, id, serviceUrl, name, isUserAddedService, keywords;
8286
+ var addedService, id, serviceUrl, name, isUserAddedService, _abstract, keywords, groups;
8287
+
8252
8288
  return regeneratorRuntime.wrap(function newServiceAddedSaga$(_context) {
8253
8289
  while (1) {
8254
8290
  switch (_context.prev = _context.next) {
8255
8291
  case 0:
8256
8292
  addedService = capturedAction.payload;
8257
- id = addedService.id, serviceUrl = addedService.serviceUrl, name = addedService.name, isUserAddedService = addedService.isUserAddedService;
8258
- keywords = addedService.layers.reduce(function (keywordAccumulator, layer) {
8259
- return keywordAccumulator.concat(layer.path, layer.keywords);
8293
+ id = addedService.id, serviceUrl = addedService.serviceUrl, name = addedService.name, isUserAddedService = addedService.isUserAddedService, _abstract = addedService["abstract"];
8294
+ keywords = addedService.layers.reduce(function (keywords, layer) {
8295
+ var _a;
8296
+
8297
+ if (layer.leaf) {
8298
+ return keywords.concat((_a = layer.keywords) !== null && _a !== void 0 ? _a : []);
8299
+ }
8300
+
8301
+ return keywords;
8302
+ }, []);
8303
+ groups = addedService.layers.reduce(function (groups, layer) {
8304
+ var _a;
8305
+
8306
+ if (layer.leaf) {
8307
+ return groups.concat((_a = layer.path) !== null && _a !== void 0 ? _a : []);
8308
+ }
8309
+
8310
+ return groups;
8260
8311
  }, []);
8261
- _context.next = 5;
8262
- return put(layerSelectActions.addKeywordsAndActiveServices({
8312
+ _context.next = 6;
8313
+ return put(layerSelectActions.addFiltersAndActiveServices({
8263
8314
  serviceId: id,
8264
8315
  serviceName: name,
8265
8316
  serviceUrl: serviceUrl,
8266
8317
  keywords: keywords,
8267
- isUserAddedService: isUserAddedService
8318
+ isUserAddedService: isUserAddedService,
8319
+ groups: groups,
8320
+ "abstract": _abstract
8268
8321
  }));
8269
8322
 
8270
- case 5:
8323
+ case 6:
8271
8324
  case "end":
8272
8325
  return _context.stop();
8273
8326
  }
8274
8327
  }
8275
8328
  }, _marked$1);
8276
8329
  }
8277
- function layerSelectServiceRemovedSaga(capturedAction) {
8278
- var removedService, serviceId;
8279
- return regeneratorRuntime.wrap(function layerSelectServiceRemovedSaga$(_context2) {
8330
+ function layerSelectRemoveServiceSaga(capturedAction) {
8331
+ var removedService, serviceId, serviceUrl, results, services, servicesEnabled;
8332
+ return regeneratorRuntime.wrap(function layerSelectRemoveServiceSaga$(_context2) {
8280
8333
  while (1) {
8281
8334
  switch (_context2.prev = _context2.next) {
8282
8335
  case 0:
8283
8336
  removedService = capturedAction.payload;
8284
- serviceId = removedService.id;
8337
+ serviceId = removedService.serviceId, serviceUrl = removedService.serviceUrl;
8285
8338
  _context2.next = 4;
8286
- return put(layerSelectActions.layerSelectServiceRemoved({
8287
- serviceId: serviceId
8288
- }));
8339
+ return select(getActiveServices);
8289
8340
 
8290
8341
  case 4:
8342
+ results = _context2.sent;
8343
+ services = results;
8344
+ servicesEnabled = Object.values(services).find(function (service) {
8345
+ return service.enabled;
8346
+ });
8347
+
8348
+ if (!(servicesEnabled === undefined)) {
8349
+ _context2.next = 10;
8350
+ break;
8351
+ }
8352
+
8353
+ _context2.next = 10;
8354
+ return all(Object.entries(services).map(function (_ref) {
8355
+ var _ref2 = _slicedToArray(_ref, 2),
8356
+ serviceId = _ref2[0],
8357
+ service = _ref2[1];
8358
+
8359
+ return put(layerSelectActions.enableActiveService({
8360
+ serviceId: serviceId,
8361
+ filters: service.filterIds
8362
+ }));
8363
+ }));
8364
+
8365
+ case 10:
8366
+ _context2.next = 12;
8367
+ return put(serviceActions.mapStoreRemoveService({
8368
+ id: serviceId,
8369
+ serviceUrl: serviceUrl
8370
+ }));
8371
+
8372
+ case 12:
8291
8373
  case "end":
8292
8374
  return _context2.stop();
8293
8375
  }
8294
8376
  }
8295
8377
  }, _marked2$1);
8296
8378
  }
8297
- function addServiceToLocalStorageSaga(_ref) {
8298
- var payload = _ref.payload;
8379
+ function addServiceToLocalStorageSaga(_ref3) {
8380
+ var payload = _ref3.payload;
8299
8381
  var isUserAddedService = payload.isUserAddedService,
8300
8382
  name = payload.name,
8301
- serviceUrl = payload.serviceUrl;
8383
+ serviceUrl = payload.serviceUrl,
8384
+ _abstract2 = payload["abstract"];
8302
8385
  if (!isUserAddedService) return;
8303
8386
  var localStorageServices = getUserAddedServices();
8304
8387
  setUserAddedServices(Object.assign(Object.assign({}, localStorageServices), _defineProperty({}, serviceUrl, {
8305
8388
  name: name,
8306
- url: serviceUrl
8389
+ url: serviceUrl,
8390
+ "abstract": _abstract2
8307
8391
  })));
8308
8392
  }
8309
- function removeServiceFromLocalStorageSaga(_ref2) {
8310
- var payload = _ref2.payload;
8393
+ function removeServiceFromLocalStorageSaga(_ref4) {
8394
+ var payload = _ref4.payload;
8311
8395
  var serviceUrl = payload.serviceUrl;
8312
8396
  var localStorageServices = getUserAddedServices();
8313
8397
  if (!localStorageServices[serviceUrl]) return;
@@ -8325,7 +8409,7 @@ function rootSaga$1() {
8325
8409
 
8326
8410
  case 2:
8327
8411
  _context3.next = 4;
8328
- return takeEvery(serviceActions.mapStoreRemoveService.type, layerSelectServiceRemovedSaga);
8412
+ return takeEvery(layerSelectActions.layerSelectRemoveService.type, layerSelectRemoveServiceSaga);
8329
8413
 
8330
8414
  case 4:
8331
8415
  _context3.next = 6;
@@ -8516,7 +8600,9 @@ var recurseNodes = function recurseNodes(nodesToRecur) {
8516
8600
  children: [],
8517
8601
  keywords: nodesToRecur.keywords || [],
8518
8602
  "abstract": nodesToRecur["abstract"] || '',
8519
- styles: nodesToRecur.styles || []
8603
+ styles: nodesToRecur.styles || [],
8604
+ dimensions: nodesToRecur.dimensions || [],
8605
+ geographicBoundingBox: nodesToRecur.geographicBoundingBox || null
8520
8606
  };
8521
8607
 
8522
8608
  if (nodesToRecur.children) {
@@ -8774,7 +8860,7 @@ var WMSLayerTree = function WMSLayerTree(_ref) {
8774
8860
  * Copyright 2020 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
8775
8861
  * Copyright 2020 - Finnish Meteorological Institute (FMI)
8776
8862
  * */
8777
- var connectRedux$5 = connect(function (store, props) {
8863
+ var connectRedux$4 = connect(function (store, props) {
8778
8864
  return {
8779
8865
  loadedLayers: getMapLayers(store, props.mapId)
8780
8866
  };
@@ -8838,7 +8924,7 @@ var ConnectedTree = function ConnectedTree(_ref) {
8838
8924
  });
8839
8925
  };
8840
8926
 
8841
- var WMSLayerTreeConnect = connectRedux$5(ConnectedTree);
8927
+ var WMSLayerTreeConnect = connectRedux$4(ConnectedTree);
8842
8928
 
8843
8929
  var WMSServerList = function WMSServerList(_ref) {
8844
8930
  var availableServices = _ref.availableServices,
@@ -9012,7 +9098,7 @@ var defaultConfigurations = /*#__PURE__*/Object.freeze({
9012
9098
  preloadedDefaultMapServices: preloadedDefaultMapServices
9013
9099
  });
9014
9100
 
9015
- var validateServiceUrl = function validateServiceUrl(url) {
9101
+ var validateServiceUrl$1 = function validateServiceUrl(url) {
9016
9102
  if (url === '' || url === null || typeof url === 'undefined') return false;
9017
9103
  var matcher = /^(?:\w+:)?\/\/([^\s.]+\.\S{2}|[0-9a-zA-Z]+[:?\d]*)\S*$/;
9018
9104
  if (!matcher.test(url)) return false;
@@ -9082,7 +9168,7 @@ var AddLayersPopup = function AddLayersPopup(_ref) {
9082
9168
  setServiceURL('');
9083
9169
  setUrlError('');
9084
9170
  setLoading(false); // Check if valid URL was passed
9085
- } else if (validateServiceUrl(serviceURL)) {
9171
+ } else if (validateServiceUrl$1(serviceURL)) {
9086
9172
  // Check if service is WMS server
9087
9173
  getLayersFromService(serviceURL).then(function (layerTreeFromPromise) {
9088
9174
  // Shorten URL as a naming backup
@@ -9743,7 +9829,7 @@ var RenderLayers = function RenderLayers(_ref) {
9743
9829
  }));
9744
9830
  };
9745
9831
 
9746
- var marks$1 = [{
9832
+ var marks$2 = [{
9747
9833
  value: 0,
9748
9834
  label: '0 %'
9749
9835
  }, {
@@ -9870,7 +9956,7 @@ var OpacitySelect = function OpacitySelect(_ref) {
9870
9956
  step: 0.01,
9871
9957
  max: 1,
9872
9958
  min: 0,
9873
- marks: marks$1,
9959
+ marks: marks$2,
9874
9960
  onChange: function onChange(event, newValue) {
9875
9961
  event.stopPropagation();
9876
9962
  onLayerChangeOpacity(newValue);
@@ -10428,7 +10514,7 @@ var RenderStylesConnect = function RenderStylesConnect(_ref) {
10428
10514
  return getLayerName(store, layerId);
10429
10515
  });
10430
10516
  var layerStyles = useSelector(function (store) {
10431
- return getLayerStyles(store, layerService, layerName);
10517
+ return getLayerStyles$1(store, layerService, layerName);
10432
10518
  });
10433
10519
  var currentLayerStyle = useSelector(function (store) {
10434
10520
  return getLayerStyle(store, layerId);
@@ -11132,6 +11218,16 @@ var styles$2 = {
11132
11218
  boxSizing: 'border-box'
11133
11219
  }
11134
11220
  };
11221
+ var calculateStartSize = function calculateStartSize(minSize, prefSize, startPosition) {
11222
+ var _calculateDialogSizeA = calculateDialogSizeAndPosition(),
11223
+ calcWidth = _calculateDialogSizeA.width,
11224
+ calcHeight = _calculateDialogSizeA.height;
11225
+
11226
+ return {
11227
+ width: Math.max(minSize.width, Math.min(prefSize.width, calcWidth)),
11228
+ height: Math.max(minSize.height, Math.min(prefSize.height, calcHeight - startPosition.top))
11229
+ };
11230
+ };
11135
11231
 
11136
11232
  var LayerManager = function LayerManager(_ref) {
11137
11233
  var mapId = _ref.mapId,
@@ -11157,8 +11253,21 @@ var LayerManager = function LayerManager(_ref) {
11157
11253
  _ref$isLoading = _ref.isLoading,
11158
11254
  isLoading = _ref$isLoading === void 0 ? false : _ref$isLoading,
11159
11255
  error = _ref.error;
11256
+ var minSize = {
11257
+ width: 300,
11258
+ height: 126
11259
+ };
11260
+ var prefSize = {
11261
+ width: 720,
11262
+ height: 300
11263
+ };
11264
+ var startPosition = {
11265
+ top: 96,
11266
+ left: 50
11267
+ };
11268
+ var startSize = calculateStartSize(minSize, prefSize, startPosition);
11160
11269
 
11161
- var _React$useState = React.useState(LayerManagerWidth.lg),
11270
+ var _React$useState = React.useState(widthToWidthClass(startSize.width)),
11162
11271
  _React$useState2 = _slicedToArray(_React$useState, 2),
11163
11272
  layerManagerWidth = _React$useState2[0],
11164
11273
  setLayerManagerWidth = _React$useState2[1];
@@ -11170,16 +11279,10 @@ var LayerManager = function LayerManager(_ref) {
11170
11279
 
11171
11280
  return /*#__PURE__*/React.createElement(ToolContainerDraggable, {
11172
11281
  title: showTitle ? "Layer Manager ".concat(mapId) : 'Layer Manager',
11173
- startSize: {
11174
- width: 720,
11175
- height: 300
11176
- },
11177
- minWidth: 300,
11178
- minHeight: 126,
11179
- startPosition: {
11180
- top: 96,
11181
- left: 50
11182
- },
11282
+ startSize: startSize,
11283
+ minWidth: minSize.width,
11284
+ minHeight: minSize.height,
11285
+ startPosition: startPosition,
11183
11286
  isOpen: isOpen,
11184
11287
  onChangeSize: onChangeSize,
11185
11288
  onClose: onClose,
@@ -11274,42 +11377,141 @@ var KeywordFilterButtonConnect = function KeywordFilterButtonConnect(_ref) {
11274
11377
  }, /*#__PURE__*/React.createElement(Filter, null));
11275
11378
  };
11276
11379
 
11277
- var style$1 = {
11278
- dialogTitle: {
11279
- display: 'flex',
11280
- justifyContent: 'space-between',
11281
- padding: '16px 16px 20px 16px',
11282
- ' span': {
11283
- fontSize: '2.125rem'
11380
+ /* *
11381
+ * Licensed under the Apache License, Version 2.0 (the "License");
11382
+ * you may not use this file except in compliance with the License.
11383
+ * You may obtain a copy of the License at
11384
+ *
11385
+ * http://www.apache.org/licenses/LICENSE-2.0
11386
+ *
11387
+ * Unless required by applicable law or agreed to in writing, software
11388
+ * distributed under the License is distributed on an "AS IS" BASIS,
11389
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11390
+ * See the License for the specific language governing permissions and
11391
+ * limitations under the License.
11392
+ *
11393
+ * Copyright 2021 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
11394
+ * Copyright 2021 - Finnish Meteorological Institute (FMI)
11395
+ * */
11396
+ var isURL = function isURL(string) {
11397
+ return /^https?:\/\//.test(string);
11398
+ };
11399
+
11400
+ var SearchFieldButtonContainer = function SearchFieldButtonContainer(_ref) {
11401
+ var localSearchString = _ref.localSearchString,
11402
+ onClickClear = _ref.onClickClear,
11403
+ setPopupIsOpen = _ref.setPopupIsOpen;
11404
+
11405
+ var ClearButton = function ClearButton() {
11406
+ return /*#__PURE__*/React__default.createElement(Tooltip, {
11407
+ title: "Clear",
11408
+ placement: "top"
11409
+ }, /*#__PURE__*/React__default.createElement(IconButton, {
11410
+ edge: "end",
11411
+ onClick: function onClick() {
11412
+ onClickClear();
11413
+ },
11414
+ size: "large"
11415
+ }, /*#__PURE__*/React__default.createElement(Clear, null)));
11416
+ };
11417
+
11418
+ if (isURL(localSearchString)) return /*#__PURE__*/React__default.createElement(React__default.Fragment, null, /*#__PURE__*/React__default.createElement("div", {
11419
+ style: {
11420
+ marginRight: '15px'
11284
11421
  }
11285
- },
11286
- container: function container(theme) {
11287
- return {
11288
- '& .MuiDialog-paper': {
11289
- backgroundColor: theme.palette.geowebColors.cards.cardContainer
11290
- }
11291
- };
11292
- },
11293
- closeBtn: function closeBtn(theme) {
11294
- return {
11295
- color: theme.palette.geowebColors.captions.captionDisabled.color,
11296
- marginTop: 'auto',
11297
- marginBottom: 'auto'
11298
- };
11299
- },
11422
+ }, /*#__PURE__*/React__default.createElement(ClearButton, null)), /*#__PURE__*/React__default.createElement(Button, {
11423
+ variant: "tertiary",
11424
+ onClick: function onClick() {
11425
+ return setPopupIsOpen(true);
11426
+ }
11427
+ }, "Save"));
11428
+ if (localSearchString) return /*#__PURE__*/React__default.createElement(ClearButton, null);
11429
+ return /*#__PURE__*/React__default.createElement(Tooltip, {
11430
+ title: "Search",
11431
+ placement: "top"
11432
+ }, /*#__PURE__*/React__default.createElement(IconButton, {
11433
+ edge: "end",
11434
+ size: "large"
11435
+ }, /*#__PURE__*/React__default.createElement(Search, null)));
11436
+ };
11437
+
11438
+ /* *
11439
+ * Licensed under the Apache License, Version 2.0 (the "License");
11440
+ * you may not use this file except in compliance with the License.
11441
+ * You may obtain a copy of the License at
11442
+ *
11443
+ * http://www.apache.org/licenses/LICENSE-2.0
11444
+ *
11445
+ * Unless required by applicable law or agreed to in writing, software
11446
+ * distributed under the License is distributed on an "AS IS" BASIS,
11447
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11448
+ * See the License for the specific language governing permissions and
11449
+ * limitations under the License.
11450
+ *
11451
+ * Copyright 2022 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
11452
+ * Copyright 2022 - Finnish Meteorological Institute (FMI)
11453
+ * */
11454
+ var VALIDATIONS_NAME_EXISTING = 'This name already exists. Choose another name.';
11455
+ var VALIDATIONS_SERVICE_EXISTING = 'URL already exists.';
11456
+ var VALIDATIONS_SERVICE_VALID_URL = 'Not a valid URL.';
11457
+ var VALIDATIONS_REQUEST_FAILED = 'Download failed. Check the URL.';
11458
+ var validateServiceName = function validateServiceName(value, services) {
11459
+ var ownServiceName = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';
11460
+ var serviceName = value === null || value === void 0 ? void 0 : value.toLowerCase();
11461
+ var foundName = Object.keys(services).find(function (serviceId) {
11462
+ return services[serviceId].serviceName.toLowerCase() === serviceName && serviceName !== ownServiceName.toLocaleLowerCase();
11463
+ });
11464
+ return foundName === undefined ? true : VALIDATIONS_NAME_EXISTING;
11465
+ };
11466
+
11467
+ var isValidUrl = function isValidUrl(url) {
11468
+ if (url === '' || url === null || typeof url === 'undefined') {
11469
+ return false;
11470
+ }
11471
+
11472
+ var matcher = /^(?:\w+:)?\/\/([^\s.]+\.\S{2}|[0-9a-zA-Z]+[:?\d]*)\S*$/;
11473
+
11474
+ if (!matcher.test(url)) {
11475
+ return false;
11476
+ }
11477
+
11478
+ return true;
11479
+ };
11480
+
11481
+ var validateServiceUrl = function validateServiceUrl(value, services) {
11482
+ var serviceUrl = value; // validate valid url
11483
+
11484
+ var isServiceUrlValid = isValidUrl(serviceUrl);
11485
+
11486
+ if (!isServiceUrlValid) {
11487
+ return VALIDATIONS_SERVICE_VALID_URL;
11488
+ } // check url existing
11489
+
11490
+
11491
+ var foundUrl = Object.keys(services).find(function (serviceId) {
11492
+ return services[serviceId].serviceUrl === serviceUrl;
11493
+ });
11494
+
11495
+ if (foundUrl) {
11496
+ return VALIDATIONS_SERVICE_EXISTING;
11497
+ }
11498
+
11499
+ return true;
11500
+ };
11501
+
11502
+ var style$1 = {
11300
11503
  textField: {
11301
- width: '100%'
11302
- },
11303
- dialogContent: {
11304
- padding: '8px 16px'
11305
- },
11306
- footerContent: {
11307
- padding: '16px'
11504
+ width: '100%',
11505
+ marginBottom: 2
11308
11506
  }
11309
11507
  };
11310
11508
  var ADD_HEADING = 'Add a new service';
11311
11509
  var EDIT_HEADING = 'Edit service';
11312
11510
  var SAVE_HEADING = 'Save service';
11511
+ var COPY_URL_MESSAGE = 'Service URL copied to clipboard';
11512
+ var getSuccesMessage = function getSuccesMessage(serviceName) {
11513
+ return "Service \"".concat(serviceName, "\" has been saved succesfully");
11514
+ };
11313
11515
 
11314
11516
  var getTitleForVariant = function getTitleForVariant(variant) {
11315
11517
  switch (variant) {
@@ -11319,109 +11521,130 @@ var getTitleForVariant = function getTitleForVariant(variant) {
11319
11521
  case 'edit':
11320
11522
  return EDIT_HEADING;
11321
11523
 
11322
- default:
11524
+ case 'save':
11323
11525
  return SAVE_HEADING;
11526
+
11527
+ default:
11528
+ return 'Service';
11324
11529
  }
11325
11530
  };
11326
11531
 
11327
- var ServicePopup = function ServicePopup(_ref) {
11328
- var servicePopupVariant = _ref.servicePopupVariant,
11329
- _ref$hideBackdrop = _ref.hideBackdrop,
11330
- hideBackdrop = _ref$hideBackdrop === void 0 ? false : _ref$hideBackdrop,
11331
- isOpen = _ref.isOpen,
11332
- closePopup = _ref.closePopup,
11333
- serviceId = _ref.serviceId,
11334
- url = _ref.url,
11335
- services = _ref.services,
11336
- serviceSetLayers = _ref.serviceSetLayers;
11532
+ var fields = {
11533
+ serviceUrl: {
11534
+ name: 'serviceUrl',
11535
+ label: 'This service refers to this URL'
11536
+ },
11537
+ serviceName: {
11538
+ name: 'serviceName',
11539
+ label: 'Service name'
11540
+ },
11541
+ serviceAbstracts: {
11542
+ name: 'serviceAbstracts',
11543
+ label: 'Abstracts'
11544
+ }
11545
+ };
11337
11546
 
11338
- var _React$useState = React.useState(''),
11339
- _React$useState2 = _slicedToArray(_React$useState, 2),
11340
- serviceName = _React$useState2[0],
11341
- setServiceName = _React$useState2[1];
11547
+ var InitialValidationsTrigger = function InitialValidationsTrigger(_ref) {
11548
+ var trigger = _ref.trigger,
11549
+ getValues = _ref.getValues,
11550
+ onValidField = _ref.onValidField;
11551
+ React.useEffect(function () {
11552
+ var value = getValues(fields.serviceUrl.name);
11342
11553
 
11343
- var _React$useState3 = React.useState(''),
11344
- _React$useState4 = _slicedToArray(_React$useState3, 2),
11345
- serviceUrl = _React$useState4[0],
11346
- setServiceUrl = _React$useState4[1];
11347
-
11348
- var _React$useState5 = React.useState(''),
11349
- _React$useState6 = _slicedToArray(_React$useState5, 2),
11350
- _abstract = _React$useState6[0],
11351
- setAbstract = _React$useState6[1];
11352
-
11353
- var _React$useState7 = React.useState(false),
11354
- _React$useState8 = _slicedToArray(_React$useState7, 2),
11355
- disableButton = _React$useState8[0],
11356
- setDisableButton = _React$useState8[1];
11357
-
11358
- var _React$useState9 = React.useState(false),
11359
- _React$useState10 = _slicedToArray(_React$useState9, 2),
11360
- isLoading = _React$useState10[0],
11361
- setIsLoading = _React$useState10[1];
11362
-
11363
- var _React$useState11 = React.useState(false),
11364
- _React$useState12 = _slicedToArray(_React$useState11, 2),
11365
- serviceNameHasError = _React$useState12[0],
11366
- setServiceNameHasError = _React$useState12[1];
11554
+ if (value) {
11555
+ trigger(fields.serviceUrl.name).then(function (isValid) {
11556
+ return isValid && onValidField(value);
11557
+ });
11558
+ } // eslint-disable-next-line react-hooks/exhaustive-deps
11367
11559
 
11368
- var _React$useState13 = React.useState(''),
11369
- _React$useState14 = _slicedToArray(_React$useState13, 2),
11370
- serviceNameHelperText = _React$useState14[0],
11371
- setServiceNameHelperText = _React$useState14[1];
11560
+ }, []);
11561
+ return null;
11562
+ };
11372
11563
 
11373
- var _React$useState15 = React.useState(false),
11374
- _React$useState16 = _slicedToArray(_React$useState15, 2),
11375
- serviceUrlHasError = _React$useState16[0],
11376
- setServiceUrlHasError = _React$useState16[1];
11564
+ var ServicePopup = function ServicePopup(_ref2) {
11565
+ var servicePopupVariant = _ref2.servicePopupVariant,
11566
+ _ref2$hideBackdrop = _ref2.hideBackdrop,
11567
+ hideBackdrop = _ref2$hideBackdrop === void 0 ? false : _ref2$hideBackdrop,
11568
+ isOpen = _ref2.isOpen,
11569
+ closePopup = _ref2.closePopup,
11570
+ services = _ref2.services,
11571
+ serviceSetLayers = _ref2.serviceSetLayers,
11572
+ serviceUrl = _ref2.serviceUrl,
11573
+ serviceName = _ref2.serviceName,
11574
+ serviceAbstracts = _ref2.serviceAbstracts,
11575
+ _ref2$showSnackbar = _ref2.showSnackbar,
11576
+ showSnackbar = _ref2$showSnackbar === void 0 ? function () {} : _ref2$showSnackbar;
11577
+
11578
+ var _useFormContext = useFormContext(),
11579
+ reset = _useFormContext.reset,
11580
+ errors = _useFormContext.formState.errors,
11581
+ handleSubmit = _useFormContext.handleSubmit,
11582
+ setError = _useFormContext.setError,
11583
+ clearErrors = _useFormContext.clearErrors,
11584
+ watch = _useFormContext.watch,
11585
+ trigger = _useFormContext.trigger,
11586
+ getValues = _useFormContext.getValues,
11587
+ setValue = _useFormContext.setValue;
11377
11588
 
11378
- var _React$useState17 = React.useState(''),
11379
- _React$useState18 = _slicedToArray(_React$useState17, 2),
11380
- serviceUrlHelperText = _React$useState18[0],
11381
- setServiceUrlHelperText = _React$useState18[1];
11589
+ var _React$useState = React.useState(false),
11590
+ _React$useState2 = _slicedToArray(_React$useState, 2),
11591
+ isLoading = _React$useState2[0],
11592
+ setIsLoading = _React$useState2[1];
11382
11593
 
11383
- React.useEffect(function () {
11384
- var _a;
11594
+ var fetchServiceData = function fetchServiceData(newServiceUrl) {
11595
+ return __awaiter(void 0, void 0, void 0, /*#__PURE__*/regeneratorRuntime.mark(function _callee() {
11596
+ var service;
11597
+ return regeneratorRuntime.wrap(function _callee$(_context) {
11598
+ while (1) {
11599
+ switch (_context.prev = _context.next) {
11600
+ case 0:
11601
+ _context.prev = 0;
11602
+ setIsLoading(true);
11603
+ _context.next = 4;
11604
+ return getLayersFromService(newServiceUrl);
11385
11605
 
11386
- if (servicePopupVariant === 'edit') {
11387
- setServiceName(((_a = services[serviceId]) === null || _a === void 0 ? void 0 : _a.serviceName) || '');
11388
- setServiceUrl(url || '');
11389
- }
11606
+ case 4:
11607
+ service = WMGetServiceFromStore(newServiceUrl);
11608
+ setValue(fields.serviceName.name, service.title);
11609
+ setValue(fields.serviceAbstracts.name, service["abstract"]);
11610
+ setIsLoading(false);
11611
+ _context.next = 14;
11612
+ break;
11390
11613
 
11391
- if (servicePopupVariant === 'save') {
11392
- setServiceUrl(url || '');
11393
- }
11394
- }, [serviceId, services, url, servicePopupVariant, isOpen]);
11614
+ case 10:
11615
+ _context.prev = 10;
11616
+ _context.t0 = _context["catch"](0);
11617
+ setIsLoading(false);
11618
+ setError(fields.serviceUrl.name, {
11619
+ message: VALIDATIONS_REQUEST_FAILED,
11620
+ type: 'SYSTEM'
11621
+ });
11395
11622
 
11396
- var validateServiceUrl = function validateServiceUrl(url) {
11397
- if (url === '' || url === null || typeof url === 'undefined') return false;
11398
- var matcher = /^(?:\w+:)?\/\/([^\s.]+\.\S{2}|[0-9a-zA-Z]+[:?\d]*)\S*$/;
11399
- if (!matcher.test(url)) return false;
11400
- return true;
11623
+ case 14:
11624
+ case "end":
11625
+ return _context.stop();
11626
+ }
11627
+ }
11628
+ }, _callee, null, [[0, 10]]);
11629
+ }));
11401
11630
  };
11402
11631
 
11403
- var addNewService = function addNewService() {
11404
- return __awaiter(void 0, void 0, void 0, /*#__PURE__*/regeneratorRuntime.mark(function _callee() {
11632
+ var addNewService = function addNewService(formValues) {
11633
+ return __awaiter(void 0, void 0, void 0, /*#__PURE__*/regeneratorRuntime.mark(function _callee2() {
11405
11634
  var layers, serviceLayers, _iterator, _step, object, service;
11406
11635
 
11407
- return regeneratorRuntime.wrap(function _callee$(_context) {
11636
+ return regeneratorRuntime.wrap(function _callee2$(_context2) {
11408
11637
  while (1) {
11409
- switch (_context.prev = _context.next) {
11638
+ switch (_context2.prev = _context2.next) {
11410
11639
  case 0:
11411
- setServiceUrlHasError(false);
11412
-
11413
- if (!validateServiceUrl(serviceUrl)) {
11414
- _context.next = 15;
11415
- break;
11416
- }
11417
-
11640
+ clearErrors(fields.serviceUrl.name);
11418
11641
  setIsLoading(true);
11419
- _context.prev = 3;
11420
- _context.next = 6;
11421
- return getLayersFromService(serviceUrl);
11642
+ _context2.prev = 2;
11643
+ _context2.next = 5;
11644
+ return getLayersFromService(formValues.serviceUrl);
11422
11645
 
11423
- case 6:
11424
- layers = _context.sent;
11646
+ case 5:
11647
+ layers = _context2.sent;
11425
11648
 
11426
11649
  if (layers.children) {
11427
11650
  serviceLayers = [];
@@ -11437,7 +11660,9 @@ var ServicePopup = function ServicePopup(_ref) {
11437
11660
  path: object.path,
11438
11661
  keywords: object.keywords ? object.keywords : [],
11439
11662
  "abstract": object["abstract"] ? object["abstract"] : '',
11440
- styles: object.styles ? object.styles : []
11663
+ styles: object.styles ? object.styles : [],
11664
+ dimensions: object.dimensions || [],
11665
+ geographicBoundingBox: object.geographicBoundingBox || null
11441
11666
  });
11442
11667
  }
11443
11668
  } catch (err) {
@@ -11446,197 +11671,251 @@ var ServicePopup = function ServicePopup(_ref) {
11446
11671
  _iterator.f();
11447
11672
  }
11448
11673
 
11449
- service = WMGetServiceFromStore(serviceUrl);
11674
+ service = WMGetServiceFromStore(formValues.serviceUrl);
11450
11675
  serviceSetLayers({
11451
11676
  id: service.id,
11452
- name: serviceName,
11453
- serviceUrl: serviceUrl,
11677
+ name: formValues.serviceName,
11678
+ serviceUrl: formValues.serviceUrl,
11679
+ "abstract": formValues.serviceAbstracts,
11454
11680
  layers: serviceLayers,
11455
11681
  isUserAddedService: true
11456
11682
  });
11457
11683
  setIsLoading(false);
11458
- closePopupAndResetState();
11684
+ showSnackbar(getSuccesMessage(formValues.serviceName));
11685
+ closePopup();
11459
11686
  }
11460
11687
 
11461
- _context.next = 15;
11688
+ _context2.next = 13;
11462
11689
  break;
11463
11690
 
11464
- case 10:
11465
- _context.prev = 10;
11466
- _context.t0 = _context["catch"](3);
11691
+ case 9:
11692
+ _context2.prev = 9;
11693
+ _context2.t0 = _context2["catch"](2);
11467
11694
  setIsLoading(false);
11468
- setServiceUrlHasError(true);
11469
- setServiceUrlHelperText('Error: Download failed. Check the URL.');
11695
+ setError(fields.serviceUrl.name, {
11696
+ message: VALIDATIONS_REQUEST_FAILED,
11697
+ type: 'SYSTEM'
11698
+ });
11470
11699
 
11471
- case 15:
11700
+ case 13:
11472
11701
  case "end":
11473
- return _context.stop();
11702
+ return _context2.stop();
11474
11703
  }
11475
11704
  }
11476
- }, _callee, null, [[3, 10]]);
11705
+ }, _callee2, null, [[2, 9]]);
11477
11706
  }));
11478
11707
  };
11479
11708
 
11480
- var ServiceNameInRedux = function ServiceNameInRedux() {
11481
- if (servicePopupVariant === 'add' || servicePopupVariant === 'save') {
11482
- var foundName = Object.keys(services).find(function (serviceId) {
11483
- return services[serviceId].serviceName.toLowerCase() === (serviceName === null || serviceName === void 0 ? void 0 : serviceName.toLowerCase());
11484
- });
11485
- return foundName !== undefined;
11486
- }
11487
-
11488
- return false;
11709
+ var onValidateServiceUrl = function onValidateServiceUrl(value) {
11710
+ return validateServiceUrl(value, services);
11489
11711
  };
11490
11712
 
11491
- var UrlInRedux = function UrlInRedux() {
11492
- if (servicePopupVariant === 'add' || servicePopupVariant === 'save') {
11493
- var foundUrl = Object.keys(services).find(function (serviceId) {
11494
- return services[serviceId].serviceUrl === serviceUrl;
11495
- });
11496
- return foundUrl !== undefined;
11713
+ var onFocusServiceUrl = function onFocusServiceUrl() {
11714
+ if (!errors[fields.serviceUrl.name]) {
11715
+ trigger(fields.serviceUrl.name);
11497
11716
  }
11717
+ };
11498
11718
 
11499
- return false;
11500
- }; // Check serviceName
11501
-
11719
+ var onBlurServiceUrl = function onBlurServiceUrl() {
11720
+ if (!errors[fields.serviceUrl.name]) {
11721
+ fetchServiceData(getValues(fields.serviceUrl.name));
11722
+ }
11723
+ };
11502
11724
 
11503
- React.useEffect(function () {
11504
- if (serviceName === undefined) return;
11505
- setServiceNameHelperText('');
11725
+ var onValidateServiceName = function onValidateServiceName(value) {
11726
+ return validateServiceName(value, services, serviceName);
11727
+ };
11506
11728
 
11507
- if (ServiceNameInRedux()) {
11508
- setServiceNameHasError(true);
11509
- setServiceNameHelperText('Error: This name already exists. Choose another name.');
11510
- } else {
11511
- setServiceNameHasError(false);
11512
- setServiceNameHelperText('');
11513
- } // eslint-disable-next-line react-hooks/exhaustive-deps
11729
+ var getFormAreRequiredFieldsEmpty = function getFormAreRequiredFieldsEmpty() {
11730
+ var serviceNameField = watch(fields.serviceName.name);
11731
+ var serviceUrlField = watch(fields.serviceUrl.name);
11732
+ return serviceNameField === '' || serviceNameField === undefined || serviceUrlField === '' || serviceUrlField === undefined;
11733
+ };
11514
11734
 
11515
- }, [serviceName]); // Check Url
11735
+ var getFormHasformErrors = function getFormHasformErrors() {
11736
+ var totalErrors = Object.keys(errors).length;
11516
11737
 
11517
- React.useEffect(function () {
11518
- setServiceUrlHelperText('');
11519
-
11520
- if (serviceUrl && serviceUrl.length > 0 && !validateServiceUrl(serviceUrl)) {
11521
- setServiceUrlHasError(true);
11522
- setServiceUrlHelperText('Error: Not a valid URL.');
11523
- } else if (UrlInRedux()) {
11524
- setServiceUrlHasError(true);
11525
- setServiceUrlHelperText('Error: URL already exists.');
11526
- } else {
11527
- setServiceUrlHasError(false);
11528
- setServiceNameHelperText('');
11529
- } // eslint-disable-next-line react-hooks/exhaustive-deps
11738
+ if (totalErrors > 0) {
11739
+ // prevent SYSTEM error types from blocking the save button
11740
+ if (totalErrors === 1 && errors.serviceUrl) {
11741
+ return errors.serviceUrl.type !== undefined && errors.serviceUrl.type !== 'SYSTEM';
11742
+ }
11530
11743
 
11531
- }, [serviceUrl]); // Check if all fields are valid
11744
+ return true;
11745
+ }
11532
11746
 
11533
- React.useEffect(function () {
11534
- if (!serviceNameHasError && !serviceUrlHasError && validateServiceUrl(serviceUrl) && serviceName.length > 0) {
11535
- setDisableButton(false);
11536
- } else setDisableButton(true);
11537
- }, [serviceNameHasError, serviceUrlHasError, serviceName, serviceUrl]);
11538
-
11539
- var closePopupAndResetState = function closePopupAndResetState() {
11540
- setServiceName('');
11541
- setServiceUrl('');
11542
- setAbstract('');
11543
- closePopup();
11747
+ return false;
11544
11748
  };
11545
11749
 
11750
+ var isSubmitDisabled = getFormHasformErrors() || getFormAreRequiredFieldsEmpty();
11751
+ React.useEffect(function () {
11752
+ reset({
11753
+ serviceUrl: serviceUrl,
11754
+ serviceName: serviceName,
11755
+ serviceAbstracts: serviceAbstracts
11756
+ });
11757
+ }, [serviceUrl, serviceName, serviceAbstracts, reset]);
11758
+ var isShowPopup = servicePopupVariant === 'show';
11759
+ var isServiceUrlDisabled = isShowPopup || servicePopupVariant === 'edit';
11546
11760
  return /*#__PURE__*/React.createElement(Dialog, {
11547
11761
  open: isOpen,
11548
11762
  hideBackdrop: hideBackdrop,
11549
11763
  fullWidth: true,
11550
11764
  maxWidth: "xs",
11551
11765
  "data-testid": "servicePopup",
11552
- sx: style$1.container
11766
+ sx: {
11767
+ '& .MuiDialog-paper': {
11768
+ backgroundColor: "geowebColors.cards.cardContainer",
11769
+ maxWidth: 458
11770
+ }
11771
+ }
11772
+ }, /*#__PURE__*/React.createElement("form", {
11773
+ onSubmit: handleSubmit(addNewService)
11553
11774
  }, /*#__PURE__*/React.createElement(DialogTitle, {
11554
- sx: style$1.dialogTitle
11775
+ sx: {
11776
+ alignItems: 'center',
11777
+ padding: '16px 16px 24px 16px'
11778
+ }
11779
+ }, /*#__PURE__*/React.createElement(Box, {
11780
+ sx: {
11781
+ display: 'flex',
11782
+ justifyContent: 'space-between',
11783
+ alignItems: 'center',
11784
+ ' span': {
11785
+ fontSize: '1rem',
11786
+ fontWeight: 500,
11787
+ fontStyle: 'normal',
11788
+ lineHeight: '1.38',
11789
+ letterSpacing: '0.12px'
11790
+ }
11791
+ }
11555
11792
  }, /*#__PURE__*/React.createElement(Typography, {
11556
11793
  variant: "h5",
11557
11794
  component: "span"
11558
11795
  }, getTitleForVariant(servicePopupVariant)), /*#__PURE__*/React.createElement(IconButton, {
11796
+ "aria-label": "close",
11559
11797
  size: "small",
11560
- onClick: closePopupAndResetState,
11798
+ onClick: closePopup,
11561
11799
  "data-testid": "closePopupButtonCross",
11562
- sx: style$1.closeBtn
11563
- }, /*#__PURE__*/React.createElement(Close, null))), /*#__PURE__*/React.createElement(DialogContent, {
11564
- sx: style$1.dialogContent
11565
- }, /*#__PURE__*/React.createElement(TextField, {
11800
+ sx: {
11801
+ color: 'geowebColors.captions.captionDisabled.color',
11802
+ marginTop: 'auto',
11803
+ marginBottom: 'auto'
11804
+ }
11805
+ }, /*#__PURE__*/React.createElement(Close, null))), isLoading && /*#__PURE__*/React.createElement(Box, {
11806
+ sx: {
11807
+ position: 'relative'
11808
+ }
11809
+ }, /*#__PURE__*/React.createElement(LinearProgress, {
11810
+ "data-testid": "loadingIndicator",
11811
+ color: "secondary",
11812
+ sx: {
11813
+ position: 'absolute',
11814
+ width: '100%',
11815
+ top: 8
11816
+ }
11817
+ }))), /*#__PURE__*/React.createElement(DialogContent, {
11818
+ sx: {
11819
+ padding: '8px 16px'
11820
+ }
11821
+ }, /*#__PURE__*/React.createElement(ReactHookFormTextField, {
11822
+ name: fields.serviceUrl.name,
11823
+ label: fields.serviceUrl.label,
11824
+ onFocus: onFocusServiceUrl,
11825
+ onBlur: onBlurServiceUrl,
11566
11826
  sx: style$1.textField,
11567
- variant: "filled",
11568
- label: "Service name",
11569
- onChange: function onChange(event) {
11570
- return setServiceName(event.target.value);
11827
+ rules: {
11828
+ required: true,
11829
+ validate: Object.assign({}, !isServiceUrlDisabled && {
11830
+ onValidateServiceUrl: onValidateServiceUrl
11831
+ })
11571
11832
  },
11572
- value: serviceName,
11573
- inputProps: {
11574
- 'data-testid': 'serviceNameTextField'
11833
+ disabled: isServiceUrlDisabled || isLoading,
11834
+ InputProps: {
11835
+ readOnly: isShowPopup,
11836
+ disableUnderline: isShowPopup,
11837
+ endAdornment: isShowPopup && /*#__PURE__*/React.createElement(InputAdornment, {
11838
+ position: "end"
11839
+ }, /*#__PURE__*/React.createElement(IconButton, {
11840
+ "aria-label": "copy url",
11841
+ onClick: function onClick() {
11842
+ navigator.clipboard.writeText(serviceUrl);
11843
+ showSnackbar(COPY_URL_MESSAGE);
11844
+ }
11845
+ }, /*#__PURE__*/React.createElement(Copy, null)))
11575
11846
  },
11576
- error: serviceNameHasError,
11577
- helperText: serviceNameHelperText
11578
- })), /*#__PURE__*/React.createElement(DialogContent, {
11579
- sx: style$1.dialogContent
11580
- }, /*#__PURE__*/React.createElement(TextField, {
11581
- sx: style$1.textField,
11582
- variant: "filled",
11583
- label: "Service URL",
11584
- onChange: function onChange(event) {
11585
- return setServiceUrl(event.target.value);
11847
+ defaultValue: serviceUrl
11848
+ }), /*#__PURE__*/React.createElement(ReactHookFormTextField, {
11849
+ name: fields.serviceName.name,
11850
+ label: fields.serviceName.label,
11851
+ rules: {
11852
+ required: true,
11853
+ validate: {
11854
+ onValidateServiceName: onValidateServiceName
11855
+ }
11586
11856
  },
11587
- value: serviceUrl,
11588
- id: "service-url",
11589
- inputProps: {
11590
- 'data-testid': 'serviceUrlTextField'
11857
+ disabled: isShowPopup || isLoading,
11858
+ InputProps: {
11859
+ readOnly: isShowPopup,
11860
+ disableUnderline: isShowPopup
11591
11861
  },
11592
- error: serviceUrlHasError,
11593
- helperText: serviceUrlHelperText
11594
- })), /*#__PURE__*/React.createElement(DialogContent, {
11595
- sx: style$1.dialogContent
11596
- }, /*#__PURE__*/React.createElement(TextField, {
11597
11862
  sx: style$1.textField,
11598
- variant: "filled",
11863
+ defaultValue: serviceName
11864
+ }), /*#__PURE__*/React.createElement(ReactHookFormTextField, {
11599
11865
  multiline: true,
11600
11866
  rows: 4,
11601
- label: "Abstracts",
11602
- helperText: "Short description of what this service does",
11603
- onChange: function onChange(event) {
11604
- return setAbstract(event.target.value);
11867
+ name: fields.serviceAbstracts.name,
11868
+ label: fields.serviceAbstracts.label,
11869
+ disabled: isShowPopup || isLoading,
11870
+ rules: {},
11871
+ InputProps: {
11872
+ readOnly: isShowPopup,
11873
+ disableUnderline: isShowPopup
11605
11874
  },
11606
- value: _abstract,
11607
- "data-testid": "abstractTextField",
11608
- disabled: true
11875
+ helperText: !isShowPopup && 'Short description of what this service does',
11876
+ sx: style$1.textField,
11877
+ defaultValue: ""
11878
+ }), !isServiceUrlDisabled && /*#__PURE__*/React.createElement(InitialValidationsTrigger, {
11879
+ trigger: trigger,
11880
+ getValues: getValues,
11881
+ onValidField: fetchServiceData
11609
11882
  })), /*#__PURE__*/React.createElement(DialogActions, {
11610
- sx: style$1.footerContent
11611
- }, /*#__PURE__*/React.createElement(Button, {
11612
- onClick: closePopupAndResetState,
11883
+ sx: {
11884
+ padding: 2
11885
+ }
11886
+ }, isShowPopup ? /*#__PURE__*/React.createElement(Button, {
11887
+ onClick: function onClick() {
11888
+ return closePopup();
11889
+ },
11890
+ variant: "tertiary",
11891
+ sx: {
11892
+ width: '117px'
11893
+ }
11894
+ }, "close") : /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Button, {
11895
+ onClick: closePopup,
11613
11896
  "data-testid": "closePopupButtonCancel",
11614
11897
  variant: "tertiary",
11615
11898
  sx: {
11616
11899
  width: '117px'
11617
11900
  }
11618
- }, "cancel"), !isLoading ? /*#__PURE__*/React.createElement(Button, {
11901
+ }, "cancel"), /*#__PURE__*/React.createElement(Button, {
11902
+ type: "submit",
11619
11903
  variant: "primary",
11620
- disabled: disableButton,
11621
- onClick: addNewService,
11904
+ disabled: isSubmitDisabled || isLoading,
11622
11905
  "data-testid": "saveServiceButton",
11623
11906
  sx: {
11624
11907
  width: '117px',
11625
11908
  marginLeft: '16px!important'
11626
11909
  }
11627
- }, "save") : /*#__PURE__*/React.createElement(Box, {
11628
- "data-testid": "loadingIndicator",
11629
- sx: {
11630
- width: '117px',
11631
- height: '40px',
11632
- display: 'flex',
11633
- justifyContent: 'center',
11634
- alignItems: 'center',
11635
- marginLeft: '16px!important'
11636
- }
11637
- }, /*#__PURE__*/React.createElement(CircularProgress, {
11638
- size: 35
11639
- }))));
11910
+ }, "save")))));
11911
+ };
11912
+
11913
+ var ServicePopupWrapper = function ServicePopupWrapper(_a) {
11914
+ var props = __rest(_a, []);
11915
+
11916
+ return /*#__PURE__*/React.createElement(ReactHookFormProvider, {
11917
+ options: defaultFormOptions
11918
+ }, /*#__PURE__*/React.createElement(ServicePopup, Object.assign({}, props)));
11640
11919
  };
11641
11920
 
11642
11921
  /* *
@@ -11670,74 +11949,28 @@ var ServicePopupConnect = function ServicePopupConnect(_ref) {
11670
11949
  var serviceSetLayers = React__default.useCallback(function (payload) {
11671
11950
  dispatch(serviceActions.serviceSetLayers(payload));
11672
11951
  }, [dispatch]);
11673
- return /*#__PURE__*/React__default.createElement(ServicePopup, {
11952
+ var activeService = useSelector(function (store) {
11953
+ return getActiveServiceById(store, serviceId);
11954
+ });
11955
+ var showSnackbar = React__default.useCallback(function (message) {
11956
+ dispatch(snackbarActions.openSnackbar({
11957
+ message: message
11958
+ }));
11959
+ }, [dispatch]);
11960
+ return /*#__PURE__*/React__default.createElement(ServicePopupWrapper, {
11674
11961
  servicePopupVariant: servicePopupVariant,
11675
11962
  hideBackdrop: hideBackdrop,
11676
11963
  isOpen: isOpen,
11677
11964
  closePopup: closePopup,
11678
- serviceId: serviceId,
11679
11965
  services: services,
11680
11966
  serviceSetLayers: serviceSetLayers,
11681
- url: url
11967
+ serviceUrl: url || (activeService === null || activeService === void 0 ? void 0 : activeService.serviceUrl),
11968
+ serviceName: activeService === null || activeService === void 0 ? void 0 : activeService.serviceName,
11969
+ serviceAbstracts: activeService === null || activeService === void 0 ? void 0 : activeService["abstract"],
11970
+ showSnackbar: showSnackbar
11682
11971
  });
11683
11972
  };
11684
11973
 
11685
- var isURL = function isURL(string) {
11686
- return /^https?:\/\//.test(string);
11687
- };
11688
-
11689
- var SearchFieldButtonContainer = function SearchFieldButtonContainer(_ref) {
11690
- var localSearchString = _ref.localSearchString,
11691
- onClickClear = _ref.onClickClear;
11692
-
11693
- var _React$useState = React__default.useState(false),
11694
- _React$useState2 = _slicedToArray(_React$useState, 2),
11695
- isPopupOpen = _React$useState2[0],
11696
- setPopupOpen = _React$useState2[1];
11697
-
11698
- React__default.useEffect(function () {
11699
- if (isPopupOpen === false) {
11700
- onClickClear();
11701
- } // eslint-disable-next-line react-hooks/exhaustive-deps
11702
-
11703
- }, [isPopupOpen]);
11704
- var ClearButton = /*#__PURE__*/React__default.createElement(Tooltip, {
11705
- title: "Clear",
11706
- placement: "top"
11707
- }, /*#__PURE__*/React__default.createElement(IconButton, {
11708
- edge: "end",
11709
- onClick: function onClick() {
11710
- onClickClear();
11711
- },
11712
- size: "large"
11713
- }, /*#__PURE__*/React__default.createElement(Clear, null)));
11714
- if (isURL(localSearchString)) return /*#__PURE__*/React__default.createElement(React__default.Fragment, null, /*#__PURE__*/React__default.createElement("div", {
11715
- style: {
11716
- marginRight: '15px'
11717
- }
11718
- }, ClearButton), /*#__PURE__*/React__default.createElement(Button, {
11719
- variant: "tertiary",
11720
- onClick: function onClick() {
11721
- return setPopupOpen(true);
11722
- }
11723
- }, "Save"), /*#__PURE__*/React__default.createElement(ServicePopupConnect, {
11724
- servicePopupVariant: "save",
11725
- isOpen: isPopupOpen,
11726
- closePopup: function closePopup() {
11727
- return setPopupOpen(false);
11728
- },
11729
- url: localSearchString
11730
- }));
11731
- if (localSearchString) return ClearButton;
11732
- return /*#__PURE__*/React__default.createElement(Tooltip, {
11733
- title: "Search",
11734
- placement: "top"
11735
- }, /*#__PURE__*/React__default.createElement(IconButton, {
11736
- edge: "end",
11737
- size: "large"
11738
- }, /*#__PURE__*/React__default.createElement(Search, null)));
11739
- };
11740
-
11741
11974
  var SearchField = function SearchField(_ref) {
11742
11975
  var searchFilter = _ref.searchFilter,
11743
11976
  setSearchFilter = _ref.setSearchFilter;
@@ -11745,13 +11978,18 @@ var SearchField = function SearchField(_ref) {
11745
11978
  var _React$useState = React.useState(''),
11746
11979
  _React$useState2 = _slicedToArray(_React$useState, 2),
11747
11980
  localSearchString = _React$useState2[0],
11748
- setLocalSearchString = _React$useState2[1]; // mirror store unless typing a URL
11981
+ setLocalSearchString = _React$useState2[1];
11749
11982
 
11983
+ var _React$useState3 = React.useState(false),
11984
+ _React$useState4 = _slicedToArray(_React$useState3, 2),
11985
+ urlIsValid = _React$useState4[0],
11986
+ setUrlIsValid = _React$useState4[1];
11987
+
11988
+ var _React$useState5 = React.useState(false),
11989
+ _React$useState6 = _slicedToArray(_React$useState5, 2),
11990
+ popupIsOpen = _React$useState6[0],
11991
+ setPopupIsOpen = _React$useState6[1]; // eslint-disable-next-line react-hooks/exhaustive-deps
11750
11992
 
11751
- React.useEffect(function () {
11752
- if (isURL(localSearchString)) return;
11753
- setLocalSearchString(searchFilter); // eslint-disable-next-line react-hooks/exhaustive-deps
11754
- }, [searchFilter]); // eslint-disable-next-line react-hooks/exhaustive-deps
11755
11993
 
11756
11994
  var setSearchFilterDebounced = React.useCallback(debounce(setSearchFilter, 300), []);
11757
11995
 
@@ -11760,7 +11998,33 @@ var SearchField = function SearchField(_ref) {
11760
11998
  if (!isURL(text)) setSearchFilterDebounced(text);else if (searchFilter) setSearchFilterDebounced('');
11761
11999
  };
11762
12000
 
11763
- return /*#__PURE__*/React.createElement(TextField, {
12001
+ React.useEffect(function () {
12002
+ if (isURL(localSearchString)) {
12003
+ setUrlIsValid(true);
12004
+ }
12005
+ }, [localSearchString]);
12006
+ React.useEffect(function () {
12007
+ var keyDownHandler = function keyDownHandler(event) {
12008
+ if (event.key === 'Enter') {
12009
+ event.preventDefault();
12010
+
12011
+ if (urlIsValid) {
12012
+ setPopupIsOpen(true);
12013
+ }
12014
+ }
12015
+ };
12016
+
12017
+ document.addEventListener('keydown', keyDownHandler);
12018
+ return function () {
12019
+ document.removeEventListener('keydown', keyDownHandler);
12020
+ };
12021
+ }, [urlIsValid]); // mirror store unless typing a URL
12022
+
12023
+ React.useEffect(function () {
12024
+ if (isURL(localSearchString)) return;
12025
+ setLocalSearchString(searchFilter); // eslint-disable-next-line react-hooks/exhaustive-deps
12026
+ }, [searchFilter]);
12027
+ return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(TextField, {
11764
12028
  variant: "filled",
11765
12029
  label: "Search through services or enter a service URL",
11766
12030
  value: localSearchString,
@@ -11773,6 +12037,7 @@ var SearchField = function SearchField(_ref) {
11773
12037
  endAdornment: /*#__PURE__*/React.createElement(InputAdornment, {
11774
12038
  position: "end"
11775
12039
  }, /*#__PURE__*/React.createElement(SearchFieldButtonContainer, {
12040
+ setPopupIsOpen: setPopupIsOpen,
11776
12041
  localSearchString: localSearchString,
11777
12042
  onClickClear: function onClickClear() {
11778
12043
  setLocalSearchString('');
@@ -11780,7 +12045,259 @@ var SearchField = function SearchField(_ref) {
11780
12045
  }
11781
12046
  }))
11782
12047
  }
12048
+ }), /*#__PURE__*/React.createElement(ServicePopupConnect, {
12049
+ servicePopupVariant: "save",
12050
+ isOpen: popupIsOpen,
12051
+ closePopup: function closePopup() {
12052
+ setPopupIsOpen(false);
12053
+ setLocalSearchString('');
12054
+ },
12055
+ url: localSearchString
12056
+ }));
12057
+ };
12058
+
12059
+ /* *
12060
+ * Licensed under the Apache License, Version 2.0 (the "License");
12061
+ * you may not use this file except in compliance with the License.
12062
+ * You may obtain a copy of the License at
12063
+ *
12064
+ * http://www.apache.org/licenses/LICENSE-2.0
12065
+ *
12066
+ * Unless required by applicable law or agreed to in writing, software
12067
+ * distributed under the License is distributed on an "AS IS" BASIS,
12068
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12069
+ * See the License for the specific language governing permissions and
12070
+ * limitations under the License.
12071
+ *
12072
+ * Copyright 2021 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
12073
+ * Copyright 2021 - Finnish Meteorological Institute (FMI)
12074
+ * */
12075
+
12076
+ var SearchFieldConnect = function SearchFieldConnect() {
12077
+ var dispatch = useDispatch();
12078
+ var searchFilter = useSelector(function (store) {
12079
+ return getSearchFilter(store);
12080
+ });
12081
+ return /*#__PURE__*/React.createElement(SearchField, {
12082
+ setSearchFilter: function setSearchFilter(filterText) {
12083
+ dispatch(layerSelectActions.setSearchFilter({
12084
+ filterText: filterText
12085
+ }));
12086
+ },
12087
+ searchFilter: searchFilter
12088
+ });
12089
+ };
12090
+
12091
+ /* *
12092
+ * Licensed under the Apache License, Version 2.0 (the "License");
12093
+ * you may not use this file except in compliance with the License.
12094
+ * You may obtain a copy of the License at
12095
+ *
12096
+ * http://www.apache.org/licenses/LICENSE-2.0
12097
+ *
12098
+ * Unless required by applicable law or agreed to in writing, software
12099
+ * distributed under the License is distributed on an "AS IS" BASIS,
12100
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12101
+ * See the License for the specific language governing permissions and
12102
+ * limitations under the License.
12103
+ *
12104
+ * Copyright 2021 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
12105
+ * Copyright 2021 - Finnish Meteorological Institute (FMI)
12106
+ * */
12107
+ var filterLayersFromService = function filterLayersFromService(serviceId, services, filterIds, allFiltersActive, searchString) {
12108
+ var mapStoreService = services[serviceId];
12109
+ if (!mapStoreService) return [];
12110
+
12111
+ if (searchString === '' && allFiltersActive) {
12112
+ return mapStoreService.layers.filter(function (layer) {
12113
+ return layer.leaf;
12114
+ });
12115
+ }
12116
+
12117
+ var searchStringArray = searchString.split(' ');
12118
+ return mapStoreService.layers.filter(function (layer) {
12119
+ return searchStringArray.every(function (search) {
12120
+ var _a, _b, _c;
12121
+
12122
+ var searchLowercase = search.toLowerCase();
12123
+ var layerFilterIds = layer.path.map(function (group) {
12124
+ return "group-".concat(group);
12125
+ }).concat(layer.keywords.map(function (keyword) {
12126
+ return "keyword-".concat(keyword);
12127
+ }));
12128
+ var isFilterInLayer = (layerFilterIds === null || layerFilterIds === void 0 ? void 0 : layerFilterIds.some(function (id) {
12129
+ return filterIds.includes(id);
12130
+ })) || allFiltersActive;
12131
+ var isSearchTextInLayerFilter = layerFilterIds === null || layerFilterIds === void 0 ? void 0 : layerFilterIds.some(function (filterId) {
12132
+ return filterId.toLowerCase().includes(searchLowercase);
12133
+ });
12134
+ var isSearchTextInLayerName = (_a = layer.name) === null || _a === void 0 ? void 0 : _a.toLowerCase().includes(searchLowercase);
12135
+ var isSearchTextInLayerText = (_b = layer.text) === null || _b === void 0 ? void 0 : _b.toLowerCase().includes(searchLowercase);
12136
+ var isSearchTextInLayerAbstract = (_c = layer["abstract"]) === null || _c === void 0 ? void 0 : _c.toLowerCase().includes(searchLowercase);
12137
+ var isSearchTextInServiceName = mapStoreService.name.toLowerCase().includes(searchLowercase);
12138
+ var isSearchTextInLayer = isSearchTextInLayerName || isSearchTextInLayerText || isSearchTextInLayerAbstract || isSearchTextInLayerFilter || isSearchTextInServiceName;
12139
+ return isFilterInLayer && isSearchTextInLayer;
12140
+ });
12141
+ }).filter(function (layer) {
12142
+ return layer.leaf;
12143
+ });
12144
+ };
12145
+
12146
+ /* *
12147
+ * Licensed under the Apache License, Version 2.0 (the "License");
12148
+ * you may not use this file except in compliance with the License.
12149
+ * You may obtain a copy of the License at
12150
+ *
12151
+ * http://www.apache.org/licenses/LICENSE-2.0
12152
+ *
12153
+ * Unless required by applicable law or agreed to in writing, software
12154
+ * distributed under the License is distributed on an "AS IS" BASIS,
12155
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12156
+ * See the License for the specific language governing permissions and
12157
+ * limitations under the License.
12158
+ *
12159
+ * Copyright 2022 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
12160
+ * Copyright 2022 - Finnish Meteorological Institute (FMI)
12161
+ * */
12162
+
12163
+ var LayerAddRemoveButton = function LayerAddRemoveButton(_ref) {
12164
+ var layer = _ref.layer,
12165
+ layerIndex = _ref.layerIndex,
12166
+ serviceUrl = _ref.serviceUrl,
12167
+ addLayer = _ref.addLayer,
12168
+ deleteLayer = _ref.deleteLayer,
12169
+ mapLayers = _ref.mapLayers;
12170
+ var foundLayer = mapLayers.find(function (lr) {
12171
+ return lr.name === layer.name && lr.service === serviceUrl;
12172
+ });
12173
+ return /*#__PURE__*/React.createElement(CustomToggleButton, {
12174
+ "data-testid": "layerAddRemoveButton-".concat(layer.name),
12175
+ onClick: function onClick() {
12176
+ !foundLayer ? addLayer({
12177
+ serviceUrl: serviceUrl,
12178
+ layerName: layer.name
12179
+ }) : deleteLayer({
12180
+ layerId: foundLayer.id,
12181
+ layerIndex: layerIndex
12182
+ });
12183
+ },
12184
+ selected: !!foundLayer,
12185
+ variant: "tool",
12186
+ fullWidth: true,
12187
+ sx: {
12188
+ fontSize: '12px'
12189
+ }
12190
+ }, !foundLayer ? 'Add' : 'Remove');
12191
+ };
12192
+
12193
+ /* *
12194
+ * Licensed under the Apache License, Version 2.0 (the "License");
12195
+ * you may not use this file except in compliance with the License.
12196
+ * You may obtain a copy of the License at
12197
+ *
12198
+ * http://www.apache.org/licenses/LICENSE-2.0
12199
+ *
12200
+ * Unless required by applicable law or agreed to in writing, software
12201
+ * distributed under the License is distributed on an "AS IS" BASIS,
12202
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12203
+ * See the License for the specific language governing permissions and
12204
+ * limitations under the License.
12205
+ *
12206
+ * Copyright 2022 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
12207
+ * Copyright 2022 - Finnish Meteorological Institute (FMI)
12208
+ * */
12209
+
12210
+ var LayerInfoButtonConnect = function LayerInfoButtonConnect(_ref) {
12211
+ var layer = _ref.layer,
12212
+ mapId = _ref.mapId,
12213
+ serviceName = _ref.serviceName,
12214
+ _ref$source = _ref.source,
12215
+ source = _ref$source === void 0 ? 'app' : _ref$source;
12216
+ var dispatch = useDispatch();
12217
+ var currentActiveMapId = useSelector(function (store) {
12218
+ return getDialogMapId(store, DialogTypes.LayerInfo);
12219
+ });
12220
+ var isOpenInStore = useSelector(function (store) {
12221
+ return getisDialogOpen(store, DialogTypes.LayerInfo);
11783
12222
  });
12223
+ var currentLayerInfo = useSelector(function (store) {
12224
+ return getActiveLayerInfo(store);
12225
+ });
12226
+ var isActive = layer.name === (currentLayerInfo === null || currentLayerInfo === void 0 ? void 0 : currentLayerInfo.name) && serviceName === (currentLayerInfo === null || currentLayerInfo === void 0 ? void 0 : currentLayerInfo.serviceName);
12227
+ var toggleInfoDialog = React__default.useCallback(function () {
12228
+ dispatch(uiActions.setActiveMapIdForDialog({
12229
+ type: DialogTypes.LayerInfo,
12230
+ mapId: mapId,
12231
+ setOpen: currentActiveMapId !== mapId ? true : !isOpenInStore,
12232
+ source: source
12233
+ }));
12234
+ }, [currentActiveMapId, dispatch, isOpenInStore, mapId, source]);
12235
+ var setActiveLayerInfo = React__default.useCallback(function () {
12236
+ dispatch(layerSelectActions.setActiveLayerInfo({
12237
+ layer: Object.assign(Object.assign({}, layer), {
12238
+ serviceName: serviceName
12239
+ })
12240
+ }));
12241
+ }, [dispatch, layer, serviceName]);
12242
+
12243
+ var onClick = function onClick() {
12244
+ if (isActive) {
12245
+ toggleInfoDialog();
12246
+ }
12247
+
12248
+ if (!isActive && isOpenInStore) {
12249
+ setActiveLayerInfo();
12250
+ }
12251
+
12252
+ if (!isActive && !isOpenInStore) {
12253
+ setActiveLayerInfo();
12254
+ toggleInfoDialog();
12255
+ }
12256
+ };
12257
+
12258
+ return /*#__PURE__*/React__default.createElement(ToolButton, {
12259
+ variant: "icon",
12260
+ active: isActive && isOpenInStore,
12261
+ onClick: onClick,
12262
+ id: "layerInfoButton",
12263
+ "aria-label": "layer info"
12264
+ }, /*#__PURE__*/React__default.createElement(Info, null));
12265
+ };
12266
+
12267
+ /* *
12268
+ * Licensed under the Apache License, Version 2.0 (the "License");
12269
+ * you may not use this file except in compliance with the License.
12270
+ * You may obtain a copy of the License at
12271
+ *
12272
+ * http://www.apache.org/licenses/LICENSE-2.0
12273
+ *
12274
+ * Unless required by applicable law or agreed to in writing, software
12275
+ * distributed under the License is distributed on an "AS IS" BASIS,
12276
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12277
+ * See the License for the specific language governing permissions and
12278
+ * limitations under the License.
12279
+ *
12280
+ * Copyright 2022 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
12281
+ * Copyright 2022 - Finnish Meteorological Institute (FMI)
12282
+ * */
12283
+ var textStyle$1 = {
12284
+ lineHeight: '20px',
12285
+ letterSpacing: '0.25px'
12286
+ };
12287
+ var textStyleWithMargin = Object.assign(Object.assign({}, textStyle$1), {
12288
+ marginBottom: 1
12289
+ });
12290
+
12291
+ var LayerInfoText = function LayerInfoText(_ref) {
12292
+ var label = _ref.label,
12293
+ value = _ref.value;
12294
+ return /*#__PURE__*/React__default.createElement(React__default.Fragment, null, /*#__PURE__*/React__default.createElement(Typography$1, {
12295
+ variant: "subtitle2",
12296
+ sx: textStyle$1
12297
+ }, label), /*#__PURE__*/React__default.createElement(Typography$1, {
12298
+ variant: "body2",
12299
+ sx: textStyleWithMargin
12300
+ }, value));
11784
12301
  };
11785
12302
 
11786
12303
  /* *
@@ -11796,23 +12313,54 @@ var SearchField = function SearchField(_ref) {
11796
12313
  * See the License for the specific language governing permissions and
11797
12314
  * limitations under the License.
11798
12315
  *
11799
- * Copyright 2021 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
11800
- * Copyright 2021 - Finnish Meteorological Institute (FMI)
12316
+ * Copyright 2022 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
12317
+ * Copyright 2022 - Finnish Meteorological Institute (FMI)
11801
12318
  * */
12319
+ var textStyle = {
12320
+ lineHeight: '20px',
12321
+ letterSpacing: '0.25px'
12322
+ };
12323
+ var valueStyle = Object.assign(Object.assign({}, textStyle), {
12324
+ overflowWrap: 'break-word'
12325
+ });
11802
12326
 
11803
- var SearchFieldConnect = function SearchFieldConnect() {
11804
- var dispatch = useDispatch();
11805
- var searchFilter = useSelector(function (store) {
11806
- return getSearchFilter(store);
11807
- });
11808
- return /*#__PURE__*/React.createElement(SearchField, {
11809
- setSearchFilter: function setSearchFilter(filterText) {
11810
- dispatch(layerSelectActions.setSearchFilter({
11811
- filterText: filterText
11812
- }));
11813
- },
11814
- searchFilter: searchFilter
11815
- });
12327
+ var LayerInfoList = function LayerInfoList(_ref) {
12328
+ var label = _ref.label,
12329
+ list = _ref.list;
12330
+ return /*#__PURE__*/React__default.createElement(React__default.Fragment, null, /*#__PURE__*/React__default.createElement(Typography$1, {
12331
+ variant: "subtitle2",
12332
+ sx: textStyle
12333
+ }, label), /*#__PURE__*/React__default.createElement(Grid$1, {
12334
+ container: true,
12335
+ direction: "column"
12336
+ }, list.map(function (item) {
12337
+ return /*#__PURE__*/React__default.createElement("div", {
12338
+ key: item.name
12339
+ }, /*#__PURE__*/React__default.createElement(Grid$1, {
12340
+ item: true,
12341
+ container: true,
12342
+ direction: "row"
12343
+ }, item.icon, /*#__PURE__*/React__default.createElement(Grid$1, {
12344
+ item: true,
12345
+ sx: {
12346
+ marginLeft: '10px'
12347
+ }
12348
+ }, /*#__PURE__*/React__default.createElement(Typography$1, {
12349
+ variant: "body2",
12350
+ sx: textStyle
12351
+ }, item.name, ":"))), /*#__PURE__*/React__default.createElement(Grid$1, {
12352
+ item: true,
12353
+ container: true,
12354
+ direction: "row",
12355
+ sx: {
12356
+ marginBottom: 1,
12357
+ paddingLeft: '34px'
12358
+ }
12359
+ }, /*#__PURE__*/React__default.createElement(Typography$1, {
12360
+ variant: "body2",
12361
+ sx: valueStyle
12362
+ }, item.value)));
12363
+ })));
11816
12364
  };
11817
12365
 
11818
12366
  /* *
@@ -11828,32 +12376,47 @@ var SearchFieldConnect = function SearchFieldConnect() {
11828
12376
  * See the License for the specific language governing permissions and
11829
12377
  * limitations under the License.
11830
12378
  *
11831
- * Copyright 2021 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
11832
- * Copyright 2021 - Finnish Meteorological Institute (FMI)
12379
+ * Copyright 2022 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
12380
+ * Copyright 2022 - Finnish Meteorological Institute (FMI)
11833
12381
  * */
11834
- var filterLayersFromService = function filterLayersFromService(serviceId, services, keywordIds, allKeywordsActive, searchString) {
11835
- var mapStoreService = services[serviceId];
11836
- if (!mapStoreService) return [];
12382
+ var getLayerStyles = function getLayerStyles(layer) {
12383
+ if (!layer.styles) {
12384
+ return '-';
12385
+ }
11837
12386
 
11838
- if (searchString === '' && allKeywordsActive) {
11839
- return mapStoreService.layers.filter(function (layer) {
11840
- return layer.leaf;
11841
- });
12387
+ var styles = layer.styles.map(function (style) {
12388
+ return style.title;
12389
+ });
12390
+
12391
+ if (!styles.length) {
12392
+ return '-';
11842
12393
  }
11843
12394
 
11844
- var searchStringArray = searchString.split(' ');
11845
- return mapStoreService.layers.filter(function (layer) {
11846
- return searchStringArray.every(function (search) {
11847
- var layerPathAndKeywords = layer.path.concat(layer.keywords);
11848
- return (!!layerPathAndKeywords && !layerPathAndKeywords.every(function (keyword) {
11849
- return !keywordIds.includes(keyword);
11850
- }) || allKeywordsActive) && (!!layer.name && layer.name.toLowerCase().includes(search.toLowerCase()) || !!layer.text && layer.text.toLowerCase().includes(search.toLowerCase()) || !!layer["abstract"] && layer["abstract"].toLowerCase().includes(search.toLowerCase()) || !!layerPathAndKeywords && !layerPathAndKeywords.every(function (keyword) {
11851
- return !keyword.toLowerCase().includes(search.toLowerCase());
11852
- }) || mapStoreService.name.toLowerCase().includes(search.toLowerCase()));
11853
- });
11854
- }).filter(function (layer) {
11855
- return layer.leaf;
12395
+ return styles.join(', ');
12396
+ };
12397
+ var getDimensionValue = function getDimensionValue(name, layer, breakAt) {
12398
+ var includeUnit = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
12399
+
12400
+ var _a;
12401
+
12402
+ var dimension = (_a = layer.dimensions) === null || _a === void 0 ? void 0 : _a.find(function (dimension) {
12403
+ return dimension.name.toLowerCase() === name;
11856
12404
  });
12405
+
12406
+ if (!dimension) {
12407
+ return '-';
12408
+ }
12409
+
12410
+ var dimValue = dimension === null || dimension === void 0 ? void 0 : dimension.currentValue.split(breakAt).join("".concat(breakAt, " "));
12411
+
12412
+ if (includeUnit) {
12413
+ return "".concat(dimValue, " ").concat(dimension.units);
12414
+ }
12415
+
12416
+ return dimValue;
12417
+ };
12418
+ var getLayerBbox = function getLayerBbox(layer) {
12419
+ return layer.geographicBoundingBox ? "west ".concat(layer.geographicBoundingBox.west, ", east ").concat(layer.geographicBoundingBox.east, ", north ").concat(layer.geographicBoundingBox.north, ", south ").concat(layer.geographicBoundingBox.south) : '-';
11857
12420
  };
11858
12421
 
11859
12422
  /* *
@@ -11873,31 +12436,89 @@ var filterLayersFromService = function filterLayersFromService(serviceId, servic
11873
12436
  * Copyright 2022 - Finnish Meteorological Institute (FMI)
11874
12437
  * */
11875
12438
 
11876
- var LayerAddRemoveButton = function LayerAddRemoveButton(_ref) {
11877
- var layer = _ref.layer,
11878
- layerIndex = _ref.layerIndex,
11879
- serviceUrl = _ref.serviceUrl,
11880
- addLayer = _ref.addLayer,
11881
- deleteLayer = _ref.deleteLayer,
11882
- mapLayers = _ref.mapLayers;
11883
- var foundLayer = mapLayers.find(function (lr) {
11884
- return lr.name === layer.name && lr.service === serviceUrl;
11885
- });
11886
- return /*#__PURE__*/React.createElement(CustomToggleButton, {
11887
- "data-testid": "layerAddRemoveButton-".concat(layer.name),
11888
- onClick: function onClick() {
11889
- !foundLayer ? addLayer({
11890
- serviceUrl: serviceUrl,
11891
- layerName: layer.name
11892
- }) : deleteLayer({
11893
- layerId: foundLayer.id,
11894
- layerIndex: layerIndex
11895
- });
12439
+ var LayerInfoDialog = function LayerInfoDialog(_ref) {
12440
+ var onClose = _ref.onClose,
12441
+ layer = _ref.layer,
12442
+ isOpen = _ref.isOpen,
12443
+ _ref$onMouseDown = _ref.onMouseDown,
12444
+ onMouseDown = _ref$onMouseDown === void 0 ? function () {} : _ref$onMouseDown,
12445
+ _ref$order = _ref.order,
12446
+ order = _ref$order === void 0 ? 0 : _ref$order,
12447
+ _ref$source = _ref.source,
12448
+ source = _ref$source === void 0 ? 'app' : _ref$source,
12449
+ dialogHeight = _ref.dialogHeight;
12450
+
12451
+ var _a;
12452
+
12453
+ var styles = getLayerStyles(layer);
12454
+ var bbox = getLayerBbox(layer);
12455
+ var timeValue = getDimensionValue('time', layer, '/');
12456
+ var refTimeValue = getDimensionValue('reference_time', layer, ',');
12457
+ var elevationValue = getDimensionValue('elevation', layer, ',', true);
12458
+ return /*#__PURE__*/React__default.createElement(ToolContainerDraggable, {
12459
+ onClose: onClose,
12460
+ headerSize: "xs",
12461
+ startSize: {
12462
+ width: 288,
12463
+ height: dialogHeight || 650
11896
12464
  },
11897
- selected: !!foundLayer,
11898
- variant: "tool",
11899
- fullWidth: true
11900
- }, !foundLayer ? 'Add' : 'Remove');
12465
+ startPosition: {
12466
+ top: 150,
12467
+ left: 900
12468
+ },
12469
+ title: "Layer Info",
12470
+ isOpen: isOpen,
12471
+ onMouseDown: onMouseDown,
12472
+ order: order,
12473
+ source: source
12474
+ }, /*#__PURE__*/React__default.createElement(Box$1, {
12475
+ sx: {
12476
+ padding: 2
12477
+ }
12478
+ }, /*#__PURE__*/React__default.createElement(LayerInfoText, {
12479
+ label: "Title",
12480
+ value: layer.text
12481
+ }), /*#__PURE__*/React__default.createElement(LayerInfoText, {
12482
+ label: "Name",
12483
+ value: layer.name
12484
+ }), /*#__PURE__*/React__default.createElement(LayerInfoText, {
12485
+ label: "Service",
12486
+ value: layer.serviceName
12487
+ }), /*#__PURE__*/React__default.createElement(LayerInfoText, {
12488
+ label: "Abstract",
12489
+ value: layer["abstract"] || '-'
12490
+ }), /*#__PURE__*/React__default.createElement(LayerInfoList, {
12491
+ label: "Dimensions",
12492
+ list: [{
12493
+ name: 'Time',
12494
+ value: timeValue,
12495
+ icon: /*#__PURE__*/React__default.createElement(DimensionsTime, null)
12496
+ }, {
12497
+ name: 'Reference Time',
12498
+ value: refTimeValue,
12499
+ icon: /*#__PURE__*/React__default.createElement(DimensionsRefTime, null)
12500
+ }, {
12501
+ name: 'Elevation',
12502
+ value: elevationValue,
12503
+ icon: /*#__PURE__*/React__default.createElement(DimensionsElevation, null)
12504
+ }, {
12505
+ name: 'Other dimensions',
12506
+ value: '-',
12507
+ icon: /*#__PURE__*/React__default.createElement(DimensionsOther, null)
12508
+ }]
12509
+ }), /*#__PURE__*/React__default.createElement(LayerInfoText, {
12510
+ label: "Styles",
12511
+ value: styles
12512
+ }), /*#__PURE__*/React__default.createElement(LayerInfoText, {
12513
+ label: "Bounding Box",
12514
+ value: bbox
12515
+ }), /*#__PURE__*/React__default.createElement(LayerInfoText, {
12516
+ label: "Groups",
12517
+ value: layer.path.join('/') || '-'
12518
+ }), /*#__PURE__*/React__default.createElement(LayerInfoText, {
12519
+ label: "Keywords",
12520
+ value: ((_a = layer.keywords) === null || _a === void 0 ? void 0 : _a.join(', ')) || '-'
12521
+ })));
11901
12522
  };
11902
12523
 
11903
12524
  /* *
@@ -11916,15 +12537,24 @@ var LayerAddRemoveButton = function LayerAddRemoveButton(_ref) {
11916
12537
  * Copyright 2022 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
11917
12538
  * Copyright 2022 - Finnish Meteorological Institute (FMI)
11918
12539
  * */
12540
+ var layerInfoStyle = {
12541
+ fontSize: '10px',
12542
+ textOverflow: 'ellipsis',
12543
+ overflow: 'hidden',
12544
+ whiteSpace: 'nowrap'
12545
+ };
11919
12546
 
11920
12547
  var LayerListRow = function LayerListRow(_ref) {
11921
12548
  var layer = _ref.layer,
11922
12549
  layerIndex = _ref.layerIndex,
11923
12550
  service = _ref.service,
11924
- serviceUrl = _ref.serviceUrl,
11925
12551
  addLayer = _ref.addLayer,
11926
12552
  deleteLayer = _ref.deleteLayer,
11927
- mapLayers = _ref.mapLayers;
12553
+ mapLayers = _ref.mapLayers,
12554
+ mapId = _ref.mapId;
12555
+
12556
+ var _a, _b, _c;
12557
+
11928
12558
  return /*#__PURE__*/React__default.createElement(Grid, {
11929
12559
  "data-testid": "layerListLayerRow",
11930
12560
  container: true,
@@ -11934,9 +12564,9 @@ var LayerListRow = function LayerListRow(_ref) {
11934
12564
  alignItems: "center",
11935
12565
  sx: {
11936
12566
  backgroundColor: 'geowebColors.cards.cardContainer',
11937
- paddingLeft: '12px',
12567
+ padding: '8px',
11938
12568
  marginBottom: '4px',
11939
- height: '64px',
12569
+ height: '68px',
11940
12570
  border: 'solid 1px',
11941
12571
  borderColor: 'geowebColors.cards.cardContainerBorder'
11942
12572
  }
@@ -11951,8 +12581,8 @@ var LayerListRow = function LayerListRow(_ref) {
11951
12581
  }, /*#__PURE__*/React__default.createElement(Box, {
11952
12582
  sx: {
11953
12583
  fontSize: '12px',
11954
- height: '24px',
11955
- lineHeight: '24px',
12584
+ height: '14px',
12585
+ lineHeight: '14px',
11956
12586
  fontWeight: 500,
11957
12587
  WebkitLineClamp: 1,
11958
12588
  display: '-webkit-box',
@@ -11963,34 +12593,50 @@ var LayerListRow = function LayerListRow(_ref) {
11963
12593
  }, layer.text)), /*#__PURE__*/React__default.createElement(Grid, {
11964
12594
  container: true,
11965
12595
  item: true,
11966
- xs: 4
12596
+ xs: 4,
12597
+ direction: "column"
11967
12598
  }, /*#__PURE__*/React__default.createElement(Box, {
11968
12599
  sx: {
11969
12600
  fontSize: '12px',
11970
- height: '24px',
11971
- lineHeight: '24px',
12601
+ height: '18px',
12602
+ lineHeight: '18px',
11972
12603
  WebkitLineClamp: 1,
11973
12604
  display: '-webkit-box',
11974
12605
  WebkitBoxOrient: 'vertical',
11975
12606
  textOverflow: 'ellipsis',
11976
12607
  overflow: 'hidden'
11977
12608
  }
11978
- }, service.name)), layer["abstract"] ? /*#__PURE__*/React__default.createElement(Grid, {
12609
+ }, service.name), /*#__PURE__*/React__default.createElement(LayerInfoButtonConnect, {
12610
+ layer: layer,
12611
+ mapId: mapId,
12612
+ serviceName: service.name
12613
+ })), layer["abstract"] || ((_a = layer.keywords) === null || _a === void 0 ? void 0 : _a.length) || layer.path.length ? /*#__PURE__*/React__default.createElement(Grid, {
11979
12614
  "data-testid": "layerAbstract",
11980
12615
  container: true,
11981
12616
  item: true,
11982
12617
  xs: 8,
11983
12618
  sx: {
11984
- fontSize: '10px',
11985
- height: '30px',
12619
+ height: '45px',
11986
12620
  paddingLeft: '20px',
11987
12621
  WebkitLineClamp: 2,
11988
12622
  display: '-webkit-box',
11989
- WebkitBoxOrient: 'vertical',
11990
- textOverflow: 'ellipsis',
11991
- overflow: 'hidden'
12623
+ WebkitBoxOrient: 'vertical'
11992
12624
  }
11993
- }, layer["abstract"]) : null), /*#__PURE__*/React__default.createElement(Grid, {
12625
+ }, layer["abstract"] && /*#__PURE__*/React__default.createElement(Typography, {
12626
+ sx: Object.assign(Object.assign({}, layerInfoStyle), {
12627
+ height: 15
12628
+ })
12629
+ }, layer["abstract"]), layer.path.length > 0 && /*#__PURE__*/React__default.createElement(Typography, {
12630
+ sx: Object.assign(Object.assign({}, layerInfoStyle), {
12631
+ height: ((_b = layer.keywords) === null || _b === void 0 ? void 0 : _b.length) ? 15 : 30
12632
+ })
12633
+ }, "Groups: ", layer.path.join(' / ')), ((_c = layer.keywords) === null || _c === void 0 ? void 0 : _c.length) > 0 && /*#__PURE__*/React__default.createElement(Typography, {
12634
+ sx: Object.assign(Object.assign({}, layerInfoStyle), {
12635
+ height: layer.path.length ? 15 : 30
12636
+ })
12637
+ }, "Keywords:", ' ', layer.keywords.slice().sort(function (a, b) {
12638
+ return a.localeCompare(b);
12639
+ }).join(', '))) : null), /*#__PURE__*/React__default.createElement(Grid, {
11994
12640
  container: true,
11995
12641
  item: true,
11996
12642
  xs: 2,
@@ -12000,13 +12646,12 @@ var LayerListRow = function LayerListRow(_ref) {
12000
12646
  sx: {
12001
12647
  width: '80px',
12002
12648
  height: '48px',
12003
- marginRight: '8px',
12004
- paddingTop: '4px'
12649
+ marginRight: '8px'
12005
12650
  }
12006
12651
  }, /*#__PURE__*/React__default.createElement(LayerAddRemoveButton, {
12007
12652
  layer: layer,
12008
12653
  layerIndex: layerIndex,
12009
- serviceUrl: serviceUrl,
12654
+ serviceUrl: service.serviceUrl,
12010
12655
  addLayer: addLayer,
12011
12656
  deleteLayer: deleteLayer,
12012
12657
  mapLayers: mapLayers
@@ -12017,13 +12662,15 @@ var LayerList = function LayerList(_ref) {
12017
12662
  var services = _ref.services,
12018
12663
  serviceIds = _ref.serviceIds,
12019
12664
  layerSelectHeight = _ref.layerSelectHeight,
12665
+ serviceListHeight = _ref.serviceListHeight,
12020
12666
  addLayer = _ref.addLayer,
12021
12667
  deleteLayer = _ref.deleteLayer,
12022
12668
  searchString = _ref.searchString,
12023
12669
  mapLayers = _ref.mapLayers,
12024
- keywordIds = _ref.keywordIds,
12025
- allKeywordsActive = _ref.allKeywordsActive;
12026
- var layerSelectFilterHeight = 199;
12670
+ filterIds = _ref.filterIds,
12671
+ allFiltersActive = _ref.allFiltersActive,
12672
+ mapId = _ref.mapId;
12673
+ var layerSelectFilterHeight = 155 + serviceListHeight;
12027
12674
 
12028
12675
  var _React$useState = React.useState(0),
12029
12676
  _React$useState2 = _slicedToArray(_React$useState, 2),
@@ -12037,16 +12684,16 @@ var LayerList = function LayerList(_ref) {
12037
12684
 
12038
12685
  React.useEffect(function () {
12039
12686
  setNumberOfLayers(serviceIds.reduce(function (totalNumberOfLayers, serviceId) {
12040
- return totalNumberOfLayers + filterLayersFromService(serviceId, services, keywordIds, allKeywordsActive, searchString).length;
12687
+ return totalNumberOfLayers + filterLayersFromService(serviceId, services, filterIds, allFiltersActive, searchString).length;
12041
12688
  }, 0));
12042
12689
  setLayersFilteredFromService(serviceIds.reduce(function (layerList, serviceId) {
12043
- return layerList.concat(filterLayersFromService(serviceId, services, keywordIds, allKeywordsActive, searchString).map(function (layer) {
12690
+ return layerList.concat(filterLayersFromService(serviceId, services, filterIds, allFiltersActive, searchString).map(function (layer) {
12044
12691
  return Object.assign(Object.assign({}, layer), {
12045
12692
  serviceId: serviceId
12046
12693
  });
12047
12694
  }));
12048
12695
  }, []));
12049
- }, [serviceIds, keywordIds, services, searchString, allKeywordsActive]);
12696
+ }, [serviceIds, filterIds, services, searchString, allFiltersActive]);
12050
12697
  return /*#__PURE__*/React.createElement(Box, {
12051
12698
  "data-testid": "layerList"
12052
12699
  }, /*#__PURE__*/React.createElement(Box, {
@@ -12057,21 +12704,21 @@ var LayerList = function LayerList(_ref) {
12057
12704
  }, numberOfLayers, " results"), /*#__PURE__*/React.createElement(FixedSizeList, {
12058
12705
  height: layerSelectHeight - layerSelectFilterHeight,
12059
12706
  itemCount: numberOfLayers,
12060
- itemSize: 68
12707
+ itemSize: 72
12061
12708
  }, function (_ref2) {
12062
12709
  var index = _ref2.index,
12063
12710
  style = _ref2.style;
12064
12711
  return /*#__PURE__*/React.createElement("div", {
12065
12712
  style: style,
12066
12713
  key: layersFilteredFromService[index].name
12067
- }, /*#__PURE__*/React.createElement(LayerListRow, {
12714
+ }, services[layersFilteredFromService[index].serviceId] && /*#__PURE__*/React.createElement(LayerListRow, {
12068
12715
  layer: layersFilteredFromService[index],
12069
12716
  layerIndex: index,
12070
12717
  service: services[layersFilteredFromService[index].serviceId],
12071
- serviceUrl: services[layersFilteredFromService[index].serviceId].serviceUrl,
12072
12718
  addLayer: addLayer,
12073
12719
  deleteLayer: deleteLayer,
12074
- mapLayers: mapLayers
12720
+ mapLayers: mapLayers,
12721
+ mapId: mapId
12075
12722
  }));
12076
12723
  }));
12077
12724
  };
@@ -12089,13 +12736,14 @@ var LayerList = function LayerList(_ref) {
12089
12736
  * See the License for the specific language governing permissions and
12090
12737
  * limitations under the License.
12091
12738
  *
12092
- * Copyright 2021 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
12093
- * Copyright 2021 - Finnish Meteorological Institute (FMI)
12739
+ * Copyright 2022 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
12740
+ * Copyright 2022 - Finnish Meteorological Institute (FMI)
12094
12741
  * */
12095
12742
 
12096
12743
  var LayerListConnect = function LayerListConnect(_ref) {
12097
12744
  var mapId = _ref.mapId,
12098
- layerSelectHeight = _ref.layerSelectHeight;
12745
+ layerSelectHeight = _ref.layerSelectHeight,
12746
+ serviceListHeight = _ref.serviceListHeight;
12099
12747
  var services = useSelector(function (store) {
12100
12748
  return getServices(store);
12101
12749
  });
@@ -12145,11 +12793,11 @@ var LayerListConnect = function LayerListConnect(_ref) {
12145
12793
  origin: LayerActionOrigin.layerManager
12146
12794
  }));
12147
12795
  }, [dispatch, mapId]);
12148
- var checkedKeywordIds = useSelector(function (store) {
12149
- return getCheckedKeywordIds(store);
12796
+ var checkedFilterIds = useSelector(function (store) {
12797
+ return getCheckedFilterIds(store);
12150
12798
  });
12151
- var allKeywordsActive = useSelector(function (store) {
12152
- return isAllKeywordsChecked(store);
12799
+ var allFiltersActive = useSelector(function (store) {
12800
+ return isAllFiltersChecked(store);
12153
12801
  });
12154
12802
  var searchString = useSelector(function (store) {
12155
12803
  return getSearchFilter(store);
@@ -12158,12 +12806,14 @@ var LayerListConnect = function LayerListConnect(_ref) {
12158
12806
  services: services,
12159
12807
  serviceIds: enabledServiceIds,
12160
12808
  layerSelectHeight: layerSelectHeight,
12809
+ serviceListHeight: serviceListHeight,
12161
12810
  addLayer: addLayer,
12162
12811
  deleteLayer: deleteLayer,
12163
- keywordIds: checkedKeywordIds,
12164
- allKeywordsActive: allKeywordsActive,
12812
+ filterIds: checkedFilterIds,
12813
+ allFiltersActive: allFiltersActive,
12165
12814
  searchString: searchString,
12166
- mapLayers: mapLayers
12815
+ mapLayers: mapLayers,
12816
+ mapId: mapId
12167
12817
  });
12168
12818
  };
12169
12819
 
@@ -12180,8 +12830,8 @@ var LayerListConnect = function LayerListConnect(_ref) {
12180
12830
  * See the License for the specific language governing permissions and
12181
12831
  * limitations under the License.
12182
12832
  *
12183
- * Copyright 2021 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
12184
- * Copyright 2021 - Finnish Meteorological Institute (FMI)
12833
+ * Copyright 2022 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
12834
+ * Copyright 2022 - Finnish Meteorological Institute (FMI)
12185
12835
  * */
12186
12836
  var style = {
12187
12837
  borderRadius: '20px!important',
@@ -12190,7 +12840,8 @@ var style = {
12190
12840
  height: '32px!important',
12191
12841
  padding: '5px 12px!important',
12192
12842
  textTransform: 'none!important',
12193
- fontWeight: 'normal'
12843
+ fontWeight: 'normal',
12844
+ marginBottom: '5px'
12194
12845
  };
12195
12846
 
12196
12847
  var ServiceChip = function ServiceChip(_ref) {
@@ -12200,7 +12851,9 @@ var ServiceChip = function ServiceChip(_ref) {
12200
12851
  isSelected = _ref.isSelected,
12201
12852
  isDisabled = _ref.isDisabled,
12202
12853
  toggleChip = _ref.toggleChip;
12203
- return /*#__PURE__*/React.createElement(CustomToggleButton, {
12854
+ return /*#__PURE__*/React.createElement(Tooltip, {
12855
+ title: (service === null || service === void 0 ? void 0 : service["abstract"]) ? "Abstract: ".concat(service["abstract"]) : ''
12856
+ }, /*#__PURE__*/React.createElement(CustomToggleButton, {
12204
12857
  variant: "boxed",
12205
12858
  selected: isSelected,
12206
12859
  tabIndex: 0,
@@ -12213,7 +12866,7 @@ var ServiceChip = function ServiceChip(_ref) {
12213
12866
  },
12214
12867
  disabled: isDisabled,
12215
12868
  sx: style
12216
- }, service ? service.serviceName : 'All');
12869
+ }, service ? service.serviceName : 'All'));
12217
12870
  };
12218
12871
 
12219
12872
  var ServiceChipConnect = function ServiceChipConnect(_ref) {
@@ -12222,56 +12875,79 @@ var ServiceChipConnect = function ServiceChipConnect(_ref) {
12222
12875
  serviceId = _ref.serviceId,
12223
12876
  service = _ref.service,
12224
12877
  isSelected = _ref.isSelected,
12878
+ isAllSelected = _ref.isAllSelected,
12225
12879
  isDisabled = _ref.isDisabled;
12226
12880
  var dispatch = useDispatch();
12227
12881
  var activeServices = useSelector(function (store) {
12228
12882
  return getActiveServices(store);
12229
12883
  });
12230
12884
 
12885
+ var setAllServicesEnabled = function setAllServicesEnabled(allServicesEnabled) {
12886
+ dispatch(layerSelectActions.setAllServicesEnabled({
12887
+ allServicesEnabled: allServicesEnabled
12888
+ }));
12889
+ };
12890
+
12891
+ var hasSelectedStyle = !isAllSelected && isSelected || isAllSelected && service === 'all';
12892
+
12231
12893
  var toggleChip = function toggleChip(service) {
12232
12894
  if (service === 'all') {
12233
12895
  if (isSelected) {
12234
- for (var _i = 0, _Object$entries = Object.entries(activeServices); _i < _Object$entries.length; _i++) {
12235
- var _Object$entries$_i = _slicedToArray(_Object$entries[_i], 2),
12236
- key = _Object$entries$_i[0],
12237
- value = _Object$entries$_i[1];
12238
-
12239
- var serviceID = key;
12240
- var _service = value;
12896
+ setAllServicesEnabled(false);
12897
+ Object.entries(activeServices).forEach(function (_ref2) {
12898
+ var _ref3 = _slicedToArray(_ref2, 2),
12899
+ serviceID = _ref3[0],
12900
+ service = _ref3[1];
12241
12901
 
12242
- if (_service.enabled) {
12902
+ if (service.enabled) {
12243
12903
  dispatch(layerSelectActions.disableActiveService({
12244
12904
  serviceId: serviceID,
12245
- keywords: _service.keywordsPerService
12905
+ filters: service.filterIds
12246
12906
  }));
12247
12907
  }
12248
- }
12908
+ });
12249
12909
  } else {
12250
- for (var _i2 = 0, _Object$entries2 = Object.entries(activeServices); _i2 < _Object$entries2.length; _i2++) {
12251
- var _Object$entries2$_i = _slicedToArray(_Object$entries2[_i2], 2),
12252
- _key = _Object$entries2$_i[0],
12253
- _value = _Object$entries2$_i[1];
12910
+ setAllServicesEnabled(true);
12911
+ Object.entries(activeServices).forEach(function (_ref4) {
12912
+ var _ref5 = _slicedToArray(_ref4, 2),
12913
+ serviceID = _ref5[0],
12914
+ service = _ref5[1];
12254
12915
 
12255
- var _serviceID = _key;
12256
- var _service2 = _value;
12257
-
12258
- if (!_service2.enabled) {
12916
+ if (!service.enabled) {
12259
12917
  dispatch(layerSelectActions.enableActiveService({
12260
- serviceId: _serviceID,
12261
- keywords: _service2.keywordsPerService
12918
+ serviceId: serviceID,
12919
+ filters: service.filterIds
12262
12920
  }));
12263
12921
  }
12264
- }
12922
+ });
12265
12923
  }
12266
12924
  } else if (isSelected) {
12267
- dispatch(layerSelectActions.disableActiveService({
12268
- serviceId: serviceId,
12269
- keywords: activeServices[serviceId].keywordsPerService
12270
- }));
12925
+ if (isAllSelected) {
12926
+ setAllServicesEnabled(false);
12927
+ Object.entries(activeServices).forEach(function (_ref6) {
12928
+ var _ref7 = _slicedToArray(_ref6, 2),
12929
+ serviceID = _ref7[0],
12930
+ service = _ref7[1];
12931
+
12932
+ var shouldDisable = service.enabled && serviceID !== serviceId;
12933
+
12934
+ if (shouldDisable) {
12935
+ dispatch(layerSelectActions.disableActiveService({
12936
+ serviceId: serviceID,
12937
+ filters: service.filterIds
12938
+ }));
12939
+ }
12940
+ });
12941
+ } else {
12942
+ dispatch(layerSelectActions.disableActiveService({
12943
+ serviceId: serviceId,
12944
+ filters: activeServices[serviceId].filterIds
12945
+ }));
12946
+ }
12271
12947
  } else {
12272
12948
  dispatch(layerSelectActions.enableActiveService({
12273
12949
  serviceId: serviceId,
12274
- keywords: activeServices[serviceId].keywordsPerService
12950
+ filters: activeServices[serviceId].filterIds
12275
12951
  }));
12276
12952
  }
12277
12953
  };
@@ -12280,123 +12956,49 @@ var ServiceChipConnect = function ServiceChipConnect(_ref) {
12280
12956
  service: service,
12281
12957
  all: all,
12282
12958
  toggleChip: toggleChip,
12283
- isSelected: isSelected,
12959
+ isSelected: hasSelectedStyle,
12284
12960
  isDisabled: isDisabled
12285
12961
  });
12286
12962
  };
12287
12963
 
12288
12964
  var ServiceList = function ServiceList(_ref) {
12289
- var layerSelectWidth = _ref.layerSelectWidth,
12290
- activeServices = _ref.activeServices;
12965
+ var activeServices = _ref.activeServices,
12966
+ setHeight = _ref.setHeight;
12967
+ var ref = React.useRef(null);
12291
12968
 
12292
12969
  var _React$useState = React.useState(0),
12293
12970
  _React$useState2 = _slicedToArray(_React$useState, 2),
12294
- margin = _React$useState2[0],
12295
- setMargin = _React$useState2[1];
12296
-
12297
- var _React$useState3 = React.useState(0),
12298
- _React$useState4 = _slicedToArray(_React$useState3, 2),
12299
- width = _React$useState4[0],
12300
- setWidth = _React$useState4[1];
12301
-
12302
- var _React$useState5 = React.useState(null),
12303
- _React$useState6 = _slicedToArray(_React$useState5, 2),
12304
- intervalId = _React$useState6[0],
12305
- setIntervalId = _React$useState6[1];
12306
-
12307
- var ref = React.useRef(null);
12308
- var scrollSpeed = 5;
12309
- var maxWidthValue = ref && ref.current && ref.current.scrollWidth && ref.current.scrollWidth >= layerSelectWidth - margin && ref.current.scrollWidth || layerSelectWidth - 50;
12310
-
12311
- var onMouseWheelScroll = function onMouseWheelScroll(e) {
12312
- var delta = e.deltaY;
12313
- var scrollSpeed = 0.1;
12314
- if (delta > 0) setMargin(Math.min(Math.max(margin + scrollSpeed * delta, 0), width - layerSelectWidth));else setMargin(Math.min(Math.max(margin + scrollSpeed * delta, 0), width - layerSelectWidth));
12315
- };
12316
-
12317
- var onLeftChevronPressed = function onLeftChevronPressed() {
12318
- setMargin(function (prevMargin) {
12319
- return Math.max(prevMargin - scrollSpeed, 0);
12320
- });
12321
- setIntervalId(setInterval(function () {
12322
- setMargin(function (prevMargin) {
12323
- return Math.max(prevMargin - scrollSpeed, 0);
12324
- });
12325
- }, 20));
12326
- };
12327
-
12328
- var onRightChevronPressed = React.useCallback(function () {
12329
- setMargin(function (prevMargin) {
12330
- return Math.min(prevMargin + scrollSpeed, width - layerSelectWidth);
12331
- });
12332
- setIntervalId(setInterval(function () {
12333
- setMargin(function (prevMargin) {
12334
- return Math.min(prevMargin + scrollSpeed, width - layerSelectWidth);
12335
- });
12336
- }, 20));
12337
- }, [width, layerSelectWidth]);
12338
-
12339
- var onChevronMouseUp = function onChevronMouseUp() {
12340
- clearInterval(intervalId);
12341
- setIntervalId(null);
12342
- };
12971
+ serviceListHeight = _React$useState2[0],
12972
+ setServiceListHeight = _React$useState2[1];
12343
12973
 
12974
+ var clientHeight = ref && ref.current && ref.current.clientHeight && ref.current.clientHeight;
12344
12975
  React.useEffect(function () {
12345
- setWidth(ref.current.scrollWidth + 50);
12346
- setMargin(Math.max(0, Math.min(width - layerSelectWidth, margin)));
12347
-
12348
- if ((margin === 0 || layerSelectWidth + margin === width) && intervalId != null) {
12349
- clearInterval(intervalId);
12350
- setIntervalId(null);
12976
+ if (ref && ref.current && ref.current.clientHeight) {
12977
+ setServiceListHeight(ref.current.clientHeight);
12351
12978
  }
12352
- }, [activeServices, layerSelectWidth, width, margin, intervalId]);
12979
+ }, [activeServices, clientHeight]);
12980
+ React.useEffect(function () {
12981
+ setHeight(serviceListHeight);
12982
+ }, [serviceListHeight, setHeight]);
12353
12983
  var isAllSelected = Object.values(activeServices).every(function (activeService) {
12354
12984
  return activeService.enabled;
12355
12985
  });
12356
12986
  return /*#__PURE__*/React.createElement(Box, {
12357
12987
  sx: {
12358
- height: '32px',
12359
12988
  marginTop: '8px',
12360
12989
  width: '100%',
12361
12990
  overflow: 'hidden'
12362
12991
  },
12363
- "data-testid": "serviceList",
12364
- onWheel: onMouseWheelScroll
12365
- }, margin !== 0 && /*#__PURE__*/React.createElement(ChevronLeft, {
12366
- onMouseDown: onLeftChevronPressed,
12367
- onMouseUp: onChevronMouseUp,
12368
- "data-testid": "leftScrollArrow",
12369
- // eslint-disable-next-line @typescript-eslint/explicit-function-return-type
12370
- sx: function sx(theme) {
12371
- return {
12372
- width: '100px',
12373
- marginBottom: '-12px',
12374
- height: '34px',
12375
- backgroundImage: "linear-gradient(to left, rgba(0, 0, 0, 0), ".concat(theme.palette.geowebColors.background.surfaceApp, " 51%)"),
12376
- cursor: 'pointer',
12377
- marginRight: '-120px',
12378
- paddingTop: '6px',
12379
- paddingBottom: '6px',
12380
- "float": 'left',
12381
- zIndex: 1,
12382
- position: 'relative',
12383
- color: 'geowebColors.buttons.tertiary.default.color',
12384
- '&:hover': {
12385
- color: 'geowebColors.buttons.tertiary.activeMouseOver.color'
12386
- }
12387
- };
12388
- }
12389
- }), /*#__PURE__*/React.createElement(Box, {
12992
+ "data-testid": "serviceList"
12993
+ }, /*#__PURE__*/React.createElement(Box, {
12390
12994
  sx: {
12391
12995
  width: '100%',
12392
- display: 'inline-flex',
12996
+ display: 'block',
12393
12997
  alignItems: 'center',
12394
- overflowX: 'visible',
12395
12998
  "float": 'left',
12396
12999
  paddingLeft: '40px',
12397
- marginRight: "".concat(margin, "px"),
12398
- marginLeft: "".concat(-margin, "px"),
12399
- maxWidth: maxWidthValue,
13000
+ paddingRight: '30px',
13001
+ marginBottom: '5px',
12400
13002
  fontSize: '0.875rem'
12401
13003
  },
12402
13004
  ref: ref
@@ -12413,32 +13015,39 @@ var ServiceList = function ServiceList(_ref) {
12413
13015
  serviceId: serviceId,
12414
13016
  service: service,
12415
13017
  isSelected: (_a = activeServices[serviceId]) === null || _a === void 0 ? void 0 : _a.enabled,
13018
+ isAllSelected: isAllSelected,
12416
13019
  isDisabled: activeServices[serviceId] === undefined
12417
13020
  });
12418
- })), layerSelectWidth + margin < width && /*#__PURE__*/React.createElement(ChevronRight // eslint-disable-next-line @typescript-eslint/explicit-function-return-type
12419
- , {
12420
- // eslint-disable-next-line @typescript-eslint/explicit-function-return-type
12421
- sx: function sx(theme) {
12422
- return {
12423
- width: '100px',
12424
- marginBottom: '-12px',
12425
- height: '34px',
12426
- paddingTop: '6px',
12427
- paddingBottom: '6px',
12428
- backgroundImage: "linear-gradient(to right, rgba(0, 0, 0, 0), ".concat(theme.palette.geowebColors.background.surfaceApp, " 51%)"),
12429
- right: '0px',
12430
- position: 'fixed',
12431
- cursor: 'pointer',
12432
- color: 'geowebColors.buttons.tertiary.default.color',
12433
- '&:hover': {
12434
- color: 'geowebColors.buttons.tertiary.activeMouseOver.color'
12435
- }
12436
- };
12437
- },
12438
- onMouseDown: onRightChevronPressed,
12439
- onMouseUp: onChevronMouseUp,
12440
- "data-testid": "rightScrollArrow"
12441
- }));
13021
+ })));
13022
+ };
13023
+
13024
+ var sortByService = function sortByService(serviceObj) {
13025
+ return Object.entries(serviceObj).sort(function (_ref, _ref2) {
13026
+ var _ref3 = _slicedToArray(_ref, 2),
13027
+ a = _ref3[1];
13028
+
13029
+ var _ref4 = _slicedToArray(_ref2, 2),
13030
+ b = _ref4[1];
13031
+
13032
+ return a.serviceName.localeCompare(b.serviceName);
13033
+ }).reduce(function (r, _ref5) {
13034
+ var _ref6 = _slicedToArray(_ref5, 2),
13035
+ key = _ref6[0],
13036
+ value = _ref6[1];
13037
+
13038
+ return Object.assign(Object.assign({}, r), _defineProperty({}, key, value));
13039
+ }, {});
13040
+ };
13041
+
13042
+ var ServiceListConnect = function ServiceListConnect(_ref7) {
13043
+ var setHeight = _ref7.setHeight;
13044
+ var activeServices = useSelector(function (store) {
13045
+ return getActiveServices(store);
13046
+ });
13047
+ return /*#__PURE__*/React.createElement(ServiceList, {
13048
+ setHeight: setHeight,
13049
+ activeServices: sortByService(activeServices)
13050
+ });
12442
13051
  };
12443
13052
 
12444
13053
  /* *
@@ -12454,21 +13063,9 @@ var ServiceList = function ServiceList(_ref) {
12454
13063
  * See the License for the specific language governing permissions and
12455
13064
  * limitations under the License.
12456
13065
  *
12457
- * Copyright 2021 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
12458
- * Copyright 2021 - Finnish Meteorological Institute (FMI)
13066
+ * Copyright 2022 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
13067
+ * Copyright 2022 - Finnish Meteorological Institute (FMI)
12459
13068
  * */
12460
-
12461
- var ServiceListConnect = function ServiceListConnect(_ref) {
12462
- var layerSelectWidth = _ref.layerSelectWidth;
12463
- var activeServices = useSelector(function (store) {
12464
- return getActiveServices(store);
12465
- });
12466
- return /*#__PURE__*/React.createElement(ServiceList, {
12467
- layerSelectWidth: layerSelectWidth,
12468
- activeServices: activeServices
12469
- });
12470
- };
12471
-
12472
13069
  var styles$1 = {
12473
13070
  servicesContainer: {
12474
13071
  width: '300px',
@@ -12505,45 +13102,62 @@ var styles$1 = {
12505
13102
 
12506
13103
  var ServiceOptionsDialog = function ServiceOptionsDialog(_ref) {
12507
13104
  var services = _ref.services,
12508
- mapStoreRemoveService = _ref.mapStoreRemoveService;
12509
-
12510
- var _React$useState = React.useState(false),
12511
- _React$useState2 = _slicedToArray(_React$useState, 2),
12512
- addServiceIsOpen = _React$useState2[0],
12513
- setAddServiceIsOpen = _React$useState2[1];
12514
-
12515
- var _React$useState3 = React.useState({
12516
- isOpen: false,
12517
- serviceId: '',
12518
- serviceUrl: ''
12519
- }),
12520
- _React$useState4 = _slicedToArray(_React$useState3, 2),
12521
- editServiceIsOpen = _React$useState4[0],
12522
- setEditServiceIsOpen = _React$useState4[1];
13105
+ layerSelectRemoveService = _ref.layerSelectRemoveService,
13106
+ selectedLayers = _ref.selectedLayers,
13107
+ setServicePopupInfo = _ref.setServicePopupInfo;
12523
13108
 
12524
13109
  var openAddService = function openAddService() {
12525
- setAddServiceIsOpen(true);
12526
- };
12527
-
12528
- var closePopup = function closePopup() {
12529
- setAddServiceIsOpen(false);
12530
- setEditServiceIsOpen({
12531
- isOpen: false,
12532
- serviceId: '',
12533
- serviceUrl: ''
13110
+ setServicePopupInfo({
13111
+ isOpen: true,
13112
+ popupVariant: 'add'
12534
13113
  });
12535
13114
  };
12536
13115
 
12537
- return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Box, {
13116
+ return /*#__PURE__*/React.createElement(Box, {
12538
13117
  sx: styles$1.servicesContainer,
12539
13118
  "data-testid": "ServiceDialog"
12540
13119
  }, /*#__PURE__*/React.createElement(Box, {
12541
13120
  sx: styles$1.header
12542
- }, "Services"), /*#__PURE__*/React.createElement(List, {
13121
+ }, "Services"), /*#__PURE__*/React.createElement(Rows, {
13122
+ services: services,
13123
+ layerSelectRemoveService: layerSelectRemoveService,
13124
+ setServicePopupInfo: setServicePopupInfo,
13125
+ selectedLayers: selectedLayers
13126
+ }), /*#__PURE__*/React.createElement(Box, {
13127
+ sx: styles$1.footer
13128
+ }, /*#__PURE__*/React.createElement(Button, {
13129
+ onClick: openAddService,
13130
+ "data-testid": "openAddServiceButton",
13131
+ sx: styles$1.button,
13132
+ variant: "tertiary",
13133
+ startIcon: /*#__PURE__*/React.createElement(Add, null)
13134
+ }, "Add a new service")));
13135
+ };
13136
+
13137
+ var Rows = function Rows(_ref2) {
13138
+ var services = _ref2.services,
13139
+ layerSelectRemoveService = _ref2.layerSelectRemoveService,
13140
+ setServicePopupInfo = _ref2.setServicePopupInfo,
13141
+ selectedLayers = _ref2.selectedLayers;
13142
+
13143
+ var checkIfServiceHasActiveLayers = function checkIfServiceHasActiveLayers(serviceUrl) {
13144
+ var foundService = selectedLayers.find(function (object) {
13145
+ return object.service === serviceUrl;
13146
+ });
13147
+ if (foundService) return true;
13148
+ return false;
13149
+ };
13150
+
13151
+ return /*#__PURE__*/React.createElement(List, {
12543
13152
  disablePadding: true
12544
13153
  }, Object.keys(services).map(function (serviceId) {
13154
+ var _services$serviceId = services[serviceId],
13155
+ serviceUrl = _services$serviceId.serviceUrl,
13156
+ serviceName = _services$serviceId.serviceName,
13157
+ isUserAddedService = _services$serviceId.isUserAddedService;
13158
+ var serviceHasActiveLayers = checkIfServiceHasActiveLayers(serviceUrl);
12545
13159
  return /*#__PURE__*/React.createElement(ListItem, {
12546
- key: services[serviceId].serviceUrl
13160
+ key: serviceUrl
12547
13161
  }, /*#__PURE__*/React.createElement(ListItemText, {
12548
13162
  style: {
12549
13163
  fontSize: '16px'
@@ -12554,53 +13168,59 @@ var ServiceOptionsDialog = function ServiceOptionsDialog(_ref) {
12554
13168
  textOverflow: 'ellipsis',
12555
13169
  paddingRight: '60px'
12556
13170
  }
12557
- }, services[serviceId].serviceName)), /*#__PURE__*/React.createElement(ListItemSecondaryAction, {
13171
+ }, serviceName)), /*#__PURE__*/React.createElement(ListItemSecondaryAction, {
12558
13172
  style: {
12559
- marginRight: '-10px'
12560
- }
12561
- }, /*#__PURE__*/React.createElement(Tooltip, {
12562
- title: "Edit Service",
12563
- disableHoverListener: !services[serviceId].isUserAddedService
13173
+ marginRight: '-10px',
13174
+ width: 90
13175
+ }
13176
+ }, /*#__PURE__*/React.createElement(Grid, {
13177
+ container: true
13178
+ }, /*#__PURE__*/React.createElement(Grid, {
13179
+ item: true,
13180
+ xs: 6
13181
+ }, isUserAddedService ? /*#__PURE__*/React.createElement(Tooltip, {
13182
+ title: "Edit Service"
12564
13183
  }, /*#__PURE__*/React.createElement("span", null, /*#__PURE__*/React.createElement(IconButton, {
12565
- disabled: !services[serviceId].isUserAddedService,
13184
+ "aria-label": "edit service",
12566
13185
  "data-testid": "openEditServiceButton",
12567
13186
  size: "large",
12568
13187
  onClick: function onClick() {
12569
- setEditServiceIsOpen({
13188
+ setServicePopupInfo({
12570
13189
  isOpen: true,
12571
13190
  serviceId: serviceId,
12572
- serviceUrl: services[serviceId].serviceUrl
13191
+ serviceUrl: serviceUrl,
13192
+ popupVariant: 'edit'
12573
13193
  });
12574
13194
  }
12575
- }, /*#__PURE__*/React.createElement(Edit, null)))), /*#__PURE__*/React.createElement(Tooltip, {
12576
- title: "Delete Service",
12577
- disableHoverListener: !services[serviceId].isUserAddedService
13195
+ }, /*#__PURE__*/React.createElement(Edit, null)))) : /*#__PURE__*/React.createElement(Tooltip, {
13196
+ title: "Show Service"
12578
13197
  }, /*#__PURE__*/React.createElement("span", null, /*#__PURE__*/React.createElement(IconButton, {
13198
+ "aria-label": "show service",
13199
+ "data-testid": "openShowServiceButton",
12579
13200
  size: "large",
12580
- disabled: !services[serviceId].isUserAddedService,
12581
13201
  onClick: function onClick() {
12582
- return mapStoreRemoveService(serviceId, services[serviceId].serviceUrl);
12583
- },
12584
- "data-testid": "removeServiceButton"
12585
- }, /*#__PURE__*/React.createElement(Delete, null))))));
12586
- })), /*#__PURE__*/React.createElement(Box, {
12587
- sx: styles$1.footer
12588
- }, /*#__PURE__*/React.createElement(Button, {
12589
- onClick: openAddService,
12590
- "data-testid": "openAddServiceButton",
12591
- sx: styles$1.button,
12592
- variant: "tertiary",
12593
- startIcon: /*#__PURE__*/React.createElement(Add, null)
12594
- }, "Add a new service"))), addServiceIsOpen && /*#__PURE__*/React.createElement(ServicePopupConnect, {
12595
- servicePopupVariant: "add",
12596
- isOpen: addServiceIsOpen,
12597
- closePopup: closePopup
12598
- }), editServiceIsOpen && /*#__PURE__*/React.createElement(ServicePopupConnect, {
12599
- servicePopupVariant: "edit",
12600
- isOpen: editServiceIsOpen.isOpen,
12601
- closePopup: closePopup,
12602
- serviceId: editServiceIsOpen.serviceId,
12603
- url: editServiceIsOpen.serviceUrl
13202
+ setServicePopupInfo({
13203
+ isOpen: true,
13204
+ serviceId: serviceId,
13205
+ serviceUrl: serviceUrl,
13206
+ popupVariant: 'show'
13207
+ });
13208
+ }
13209
+ }, /*#__PURE__*/React.createElement(Visibility, null))))), /*#__PURE__*/React.createElement(Grid, {
13210
+ item: true,
13211
+ xs: 6
13212
+ }, isUserAddedService && /*#__PURE__*/React.createElement(Box, null, /*#__PURE__*/React.createElement(Tooltip, {
13213
+ title: serviceHasActiveLayers ? 'Service has active layers. Cannot remove this service' : 'Delete Service',
13214
+ "data-testid": "removeServiceTooltip"
13215
+ }, /*#__PURE__*/React.createElement("span", null, /*#__PURE__*/React.createElement(IconButton, {
13216
+ "data-testid": "removeServiceButton",
13217
+ "aria-label": "delete service",
13218
+ size: "large",
13219
+ disabled: serviceHasActiveLayers,
13220
+ onClick: function onClick() {
13221
+ return layerSelectRemoveService(serviceId, serviceUrl);
13222
+ }
13223
+ }, /*#__PURE__*/React.createElement(Delete, null)))))))));
12604
13224
  }));
12605
13225
  };
12606
13226
 
@@ -12621,45 +13241,59 @@ var ServiceOptionsDialog = function ServiceOptionsDialog(_ref) {
12621
13241
  * Copyright 2022 - Finnish Meteorological Institute (FMI)
12622
13242
  * */
12623
13243
 
12624
- var ServiceOptionsDialogConnect = function ServiceOptionsDialogConnect() {
13244
+ var ServiceOptionsDialogConnect = function ServiceOptionsDialogConnect(_ref) {
13245
+ var mapId = _ref.mapId,
13246
+ setServicePopupInfo = _ref.setServicePopupInfo;
12625
13247
  var dispatch = useDispatch();
12626
- var mapStoreRemoveService = React.useCallback(function (serviceId, serviceUrl) {
12627
- dispatch(serviceActions.mapStoreRemoveService({
12628
- id: serviceId,
13248
+ var layerSelectRemoveService = React.useCallback(function (serviceId, serviceUrl) {
13249
+ dispatch(layerSelectActions.layerSelectRemoveService({
13250
+ serviceId: serviceId,
12629
13251
  serviceUrl: serviceUrl
12630
13252
  }));
12631
13253
  }, [dispatch]);
12632
13254
  var services = useSelector(function (store) {
12633
13255
  return getActiveServices(store);
12634
13256
  });
13257
+ var selectedLayers = useSelector(function (store) {
13258
+ return getMapLayers(store, mapId);
13259
+ });
12635
13260
  return /*#__PURE__*/React.createElement(ServiceOptionsDialog, {
13261
+ selectedLayers: selectedLayers,
12636
13262
  services: services,
12637
- mapStoreRemoveService: mapStoreRemoveService
13263
+ layerSelectRemoveService: layerSelectRemoveService,
13264
+ setServicePopupInfo: setServicePopupInfo
12638
13265
  });
12639
13266
  };
12640
13267
 
12641
- /* *
12642
- * Licensed under the Apache License, Version 2.0 (the "License");
12643
- * you may not use this file except in compliance with the License.
12644
- * You may obtain a copy of the License at
12645
- *
12646
- * http://www.apache.org/licenses/LICENSE-2.0
12647
- *
12648
- * Unless required by applicable law or agreed to in writing, software
12649
- * distributed under the License is distributed on an "AS IS" BASIS,
12650
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12651
- * See the License for the specific language governing permissions and
12652
- * limitations under the License.
12653
- *
12654
- * Copyright 2021 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
12655
- * Copyright 2021 - Finnish Meteorological Institute (FMI)
12656
- * */
13268
+ var ServiceOptionsButton = function ServiceOptionsButton(_ref) {
13269
+ var mapId = _ref.mapId;
12657
13270
 
12658
- var ServiceOptionsButton = function ServiceOptionsButton() {
12659
- return /*#__PURE__*/React.createElement(ToggleMenu, {
13271
+ var _React$useState = React.useState({
13272
+ isOpen: false
13273
+ }),
13274
+ _React$useState2 = _slicedToArray(_React$useState, 2),
13275
+ servicePopupInfo = _React$useState2[0],
13276
+ setServicePopupInfo = _React$useState2[1];
13277
+
13278
+ var closePopup = function closePopup() {
13279
+ setServicePopupInfo({
13280
+ isOpen: false
13281
+ });
13282
+ };
13283
+
13284
+ return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(ToggleMenu, {
12660
13285
  buttonTestId: "serviceOptionsButton",
12661
13286
  menuPosition: "bottom"
12662
- }, /*#__PURE__*/React.createElement(ServiceOptionsDialogConnect, null));
13287
+ }, /*#__PURE__*/React.createElement(ServiceOptionsDialogConnect, {
13288
+ setServicePopupInfo: setServicePopupInfo,
13289
+ mapId: mapId
13290
+ })), /*#__PURE__*/React.createElement(ServicePopupConnect, {
13291
+ servicePopupVariant: servicePopupInfo.popupVariant,
13292
+ isOpen: servicePopupInfo.isOpen,
13293
+ closePopup: closePopup,
13294
+ serviceId: servicePopupInfo.serviceId,
13295
+ url: servicePopupInfo.serviceUrl
13296
+ }));
12663
13297
  };
12664
13298
 
12665
13299
  var LayerSelect = function LayerSelect(_ref) {
@@ -12675,6 +13309,7 @@ var LayerSelect = function LayerSelect(_ref) {
12675
13309
  order = _ref$order === void 0 ? 0 : _ref$order,
12676
13310
  _ref$source = _ref.source,
12677
13311
  source = _ref$source === void 0 ? 'module' : _ref$source;
13312
+ var initialServiceListHeight = 37;
12678
13313
 
12679
13314
  var _React$useState = React.useState(500),
12680
13315
  _React$useState2 = _slicedToArray(_React$useState, 2),
@@ -12686,6 +13321,11 @@ var LayerSelect = function LayerSelect(_ref) {
12686
13321
  width = _React$useState4[0],
12687
13322
  setWidth = _React$useState4[1];
12688
13323
 
13324
+ var _React$useState5 = React.useState(initialServiceListHeight),
13325
+ _React$useState6 = _slicedToArray(_React$useState5, 2),
13326
+ serviceListHeight = _React$useState6[0],
13327
+ setServiceListHeight = _React$useState6[1];
13328
+
12689
13329
  var onChangeSize = function onChangeSize(_ref2) {
12690
13330
  var height = _ref2.height,
12691
13331
  width = _ref2.width;
@@ -12693,6 +13333,12 @@ var LayerSelect = function LayerSelect(_ref) {
12693
13333
  setWidth(width);
12694
13334
  };
12695
13335
 
13336
+ var handleHeightChange = function handleHeightChange(height) {
13337
+ if (height > initialServiceListHeight) {
13338
+ setServiceListHeight(height);
13339
+ }
13340
+ };
13341
+
12696
13342
  return /*#__PURE__*/React.createElement(ToolContainerDraggable, {
12697
13343
  title: showTitle ? "Layer Select ".concat(mapId) : 'Layer Select',
12698
13344
  startSize: {
@@ -12733,52 +13379,156 @@ var LayerSelect = function LayerSelect(_ref) {
12733
13379
  margin: '12px 0 0 calc(100% - 36px)',
12734
13380
  zIndex: 2
12735
13381
  }
12736
- }, /*#__PURE__*/React.createElement(ServiceOptionsButton, null)), /*#__PURE__*/React.createElement(Box, {
12737
- sx: {
12738
- height: '48px'
12739
- }
12740
- }, /*#__PURE__*/React.createElement(ServiceListConnect, {
12741
- layerSelectWidth: width
13382
+ }, /*#__PURE__*/React.createElement(ServiceOptionsButton, {
13383
+ mapId: mapId
13384
+ })), /*#__PURE__*/React.createElement(Box, null, /*#__PURE__*/React.createElement(ServiceListConnect, {
13385
+ setHeight: handleHeightChange
12742
13386
  })), /*#__PURE__*/React.createElement(Box, {
12743
13387
  sx: {
12744
13388
  padding: '0 8px'
12745
13389
  }
12746
13390
  }, /*#__PURE__*/React.createElement(LayerListConnect, {
12747
13391
  mapId: mapId,
12748
- layerSelectHeight: height
13392
+ layerSelectHeight: height,
13393
+ serviceListHeight: serviceListHeight
12749
13394
  })));
12750
13395
  };
12751
13396
 
13397
+ /* *
13398
+ * Licensed under the Apache License, Version 2.0 (the "License");
13399
+ * you may not use this file except in compliance with the License.
13400
+ * You may obtain a copy of the License at
13401
+ *
13402
+ * http://www.apache.org/licenses/LICENSE-2.0
13403
+ *
13404
+ * Unless required by applicable law or agreed to in writing, software
13405
+ * distributed under the License is distributed on an "AS IS" BASIS,
13406
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13407
+ * See the License for the specific language governing permissions and
13408
+ * limitations under the License.
13409
+ *
13410
+ * Copyright 2022 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
13411
+ * Copyright 2022 - Finnish Meteorological Institute (FMI)
13412
+ * */
13413
+ var useSetupDialog = function useSetupDialog(dialogType) {
13414
+ var dispatch = useDispatch();
13415
+ var onCloseDialog = useCallback(function () {
13416
+ dispatch(uiActions.setToggleOpenDialog({
13417
+ type: dialogType,
13418
+ setOpen: false
13419
+ }));
13420
+ }, [dialogType, dispatch]);
13421
+ var mapId = useSelector(function (store) {
13422
+ return getDialogMapId(store, dialogType);
13423
+ });
13424
+ var isMapPresent = useSelector(function (store) {
13425
+ return getIsMapPresent(store, mapId);
13426
+ }); // Check to ensure the currently active map is still present on screen - if not, close the dialog
13427
+
13428
+ useEffect(function () {
13429
+ if (mapId !== '' && !isMapPresent) {
13430
+ onCloseDialog();
13431
+ }
13432
+ }, [mapId, isMapPresent, onCloseDialog]);
13433
+ var registerDialog = useCallback(function () {
13434
+ dispatch(uiActions.registerDialog({
13435
+ type: dialogType,
13436
+ setOpen: false
13437
+ }));
13438
+ }, [dialogType, dispatch]);
13439
+ var unregisterDialog = useCallback(function () {
13440
+ dispatch(uiActions.unregisterDialog({
13441
+ type: dialogType
13442
+ }));
13443
+ }, [dialogType, dispatch]); // Register this dialog in the store
13444
+
13445
+ useEffect(function () {
13446
+ registerDialog();
13447
+ return function () {
13448
+ unregisterDialog();
13449
+ }; // eslint-disable-next-line react-hooks/exhaustive-deps
13450
+ }, []);
13451
+ var uiIsOrderedOnTop = useSelector(function (store) {
13452
+ return getDialogIsOrderedOnTop(store, dialogType);
13453
+ });
13454
+ var setDialogOrder = useCallback(function () {
13455
+ if (!uiIsOrderedOnTop) {
13456
+ dispatch(uiActions.orderDialog({
13457
+ type: dialogType
13458
+ }));
13459
+ }
13460
+ }, [dialogType, dispatch, uiIsOrderedOnTop]);
13461
+ var dialogOrder = useSelector(function (store) {
13462
+ return getDialogOrder(store, dialogType);
13463
+ });
13464
+ var uiSource = useSelector(function (store) {
13465
+ return getDialogSource(store, dialogType);
13466
+ });
13467
+ var isDialogOpen = useSelector(function (store) {
13468
+ return getisDialogOpen(store, dialogType);
13469
+ });
13470
+ return {
13471
+ setDialogOrder: setDialogOrder,
13472
+ dialogOrder: dialogOrder,
13473
+ onCloseDialog: onCloseDialog,
13474
+ uiSource: uiSource,
13475
+ isDialogOpen: isDialogOpen
13476
+ };
13477
+ };
13478
+
12752
13479
  var FilterListItem = function FilterListItem(_ref) {
12753
- var keyword = _ref.keyword,
12754
- toggleKeywords = _ref.toggleKeywords,
12755
- enableOnlyOneKeyword = _ref.enableOnlyOneKeyword;
13480
+ var filter = _ref.filter,
13481
+ toggleFilter = _ref.toggleFilter,
13482
+ enableOnlyOneFilter = _ref.enableOnlyOneFilter;
12756
13483
 
12757
13484
  var _React$useState = React.useState(false),
12758
13485
  _React$useState2 = _slicedToArray(_React$useState, 2),
12759
- hovering = _React$useState2[0],
12760
- setHovering = _React$useState2[1];
13486
+ isHovering = _React$useState2[0],
13487
+ setIsHovering = _React$useState2[1];
12761
13488
 
12762
- var handleMouseOver = React.useCallback(function () {
12763
- setHovering(true);
13489
+ var handleMouseEnter = React.useCallback(function () {
13490
+ setIsHovering(true);
12764
13491
  }, []);
12765
13492
  var handleMouseLeave = React.useCallback(function () {
12766
- setHovering(false);
13493
+ setIsHovering(false);
12767
13494
  }, []);
12768
13495
 
12769
- var selectOnlyOne = function selectOnlyOne(keyword) {
12770
- enableOnlyOneKeyword(keyword);
13496
+ var selectOnlyOne = function selectOnlyOne(filterId) {
13497
+ enableOnlyOneFilter(filterId);
12771
13498
  };
12772
13499
 
12773
- var toggleCheckbox = function toggleCheckbox(keyword) {
12774
- toggleKeywords([keyword]);
13500
+ var toggleCheckbox = function toggleCheckbox(filterId) {
13501
+ toggleFilter([filterId]);
13502
+ };
13503
+
13504
+ var mouseMoveRef = React.useRef(null);
13505
+ React.useEffect(function () {
13506
+ window.addEventListener('mousemove', checkHover, true);
13507
+ return function () {
13508
+ window.removeEventListener('mousemove', checkHover, true);
13509
+ };
13510
+ });
13511
+
13512
+ var checkHover = function checkHover(e) {
13513
+ if (mouseMoveRef.current) {
13514
+ var mouseOver = mouseMoveRef.current.contains(e.target);
13515
+
13516
+ if (!isHovering && mouseOver) {
13517
+ handleMouseEnter();
13518
+ }
13519
+
13520
+ if (isHovering && !mouseOver) {
13521
+ handleMouseLeave();
13522
+ }
13523
+ }
12775
13524
  };
12776
13525
 
12777
- if (keyword.amountVisible !== 0) {
13526
+ if (filter.amountVisible !== 0) {
12778
13527
  return /*#__PURE__*/React.createElement("div", {
12779
- onMouseOver: handleMouseOver,
13528
+ ref: mouseMoveRef,
13529
+ onMouseEnter: handleMouseEnter,
12780
13530
  onMouseLeave: handleMouseLeave,
12781
- onFocus: handleMouseOver,
13531
+ onFocus: handleMouseEnter,
12782
13532
  onBlur: handleMouseLeave,
12783
13533
  "data-testid": "filterResultListItem"
12784
13534
  }, /*#__PURE__*/React.createElement(ListItem, {
@@ -12796,9 +13546,9 @@ var FilterListItem = function FilterListItem(_ref) {
12796
13546
  }
12797
13547
  }, /*#__PURE__*/React.createElement(Checkbox, {
12798
13548
  color: "secondary",
12799
- checked: keyword.checked,
13549
+ checked: filter.checked,
12800
13550
  onChange: function onChange() {
12801
- return toggleCheckbox(keyword.id);
13551
+ return toggleCheckbox(filter.id);
12802
13552
  },
12803
13553
  sx: {
12804
13554
  paddingTop: '6px',
@@ -12814,14 +13564,14 @@ var FilterListItem = function FilterListItem(_ref) {
12814
13564
  whiteSpace: 'nowrap',
12815
13565
  overflow: 'hidden'
12816
13566
  }
12817
- }, keyword.id), hovering ? /*#__PURE__*/React.createElement(ListItemSecondaryAction, null, /*#__PURE__*/React.createElement(IconButton, {
13567
+ }, filter.name, " (", filter.amountVisible, ")"), isHovering ? /*#__PURE__*/React.createElement(ListItemSecondaryAction, null, /*#__PURE__*/React.createElement(IconButton, {
12818
13568
  style: {
12819
13569
  backgroundColor: 'transparent'
12820
13570
  },
12821
13571
  edge: "end",
12822
13572
  size: "small",
12823
13573
  onClick: function onClick() {
12824
- return selectOnlyOne(keyword.id);
13574
+ return selectOnlyOne(filter.id);
12825
13575
  },
12826
13576
  "data-testid": "onlyButton"
12827
13577
  }, /*#__PURE__*/React.createElement(Typography, {
@@ -12854,25 +13604,22 @@ var FilterListItem = function FilterListItem(_ref) {
12854
13604
  * */
12855
13605
 
12856
13606
  var KeywordFilterResultsListItemConnect = function KeywordFilterResultsListItemConnect(_ref) {
12857
- var keyword = _ref.keyword;
13607
+ var filter = _ref.filter;
12858
13608
  var dispatch = useDispatch();
12859
- var toggleKeywords = React.useCallback(function (keywords) {
12860
- dispatch(layerSelectActions.toggleKeywords({
12861
- keywords: keywords
13609
+ var toggleFilter = React.useCallback(function (filterIds) {
13610
+ dispatch(layerSelectActions.toggleFilter({
13611
+ filterIds: filterIds
12862
13612
  }));
12863
13613
  }, [dispatch]);
12864
- var enableOnlyOneKeyword = React.useCallback(function (keyword) {
12865
- dispatch(layerSelectActions.enableOnlyOneKeyword({
12866
- keyword: keyword
13614
+ var enableOnlyOneFilter = React.useCallback(function (filterId) {
13615
+ dispatch(layerSelectActions.enableOnlyOneFilter({
13616
+ filterId: filterId
12867
13617
  }));
12868
13618
  }, [dispatch]);
12869
- var keywordObject = useSelector(function (store) {
12870
- return getKeywordObjectById(store, keyword);
12871
- });
12872
13619
  return /*#__PURE__*/React.createElement(FilterListItem, {
12873
- keyword: keywordObject,
12874
- toggleKeywords: toggleKeywords,
12875
- enableOnlyOneKeyword: enableOnlyOneKeyword
13620
+ filter: filter,
13621
+ toggleFilter: toggleFilter,
13622
+ enableOnlyOneFilter: enableOnlyOneFilter
12876
13623
  });
12877
13624
  };
12878
13625
 
@@ -12895,54 +13642,37 @@ var KeywordFilterResultsListItemConnect = function KeywordFilterResultsListItemC
12895
13642
 
12896
13643
  var KeywordFilterSelectAllSwitchConnect = function KeywordFilterSelectAllSwitchConnect() {
12897
13644
  var dispatch = useDispatch();
12898
- var allKeywordsActive = useSelector(function (store) {
12899
- return isAllKeywordsChecked(store);
13645
+ var allFiltersActive = useSelector(function (store) {
13646
+ return isAllFiltersChecked(store);
12900
13647
  });
12901
- var allKeywordIds = useSelector(function (store) {
12902
- return getAllKeywordIds(store);
13648
+ var allFilterIds = useSelector(function (store) {
13649
+ return getAllFilterIds(store);
12903
13650
  });
12904
- var checkedKeywordIds = useSelector(function (store) {
12905
- return getCheckedKeywordIds(store);
13651
+ var checkedFilterIds = useSelector(function (store) {
13652
+ return getCheckedFilterIds(store);
12906
13653
  });
12907
- var toggleKeywords = React.useCallback(function () {
12908
- var keywords = allKeywordsActive ? checkedKeywordIds : allKeywordIds.filter(function (id) {
12909
- return !checkedKeywordIds.includes(id);
13654
+ var toggleFilters = React.useCallback(function () {
13655
+ var filterIds = allFiltersActive ? checkedFilterIds : allFilterIds.filter(function (id) {
13656
+ return !checkedFilterIds.includes(id);
12910
13657
  });
12911
- dispatch(layerSelectActions.toggleKeywords({
12912
- keywords: keywords
13658
+ dispatch(layerSelectActions.toggleFilter({
13659
+ filterIds: filterIds
12913
13660
  }));
12914
- }, [allKeywordIds, allKeywordsActive, checkedKeywordIds, dispatch]);
13661
+ }, [allFilterIds, allFiltersActive, checkedFilterIds, dispatch]);
12915
13662
  return /*#__PURE__*/React.createElement(Switch, {
12916
- checked: allKeywordsActive,
12917
- onChange: toggleKeywords,
13663
+ checked: allFiltersActive,
13664
+ onChange: toggleFilters,
12918
13665
  "data-testid": "customSwitch"
12919
13666
  });
12920
13667
  };
12921
13668
 
12922
- /* *
12923
- * Licensed under the Apache License, Version 2.0 (the "License");
12924
- * you may not use this file except in compliance with the License.
12925
- * You may obtain a copy of the License at
12926
- *
12927
- * http://www.apache.org/licenses/LICENSE-2.0
12928
- *
12929
- * Unless required by applicable law or agreed to in writing, software
12930
- * distributed under the License is distributed on an "AS IS" BASIS,
12931
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12932
- * See the License for the specific language governing permissions and
12933
- * limitations under the License.
12934
- *
12935
- * Copyright 2022 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
12936
- * Copyright 2022 - Finnish Meteorological Institute (FMI)
12937
- * */
13669
+ var DIALOG_TITLE = 'Groups & Keywords';
12938
13670
 
12939
13671
  var KeywordFilterResults = function KeywordFilterResults(_ref) {
12940
- var allKeywordIds = _ref.allKeywordIds,
12941
- mapId = _ref.mapId,
13672
+ var filters = _ref.filters,
12942
13673
  bounds = _ref.bounds,
12943
13674
  _ref$onClose = _ref.onClose,
12944
13675
  onClose = _ref$onClose === void 0 ? function () {} : _ref$onClose,
12945
- showTitle = _ref.showTitle,
12946
13676
  isOpen = _ref.isOpen,
12947
13677
  _ref$onMouseDown = _ref.onMouseDown,
12948
13678
  onMouseDown = _ref$onMouseDown === void 0 ? function () {} : _ref$onMouseDown,
@@ -12950,8 +13680,26 @@ var KeywordFilterResults = function KeywordFilterResults(_ref) {
12950
13680
  order = _ref$order === void 0 ? 0 : _ref$order,
12951
13681
  _ref$source = _ref.source,
12952
13682
  source = _ref$source === void 0 ? 'module' : _ref$source;
13683
+
13684
+ var _a, _b;
13685
+
13686
+ var filtersGroupedByType = groupBy(filters, function (filter) {
13687
+ return filter.type;
13688
+ });
13689
+ var groups = (_a = filtersGroupedByType['group']) !== null && _a !== void 0 ? _a : [];
13690
+
13691
+ var groupsSorted = _toConsumableArray(groups).sort(function (a, b) {
13692
+ return a.name.localeCompare(b.name);
13693
+ });
13694
+
13695
+ var keywords = (_b = filtersGroupedByType['keyword']) !== null && _b !== void 0 ? _b : [];
13696
+
13697
+ var keywordsSorted = _toConsumableArray(keywords).sort(function (a, b) {
13698
+ return a.name.localeCompare(b.name);
13699
+ });
13700
+
12953
13701
  return /*#__PURE__*/React.createElement(ToolContainerDraggable, {
12954
- title: showTitle ? "Filter Results ".concat(mapId) : 'Filter Results',
13702
+ title: DIALOG_TITLE,
12955
13703
  "data-testid": "keywordFilterResults",
12956
13704
  startSize: {
12957
13705
  width: 349,
@@ -13002,10 +13750,15 @@ var KeywordFilterResults = function KeywordFilterResults(_ref) {
13002
13750
  style: {
13003
13751
  padding: '0px'
13004
13752
  }
13005
- }, allKeywordIds.map(function (keywordId) {
13753
+ }, /*#__PURE__*/React.createElement(ListSubheader, null, "Groups"), groupsSorted.map(function (group) {
13754
+ return /*#__PURE__*/React.createElement(KeywordFilterResultsListItemConnect, {
13755
+ key: group.id,
13756
+ filter: group
13757
+ });
13758
+ }), /*#__PURE__*/React.createElement(ListSubheader, null, "Keywords"), keywordsSorted.map(function (keyword) {
13006
13759
  return /*#__PURE__*/React.createElement(KeywordFilterResultsListItemConnect, {
13007
- key: keywordId,
13008
- keyword: keywordId
13760
+ key: keyword.id,
13761
+ filter: keyword
13009
13762
  });
13010
13763
  })));
13011
13764
  };
@@ -13028,78 +13781,63 @@ var KeywordFilterResults = function KeywordFilterResults(_ref) {
13028
13781
  * */
13029
13782
 
13030
13783
  var KeywordFilterResultsConnect = function KeywordFilterResultsConnect(_ref) {
13031
- var bounds = _ref.bounds,
13032
- _ref$showTitle = _ref.showTitle,
13033
- showTitle = _ref$showTitle === void 0 ? false : _ref$showTitle;
13034
- var dispatch = useDispatch();
13035
- var mapId = useSelector(function (store) {
13036
- return getDialogMapId(store, 'keywordFilter');
13037
- });
13038
- var isOpenInStore = useSelector(function (store) {
13039
- return getisDialogOpen(store, 'keywordFilter');
13040
- });
13041
- var onClose = React.useCallback(function () {
13042
- return dispatch(uiActions.setToggleOpenDialog({
13043
- type: 'keywordFilter',
13044
- setOpen: false
13045
- }));
13046
- }, [dispatch]);
13047
- var isMapPresent = useSelector(function (store) {
13048
- return getIsMapPresent(store, mapId);
13049
- });
13050
- var uiOrder = useSelector(function (store) {
13051
- return getDialogOrder(store, 'keywordFilter');
13052
- });
13053
- var uiSource = useSelector(function (store) {
13054
- return getDialogSource(store, 'keywordFilter');
13055
- });
13056
- var uiIsOrderedOnTop = useSelector(function (store) {
13057
- return getDialogIsOrderedOnTop(store, 'keywordFilter');
13058
- }); // Check to ensure the currently active map is still present on screen - if not, close the dialog
13784
+ var bounds = _ref.bounds;
13059
13785
 
13060
- React.useEffect(function () {
13061
- if (mapId !== '' && !isMapPresent) {
13062
- onClose();
13063
- }
13064
- }, [mapId, isMapPresent, onClose]);
13065
- var registerDialog = React.useCallback(function () {
13066
- return dispatch(uiActions.registerDialog({
13067
- type: 'keywordFilter',
13068
- setOpen: false
13069
- }));
13070
- }, [dispatch]);
13071
- var unregisterDialog = React.useCallback(function () {
13072
- return dispatch(uiActions.unregisterDialog({
13073
- type: 'keywordFilter'
13074
- }));
13075
- }, [dispatch]);
13076
- var onOrderDialog = React.useCallback(function () {
13077
- if (!uiIsOrderedOnTop) {
13078
- dispatch(uiActions.orderDialog({
13079
- type: 'keywordFilter'
13080
- }));
13081
- }
13082
- }, [dispatch, uiIsOrderedOnTop]); // Register this dialog in the store
13786
+ var _useSetupDialog = useSetupDialog('keywordFilter'),
13787
+ dialogOrder = _useSetupDialog.dialogOrder,
13788
+ onCloseDialog = _useSetupDialog.onCloseDialog,
13789
+ setDialogOrder = _useSetupDialog.setDialogOrder,
13790
+ isDialogOpen = _useSetupDialog.isDialogOpen,
13791
+ uiSource = _useSetupDialog.uiSource;
13083
13792
 
13084
- React.useEffect(function () {
13085
- registerDialog();
13086
- return function () {
13087
- unregisterDialog();
13088
- }; // eslint-disable-next-line react-hooks/exhaustive-deps
13089
- }, []);
13090
- var allKeywordIds = useSelector(function (store) {
13091
- return getAllKeywordIds(store);
13092
- });
13793
+ var filters = useSelector(getAllFilters);
13093
13794
  return /*#__PURE__*/React.createElement(KeywordFilterResults, {
13094
- allKeywordIds: allKeywordIds,
13095
- mapId: mapId,
13096
13795
  bounds: bounds,
13097
- isOpen: isOpenInStore,
13098
- onClose: onClose,
13099
- showTitle: showTitle,
13100
- onMouseDown: onOrderDialog,
13101
- order: uiOrder,
13102
- source: uiSource
13796
+ isOpen: isDialogOpen,
13797
+ onClose: onCloseDialog,
13798
+ onMouseDown: setDialogOrder,
13799
+ order: dialogOrder,
13800
+ source: uiSource,
13801
+ filters: filters
13802
+ });
13803
+ };
13804
+
13805
+ /* *
13806
+ * Licensed under the Apache License, Version 2.0 (the "License");
13807
+ * you may not use this file except in compliance with the License.
13808
+ * You may obtain a copy of the License at
13809
+ *
13810
+ * http://www.apache.org/licenses/LICENSE-2.0
13811
+ *
13812
+ * Unless required by applicable law or agreed to in writing, software
13813
+ * distributed under the License is distributed on an "AS IS" BASIS,
13814
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13815
+ * See the License for the specific language governing permissions and
13816
+ * limitations under the License.
13817
+ *
13818
+ * Copyright 2022 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
13819
+ * Copyright 2022 - Finnish Meteorological Institute (FMI)
13820
+ * */
13821
+
13822
+ var LayerInfoDialogConnect = function LayerInfoDialogConnect() {
13823
+ var layer = useSelector(function (store) {
13824
+ return getActiveLayerInfo(store);
13825
+ });
13826
+
13827
+ var _useSetupDialog = useSetupDialog(DialogTypes.LayerInfo),
13828
+ dialogOrder = _useSetupDialog.dialogOrder,
13829
+ onCloseDialog = _useSetupDialog.onCloseDialog,
13830
+ setDialogOrder = _useSetupDialog.setDialogOrder,
13831
+ uiSource = _useSetupDialog.uiSource,
13832
+ isDialogOpen = _useSetupDialog.isDialogOpen;
13833
+
13834
+ return /*#__PURE__*/React__default.createElement(LayerInfoDialog, {
13835
+ isOpen: isDialogOpen,
13836
+ onClose: onCloseDialog,
13837
+ onMouseDown: setDialogOrder,
13838
+ order: dialogOrder,
13839
+ source: uiSource,
13840
+ layer: layer
13103
13841
  });
13104
13842
  };
13105
13843
 
@@ -13127,72 +13865,43 @@ var KeywordFilterResultsConnect = function KeywordFilterResultsConnect(_ref) {
13127
13865
  * ``` <LayerSelectConnect />```
13128
13866
  */
13129
13867
 
13130
- var LayerSelectConnect = function LayerSelectConnect(_ref) {
13131
- var bounds = _ref.bounds,
13132
- _ref$showTitle = _ref.showTitle,
13133
- showTitle = _ref$showTitle === void 0 ? false : _ref$showTitle,
13134
- _ref$preloadedService = _ref.preloadedServices,
13135
- preloadedServices = _ref$preloadedService === void 0 ? preloadedDefaultMapServices : _ref$preloadedService;
13868
+ var LayerSelectConnect = function LayerSelectConnect(_ref) {
13869
+ var bounds = _ref.bounds,
13870
+ _ref$showTitle = _ref.showTitle,
13871
+ showTitle = _ref$showTitle === void 0 ? false : _ref$showTitle;
13872
+ var mapId = useSelector(function (store) {
13873
+ return getDialogMapId(store, 'layerSelect');
13874
+ });
13875
+
13876
+ var _useSetupDialog = useSetupDialog('layerSelect'),
13877
+ dialogOrder = _useSetupDialog.dialogOrder,
13878
+ isDialogOpen = _useSetupDialog.isDialogOpen,
13879
+ onCloseDialog = _useSetupDialog.onCloseDialog,
13880
+ setDialogOrder = _useSetupDialog.setDialogOrder,
13881
+ uiSource = _useSetupDialog.uiSource;
13882
+
13883
+ return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(LayerSelect, {
13884
+ mapId: mapId,
13885
+ bounds: bounds,
13886
+ isOpen: isDialogOpen,
13887
+ onClose: onCloseDialog,
13888
+ showTitle: showTitle,
13889
+ onMouseDown: setDialogOrder,
13890
+ order: dialogOrder,
13891
+ source: uiSource
13892
+ }), /*#__PURE__*/React.createElement(KeywordFilterResultsConnect, null), /*#__PURE__*/React.createElement(LayerInfoDialogConnect, null));
13893
+ };
13894
+
13895
+ var useFetchServices = function useFetchServices(dialogType) {
13896
+ var preloadedServices = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : preloadedDefaultMapServices;
13136
13897
  var dispatch = useDispatch();
13137
13898
 
13138
13899
  var _useIsMounted = useIsMounted(),
13139
13900
  isMounted = _useIsMounted.isMounted;
13140
13901
 
13141
- var mapId = useSelector(function (store) {
13142
- return getDialogMapId(store, 'layerSelect');
13143
- });
13144
13902
  var isOpenInStore = useSelector(function (store) {
13145
- return getisDialogOpen(store, 'layerSelect');
13146
- });
13147
- var onClose = React.useCallback(function () {
13148
- return dispatch(uiActions.setToggleOpenDialog({
13149
- type: 'layerSelect',
13150
- setOpen: false
13151
- }));
13152
- }, [dispatch]);
13153
- var isMapPresent = useSelector(function (store) {
13154
- return getIsMapPresent(store, mapId);
13155
- });
13156
- var uiOrder = useSelector(function (store) {
13157
- return getDialogOrder(store, 'layerSelect');
13158
- });
13159
- var uiSource = useSelector(function (store) {
13160
- return getDialogSource(store, 'layerSelect');
13903
+ return getisDialogOpen(store, dialogType);
13161
13904
  });
13162
- var uiIsOrderedOnTop = useSelector(function (store) {
13163
- return getDialogIsOrderedOnTop(store, 'layerSelect');
13164
- }); // Check to ensure the currently active map is still present on screen - if not, close the dialog
13165
-
13166
- React.useEffect(function () {
13167
- if (mapId !== '' && !isMapPresent) {
13168
- onClose();
13169
- }
13170
- }, [mapId, isMapPresent, onClose]);
13171
- var registerDialog = React.useCallback(function () {
13172
- return dispatch(uiActions.registerDialog({
13173
- type: 'layerSelect',
13174
- setOpen: false
13175
- }));
13176
- }, [dispatch]);
13177
- var unregisterDialog = React.useCallback(function () {
13178
- return dispatch(uiActions.unregisterDialog({
13179
- type: 'layerSelect'
13180
- }));
13181
- }, [dispatch]);
13182
- var onOrderDialog = React.useCallback(function () {
13183
- if (!uiIsOrderedOnTop) {
13184
- dispatch(uiActions.orderDialog({
13185
- type: 'layerSelect'
13186
- }));
13187
- }
13188
- }, [dispatch, uiIsOrderedOnTop]); // Register this dialog in the store
13189
-
13190
- React.useEffect(function () {
13191
- registerDialog();
13192
- return function () {
13193
- unregisterDialog();
13194
- }; // eslint-disable-next-line react-hooks/exhaustive-deps
13195
- }, []);
13196
13905
  var serviceSetLayers = React.useCallback(function (payload) {
13197
13906
  dispatch(serviceActions.serviceSetLayers(payload));
13198
13907
  }, [dispatch]);
@@ -13212,7 +13921,9 @@ var LayerSelectConnect = function LayerSelectConnect(_ref) {
13212
13921
  name: service.name,
13213
13922
  serviceUrl: service.url,
13214
13923
  layers: layers,
13215
- isUserAddedService: checkIfUserAddedService(service)
13924
+ isUserAddedService: checkIfUserAddedService(service),
13925
+ // first try to load the user abstract, otherwise the service abstract
13926
+ "abstract": service["abstract"] || wmService["abstract"]
13216
13927
  });
13217
13928
  }
13218
13929
  })["catch"](function () {
@@ -13222,16 +13933,11 @@ var LayerSelectConnect = function LayerSelectConnect(_ref) {
13222
13933
  } // eslint-disable-next-line react-hooks/exhaustive-deps
13223
13934
 
13224
13935
  }, [isOpenInStore, preloadedServices, serviceSetLayers]);
13225
- return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(LayerSelect, {
13226
- mapId: mapId,
13227
- bounds: bounds,
13228
- isOpen: isOpenInStore,
13229
- onClose: onClose,
13230
- showTitle: showTitle,
13231
- onMouseDown: onOrderDialog,
13232
- order: uiOrder,
13233
- source: uiSource
13234
- }), /*#__PURE__*/React.createElement(KeywordFilterResultsConnect, null));
13936
+ };
13937
+ var mergePresetsAndUserAddedServices = function mergePresetsAndUserAddedServices(presets, userAddedServices) {
13938
+ return Object.values(Object.assign(Object.assign({}, presets.reduce(function (byUrl, preset) {
13939
+ return Object.assign(Object.assign({}, byUrl), _defineProperty({}, preset.url, preset));
13940
+ }, {})), userAddedServices));
13235
13941
  };
13236
13942
 
13237
13943
  /* *
@@ -13250,6 +13956,7 @@ var LayerSelectConnect = function LayerSelectConnect(_ref) {
13250
13956
  * Copyright 2021 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
13251
13957
  * Copyright 2021 - Finnish Meteorological Institute (FMI)
13252
13958
  * */
13959
+ var dialogType = 'layerManager';
13253
13960
  /**
13254
13961
  * Layer Managerconnected to the store displaying the layers forthe active map Id
13255
13962
  * Please note that in order to use this and open/close the dialog, every map on the screen that should be able to show
@@ -13273,87 +13980,41 @@ var LayerManagerConnect = function LayerManagerConnect(_ref) {
13273
13980
  layerSelect = _ref$layerSelect === void 0 ? false : _ref$layerSelect,
13274
13981
  _ref$leftComponent = _ref.leftComponent,
13275
13982
  leftComponent = _ref$leftComponent === void 0 ? null : _ref$leftComponent;
13276
- var dispatch = useDispatch();
13277
- var isOpenInStore = useSelector(function (store) {
13278
- return getisDialogOpen(store, 'layerManager');
13279
- });
13280
13983
  var mapId = useSelector(function (store) {
13281
- return getDialogMapId(store, 'layerManager');
13282
- });
13283
- var onClose = React.useCallback(function () {
13284
- return dispatch(uiActions.setToggleOpenDialog({
13285
- type: 'layerManager',
13286
- setOpen: false
13287
- }));
13288
- }, [dispatch]);
13289
- var isMapPresent = useSelector(function (store) {
13290
- return getIsMapPresent(store, mapId);
13291
- });
13292
- var uiOrder = useSelector(function (store) {
13293
- return getDialogOrder(store, 'layerManager');
13294
- });
13295
- var uiSource = useSelector(function (store) {
13296
- return getDialogSource(store, 'layerManager');
13297
- });
13298
- var uiIsOrderedOnTop = useSelector(function (store) {
13299
- return getDialogIsOrderedOnTop(store, 'layerManager');
13984
+ return getDialogMapId(store, dialogType);
13300
13985
  });
13301
13986
  var isMapPresetLoading = useSelector(function (store) {
13302
13987
  return getIsMapPresetLoading(store, mapId);
13303
13988
  });
13304
13989
  var mapPresetError = useSelector(function (store) {
13305
13990
  return getMapPresetError(store, mapId);
13306
- }); // Check to ensure the currently active map is still present on screen - if not, close the dialog
13991
+ });
13307
13992
 
13308
- React.useEffect(function () {
13309
- if (mapId !== '' && !isMapPresent) {
13310
- onClose();
13311
- }
13312
- }, [mapId, isMapPresent, onClose]);
13313
- var registerDialog = React.useCallback(function () {
13314
- return dispatch(uiActions.registerDialog({
13315
- type: 'layerManager',
13316
- setOpen: false
13317
- }));
13318
- }, [dispatch]);
13319
- var unregisterDialog = React.useCallback(function () {
13320
- return dispatch(uiActions.unregisterDialog({
13321
- type: 'layerManager'
13322
- }));
13323
- }, [dispatch]);
13324
- var onOrderDialog = React.useCallback(function () {
13325
- if (!uiIsOrderedOnTop) {
13326
- dispatch(uiActions.orderDialog({
13327
- type: 'layerManager'
13328
- }));
13329
- }
13330
- }, [dispatch, uiIsOrderedOnTop]); // Register this dialog in the store
13993
+ var _useSetupDialog = useSetupDialog(dialogType),
13994
+ dialogOrder = _useSetupDialog.dialogOrder,
13995
+ setDialogOrder = _useSetupDialog.setDialogOrder,
13996
+ onCloseDialog = _useSetupDialog.onCloseDialog,
13997
+ isDialogOpen = _useSetupDialog.isDialogOpen,
13998
+ uiSource = _useSetupDialog.uiSource;
13331
13999
 
13332
- React.useEffect(function () {
13333
- registerDialog();
13334
- return function () {
13335
- unregisterDialog();
13336
- }; // eslint-disable-next-line react-hooks/exhaustive-deps
13337
- }, []);
14000
+ useFetchServices(dialogType, preloadedMapServices);
13338
14001
  return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(LayerManager, {
13339
14002
  mapId: mapId,
13340
14003
  preloadedAvailableBaseLayers: preloadedAvailableBaseLayers,
13341
14004
  preloadedMapServices: preloadedMapServices,
13342
14005
  preloadedBaseServices: preloadedBaseServices,
13343
14006
  bounds: bounds,
13344
- isOpen: isOpenInStore,
13345
- onClose: onClose,
14007
+ isOpen: isDialogOpen,
14008
+ onClose: onCloseDialog,
13346
14009
  showTitle: showTitle,
13347
- onMouseDown: onOrderDialog,
13348
- order: uiOrder,
14010
+ onMouseDown: setDialogOrder,
14011
+ order: dialogOrder,
13349
14012
  source: uiSource,
13350
14013
  layerSelect: layerSelect,
13351
14014
  leftComponent: leftComponent,
13352
14015
  isLoading: isMapPresetLoading,
13353
14016
  error: mapPresetError
13354
- }), layerSelect && /*#__PURE__*/React.createElement(LayerSelectConnect, {
13355
- preloadedServices: preloadedMapServices
13356
- }));
14017
+ }), layerSelect && /*#__PURE__*/React.createElement(LayerSelectConnect, null));
13357
14018
  };
13358
14019
 
13359
14020
  /* *
@@ -13595,7 +14256,7 @@ var getDimensionIcon = function getDimensionIcon(iconType) {
13595
14256
  return Equalizer;
13596
14257
  }
13597
14258
 
13598
- return Sort;
14259
+ return DimensionsElevation;
13599
14260
  };
13600
14261
 
13601
14262
  /* *
@@ -13885,7 +14546,7 @@ var DimensionSelectDialogConnect = function DimensionSelectDialogConnect(_ref) {
13885
14546
  _ref$order = _ref.order,
13886
14547
  order = _ref$order === void 0 ? 0 : _ref$order,
13887
14548
  onMouseDown = _ref.onMouseDown,
13888
- onToggleDialog = _ref.onToggleDialog,
14549
+ onCloseDialog = _ref.onCloseDialog,
13889
14550
  _ref$index = _ref.index,
13890
14551
  index = _ref$index === void 0 ? 0 : _ref$index,
13891
14552
  _ref$source = _ref.source,
@@ -13940,9 +14601,7 @@ var DimensionSelectDialogConnect = function DimensionSelectDialogConnect(_ref) {
13940
14601
  headerSize: "small",
13941
14602
  isOpen: isOpen,
13942
14603
  "data-testid": "multidimensionContent-".concat(title),
13943
- onClose: function onClose() {
13944
- return onToggleDialog(false);
13945
- },
14604
+ onClose: onCloseDialog,
13946
14605
  bounds: "parent",
13947
14606
  onMouseDown: onMouseDown,
13948
14607
  order: order,
@@ -13989,71 +14648,26 @@ var getDimensionType = function getDimensionType(dimensionName) {
13989
14648
  var MultiMapSingleDimensionSelectConnect = function MultiMapSingleDimensionSelectConnect(_ref) {
13990
14649
  var dimensionName = _ref.dimensionName,
13991
14650
  index = _ref.index;
13992
- var dispatch = useDispatch();
13993
14651
  var uiDialogType = getDimensionType(dimensionName);
13994
14652
  var mapId = useSelector(function (store) {
13995
14653
  return getDialogMapId(store, uiDialogType);
13996
14654
  });
13997
- var uiOrder = useSelector(function (store) {
13998
- return getDialogOrder(store, uiDialogType);
13999
- });
14000
- var uiSource = useSelector(function (store) {
14001
- return getDialogSource(store, uiDialogType);
14002
- });
14003
- var uiIsOrderedOnTop = useSelector(function (store) {
14004
- return getDialogIsOrderedOnTop(store, uiDialogType);
14005
- });
14006
- var isOpen = useSelector(function (store) {
14007
- return getisDialogOpen(store, uiDialogType);
14008
- });
14009
- var isMapPresent = useSelector(function (store) {
14010
- return getIsMapPresent(store, mapId);
14011
- });
14012
- var onOrderDialog = React.useCallback(function () {
14013
- if (!uiIsOrderedOnTop) {
14014
- dispatch(uiActions.orderDialog({
14015
- type: uiDialogType
14016
- }));
14017
- }
14018
- }, [dispatch, uiDialogType, uiIsOrderedOnTop]);
14019
- var onToggleDialog = React.useCallback(function (setOpen) {
14020
- dispatch(uiActions.setToggleOpenDialog({
14021
- type: uiDialogType,
14022
- setOpen: setOpen
14023
- }));
14024
- }, [dispatch, uiDialogType]);
14025
- var registerDialog = React.useCallback(function (activeMapId) {
14026
- return dispatch(uiActions.registerDialog({
14027
- type: uiDialogType,
14028
- mapId: activeMapId
14029
- }));
14030
- }, [dispatch, uiDialogType]);
14031
- var unregisterDialog = React.useCallback(function () {
14032
- return dispatch(uiActions.unregisterDialog({
14033
- type: uiDialogType
14034
- }));
14035
- }, [dispatch, uiDialogType]); // Check to ensure the currently active map is still present on screen - if not, close the dialog
14036
14655
 
14037
- React.useEffect(function () {
14038
- if (mapId !== '' && !isMapPresent) {
14039
- onToggleDialog(false);
14040
- }
14041
- }, [mapId, isMapPresent, onToggleDialog]); // Register this dialog in the store
14656
+ var _useSetupDialog = useSetupDialog(uiDialogType),
14657
+ dialogOrder = _useSetupDialog.dialogOrder,
14658
+ isDialogOpen = _useSetupDialog.isDialogOpen,
14659
+ onCloseDialog = _useSetupDialog.onCloseDialog,
14660
+ setDialogOrder = _useSetupDialog.setDialogOrder,
14661
+ uiSource = _useSetupDialog.uiSource;
14042
14662
 
14043
- React.useEffect(function () {
14044
- registerDialog(mapId);
14045
- return function () {
14046
- unregisterDialog();
14047
- }; // eslint-disable-next-line react-hooks/exhaustive-deps
14048
- }, []);
14049
14663
  return /*#__PURE__*/React.createElement(DimensionSelectDialogConnect, {
14050
14664
  mapId: mapId,
14051
14665
  dimensionName: dimensionName,
14052
- onMouseDown: onOrderDialog,
14053
- onToggleDialog: onToggleDialog,
14054
- order: uiOrder,
14666
+ onMouseDown: setDialogOrder,
14667
+ onCloseDialog: onCloseDialog,
14668
+ order: dialogOrder,
14055
14669
  source: uiSource,
14056
- isOpen: isOpen,
14670
+ isOpen: isDialogOpen,
14057
14671
  index: index
14058
14672
  });
14059
14673
  };
@@ -14225,214 +14839,230 @@ var AutoUpdateButton = function AutoUpdateButton(_ref) {
14225
14839
  }))));
14226
14840
  };
14227
14841
 
14228
- var speedTooltipTitle = 'Speed';
14229
-
14230
- var SpeedButton = function SpeedButton(_ref) {
14231
- var animationDelay = _ref.animationDelay,
14232
- setMapAnimationDelay = _ref.setMapAnimationDelay;
14233
-
14234
- var _React$useState = React.useState(false),
14235
- _React$useState2 = _slicedToArray(_React$useState, 2),
14236
- open = _React$useState2[0],
14237
- setOpen = _React$useState2[1];
14238
-
14239
- var marks = speedFactors.map(function (speedFactor, i) {
14240
- return {
14241
- delay: getSpeedDelay(speedFactor),
14242
- markPos: i,
14243
- text: "".concat(speedFactor, "x")
14244
- };
14245
- });
14246
- var max = marks.length - 1;
14247
- var min = 0;
14248
- var currentValue = marks.findIndex(function (info) {
14249
- return info.delay === animationDelay;
14842
+ var TimeSliderMenu = function TimeSliderMenu(_ref) {
14843
+ var marks = _ref.marks,
14844
+ value = _ref.value,
14845
+ isOpenByDefault = _ref.isOpenByDefault,
14846
+ handleMenuItemClick = _ref.handleMenuItemClick,
14847
+ isDisabled = _ref.isDisabled,
14848
+ handleAutoClick = _ref.handleAutoClick,
14849
+ isAutoSelected = _ref.isAutoSelected,
14850
+ title = _ref.title,
14851
+ icon = _ref.icon;
14852
+ var currentMark = marks.find(function (mark) {
14853
+ return mark.value === value;
14250
14854
  });
14251
14855
 
14252
- var getAnimationDelayValue = function getAnimationDelayValue(markPos) {
14253
- return marks[markPos].delay || marks[0].delay;
14254
- };
14255
-
14256
- var onClickButton = function onClickButton() {
14257
- setOpen(!open);
14258
- };
14259
-
14260
- var onChangeSlider = function onChangeSlider(event, value) {
14261
- var newValue = getAnimationDelayValue(value);
14262
-
14263
- if (event.type !== 'keydown') {
14264
- setMapAnimationDelay(newValue);
14265
- }
14266
- };
14267
-
14268
- var onKeyDown = function onKeyDown(event) {
14269
- // disable default Slider behavior
14270
- event.stopPropagation();
14271
- event.preventDefault(); // custom logic
14272
-
14273
- if (event.key === 'Tab') {
14274
- setOpen(!open);
14275
- }
14856
+ var _React$useState = React.useState(null),
14857
+ _React$useState2 = _slicedToArray(_React$useState, 2),
14858
+ anchorRef = _React$useState2[0],
14859
+ setAnchorRef = _React$useState2[1];
14276
14860
 
14277
- var newValue = getValueFromKeyboardEvent(event, currentValue, min, max);
14861
+ var _useState = useState(false),
14862
+ _useState2 = _slicedToArray(_useState, 2),
14863
+ open = _useState2[0],
14864
+ setOpen = _useState2[1];
14278
14865
 
14279
- if (newValue !== null) {
14280
- setMapAnimationDelay(getAnimationDelayValue(newValue));
14866
+ React.useEffect(function () {
14867
+ if (anchorRef && isOpenByDefault) {
14868
+ setOpen(true);
14281
14869
  }
14282
- };
14283
-
14284
- var text = marks[currentValue].text;
14870
+ }, [anchorRef, isOpenByDefault]);
14285
14871
  return /*#__PURE__*/React.createElement(Box, {
14286
- sx: {
14287
- height: '24px',
14288
- width: '24px',
14289
- position: 'relative'
14872
+ onKeyDown: function onKeyDown(event) {
14873
+ event.stopPropagation();
14290
14874
  }
14291
14875
  }, /*#__PURE__*/React.createElement(Tooltip, {
14292
- title: speedTooltipTitle
14876
+ title: title
14293
14877
  }, /*#__PURE__*/React.createElement(ToolButton, {
14294
- onClick: onClickButton,
14878
+ onClick: function onClick() {
14879
+ setOpen(true);
14880
+ },
14881
+ ref: setAnchorRef,
14295
14882
  active: true,
14296
- "data-testid": "speedButton"
14297
- }, /*#__PURE__*/React.createElement(TextIcon, {
14298
- text: text
14299
- }))), open ? /*#__PURE__*/React.createElement(Box, {
14883
+ width: "58px"
14884
+ }, icon, /*#__PURE__*/React.createElement(TextIcon, {
14885
+ text: currentMark === null || currentMark === void 0 ? void 0 : currentMark.text
14886
+ }))), /*#__PURE__*/React.createElement(Menu, {
14887
+ anchorEl: anchorRef,
14888
+ open: open,
14889
+ onClose: function onClose() {
14890
+ return setOpen(false);
14891
+ },
14892
+ BackdropProps: {
14893
+ sx: {
14894
+ backgroundColor: 'transparent'
14895
+ }
14896
+ },
14897
+ anchorOrigin: {
14898
+ vertical: 'top',
14899
+ horizontal: 'center'
14900
+ },
14901
+ transformOrigin: {
14902
+ vertical: 'bottom',
14903
+ horizontal: 'center'
14904
+ }
14905
+ }, /*#__PURE__*/React.createElement(MenuItem, {
14906
+ disabled: true,
14300
14907
  sx: {
14301
- padding: '0 0 60px 0',
14302
- backgroundColor: 'geowebColors.background.surface',
14303
- width: '95px',
14304
- height: '150px',
14305
- position: 'absolute',
14306
- bottom: '35px'
14908
+ fontSize: '12px',
14909
+ opacity: 0.67,
14910
+ padding: '0px 12px',
14911
+ '&.MuiMenuItem-root': {
14912
+ minHeight: '30px!important'
14913
+ }
14307
14914
  }
14308
- }, /*#__PURE__*/React.createElement(Box, {
14309
- sx: sliderHeaderStyle
14310
- }, "Speed"), /*#__PURE__*/React.createElement(CustomSlider, {
14311
- "data-testid": "speedSlider",
14312
- orientation: "vertical",
14313
- value: currentValue,
14314
- step: null,
14315
- max: max,
14316
- min: min,
14317
- marks: marks.map(function (_ref2) {
14318
- var markPos = _ref2.markPos,
14319
- text = _ref2.text;
14320
- return {
14321
- value: markPos,
14322
- label: text
14323
- };
14324
- }),
14325
- onChange: onChangeSlider,
14326
- onKeyDown: onKeyDown
14327
- })) : null);
14915
+ }, title), marks.map(function (mark) {
14916
+ return /*#__PURE__*/React.createElement(MenuItem, {
14917
+ onClick: function onClick() {
14918
+ handleMenuItemClick(mark);
14919
+ setOpen(false);
14920
+ },
14921
+ key: mark.value,
14922
+ selected: (currentMark === null || currentMark === void 0 ? void 0 : currentMark.value) === mark.value,
14923
+ disabled: isDisabled
14924
+ }, mark.label || mark.text);
14925
+ }), handleAutoClick && /*#__PURE__*/React.createElement(MenuItem, {
14926
+ onClick: function onClick() {
14927
+ handleAutoClick();
14928
+ setOpen(false);
14929
+ },
14930
+ selected: isAutoSelected,
14931
+ disabled: isDisabled
14932
+ }, "Auto")));
14933
+ };
14934
+
14935
+ var speedTooltipTitle = 'Speed';
14936
+
14937
+ var SpeedButton = function SpeedButton(_ref) {
14938
+ var animationDelay = _ref.animationDelay,
14939
+ setMapAnimationDelay = _ref.setMapAnimationDelay;
14940
+
14941
+ var sorted = _toConsumableArray(speedFactors).sort(function (a, b) {
14942
+ return b - a;
14943
+ });
14944
+
14945
+ var marks = sorted.map(function (speedFactor) {
14946
+ return {
14947
+ value: getSpeedDelay(speedFactor),
14948
+ text: "x".concat(speedFactor),
14949
+ label: "x".concat(speedFactor)
14950
+ };
14951
+ });
14952
+ return /*#__PURE__*/React.createElement(TimeSliderMenu, {
14953
+ handleMenuItemClick: function handleMenuItemClick(mark) {
14954
+ setMapAnimationDelay(mark.value);
14955
+ },
14956
+ icon: /*#__PURE__*/React.createElement(Speed, null),
14957
+ marks: marks,
14958
+ title: speedTooltipTitle,
14959
+ value: animationDelay
14960
+ });
14328
14961
  };
14329
14962
 
14330
- var timeStepMarks = [{
14331
- value: 1,
14963
+ /* *
14964
+ * Licensed under the Apache License, Version 2.0 (the "License");
14965
+ * you may not use this file except in compliance with the License.
14966
+ * You may obtain a copy of the License at
14967
+ *
14968
+ * http://www.apache.org/licenses/LICENSE-2.0
14969
+ *
14970
+ * Unless required by applicable law or agreed to in writing, software
14971
+ * distributed under the License is distributed on an "AS IS" BASIS,
14972
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14973
+ * See the License for the specific language governing permissions and
14974
+ * limitations under the License.
14975
+ *
14976
+ * Copyright 2020 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
14977
+ * Copyright 2020 - Finnish Meteorological Institute (FMI)
14978
+ * */
14979
+ var marks$1 = [{
14332
14980
  label: '1 min',
14333
- timeStepValue: 1,
14981
+ value: 1,
14334
14982
  text: '1m'
14335
14983
  }, {
14336
- value: 2,
14337
14984
  label: '2 min',
14338
- timeStepValue: 2,
14985
+ value: 2,
14339
14986
  text: '2m'
14340
14987
  }, {
14341
- value: 3,
14342
14988
  label: '5 min',
14343
- timeStepValue: 5,
14989
+ value: 5,
14344
14990
  text: '5m'
14345
14991
  }, {
14346
- value: 4,
14347
14992
  label: '10 min',
14348
- timeStepValue: 10,
14993
+ value: 10,
14349
14994
  text: '10m'
14350
14995
  }, {
14351
- value: 5,
14352
14996
  label: '15 min',
14353
- timeStepValue: 15,
14997
+ value: 15,
14354
14998
  text: '15m'
14355
14999
  }, {
14356
- value: 6,
14357
15000
  label: '30 min',
14358
- timeStepValue: 30,
15001
+ value: 30,
14359
15002
  text: '30m'
14360
15003
  }, {
14361
- value: 7,
14362
15004
  label: '1 h',
14363
- timeStepValue: 60,
15005
+ value: 60,
14364
15006
  text: '1h'
14365
15007
  }, {
14366
- value: 8,
14367
15008
  label: '2 h',
14368
- timeStepValue: 120,
15009
+ value: 120,
14369
15010
  text: '2h'
14370
15011
  }, {
14371
- value: 9,
14372
15012
  label: '3 h',
14373
- timeStepValue: 180,
15013
+ value: 180,
14374
15014
  text: '3h'
14375
15015
  }, {
14376
- value: 10,
14377
15016
  label: '6 h',
14378
- timeStepValue: 360,
15017
+ value: 360,
14379
15018
  text: '6h'
14380
15019
  }, {
14381
- value: 11,
14382
15020
  label: '12 h',
14383
- timeStepValue: 720,
15021
+ value: 720,
14384
15022
  text: '12h'
14385
15023
  }, {
14386
- value: 12,
14387
15024
  label: '24 h',
14388
- timeStepValue: 1440,
15025
+ value: 1440,
14389
15026
  text: '24h'
14390
15027
  }, {
14391
- value: 13,
14392
15028
  label: '48 h',
14393
- timeStepValue: 2880,
15029
+ value: 2880,
14394
15030
  text: '48h'
14395
15031
  }, {
14396
- value: 14,
14397
15032
  label: '72 h',
14398
- timeStepValue: 4320,
15033
+ value: 4320,
14399
15034
  text: '72h'
14400
15035
  }, {
14401
- value: 15,
14402
15036
  label: '1 week',
14403
- timeStepValue: 10080,
15037
+ value: 10080,
14404
15038
  text: '1w'
14405
15039
  }, {
14406
- value: 16,
14407
15040
  label: '2 weeks',
14408
- timeStepValue: 20160,
15041
+ value: 20160,
14409
15042
  text: '2w'
14410
15043
  }, {
14411
- value: 17,
14412
15044
  label: '1 month',
14413
- timeStepValue: 40320,
15045
+ value: 40320,
14414
15046
  text: '4w'
14415
15047
  }, {
14416
- value: 18,
14417
15048
  label: '2 months',
14418
- timeStepValue: 80640,
15049
+ value: 80640,
14419
15050
  text: '8w'
14420
15051
  }, {
14421
- value: 19,
14422
15052
  label: '6 months',
14423
- timeStepValue: 241920,
15053
+ value: 241920,
14424
15054
  text: '24w'
14425
15055
  }, {
14426
- value: 20,
14427
15056
  label: '1 year',
14428
- timeStepValue: 525600,
15057
+ value: 525600,
14429
15058
  text: '1y'
14430
15059
  }, {
14431
- value: 21,
14432
15060
  label: '10 years',
14433
- timeStepValue: 5256000,
15061
+ value: 5256000,
14434
15062
  text: '10y'
14435
- }];
15063
+ }].sort(function (a, b) {
15064
+ return b.value - a.value;
15065
+ });
14436
15066
  var timeStepTitle = 'Time step';
14437
15067
 
14438
15068
  var TimeStepButton = function TimeStepButton(_ref) {
@@ -14450,88 +15080,31 @@ var TimeStepButton = function TimeStepButton(_ref) {
14450
15080
  _ref$isOpenByDefault = _ref.isOpenByDefault,
14451
15081
  isOpenByDefault = _ref$isOpenByDefault === void 0 ? false : _ref$isOpenByDefault;
14452
15082
  var timeStepFromLayer = getActiveLayerTimeStep(timeDimension) || timeStep;
14453
- var currentMark = timeStepMarks.find(function (mark) {
14454
- return mark.timeStepValue === timeStep;
14455
- });
14456
- React__default.useEffect(function () {
15083
+ React.useEffect(function () {
14457
15084
  if (isTimestepAuto) {
14458
15085
  onChangeTimeStep(timeStepFromLayer);
14459
15086
  }
14460
15087
  }, [timeStepFromLayer, isTimestepAuto, onChangeTimeStep]);
14461
15088
 
14462
- var _React$useState = React__default.useState(null),
14463
- _React$useState2 = _slicedToArray(_React$useState, 2),
14464
- anchorRef = _React$useState2[0],
14465
- setAnchorRef = _React$useState2[1];
14466
-
14467
- var _React$useState3 = React__default.useState(false),
14468
- _React$useState4 = _slicedToArray(_React$useState3, 2),
14469
- open = _React$useState4[0],
14470
- setOpen = _React$useState4[1];
14471
-
14472
- React__default.useEffect(function () {
14473
- if (anchorRef && isOpenByDefault) {
14474
- setOpen(true);
14475
- }
14476
- }, [anchorRef, isOpenByDefault]);
14477
- return /*#__PURE__*/React__default.createElement(Box, {
14478
- onKeyDown: function onKeyDown(event) {
14479
- event.stopPropagation();
14480
- }
14481
- }, /*#__PURE__*/React__default.createElement(Tooltip, {
14482
- title: timeStepTitle
14483
- }, /*#__PURE__*/React__default.createElement(ToolButton, {
14484
- onClick: function onClick() {
14485
- setOpen(true);
14486
- },
14487
- ref: setAnchorRef,
14488
- active: true,
14489
- width: "58px"
14490
- }, /*#__PURE__*/React__default.createElement(FastForward, null), /*#__PURE__*/React__default.createElement(TextIcon, {
14491
- text: currentMark === null || currentMark === void 0 ? void 0 : currentMark.text
14492
- }))), /*#__PURE__*/React__default.createElement(Menu, {
14493
- anchorEl: anchorRef,
14494
- open: open,
14495
- onClose: function onClose() {
14496
- return setOpen(false);
14497
- },
14498
- BackdropProps: {
14499
- sx: {
14500
- backgroundColor: 'transparent'
14501
- }
14502
- },
14503
- anchorOrigin: {
14504
- vertical: 'top',
14505
- horizontal: 'center'
14506
- },
14507
- transformOrigin: {
14508
- vertical: 'bottom',
14509
- horizontal: 'center'
15089
+ var handleMenuItemClick = function handleMenuItemClick(mark) {
15090
+ if (isTimestepAuto) {
15091
+ onToggleTimestepAuto();
14510
15092
  }
14511
- }, timeStepMarks.sort(function (a, b) {
14512
- return b.timeStepValue - a.timeStepValue;
14513
- }).map(function (time) {
14514
- return /*#__PURE__*/React__default.createElement(MenuItem, {
14515
- onClick: function onClick() {
14516
- if (isTimestepAuto) {
14517
- onToggleTimestepAuto();
14518
- }
14519
15093
 
14520
- onChangeTimeStep(time.timeStepValue, MapActionOrigin.map);
14521
- setOpen(false);
14522
- },
14523
- key: time.timeStepValue,
14524
- selected: (currentMark === null || currentMark === void 0 ? void 0 : currentMark.timeStepValue) === time.timeStepValue,
14525
- disabled: disabled
14526
- }, time.label);
14527
- }), /*#__PURE__*/React__default.createElement(MenuItem, {
14528
- onClick: function onClick() {
14529
- onToggleTimestepAuto();
14530
- setOpen(false);
14531
- },
14532
- selected: isTimestepAuto,
14533
- disabled: disabled
14534
- }, "Auto")));
15094
+ onChangeTimeStep(mark.value, MapActionOrigin.map);
15095
+ };
15096
+
15097
+ return /*#__PURE__*/React.createElement(TimeSliderMenu, {
15098
+ title: timeStepTitle,
15099
+ isOpenByDefault: isOpenByDefault,
15100
+ marks: marks$1,
15101
+ value: timeStep,
15102
+ handleMenuItemClick: handleMenuItemClick,
15103
+ isDisabled: disabled,
15104
+ isAutoSelected: isTimestepAuto,
15105
+ handleAutoClick: onToggleTimestepAuto,
15106
+ icon: /*#__PURE__*/React.createElement(FastForward, null)
15107
+ });
14535
15108
  };
14536
15109
 
14537
15110
  var OptionsPopOver = styled(Popover)(function (_ref) {
@@ -16250,7 +16823,7 @@ var useTimeSliderKeyBoardControl = function useTimeSliderKeyBoardControl(mapIsAc
16250
16823
  var handleKeyDown = function handleKeyDown(event) {
16251
16824
  var target = event.target;
16252
16825
 
16253
- if (target.tagName !== 'INPUT' && event.key === 't' && mapIsActive) {
16826
+ if (target.tagName !== 'INPUT' && target.tagName !== 'TEXTAREA' && event.key === 't' && mapIsActive) {
16254
16827
  onToggleTimeSlider(!isVisible);
16255
16828
  }
16256
16829
  };
@@ -16331,14 +16904,14 @@ var TimeSlider = function TimeSlider(_ref) {
16331
16904
  * Copyright 2020 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
16332
16905
  * Copyright 2020 - Finnish Meteorological Institute (FMI)
16333
16906
  * */
16334
- var connectRedux$4 = connect(function (store, props) {
16907
+ var connectRedux$3 = connect(function (store, props) {
16335
16908
  return {
16336
16909
  isAutoUpdating: isAutoUpdating(store, props.mapId)
16337
16910
  };
16338
16911
  }, {
16339
16912
  toggleAutoUpdate: mapActions$1.toggleAutoUpdate
16340
16913
  });
16341
- var AutoUpdateButtonConnectComponent = connectRedux$4(function (_ref) {
16914
+ var AutoUpdateButtonConnectComponent = connectRedux$3(function (_ref) {
16342
16915
  var mapId = _ref.mapId,
16343
16916
  isAutoUpdating = _ref.isAutoUpdating,
16344
16917
  toggleAutoUpdate = _ref.toggleAutoUpdate;
@@ -16357,7 +16930,7 @@ var AutoUpdateButtonConnectComponent = connectRedux$4(function (_ref) {
16357
16930
  disabled: false
16358
16931
  });
16359
16932
  });
16360
- var AutoUpdateButtonConnect = connectRedux$4(AutoUpdateButtonConnectComponent);
16933
+ var AutoUpdateButtonConnect = connectRedux$3(AutoUpdateButtonConnectComponent);
16361
16934
 
16362
16935
  /* *
16363
16936
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -16375,31 +16948,27 @@ var AutoUpdateButtonConnect = connectRedux$4(AutoUpdateButtonConnectComponent);
16375
16948
  * Copyright 2020 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
16376
16949
  * Copyright 2020 - Finnish Meteorological Institute (FMI)
16377
16950
  * */
16378
- var connectRedux$3 = connect(function (store, props) {
16379
- return {
16380
- animationDelay: getMapAnimationDelay(store, props.mapId)
16381
- };
16382
- }, {
16383
- setMapAnimationDelay: mapActions$1.setAnimationDelay
16384
- });
16385
- var SpeedButtonConnect = connectRedux$3(function (_ref) {
16386
- var animationDelay = _ref.animationDelay,
16387
- mapId = _ref.mapId,
16388
- setMapAnimationDelay = _ref.setMapAnimationDelay;
16389
16951
 
16390
- var onSetAnimationDelay = function onSetAnimationDelay(_animationDelay) {
16391
- setMapAnimationDelay({
16952
+ var SpeedButtonConnect = function SpeedButtonConnect(_ref) {
16953
+ var mapId = _ref.mapId;
16954
+ var animationDelay = useSelector(function (store) {
16955
+ return getMapAnimationDelay(store, mapId);
16956
+ });
16957
+ var dispatch = useDispatch();
16958
+
16959
+ var onSetAnimationDelay = function onSetAnimationDelay(animationDelay) {
16960
+ dispatch(mapActions$1.setAnimationDelay({
16392
16961
  mapId: mapId,
16393
- animationDelay: _animationDelay,
16962
+ animationDelay: animationDelay,
16394
16963
  origin: MapActionOrigin.map
16395
- });
16964
+ }));
16396
16965
  };
16397
16966
 
16398
16967
  return /*#__PURE__*/React.createElement(SpeedButton, {
16399
16968
  animationDelay: animationDelay,
16400
16969
  setMapAnimationDelay: onSetAnimationDelay
16401
16970
  });
16402
- });
16971
+ };
16403
16972
 
16404
16973
  /* *
16405
16974
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -17420,13 +17989,14 @@ var getCurrentDimensionValue = function getCurrentDimensionValue() {
17420
17989
  var setServiceMetadata = function setServiceMetadata(wmLayer, mapId, webMapJSInstance, mapProperties, onUpdateLayerInformation) {
17421
17990
  var origin = LayerActionOrigin.ReactMapViewParseLayer;
17422
17991
  var service = WMGetServiceFromStore(wmLayer.service);
17992
+ var serviceName = mapProperties.services[service.id].name;
17423
17993
  /* Update list of layers for service */
17424
17994
 
17425
17995
  var done = function done(layers) {
17426
17996
  var updateObject = {
17427
17997
  origin: origin,
17428
17998
  serviceLayers: {
17429
- name: wmLayer.title,
17999
+ name: serviceName,
17430
18000
  id: service.id,
17431
18001
  serviceUrl: wmLayer.service,
17432
18002
  layers: layers,
@@ -21159,6 +21729,9 @@ var MapViewConnect = function MapViewConnect(_a) {
21159
21729
  var displayMapPin = useSelector(function (store) {
21160
21730
  return getDisplayMapPin(store, mapId);
21161
21731
  });
21732
+ var services = useSelector(function (store) {
21733
+ return getServices(store);
21734
+ });
21162
21735
  var dispatch = useDispatch();
21163
21736
  var map = getWMJSMapById(mapId);
21164
21737
  var mapChangeDimension = React.useCallback(function (mapDimensionPayload) {
@@ -21246,6 +21819,7 @@ var MapViewConnect = function MapViewConnect(_a) {
21246
21819
  animationDelay: animationDelay,
21247
21820
  displayMapPin: displayMapPin,
21248
21821
  disableMapPin: disableMapPin,
21822
+ services: services,
21249
21823
  onMapChangeDimension: function onMapChangeDimension(mapDimensionPayload) {
21250
21824
  if (mapDimensionPayload && mapDimensionPayload.dimension && mapDimensionPayload.dimension.name && mapDimensionPayload.dimension.name === 'time') {
21251
21825
  setTime({
@@ -22180,55 +22754,23 @@ var SyncGroupViewerConnect = function SyncGroupViewerConnect() {
22180
22754
  var syncGroupRemoveTarget = React.useCallback(function (payload) {
22181
22755
  dispatch(actions.syncGroupRemoveTarget(payload));
22182
22756
  }, [dispatch]);
22183
- var isOpenInStore = useSelector(function (store) {
22184
- return getisDialogOpen(store, 'syncGroups');
22185
- });
22186
- var onClose = React.useCallback(function () {
22187
- return dispatch(uiActions.setToggleOpenDialog({
22188
- type: 'syncGroups',
22189
- setOpen: false
22190
- }));
22191
- }, [dispatch]);
22192
- var uiOrder = useSelector(function (store) {
22193
- return getDialogOrder(store, 'syncGroups');
22194
- });
22195
- var uiIsOrderedOnTop = useSelector(function (store) {
22196
- return getDialogIsOrderedOnTop(store, 'syncGroups');
22197
- });
22198
- var registerDialog = React.useCallback(function () {
22199
- return dispatch(uiActions.registerDialog({
22200
- type: 'syncGroups',
22201
- setOpen: false
22202
- }));
22203
- }, [dispatch]);
22204
- var unregisterDialog = React.useCallback(function () {
22205
- return dispatch(uiActions.unregisterDialog({
22206
- type: 'syncGroups'
22207
- }));
22208
- }, [dispatch]);
22209
- var onOrderDialog = React.useCallback(function () {
22210
- if (!uiIsOrderedOnTop) {
22211
- dispatch(uiActions.orderDialog({
22212
- type: 'syncGroups'
22213
- }));
22214
- }
22215
- }, [dispatch, uiIsOrderedOnTop]);
22216
- React.useEffect(function () {
22217
- registerDialog();
22218
- return function () {
22219
- unregisterDialog();
22220
- }; // eslint-disable-next-line react-hooks/exhaustive-deps
22221
- }, []);
22757
+
22758
+ var _useSetupDialog = useSetupDialog('syncGroups'),
22759
+ dialogOrder = _useSetupDialog.dialogOrder,
22760
+ isDialogOpen = _useSetupDialog.isDialogOpen,
22761
+ onCloseDialog = _useSetupDialog.onCloseDialog,
22762
+ setDialogOrder = _useSetupDialog.setDialogOrder;
22763
+
22222
22764
  return /*#__PURE__*/React.createElement(SyncGroupViewer, {
22223
- onClose: onClose,
22224
- isOpen: isOpenInStore,
22765
+ onClose: onCloseDialog,
22766
+ isOpen: isDialogOpen,
22225
22767
  syncGroupViewState: viewState,
22226
22768
  syncGroupAddTarget: syncGroupAddTarget,
22227
22769
  syncGroupRemoveTarget: syncGroupRemoveTarget,
22228
22770
  syncGroupAddGroup: syncGroupAddGroup,
22229
22771
  syncGroupRemoveGroup: syncGroupRemoveGroup,
22230
- order: uiOrder,
22231
- onMouseDown: onOrderDialog
22772
+ order: dialogOrder,
22773
+ onMouseDown: setDialogOrder
22232
22774
  });
22233
22775
  };
22234
22776
 
@@ -22369,57 +22911,6 @@ var testLayers = /*#__PURE__*/Object.freeze({
22369
22911
  simplePolygonGeoJSON: simplePolygonGeoJSON
22370
22912
  });
22371
22913
 
22372
- /* *
22373
- * Licensed under the Apache License, Version 2.0 (the "License");
22374
- * you may not use this file except in compliance with the License.
22375
- * You may obtain a copy of the License at
22376
- *
22377
- * http://www.apache.org/licenses/LICENSE-2.0
22378
- *
22379
- * Unless required by applicable law or agreed to in writing, software
22380
- * distributed under the License is distributed on an "AS IS" BASIS,
22381
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
22382
- * See the License for the specific language governing permissions and
22383
- * limitations under the License.
22384
- *
22385
- * Copyright 2021 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
22386
- * Copyright 2021 - Finnish Meteorological Institute (FMI)
22387
- * */
22388
- /**
22389
- * A Provider component which provides the GeoWeb theme
22390
- * @param children
22391
- * @returns
22392
- */
22393
-
22394
- var CoreThemeProvider = function CoreThemeProvider(_ref) {
22395
- var children = _ref.children,
22396
- _ref$theme = _ref.theme,
22397
- theme = _ref$theme === void 0 ? lightTheme : _ref$theme;
22398
- return /*#__PURE__*/React__default.createElement(ThemeWrapper, {
22399
- theme: theme
22400
- }, children);
22401
- };
22402
- /**
22403
- * A Provider component which provides the GeoWeb theme and store for the core.
22404
- * Note: Should only be used with core components, as the provided store is only for core.
22405
- * @param children
22406
- * @returns
22407
- */
22408
-
22409
- var CoreThemeStoreProvider = function CoreThemeStoreProvider(_ref2) {
22410
- var children = _ref2.children,
22411
- _ref2$theme = _ref2.theme,
22412
- theme = _ref2$theme === void 0 ? lightTheme : _ref2$theme,
22413
- store = _ref2.store;
22414
- return /*#__PURE__*/React__default.createElement(Provider, {
22415
- store: store
22416
- }, /*#__PURE__*/React__default.createElement(DynamicModuleLoader, {
22417
- modules: coreModuleConfig
22418
- }, /*#__PURE__*/React__default.createElement(CoreThemeProvider, {
22419
- theme: theme
22420
- }, children)));
22421
- };
22422
-
22423
22914
  /* *
22424
22915
  * Licensed under the Apache License, Version 2.0 (the "License");
22425
22916
  * you may not use this file except in compliance with the License.
@@ -22504,6 +22995,57 @@ var SnackbarWrapperConnect = function SnackbarWrapperConnect(_a) {
22504
22995
  }, props)));
22505
22996
  };
22506
22997
 
22998
+ /* *
22999
+ * Licensed under the Apache License, Version 2.0 (the "License");
23000
+ * you may not use this file except in compliance with the License.
23001
+ * You may obtain a copy of the License at
23002
+ *
23003
+ * http://www.apache.org/licenses/LICENSE-2.0
23004
+ *
23005
+ * Unless required by applicable law or agreed to in writing, software
23006
+ * distributed under the License is distributed on an "AS IS" BASIS,
23007
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
23008
+ * See the License for the specific language governing permissions and
23009
+ * limitations under the License.
23010
+ *
23011
+ * Copyright 2021 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
23012
+ * Copyright 2021 - Finnish Meteorological Institute (FMI)
23013
+ * */
23014
+ /**
23015
+ * A Provider component which provides the GeoWeb theme
23016
+ * @param children
23017
+ * @returns
23018
+ */
23019
+
23020
+ var CoreThemeProvider = function CoreThemeProvider(_ref) {
23021
+ var children = _ref.children,
23022
+ _ref$theme = _ref.theme,
23023
+ theme = _ref$theme === void 0 ? lightTheme : _ref$theme;
23024
+ return /*#__PURE__*/React__default.createElement(ThemeWrapper, {
23025
+ theme: theme
23026
+ }, children);
23027
+ };
23028
+ /**
23029
+ * A Provider component which provides the GeoWeb theme and store for the core.
23030
+ * Note: Should only be used with core components, as the provided store is only for core.
23031
+ * @param children
23032
+ * @returns
23033
+ */
23034
+
23035
+ var CoreThemeStoreProvider = function CoreThemeStoreProvider(_ref2) {
23036
+ var children = _ref2.children,
23037
+ _ref2$theme = _ref2.theme,
23038
+ theme = _ref2$theme === void 0 ? lightTheme : _ref2$theme,
23039
+ store = _ref2.store;
23040
+ return /*#__PURE__*/React__default.createElement(Provider, {
23041
+ store: store
23042
+ }, /*#__PURE__*/React__default.createElement(DynamicModuleLoader, {
23043
+ modules: coreModuleConfig
23044
+ }, /*#__PURE__*/React__default.createElement(CoreThemeProvider, {
23045
+ theme: theme
23046
+ }, /*#__PURE__*/React__default.createElement(SnackbarWrapperConnect, null, children))));
23047
+ };
23048
+
22507
23049
  /* *
22508
23050
  * Licensed under the Apache License, Version 2.0 (the "License");
22509
23051
  * you may not use this file except in compliance with the License.
@@ -22571,4 +23113,4 @@ var MapWarningProperties = function MapWarningProperties(_ref) {
22571
23113
  * */
22572
23114
  var mapActions = Object.assign(Object.assign(Object.assign({}, layerActions), mapActions$1), serviceActions);
22573
23115
 
22574
- export { ConfigurableMapConnect, CoreThemeProvider, CoreThemeStoreProvider, HarmonieTempAndPrecipPreset, LayerManagerConnect, LayerManagerMapButtonConnect, Legend, LegendConnect, LegendMapButtonConnect, MapControls, MapView, MapViewConnect, MapViewLayer, MapWarningProperties, MultiDimensionSelectMapButtonsConnect, MultiMapMultiDimensionSelectConnect as MultiMapDimensionSelectConnect, MultiMapViewConnect, ReactMapView, ReactMapViewLayer, SnackbarWrapperConnect, SyncGroupViewerConnect, index as SyncGroups, TimeSliderConnect, ZoomControlConnect, ZoomControls, componentsLookUp, coreModuleConfig, dateFormat, defaultBbox, defaultConfigurations, filterLayers, filterMapPresets, filterNonTimeDimensions, filterServices, generateLayerId, generateMapId, generateTimesliderId, getFirstTimeStepForLayerId, getInitialAppPresets, getLastTimeStepForLayerId, getNextTimeStepForLayerId, getPreviousTimeStepForLayerId, getWMJSDimensionForLayerAndDimension, getWMJSMapById, getWMJSTimeDimensionForLayerId, getWMLayerById, layerActions, reducer$6 as layerReducer, mapActions, moduleConfig as mapModuleConfig, selectors as mapSelectors, types$2 as mapTypes, utils as mapUtils, parseBoolean, parseLayer, publicLayers, publicServices, registerWMJSMap, registerWMLayer, snackbarActions, store, genericActions as syncGroupActions, synchronizationGroupConfig as synchronizationGroupModuleConfig, synchronizationGroupConfig as synchronizationGroupsConfig, testLayers, uiActions, uiModuleConfig, selectors$1 as uiSelectors, types as uiTypes };
23116
+ export { ConfigurableMapConnect, CoreThemeProvider, CoreThemeStoreProvider, HarmonieTempAndPrecipPreset, LayerManagerConnect, LayerManagerMapButtonConnect, Legend, LegendConnect, LegendMapButtonConnect, MapControls, MapView, MapViewConnect, MapViewLayer, MapWarningProperties, MultiDimensionSelectMapButtonsConnect, MultiMapMultiDimensionSelectConnect as MultiMapDimensionSelectConnect, MultiMapViewConnect, ReactMapView, ReactMapViewLayer, SnackbarWrapperConnect, SyncGroupViewerConnect, index as SyncGroups, TimeSliderConnect, ZoomControlConnect, ZoomControls, componentsLookUp, coreModuleConfig, dateFormat, defaultBbox, defaultConfigurations, filterLayers, filterMapPresets, filterNonTimeDimensions, filterServices, generateLayerId, generateMapId, generateTimesliderId, getFirstTimeStepForLayerId, getInitialAppPresets, getLastTimeStepForLayerId, getNextTimeStepForLayerId, getPreviousTimeStepForLayerId, getWMJSDimensionForLayerAndDimension, getWMJSMapById, getWMJSTimeDimensionForLayerId, getWMLayerById, layerActions, reducer$6 as layerReducer, mapActions, moduleConfig as mapModuleConfig, selectors as mapSelectors, types$2 as mapTypes, utils as mapUtils, parseBoolean, parseLayer, publicLayers, publicServices, registerWMJSMap, registerWMLayer, snackbarActions, store, genericActions as syncGroupActions, synchronizationGroupConfig as synchronizationGroupModuleConfig, synchronizationGroupConfig as synchronizationGroupsConfig, testLayers, uiActions, uiModuleConfig, selectors$1 as uiSelectors, types as uiTypes, useSetupDialog };