@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.umd.js CHANGED
@@ -1,8 +1,8 @@
1
1
  (function (global, factory) {
2
- typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@reduxjs/toolkit'), require('immer'), require('moment'), require('react'), require('lodash'), require('redux-saga/effects'), require('react-redux'), require('@mui/material'), require('@opengeoweb/shared'), require('@opengeoweb/theme'), require('@opengeoweb/webmap'), require('react-sortablejs'), require('react-window'), require('throttle-debounce'), require('lodash.clonedeep'), require('proj4'), require('@turf/turf'), require('redux-dynamic-modules'), require('redux-dynamic-modules-saga')) :
3
- typeof define === 'function' && define.amd ? define(['exports', '@reduxjs/toolkit', 'immer', 'moment', 'react', 'lodash', 'redux-saga/effects', 'react-redux', '@mui/material', '@opengeoweb/shared', '@opengeoweb/theme', '@opengeoweb/webmap', 'react-sortablejs', 'react-window', 'throttle-debounce', 'lodash.clonedeep', 'proj4', '@turf/turf', 'redux-dynamic-modules', 'redux-dynamic-modules-saga'], factory) :
4
- (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.Core = {}, global.toolkit, global.produce, global.moment, global.React, global._, global.effects, global.reactRedux, global.material, global.shared, global.theme, global.webmap, global.reactSortablejs, global.reactWindow, global.throttleDebounce, global.cloneDeep, global.proj4, global.turf, global.reduxDynamicModules, global.reduxDynamicModulesSaga));
5
- })(this, (function (exports, toolkit, produce, moment, React, _, effects, reactRedux, material, shared, theme, webmap, reactSortablejs, reactWindow, throttleDebounce, cloneDeep, proj4, turf, reduxDynamicModules, reduxDynamicModulesSaga) { 'use strict';
2
+ typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@reduxjs/toolkit'), require('immer'), require('moment'), require('react'), require('lodash'), require('redux-saga/effects'), require('react-redux'), require('@mui/material'), require('@opengeoweb/shared'), require('@opengeoweb/theme'), require('@opengeoweb/webmap'), require('react-sortablejs'), require('@opengeoweb/form-fields'), require('react-hook-form'), require('react-window'), require('@mui/material/Box'), require('@mui/material/Typography'), require('@mui/material/Grid'), require('throttle-debounce'), require('lodash.clonedeep'), require('proj4'), require('@turf/turf'), require('redux-dynamic-modules'), require('redux-dynamic-modules-saga')) :
3
+ typeof define === 'function' && define.amd ? define(['exports', '@reduxjs/toolkit', 'immer', 'moment', 'react', 'lodash', 'redux-saga/effects', 'react-redux', '@mui/material', '@opengeoweb/shared', '@opengeoweb/theme', '@opengeoweb/webmap', 'react-sortablejs', '@opengeoweb/form-fields', 'react-hook-form', 'react-window', '@mui/material/Box', '@mui/material/Typography', '@mui/material/Grid', 'throttle-debounce', 'lodash.clonedeep', 'proj4', '@turf/turf', 'redux-dynamic-modules', 'redux-dynamic-modules-saga'], factory) :
4
+ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.Core = {}, global.toolkit, global.produce, global.moment, global.React, global._, global.effects, global.reactRedux, global.material, global.shared, global.theme, global.webmap, global.reactSortablejs, global.formFields, global.reactHookForm, global.reactWindow, global.Box, global.Typography, global.Grid, global.throttleDebounce, global.cloneDeep, global.proj4, global.turf, global.reduxDynamicModules, global.reduxDynamicModulesSaga));
5
+ })(this, (function (exports, toolkit, produce, moment, React, _, effects, reactRedux, material, shared, theme, webmap, reactSortablejs, formFields, reactHookForm, reactWindow, Box, Typography, Grid, throttleDebounce, cloneDeep, proj4, turf, reduxDynamicModules, reduxDynamicModulesSaga) { 'use strict';
6
6
 
7
7
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
8
8
 
@@ -29,6 +29,9 @@
29
29
  var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
30
30
  var React__namespace = /*#__PURE__*/_interopNamespace(React);
31
31
  var ___default = /*#__PURE__*/_interopDefaultLegacy(_);
32
+ var Box__default = /*#__PURE__*/_interopDefaultLegacy(Box);
33
+ var Typography__default = /*#__PURE__*/_interopDefaultLegacy(Typography);
34
+ var Grid__default = /*#__PURE__*/_interopDefaultLegacy(Grid);
32
35
  var cloneDeep__default = /*#__PURE__*/_interopDefaultLegacy(cloneDeep);
33
36
  var proj4__default = /*#__PURE__*/_interopDefaultLegacy(proj4);
34
37
  var turf__namespace = /*#__PURE__*/_interopNamespace(turf);
@@ -1812,7 +1815,7 @@
1812
1815
  * @returns {array} returnType: Style[] - array containing layer styles
1813
1816
  */
1814
1817
 
1815
- var getLayerStyles = toolkit.createSelector(getLayerFromService, function (layer) {
1818
+ var getLayerStyles$1 = toolkit.createSelector(getLayerFromService, function (layer) {
1816
1819
  return layer && layer.styles ? layer.styles : [];
1817
1820
  }, selectorMemoizationOptions);
1818
1821
  /**
@@ -4296,10 +4299,18 @@
4296
4299
  byId: {},
4297
4300
  allIds: []
4298
4301
  },
4299
- keywords: {
4302
+ filters: {
4300
4303
  byId: {},
4301
4304
  allIds: []
4302
4305
  }
4306
+ },
4307
+ allServicesEnabled: true,
4308
+ activeLayerInfo: {
4309
+ name: '',
4310
+ text: '',
4311
+ leaf: true,
4312
+ path: [],
4313
+ serviceName: ''
4303
4314
  }
4304
4315
  };
4305
4316
  var slice$1 = toolkit.createSlice({
@@ -4310,65 +4321,71 @@
4310
4321
  var filterText = action.payload.filterText;
4311
4322
  draft.filters.searchFilter = filterText;
4312
4323
  },
4313
- addKeywordsAndActiveServices: function addKeywordsAndActiveServices(draft, action) {
4314
- var e_1, _a;
4315
-
4316
- var _b = action.payload,
4317
- serviceId = _b.serviceId,
4318
- serviceName = _b.serviceName,
4319
- serviceUrl = _b.serviceUrl,
4320
- keywords = _b.keywords,
4321
- isUserAddedService = _b.isUserAddedService;
4324
+ setAllServicesEnabled: function setAllServicesEnabled(draft, action) {
4325
+ var allServicesEnabled = action.payload.allServicesEnabled;
4326
+ draft.allServicesEnabled = allServicesEnabled;
4327
+ },
4328
+ addFiltersAndActiveServices: function addFiltersAndActiveServices(draft, action) {
4329
+ var _a = action.payload,
4330
+ serviceId = _a.serviceId,
4331
+ serviceName = _a.serviceName,
4332
+ serviceUrl = _a.serviceUrl,
4333
+ _abstract = _a["abstract"],
4334
+ keywords = _a.keywords,
4335
+ isUserAddedService = _a.isUserAddedService,
4336
+ groups = _a.groups;
4322
4337
 
4323
4338
  if (!draft.filters.activeServices.byId[serviceId]) {
4324
4339
  draft.filters.activeServices.byId[serviceId] = {};
4325
4340
 
4326
- try {
4327
- for (var keywords_1 = __values(keywords), keywords_1_1 = keywords_1.next(); !keywords_1_1.done; keywords_1_1 = keywords_1.next()) {
4328
- var keyword = keywords_1_1.value;
4341
+ var addFilters = function addFilters(filterNames, filterType) {
4342
+ filterNames.forEach(function (filterName) {
4343
+ var id = filterType + "-" + filterName;
4329
4344
 
4330
- if (!draft.filters.keywords.byId[keyword]) {
4331
- draft.filters.keywords.byId[keyword] = {
4332
- id: keyword,
4345
+ if (!draft.filters.filters.byId[id]) {
4346
+ draft.filters.filters.byId[id] = {
4347
+ id: id,
4348
+ name: filterName,
4333
4349
  amount: 1,
4334
4350
  amountVisible: 1,
4335
- checked: true
4351
+ checked: true,
4352
+ type: filterType
4336
4353
  };
4337
- draft.filters.keywords.allIds.push(keyword);
4354
+ draft.filters.filters.allIds.push(id);
4338
4355
  } else {
4339
- draft.filters.keywords.byId[keyword].amount += 1;
4340
- draft.filters.keywords.byId[keyword].amountVisible += 1;
4356
+ draft.filters.filters.byId[id].amount += 1;
4357
+ draft.filters.filters.byId[id].amountVisible += 1;
4341
4358
  }
4342
- }
4343
- } catch (e_1_1) {
4344
- e_1 = {
4345
- error: e_1_1
4346
- };
4347
- } finally {
4348
- try {
4349
- if (keywords_1_1 && !keywords_1_1.done && (_a = keywords_1["return"])) _a.call(keywords_1);
4350
- } finally {
4351
- if (e_1) throw e_1.error;
4352
- }
4353
- }
4359
+ });
4360
+ };
4361
+
4362
+ addFilters(groups, 'group');
4363
+ addFilters(keywords, 'keyword');
4354
4364
  }
4355
4365
 
4356
- draft.filters.activeServices.byId[serviceId].serviceName = serviceName;
4357
- draft.filters.activeServices.byId[serviceId].serviceUrl = serviceUrl;
4358
- draft.filters.activeServices.byId[serviceId].enabled = true;
4359
- draft.filters.activeServices.byId[serviceId].isUserAddedService = isUserAddedService;
4360
- draft.filters.activeServices.byId[serviceId].keywordsPerService = keywords;
4366
+ var filterIds = groups.map(function (group) {
4367
+ return "group-" + group;
4368
+ }).concat(keywords.map(function (keyword) {
4369
+ return "keyword-" + keyword;
4370
+ }));
4371
+ draft.filters.activeServices.byId[serviceId] = {
4372
+ serviceId: serviceId,
4373
+ enabled: draft.allServicesEnabled,
4374
+ filterIds: filterIds,
4375
+ isUserAddedService: isUserAddedService,
4376
+ serviceName: serviceName,
4377
+ serviceUrl: serviceUrl,
4378
+ "abstract": _abstract
4379
+ };
4361
4380
  if (!draft.filters.activeServices.allIds.includes(serviceId)) draft.filters.activeServices.allIds.push(serviceId);
4362
4381
  },
4363
- layerSelectServiceRemoved: function layerSelectServiceRemoved(draft, action) {
4364
- var e_2, _a;
4365
-
4382
+ layerSelectRemoveService: function layerSelectRemoveService(draft, action) {
4366
4383
  var serviceId = action.payload.serviceId; // 1. Find a service that is to be removed
4367
4384
 
4368
- var foundService = draft.filters.activeServices.byId[serviceId];
4385
+ var foundService = draft.filters.activeServices.byId[serviceId]; // 2. Go through all keywords for removed service, and decrement the amount of all found keywords
4369
4386
 
4370
- var _loop_1 = function _loop_1(keyword) {
4371
- var foundObject = draft.filters.keywords.byId[keyword];
4387
+ foundService.filterIds.forEach(function (filterId) {
4388
+ var foundObject = draft.filters.filters.byId[filterId];
4372
4389
 
4373
4390
  if (foundObject && foundObject.amount) {
4374
4391
  foundObject.amount -= 1;
@@ -4376,32 +4393,12 @@
4376
4393
  }
4377
4394
 
4378
4395
  if (foundObject && foundObject.amount === 0) {
4379
- delete draft.filters.keywords.byId[keyword];
4380
- draft.filters.keywords.allIds = draft.filters.keywords.allIds.filter(function (serviceId) {
4381
- return serviceId !== keyword;
4396
+ delete draft.filters.filters.byId[filterId];
4397
+ draft.filters.filters.allIds = draft.filters.filters.allIds.filter(function (serviceId) {
4398
+ return serviceId !== filterId;
4382
4399
  });
4383
4400
  }
4384
- };
4385
-
4386
- try {
4387
- // 2. Go through all keywords for removed service, and decrement the amount of all found keywords
4388
- for (var _b = __values(foundService.keywordsPerService), _c = _b.next(); !_c.done; _c = _b.next()) {
4389
- var keyword = _c.value;
4390
-
4391
- _loop_1(keyword);
4392
- }
4393
- } catch (e_2_1) {
4394
- e_2 = {
4395
- error: e_2_1
4396
- };
4397
- } finally {
4398
- try {
4399
- if (_c && !_c.done && (_a = _b["return"])) _a.call(_b);
4400
- } finally {
4401
- if (e_2) throw e_2.error;
4402
- }
4403
- } // Finally remove object from activeServices, so if the service is added again later on, new object and keywords will be re-added
4404
-
4401
+ }); // Finally remove object from activeServices, so if the service is added again later on, new object and keywords will be re-added
4405
4402
 
4406
4403
  delete draft.filters.activeServices.byId[serviceId];
4407
4404
  draft.filters.activeServices.allIds = draft.filters.activeServices.allIds.filter(function (id) {
@@ -4409,83 +4406,71 @@
4409
4406
  });
4410
4407
  },
4411
4408
  enableActiveService: function enableActiveService(draft, action) {
4412
- var e_3, _a;
4409
+ var e_1, _a;
4413
4410
 
4414
4411
  var _b = action.payload,
4415
4412
  serviceId = _b.serviceId,
4416
- keywords = _b.keywords;
4413
+ keywords = _b.filters;
4417
4414
  draft.filters.activeServices.byId[serviceId].enabled = true;
4418
4415
 
4419
4416
  try {
4420
- for (var keywords_2 = __values(keywords), keywords_2_1 = keywords_2.next(); !keywords_2_1.done; keywords_2_1 = keywords_2.next()) {
4421
- var keyword = keywords_2_1.value;
4422
- draft.filters.keywords.byId[keyword].amountVisible += 1;
4417
+ for (var keywords_1 = __values(keywords), keywords_1_1 = keywords_1.next(); !keywords_1_1.done; keywords_1_1 = keywords_1.next()) {
4418
+ var keyword = keywords_1_1.value;
4419
+ draft.filters.filters.byId[keyword].amountVisible += 1;
4423
4420
  }
4424
- } catch (e_3_1) {
4425
- e_3 = {
4426
- error: e_3_1
4421
+ } catch (e_1_1) {
4422
+ e_1 = {
4423
+ error: e_1_1
4427
4424
  };
4428
4425
  } finally {
4429
4426
  try {
4430
- if (keywords_2_1 && !keywords_2_1.done && (_a = keywords_2["return"])) _a.call(keywords_2);
4427
+ if (keywords_1_1 && !keywords_1_1.done && (_a = keywords_1["return"])) _a.call(keywords_1);
4431
4428
  } finally {
4432
- if (e_3) throw e_3.error;
4429
+ if (e_1) throw e_1.error;
4433
4430
  }
4434
4431
  }
4435
4432
  },
4436
4433
  disableActiveService: function disableActiveService(draft, action) {
4437
- var e_4, _a;
4434
+ var e_2, _a;
4438
4435
 
4439
4436
  var _b = action.payload,
4440
4437
  serviceId = _b.serviceId,
4441
- keywords = _b.keywords;
4438
+ keywords = _b.filters;
4442
4439
  draft.filters.activeServices.byId[serviceId].enabled = false;
4443
4440
 
4444
4441
  try {
4445
- for (var keywords_3 = __values(keywords), keywords_3_1 = keywords_3.next(); !keywords_3_1.done; keywords_3_1 = keywords_3.next()) {
4446
- var keyword = keywords_3_1.value;
4447
- draft.filters.keywords.byId[keyword].amountVisible -= 1;
4442
+ for (var keywords_2 = __values(keywords), keywords_2_1 = keywords_2.next(); !keywords_2_1.done; keywords_2_1 = keywords_2.next()) {
4443
+ var keyword = keywords_2_1.value;
4444
+ draft.filters.filters.byId[keyword].amountVisible -= 1;
4448
4445
  }
4449
- } catch (e_4_1) {
4450
- e_4 = {
4451
- error: e_4_1
4446
+ } catch (e_2_1) {
4447
+ e_2 = {
4448
+ error: e_2_1
4452
4449
  };
4453
4450
  } finally {
4454
4451
  try {
4455
- if (keywords_3_1 && !keywords_3_1.done && (_a = keywords_3["return"])) _a.call(keywords_3);
4452
+ if (keywords_2_1 && !keywords_2_1.done && (_a = keywords_2["return"])) _a.call(keywords_2);
4456
4453
  } finally {
4457
- if (e_4) throw e_4.error;
4454
+ if (e_2) throw e_2.error;
4458
4455
  }
4459
4456
  }
4460
4457
  },
4461
- toggleKeywords: function toggleKeywords(draft, action) {
4462
- var e_5, _a;
4463
-
4464
- var keywords = action.payload.keywords;
4465
-
4466
- try {
4467
- for (var keywords_4 = __values(keywords), keywords_4_1 = keywords_4.next(); !keywords_4_1.done; keywords_4_1 = keywords_4.next()) {
4468
- var keyword = keywords_4_1.value;
4469
- draft.filters.keywords.byId[keyword].checked = !draft.filters.keywords.byId[keyword].checked;
4470
- }
4471
- } catch (e_5_1) {
4472
- e_5 = {
4473
- error: e_5_1
4474
- };
4475
- } finally {
4476
- try {
4477
- if (keywords_4_1 && !keywords_4_1.done && (_a = keywords_4["return"])) _a.call(keywords_4);
4478
- } finally {
4479
- if (e_5) throw e_5.error;
4480
- }
4481
- }
4458
+ toggleFilter: function toggleFilter(draft, action) {
4459
+ var filterIds = action.payload.filterIds;
4460
+ filterIds.forEach(function (filterId) {
4461
+ draft.filters.filters.byId[filterId].checked = !draft.filters.filters.byId[filterId].checked;
4462
+ });
4482
4463
  },
4483
- enableOnlyOneKeyword: function enableOnlyOneKeyword(draft, action) {
4484
- var keyword = action.payload.keyword;
4485
- draft.filters.keywords.allIds.forEach(function (serviceId) {
4486
- draft.filters.keywords.byId[serviceId].checked = false;
4464
+ enableOnlyOneFilter: function enableOnlyOneFilter(draft, action) {
4465
+ var filterId = action.payload.filterId;
4466
+ draft.filters.filters.allIds.forEach(function (filterId) {
4467
+ draft.filters.filters.byId[filterId].checked = false;
4487
4468
  });
4488
- draft.filters.keywords.byId[keyword].checked = true;
4469
+ draft.filters.filters.byId[filterId].checked = true;
4470
+ },
4471
+ setActiveLayerInfo: function setActiveLayerInfo(draft, action) {
4472
+ var layer = action.payload.layer;
4473
+ draft.activeLayerInfo = layer;
4489
4474
  }
4490
4475
  }
4491
4476
  });
@@ -4537,6 +4522,21 @@
4537
4522
 
4538
4523
  return store ? (_a = store === null || store === void 0 ? void 0 : store.filters) === null || _a === void 0 ? void 0 : _a.activeServices.byId : {};
4539
4524
  }, selectorMemoizationOptions);
4525
+ /**
4526
+ * Returns active services by id
4527
+ *
4528
+ * Example getActiveServices(store, 'server-id');
4529
+ * @param {object} store store: object - store object
4530
+ * @param {serverId} serverId serverId: string - active server id
4531
+ * @returns {object} returnType: object of active service
4532
+ */
4533
+
4534
+ var getActiveServiceById = function getActiveServiceById(store, serviceId) {
4535
+ var _a, _b;
4536
+
4537
+ 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]) || {};
4538
+ return enabledServices;
4539
+ };
4540
4540
  /**
4541
4541
  * Returns all ids of enabled services
4542
4542
  *
@@ -4563,18 +4563,18 @@
4563
4563
  * @returns {array} returnType: array of keyword ids that are checked
4564
4564
  */
4565
4565
 
4566
- var getCheckedKeywordIds = toolkit.createSelector(layerSelectStore, function (store) {
4566
+ var getCheckedFilterIds = toolkit.createSelector(layerSelectStore, function (store) {
4567
4567
  var _a, _b;
4568
4568
 
4569
- 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) {
4570
- var _a;
4569
+ 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) {
4570
+ var _a, _b;
4571
4571
 
4572
- return (_a = store === null || store === void 0 ? void 0 : store.filters) === null || _a === void 0 ? void 0 : _a.keywords.byId[keyword].checked;
4572
+ 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;
4573
4573
  })) !== null && _b !== void 0 ? _b : [];
4574
- return checkedKeywords.map(function (keyword) {
4574
+ return checkedFilters.map(function (filterId) {
4575
4575
  var _a;
4576
4576
 
4577
- return (_a = store === null || store === void 0 ? void 0 : store.filters) === null || _a === void 0 ? void 0 : _a.keywords.byId[keyword].id;
4577
+ return (_a = store === null || store === void 0 ? void 0 : store.filters) === null || _a === void 0 ? void 0 : _a.filters.byId[filterId].id;
4578
4578
  });
4579
4579
  }, selectorMemoizationOptions);
4580
4580
  /**
@@ -4585,11 +4585,28 @@
4585
4585
  * @returns {array} returnType: array of all keyword ids
4586
4586
  */
4587
4587
 
4588
- var getAllKeywordIds = toolkit.createSelector(layerSelectStore, function (store) {
4588
+ var getAllFilterIds = toolkit.createSelector(layerSelectStore, function (store) {
4589
4589
  var _a, _b;
4590
4590
 
4591
- 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 : [];
4591
+ 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 : [];
4592
4592
  }, selectorMemoizationOptions);
4593
+ /**
4594
+ * Returns all filters
4595
+ *
4596
+ * Example getAllFilters(store);
4597
+ * @param {object} store store: object - store object
4598
+ * @returns {array} returnType: array of all filters
4599
+ */
4600
+
4601
+ var getAllFilters = toolkit.createSelector(layerSelectStore, function (store) {
4602
+ var filters = store === null || store === void 0 ? void 0 : store.filters.filters.byId;
4603
+
4604
+ if (filters) {
4605
+ return Object.values(filters);
4606
+ }
4607
+
4608
+ return [];
4609
+ });
4593
4610
  /**
4594
4611
  * Returns if all keywords are checked
4595
4612
  *
@@ -4598,29 +4615,26 @@
4598
4615
  * @returns {array} returnType: boolean if all keywords are checked
4599
4616
  */
4600
4617
 
4601
- var isAllKeywordsChecked = toolkit.createSelector(layerSelectStore, function (store) {
4618
+ var isAllFiltersChecked = toolkit.createSelector(layerSelectStore, function (store) {
4602
4619
  var _a, _b;
4603
4620
 
4604
- 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) {
4605
- var _a, _b;
4621
+ 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) {
4622
+ var _a, _b, _c;
4606
4623
 
4607
- 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;
4624
+ 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;
4608
4625
  });
4609
4626
  });
4610
4627
  /**
4611
- * Gets a KeywordObject by its id
4628
+ * Returns the active layer info
4612
4629
  *
4613
- * Example: keywordObject = getKeywordObjectById(store, 'keywordId')
4614
- * @param {object} store object from which the keyword state will be extracted
4615
- * @param {string} keywordId Id of the keyword
4616
- * @returns {object} object containing keyword information (id, amount, amountVisible, checked)
4630
+ * Example getActiveLayerInfo(store);
4631
+ * @param {object} store store: object - store object
4632
+ * @returns {object} returnType: ActiveLayerObject
4617
4633
  */
4618
4634
 
4619
- var getKeywordObjectById = function getKeywordObjectById(store, keywordId) {
4620
- var _a, _b, _c, _d;
4621
-
4622
- 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 : {};
4623
- };
4635
+ var getActiveLayerInfo = toolkit.createSelector(layerSelectStore, function (store) {
4636
+ return store === null || store === void 0 ? void 0 : store.activeLayerInfo;
4637
+ });
4624
4638
 
4625
4639
  /* *
4626
4640
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -4694,8 +4708,15 @@
4694
4708
  return currentMessages.length > 0 ? currentMessages[0] : undefined;
4695
4709
  });
4696
4710
 
4711
+ var DialogTypes;
4712
+
4713
+ (function (DialogTypes) {
4714
+ DialogTypes["LayerInfo"] = "layerInfo";
4715
+ })(DialogTypes || (DialogTypes = {}));
4716
+
4697
4717
  var types = /*#__PURE__*/Object.freeze({
4698
- __proto__: null
4718
+ __proto__: null,
4719
+ get DialogTypes () { return DialogTypes; }
4699
4720
  });
4700
4721
 
4701
4722
  /* *
@@ -6074,7 +6095,7 @@
6074
6095
  * Copyright 2020 - Finnish Meteorological Institute (FMI)
6075
6096
  * */
6076
6097
  var animationIntervalDefault = 5;
6077
- var connectRedux$6 = reactRedux.connect(function (store, props) {
6098
+ var connectRedux$5 = reactRedux.connect(function (store, props) {
6078
6099
  return {
6079
6100
  animationStartTime: getAnimationStartTime(store, props.mapId),
6080
6101
  animationEndTime: getAnimationEndTime(store, props.mapId),
@@ -6085,7 +6106,7 @@
6085
6106
  mapStartAnimation: mapActions$1.mapStartAnimation,
6086
6107
  mapStopAnimation: mapActions$1.mapStopAnimation
6087
6108
  });
6088
- var PlayButtonConnect = connectRedux$6(function (_a) {
6109
+ var PlayButtonConnect = connectRedux$5(function (_a) {
6089
6110
  var mapId = _a.mapId,
6090
6111
  animationStartTime = _a.animationStartTime,
6091
6112
  animationEndTime = _a.animationEndTime,
@@ -8448,34 +8469,6 @@
8448
8469
  return _typeof(obj);
8449
8470
  }
8450
8471
 
8451
- /* *
8452
- * Licensed under the Apache License, Version 2.0 (the "License");
8453
- * you may not use this file except in compliance with the License.
8454
- * You may obtain a copy of the License at
8455
- *
8456
- * http://www.apache.org/licenses/LICENSE-2.0
8457
- *
8458
- * Unless required by applicable law or agreed to in writing, software
8459
- * distributed under the License is distributed on an "AS IS" BASIS,
8460
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
8461
- * See the License for the specific language governing permissions and
8462
- * limitations under the License.
8463
- *
8464
- * Copyright 2022 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
8465
- * Copyright 2022 - Finnish Meteorological Institute (FMI)
8466
- * */
8467
- var mergePresetsAndUserAddedServices = function mergePresetsAndUserAddedServices(presets, userAddedServices) {
8468
- return Object.values(__assign(__assign({}, presets.reduce(function (byUrl, preset) {
8469
- var _a;
8470
-
8471
- return __assign(__assign({}, byUrl), (_a = {}, _a[preset.url] = preset, _a));
8472
- }, {})), userAddedServices));
8473
- };
8474
- var isNoIdService = function isNoIdService(param) {
8475
- var serviceParam = param;
8476
- return !!((serviceParam === null || serviceParam === void 0 ? void 0 : serviceParam.name) && (serviceParam === null || serviceParam === void 0 ? void 0 : serviceParam.url));
8477
- };
8478
-
8479
8472
  var getUserAddedServices = function getUserAddedServices() {
8480
8473
  try {
8481
8474
  var storedString = window.localStorage.getItem('userAddedServices');
@@ -8508,6 +8501,11 @@
8508
8501
  }
8509
8502
  };
8510
8503
 
8504
+ var isNoIdService = function isNoIdService(param) {
8505
+ var serviceParam = param;
8506
+ return !!((serviceParam === null || serviceParam === void 0 ? void 0 : serviceParam.name) && (serviceParam === null || serviceParam === void 0 ? void 0 : serviceParam.url));
8507
+ };
8508
+
8511
8509
  /* *
8512
8510
  * Licensed under the Apache License, Version 2.0 (the "License");
8513
8511
  * you may not use this file except in compliance with the License.
@@ -8525,23 +8523,41 @@
8525
8523
  * Copyright 2022 - Finnish Meteorological Institute (FMI)
8526
8524
  * */
8527
8525
  function newServiceAddedSaga(capturedAction) {
8528
- var addedService, id, serviceUrl, name, isUserAddedService, keywords;
8526
+ var addedService, id, serviceUrl, name, isUserAddedService, _abstract, keywords, groups;
8527
+
8529
8528
  return __generator(this, function (_a) {
8530
8529
  switch (_a.label) {
8531
8530
  case 0:
8532
8531
  addedService = capturedAction.payload;
8533
- id = addedService.id, serviceUrl = addedService.serviceUrl, name = addedService.name, isUserAddedService = addedService.isUserAddedService;
8534
- keywords = addedService.layers.reduce(function (keywordAccumulator, layer) {
8535
- return keywordAccumulator.concat(layer.path, layer.keywords);
8532
+ id = addedService.id, serviceUrl = addedService.serviceUrl, name = addedService.name, isUserAddedService = addedService.isUserAddedService, _abstract = addedService["abstract"];
8533
+ keywords = addedService.layers.reduce(function (keywords, layer) {
8534
+ var _a;
8535
+
8536
+ if (layer.leaf) {
8537
+ return keywords.concat((_a = layer.keywords) !== null && _a !== void 0 ? _a : []);
8538
+ }
8539
+
8540
+ return keywords;
8541
+ }, []);
8542
+ groups = addedService.layers.reduce(function (groups, layer) {
8543
+ var _a;
8544
+
8545
+ if (layer.leaf) {
8546
+ return groups.concat((_a = layer.path) !== null && _a !== void 0 ? _a : []);
8547
+ }
8548
+
8549
+ return groups;
8536
8550
  }, []);
8537
8551
  return [4
8538
8552
  /*yield*/
8539
- , effects.put(layerSelectActions.addKeywordsAndActiveServices({
8553
+ , effects.put(layerSelectActions.addFiltersAndActiveServices({
8540
8554
  serviceId: id,
8541
8555
  serviceName: name,
8542
8556
  serviceUrl: serviceUrl,
8543
8557
  keywords: keywords,
8544
- isUserAddedService: isUserAddedService
8558
+ isUserAddedService: isUserAddedService,
8559
+ groups: groups,
8560
+ "abstract": _abstract
8545
8561
  }))];
8546
8562
 
8547
8563
  case 1:
@@ -8553,20 +8569,53 @@
8553
8569
  }
8554
8570
  });
8555
8571
  }
8556
- function layerSelectServiceRemovedSaga(capturedAction) {
8557
- var removedService, serviceId;
8572
+ function layerSelectRemoveServiceSaga(capturedAction) {
8573
+ var removedService, serviceId, serviceUrl, results, services, servicesEnabled;
8558
8574
  return __generator(this, function (_a) {
8559
8575
  switch (_a.label) {
8560
8576
  case 0:
8561
8577
  removedService = capturedAction.payload;
8562
- serviceId = removedService.id;
8578
+ serviceId = removedService.serviceId, serviceUrl = removedService.serviceUrl;
8563
8579
  return [4
8564
8580
  /*yield*/
8565
- , effects.put(layerSelectActions.layerSelectServiceRemoved({
8566
- serviceId: serviceId
8567
- }))];
8581
+ , effects.select(getActiveServices)];
8568
8582
 
8569
8583
  case 1:
8584
+ results = _a.sent();
8585
+ services = results;
8586
+ servicesEnabled = Object.values(services).find(function (service) {
8587
+ return service.enabled;
8588
+ });
8589
+ if (!(servicesEnabled === undefined)) return [3
8590
+ /*break*/
8591
+ , 3];
8592
+ return [4
8593
+ /*yield*/
8594
+ , effects.all(Object.entries(services).map(function (_a) {
8595
+ var _b = __read(_a, 2),
8596
+ serviceId = _b[0],
8597
+ service = _b[1];
8598
+
8599
+ return effects.put(layerSelectActions.enableActiveService({
8600
+ serviceId: serviceId,
8601
+ filters: service.filterIds
8602
+ }));
8603
+ }))];
8604
+
8605
+ case 2:
8606
+ _a.sent();
8607
+
8608
+ _a.label = 3;
8609
+
8610
+ case 3:
8611
+ return [4
8612
+ /*yield*/
8613
+ , effects.put(serviceActions.mapStoreRemoveService({
8614
+ id: serviceId,
8615
+ serviceUrl: serviceUrl
8616
+ }))];
8617
+
8618
+ case 4:
8570
8619
  _a.sent();
8571
8620
 
8572
8621
  return [2
@@ -8581,12 +8630,14 @@
8581
8630
  var payload = _a.payload;
8582
8631
  var isUserAddedService = payload.isUserAddedService,
8583
8632
  name = payload.name,
8584
- serviceUrl = payload.serviceUrl;
8633
+ serviceUrl = payload.serviceUrl,
8634
+ _abstract2 = payload["abstract"];
8585
8635
  if (!isUserAddedService) return;
8586
8636
  var localStorageServices = getUserAddedServices();
8587
8637
  setUserAddedServices(__assign(__assign({}, localStorageServices), (_b = {}, _b[serviceUrl] = {
8588
8638
  name: name,
8589
- url: serviceUrl
8639
+ url: serviceUrl,
8640
+ "abstract": _abstract2
8590
8641
  }, _b)));
8591
8642
  }
8592
8643
  function removeServiceFromLocalStorageSaga(_a) {
@@ -8613,7 +8664,7 @@
8613
8664
 
8614
8665
  return [4
8615
8666
  /*yield*/
8616
- , effects.takeEvery(serviceActions.mapStoreRemoveService.type, layerSelectServiceRemovedSaga)];
8667
+ , effects.takeEvery(layerSelectActions.layerSelectRemoveService.type, layerSelectRemoveServiceSaga)];
8617
8668
 
8618
8669
  case 2:
8619
8670
  _a.sent();
@@ -8842,7 +8893,9 @@
8842
8893
  children: [],
8843
8894
  keywords: nodesToRecur.keywords || [],
8844
8895
  "abstract": nodesToRecur["abstract"] || '',
8845
- styles: nodesToRecur.styles || []
8896
+ styles: nodesToRecur.styles || [],
8897
+ dimensions: nodesToRecur.dimensions || [],
8898
+ geographicBoundingBox: nodesToRecur.geographicBoundingBox || null
8846
8899
  };
8847
8900
 
8848
8901
  if (nodesToRecur.children) {
@@ -9119,7 +9172,7 @@
9119
9172
  * Copyright 2020 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
9120
9173
  * Copyright 2020 - Finnish Meteorological Institute (FMI)
9121
9174
  * */
9122
- var connectRedux$5 = reactRedux.connect(function (store, props) {
9175
+ var connectRedux$4 = reactRedux.connect(function (store, props) {
9123
9176
  return {
9124
9177
  loadedLayers: getMapLayers(store, props.mapId)
9125
9178
  };
@@ -9183,7 +9236,7 @@
9183
9236
  });
9184
9237
  };
9185
9238
 
9186
- var WMSLayerTreeConnect = connectRedux$5(ConnectedTree);
9239
+ var WMSLayerTreeConnect = connectRedux$4(ConnectedTree);
9187
9240
 
9188
9241
  /* *
9189
9242
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -9391,7 +9444,7 @@
9391
9444
  * Copyright 2022 - Finnish Meteorological Institute (FMI)
9392
9445
  * */
9393
9446
 
9394
- var validateServiceUrl = function validateServiceUrl(url) {
9447
+ var validateServiceUrl$1 = function validateServiceUrl(url) {
9395
9448
  if (url === '' || url === null || typeof url === 'undefined') return false;
9396
9449
  var matcher = /^(?:\w+:)?\/\/([^\s.]+\.\S{2}|[0-9a-zA-Z]+[:?\d]*)\S*$/;
9397
9450
  if (!matcher.test(url)) return false;
@@ -9456,7 +9509,7 @@
9456
9509
  setServiceURL('');
9457
9510
  setUrlError('');
9458
9511
  setLoading(false); // Check if valid URL was passed
9459
- } else if (validateServiceUrl(serviceURL)) {
9512
+ } else if (validateServiceUrl$1(serviceURL)) {
9460
9513
  // Check if service is WMS server
9461
9514
  getLayersFromService(serviceURL).then(function (layerTreeFromPromise) {
9462
9515
  // Shorten URL as a naming backup
@@ -10180,7 +10233,7 @@
10180
10233
  * Copyright 2022 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
10181
10234
  * Copyright 2022 - Finnish Meteorological Institute (FMI)
10182
10235
  * */
10183
- var marks$1 = [{
10236
+ var marks$2 = [{
10184
10237
  value: 0,
10185
10238
  label: '0 %'
10186
10239
  }, {
@@ -10305,7 +10358,7 @@
10305
10358
  step: 0.01,
10306
10359
  max: 1,
10307
10360
  min: 0,
10308
- marks: marks$1,
10361
+ marks: marks$2,
10309
10362
  onChange: function onChange(event, newValue) {
10310
10363
  event.stopPropagation();
10311
10364
  onLayerChangeOpacity(newValue);
@@ -10863,7 +10916,7 @@
10863
10916
  return getLayerName(store, layerId);
10864
10917
  });
10865
10918
  var layerStyles = reactRedux.useSelector(function (store) {
10866
- return getLayerStyles(store, layerService, layerName);
10919
+ return getLayerStyles$1(store, layerService, layerName);
10867
10920
  });
10868
10921
  var currentLayerStyle = reactRedux.useSelector(function (store) {
10869
10922
  return getLayerStyle(store, layerId);
@@ -11598,6 +11651,16 @@
11598
11651
  boxSizing: 'border-box'
11599
11652
  }
11600
11653
  };
11654
+ var calculateStartSize = function calculateStartSize(minSize, prefSize, startPosition) {
11655
+ var _a = shared.calculateDialogSizeAndPosition(),
11656
+ calcWidth = _a.width,
11657
+ calcHeight = _a.height;
11658
+
11659
+ return {
11660
+ width: Math.max(minSize.width, Math.min(prefSize.width, calcWidth)),
11661
+ height: Math.max(minSize.height, Math.min(prefSize.height, calcHeight - startPosition.top))
11662
+ };
11663
+ };
11601
11664
 
11602
11665
  var LayerManager = function LayerManager(_a) {
11603
11666
  var mapId = _a.mapId,
@@ -11623,8 +11686,21 @@
11623
11686
  _h = _a.isLoading,
11624
11687
  isLoading = _h === void 0 ? false : _h,
11625
11688
  error = _a.error;
11689
+ var minSize = {
11690
+ width: 300,
11691
+ height: 126
11692
+ };
11693
+ var prefSize = {
11694
+ width: 720,
11695
+ height: 300
11696
+ };
11697
+ var startPosition = {
11698
+ top: 96,
11699
+ left: 50
11700
+ };
11701
+ var startSize = calculateStartSize(minSize, prefSize, startPosition);
11626
11702
 
11627
- var _j = __read(React__namespace.useState(LayerManagerWidth.lg), 2),
11703
+ var _j = __read(React__namespace.useState(widthToWidthClass(startSize.width)), 2),
11628
11704
  layerManagerWidth = _j[0],
11629
11705
  setLayerManagerWidth = _j[1];
11630
11706
 
@@ -11635,16 +11711,10 @@
11635
11711
 
11636
11712
  return /*#__PURE__*/React__namespace.createElement(shared.ToolContainerDraggable, {
11637
11713
  title: showTitle ? "Layer Manager " + mapId : 'Layer Manager',
11638
- startSize: {
11639
- width: 720,
11640
- height: 300
11641
- },
11642
- minWidth: 300,
11643
- minHeight: 126,
11644
- startPosition: {
11645
- top: 96,
11646
- left: 50
11647
- },
11714
+ startSize: startSize,
11715
+ minWidth: minSize.width,
11716
+ minHeight: minSize.height,
11717
+ startPosition: startPosition,
11648
11718
  isOpen: isOpen,
11649
11719
  onChangeSize: onChangeSize,
11650
11720
  onClose: onClose,
@@ -11755,124 +11825,267 @@
11755
11825
  * Copyright 2021 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
11756
11826
  * Copyright 2021 - Finnish Meteorological Institute (FMI)
11757
11827
  * */
11758
- var style$1 = {
11759
- dialogTitle: {
11760
- display: 'flex',
11761
- justifyContent: 'space-between',
11762
- padding: '16px 16px 20px 16px',
11763
- ' span': {
11764
- fontSize: '2.125rem'
11828
+ var isURL = function isURL(string) {
11829
+ return /^https?:\/\//.test(string);
11830
+ };
11831
+
11832
+ var SearchFieldButtonContainer = function SearchFieldButtonContainer(_a) {
11833
+ var localSearchString = _a.localSearchString,
11834
+ onClickClear = _a.onClickClear,
11835
+ setPopupIsOpen = _a.setPopupIsOpen;
11836
+
11837
+ var ClearButton = function ClearButton() {
11838
+ return /*#__PURE__*/React__default["default"].createElement(material.Tooltip, {
11839
+ title: "Clear",
11840
+ placement: "top"
11841
+ }, /*#__PURE__*/React__default["default"].createElement(material.IconButton, {
11842
+ edge: "end",
11843
+ onClick: function onClick() {
11844
+ onClickClear();
11845
+ },
11846
+ size: "large"
11847
+ }, /*#__PURE__*/React__default["default"].createElement(theme.Clear, null)));
11848
+ };
11849
+
11850
+ if (isURL(localSearchString)) return /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null, /*#__PURE__*/React__default["default"].createElement("div", {
11851
+ style: {
11852
+ marginRight: '15px'
11765
11853
  }
11766
- },
11767
- container: function container(theme) {
11768
- return {
11769
- '& .MuiDialog-paper': {
11770
- backgroundColor: theme.palette.geowebColors.cards.cardContainer
11771
- }
11772
- };
11773
- },
11774
- closeBtn: function closeBtn(theme) {
11775
- return {
11776
- color: theme.palette.geowebColors.captions.captionDisabled.color,
11777
- marginTop: 'auto',
11778
- marginBottom: 'auto'
11779
- };
11780
- },
11781
- textField: {
11782
- width: '100%'
11783
- },
11784
- dialogContent: {
11785
- padding: '8px 16px'
11786
- },
11787
- footerContent: {
11788
- padding: '16px'
11854
+ }, /*#__PURE__*/React__default["default"].createElement(ClearButton, null)), /*#__PURE__*/React__default["default"].createElement(material.Button, {
11855
+ variant: "tertiary",
11856
+ onClick: function onClick() {
11857
+ return setPopupIsOpen(true);
11858
+ }
11859
+ }, "Save"));
11860
+ if (localSearchString) return /*#__PURE__*/React__default["default"].createElement(ClearButton, null);
11861
+ return /*#__PURE__*/React__default["default"].createElement(material.Tooltip, {
11862
+ title: "Search",
11863
+ placement: "top"
11864
+ }, /*#__PURE__*/React__default["default"].createElement(material.IconButton, {
11865
+ edge: "end",
11866
+ size: "large"
11867
+ }, /*#__PURE__*/React__default["default"].createElement(theme.Search, null)));
11868
+ };
11869
+
11870
+ /* *
11871
+ * Licensed under the Apache License, Version 2.0 (the "License");
11872
+ * you may not use this file except in compliance with the License.
11873
+ * You may obtain a copy of the License at
11874
+ *
11875
+ * http://www.apache.org/licenses/LICENSE-2.0
11876
+ *
11877
+ * Unless required by applicable law or agreed to in writing, software
11878
+ * distributed under the License is distributed on an "AS IS" BASIS,
11879
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11880
+ * See the License for the specific language governing permissions and
11881
+ * limitations under the License.
11882
+ *
11883
+ * Copyright 2022 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
11884
+ * Copyright 2022 - Finnish Meteorological Institute (FMI)
11885
+ * */
11886
+ var VALIDATIONS_NAME_EXISTING = 'This name already exists. Choose another name.';
11887
+ var VALIDATIONS_SERVICE_EXISTING = 'URL already exists.';
11888
+ var VALIDATIONS_SERVICE_VALID_URL = 'Not a valid URL.';
11889
+ var VALIDATIONS_REQUEST_FAILED = 'Download failed. Check the URL.';
11890
+ var validateServiceName = function validateServiceName(value, services, ownServiceName) {
11891
+ if (ownServiceName === void 0) {
11892
+ ownServiceName = '';
11789
11893
  }
11894
+
11895
+ var serviceName = value === null || value === void 0 ? void 0 : value.toLowerCase();
11896
+ var foundName = Object.keys(services).find(function (serviceId) {
11897
+ return services[serviceId].serviceName.toLowerCase() === serviceName && serviceName !== ownServiceName.toLocaleLowerCase();
11898
+ });
11899
+ return foundName === undefined ? true : VALIDATIONS_NAME_EXISTING;
11790
11900
  };
11791
- var ADD_HEADING = 'Add a new service';
11792
- var EDIT_HEADING = 'Edit service';
11793
- var SAVE_HEADING = 'Save service';
11794
11901
 
11795
- var getTitleForVariant = function getTitleForVariant(variant) {
11796
- switch (variant) {
11797
- case 'add':
11798
- return ADD_HEADING;
11902
+ var isValidUrl = function isValidUrl(url) {
11903
+ if (url === '' || url === null || typeof url === 'undefined') {
11904
+ return false;
11905
+ }
11799
11906
 
11800
- case 'edit':
11801
- return EDIT_HEADING;
11907
+ var matcher = /^(?:\w+:)?\/\/([^\s.]+\.\S{2}|[0-9a-zA-Z]+[:?\d]*)\S*$/;
11802
11908
 
11803
- default:
11804
- return SAVE_HEADING;
11909
+ if (!matcher.test(url)) {
11910
+ return false;
11805
11911
  }
11912
+
11913
+ return true;
11806
11914
  };
11807
11915
 
11808
- var ServicePopup = function ServicePopup(_a) {
11809
- var servicePopupVariant = _a.servicePopupVariant,
11810
- _b = _a.hideBackdrop,
11811
- hideBackdrop = _b === void 0 ? false : _b,
11812
- isOpen = _a.isOpen,
11813
- closePopup = _a.closePopup,
11814
- serviceId = _a.serviceId,
11815
- url = _a.url,
11816
- services = _a.services,
11817
- serviceSetLayers = _a.serviceSetLayers;
11916
+ var validateServiceUrl = function validateServiceUrl(value, services) {
11917
+ var serviceUrl = value; // validate valid url
11818
11918
 
11819
- var _c = __read(React__namespace.useState(''), 2),
11820
- serviceName = _c[0],
11821
- setServiceName = _c[1];
11919
+ var isServiceUrlValid = isValidUrl(serviceUrl);
11822
11920
 
11823
- var _d = __read(React__namespace.useState(''), 2),
11824
- serviceUrl = _d[0],
11825
- setServiceUrl = _d[1];
11921
+ if (!isServiceUrlValid) {
11922
+ return VALIDATIONS_SERVICE_VALID_URL;
11923
+ } // check url existing
11826
11924
 
11827
- var _e = __read(React__namespace.useState(''), 2),
11828
- _abstract = _e[0],
11829
- setAbstract = _e[1];
11830
11925
 
11831
- var _f = __read(React__namespace.useState(false), 2),
11832
- disableButton = _f[0],
11833
- setDisableButton = _f[1];
11926
+ var foundUrl = Object.keys(services).find(function (serviceId) {
11927
+ return services[serviceId].serviceUrl === serviceUrl;
11928
+ });
11834
11929
 
11835
- var _g = __read(React__namespace.useState(false), 2),
11836
- isLoading = _g[0],
11837
- setIsLoading = _g[1];
11930
+ if (foundUrl) {
11931
+ return VALIDATIONS_SERVICE_EXISTING;
11932
+ }
11838
11933
 
11839
- var _h = __read(React__namespace.useState(false), 2),
11840
- serviceNameHasError = _h[0],
11841
- setServiceNameHasError = _h[1];
11934
+ return true;
11935
+ };
11842
11936
 
11843
- var _j = __read(React__namespace.useState(''), 2),
11844
- serviceNameHelperText = _j[0],
11845
- setServiceNameHelperText = _j[1];
11937
+ /* *
11938
+ * Licensed under the Apache License, Version 2.0 (the "License");
11939
+ * you may not use this file except in compliance with the License.
11940
+ * You may obtain a copy of the License at
11941
+ *
11942
+ * http://www.apache.org/licenses/LICENSE-2.0
11943
+ *
11944
+ * Unless required by applicable law or agreed to in writing, software
11945
+ * distributed under the License is distributed on an "AS IS" BASIS,
11946
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11947
+ * See the License for the specific language governing permissions and
11948
+ * limitations under the License.
11949
+ *
11950
+ * Copyright 2022 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
11951
+ * Copyright 2022 - Finnish Meteorological Institute (FMI)
11952
+ * */
11953
+ var style$1 = {
11954
+ textField: {
11955
+ width: '100%',
11956
+ marginBottom: 2
11957
+ }
11958
+ };
11959
+ var ADD_HEADING = 'Add a new service';
11960
+ var EDIT_HEADING = 'Edit service';
11961
+ var SAVE_HEADING = 'Save service';
11962
+ var COPY_URL_MESSAGE = 'Service URL copied to clipboard';
11963
+ var getSuccesMessage = function getSuccesMessage(serviceName) {
11964
+ return "Service \"" + serviceName + "\" has been saved succesfully";
11965
+ };
11846
11966
 
11847
- var _k = __read(React__namespace.useState(false), 2),
11848
- serviceUrlHasError = _k[0],
11849
- setServiceUrlHasError = _k[1];
11967
+ var getTitleForVariant = function getTitleForVariant(variant) {
11968
+ switch (variant) {
11969
+ case 'add':
11970
+ return ADD_HEADING;
11971
+
11972
+ case 'edit':
11973
+ return EDIT_HEADING;
11974
+
11975
+ case 'save':
11976
+ return SAVE_HEADING;
11977
+
11978
+ default:
11979
+ return 'Service';
11980
+ }
11981
+ };
11850
11982
 
11851
- var _l = __read(React__namespace.useState(''), 2),
11852
- serviceUrlHelperText = _l[0],
11853
- setServiceUrlHelperText = _l[1];
11983
+ var fields = {
11984
+ serviceUrl: {
11985
+ name: 'serviceUrl',
11986
+ label: 'This service refers to this URL'
11987
+ },
11988
+ serviceName: {
11989
+ name: 'serviceName',
11990
+ label: 'Service name'
11991
+ },
11992
+ serviceAbstracts: {
11993
+ name: 'serviceAbstracts',
11994
+ label: 'Abstracts'
11995
+ }
11996
+ };
11854
11997
 
11998
+ var InitialValidationsTrigger = function InitialValidationsTrigger(_a) {
11999
+ var trigger = _a.trigger,
12000
+ getValues = _a.getValues,
12001
+ onValidField = _a.onValidField;
11855
12002
  React__namespace.useEffect(function () {
11856
- var _a;
12003
+ var value = getValues(fields.serviceUrl.name);
11857
12004
 
11858
- if (servicePopupVariant === 'edit') {
11859
- setServiceName(((_a = services[serviceId]) === null || _a === void 0 ? void 0 : _a.serviceName) || '');
11860
- setServiceUrl(url || '');
11861
- }
12005
+ if (value) {
12006
+ trigger(fields.serviceUrl.name).then(function (isValid) {
12007
+ return isValid && onValidField(value);
12008
+ });
12009
+ } // eslint-disable-next-line react-hooks/exhaustive-deps
11862
12010
 
11863
- if (servicePopupVariant === 'save') {
11864
- setServiceUrl(url || '');
11865
- }
11866
- }, [serviceId, services, url, servicePopupVariant, isOpen]);
12011
+ }, []);
12012
+ return null;
12013
+ };
11867
12014
 
11868
- var validateServiceUrl = function validateServiceUrl(url) {
11869
- if (url === '' || url === null || typeof url === 'undefined') return false;
11870
- var matcher = /^(?:\w+:)?\/\/([^\s.]+\.\S{2}|[0-9a-zA-Z]+[:?\d]*)\S*$/;
11871
- if (!matcher.test(url)) return false;
11872
- return true;
12015
+ var ServicePopup = function ServicePopup(_a) {
12016
+ var servicePopupVariant = _a.servicePopupVariant,
12017
+ _b = _a.hideBackdrop,
12018
+ hideBackdrop = _b === void 0 ? false : _b,
12019
+ isOpen = _a.isOpen,
12020
+ closePopup = _a.closePopup,
12021
+ services = _a.services,
12022
+ serviceSetLayers = _a.serviceSetLayers,
12023
+ serviceUrl = _a.serviceUrl,
12024
+ serviceName = _a.serviceName,
12025
+ serviceAbstracts = _a.serviceAbstracts,
12026
+ _c = _a.showSnackbar,
12027
+ showSnackbar = _c === void 0 ? function () {} : _c;
12028
+
12029
+ var _d = reactHookForm.useFormContext(),
12030
+ reset = _d.reset,
12031
+ errors = _d.formState.errors,
12032
+ handleSubmit = _d.handleSubmit,
12033
+ setError = _d.setError,
12034
+ clearErrors = _d.clearErrors,
12035
+ watch = _d.watch,
12036
+ trigger = _d.trigger,
12037
+ getValues = _d.getValues,
12038
+ setValue = _d.setValue;
12039
+
12040
+ var _e = __read(React__namespace.useState(false), 2),
12041
+ isLoading = _e[0],
12042
+ setIsLoading = _e[1];
12043
+
12044
+ var fetchServiceData = function fetchServiceData(newServiceUrl) {
12045
+ return __awaiter(void 0, void 0, void 0, function () {
12046
+ var service;
12047
+ return __generator(this, function (_a) {
12048
+ switch (_a.label) {
12049
+ case 0:
12050
+ _a.trys.push([0, 2,, 3]);
12051
+
12052
+ setIsLoading(true);
12053
+ return [4
12054
+ /*yield*/
12055
+ , getLayersFromService(newServiceUrl)];
12056
+
12057
+ case 1:
12058
+ _a.sent();
12059
+
12060
+ service = webmap.WMGetServiceFromStore(newServiceUrl);
12061
+ setValue(fields.serviceName.name, service.title);
12062
+ setValue(fields.serviceAbstracts.name, service["abstract"]);
12063
+ setIsLoading(false);
12064
+ return [3
12065
+ /*break*/
12066
+ , 3];
12067
+
12068
+ case 2:
12069
+ _a.sent();
12070
+ setIsLoading(false);
12071
+ setError(fields.serviceUrl.name, {
12072
+ message: VALIDATIONS_REQUEST_FAILED,
12073
+ type: 'SYSTEM'
12074
+ });
12075
+ return [3
12076
+ /*break*/
12077
+ , 3];
12078
+
12079
+ case 3:
12080
+ return [2
12081
+ /*return*/
12082
+ ];
12083
+ }
12084
+ });
12085
+ });
11873
12086
  };
11874
12087
 
11875
- var addNewService = function addNewService() {
12088
+ var addNewService = function addNewService(formValues) {
11876
12089
  return __awaiter(void 0, void 0, void 0, function () {
11877
12090
  var layers, serviceLayers, _a, _b, object, service;
11878
12091
 
@@ -11881,10 +12094,7 @@
11881
12094
  return __generator(this, function (_d) {
11882
12095
  switch (_d.label) {
11883
12096
  case 0:
11884
- setServiceUrlHasError(false);
11885
- if (!validateServiceUrl(serviceUrl)) return [3
11886
- /*break*/
11887
- , 4];
12097
+ clearErrors(fields.serviceUrl.name);
11888
12098
  setIsLoading(true);
11889
12099
  _d.label = 1;
11890
12100
 
@@ -11893,7 +12103,7 @@
11893
12103
 
11894
12104
  return [4
11895
12105
  /*yield*/
11896
- , getLayersFromService(serviceUrl)];
12106
+ , getLayersFromService(formValues.serviceUrl)];
11897
12107
 
11898
12108
  case 2:
11899
12109
  layers = _d.sent();
@@ -11911,7 +12121,9 @@
11911
12121
  path: object.path,
11912
12122
  keywords: object.keywords ? object.keywords : [],
11913
12123
  "abstract": object["abstract"] ? object["abstract"] : '',
11914
- styles: object.styles ? object.styles : []
12124
+ styles: object.styles ? object.styles : [],
12125
+ dimensions: object.dimensions || [],
12126
+ geographicBoundingBox: object.geographicBoundingBox || null
11915
12127
  });
11916
12128
  }
11917
12129
  } catch (e_1_1) {
@@ -11926,16 +12138,18 @@
11926
12138
  }
11927
12139
  }
11928
12140
 
11929
- service = webmap.WMGetServiceFromStore(serviceUrl);
12141
+ service = webmap.WMGetServiceFromStore(formValues.serviceUrl);
11930
12142
  serviceSetLayers({
11931
12143
  id: service.id,
11932
- name: serviceName,
11933
- serviceUrl: serviceUrl,
12144
+ name: formValues.serviceName,
12145
+ serviceUrl: formValues.serviceUrl,
12146
+ "abstract": formValues.serviceAbstracts,
11934
12147
  layers: serviceLayers,
11935
12148
  isUserAddedService: true
11936
12149
  });
11937
12150
  setIsLoading(false);
11938
- closePopupAndResetState();
12151
+ showSnackbar(getSuccesMessage(formValues.serviceName));
12152
+ closePopup();
11939
12153
  }
11940
12154
 
11941
12155
  return [3
@@ -11945,8 +12159,10 @@
11945
12159
  case 3:
11946
12160
  _d.sent();
11947
12161
  setIsLoading(false);
11948
- setServiceUrlHasError(true);
11949
- setServiceUrlHelperText('Error: Download failed. Check the URL.');
12162
+ setError(fields.serviceUrl.name, {
12163
+ message: VALIDATIONS_REQUEST_FAILED,
12164
+ type: 'SYSTEM'
12165
+ });
11950
12166
  return [3
11951
12167
  /*break*/
11952
12168
  , 4];
@@ -11960,166 +12176,216 @@
11960
12176
  });
11961
12177
  };
11962
12178
 
11963
- var ServiceNameInRedux = function ServiceNameInRedux() {
11964
- if (servicePopupVariant === 'add' || servicePopupVariant === 'save') {
11965
- var foundName = Object.keys(services).find(function (serviceId) {
11966
- return services[serviceId].serviceName.toLowerCase() === (serviceName === null || serviceName === void 0 ? void 0 : serviceName.toLowerCase());
11967
- });
11968
- return foundName !== undefined;
11969
- }
11970
-
11971
- return false;
12179
+ var onValidateServiceUrl = function onValidateServiceUrl(value) {
12180
+ return validateServiceUrl(value, services);
11972
12181
  };
11973
12182
 
11974
- var UrlInRedux = function UrlInRedux() {
11975
- if (servicePopupVariant === 'add' || servicePopupVariant === 'save') {
11976
- var foundUrl = Object.keys(services).find(function (serviceId) {
11977
- return services[serviceId].serviceUrl === serviceUrl;
11978
- });
11979
- return foundUrl !== undefined;
12183
+ var onFocusServiceUrl = function onFocusServiceUrl() {
12184
+ if (!errors[fields.serviceUrl.name]) {
12185
+ trigger(fields.serviceUrl.name);
11980
12186
  }
12187
+ };
11981
12188
 
11982
- return false;
11983
- }; // Check serviceName
11984
-
12189
+ var onBlurServiceUrl = function onBlurServiceUrl() {
12190
+ if (!errors[fields.serviceUrl.name]) {
12191
+ fetchServiceData(getValues(fields.serviceUrl.name));
12192
+ }
12193
+ };
11985
12194
 
11986
- React__namespace.useEffect(function () {
11987
- if (serviceName === undefined) return;
11988
- setServiceNameHelperText('');
12195
+ var onValidateServiceName = function onValidateServiceName(value) {
12196
+ return validateServiceName(value, services, serviceName);
12197
+ };
11989
12198
 
11990
- if (ServiceNameInRedux()) {
11991
- setServiceNameHasError(true);
11992
- setServiceNameHelperText('Error: This name already exists. Choose another name.');
11993
- } else {
11994
- setServiceNameHasError(false);
11995
- setServiceNameHelperText('');
11996
- } // eslint-disable-next-line react-hooks/exhaustive-deps
12199
+ var getFormAreRequiredFieldsEmpty = function getFormAreRequiredFieldsEmpty() {
12200
+ var serviceNameField = watch(fields.serviceName.name);
12201
+ var serviceUrlField = watch(fields.serviceUrl.name);
12202
+ return serviceNameField === '' || serviceNameField === undefined || serviceUrlField === '' || serviceUrlField === undefined;
12203
+ };
11997
12204
 
11998
- }, [serviceName]); // Check Url
12205
+ var getFormHasformErrors = function getFormHasformErrors() {
12206
+ var totalErrors = Object.keys(errors).length;
11999
12207
 
12000
- React__namespace.useEffect(function () {
12001
- setServiceUrlHelperText('');
12002
-
12003
- if (serviceUrl && serviceUrl.length > 0 && !validateServiceUrl(serviceUrl)) {
12004
- setServiceUrlHasError(true);
12005
- setServiceUrlHelperText('Error: Not a valid URL.');
12006
- } else if (UrlInRedux()) {
12007
- setServiceUrlHasError(true);
12008
- setServiceUrlHelperText('Error: URL already exists.');
12009
- } else {
12010
- setServiceUrlHasError(false);
12011
- setServiceNameHelperText('');
12012
- } // eslint-disable-next-line react-hooks/exhaustive-deps
12208
+ if (totalErrors > 0) {
12209
+ // prevent SYSTEM error types from blocking the save button
12210
+ if (totalErrors === 1 && errors.serviceUrl) {
12211
+ return errors.serviceUrl.type !== undefined && errors.serviceUrl.type !== 'SYSTEM';
12212
+ }
12013
12213
 
12014
- }, [serviceUrl]); // Check if all fields are valid
12214
+ return true;
12215
+ }
12015
12216
 
12016
- React__namespace.useEffect(function () {
12017
- if (!serviceNameHasError && !serviceUrlHasError && validateServiceUrl(serviceUrl) && serviceName.length > 0) {
12018
- setDisableButton(false);
12019
- } else setDisableButton(true);
12020
- }, [serviceNameHasError, serviceUrlHasError, serviceName, serviceUrl]);
12021
-
12022
- var closePopupAndResetState = function closePopupAndResetState() {
12023
- setServiceName('');
12024
- setServiceUrl('');
12025
- setAbstract('');
12026
- closePopup();
12217
+ return false;
12027
12218
  };
12028
12219
 
12220
+ var isSubmitDisabled = getFormHasformErrors() || getFormAreRequiredFieldsEmpty();
12221
+ React__namespace.useEffect(function () {
12222
+ reset({
12223
+ serviceUrl: serviceUrl,
12224
+ serviceName: serviceName,
12225
+ serviceAbstracts: serviceAbstracts
12226
+ });
12227
+ }, [serviceUrl, serviceName, serviceAbstracts, reset]);
12228
+ var isShowPopup = servicePopupVariant === 'show';
12229
+ var isServiceUrlDisabled = isShowPopup || servicePopupVariant === 'edit';
12029
12230
  return /*#__PURE__*/React__namespace.createElement(material.Dialog, {
12030
12231
  open: isOpen,
12031
12232
  hideBackdrop: hideBackdrop,
12032
12233
  fullWidth: true,
12033
12234
  maxWidth: "xs",
12034
12235
  "data-testid": "servicePopup",
12035
- sx: style$1.container
12236
+ sx: {
12237
+ '& .MuiDialog-paper': {
12238
+ backgroundColor: "geowebColors.cards.cardContainer",
12239
+ maxWidth: 458
12240
+ }
12241
+ }
12242
+ }, /*#__PURE__*/React__namespace.createElement("form", {
12243
+ onSubmit: handleSubmit(addNewService)
12036
12244
  }, /*#__PURE__*/React__namespace.createElement(material.DialogTitle, {
12037
- sx: style$1.dialogTitle
12245
+ sx: {
12246
+ alignItems: 'center',
12247
+ padding: '16px 16px 24px 16px'
12248
+ }
12249
+ }, /*#__PURE__*/React__namespace.createElement(material.Box, {
12250
+ sx: {
12251
+ display: 'flex',
12252
+ justifyContent: 'space-between',
12253
+ alignItems: 'center',
12254
+ ' span': {
12255
+ fontSize: '1rem',
12256
+ fontWeight: 500,
12257
+ fontStyle: 'normal',
12258
+ lineHeight: '1.38',
12259
+ letterSpacing: '0.12px'
12260
+ }
12261
+ }
12038
12262
  }, /*#__PURE__*/React__namespace.createElement(material.Typography, {
12039
12263
  variant: "h5",
12040
12264
  component: "span"
12041
12265
  }, getTitleForVariant(servicePopupVariant)), /*#__PURE__*/React__namespace.createElement(material.IconButton, {
12266
+ "aria-label": "close",
12042
12267
  size: "small",
12043
- onClick: closePopupAndResetState,
12268
+ onClick: closePopup,
12044
12269
  "data-testid": "closePopupButtonCross",
12045
- sx: style$1.closeBtn
12046
- }, /*#__PURE__*/React__namespace.createElement(theme.Close, null))), /*#__PURE__*/React__namespace.createElement(material.DialogContent, {
12047
- sx: style$1.dialogContent
12048
- }, /*#__PURE__*/React__namespace.createElement(material.TextField, {
12270
+ sx: {
12271
+ color: 'geowebColors.captions.captionDisabled.color',
12272
+ marginTop: 'auto',
12273
+ marginBottom: 'auto'
12274
+ }
12275
+ }, /*#__PURE__*/React__namespace.createElement(theme.Close, null))), isLoading && /*#__PURE__*/React__namespace.createElement(material.Box, {
12276
+ sx: {
12277
+ position: 'relative'
12278
+ }
12279
+ }, /*#__PURE__*/React__namespace.createElement(material.LinearProgress, {
12280
+ "data-testid": "loadingIndicator",
12281
+ color: "secondary",
12282
+ sx: {
12283
+ position: 'absolute',
12284
+ width: '100%',
12285
+ top: 8
12286
+ }
12287
+ }))), /*#__PURE__*/React__namespace.createElement(material.DialogContent, {
12288
+ sx: {
12289
+ padding: '8px 16px'
12290
+ }
12291
+ }, /*#__PURE__*/React__namespace.createElement(formFields.ReactHookFormTextField, {
12292
+ name: fields.serviceUrl.name,
12293
+ label: fields.serviceUrl.label,
12294
+ onFocus: onFocusServiceUrl,
12295
+ onBlur: onBlurServiceUrl,
12049
12296
  sx: style$1.textField,
12050
- variant: "filled",
12051
- label: "Service name",
12052
- onChange: function onChange(event) {
12053
- return setServiceName(event.target.value);
12297
+ rules: {
12298
+ required: true,
12299
+ validate: __assign({}, !isServiceUrlDisabled && {
12300
+ onValidateServiceUrl: onValidateServiceUrl
12301
+ })
12054
12302
  },
12055
- value: serviceName,
12056
- inputProps: {
12057
- 'data-testid': 'serviceNameTextField'
12303
+ disabled: isServiceUrlDisabled || isLoading,
12304
+ InputProps: {
12305
+ readOnly: isShowPopup,
12306
+ disableUnderline: isShowPopup,
12307
+ endAdornment: isShowPopup && /*#__PURE__*/React__namespace.createElement(material.InputAdornment, {
12308
+ position: "end"
12309
+ }, /*#__PURE__*/React__namespace.createElement(material.IconButton, {
12310
+ "aria-label": "copy url",
12311
+ onClick: function onClick() {
12312
+ navigator.clipboard.writeText(serviceUrl);
12313
+ showSnackbar(COPY_URL_MESSAGE);
12314
+ }
12315
+ }, /*#__PURE__*/React__namespace.createElement(theme.Copy, null)))
12058
12316
  },
12059
- error: serviceNameHasError,
12060
- helperText: serviceNameHelperText
12061
- })), /*#__PURE__*/React__namespace.createElement(material.DialogContent, {
12062
- sx: style$1.dialogContent
12063
- }, /*#__PURE__*/React__namespace.createElement(material.TextField, {
12064
- sx: style$1.textField,
12065
- variant: "filled",
12066
- label: "Service URL",
12067
- onChange: function onChange(event) {
12068
- return setServiceUrl(event.target.value);
12317
+ defaultValue: serviceUrl
12318
+ }), /*#__PURE__*/React__namespace.createElement(formFields.ReactHookFormTextField, {
12319
+ name: fields.serviceName.name,
12320
+ label: fields.serviceName.label,
12321
+ rules: {
12322
+ required: true,
12323
+ validate: {
12324
+ onValidateServiceName: onValidateServiceName
12325
+ }
12069
12326
  },
12070
- value: serviceUrl,
12071
- id: "service-url",
12072
- inputProps: {
12073
- 'data-testid': 'serviceUrlTextField'
12327
+ disabled: isShowPopup || isLoading,
12328
+ InputProps: {
12329
+ readOnly: isShowPopup,
12330
+ disableUnderline: isShowPopup
12074
12331
  },
12075
- error: serviceUrlHasError,
12076
- helperText: serviceUrlHelperText
12077
- })), /*#__PURE__*/React__namespace.createElement(material.DialogContent, {
12078
- sx: style$1.dialogContent
12079
- }, /*#__PURE__*/React__namespace.createElement(material.TextField, {
12080
12332
  sx: style$1.textField,
12081
- variant: "filled",
12333
+ defaultValue: serviceName
12334
+ }), /*#__PURE__*/React__namespace.createElement(formFields.ReactHookFormTextField, {
12082
12335
  multiline: true,
12083
12336
  rows: 4,
12084
- label: "Abstracts",
12085
- helperText: "Short description of what this service does",
12086
- onChange: function onChange(event) {
12087
- return setAbstract(event.target.value);
12337
+ name: fields.serviceAbstracts.name,
12338
+ label: fields.serviceAbstracts.label,
12339
+ disabled: isShowPopup || isLoading,
12340
+ rules: {},
12341
+ InputProps: {
12342
+ readOnly: isShowPopup,
12343
+ disableUnderline: isShowPopup
12088
12344
  },
12089
- value: _abstract,
12090
- "data-testid": "abstractTextField",
12091
- disabled: true
12345
+ helperText: !isShowPopup && 'Short description of what this service does',
12346
+ sx: style$1.textField,
12347
+ defaultValue: ""
12348
+ }), !isServiceUrlDisabled && /*#__PURE__*/React__namespace.createElement(InitialValidationsTrigger, {
12349
+ trigger: trigger,
12350
+ getValues: getValues,
12351
+ onValidField: fetchServiceData
12092
12352
  })), /*#__PURE__*/React__namespace.createElement(material.DialogActions, {
12093
- sx: style$1.footerContent
12094
- }, /*#__PURE__*/React__namespace.createElement(material.Button, {
12095
- onClick: closePopupAndResetState,
12353
+ sx: {
12354
+ padding: 2
12355
+ }
12356
+ }, isShowPopup ? /*#__PURE__*/React__namespace.createElement(material.Button, {
12357
+ onClick: function onClick() {
12358
+ return closePopup();
12359
+ },
12360
+ variant: "tertiary",
12361
+ sx: {
12362
+ width: '117px'
12363
+ }
12364
+ }, "close") : /*#__PURE__*/React__namespace.createElement(React__namespace.Fragment, null, /*#__PURE__*/React__namespace.createElement(material.Button, {
12365
+ onClick: closePopup,
12096
12366
  "data-testid": "closePopupButtonCancel",
12097
12367
  variant: "tertiary",
12098
12368
  sx: {
12099
12369
  width: '117px'
12100
12370
  }
12101
- }, "cancel"), !isLoading ? /*#__PURE__*/React__namespace.createElement(material.Button, {
12371
+ }, "cancel"), /*#__PURE__*/React__namespace.createElement(material.Button, {
12372
+ type: "submit",
12102
12373
  variant: "primary",
12103
- disabled: disableButton,
12104
- onClick: addNewService,
12374
+ disabled: isSubmitDisabled || isLoading,
12105
12375
  "data-testid": "saveServiceButton",
12106
12376
  sx: {
12107
12377
  width: '117px',
12108
12378
  marginLeft: '16px!important'
12109
12379
  }
12110
- }, "save") : /*#__PURE__*/React__namespace.createElement(material.Box, {
12111
- "data-testid": "loadingIndicator",
12112
- sx: {
12113
- width: '117px',
12114
- height: '40px',
12115
- display: 'flex',
12116
- justifyContent: 'center',
12117
- alignItems: 'center',
12118
- marginLeft: '16px!important'
12119
- }
12120
- }, /*#__PURE__*/React__namespace.createElement(material.CircularProgress, {
12121
- size: 35
12122
- }))));
12380
+ }, "save")))));
12381
+ };
12382
+
12383
+ var ServicePopupWrapper = function ServicePopupWrapper(_a) {
12384
+ var props = __rest(_a, []);
12385
+
12386
+ return /*#__PURE__*/React__namespace.createElement(formFields.ReactHookFormProvider, {
12387
+ options: formFields.defaultFormOptions
12388
+ }, /*#__PURE__*/React__namespace.createElement(ServicePopup, __assign({}, props)));
12123
12389
  };
12124
12390
 
12125
12391
  /* *
@@ -12153,15 +12419,25 @@
12153
12419
  var serviceSetLayers = React__default["default"].useCallback(function (payload) {
12154
12420
  dispatch(serviceActions.serviceSetLayers(payload));
12155
12421
  }, [dispatch]);
12156
- return /*#__PURE__*/React__default["default"].createElement(ServicePopup, {
12422
+ var activeService = reactRedux.useSelector(function (store) {
12423
+ return getActiveServiceById(store, serviceId);
12424
+ });
12425
+ var showSnackbar = React__default["default"].useCallback(function (message) {
12426
+ dispatch(snackbarActions.openSnackbar({
12427
+ message: message
12428
+ }));
12429
+ }, [dispatch]);
12430
+ return /*#__PURE__*/React__default["default"].createElement(ServicePopupWrapper, {
12157
12431
  servicePopupVariant: servicePopupVariant,
12158
12432
  hideBackdrop: hideBackdrop,
12159
12433
  isOpen: isOpen,
12160
12434
  closePopup: closePopup,
12161
- serviceId: serviceId,
12162
12435
  services: services,
12163
12436
  serviceSetLayers: serviceSetLayers,
12164
- url: url
12437
+ serviceUrl: url || (activeService === null || activeService === void 0 ? void 0 : activeService.serviceUrl),
12438
+ serviceName: activeService === null || activeService === void 0 ? void 0 : activeService.serviceName,
12439
+ serviceAbstracts: activeService === null || activeService === void 0 ? void 0 : activeService["abstract"],
12440
+ showSnackbar: showSnackbar
12165
12441
  });
12166
12442
  };
12167
12443
 
@@ -12181,59 +12457,87 @@
12181
12457
  * Copyright 2021 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
12182
12458
  * Copyright 2021 - Finnish Meteorological Institute (FMI)
12183
12459
  * */
12184
- var isURL = function isURL(string) {
12185
- return /^https?:\/\//.test(string);
12186
- };
12187
12460
 
12188
- var SearchFieldButtonContainer = function SearchFieldButtonContainer(_a) {
12189
- var localSearchString = _a.localSearchString,
12190
- onClickClear = _a.onClickClear;
12461
+ var SearchField = function SearchField(_a) {
12462
+ var searchFilter = _a.searchFilter,
12463
+ setSearchFilter = _a.setSearchFilter;
12191
12464
 
12192
- var _b = __read(React__default["default"].useState(false), 2),
12193
- isPopupOpen = _b[0],
12194
- setPopupOpen = _b[1];
12465
+ var _b = __read(React__namespace.useState(''), 2),
12466
+ localSearchString = _b[0],
12467
+ setLocalSearchString = _b[1];
12195
12468
 
12196
- React__default["default"].useEffect(function () {
12197
- if (isPopupOpen === false) {
12198
- onClickClear();
12199
- } // eslint-disable-next-line react-hooks/exhaustive-deps
12469
+ var _c = __read(React__namespace.useState(false), 2),
12470
+ urlIsValid = _c[0],
12471
+ setUrlIsValid = _c[1];
12200
12472
 
12201
- }, [isPopupOpen]);
12202
- var ClearButton = /*#__PURE__*/React__default["default"].createElement(material.Tooltip, {
12203
- title: "Clear",
12204
- placement: "top"
12205
- }, /*#__PURE__*/React__default["default"].createElement(material.IconButton, {
12206
- edge: "end",
12207
- onClick: function onClick() {
12208
- onClickClear();
12209
- },
12210
- size: "large"
12211
- }, /*#__PURE__*/React__default["default"].createElement(theme.Clear, null)));
12212
- if (isURL(localSearchString)) return /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null, /*#__PURE__*/React__default["default"].createElement("div", {
12213
- style: {
12214
- marginRight: '15px'
12473
+ var _d = __read(React__namespace.useState(false), 2),
12474
+ popupIsOpen = _d[0],
12475
+ setPopupIsOpen = _d[1]; // eslint-disable-next-line react-hooks/exhaustive-deps
12476
+
12477
+
12478
+ var setSearchFilterDebounced = React__namespace.useCallback(_.debounce(setSearchFilter, 300), []);
12479
+
12480
+ var handleChange = function handleChange(text) {
12481
+ setLocalSearchString(text);
12482
+ if (!isURL(text)) setSearchFilterDebounced(text);else if (searchFilter) setSearchFilterDebounced('');
12483
+ };
12484
+
12485
+ React__namespace.useEffect(function () {
12486
+ if (isURL(localSearchString)) {
12487
+ setUrlIsValid(true);
12215
12488
  }
12216
- }, ClearButton), /*#__PURE__*/React__default["default"].createElement(material.Button, {
12217
- variant: "tertiary",
12218
- onClick: function onClick() {
12219
- return setPopupOpen(true);
12489
+ }, [localSearchString]);
12490
+ React__namespace.useEffect(function () {
12491
+ var keyDownHandler = function keyDownHandler(event) {
12492
+ if (event.key === 'Enter') {
12493
+ event.preventDefault();
12494
+
12495
+ if (urlIsValid) {
12496
+ setPopupIsOpen(true);
12497
+ }
12498
+ }
12499
+ };
12500
+
12501
+ document.addEventListener('keydown', keyDownHandler);
12502
+ return function () {
12503
+ document.removeEventListener('keydown', keyDownHandler);
12504
+ };
12505
+ }, [urlIsValid]); // mirror store unless typing a URL
12506
+
12507
+ React__namespace.useEffect(function () {
12508
+ if (isURL(localSearchString)) return;
12509
+ setLocalSearchString(searchFilter); // eslint-disable-next-line react-hooks/exhaustive-deps
12510
+ }, [searchFilter]);
12511
+ return /*#__PURE__*/React__namespace.createElement(React__namespace.Fragment, null, /*#__PURE__*/React__namespace.createElement(material.TextField, {
12512
+ variant: "filled",
12513
+ label: "Search through services or enter a service URL",
12514
+ value: localSearchString,
12515
+ onChange: function onChange(e) {
12516
+ handleChange(e.target.value);
12517
+ },
12518
+ autoFocus: true,
12519
+ fullWidth: true,
12520
+ InputProps: {
12521
+ endAdornment: /*#__PURE__*/React__namespace.createElement(material.InputAdornment, {
12522
+ position: "end"
12523
+ }, /*#__PURE__*/React__namespace.createElement(SearchFieldButtonContainer, {
12524
+ setPopupIsOpen: setPopupIsOpen,
12525
+ localSearchString: localSearchString,
12526
+ onClickClear: function onClickClear() {
12527
+ setLocalSearchString('');
12528
+ setSearchFilterDebounced('');
12529
+ }
12530
+ }))
12220
12531
  }
12221
- }, "Save"), /*#__PURE__*/React__default["default"].createElement(ServicePopupConnect, {
12532
+ }), /*#__PURE__*/React__namespace.createElement(ServicePopupConnect, {
12222
12533
  servicePopupVariant: "save",
12223
- isOpen: isPopupOpen,
12534
+ isOpen: popupIsOpen,
12224
12535
  closePopup: function closePopup() {
12225
- return setPopupOpen(false);
12536
+ setPopupIsOpen(false);
12537
+ setLocalSearchString('');
12226
12538
  },
12227
12539
  url: localSearchString
12228
12540
  }));
12229
- if (localSearchString) return ClearButton;
12230
- return /*#__PURE__*/React__default["default"].createElement(material.Tooltip, {
12231
- title: "Search",
12232
- placement: "top"
12233
- }, /*#__PURE__*/React__default["default"].createElement(material.IconButton, {
12234
- edge: "end",
12235
- size: "large"
12236
- }, /*#__PURE__*/React__default["default"].createElement(theme.Search, null)));
12237
12541
  };
12238
12542
 
12239
12543
  /* *
@@ -12253,48 +12557,232 @@
12253
12557
  * Copyright 2021 - Finnish Meteorological Institute (FMI)
12254
12558
  * */
12255
12559
 
12256
- var SearchField = function SearchField(_a) {
12257
- var searchFilter = _a.searchFilter,
12258
- setSearchFilter = _a.setSearchFilter;
12560
+ var SearchFieldConnect = function SearchFieldConnect() {
12561
+ var dispatch = reactRedux.useDispatch();
12562
+ var searchFilter = reactRedux.useSelector(function (store) {
12563
+ return getSearchFilter(store);
12564
+ });
12565
+ return /*#__PURE__*/React__namespace.createElement(SearchField, {
12566
+ setSearchFilter: function setSearchFilter(filterText) {
12567
+ dispatch(layerSelectActions.setSearchFilter({
12568
+ filterText: filterText
12569
+ }));
12570
+ },
12571
+ searchFilter: searchFilter
12572
+ });
12573
+ };
12259
12574
 
12260
- var _b = __read(React__namespace.useState(''), 2),
12261
- localSearchString = _b[0],
12262
- setLocalSearchString = _b[1]; // mirror store unless typing a URL
12575
+ /* *
12576
+ * Licensed under the Apache License, Version 2.0 (the "License");
12577
+ * you may not use this file except in compliance with the License.
12578
+ * You may obtain a copy of the License at
12579
+ *
12580
+ * http://www.apache.org/licenses/LICENSE-2.0
12581
+ *
12582
+ * Unless required by applicable law or agreed to in writing, software
12583
+ * distributed under the License is distributed on an "AS IS" BASIS,
12584
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12585
+ * See the License for the specific language governing permissions and
12586
+ * limitations under the License.
12587
+ *
12588
+ * Copyright 2021 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
12589
+ * Copyright 2021 - Finnish Meteorological Institute (FMI)
12590
+ * */
12591
+ var filterLayersFromService = function filterLayersFromService(serviceId, services, filterIds, allFiltersActive, searchString) {
12592
+ var mapStoreService = services[serviceId];
12593
+ if (!mapStoreService) return [];
12263
12594
 
12595
+ if (searchString === '' && allFiltersActive) {
12596
+ return mapStoreService.layers.filter(function (layer) {
12597
+ return layer.leaf;
12598
+ });
12599
+ }
12264
12600
 
12265
- React__namespace.useEffect(function () {
12266
- if (isURL(localSearchString)) return;
12267
- setLocalSearchString(searchFilter); // eslint-disable-next-line react-hooks/exhaustive-deps
12268
- }, [searchFilter]); // eslint-disable-next-line react-hooks/exhaustive-deps
12601
+ var searchStringArray = searchString.split(' ');
12602
+ return mapStoreService.layers.filter(function (layer) {
12603
+ return searchStringArray.every(function (search) {
12604
+ var _a, _b, _c;
12269
12605
 
12270
- var setSearchFilterDebounced = React__namespace.useCallback(_.debounce(setSearchFilter, 300), []);
12606
+ var searchLowercase = search.toLowerCase();
12607
+ var layerFilterIds = layer.path.map(function (group) {
12608
+ return "group-" + group;
12609
+ }).concat(layer.keywords.map(function (keyword) {
12610
+ return "keyword-" + keyword;
12611
+ }));
12612
+ var isFilterInLayer = (layerFilterIds === null || layerFilterIds === void 0 ? void 0 : layerFilterIds.some(function (id) {
12613
+ return filterIds.includes(id);
12614
+ })) || allFiltersActive;
12615
+ var isSearchTextInLayerFilter = layerFilterIds === null || layerFilterIds === void 0 ? void 0 : layerFilterIds.some(function (filterId) {
12616
+ return filterId.toLowerCase().includes(searchLowercase);
12617
+ });
12618
+ var isSearchTextInLayerName = (_a = layer.name) === null || _a === void 0 ? void 0 : _a.toLowerCase().includes(searchLowercase);
12619
+ var isSearchTextInLayerText = (_b = layer.text) === null || _b === void 0 ? void 0 : _b.toLowerCase().includes(searchLowercase);
12620
+ var isSearchTextInLayerAbstract = (_c = layer["abstract"]) === null || _c === void 0 ? void 0 : _c.toLowerCase().includes(searchLowercase);
12621
+ var isSearchTextInServiceName = mapStoreService.name.toLowerCase().includes(searchLowercase);
12622
+ var isSearchTextInLayer = isSearchTextInLayerName || isSearchTextInLayerText || isSearchTextInLayerAbstract || isSearchTextInLayerFilter || isSearchTextInServiceName;
12623
+ return isFilterInLayer && isSearchTextInLayer;
12624
+ });
12625
+ }).filter(function (layer) {
12626
+ return layer.leaf;
12627
+ });
12628
+ };
12271
12629
 
12272
- var handleChange = function handleChange(text) {
12273
- setLocalSearchString(text);
12274
- if (!isURL(text)) setSearchFilterDebounced(text);else if (searchFilter) setSearchFilterDebounced('');
12630
+ /* *
12631
+ * Licensed under the Apache License, Version 2.0 (the "License");
12632
+ * you may not use this file except in compliance with the License.
12633
+ * You may obtain a copy of the License at
12634
+ *
12635
+ * http://www.apache.org/licenses/LICENSE-2.0
12636
+ *
12637
+ * Unless required by applicable law or agreed to in writing, software
12638
+ * distributed under the License is distributed on an "AS IS" BASIS,
12639
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12640
+ * See the License for the specific language governing permissions and
12641
+ * limitations under the License.
12642
+ *
12643
+ * Copyright 2022 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
12644
+ * Copyright 2022 - Finnish Meteorological Institute (FMI)
12645
+ * */
12646
+
12647
+ var LayerAddRemoveButton = function LayerAddRemoveButton(_a) {
12648
+ var layer = _a.layer,
12649
+ layerIndex = _a.layerIndex,
12650
+ serviceUrl = _a.serviceUrl,
12651
+ addLayer = _a.addLayer,
12652
+ deleteLayer = _a.deleteLayer,
12653
+ mapLayers = _a.mapLayers;
12654
+ var foundLayer = mapLayers.find(function (lr) {
12655
+ return lr.name === layer.name && lr.service === serviceUrl;
12656
+ });
12657
+ return /*#__PURE__*/React__namespace.createElement(shared.CustomToggleButton, {
12658
+ "data-testid": "layerAddRemoveButton-" + layer.name,
12659
+ onClick: function onClick() {
12660
+ !foundLayer ? addLayer({
12661
+ serviceUrl: serviceUrl,
12662
+ layerName: layer.name
12663
+ }) : deleteLayer({
12664
+ layerId: foundLayer.id,
12665
+ layerIndex: layerIndex
12666
+ });
12667
+ },
12668
+ selected: !!foundLayer,
12669
+ variant: "tool",
12670
+ fullWidth: true,
12671
+ sx: {
12672
+ fontSize: '12px'
12673
+ }
12674
+ }, !foundLayer ? 'Add' : 'Remove');
12675
+ };
12676
+
12677
+ /* *
12678
+ * Licensed under the Apache License, Version 2.0 (the "License");
12679
+ * you may not use this file except in compliance with the License.
12680
+ * You may obtain a copy of the License at
12681
+ *
12682
+ * http://www.apache.org/licenses/LICENSE-2.0
12683
+ *
12684
+ * Unless required by applicable law or agreed to in writing, software
12685
+ * distributed under the License is distributed on an "AS IS" BASIS,
12686
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12687
+ * See the License for the specific language governing permissions and
12688
+ * limitations under the License.
12689
+ *
12690
+ * Copyright 2022 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
12691
+ * Copyright 2022 - Finnish Meteorological Institute (FMI)
12692
+ * */
12693
+
12694
+ var LayerInfoButtonConnect = function LayerInfoButtonConnect(_a) {
12695
+ var layer = _a.layer,
12696
+ mapId = _a.mapId,
12697
+ serviceName = _a.serviceName,
12698
+ _b = _a.source,
12699
+ source = _b === void 0 ? 'app' : _b;
12700
+ var dispatch = reactRedux.useDispatch();
12701
+ var currentActiveMapId = reactRedux.useSelector(function (store) {
12702
+ return getDialogMapId(store, DialogTypes.LayerInfo);
12703
+ });
12704
+ var isOpenInStore = reactRedux.useSelector(function (store) {
12705
+ return getisDialogOpen(store, DialogTypes.LayerInfo);
12706
+ });
12707
+ var currentLayerInfo = reactRedux.useSelector(function (store) {
12708
+ return getActiveLayerInfo(store);
12709
+ });
12710
+ var isActive = layer.name === (currentLayerInfo === null || currentLayerInfo === void 0 ? void 0 : currentLayerInfo.name) && serviceName === (currentLayerInfo === null || currentLayerInfo === void 0 ? void 0 : currentLayerInfo.serviceName);
12711
+ var toggleInfoDialog = React__default["default"].useCallback(function () {
12712
+ dispatch(uiActions.setActiveMapIdForDialog({
12713
+ type: DialogTypes.LayerInfo,
12714
+ mapId: mapId,
12715
+ setOpen: currentActiveMapId !== mapId ? true : !isOpenInStore,
12716
+ source: source
12717
+ }));
12718
+ }, [currentActiveMapId, dispatch, isOpenInStore, mapId, source]);
12719
+ var setActiveLayerInfo = React__default["default"].useCallback(function () {
12720
+ dispatch(layerSelectActions.setActiveLayerInfo({
12721
+ layer: __assign(__assign({}, layer), {
12722
+ serviceName: serviceName
12723
+ })
12724
+ }));
12725
+ }, [dispatch, layer, serviceName]);
12726
+
12727
+ var onClick = function onClick() {
12728
+ if (isActive) {
12729
+ toggleInfoDialog();
12730
+ }
12731
+
12732
+ if (!isActive && isOpenInStore) {
12733
+ setActiveLayerInfo();
12734
+ }
12735
+
12736
+ if (!isActive && !isOpenInStore) {
12737
+ setActiveLayerInfo();
12738
+ toggleInfoDialog();
12739
+ }
12275
12740
  };
12276
12741
 
12277
- return /*#__PURE__*/React__namespace.createElement(material.TextField, {
12278
- variant: "filled",
12279
- label: "Search through services or enter a service URL",
12280
- value: localSearchString,
12281
- onChange: function onChange(e) {
12282
- handleChange(e.target.value);
12283
- },
12284
- autoFocus: true,
12285
- fullWidth: true,
12286
- InputProps: {
12287
- endAdornment: /*#__PURE__*/React__namespace.createElement(material.InputAdornment, {
12288
- position: "end"
12289
- }, /*#__PURE__*/React__namespace.createElement(SearchFieldButtonContainer, {
12290
- localSearchString: localSearchString,
12291
- onClickClear: function onClickClear() {
12292
- setLocalSearchString('');
12293
- setSearchFilterDebounced('');
12294
- }
12295
- }))
12296
- }
12297
- });
12742
+ return /*#__PURE__*/React__default["default"].createElement(shared.ToolButton, {
12743
+ variant: "icon",
12744
+ active: isActive && isOpenInStore,
12745
+ onClick: onClick,
12746
+ id: "layerInfoButton",
12747
+ "aria-label": "layer info"
12748
+ }, /*#__PURE__*/React__default["default"].createElement(theme.Info, null));
12749
+ };
12750
+
12751
+ /* *
12752
+ * Licensed under the Apache License, Version 2.0 (the "License");
12753
+ * you may not use this file except in compliance with the License.
12754
+ * You may obtain a copy of the License at
12755
+ *
12756
+ * http://www.apache.org/licenses/LICENSE-2.0
12757
+ *
12758
+ * Unless required by applicable law or agreed to in writing, software
12759
+ * distributed under the License is distributed on an "AS IS" BASIS,
12760
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12761
+ * See the License for the specific language governing permissions and
12762
+ * limitations under the License.
12763
+ *
12764
+ * Copyright 2022 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
12765
+ * Copyright 2022 - Finnish Meteorological Institute (FMI)
12766
+ * */
12767
+ var textStyle$1 = {
12768
+ lineHeight: '20px',
12769
+ letterSpacing: '0.25px'
12770
+ };
12771
+
12772
+ var textStyleWithMargin = __assign(__assign({}, textStyle$1), {
12773
+ marginBottom: 1
12774
+ });
12775
+
12776
+ var LayerInfoText = function LayerInfoText(_a) {
12777
+ var label = _a.label,
12778
+ value = _a.value;
12779
+ return /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null, /*#__PURE__*/React__default["default"].createElement(Typography__default["default"], {
12780
+ variant: "subtitle2",
12781
+ sx: textStyle$1
12782
+ }, label), /*#__PURE__*/React__default["default"].createElement(Typography__default["default"], {
12783
+ variant: "body2",
12784
+ sx: textStyleWithMargin
12785
+ }, value));
12298
12786
  };
12299
12787
 
12300
12788
  /* *
@@ -12310,23 +12798,55 @@
12310
12798
  * See the License for the specific language governing permissions and
12311
12799
  * limitations under the License.
12312
12800
  *
12313
- * Copyright 2021 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
12314
- * Copyright 2021 - Finnish Meteorological Institute (FMI)
12801
+ * Copyright 2022 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
12802
+ * Copyright 2022 - Finnish Meteorological Institute (FMI)
12315
12803
  * */
12804
+ var textStyle = {
12805
+ lineHeight: '20px',
12806
+ letterSpacing: '0.25px'
12807
+ };
12316
12808
 
12317
- var SearchFieldConnect = function SearchFieldConnect() {
12318
- var dispatch = reactRedux.useDispatch();
12319
- var searchFilter = reactRedux.useSelector(function (store) {
12320
- return getSearchFilter(store);
12321
- });
12322
- return /*#__PURE__*/React__namespace.createElement(SearchField, {
12323
- setSearchFilter: function setSearchFilter(filterText) {
12324
- dispatch(layerSelectActions.setSearchFilter({
12325
- filterText: filterText
12326
- }));
12327
- },
12328
- searchFilter: searchFilter
12329
- });
12809
+ var valueStyle = __assign(__assign({}, textStyle), {
12810
+ overflowWrap: 'break-word'
12811
+ });
12812
+
12813
+ var LayerInfoList = function LayerInfoList(_a) {
12814
+ var label = _a.label,
12815
+ list = _a.list;
12816
+ return /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null, /*#__PURE__*/React__default["default"].createElement(Typography__default["default"], {
12817
+ variant: "subtitle2",
12818
+ sx: textStyle
12819
+ }, label), /*#__PURE__*/React__default["default"].createElement(Grid__default["default"], {
12820
+ container: true,
12821
+ direction: "column"
12822
+ }, list.map(function (item) {
12823
+ return /*#__PURE__*/React__default["default"].createElement("div", {
12824
+ key: item.name
12825
+ }, /*#__PURE__*/React__default["default"].createElement(Grid__default["default"], {
12826
+ item: true,
12827
+ container: true,
12828
+ direction: "row"
12829
+ }, item.icon, /*#__PURE__*/React__default["default"].createElement(Grid__default["default"], {
12830
+ item: true,
12831
+ sx: {
12832
+ marginLeft: '10px'
12833
+ }
12834
+ }, /*#__PURE__*/React__default["default"].createElement(Typography__default["default"], {
12835
+ variant: "body2",
12836
+ sx: textStyle
12837
+ }, item.name, ":"))), /*#__PURE__*/React__default["default"].createElement(Grid__default["default"], {
12838
+ item: true,
12839
+ container: true,
12840
+ direction: "row",
12841
+ sx: {
12842
+ marginBottom: 1,
12843
+ paddingLeft: '34px'
12844
+ }
12845
+ }, /*#__PURE__*/React__default["default"].createElement(Typography__default["default"], {
12846
+ variant: "body2",
12847
+ sx: valueStyle
12848
+ }, item.value)));
12849
+ })));
12330
12850
  };
12331
12851
 
12332
12852
  /* *
@@ -12342,32 +12862,49 @@
12342
12862
  * See the License for the specific language governing permissions and
12343
12863
  * limitations under the License.
12344
12864
  *
12345
- * Copyright 2021 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
12346
- * Copyright 2021 - Finnish Meteorological Institute (FMI)
12865
+ * Copyright 2022 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
12866
+ * Copyright 2022 - Finnish Meteorological Institute (FMI)
12347
12867
  * */
12348
- var filterLayersFromService = function filterLayersFromService(serviceId, services, keywordIds, allKeywordsActive, searchString) {
12349
- var mapStoreService = services[serviceId];
12350
- if (!mapStoreService) return [];
12868
+ var getLayerStyles = function getLayerStyles(layer) {
12869
+ if (!layer.styles) {
12870
+ return '-';
12871
+ }
12351
12872
 
12352
- if (searchString === '' && allKeywordsActive) {
12353
- return mapStoreService.layers.filter(function (layer) {
12354
- return layer.leaf;
12355
- });
12873
+ var styles = layer.styles.map(function (style) {
12874
+ return style.title;
12875
+ });
12876
+
12877
+ if (!styles.length) {
12878
+ return '-';
12356
12879
  }
12357
12880
 
12358
- var searchStringArray = searchString.split(' ');
12359
- return mapStoreService.layers.filter(function (layer) {
12360
- return searchStringArray.every(function (search) {
12361
- var layerPathAndKeywords = layer.path.concat(layer.keywords);
12362
- return (!!layerPathAndKeywords && !layerPathAndKeywords.every(function (keyword) {
12363
- return !keywordIds.includes(keyword);
12364
- }) || 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) {
12365
- return !keyword.toLowerCase().includes(search.toLowerCase());
12366
- }) || mapStoreService.name.toLowerCase().includes(search.toLowerCase()));
12367
- });
12368
- }).filter(function (layer) {
12369
- return layer.leaf;
12881
+ return styles.join(', ');
12882
+ };
12883
+ var getDimensionValue = function getDimensionValue(name, layer, breakAt, includeUnit) {
12884
+ var _a;
12885
+
12886
+ if (includeUnit === void 0) {
12887
+ includeUnit = false;
12888
+ }
12889
+
12890
+ var dimension = (_a = layer.dimensions) === null || _a === void 0 ? void 0 : _a.find(function (dimension) {
12891
+ return dimension.name.toLowerCase() === name;
12370
12892
  });
12893
+
12894
+ if (!dimension) {
12895
+ return '-';
12896
+ }
12897
+
12898
+ var dimValue = dimension === null || dimension === void 0 ? void 0 : dimension.currentValue.split(breakAt).join(breakAt + " ");
12899
+
12900
+ if (includeUnit) {
12901
+ return dimValue + " " + dimension.units;
12902
+ }
12903
+
12904
+ return dimValue;
12905
+ };
12906
+ var getLayerBbox = function getLayerBbox(layer) {
12907
+ return layer.geographicBoundingBox ? "west " + layer.geographicBoundingBox.west + ", east " + layer.geographicBoundingBox.east + ", north " + layer.geographicBoundingBox.north + ", south " + layer.geographicBoundingBox.south : '-';
12371
12908
  };
12372
12909
 
12373
12910
  /* *
@@ -12387,31 +12924,88 @@
12387
12924
  * Copyright 2022 - Finnish Meteorological Institute (FMI)
12388
12925
  * */
12389
12926
 
12390
- var LayerAddRemoveButton = function LayerAddRemoveButton(_a) {
12391
- var layer = _a.layer,
12392
- layerIndex = _a.layerIndex,
12393
- serviceUrl = _a.serviceUrl,
12394
- addLayer = _a.addLayer,
12395
- deleteLayer = _a.deleteLayer,
12396
- mapLayers = _a.mapLayers;
12397
- var foundLayer = mapLayers.find(function (lr) {
12398
- return lr.name === layer.name && lr.service === serviceUrl;
12399
- });
12400
- return /*#__PURE__*/React__namespace.createElement(shared.CustomToggleButton, {
12401
- "data-testid": "layerAddRemoveButton-" + layer.name,
12402
- onClick: function onClick() {
12403
- !foundLayer ? addLayer({
12404
- serviceUrl: serviceUrl,
12405
- layerName: layer.name
12406
- }) : deleteLayer({
12407
- layerId: foundLayer.id,
12408
- layerIndex: layerIndex
12409
- });
12927
+ var LayerInfoDialog = function LayerInfoDialog(_a) {
12928
+ var _b;
12929
+
12930
+ var onClose = _a.onClose,
12931
+ layer = _a.layer,
12932
+ isOpen = _a.isOpen,
12933
+ _c = _a.onMouseDown,
12934
+ onMouseDown = _c === void 0 ? function () {} : _c,
12935
+ _d = _a.order,
12936
+ order = _d === void 0 ? 0 : _d,
12937
+ _e = _a.source,
12938
+ source = _e === void 0 ? 'app' : _e,
12939
+ dialogHeight = _a.dialogHeight;
12940
+ var styles = getLayerStyles(layer);
12941
+ var bbox = getLayerBbox(layer);
12942
+ var timeValue = getDimensionValue('time', layer, '/');
12943
+ var refTimeValue = getDimensionValue('reference_time', layer, ',');
12944
+ var elevationValue = getDimensionValue('elevation', layer, ',', true);
12945
+ return /*#__PURE__*/React__default["default"].createElement(shared.ToolContainerDraggable, {
12946
+ onClose: onClose,
12947
+ headerSize: "xs",
12948
+ startSize: {
12949
+ width: 288,
12950
+ height: dialogHeight || 650
12410
12951
  },
12411
- selected: !!foundLayer,
12412
- variant: "tool",
12413
- fullWidth: true
12414
- }, !foundLayer ? 'Add' : 'Remove');
12952
+ startPosition: {
12953
+ top: 150,
12954
+ left: 900
12955
+ },
12956
+ title: "Layer Info",
12957
+ isOpen: isOpen,
12958
+ onMouseDown: onMouseDown,
12959
+ order: order,
12960
+ source: source
12961
+ }, /*#__PURE__*/React__default["default"].createElement(Box__default["default"], {
12962
+ sx: {
12963
+ padding: 2
12964
+ }
12965
+ }, /*#__PURE__*/React__default["default"].createElement(LayerInfoText, {
12966
+ label: "Title",
12967
+ value: layer.text
12968
+ }), /*#__PURE__*/React__default["default"].createElement(LayerInfoText, {
12969
+ label: "Name",
12970
+ value: layer.name
12971
+ }), /*#__PURE__*/React__default["default"].createElement(LayerInfoText, {
12972
+ label: "Service",
12973
+ value: layer.serviceName
12974
+ }), /*#__PURE__*/React__default["default"].createElement(LayerInfoText, {
12975
+ label: "Abstract",
12976
+ value: layer["abstract"] || '-'
12977
+ }), /*#__PURE__*/React__default["default"].createElement(LayerInfoList, {
12978
+ label: "Dimensions",
12979
+ list: [{
12980
+ name: 'Time',
12981
+ value: timeValue,
12982
+ icon: /*#__PURE__*/React__default["default"].createElement(theme.DimensionsTime, null)
12983
+ }, {
12984
+ name: 'Reference Time',
12985
+ value: refTimeValue,
12986
+ icon: /*#__PURE__*/React__default["default"].createElement(theme.DimensionsRefTime, null)
12987
+ }, {
12988
+ name: 'Elevation',
12989
+ value: elevationValue,
12990
+ icon: /*#__PURE__*/React__default["default"].createElement(theme.DimensionsElevation, null)
12991
+ }, {
12992
+ name: 'Other dimensions',
12993
+ value: '-',
12994
+ icon: /*#__PURE__*/React__default["default"].createElement(theme.DimensionsOther, null)
12995
+ }]
12996
+ }), /*#__PURE__*/React__default["default"].createElement(LayerInfoText, {
12997
+ label: "Styles",
12998
+ value: styles
12999
+ }), /*#__PURE__*/React__default["default"].createElement(LayerInfoText, {
13000
+ label: "Bounding Box",
13001
+ value: bbox
13002
+ }), /*#__PURE__*/React__default["default"].createElement(LayerInfoText, {
13003
+ label: "Groups",
13004
+ value: layer.path.join('/') || '-'
13005
+ }), /*#__PURE__*/React__default["default"].createElement(LayerInfoText, {
13006
+ label: "Keywords",
13007
+ value: ((_b = layer.keywords) === null || _b === void 0 ? void 0 : _b.join(', ')) || '-'
13008
+ })));
12415
13009
  };
12416
13010
 
12417
13011
  /* *
@@ -12430,15 +13024,23 @@
12430
13024
  * Copyright 2022 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
12431
13025
  * Copyright 2022 - Finnish Meteorological Institute (FMI)
12432
13026
  * */
13027
+ var layerInfoStyle = {
13028
+ fontSize: '10px',
13029
+ textOverflow: 'ellipsis',
13030
+ overflow: 'hidden',
13031
+ whiteSpace: 'nowrap'
13032
+ };
12433
13033
 
12434
13034
  var LayerListRow = function LayerListRow(_a) {
13035
+ var _b, _c, _d;
13036
+
12435
13037
  var layer = _a.layer,
12436
13038
  layerIndex = _a.layerIndex,
12437
13039
  service = _a.service,
12438
- serviceUrl = _a.serviceUrl,
12439
13040
  addLayer = _a.addLayer,
12440
13041
  deleteLayer = _a.deleteLayer,
12441
- mapLayers = _a.mapLayers;
13042
+ mapLayers = _a.mapLayers,
13043
+ mapId = _a.mapId;
12442
13044
  return /*#__PURE__*/React__default["default"].createElement(material.Grid, {
12443
13045
  "data-testid": "layerListLayerRow",
12444
13046
  container: true,
@@ -12448,9 +13050,9 @@
12448
13050
  alignItems: "center",
12449
13051
  sx: {
12450
13052
  backgroundColor: 'geowebColors.cards.cardContainer',
12451
- paddingLeft: '12px',
13053
+ padding: '8px',
12452
13054
  marginBottom: '4px',
12453
- height: '64px',
13055
+ height: '68px',
12454
13056
  border: 'solid 1px',
12455
13057
  borderColor: 'geowebColors.cards.cardContainerBorder'
12456
13058
  }
@@ -12465,8 +13067,8 @@
12465
13067
  }, /*#__PURE__*/React__default["default"].createElement(material.Box, {
12466
13068
  sx: {
12467
13069
  fontSize: '12px',
12468
- height: '24px',
12469
- lineHeight: '24px',
13070
+ height: '14px',
13071
+ lineHeight: '14px',
12470
13072
  fontWeight: 500,
12471
13073
  WebkitLineClamp: 1,
12472
13074
  display: '-webkit-box',
@@ -12477,34 +13079,50 @@
12477
13079
  }, layer.text)), /*#__PURE__*/React__default["default"].createElement(material.Grid, {
12478
13080
  container: true,
12479
13081
  item: true,
12480
- xs: 4
13082
+ xs: 4,
13083
+ direction: "column"
12481
13084
  }, /*#__PURE__*/React__default["default"].createElement(material.Box, {
12482
13085
  sx: {
12483
13086
  fontSize: '12px',
12484
- height: '24px',
12485
- lineHeight: '24px',
13087
+ height: '18px',
13088
+ lineHeight: '18px',
12486
13089
  WebkitLineClamp: 1,
12487
13090
  display: '-webkit-box',
12488
13091
  WebkitBoxOrient: 'vertical',
12489
13092
  textOverflow: 'ellipsis',
12490
13093
  overflow: 'hidden'
12491
13094
  }
12492
- }, service.name)), layer["abstract"] ? /*#__PURE__*/React__default["default"].createElement(material.Grid, {
13095
+ }, service.name), /*#__PURE__*/React__default["default"].createElement(LayerInfoButtonConnect, {
13096
+ layer: layer,
13097
+ mapId: mapId,
13098
+ serviceName: service.name
13099
+ })), layer["abstract"] || ((_b = layer.keywords) === null || _b === void 0 ? void 0 : _b.length) || layer.path.length ? /*#__PURE__*/React__default["default"].createElement(material.Grid, {
12493
13100
  "data-testid": "layerAbstract",
12494
13101
  container: true,
12495
13102
  item: true,
12496
13103
  xs: 8,
12497
13104
  sx: {
12498
- fontSize: '10px',
12499
- height: '30px',
13105
+ height: '45px',
12500
13106
  paddingLeft: '20px',
12501
13107
  WebkitLineClamp: 2,
12502
13108
  display: '-webkit-box',
12503
- WebkitBoxOrient: 'vertical',
12504
- textOverflow: 'ellipsis',
12505
- overflow: 'hidden'
13109
+ WebkitBoxOrient: 'vertical'
12506
13110
  }
12507
- }, layer["abstract"]) : null), /*#__PURE__*/React__default["default"].createElement(material.Grid, {
13111
+ }, layer["abstract"] && /*#__PURE__*/React__default["default"].createElement(material.Typography, {
13112
+ sx: __assign(__assign({}, layerInfoStyle), {
13113
+ height: 15
13114
+ })
13115
+ }, layer["abstract"]), layer.path.length > 0 && /*#__PURE__*/React__default["default"].createElement(material.Typography, {
13116
+ sx: __assign(__assign({}, layerInfoStyle), {
13117
+ height: ((_c = layer.keywords) === null || _c === void 0 ? void 0 : _c.length) ? 15 : 30
13118
+ })
13119
+ }, "Groups: ", layer.path.join(' / ')), ((_d = layer.keywords) === null || _d === void 0 ? void 0 : _d.length) > 0 && /*#__PURE__*/React__default["default"].createElement(material.Typography, {
13120
+ sx: __assign(__assign({}, layerInfoStyle), {
13121
+ height: layer.path.length ? 15 : 30
13122
+ })
13123
+ }, "Keywords:", ' ', layer.keywords.slice().sort(function (a, b) {
13124
+ return a.localeCompare(b);
13125
+ }).join(', '))) : null), /*#__PURE__*/React__default["default"].createElement(material.Grid, {
12508
13126
  container: true,
12509
13127
  item: true,
12510
13128
  xs: 2,
@@ -12514,13 +13132,12 @@
12514
13132
  sx: {
12515
13133
  width: '80px',
12516
13134
  height: '48px',
12517
- marginRight: '8px',
12518
- paddingTop: '4px'
13135
+ marginRight: '8px'
12519
13136
  }
12520
13137
  }, /*#__PURE__*/React__default["default"].createElement(LayerAddRemoveButton, {
12521
13138
  layer: layer,
12522
13139
  layerIndex: layerIndex,
12523
- serviceUrl: serviceUrl,
13140
+ serviceUrl: service.serviceUrl,
12524
13141
  addLayer: addLayer,
12525
13142
  deleteLayer: deleteLayer,
12526
13143
  mapLayers: mapLayers
@@ -12548,13 +13165,15 @@
12548
13165
  var services = _a.services,
12549
13166
  serviceIds = _a.serviceIds,
12550
13167
  layerSelectHeight = _a.layerSelectHeight,
13168
+ serviceListHeight = _a.serviceListHeight,
12551
13169
  addLayer = _a.addLayer,
12552
13170
  deleteLayer = _a.deleteLayer,
12553
13171
  searchString = _a.searchString,
12554
13172
  mapLayers = _a.mapLayers,
12555
- keywordIds = _a.keywordIds,
12556
- allKeywordsActive = _a.allKeywordsActive;
12557
- var layerSelectFilterHeight = 199;
13173
+ filterIds = _a.filterIds,
13174
+ allFiltersActive = _a.allFiltersActive,
13175
+ mapId = _a.mapId;
13176
+ var layerSelectFilterHeight = 155 + serviceListHeight;
12558
13177
 
12559
13178
  var _b = __read(React__namespace.useState(0), 2),
12560
13179
  numberOfLayers = _b[0],
@@ -12566,16 +13185,16 @@
12566
13185
 
12567
13186
  React__namespace.useEffect(function () {
12568
13187
  setNumberOfLayers(serviceIds.reduce(function (totalNumberOfLayers, serviceId) {
12569
- return totalNumberOfLayers + filterLayersFromService(serviceId, services, keywordIds, allKeywordsActive, searchString).length;
13188
+ return totalNumberOfLayers + filterLayersFromService(serviceId, services, filterIds, allFiltersActive, searchString).length;
12570
13189
  }, 0));
12571
13190
  setLayersFilteredFromService(serviceIds.reduce(function (layerList, serviceId) {
12572
- return layerList.concat(filterLayersFromService(serviceId, services, keywordIds, allKeywordsActive, searchString).map(function (layer) {
13191
+ return layerList.concat(filterLayersFromService(serviceId, services, filterIds, allFiltersActive, searchString).map(function (layer) {
12573
13192
  return __assign(__assign({}, layer), {
12574
13193
  serviceId: serviceId
12575
13194
  });
12576
13195
  }));
12577
13196
  }, []));
12578
- }, [serviceIds, keywordIds, services, searchString, allKeywordsActive]);
13197
+ }, [serviceIds, filterIds, services, searchString, allFiltersActive]);
12579
13198
  return /*#__PURE__*/React__namespace.createElement(material.Box, {
12580
13199
  "data-testid": "layerList"
12581
13200
  }, /*#__PURE__*/React__namespace.createElement(material.Box, {
@@ -12586,21 +13205,21 @@
12586
13205
  }, numberOfLayers, " results"), /*#__PURE__*/React__namespace.createElement(reactWindow.FixedSizeList, {
12587
13206
  height: layerSelectHeight - layerSelectFilterHeight,
12588
13207
  itemCount: numberOfLayers,
12589
- itemSize: 68
13208
+ itemSize: 72
12590
13209
  }, function (_a) {
12591
13210
  var index = _a.index,
12592
13211
  style = _a.style;
12593
13212
  return /*#__PURE__*/React__namespace.createElement("div", {
12594
13213
  style: style,
12595
13214
  key: layersFilteredFromService[index].name
12596
- }, /*#__PURE__*/React__namespace.createElement(LayerListRow, {
13215
+ }, services[layersFilteredFromService[index].serviceId] && /*#__PURE__*/React__namespace.createElement(LayerListRow, {
12597
13216
  layer: layersFilteredFromService[index],
12598
13217
  layerIndex: index,
12599
13218
  service: services[layersFilteredFromService[index].serviceId],
12600
- serviceUrl: services[layersFilteredFromService[index].serviceId].serviceUrl,
12601
13219
  addLayer: addLayer,
12602
13220
  deleteLayer: deleteLayer,
12603
- mapLayers: mapLayers
13221
+ mapLayers: mapLayers,
13222
+ mapId: mapId
12604
13223
  }));
12605
13224
  }));
12606
13225
  };
@@ -12618,13 +13237,14 @@
12618
13237
  * See the License for the specific language governing permissions and
12619
13238
  * limitations under the License.
12620
13239
  *
12621
- * Copyright 2021 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
12622
- * Copyright 2021 - Finnish Meteorological Institute (FMI)
13240
+ * Copyright 2022 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
13241
+ * Copyright 2022 - Finnish Meteorological Institute (FMI)
12623
13242
  * */
12624
13243
 
12625
13244
  var LayerListConnect = function LayerListConnect(_a) {
12626
13245
  var mapId = _a.mapId,
12627
- layerSelectHeight = _a.layerSelectHeight;
13246
+ layerSelectHeight = _a.layerSelectHeight,
13247
+ serviceListHeight = _a.serviceListHeight;
12628
13248
  var services = reactRedux.useSelector(function (store) {
12629
13249
  return getServices(store);
12630
13250
  });
@@ -12674,11 +13294,11 @@
12674
13294
  origin: LayerActionOrigin.layerManager
12675
13295
  }));
12676
13296
  }, [dispatch, mapId]);
12677
- var checkedKeywordIds = reactRedux.useSelector(function (store) {
12678
- return getCheckedKeywordIds(store);
13297
+ var checkedFilterIds = reactRedux.useSelector(function (store) {
13298
+ return getCheckedFilterIds(store);
12679
13299
  });
12680
- var allKeywordsActive = reactRedux.useSelector(function (store) {
12681
- return isAllKeywordsChecked(store);
13300
+ var allFiltersActive = reactRedux.useSelector(function (store) {
13301
+ return isAllFiltersChecked(store);
12682
13302
  });
12683
13303
  var searchString = reactRedux.useSelector(function (store) {
12684
13304
  return getSearchFilter(store);
@@ -12687,12 +13307,14 @@
12687
13307
  services: services,
12688
13308
  serviceIds: enabledServiceIds,
12689
13309
  layerSelectHeight: layerSelectHeight,
13310
+ serviceListHeight: serviceListHeight,
12690
13311
  addLayer: addLayer,
12691
13312
  deleteLayer: deleteLayer,
12692
- keywordIds: checkedKeywordIds,
12693
- allKeywordsActive: allKeywordsActive,
13313
+ filterIds: checkedFilterIds,
13314
+ allFiltersActive: allFiltersActive,
12694
13315
  searchString: searchString,
12695
- mapLayers: mapLayers
13316
+ mapLayers: mapLayers,
13317
+ mapId: mapId
12696
13318
  });
12697
13319
  };
12698
13320
 
@@ -12709,8 +13331,8 @@
12709
13331
  * See the License for the specific language governing permissions and
12710
13332
  * limitations under the License.
12711
13333
  *
12712
- * Copyright 2021 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
12713
- * Copyright 2021 - Finnish Meteorological Institute (FMI)
13334
+ * Copyright 2022 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
13335
+ * Copyright 2022 - Finnish Meteorological Institute (FMI)
12714
13336
  * */
12715
13337
  var style = {
12716
13338
  borderRadius: '20px!important',
@@ -12719,7 +13341,8 @@
12719
13341
  height: '32px!important',
12720
13342
  padding: '5px 12px!important',
12721
13343
  textTransform: 'none!important',
12722
- fontWeight: 'normal'
13344
+ fontWeight: 'normal',
13345
+ marginBottom: '5px'
12723
13346
  };
12724
13347
 
12725
13348
  var ServiceChip = function ServiceChip(_a) {
@@ -12729,7 +13352,9 @@
12729
13352
  isSelected = _a.isSelected,
12730
13353
  isDisabled = _a.isDisabled,
12731
13354
  toggleChip = _a.toggleChip;
12732
- return /*#__PURE__*/React__namespace.createElement(shared.CustomToggleButton, {
13355
+ return /*#__PURE__*/React__namespace.createElement(material.Tooltip, {
13356
+ title: (service === null || service === void 0 ? void 0 : service["abstract"]) ? "Abstract: " + service["abstract"] : ''
13357
+ }, /*#__PURE__*/React__namespace.createElement(shared.CustomToggleButton, {
12733
13358
  variant: "boxed",
12734
13359
  selected: isSelected,
12735
13360
  tabIndex: 0,
@@ -12742,7 +13367,7 @@
12742
13367
  },
12743
13368
  disabled: isDisabled,
12744
13369
  sx: style
12745
- }, service ? service.serviceName : 'All');
13370
+ }, service ? service.serviceName : 'All'));
12746
13371
  };
12747
13372
 
12748
13373
  /* *
@@ -12768,82 +13393,79 @@
12768
13393
  serviceId = _a.serviceId,
12769
13394
  service = _a.service,
12770
13395
  isSelected = _a.isSelected,
13396
+ isAllSelected = _a.isAllSelected,
12771
13397
  isDisabled = _a.isDisabled;
12772
13398
  var dispatch = reactRedux.useDispatch();
12773
13399
  var activeServices = reactRedux.useSelector(function (store) {
12774
13400
  return getActiveServices(store);
12775
13401
  });
12776
13402
 
12777
- var toggleChip = function toggleChip(service) {
12778
- var e_1, _a, e_2, _b;
13403
+ var setAllServicesEnabled = function setAllServicesEnabled(allServicesEnabled) {
13404
+ dispatch(layerSelectActions.setAllServicesEnabled({
13405
+ allServicesEnabled: allServicesEnabled
13406
+ }));
13407
+ };
13408
+
13409
+ var hasSelectedStyle = !isAllSelected && isSelected || isAllSelected && service === 'all';
12779
13410
 
13411
+ var toggleChip = function toggleChip(service) {
12780
13412
  if (service === 'all') {
12781
13413
  if (isSelected) {
12782
- try {
12783
- for (var _c = __values(Object.entries(activeServices)), _d = _c.next(); !_d.done; _d = _c.next()) {
12784
- var _e = __read(_d.value, 2),
12785
- key = _e[0],
12786
- value = _e[1];
12787
-
12788
- var serviceID = key;
12789
- var service_1 = value;
12790
-
12791
- if (service_1.enabled) {
12792
- dispatch(layerSelectActions.disableActiveService({
12793
- serviceId: serviceID,
12794
- keywords: service_1.keywordsPerService
12795
- }));
12796
- }
13414
+ setAllServicesEnabled(false);
13415
+ Object.entries(activeServices).forEach(function (_a) {
13416
+ var _b = __read(_a, 2),
13417
+ serviceID = _b[0],
13418
+ service = _b[1];
13419
+
13420
+ if (service.enabled) {
13421
+ dispatch(layerSelectActions.disableActiveService({
13422
+ serviceId: serviceID,
13423
+ filters: service.filterIds
13424
+ }));
12797
13425
  }
12798
- } catch (e_1_1) {
12799
- e_1 = {
12800
- error: e_1_1
12801
- };
12802
- } finally {
12803
- try {
12804
- if (_d && !_d.done && (_a = _c["return"])) _a.call(_c);
12805
- } finally {
12806
- if (e_1) throw e_1.error;
12807
- }
12808
- }
13426
+ });
12809
13427
  } else {
12810
- try {
12811
- for (var _f = __values(Object.entries(activeServices)), _g = _f.next(); !_g.done; _g = _f.next()) {
12812
- var _h = __read(_g.value, 2),
12813
- key = _h[0],
12814
- value = _h[1];
12815
-
12816
- var serviceID = key;
12817
- var service_2 = value;
12818
-
12819
- if (!service_2.enabled) {
12820
- dispatch(layerSelectActions.enableActiveService({
12821
- serviceId: serviceID,
12822
- keywords: service_2.keywordsPerService
12823
- }));
12824
- }
13428
+ setAllServicesEnabled(true);
13429
+ Object.entries(activeServices).forEach(function (_a) {
13430
+ var _b = __read(_a, 2),
13431
+ serviceID = _b[0],
13432
+ service = _b[1];
13433
+
13434
+ if (!service.enabled) {
13435
+ dispatch(layerSelectActions.enableActiveService({
13436
+ serviceId: serviceID,
13437
+ filters: service.filterIds
13438
+ }));
12825
13439
  }
12826
- } catch (e_2_1) {
12827
- e_2 = {
12828
- error: e_2_1
12829
- };
12830
- } finally {
12831
- try {
12832
- if (_g && !_g.done && (_b = _f["return"])) _b.call(_f);
12833
- } finally {
12834
- if (e_2) throw e_2.error;
12835
- }
12836
- }
13440
+ });
12837
13441
  }
12838
13442
  } else if (isSelected) {
12839
- dispatch(layerSelectActions.disableActiveService({
12840
- serviceId: serviceId,
12841
- keywords: activeServices[serviceId].keywordsPerService
12842
- }));
13443
+ if (isAllSelected) {
13444
+ setAllServicesEnabled(false);
13445
+ Object.entries(activeServices).forEach(function (_a) {
13446
+ var _b = __read(_a, 2),
13447
+ serviceID = _b[0],
13448
+ service = _b[1];
13449
+
13450
+ var shouldDisable = service.enabled && serviceID !== serviceId;
13451
+
13452
+ if (shouldDisable) {
13453
+ dispatch(layerSelectActions.disableActiveService({
13454
+ serviceId: serviceID,
13455
+ filters: service.filterIds
13456
+ }));
13457
+ }
13458
+ });
13459
+ } else {
13460
+ dispatch(layerSelectActions.disableActiveService({
13461
+ serviceId: serviceId,
13462
+ filters: activeServices[serviceId].filterIds
13463
+ }));
13464
+ }
12843
13465
  } else {
12844
13466
  dispatch(layerSelectActions.enableActiveService({
12845
13467
  serviceId: serviceId,
12846
- keywords: activeServices[serviceId].keywordsPerService
13468
+ filters: activeServices[serviceId].filterIds
12847
13469
  }));
12848
13470
  }
12849
13471
  };
@@ -12852,7 +13474,7 @@
12852
13474
  service: service,
12853
13475
  all: all,
12854
13476
  toggleChip: toggleChip,
12855
- isSelected: isSelected,
13477
+ isSelected: hasSelectedStyle,
12856
13478
  isDisabled: isDisabled
12857
13479
  });
12858
13480
  };
@@ -12875,114 +13497,42 @@
12875
13497
  * */
12876
13498
 
12877
13499
  var ServiceList = function ServiceList(_a) {
12878
- var layerSelectWidth = _a.layerSelectWidth,
12879
- activeServices = _a.activeServices;
12880
-
12881
- var _b = __read(React__namespace.useState(0), 2),
12882
- margin = _b[0],
12883
- setMargin = _b[1];
12884
-
12885
- var _c = __read(React__namespace.useState(0), 2),
12886
- width = _c[0],
12887
- setWidth = _c[1];
12888
-
12889
- var _d = __read(React__namespace.useState(null), 2),
12890
- intervalId = _d[0],
12891
- setIntervalId = _d[1];
12892
-
13500
+ var activeServices = _a.activeServices,
13501
+ setHeight = _a.setHeight;
12893
13502
  var ref = React__namespace.useRef(null);
12894
- var scrollSpeed = 5;
12895
- var maxWidthValue = ref && ref.current && ref.current.scrollWidth && ref.current.scrollWidth >= layerSelectWidth - margin && ref.current.scrollWidth || layerSelectWidth - 50;
12896
-
12897
- var onMouseWheelScroll = function onMouseWheelScroll(e) {
12898
- var delta = e.deltaY;
12899
- var scrollSpeed = 0.1;
12900
- 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));
12901
- };
12902
-
12903
- var onLeftChevronPressed = function onLeftChevronPressed() {
12904
- setMargin(function (prevMargin) {
12905
- return Math.max(prevMargin - scrollSpeed, 0);
12906
- });
12907
- setIntervalId(setInterval(function () {
12908
- setMargin(function (prevMargin) {
12909
- return Math.max(prevMargin - scrollSpeed, 0);
12910
- });
12911
- }, 20));
12912
- };
12913
-
12914
- var onRightChevronPressed = React__namespace.useCallback(function () {
12915
- setMargin(function (prevMargin) {
12916
- return Math.min(prevMargin + scrollSpeed, width - layerSelectWidth);
12917
- });
12918
- setIntervalId(setInterval(function () {
12919
- setMargin(function (prevMargin) {
12920
- return Math.min(prevMargin + scrollSpeed, width - layerSelectWidth);
12921
- });
12922
- }, 20));
12923
- }, [width, layerSelectWidth]);
12924
13503
 
12925
- var onChevronMouseUp = function onChevronMouseUp() {
12926
- clearInterval(intervalId);
12927
- setIntervalId(null);
12928
- };
13504
+ var _b = __read(React__namespace.useState(0), 2),
13505
+ serviceListHeight = _b[0],
13506
+ setServiceListHeight = _b[1];
12929
13507
 
13508
+ var clientHeight = ref && ref.current && ref.current.clientHeight && ref.current.clientHeight;
12930
13509
  React__namespace.useEffect(function () {
12931
- setWidth(ref.current.scrollWidth + 50);
12932
- setMargin(Math.max(0, Math.min(width - layerSelectWidth, margin)));
12933
-
12934
- if ((margin === 0 || layerSelectWidth + margin === width) && intervalId != null) {
12935
- clearInterval(intervalId);
12936
- setIntervalId(null);
13510
+ if (ref && ref.current && ref.current.clientHeight) {
13511
+ setServiceListHeight(ref.current.clientHeight);
12937
13512
  }
12938
- }, [activeServices, layerSelectWidth, width, margin, intervalId]);
13513
+ }, [activeServices, clientHeight]);
13514
+ React__namespace.useEffect(function () {
13515
+ setHeight(serviceListHeight);
13516
+ }, [serviceListHeight, setHeight]);
12939
13517
  var isAllSelected = Object.values(activeServices).every(function (activeService) {
12940
13518
  return activeService.enabled;
12941
13519
  });
12942
13520
  return /*#__PURE__*/React__namespace.createElement(material.Box, {
12943
13521
  sx: {
12944
- height: '32px',
12945
13522
  marginTop: '8px',
12946
13523
  width: '100%',
12947
13524
  overflow: 'hidden'
12948
13525
  },
12949
- "data-testid": "serviceList",
12950
- onWheel: onMouseWheelScroll
12951
- }, margin !== 0 && /*#__PURE__*/React__namespace.createElement(theme.ChevronLeft, {
12952
- onMouseDown: onLeftChevronPressed,
12953
- onMouseUp: onChevronMouseUp,
12954
- "data-testid": "leftScrollArrow",
12955
- // eslint-disable-next-line @typescript-eslint/explicit-function-return-type
12956
- sx: function sx(theme) {
12957
- return {
12958
- width: '100px',
12959
- marginBottom: '-12px',
12960
- height: '34px',
12961
- backgroundImage: "linear-gradient(to left, rgba(0, 0, 0, 0), " + theme.palette.geowebColors.background.surfaceApp + " 51%)",
12962
- cursor: 'pointer',
12963
- marginRight: '-120px',
12964
- paddingTop: '6px',
12965
- paddingBottom: '6px',
12966
- "float": 'left',
12967
- zIndex: 1,
12968
- position: 'relative',
12969
- color: 'geowebColors.buttons.tertiary.default.color',
12970
- '&:hover': {
12971
- color: 'geowebColors.buttons.tertiary.activeMouseOver.color'
12972
- }
12973
- };
12974
- }
12975
- }), /*#__PURE__*/React__namespace.createElement(material.Box, {
13526
+ "data-testid": "serviceList"
13527
+ }, /*#__PURE__*/React__namespace.createElement(material.Box, {
12976
13528
  sx: {
12977
13529
  width: '100%',
12978
- display: 'inline-flex',
13530
+ display: 'block',
12979
13531
  alignItems: 'center',
12980
- overflowX: 'visible',
12981
13532
  "float": 'left',
12982
13533
  paddingLeft: '40px',
12983
- marginRight: margin + "px",
12984
- marginLeft: -margin + "px",
12985
- maxWidth: maxWidthValue,
13534
+ paddingRight: '30px',
13535
+ marginBottom: '5px',
12986
13536
  fontSize: '0.875rem'
12987
13537
  },
12988
13538
  ref: ref
@@ -12999,32 +13549,10 @@
12999
13549
  serviceId: serviceId,
13000
13550
  service: service,
13001
13551
  isSelected: (_a = activeServices[serviceId]) === null || _a === void 0 ? void 0 : _a.enabled,
13552
+ isAllSelected: isAllSelected,
13002
13553
  isDisabled: activeServices[serviceId] === undefined
13003
13554
  });
13004
- })), layerSelectWidth + margin < width && /*#__PURE__*/React__namespace.createElement(theme.ChevronRight // eslint-disable-next-line @typescript-eslint/explicit-function-return-type
13005
- , {
13006
- // eslint-disable-next-line @typescript-eslint/explicit-function-return-type
13007
- sx: function sx(theme) {
13008
- return {
13009
- width: '100px',
13010
- marginBottom: '-12px',
13011
- height: '34px',
13012
- paddingTop: '6px',
13013
- paddingBottom: '6px',
13014
- backgroundImage: "linear-gradient(to right, rgba(0, 0, 0, 0), " + theme.palette.geowebColors.background.surfaceApp + " 51%)",
13015
- right: '0px',
13016
- position: 'fixed',
13017
- cursor: 'pointer',
13018
- color: 'geowebColors.buttons.tertiary.default.color',
13019
- '&:hover': {
13020
- color: 'geowebColors.buttons.tertiary.activeMouseOver.color'
13021
- }
13022
- };
13023
- },
13024
- onMouseDown: onRightChevronPressed,
13025
- onMouseUp: onChevronMouseUp,
13026
- "data-testid": "rightScrollArrow"
13027
- }));
13555
+ })));
13028
13556
  };
13029
13557
 
13030
13558
  /* *
@@ -13040,18 +13568,37 @@
13040
13568
  * See the License for the specific language governing permissions and
13041
13569
  * limitations under the License.
13042
13570
  *
13043
- * Copyright 2021 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
13044
- * Copyright 2021 - Finnish Meteorological Institute (FMI)
13571
+ * Copyright 2022 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
13572
+ * Copyright 2022 - Finnish Meteorological Institute (FMI)
13045
13573
  * */
13574
+ var sortByService = function sortByService(serviceObj) {
13575
+ return Object.entries(serviceObj).sort(function (_a, _b) {
13576
+ var _c = __read(_a, 2),
13577
+ a = _c[1];
13578
+
13579
+ var _d = __read(_b, 2),
13580
+ b = _d[1];
13581
+
13582
+ return a.serviceName.localeCompare(b.serviceName);
13583
+ }).reduce(function (r, _a) {
13584
+ var _b;
13585
+
13586
+ var _c = __read(_a, 2),
13587
+ key = _c[0],
13588
+ value = _c[1];
13589
+
13590
+ return __assign(__assign({}, r), (_b = {}, _b[key] = value, _b));
13591
+ }, {});
13592
+ };
13046
13593
 
13047
13594
  var ServiceListConnect = function ServiceListConnect(_a) {
13048
- var layerSelectWidth = _a.layerSelectWidth;
13595
+ var setHeight = _a.setHeight;
13049
13596
  var activeServices = reactRedux.useSelector(function (store) {
13050
13597
  return getActiveServices(store);
13051
13598
  });
13052
13599
  return /*#__PURE__*/React__namespace.createElement(ServiceList, {
13053
- layerSelectWidth: layerSelectWidth,
13054
- activeServices: activeServices
13600
+ setHeight: setHeight,
13601
+ activeServices: sortByService(activeServices)
13055
13602
  });
13056
13603
  };
13057
13604
 
@@ -13107,43 +13654,62 @@
13107
13654
 
13108
13655
  var ServiceOptionsDialog = function ServiceOptionsDialog(_a) {
13109
13656
  var services = _a.services,
13110
- mapStoreRemoveService = _a.mapStoreRemoveService;
13111
-
13112
- var _b = __read(React__namespace.useState(false), 2),
13113
- addServiceIsOpen = _b[0],
13114
- setAddServiceIsOpen = _b[1];
13115
-
13116
- var _c = __read(React__namespace.useState({
13117
- isOpen: false,
13118
- serviceId: '',
13119
- serviceUrl: ''
13120
- }), 2),
13121
- editServiceIsOpen = _c[0],
13122
- setEditServiceIsOpen = _c[1];
13657
+ layerSelectRemoveService = _a.layerSelectRemoveService,
13658
+ selectedLayers = _a.selectedLayers,
13659
+ setServicePopupInfo = _a.setServicePopupInfo;
13123
13660
 
13124
13661
  var openAddService = function openAddService() {
13125
- setAddServiceIsOpen(true);
13662
+ setServicePopupInfo({
13663
+ isOpen: true,
13664
+ popupVariant: 'add'
13665
+ });
13126
13666
  };
13127
13667
 
13128
- var closePopup = function closePopup() {
13129
- setAddServiceIsOpen(false);
13130
- setEditServiceIsOpen({
13131
- isOpen: false,
13132
- serviceId: '',
13133
- serviceUrl: ''
13668
+ return /*#__PURE__*/React__namespace.createElement(material.Box, {
13669
+ sx: styles$1.servicesContainer,
13670
+ "data-testid": "ServiceDialog"
13671
+ }, /*#__PURE__*/React__namespace.createElement(material.Box, {
13672
+ sx: styles$1.header
13673
+ }, "Services"), /*#__PURE__*/React__namespace.createElement(Rows, {
13674
+ services: services,
13675
+ layerSelectRemoveService: layerSelectRemoveService,
13676
+ setServicePopupInfo: setServicePopupInfo,
13677
+ selectedLayers: selectedLayers
13678
+ }), /*#__PURE__*/React__namespace.createElement(material.Box, {
13679
+ sx: styles$1.footer
13680
+ }, /*#__PURE__*/React__namespace.createElement(material.Button, {
13681
+ onClick: openAddService,
13682
+ "data-testid": "openAddServiceButton",
13683
+ sx: styles$1.button,
13684
+ variant: "tertiary",
13685
+ startIcon: /*#__PURE__*/React__namespace.createElement(theme.Add, null)
13686
+ }, "Add a new service")));
13687
+ };
13688
+
13689
+ var Rows = function Rows(_a) {
13690
+ var services = _a.services,
13691
+ layerSelectRemoveService = _a.layerSelectRemoveService,
13692
+ setServicePopupInfo = _a.setServicePopupInfo,
13693
+ selectedLayers = _a.selectedLayers;
13694
+
13695
+ var checkIfServiceHasActiveLayers = function checkIfServiceHasActiveLayers(serviceUrl) {
13696
+ var foundService = selectedLayers.find(function (object) {
13697
+ return object.service === serviceUrl;
13134
13698
  });
13699
+ if (foundService) return true;
13700
+ return false;
13135
13701
  };
13136
13702
 
13137
- return /*#__PURE__*/React__namespace.createElement(React__namespace.Fragment, null, /*#__PURE__*/React__namespace.createElement(material.Box, {
13138
- sx: styles$1.servicesContainer,
13139
- "data-testid": "ServiceDialog"
13140
- }, /*#__PURE__*/React__namespace.createElement(material.Box, {
13141
- sx: styles$1.header
13142
- }, "Services"), /*#__PURE__*/React__namespace.createElement(material.List, {
13703
+ return /*#__PURE__*/React__namespace.createElement(material.List, {
13143
13704
  disablePadding: true
13144
13705
  }, Object.keys(services).map(function (serviceId) {
13706
+ var _a = services[serviceId],
13707
+ serviceUrl = _a.serviceUrl,
13708
+ serviceName = _a.serviceName,
13709
+ isUserAddedService = _a.isUserAddedService;
13710
+ var serviceHasActiveLayers = checkIfServiceHasActiveLayers(serviceUrl);
13145
13711
  return /*#__PURE__*/React__namespace.createElement(material.ListItem, {
13146
- key: services[serviceId].serviceUrl
13712
+ key: serviceUrl
13147
13713
  }, /*#__PURE__*/React__namespace.createElement(material.ListItemText, {
13148
13714
  style: {
13149
13715
  fontSize: '16px'
@@ -13154,53 +13720,59 @@
13154
13720
  textOverflow: 'ellipsis',
13155
13721
  paddingRight: '60px'
13156
13722
  }
13157
- }, services[serviceId].serviceName)), /*#__PURE__*/React__namespace.createElement(material.ListItemSecondaryAction, {
13723
+ }, serviceName)), /*#__PURE__*/React__namespace.createElement(material.ListItemSecondaryAction, {
13158
13724
  style: {
13159
- marginRight: '-10px'
13160
- }
13161
- }, /*#__PURE__*/React__namespace.createElement(material.Tooltip, {
13162
- title: "Edit Service",
13163
- disableHoverListener: !services[serviceId].isUserAddedService
13725
+ marginRight: '-10px',
13726
+ width: 90
13727
+ }
13728
+ }, /*#__PURE__*/React__namespace.createElement(material.Grid, {
13729
+ container: true
13730
+ }, /*#__PURE__*/React__namespace.createElement(material.Grid, {
13731
+ item: true,
13732
+ xs: 6
13733
+ }, isUserAddedService ? /*#__PURE__*/React__namespace.createElement(material.Tooltip, {
13734
+ title: "Edit Service"
13164
13735
  }, /*#__PURE__*/React__namespace.createElement("span", null, /*#__PURE__*/React__namespace.createElement(material.IconButton, {
13165
- disabled: !services[serviceId].isUserAddedService,
13736
+ "aria-label": "edit service",
13166
13737
  "data-testid": "openEditServiceButton",
13167
13738
  size: "large",
13168
13739
  onClick: function onClick() {
13169
- setEditServiceIsOpen({
13740
+ setServicePopupInfo({
13170
13741
  isOpen: true,
13171
13742
  serviceId: serviceId,
13172
- serviceUrl: services[serviceId].serviceUrl
13743
+ serviceUrl: serviceUrl,
13744
+ popupVariant: 'edit'
13173
13745
  });
13174
13746
  }
13175
- }, /*#__PURE__*/React__namespace.createElement(theme.Edit, null)))), /*#__PURE__*/React__namespace.createElement(material.Tooltip, {
13176
- title: "Delete Service",
13177
- disableHoverListener: !services[serviceId].isUserAddedService
13747
+ }, /*#__PURE__*/React__namespace.createElement(theme.Edit, null)))) : /*#__PURE__*/React__namespace.createElement(material.Tooltip, {
13748
+ title: "Show Service"
13178
13749
  }, /*#__PURE__*/React__namespace.createElement("span", null, /*#__PURE__*/React__namespace.createElement(material.IconButton, {
13750
+ "aria-label": "show service",
13751
+ "data-testid": "openShowServiceButton",
13179
13752
  size: "large",
13180
- disabled: !services[serviceId].isUserAddedService,
13181
13753
  onClick: function onClick() {
13182
- return mapStoreRemoveService(serviceId, services[serviceId].serviceUrl);
13183
- },
13184
- "data-testid": "removeServiceButton"
13185
- }, /*#__PURE__*/React__namespace.createElement(theme.Delete, null))))));
13186
- })), /*#__PURE__*/React__namespace.createElement(material.Box, {
13187
- sx: styles$1.footer
13188
- }, /*#__PURE__*/React__namespace.createElement(material.Button, {
13189
- onClick: openAddService,
13190
- "data-testid": "openAddServiceButton",
13191
- sx: styles$1.button,
13192
- variant: "tertiary",
13193
- startIcon: /*#__PURE__*/React__namespace.createElement(theme.Add, null)
13194
- }, "Add a new service"))), addServiceIsOpen && /*#__PURE__*/React__namespace.createElement(ServicePopupConnect, {
13195
- servicePopupVariant: "add",
13196
- isOpen: addServiceIsOpen,
13197
- closePopup: closePopup
13198
- }), editServiceIsOpen && /*#__PURE__*/React__namespace.createElement(ServicePopupConnect, {
13199
- servicePopupVariant: "edit",
13200
- isOpen: editServiceIsOpen.isOpen,
13201
- closePopup: closePopup,
13202
- serviceId: editServiceIsOpen.serviceId,
13203
- url: editServiceIsOpen.serviceUrl
13754
+ setServicePopupInfo({
13755
+ isOpen: true,
13756
+ serviceId: serviceId,
13757
+ serviceUrl: serviceUrl,
13758
+ popupVariant: 'show'
13759
+ });
13760
+ }
13761
+ }, /*#__PURE__*/React__namespace.createElement(theme.Visibility, null))))), /*#__PURE__*/React__namespace.createElement(material.Grid, {
13762
+ item: true,
13763
+ xs: 6
13764
+ }, isUserAddedService && /*#__PURE__*/React__namespace.createElement(material.Box, null, /*#__PURE__*/React__namespace.createElement(material.Tooltip, {
13765
+ title: serviceHasActiveLayers ? 'Service has active layers. Cannot remove this service' : 'Delete Service',
13766
+ "data-testid": "removeServiceTooltip"
13767
+ }, /*#__PURE__*/React__namespace.createElement("span", null, /*#__PURE__*/React__namespace.createElement(material.IconButton, {
13768
+ "data-testid": "removeServiceButton",
13769
+ "aria-label": "delete service",
13770
+ size: "large",
13771
+ disabled: serviceHasActiveLayers,
13772
+ onClick: function onClick() {
13773
+ return layerSelectRemoveService(serviceId, serviceUrl);
13774
+ }
13775
+ }, /*#__PURE__*/React__namespace.createElement(theme.Delete, null)))))))));
13204
13776
  }));
13205
13777
  };
13206
13778
 
@@ -13221,20 +13793,27 @@
13221
13793
  * Copyright 2022 - Finnish Meteorological Institute (FMI)
13222
13794
  * */
13223
13795
 
13224
- var ServiceOptionsDialogConnect = function ServiceOptionsDialogConnect() {
13796
+ var ServiceOptionsDialogConnect = function ServiceOptionsDialogConnect(_a) {
13797
+ var mapId = _a.mapId,
13798
+ setServicePopupInfo = _a.setServicePopupInfo;
13225
13799
  var dispatch = reactRedux.useDispatch();
13226
- var mapStoreRemoveService = React__namespace.useCallback(function (serviceId, serviceUrl) {
13227
- dispatch(serviceActions.mapStoreRemoveService({
13228
- id: serviceId,
13800
+ var layerSelectRemoveService = React__namespace.useCallback(function (serviceId, serviceUrl) {
13801
+ dispatch(layerSelectActions.layerSelectRemoveService({
13802
+ serviceId: serviceId,
13229
13803
  serviceUrl: serviceUrl
13230
13804
  }));
13231
13805
  }, [dispatch]);
13232
13806
  var services = reactRedux.useSelector(function (store) {
13233
13807
  return getActiveServices(store);
13234
13808
  });
13809
+ var selectedLayers = reactRedux.useSelector(function (store) {
13810
+ return getMapLayers(store, mapId);
13811
+ });
13235
13812
  return /*#__PURE__*/React__namespace.createElement(ServiceOptionsDialog, {
13813
+ selectedLayers: selectedLayers,
13236
13814
  services: services,
13237
- mapStoreRemoveService: mapStoreRemoveService
13815
+ layerSelectRemoveService: layerSelectRemoveService,
13816
+ setServicePopupInfo: setServicePopupInfo
13238
13817
  });
13239
13818
  };
13240
13819
 
@@ -13255,11 +13834,34 @@
13255
13834
  * Copyright 2021 - Finnish Meteorological Institute (FMI)
13256
13835
  * */
13257
13836
 
13258
- var ServiceOptionsButton = function ServiceOptionsButton() {
13259
- return /*#__PURE__*/React__namespace.createElement(shared.ToggleMenu, {
13837
+ var ServiceOptionsButton = function ServiceOptionsButton(_a) {
13838
+ var mapId = _a.mapId;
13839
+
13840
+ var _b = __read(React__namespace.useState({
13841
+ isOpen: false
13842
+ }), 2),
13843
+ servicePopupInfo = _b[0],
13844
+ setServicePopupInfo = _b[1];
13845
+
13846
+ var closePopup = function closePopup() {
13847
+ setServicePopupInfo({
13848
+ isOpen: false
13849
+ });
13850
+ };
13851
+
13852
+ return /*#__PURE__*/React__namespace.createElement(React__namespace.Fragment, null, /*#__PURE__*/React__namespace.createElement(shared.ToggleMenu, {
13260
13853
  buttonTestId: "serviceOptionsButton",
13261
13854
  menuPosition: "bottom"
13262
- }, /*#__PURE__*/React__namespace.createElement(ServiceOptionsDialogConnect, null));
13855
+ }, /*#__PURE__*/React__namespace.createElement(ServiceOptionsDialogConnect, {
13856
+ setServicePopupInfo: setServicePopupInfo,
13857
+ mapId: mapId
13858
+ })), /*#__PURE__*/React__namespace.createElement(ServicePopupConnect, {
13859
+ servicePopupVariant: servicePopupInfo.popupVariant,
13860
+ isOpen: servicePopupInfo.isOpen,
13861
+ closePopup: closePopup,
13862
+ serviceId: servicePopupInfo.serviceId,
13863
+ url: servicePopupInfo.serviceUrl
13864
+ }));
13263
13865
  };
13264
13866
 
13265
13867
  /* *
@@ -13292,6 +13894,7 @@
13292
13894
  order = _d === void 0 ? 0 : _d,
13293
13895
  _e = _a.source,
13294
13896
  source = _e === void 0 ? 'module' : _e;
13897
+ var initialServiceListHeight = 37;
13295
13898
 
13296
13899
  var _f = __read(React__namespace.useState(500), 2),
13297
13900
  height = _f[0],
@@ -13301,6 +13904,10 @@
13301
13904
  width = _g[0],
13302
13905
  setWidth = _g[1];
13303
13906
 
13907
+ var _h = __read(React__namespace.useState(initialServiceListHeight), 2),
13908
+ serviceListHeight = _h[0],
13909
+ setServiceListHeight = _h[1];
13910
+
13304
13911
  var onChangeSize = function onChangeSize(_a) {
13305
13912
  var height = _a.height,
13306
13913
  width = _a.width;
@@ -13308,6 +13915,12 @@
13308
13915
  setWidth(width);
13309
13916
  };
13310
13917
 
13918
+ var handleHeightChange = function handleHeightChange(height) {
13919
+ if (height > initialServiceListHeight) {
13920
+ setServiceListHeight(height);
13921
+ }
13922
+ };
13923
+
13311
13924
  return /*#__PURE__*/React__namespace.createElement(shared.ToolContainerDraggable, {
13312
13925
  title: showTitle ? "Layer Select " + mapId : 'Layer Select',
13313
13926
  startSize: {
@@ -13348,22 +13961,103 @@
13348
13961
  margin: '12px 0 0 calc(100% - 36px)',
13349
13962
  zIndex: 2
13350
13963
  }
13351
- }, /*#__PURE__*/React__namespace.createElement(ServiceOptionsButton, null)), /*#__PURE__*/React__namespace.createElement(material.Box, {
13352
- sx: {
13353
- height: '48px'
13354
- }
13355
- }, /*#__PURE__*/React__namespace.createElement(ServiceListConnect, {
13356
- layerSelectWidth: width
13964
+ }, /*#__PURE__*/React__namespace.createElement(ServiceOptionsButton, {
13965
+ mapId: mapId
13966
+ })), /*#__PURE__*/React__namespace.createElement(material.Box, null, /*#__PURE__*/React__namespace.createElement(ServiceListConnect, {
13967
+ setHeight: handleHeightChange
13357
13968
  })), /*#__PURE__*/React__namespace.createElement(material.Box, {
13358
13969
  sx: {
13359
13970
  padding: '0 8px'
13360
13971
  }
13361
13972
  }, /*#__PURE__*/React__namespace.createElement(LayerListConnect, {
13362
13973
  mapId: mapId,
13363
- layerSelectHeight: height
13974
+ layerSelectHeight: height,
13975
+ serviceListHeight: serviceListHeight
13364
13976
  })));
13365
13977
  };
13366
13978
 
13979
+ /* *
13980
+ * Licensed under the Apache License, Version 2.0 (the "License");
13981
+ * you may not use this file except in compliance with the License.
13982
+ * You may obtain a copy of the License at
13983
+ *
13984
+ * http://www.apache.org/licenses/LICENSE-2.0
13985
+ *
13986
+ * Unless required by applicable law or agreed to in writing, software
13987
+ * distributed under the License is distributed on an "AS IS" BASIS,
13988
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13989
+ * See the License for the specific language governing permissions and
13990
+ * limitations under the License.
13991
+ *
13992
+ * Copyright 2022 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
13993
+ * Copyright 2022 - Finnish Meteorological Institute (FMI)
13994
+ * */
13995
+ var useSetupDialog = function useSetupDialog(dialogType) {
13996
+ var dispatch = reactRedux.useDispatch();
13997
+ var onCloseDialog = React.useCallback(function () {
13998
+ dispatch(uiActions.setToggleOpenDialog({
13999
+ type: dialogType,
14000
+ setOpen: false
14001
+ }));
14002
+ }, [dialogType, dispatch]);
14003
+ var mapId = reactRedux.useSelector(function (store) {
14004
+ return getDialogMapId(store, dialogType);
14005
+ });
14006
+ var isMapPresent = reactRedux.useSelector(function (store) {
14007
+ return getIsMapPresent(store, mapId);
14008
+ }); // Check to ensure the currently active map is still present on screen - if not, close the dialog
14009
+
14010
+ React.useEffect(function () {
14011
+ if (mapId !== '' && !isMapPresent) {
14012
+ onCloseDialog();
14013
+ }
14014
+ }, [mapId, isMapPresent, onCloseDialog]);
14015
+ var registerDialog = React.useCallback(function () {
14016
+ dispatch(uiActions.registerDialog({
14017
+ type: dialogType,
14018
+ setOpen: false
14019
+ }));
14020
+ }, [dialogType, dispatch]);
14021
+ var unregisterDialog = React.useCallback(function () {
14022
+ dispatch(uiActions.unregisterDialog({
14023
+ type: dialogType
14024
+ }));
14025
+ }, [dialogType, dispatch]); // Register this dialog in the store
14026
+
14027
+ React.useEffect(function () {
14028
+ registerDialog();
14029
+ return function () {
14030
+ unregisterDialog();
14031
+ }; // eslint-disable-next-line react-hooks/exhaustive-deps
14032
+ }, []);
14033
+ var uiIsOrderedOnTop = reactRedux.useSelector(function (store) {
14034
+ return getDialogIsOrderedOnTop(store, dialogType);
14035
+ });
14036
+ var setDialogOrder = React.useCallback(function () {
14037
+ if (!uiIsOrderedOnTop) {
14038
+ dispatch(uiActions.orderDialog({
14039
+ type: dialogType
14040
+ }));
14041
+ }
14042
+ }, [dialogType, dispatch, uiIsOrderedOnTop]);
14043
+ var dialogOrder = reactRedux.useSelector(function (store) {
14044
+ return getDialogOrder(store, dialogType);
14045
+ });
14046
+ var uiSource = reactRedux.useSelector(function (store) {
14047
+ return getDialogSource(store, dialogType);
14048
+ });
14049
+ var isDialogOpen = reactRedux.useSelector(function (store) {
14050
+ return getisDialogOpen(store, dialogType);
14051
+ });
14052
+ return {
14053
+ setDialogOrder: setDialogOrder,
14054
+ dialogOrder: dialogOrder,
14055
+ onCloseDialog: onCloseDialog,
14056
+ uiSource: uiSource,
14057
+ isDialogOpen: isDialogOpen
14058
+ };
14059
+ };
14060
+
13367
14061
  /* *
13368
14062
  * Licensed under the Apache License, Version 2.0 (the "License");
13369
14063
  * you may not use this file except in compliance with the License.
@@ -13382,34 +14076,57 @@
13382
14076
  * */
13383
14077
 
13384
14078
  var FilterListItem = function FilterListItem(_a) {
13385
- var keyword = _a.keyword,
13386
- toggleKeywords = _a.toggleKeywords,
13387
- enableOnlyOneKeyword = _a.enableOnlyOneKeyword;
14079
+ var filter = _a.filter,
14080
+ toggleFilter = _a.toggleFilter,
14081
+ enableOnlyOneFilter = _a.enableOnlyOneFilter;
13388
14082
 
13389
14083
  var _b = __read(React__namespace.useState(false), 2),
13390
- hovering = _b[0],
13391
- setHovering = _b[1];
14084
+ isHovering = _b[0],
14085
+ setIsHovering = _b[1];
13392
14086
 
13393
- var handleMouseOver = React__namespace.useCallback(function () {
13394
- setHovering(true);
14087
+ var handleMouseEnter = React__namespace.useCallback(function () {
14088
+ setIsHovering(true);
13395
14089
  }, []);
13396
14090
  var handleMouseLeave = React__namespace.useCallback(function () {
13397
- setHovering(false);
14091
+ setIsHovering(false);
13398
14092
  }, []);
13399
14093
 
13400
- var selectOnlyOne = function selectOnlyOne(keyword) {
13401
- enableOnlyOneKeyword(keyword);
14094
+ var selectOnlyOne = function selectOnlyOne(filterId) {
14095
+ enableOnlyOneFilter(filterId);
14096
+ };
14097
+
14098
+ var toggleCheckbox = function toggleCheckbox(filterId) {
14099
+ toggleFilter([filterId]);
13402
14100
  };
13403
14101
 
13404
- var toggleCheckbox = function toggleCheckbox(keyword) {
13405
- toggleKeywords([keyword]);
14102
+ var mouseMoveRef = React__namespace.useRef(null);
14103
+ React__namespace.useEffect(function () {
14104
+ window.addEventListener('mousemove', checkHover, true);
14105
+ return function () {
14106
+ window.removeEventListener('mousemove', checkHover, true);
14107
+ };
14108
+ });
14109
+
14110
+ var checkHover = function checkHover(e) {
14111
+ if (mouseMoveRef.current) {
14112
+ var mouseOver = mouseMoveRef.current.contains(e.target);
14113
+
14114
+ if (!isHovering && mouseOver) {
14115
+ handleMouseEnter();
14116
+ }
14117
+
14118
+ if (isHovering && !mouseOver) {
14119
+ handleMouseLeave();
14120
+ }
14121
+ }
13406
14122
  };
13407
14123
 
13408
- if (keyword.amountVisible !== 0) {
14124
+ if (filter.amountVisible !== 0) {
13409
14125
  return /*#__PURE__*/React__namespace.createElement("div", {
13410
- onMouseOver: handleMouseOver,
14126
+ ref: mouseMoveRef,
14127
+ onMouseEnter: handleMouseEnter,
13411
14128
  onMouseLeave: handleMouseLeave,
13412
- onFocus: handleMouseOver,
14129
+ onFocus: handleMouseEnter,
13413
14130
  onBlur: handleMouseLeave,
13414
14131
  "data-testid": "filterResultListItem"
13415
14132
  }, /*#__PURE__*/React__namespace.createElement(material.ListItem, {
@@ -13427,9 +14144,9 @@
13427
14144
  }
13428
14145
  }, /*#__PURE__*/React__namespace.createElement(material.Checkbox, {
13429
14146
  color: "secondary",
13430
- checked: keyword.checked,
14147
+ checked: filter.checked,
13431
14148
  onChange: function onChange() {
13432
- return toggleCheckbox(keyword.id);
14149
+ return toggleCheckbox(filter.id);
13433
14150
  },
13434
14151
  sx: {
13435
14152
  paddingTop: '6px',
@@ -13445,14 +14162,14 @@
13445
14162
  whiteSpace: 'nowrap',
13446
14163
  overflow: 'hidden'
13447
14164
  }
13448
- }, keyword.id), hovering ? /*#__PURE__*/React__namespace.createElement(material.ListItemSecondaryAction, null, /*#__PURE__*/React__namespace.createElement(material.IconButton, {
14165
+ }, filter.name, " (", filter.amountVisible, ")"), isHovering ? /*#__PURE__*/React__namespace.createElement(material.ListItemSecondaryAction, null, /*#__PURE__*/React__namespace.createElement(material.IconButton, {
13449
14166
  style: {
13450
14167
  backgroundColor: 'transparent'
13451
14168
  },
13452
14169
  edge: "end",
13453
14170
  size: "small",
13454
14171
  onClick: function onClick() {
13455
- return selectOnlyOne(keyword.id);
14172
+ return selectOnlyOne(filter.id);
13456
14173
  },
13457
14174
  "data-testid": "onlyButton"
13458
14175
  }, /*#__PURE__*/React__namespace.createElement(material.Typography, {
@@ -13485,25 +14202,22 @@
13485
14202
  * */
13486
14203
 
13487
14204
  var KeywordFilterResultsListItemConnect = function KeywordFilterResultsListItemConnect(_a) {
13488
- var keyword = _a.keyword;
14205
+ var filter = _a.filter;
13489
14206
  var dispatch = reactRedux.useDispatch();
13490
- var toggleKeywords = React__namespace.useCallback(function (keywords) {
13491
- dispatch(layerSelectActions.toggleKeywords({
13492
- keywords: keywords
14207
+ var toggleFilter = React__namespace.useCallback(function (filterIds) {
14208
+ dispatch(layerSelectActions.toggleFilter({
14209
+ filterIds: filterIds
13493
14210
  }));
13494
14211
  }, [dispatch]);
13495
- var enableOnlyOneKeyword = React__namespace.useCallback(function (keyword) {
13496
- dispatch(layerSelectActions.enableOnlyOneKeyword({
13497
- keyword: keyword
14212
+ var enableOnlyOneFilter = React__namespace.useCallback(function (filterId) {
14213
+ dispatch(layerSelectActions.enableOnlyOneFilter({
14214
+ filterId: filterId
13498
14215
  }));
13499
14216
  }, [dispatch]);
13500
- var keywordObject = reactRedux.useSelector(function (store) {
13501
- return getKeywordObjectById(store, keyword);
13502
- });
13503
14217
  return /*#__PURE__*/React__namespace.createElement(FilterListItem, {
13504
- keyword: keywordObject,
13505
- toggleKeywords: toggleKeywords,
13506
- enableOnlyOneKeyword: enableOnlyOneKeyword
14218
+ filter: filter,
14219
+ toggleFilter: toggleFilter,
14220
+ enableOnlyOneFilter: enableOnlyOneFilter
13507
14221
  });
13508
14222
  };
13509
14223
 
@@ -13526,26 +14240,26 @@
13526
14240
 
13527
14241
  var KeywordFilterSelectAllSwitchConnect = function KeywordFilterSelectAllSwitchConnect() {
13528
14242
  var dispatch = reactRedux.useDispatch();
13529
- var allKeywordsActive = reactRedux.useSelector(function (store) {
13530
- return isAllKeywordsChecked(store);
14243
+ var allFiltersActive = reactRedux.useSelector(function (store) {
14244
+ return isAllFiltersChecked(store);
13531
14245
  });
13532
- var allKeywordIds = reactRedux.useSelector(function (store) {
13533
- return getAllKeywordIds(store);
14246
+ var allFilterIds = reactRedux.useSelector(function (store) {
14247
+ return getAllFilterIds(store);
13534
14248
  });
13535
- var checkedKeywordIds = reactRedux.useSelector(function (store) {
13536
- return getCheckedKeywordIds(store);
14249
+ var checkedFilterIds = reactRedux.useSelector(function (store) {
14250
+ return getCheckedFilterIds(store);
13537
14251
  });
13538
- var toggleKeywords = React__namespace.useCallback(function () {
13539
- var keywords = allKeywordsActive ? checkedKeywordIds : allKeywordIds.filter(function (id) {
13540
- return !checkedKeywordIds.includes(id);
14252
+ var toggleFilters = React__namespace.useCallback(function () {
14253
+ var filterIds = allFiltersActive ? checkedFilterIds : allFilterIds.filter(function (id) {
14254
+ return !checkedFilterIds.includes(id);
13541
14255
  });
13542
- dispatch(layerSelectActions.toggleKeywords({
13543
- keywords: keywords
14256
+ dispatch(layerSelectActions.toggleFilter({
14257
+ filterIds: filterIds
13544
14258
  }));
13545
- }, [allKeywordIds, allKeywordsActive, checkedKeywordIds, dispatch]);
14259
+ }, [allFilterIds, allFiltersActive, checkedFilterIds, dispatch]);
13546
14260
  return /*#__PURE__*/React__namespace.createElement(material.Switch, {
13547
- checked: allKeywordsActive,
13548
- onChange: toggleKeywords,
14261
+ checked: allFiltersActive,
14262
+ onChange: toggleFilters,
13549
14263
  "data-testid": "customSwitch"
13550
14264
  });
13551
14265
  };
@@ -13566,23 +14280,39 @@
13566
14280
  * Copyright 2022 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
13567
14281
  * Copyright 2022 - Finnish Meteorological Institute (FMI)
13568
14282
  * */
14283
+ var DIALOG_TITLE = 'Groups & Keywords';
13569
14284
 
13570
14285
  var KeywordFilterResults = function KeywordFilterResults(_a) {
13571
- var allKeywordIds = _a.allKeywordIds,
13572
- mapId = _a.mapId,
14286
+ var _b, _c;
14287
+
14288
+ var filters = _a.filters,
13573
14289
  bounds = _a.bounds,
13574
- _b = _a.onClose,
13575
- onClose = _b === void 0 ? function () {} : _b,
13576
- showTitle = _a.showTitle,
14290
+ _d = _a.onClose,
14291
+ onClose = _d === void 0 ? function () {} : _d,
13577
14292
  isOpen = _a.isOpen,
13578
- _c = _a.onMouseDown,
13579
- onMouseDown = _c === void 0 ? function () {} : _c,
13580
- _d = _a.order,
13581
- order = _d === void 0 ? 0 : _d,
13582
- _e = _a.source,
13583
- source = _e === void 0 ? 'module' : _e;
14293
+ _e = _a.onMouseDown,
14294
+ onMouseDown = _e === void 0 ? function () {} : _e,
14295
+ _f = _a.order,
14296
+ order = _f === void 0 ? 0 : _f,
14297
+ _g = _a.source,
14298
+ source = _g === void 0 ? 'module' : _g;
14299
+ var filtersGroupedByType = _.groupBy(filters, function (filter) {
14300
+ return filter.type;
14301
+ });
14302
+ var groups = (_b = filtersGroupedByType['group']) !== null && _b !== void 0 ? _b : [];
14303
+
14304
+ var groupsSorted = __spreadArray([], __read(groups)).sort(function (a, b) {
14305
+ return a.name.localeCompare(b.name);
14306
+ });
14307
+
14308
+ var keywords = (_c = filtersGroupedByType['keyword']) !== null && _c !== void 0 ? _c : [];
14309
+
14310
+ var keywordsSorted = __spreadArray([], __read(keywords)).sort(function (a, b) {
14311
+ return a.name.localeCompare(b.name);
14312
+ });
14313
+
13584
14314
  return /*#__PURE__*/React__namespace.createElement(shared.ToolContainerDraggable, {
13585
- title: showTitle ? "Filter Results " + mapId : 'Filter Results',
14315
+ title: DIALOG_TITLE,
13586
14316
  "data-testid": "keywordFilterResults",
13587
14317
  startSize: {
13588
14318
  width: 349,
@@ -13633,10 +14363,15 @@
13633
14363
  style: {
13634
14364
  padding: '0px'
13635
14365
  }
13636
- }, allKeywordIds.map(function (keywordId) {
14366
+ }, /*#__PURE__*/React__namespace.createElement(material.ListSubheader, null, "Groups"), groupsSorted.map(function (group) {
14367
+ return /*#__PURE__*/React__namespace.createElement(KeywordFilterResultsListItemConnect, {
14368
+ key: group.id,
14369
+ filter: group
14370
+ });
14371
+ }), /*#__PURE__*/React__namespace.createElement(material.ListSubheader, null, "Keywords"), keywordsSorted.map(function (keyword) {
13637
14372
  return /*#__PURE__*/React__namespace.createElement(KeywordFilterResultsListItemConnect, {
13638
- key: keywordId,
13639
- keyword: keywordId
14373
+ key: keyword.id,
14374
+ filter: keyword
13640
14375
  });
13641
14376
  })));
13642
14377
  };
@@ -13659,78 +14394,63 @@
13659
14394
  * */
13660
14395
 
13661
14396
  var KeywordFilterResultsConnect = function KeywordFilterResultsConnect(_a) {
13662
- var bounds = _a.bounds,
13663
- _b = _a.showTitle,
13664
- showTitle = _b === void 0 ? false : _b;
13665
- var dispatch = reactRedux.useDispatch();
13666
- var mapId = reactRedux.useSelector(function (store) {
13667
- return getDialogMapId(store, 'keywordFilter');
13668
- });
13669
- var isOpenInStore = reactRedux.useSelector(function (store) {
13670
- return getisDialogOpen(store, 'keywordFilter');
13671
- });
13672
- var onClose = React__namespace.useCallback(function () {
13673
- return dispatch(uiActions.setToggleOpenDialog({
13674
- type: 'keywordFilter',
13675
- setOpen: false
13676
- }));
13677
- }, [dispatch]);
13678
- var isMapPresent = reactRedux.useSelector(function (store) {
13679
- return getIsMapPresent(store, mapId);
13680
- });
13681
- var uiOrder = reactRedux.useSelector(function (store) {
13682
- return getDialogOrder(store, 'keywordFilter');
13683
- });
13684
- var uiSource = reactRedux.useSelector(function (store) {
13685
- return getDialogSource(store, 'keywordFilter');
13686
- });
13687
- var uiIsOrderedOnTop = reactRedux.useSelector(function (store) {
13688
- return getDialogIsOrderedOnTop(store, 'keywordFilter');
13689
- }); // Check to ensure the currently active map is still present on screen - if not, close the dialog
14397
+ var bounds = _a.bounds;
13690
14398
 
13691
- React__namespace.useEffect(function () {
13692
- if (mapId !== '' && !isMapPresent) {
13693
- onClose();
13694
- }
13695
- }, [mapId, isMapPresent, onClose]);
13696
- var registerDialog = React__namespace.useCallback(function () {
13697
- return dispatch(uiActions.registerDialog({
13698
- type: 'keywordFilter',
13699
- setOpen: false
13700
- }));
13701
- }, [dispatch]);
13702
- var unregisterDialog = React__namespace.useCallback(function () {
13703
- return dispatch(uiActions.unregisterDialog({
13704
- type: 'keywordFilter'
13705
- }));
13706
- }, [dispatch]);
13707
- var onOrderDialog = React__namespace.useCallback(function () {
13708
- if (!uiIsOrderedOnTop) {
13709
- dispatch(uiActions.orderDialog({
13710
- type: 'keywordFilter'
13711
- }));
13712
- }
13713
- }, [dispatch, uiIsOrderedOnTop]); // Register this dialog in the store
14399
+ var _b = useSetupDialog('keywordFilter'),
14400
+ dialogOrder = _b.dialogOrder,
14401
+ onCloseDialog = _b.onCloseDialog,
14402
+ setDialogOrder = _b.setDialogOrder,
14403
+ isDialogOpen = _b.isDialogOpen,
14404
+ uiSource = _b.uiSource;
13714
14405
 
13715
- React__namespace.useEffect(function () {
13716
- registerDialog();
13717
- return function () {
13718
- unregisterDialog();
13719
- }; // eslint-disable-next-line react-hooks/exhaustive-deps
13720
- }, []);
13721
- var allKeywordIds = reactRedux.useSelector(function (store) {
13722
- return getAllKeywordIds(store);
13723
- });
14406
+ var filters = reactRedux.useSelector(getAllFilters);
13724
14407
  return /*#__PURE__*/React__namespace.createElement(KeywordFilterResults, {
13725
- allKeywordIds: allKeywordIds,
13726
- mapId: mapId,
13727
14408
  bounds: bounds,
13728
- isOpen: isOpenInStore,
13729
- onClose: onClose,
13730
- showTitle: showTitle,
13731
- onMouseDown: onOrderDialog,
13732
- order: uiOrder,
13733
- source: uiSource
14409
+ isOpen: isDialogOpen,
14410
+ onClose: onCloseDialog,
14411
+ onMouseDown: setDialogOrder,
14412
+ order: dialogOrder,
14413
+ source: uiSource,
14414
+ filters: filters
14415
+ });
14416
+ };
14417
+
14418
+ /* *
14419
+ * Licensed under the Apache License, Version 2.0 (the "License");
14420
+ * you may not use this file except in compliance with the License.
14421
+ * You may obtain a copy of the License at
14422
+ *
14423
+ * http://www.apache.org/licenses/LICENSE-2.0
14424
+ *
14425
+ * Unless required by applicable law or agreed to in writing, software
14426
+ * distributed under the License is distributed on an "AS IS" BASIS,
14427
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14428
+ * See the License for the specific language governing permissions and
14429
+ * limitations under the License.
14430
+ *
14431
+ * Copyright 2022 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
14432
+ * Copyright 2022 - Finnish Meteorological Institute (FMI)
14433
+ * */
14434
+
14435
+ var LayerInfoDialogConnect = function LayerInfoDialogConnect() {
14436
+ var layer = reactRedux.useSelector(function (store) {
14437
+ return getActiveLayerInfo(store);
14438
+ });
14439
+
14440
+ var _a = useSetupDialog(DialogTypes.LayerInfo),
14441
+ dialogOrder = _a.dialogOrder,
14442
+ onCloseDialog = _a.onCloseDialog,
14443
+ setDialogOrder = _a.setDialogOrder,
14444
+ uiSource = _a.uiSource,
14445
+ isDialogOpen = _a.isDialogOpen;
14446
+
14447
+ return /*#__PURE__*/React__default["default"].createElement(LayerInfoDialog, {
14448
+ isOpen: isDialogOpen,
14449
+ onClose: onCloseDialog,
14450
+ onMouseDown: setDialogOrder,
14451
+ order: dialogOrder,
14452
+ source: uiSource,
14453
+ layer: layer
13734
14454
  });
13735
14455
  };
13736
14456
 
@@ -13758,69 +14478,59 @@
13758
14478
  * ``` <LayerSelectConnect />```
13759
14479
  */
13760
14480
 
13761
- var LayerSelectConnect = function LayerSelectConnect(_a) {
13762
- var bounds = _a.bounds,
13763
- _b = _a.showTitle,
13764
- showTitle = _b === void 0 ? false : _b,
13765
- _c = _a.preloadedServices,
13766
- preloadedServices = _c === void 0 ? preloadedDefaultMapServices : _c;
14481
+ var LayerSelectConnect = function LayerSelectConnect(_a) {
14482
+ var bounds = _a.bounds,
14483
+ _b = _a.showTitle,
14484
+ showTitle = _b === void 0 ? false : _b;
14485
+ var mapId = reactRedux.useSelector(function (store) {
14486
+ return getDialogMapId(store, 'layerSelect');
14487
+ });
14488
+
14489
+ var _c = useSetupDialog('layerSelect'),
14490
+ dialogOrder = _c.dialogOrder,
14491
+ isDialogOpen = _c.isDialogOpen,
14492
+ onCloseDialog = _c.onCloseDialog,
14493
+ setDialogOrder = _c.setDialogOrder,
14494
+ uiSource = _c.uiSource;
14495
+
14496
+ return /*#__PURE__*/React__namespace.createElement(React__namespace.Fragment, null, /*#__PURE__*/React__namespace.createElement(LayerSelect, {
14497
+ mapId: mapId,
14498
+ bounds: bounds,
14499
+ isOpen: isDialogOpen,
14500
+ onClose: onCloseDialog,
14501
+ showTitle: showTitle,
14502
+ onMouseDown: setDialogOrder,
14503
+ order: dialogOrder,
14504
+ source: uiSource
14505
+ }), /*#__PURE__*/React__namespace.createElement(KeywordFilterResultsConnect, null), /*#__PURE__*/React__namespace.createElement(LayerInfoDialogConnect, null));
14506
+ };
14507
+
14508
+ /* *
14509
+ * Licensed under the Apache License, Version 2.0 (the "License");
14510
+ * you may not use this file except in compliance with the License.
14511
+ * You may obtain a copy of the License at
14512
+ *
14513
+ * http://www.apache.org/licenses/LICENSE-2.0
14514
+ *
14515
+ * Unless required by applicable law or agreed to in writing, software
14516
+ * distributed under the License is distributed on an "AS IS" BASIS,
14517
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14518
+ * See the License for the specific language governing permissions and
14519
+ * limitations under the License.
14520
+ *
14521
+ * Copyright 2022 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
14522
+ * Copyright 2022 - Finnish Meteorological Institute (FMI)
14523
+ * */
14524
+ var useFetchServices = function useFetchServices(dialogType, preloadedServices) {
14525
+ if (preloadedServices === void 0) {
14526
+ preloadedServices = preloadedDefaultMapServices;
14527
+ }
14528
+
13767
14529
  var dispatch = reactRedux.useDispatch();
13768
14530
  var isMounted = shared.useIsMounted().isMounted;
13769
- var mapId = reactRedux.useSelector(function (store) {
13770
- return getDialogMapId(store, 'layerSelect');
13771
- });
13772
14531
  var isOpenInStore = reactRedux.useSelector(function (store) {
13773
- return getisDialogOpen(store, 'layerSelect');
13774
- });
13775
- var onClose = React__namespace.useCallback(function () {
13776
- return dispatch(uiActions.setToggleOpenDialog({
13777
- type: 'layerSelect',
13778
- setOpen: false
13779
- }));
13780
- }, [dispatch]);
13781
- var isMapPresent = reactRedux.useSelector(function (store) {
13782
- return getIsMapPresent(store, mapId);
14532
+ return getisDialogOpen(store, dialogType);
13783
14533
  });
13784
- var uiOrder = reactRedux.useSelector(function (store) {
13785
- return getDialogOrder(store, 'layerSelect');
13786
- });
13787
- var uiSource = reactRedux.useSelector(function (store) {
13788
- return getDialogSource(store, 'layerSelect');
13789
- });
13790
- var uiIsOrderedOnTop = reactRedux.useSelector(function (store) {
13791
- return getDialogIsOrderedOnTop(store, 'layerSelect');
13792
- }); // Check to ensure the currently active map is still present on screen - if not, close the dialog
13793
-
13794
- React__namespace.useEffect(function () {
13795
- if (mapId !== '' && !isMapPresent) {
13796
- onClose();
13797
- }
13798
- }, [mapId, isMapPresent, onClose]);
13799
- var registerDialog = React__namespace.useCallback(function () {
13800
- return dispatch(uiActions.registerDialog({
13801
- type: 'layerSelect',
13802
- setOpen: false
13803
- }));
13804
- }, [dispatch]);
13805
- var unregisterDialog = React__namespace.useCallback(function () {
13806
- return dispatch(uiActions.unregisterDialog({
13807
- type: 'layerSelect'
13808
- }));
13809
- }, [dispatch]);
13810
- var onOrderDialog = React__namespace.useCallback(function () {
13811
- if (!uiIsOrderedOnTop) {
13812
- dispatch(uiActions.orderDialog({
13813
- type: 'layerSelect'
13814
- }));
13815
- }
13816
- }, [dispatch, uiIsOrderedOnTop]); // Register this dialog in the store
13817
-
13818
- React__namespace.useEffect(function () {
13819
- registerDialog();
13820
- return function () {
13821
- unregisterDialog();
13822
- }; // eslint-disable-next-line react-hooks/exhaustive-deps
13823
- }, []);
13824
14534
  var serviceSetLayers = React__namespace.useCallback(function (payload) {
13825
14535
  dispatch(serviceActions.serviceSetLayers(payload));
13826
14536
  }, [dispatch]);
@@ -13840,7 +14550,9 @@
13840
14550
  name: service.name,
13841
14551
  serviceUrl: service.url,
13842
14552
  layers: layers,
13843
- isUserAddedService: checkIfUserAddedService(service)
14553
+ isUserAddedService: checkIfUserAddedService(service),
14554
+ // first try to load the user abstract, otherwise the service abstract
14555
+ "abstract": service["abstract"] || wmService["abstract"]
13844
14556
  });
13845
14557
  }
13846
14558
  })["catch"](function () {
@@ -13850,16 +14562,13 @@
13850
14562
  } // eslint-disable-next-line react-hooks/exhaustive-deps
13851
14563
 
13852
14564
  }, [isOpenInStore, preloadedServices, serviceSetLayers]);
13853
- return /*#__PURE__*/React__namespace.createElement(React__namespace.Fragment, null, /*#__PURE__*/React__namespace.createElement(LayerSelect, {
13854
- mapId: mapId,
13855
- bounds: bounds,
13856
- isOpen: isOpenInStore,
13857
- onClose: onClose,
13858
- showTitle: showTitle,
13859
- onMouseDown: onOrderDialog,
13860
- order: uiOrder,
13861
- source: uiSource
13862
- }), /*#__PURE__*/React__namespace.createElement(KeywordFilterResultsConnect, null));
14565
+ };
14566
+ var mergePresetsAndUserAddedServices = function mergePresetsAndUserAddedServices(presets, userAddedServices) {
14567
+ return Object.values(__assign(__assign({}, presets.reduce(function (byUrl, preset) {
14568
+ var _a;
14569
+
14570
+ return __assign(__assign({}, byUrl), (_a = {}, _a[preset.url] = preset, _a));
14571
+ }, {})), userAddedServices));
13863
14572
  };
13864
14573
 
13865
14574
  /* *
@@ -13878,6 +14587,7 @@
13878
14587
  * Copyright 2021 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
13879
14588
  * Copyright 2021 - Finnish Meteorological Institute (FMI)
13880
14589
  * */
14590
+ var dialogType = 'layerManager';
13881
14591
  /**
13882
14592
  * Layer Managerconnected to the store displaying the layers forthe active map Id
13883
14593
  * Please note that in order to use this and open/close the dialog, every map on the screen that should be able to show
@@ -13901,87 +14611,41 @@
13901
14611
  layerSelect = _c === void 0 ? false : _c,
13902
14612
  _d = _a.leftComponent,
13903
14613
  leftComponent = _d === void 0 ? null : _d;
13904
- var dispatch = reactRedux.useDispatch();
13905
- var isOpenInStore = reactRedux.useSelector(function (store) {
13906
- return getisDialogOpen(store, 'layerManager');
13907
- });
13908
14614
  var mapId = reactRedux.useSelector(function (store) {
13909
- return getDialogMapId(store, 'layerManager');
13910
- });
13911
- var onClose = React__namespace.useCallback(function () {
13912
- return dispatch(uiActions.setToggleOpenDialog({
13913
- type: 'layerManager',
13914
- setOpen: false
13915
- }));
13916
- }, [dispatch]);
13917
- var isMapPresent = reactRedux.useSelector(function (store) {
13918
- return getIsMapPresent(store, mapId);
13919
- });
13920
- var uiOrder = reactRedux.useSelector(function (store) {
13921
- return getDialogOrder(store, 'layerManager');
13922
- });
13923
- var uiSource = reactRedux.useSelector(function (store) {
13924
- return getDialogSource(store, 'layerManager');
13925
- });
13926
- var uiIsOrderedOnTop = reactRedux.useSelector(function (store) {
13927
- return getDialogIsOrderedOnTop(store, 'layerManager');
14615
+ return getDialogMapId(store, dialogType);
13928
14616
  });
13929
14617
  var isMapPresetLoading = reactRedux.useSelector(function (store) {
13930
14618
  return getIsMapPresetLoading(store, mapId);
13931
14619
  });
13932
14620
  var mapPresetError = reactRedux.useSelector(function (store) {
13933
14621
  return getMapPresetError(store, mapId);
13934
- }); // Check to ensure the currently active map is still present on screen - if not, close the dialog
14622
+ });
13935
14623
 
13936
- React__namespace.useEffect(function () {
13937
- if (mapId !== '' && !isMapPresent) {
13938
- onClose();
13939
- }
13940
- }, [mapId, isMapPresent, onClose]);
13941
- var registerDialog = React__namespace.useCallback(function () {
13942
- return dispatch(uiActions.registerDialog({
13943
- type: 'layerManager',
13944
- setOpen: false
13945
- }));
13946
- }, [dispatch]);
13947
- var unregisterDialog = React__namespace.useCallback(function () {
13948
- return dispatch(uiActions.unregisterDialog({
13949
- type: 'layerManager'
13950
- }));
13951
- }, [dispatch]);
13952
- var onOrderDialog = React__namespace.useCallback(function () {
13953
- if (!uiIsOrderedOnTop) {
13954
- dispatch(uiActions.orderDialog({
13955
- type: 'layerManager'
13956
- }));
13957
- }
13958
- }, [dispatch, uiIsOrderedOnTop]); // Register this dialog in the store
14624
+ var _e = useSetupDialog(dialogType),
14625
+ dialogOrder = _e.dialogOrder,
14626
+ setDialogOrder = _e.setDialogOrder,
14627
+ onCloseDialog = _e.onCloseDialog,
14628
+ isDialogOpen = _e.isDialogOpen,
14629
+ uiSource = _e.uiSource;
13959
14630
 
13960
- React__namespace.useEffect(function () {
13961
- registerDialog();
13962
- return function () {
13963
- unregisterDialog();
13964
- }; // eslint-disable-next-line react-hooks/exhaustive-deps
13965
- }, []);
14631
+ useFetchServices(dialogType, preloadedMapServices);
13966
14632
  return /*#__PURE__*/React__namespace.createElement(React__namespace.Fragment, null, /*#__PURE__*/React__namespace.createElement(LayerManager, {
13967
14633
  mapId: mapId,
13968
14634
  preloadedAvailableBaseLayers: preloadedAvailableBaseLayers,
13969
14635
  preloadedMapServices: preloadedMapServices,
13970
14636
  preloadedBaseServices: preloadedBaseServices,
13971
14637
  bounds: bounds,
13972
- isOpen: isOpenInStore,
13973
- onClose: onClose,
14638
+ isOpen: isDialogOpen,
14639
+ onClose: onCloseDialog,
13974
14640
  showTitle: showTitle,
13975
- onMouseDown: onOrderDialog,
13976
- order: uiOrder,
14641
+ onMouseDown: setDialogOrder,
14642
+ order: dialogOrder,
13977
14643
  source: uiSource,
13978
14644
  layerSelect: layerSelect,
13979
14645
  leftComponent: leftComponent,
13980
14646
  isLoading: isMapPresetLoading,
13981
14647
  error: mapPresetError
13982
- }), layerSelect && /*#__PURE__*/React__namespace.createElement(LayerSelectConnect, {
13983
- preloadedServices: preloadedMapServices
13984
- }));
14648
+ }), layerSelect && /*#__PURE__*/React__namespace.createElement(LayerSelectConnect, null));
13985
14649
  };
13986
14650
 
13987
14651
  /* *
@@ -14223,7 +14887,7 @@
14223
14887
  return theme.Equalizer;
14224
14888
  }
14225
14889
 
14226
- return theme.Sort;
14890
+ return theme.DimensionsElevation;
14227
14891
  };
14228
14892
 
14229
14893
  /* *
@@ -14527,7 +15191,7 @@
14527
15191
  _b = _a.order,
14528
15192
  order = _b === void 0 ? 0 : _b,
14529
15193
  onMouseDown = _a.onMouseDown,
14530
- onToggleDialog = _a.onToggleDialog,
15194
+ onCloseDialog = _a.onCloseDialog,
14531
15195
  _c = _a.index,
14532
15196
  index = _c === void 0 ? 0 : _c,
14533
15197
  _d = _a.source,
@@ -14582,9 +15246,7 @@
14582
15246
  headerSize: "small",
14583
15247
  isOpen: isOpen,
14584
15248
  "data-testid": "multidimensionContent-" + title,
14585
- onClose: function onClose() {
14586
- return onToggleDialog(false);
14587
- },
15249
+ onClose: onCloseDialog,
14588
15250
  bounds: "parent",
14589
15251
  onMouseDown: onMouseDown,
14590
15252
  order: order,
@@ -14631,71 +15293,26 @@
14631
15293
  var MultiMapSingleDimensionSelectConnect = function MultiMapSingleDimensionSelectConnect(_a) {
14632
15294
  var dimensionName = _a.dimensionName,
14633
15295
  index = _a.index;
14634
- var dispatch = reactRedux.useDispatch();
14635
15296
  var uiDialogType = getDimensionType(dimensionName);
14636
15297
  var mapId = reactRedux.useSelector(function (store) {
14637
15298
  return getDialogMapId(store, uiDialogType);
14638
15299
  });
14639
- var uiOrder = reactRedux.useSelector(function (store) {
14640
- return getDialogOrder(store, uiDialogType);
14641
- });
14642
- var uiSource = reactRedux.useSelector(function (store) {
14643
- return getDialogSource(store, uiDialogType);
14644
- });
14645
- var uiIsOrderedOnTop = reactRedux.useSelector(function (store) {
14646
- return getDialogIsOrderedOnTop(store, uiDialogType);
14647
- });
14648
- var isOpen = reactRedux.useSelector(function (store) {
14649
- return getisDialogOpen(store, uiDialogType);
14650
- });
14651
- var isMapPresent = reactRedux.useSelector(function (store) {
14652
- return getIsMapPresent(store, mapId);
14653
- });
14654
- var onOrderDialog = React__namespace.useCallback(function () {
14655
- if (!uiIsOrderedOnTop) {
14656
- dispatch(uiActions.orderDialog({
14657
- type: uiDialogType
14658
- }));
14659
- }
14660
- }, [dispatch, uiDialogType, uiIsOrderedOnTop]);
14661
- var onToggleDialog = React__namespace.useCallback(function (setOpen) {
14662
- dispatch(uiActions.setToggleOpenDialog({
14663
- type: uiDialogType,
14664
- setOpen: setOpen
14665
- }));
14666
- }, [dispatch, uiDialogType]);
14667
- var registerDialog = React__namespace.useCallback(function (activeMapId) {
14668
- return dispatch(uiActions.registerDialog({
14669
- type: uiDialogType,
14670
- mapId: activeMapId
14671
- }));
14672
- }, [dispatch, uiDialogType]);
14673
- var unregisterDialog = React__namespace.useCallback(function () {
14674
- return dispatch(uiActions.unregisterDialog({
14675
- type: uiDialogType
14676
- }));
14677
- }, [dispatch, uiDialogType]); // Check to ensure the currently active map is still present on screen - if not, close the dialog
14678
15300
 
14679
- React__namespace.useEffect(function () {
14680
- if (mapId !== '' && !isMapPresent) {
14681
- onToggleDialog(false);
14682
- }
14683
- }, [mapId, isMapPresent, onToggleDialog]); // Register this dialog in the store
15301
+ var _b = useSetupDialog(uiDialogType),
15302
+ dialogOrder = _b.dialogOrder,
15303
+ isDialogOpen = _b.isDialogOpen,
15304
+ onCloseDialog = _b.onCloseDialog,
15305
+ setDialogOrder = _b.setDialogOrder,
15306
+ uiSource = _b.uiSource;
14684
15307
 
14685
- React__namespace.useEffect(function () {
14686
- registerDialog(mapId);
14687
- return function () {
14688
- unregisterDialog();
14689
- }; // eslint-disable-next-line react-hooks/exhaustive-deps
14690
- }, []);
14691
15308
  return /*#__PURE__*/React__namespace.createElement(DimensionSelectDialogConnect, {
14692
15309
  mapId: mapId,
14693
15310
  dimensionName: dimensionName,
14694
- onMouseDown: onOrderDialog,
14695
- onToggleDialog: onToggleDialog,
14696
- order: uiOrder,
15311
+ onMouseDown: setDialogOrder,
15312
+ onCloseDialog: onCloseDialog,
15313
+ order: dialogOrder,
14697
15314
  source: uiSource,
14698
- isOpen: isOpen,
15315
+ isOpen: isDialogOpen,
14699
15316
  index: index
14700
15317
  });
14701
15318
  };
@@ -14880,108 +15497,142 @@
14880
15497
  * See the License for the specific language governing permissions and
14881
15498
  * limitations under the License.
14882
15499
  *
14883
- * Copyright 2022 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
14884
- * Copyright 2022 - Finnish Meteorological Institute (FMI)
15500
+ * Copyright 2020 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
15501
+ * Copyright 2020 - Finnish Meteorological Institute (FMI)
14885
15502
  * */
14886
- var speedTooltipTitle = 'Speed';
14887
-
14888
- var SpeedButton = function SpeedButton(_a) {
14889
- var animationDelay = _a.animationDelay,
14890
- setMapAnimationDelay = _a.setMapAnimationDelay;
14891
-
14892
- var _b = __read(React__namespace.useState(false), 2),
14893
- open = _b[0],
14894
- setOpen = _b[1];
14895
-
14896
- var marks = speedFactors.map(function (speedFactor, i) {
14897
- return {
14898
- delay: getSpeedDelay(speedFactor),
14899
- markPos: i,
14900
- text: speedFactor + "x"
14901
- };
14902
- });
14903
- var max = marks.length - 1;
14904
- var min = 0;
14905
- var currentValue = marks.findIndex(function (info) {
14906
- return info.delay === animationDelay;
15503
+ var TimeSliderMenu = function TimeSliderMenu(_a) {
15504
+ var marks = _a.marks,
15505
+ value = _a.value,
15506
+ isOpenByDefault = _a.isOpenByDefault,
15507
+ handleMenuItemClick = _a.handleMenuItemClick,
15508
+ isDisabled = _a.isDisabled,
15509
+ handleAutoClick = _a.handleAutoClick,
15510
+ isAutoSelected = _a.isAutoSelected,
15511
+ title = _a.title,
15512
+ icon = _a.icon;
15513
+ var currentMark = marks.find(function (mark) {
15514
+ return mark.value === value;
14907
15515
  });
14908
15516
 
14909
- var getAnimationDelayValue = function getAnimationDelayValue(markPos) {
14910
- return marks[markPos].delay || marks[0].delay;
14911
- };
14912
-
14913
- var onClickButton = function onClickButton() {
14914
- setOpen(!open);
14915
- };
15517
+ var _b = __read(React__namespace.useState(null), 2),
15518
+ anchorRef = _b[0],
15519
+ setAnchorRef = _b[1];
14916
15520
 
14917
- var onChangeSlider = function onChangeSlider(event, value) {
14918
- var newValue = getAnimationDelayValue(value);
15521
+ var _c = __read(React.useState(false), 2),
15522
+ open = _c[0],
15523
+ setOpen = _c[1];
14919
15524
 
14920
- if (event.type !== 'keydown') {
14921
- setMapAnimationDelay(newValue);
15525
+ React__namespace.useEffect(function () {
15526
+ if (anchorRef && isOpenByDefault) {
15527
+ setOpen(true);
14922
15528
  }
14923
- };
14924
-
14925
- var onKeyDown = function onKeyDown(event) {
14926
- // disable default Slider behavior
14927
- event.stopPropagation();
14928
- event.preventDefault(); // custom logic
14929
-
14930
- if (event.key === 'Tab') {
14931
- setOpen(!open);
15529
+ }, [anchorRef, isOpenByDefault]);
15530
+ return /*#__PURE__*/React__namespace.createElement(material.Box, {
15531
+ onKeyDown: function onKeyDown(event) {
15532
+ event.stopPropagation();
15533
+ }
15534
+ }, /*#__PURE__*/React__namespace.createElement(material.Tooltip, {
15535
+ title: title
15536
+ }, /*#__PURE__*/React__namespace.createElement(shared.ToolButton, {
15537
+ onClick: function onClick() {
15538
+ setOpen(true);
15539
+ },
15540
+ ref: setAnchorRef,
15541
+ active: true,
15542
+ width: "58px"
15543
+ }, icon, /*#__PURE__*/React__namespace.createElement(theme.TextIcon, {
15544
+ text: currentMark === null || currentMark === void 0 ? void 0 : currentMark.text
15545
+ }))), /*#__PURE__*/React__namespace.createElement(material.Menu, {
15546
+ anchorEl: anchorRef,
15547
+ open: open,
15548
+ onClose: function onClose() {
15549
+ return setOpen(false);
15550
+ },
15551
+ BackdropProps: {
15552
+ sx: {
15553
+ backgroundColor: 'transparent'
15554
+ }
15555
+ },
15556
+ anchorOrigin: {
15557
+ vertical: 'top',
15558
+ horizontal: 'center'
15559
+ },
15560
+ transformOrigin: {
15561
+ vertical: 'bottom',
15562
+ horizontal: 'center'
15563
+ }
15564
+ }, /*#__PURE__*/React__namespace.createElement(material.MenuItem, {
15565
+ disabled: true,
15566
+ sx: {
15567
+ fontSize: '12px',
15568
+ opacity: 0.67,
15569
+ padding: '0px 12px',
15570
+ '&.MuiMenuItem-root': {
15571
+ minHeight: '30px!important'
15572
+ }
14932
15573
  }
15574
+ }, title), marks.map(function (mark) {
15575
+ return /*#__PURE__*/React__namespace.createElement(material.MenuItem, {
15576
+ onClick: function onClick() {
15577
+ handleMenuItemClick(mark);
15578
+ setOpen(false);
15579
+ },
15580
+ key: mark.value,
15581
+ selected: (currentMark === null || currentMark === void 0 ? void 0 : currentMark.value) === mark.value,
15582
+ disabled: isDisabled
15583
+ }, mark.label || mark.text);
15584
+ }), handleAutoClick && /*#__PURE__*/React__namespace.createElement(material.MenuItem, {
15585
+ onClick: function onClick() {
15586
+ handleAutoClick();
15587
+ setOpen(false);
15588
+ },
15589
+ selected: isAutoSelected,
15590
+ disabled: isDisabled
15591
+ }, "Auto")));
15592
+ };
15593
+
15594
+ /* *
15595
+ * Licensed under the Apache License, Version 2.0 (the "License");
15596
+ * you may not use this file except in compliance with the License.
15597
+ * You may obtain a copy of the License at
15598
+ *
15599
+ * http://www.apache.org/licenses/LICENSE-2.0
15600
+ *
15601
+ * Unless required by applicable law or agreed to in writing, software
15602
+ * distributed under the License is distributed on an "AS IS" BASIS,
15603
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15604
+ * See the License for the specific language governing permissions and
15605
+ * limitations under the License.
15606
+ *
15607
+ * Copyright 2022 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
15608
+ * Copyright 2022 - Finnish Meteorological Institute (FMI)
15609
+ * */
15610
+ var speedTooltipTitle = 'Speed';
14933
15611
 
14934
- var newValue = getValueFromKeyboardEvent(event, currentValue, min, max);
15612
+ var SpeedButton = function SpeedButton(_a) {
15613
+ var animationDelay = _a.animationDelay,
15614
+ setMapAnimationDelay = _a.setMapAnimationDelay;
14935
15615
 
14936
- if (newValue !== null) {
14937
- setMapAnimationDelay(getAnimationDelayValue(newValue));
14938
- }
14939
- };
15616
+ var sorted = __spreadArray([], __read(speedFactors)).sort(function (a, b) {
15617
+ return b - a;
15618
+ });
14940
15619
 
14941
- var text = marks[currentValue].text;
14942
- return /*#__PURE__*/React__namespace.createElement(material.Box, {
14943
- sx: {
14944
- height: '24px',
14945
- width: '24px',
14946
- position: 'relative'
14947
- }
14948
- }, /*#__PURE__*/React__namespace.createElement(material.Tooltip, {
14949
- title: speedTooltipTitle
14950
- }, /*#__PURE__*/React__namespace.createElement(shared.ToolButton, {
14951
- onClick: onClickButton,
14952
- active: true,
14953
- "data-testid": "speedButton"
14954
- }, /*#__PURE__*/React__namespace.createElement(theme.TextIcon, {
14955
- text: text
14956
- }))), open ? /*#__PURE__*/React__namespace.createElement(material.Box, {
14957
- sx: {
14958
- padding: '0 0 60px 0',
14959
- backgroundColor: 'geowebColors.background.surface',
14960
- width: '95px',
14961
- height: '150px',
14962
- position: 'absolute',
14963
- bottom: '35px'
14964
- }
14965
- }, /*#__PURE__*/React__namespace.createElement(material.Box, {
14966
- sx: shared.sliderHeaderStyle
14967
- }, "Speed"), /*#__PURE__*/React__namespace.createElement(shared.CustomSlider, {
14968
- "data-testid": "speedSlider",
14969
- orientation: "vertical",
14970
- value: currentValue,
14971
- step: null,
14972
- max: max,
14973
- min: min,
14974
- marks: marks.map(function (_a) {
14975
- var markPos = _a.markPos,
14976
- text = _a.text;
14977
- return {
14978
- value: markPos,
14979
- label: text
14980
- };
14981
- }),
14982
- onChange: onChangeSlider,
14983
- onKeyDown: onKeyDown
14984
- })) : null);
15620
+ var marks = sorted.map(function (speedFactor) {
15621
+ return {
15622
+ value: getSpeedDelay(speedFactor),
15623
+ text: "x" + speedFactor,
15624
+ label: "x" + speedFactor
15625
+ };
15626
+ });
15627
+ return /*#__PURE__*/React__namespace.createElement(TimeSliderMenu, {
15628
+ handleMenuItemClick: function handleMenuItemClick(mark) {
15629
+ setMapAnimationDelay(mark.value);
15630
+ },
15631
+ icon: /*#__PURE__*/React__namespace.createElement(theme.Speed, null),
15632
+ marks: marks,
15633
+ title: speedTooltipTitle,
15634
+ value: animationDelay
15635
+ });
14985
15636
  };
14986
15637
 
14987
15638
  /* *
@@ -15000,112 +15651,93 @@
15000
15651
  * Copyright 2020 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
15001
15652
  * Copyright 2020 - Finnish Meteorological Institute (FMI)
15002
15653
  * */
15003
- var timeStepMarks = [{
15004
- value: 1,
15654
+ var marks$1 = [{
15005
15655
  label: '1 min',
15006
- timeStepValue: 1,
15656
+ value: 1,
15007
15657
  text: '1m'
15008
15658
  }, {
15009
- value: 2,
15010
15659
  label: '2 min',
15011
- timeStepValue: 2,
15660
+ value: 2,
15012
15661
  text: '2m'
15013
15662
  }, {
15014
- value: 3,
15015
15663
  label: '5 min',
15016
- timeStepValue: 5,
15664
+ value: 5,
15017
15665
  text: '5m'
15018
15666
  }, {
15019
- value: 4,
15020
15667
  label: '10 min',
15021
- timeStepValue: 10,
15668
+ value: 10,
15022
15669
  text: '10m'
15023
15670
  }, {
15024
- value: 5,
15025
15671
  label: '15 min',
15026
- timeStepValue: 15,
15672
+ value: 15,
15027
15673
  text: '15m'
15028
15674
  }, {
15029
- value: 6,
15030
15675
  label: '30 min',
15031
- timeStepValue: 30,
15676
+ value: 30,
15032
15677
  text: '30m'
15033
15678
  }, {
15034
- value: 7,
15035
15679
  label: '1 h',
15036
- timeStepValue: 60,
15680
+ value: 60,
15037
15681
  text: '1h'
15038
15682
  }, {
15039
- value: 8,
15040
15683
  label: '2 h',
15041
- timeStepValue: 120,
15684
+ value: 120,
15042
15685
  text: '2h'
15043
15686
  }, {
15044
- value: 9,
15045
15687
  label: '3 h',
15046
- timeStepValue: 180,
15688
+ value: 180,
15047
15689
  text: '3h'
15048
15690
  }, {
15049
- value: 10,
15050
15691
  label: '6 h',
15051
- timeStepValue: 360,
15692
+ value: 360,
15052
15693
  text: '6h'
15053
15694
  }, {
15054
- value: 11,
15055
15695
  label: '12 h',
15056
- timeStepValue: 720,
15696
+ value: 720,
15057
15697
  text: '12h'
15058
15698
  }, {
15059
- value: 12,
15060
15699
  label: '24 h',
15061
- timeStepValue: 1440,
15700
+ value: 1440,
15062
15701
  text: '24h'
15063
15702
  }, {
15064
- value: 13,
15065
15703
  label: '48 h',
15066
- timeStepValue: 2880,
15704
+ value: 2880,
15067
15705
  text: '48h'
15068
15706
  }, {
15069
- value: 14,
15070
15707
  label: '72 h',
15071
- timeStepValue: 4320,
15708
+ value: 4320,
15072
15709
  text: '72h'
15073
15710
  }, {
15074
- value: 15,
15075
15711
  label: '1 week',
15076
- timeStepValue: 10080,
15712
+ value: 10080,
15077
15713
  text: '1w'
15078
15714
  }, {
15079
- value: 16,
15080
15715
  label: '2 weeks',
15081
- timeStepValue: 20160,
15716
+ value: 20160,
15082
15717
  text: '2w'
15083
15718
  }, {
15084
- value: 17,
15085
15719
  label: '1 month',
15086
- timeStepValue: 40320,
15720
+ value: 40320,
15087
15721
  text: '4w'
15088
15722
  }, {
15089
- value: 18,
15090
15723
  label: '2 months',
15091
- timeStepValue: 80640,
15724
+ value: 80640,
15092
15725
  text: '8w'
15093
15726
  }, {
15094
- value: 19,
15095
15727
  label: '6 months',
15096
- timeStepValue: 241920,
15728
+ value: 241920,
15097
15729
  text: '24w'
15098
15730
  }, {
15099
- value: 20,
15100
15731
  label: '1 year',
15101
- timeStepValue: 525600,
15732
+ value: 525600,
15102
15733
  text: '1y'
15103
15734
  }, {
15104
- value: 21,
15105
15735
  label: '10 years',
15106
- timeStepValue: 5256000,
15736
+ value: 5256000,
15107
15737
  text: '10y'
15108
- }];
15738
+ }].sort(function (a, b) {
15739
+ return b.value - a.value;
15740
+ });
15109
15741
  var timeStepTitle = 'Time step';
15110
15742
 
15111
15743
  var TimeStepButton = function TimeStepButton(_a) {
@@ -15123,86 +15755,31 @@
15123
15755
  _e = _a.isOpenByDefault,
15124
15756
  isOpenByDefault = _e === void 0 ? false : _e;
15125
15757
  var timeStepFromLayer = getActiveLayerTimeStep(timeDimension) || timeStep;
15126
- var currentMark = timeStepMarks.find(function (mark) {
15127
- return mark.timeStepValue === timeStep;
15128
- });
15129
- React__default["default"].useEffect(function () {
15758
+ React__namespace.useEffect(function () {
15130
15759
  if (isTimestepAuto) {
15131
15760
  onChangeTimeStep(timeStepFromLayer);
15132
15761
  }
15133
15762
  }, [timeStepFromLayer, isTimestepAuto, onChangeTimeStep]);
15134
15763
 
15135
- var _f = __read(React__default["default"].useState(null), 2),
15136
- anchorRef = _f[0],
15137
- setAnchorRef = _f[1];
15138
-
15139
- var _g = __read(React__default["default"].useState(false), 2),
15140
- open = _g[0],
15141
- setOpen = _g[1];
15142
-
15143
- React__default["default"].useEffect(function () {
15144
- if (anchorRef && isOpenByDefault) {
15145
- setOpen(true);
15146
- }
15147
- }, [anchorRef, isOpenByDefault]);
15148
- return /*#__PURE__*/React__default["default"].createElement(material.Box, {
15149
- onKeyDown: function onKeyDown(event) {
15150
- event.stopPropagation();
15151
- }
15152
- }, /*#__PURE__*/React__default["default"].createElement(material.Tooltip, {
15153
- title: timeStepTitle
15154
- }, /*#__PURE__*/React__default["default"].createElement(shared.ToolButton, {
15155
- onClick: function onClick() {
15156
- setOpen(true);
15157
- },
15158
- ref: setAnchorRef,
15159
- active: true,
15160
- width: "58px"
15161
- }, /*#__PURE__*/React__default["default"].createElement(theme.FastForward, null), /*#__PURE__*/React__default["default"].createElement(theme.TextIcon, {
15162
- text: currentMark === null || currentMark === void 0 ? void 0 : currentMark.text
15163
- }))), /*#__PURE__*/React__default["default"].createElement(material.Menu, {
15164
- anchorEl: anchorRef,
15165
- open: open,
15166
- onClose: function onClose() {
15167
- return setOpen(false);
15168
- },
15169
- BackdropProps: {
15170
- sx: {
15171
- backgroundColor: 'transparent'
15172
- }
15173
- },
15174
- anchorOrigin: {
15175
- vertical: 'top',
15176
- horizontal: 'center'
15177
- },
15178
- transformOrigin: {
15179
- vertical: 'bottom',
15180
- horizontal: 'center'
15764
+ var handleMenuItemClick = function handleMenuItemClick(mark) {
15765
+ if (isTimestepAuto) {
15766
+ onToggleTimestepAuto();
15181
15767
  }
15182
- }, timeStepMarks.sort(function (a, b) {
15183
- return b.timeStepValue - a.timeStepValue;
15184
- }).map(function (time) {
15185
- return /*#__PURE__*/React__default["default"].createElement(material.MenuItem, {
15186
- onClick: function onClick() {
15187
- if (isTimestepAuto) {
15188
- onToggleTimestepAuto();
15189
- }
15190
15768
 
15191
- onChangeTimeStep(time.timeStepValue, MapActionOrigin.map);
15192
- setOpen(false);
15193
- },
15194
- key: time.timeStepValue,
15195
- selected: (currentMark === null || currentMark === void 0 ? void 0 : currentMark.timeStepValue) === time.timeStepValue,
15196
- disabled: disabled
15197
- }, time.label);
15198
- }), /*#__PURE__*/React__default["default"].createElement(material.MenuItem, {
15199
- onClick: function onClick() {
15200
- onToggleTimestepAuto();
15201
- setOpen(false);
15202
- },
15203
- selected: isTimestepAuto,
15204
- disabled: disabled
15205
- }, "Auto")));
15769
+ onChangeTimeStep(mark.value, MapActionOrigin.map);
15770
+ };
15771
+
15772
+ return /*#__PURE__*/React__namespace.createElement(TimeSliderMenu, {
15773
+ title: timeStepTitle,
15774
+ isOpenByDefault: isOpenByDefault,
15775
+ marks: marks$1,
15776
+ value: timeStep,
15777
+ handleMenuItemClick: handleMenuItemClick,
15778
+ isDisabled: disabled,
15779
+ isAutoSelected: isTimestepAuto,
15780
+ handleAutoClick: onToggleTimestepAuto,
15781
+ icon: /*#__PURE__*/React__namespace.createElement(theme.FastForward, null)
15782
+ });
15206
15783
  };
15207
15784
 
15208
15785
  /* *
@@ -16966,7 +17543,7 @@
16966
17543
  var handleKeyDown = function handleKeyDown(event) {
16967
17544
  var target = event.target;
16968
17545
 
16969
- if (target.tagName !== 'INPUT' && event.key === 't' && mapIsActive) {
17546
+ if (target.tagName !== 'INPUT' && target.tagName !== 'TEXTAREA' && event.key === 't' && mapIsActive) {
16970
17547
  onToggleTimeSlider(!isVisible);
16971
17548
  }
16972
17549
  };
@@ -17047,14 +17624,14 @@
17047
17624
  * Copyright 2020 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
17048
17625
  * Copyright 2020 - Finnish Meteorological Institute (FMI)
17049
17626
  * */
17050
- var connectRedux$4 = reactRedux.connect(function (store, props) {
17627
+ var connectRedux$3 = reactRedux.connect(function (store, props) {
17051
17628
  return {
17052
17629
  isAutoUpdating: isAutoUpdating(store, props.mapId)
17053
17630
  };
17054
17631
  }, {
17055
17632
  toggleAutoUpdate: mapActions$1.toggleAutoUpdate
17056
17633
  });
17057
- var AutoUpdateButtonConnectComponent = connectRedux$4(function (_a) {
17634
+ var AutoUpdateButtonConnectComponent = connectRedux$3(function (_a) {
17058
17635
  var mapId = _a.mapId,
17059
17636
  isAutoUpdating = _a.isAutoUpdating,
17060
17637
  toggleAutoUpdate = _a.toggleAutoUpdate;
@@ -17073,7 +17650,7 @@
17073
17650
  disabled: false
17074
17651
  });
17075
17652
  });
17076
- var AutoUpdateButtonConnect = connectRedux$4(AutoUpdateButtonConnectComponent);
17653
+ var AutoUpdateButtonConnect = connectRedux$3(AutoUpdateButtonConnectComponent);
17077
17654
 
17078
17655
  /* *
17079
17656
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -17091,31 +17668,27 @@
17091
17668
  * Copyright 2020 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
17092
17669
  * Copyright 2020 - Finnish Meteorological Institute (FMI)
17093
17670
  * */
17094
- var connectRedux$3 = reactRedux.connect(function (store, props) {
17095
- return {
17096
- animationDelay: getMapAnimationDelay(store, props.mapId)
17097
- };
17098
- }, {
17099
- setMapAnimationDelay: mapActions$1.setAnimationDelay
17100
- });
17101
- var SpeedButtonConnect = connectRedux$3(function (_a) {
17102
- var animationDelay = _a.animationDelay,
17103
- mapId = _a.mapId,
17104
- setMapAnimationDelay = _a.setMapAnimationDelay;
17105
17671
 
17106
- var onSetAnimationDelay = function onSetAnimationDelay(_animationDelay) {
17107
- setMapAnimationDelay({
17672
+ var SpeedButtonConnect = function SpeedButtonConnect(_a) {
17673
+ var mapId = _a.mapId;
17674
+ var animationDelay = reactRedux.useSelector(function (store) {
17675
+ return getMapAnimationDelay(store, mapId);
17676
+ });
17677
+ var dispatch = reactRedux.useDispatch();
17678
+
17679
+ var onSetAnimationDelay = function onSetAnimationDelay(animationDelay) {
17680
+ dispatch(mapActions$1.setAnimationDelay({
17108
17681
  mapId: mapId,
17109
- animationDelay: _animationDelay,
17682
+ animationDelay: animationDelay,
17110
17683
  origin: MapActionOrigin.map
17111
- });
17684
+ }));
17112
17685
  };
17113
17686
 
17114
17687
  return /*#__PURE__*/React__namespace.createElement(SpeedButton, {
17115
17688
  animationDelay: animationDelay,
17116
17689
  setMapAnimationDelay: onSetAnimationDelay
17117
17690
  });
17118
- });
17691
+ };
17119
17692
 
17120
17693
  /* *
17121
17694
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -18160,13 +18733,14 @@
18160
18733
  var setServiceMetadata = function setServiceMetadata(wmLayer, mapId, webMapJSInstance, mapProperties, onUpdateLayerInformation) {
18161
18734
  var origin = LayerActionOrigin.ReactMapViewParseLayer;
18162
18735
  var service = webmap.WMGetServiceFromStore(wmLayer.service);
18736
+ var serviceName = mapProperties.services[service.id].name;
18163
18737
  /* Update list of layers for service */
18164
18738
 
18165
18739
  var done = function done(layers) {
18166
18740
  var updateObject = {
18167
18741
  origin: origin,
18168
18742
  serviceLayers: {
18169
- name: wmLayer.title,
18743
+ name: serviceName,
18170
18744
  id: service.id,
18171
18745
  serviceUrl: wmLayer.service,
18172
18746
  layers: layers,
@@ -21825,6 +22399,9 @@
21825
22399
  var displayMapPin = reactRedux.useSelector(function (store) {
21826
22400
  return getDisplayMapPin(store, mapId);
21827
22401
  });
22402
+ var services = reactRedux.useSelector(function (store) {
22403
+ return getServices(store);
22404
+ });
21828
22405
  var dispatch = reactRedux.useDispatch();
21829
22406
  var map = getWMJSMapById(mapId);
21830
22407
  var mapChangeDimension = React__namespace.useCallback(function (mapDimensionPayload) {
@@ -21912,6 +22489,7 @@
21912
22489
  animationDelay: animationDelay,
21913
22490
  displayMapPin: displayMapPin,
21914
22491
  disableMapPin: disableMapPin,
22492
+ services: services,
21915
22493
  onMapChangeDimension: function onMapChangeDimension(mapDimensionPayload) {
21916
22494
  if (mapDimensionPayload && mapDimensionPayload.dimension && mapDimensionPayload.dimension.name && mapDimensionPayload.dimension.name === 'time') {
21917
22495
  setTime({
@@ -22918,55 +23496,23 @@
22918
23496
  var syncGroupRemoveTarget = React__namespace.useCallback(function (payload) {
22919
23497
  dispatch(actions.syncGroupRemoveTarget(payload));
22920
23498
  }, [dispatch]);
22921
- var isOpenInStore = reactRedux.useSelector(function (store) {
22922
- return getisDialogOpen(store, 'syncGroups');
22923
- });
22924
- var onClose = React__namespace.useCallback(function () {
22925
- return dispatch(uiActions.setToggleOpenDialog({
22926
- type: 'syncGroups',
22927
- setOpen: false
22928
- }));
22929
- }, [dispatch]);
22930
- var uiOrder = reactRedux.useSelector(function (store) {
22931
- return getDialogOrder(store, 'syncGroups');
22932
- });
22933
- var uiIsOrderedOnTop = reactRedux.useSelector(function (store) {
22934
- return getDialogIsOrderedOnTop(store, 'syncGroups');
22935
- });
22936
- var registerDialog = React__namespace.useCallback(function () {
22937
- return dispatch(uiActions.registerDialog({
22938
- type: 'syncGroups',
22939
- setOpen: false
22940
- }));
22941
- }, [dispatch]);
22942
- var unregisterDialog = React__namespace.useCallback(function () {
22943
- return dispatch(uiActions.unregisterDialog({
22944
- type: 'syncGroups'
22945
- }));
22946
- }, [dispatch]);
22947
- var onOrderDialog = React__namespace.useCallback(function () {
22948
- if (!uiIsOrderedOnTop) {
22949
- dispatch(uiActions.orderDialog({
22950
- type: 'syncGroups'
22951
- }));
22952
- }
22953
- }, [dispatch, uiIsOrderedOnTop]);
22954
- React__namespace.useEffect(function () {
22955
- registerDialog();
22956
- return function () {
22957
- unregisterDialog();
22958
- }; // eslint-disable-next-line react-hooks/exhaustive-deps
22959
- }, []);
23499
+
23500
+ var _a = useSetupDialog('syncGroups'),
23501
+ dialogOrder = _a.dialogOrder,
23502
+ isDialogOpen = _a.isDialogOpen,
23503
+ onCloseDialog = _a.onCloseDialog,
23504
+ setDialogOrder = _a.setDialogOrder;
23505
+
22960
23506
  return /*#__PURE__*/React__namespace.createElement(SyncGroupViewer, {
22961
- onClose: onClose,
22962
- isOpen: isOpenInStore,
23507
+ onClose: onCloseDialog,
23508
+ isOpen: isDialogOpen,
22963
23509
  syncGroupViewState: viewState,
22964
23510
  syncGroupAddTarget: syncGroupAddTarget,
22965
23511
  syncGroupRemoveTarget: syncGroupRemoveTarget,
22966
23512
  syncGroupAddGroup: syncGroupAddGroup,
22967
23513
  syncGroupRemoveGroup: syncGroupRemoveGroup,
22968
- order: uiOrder,
22969
- onMouseDown: onOrderDialog
23514
+ order: dialogOrder,
23515
+ onMouseDown: setDialogOrder
22970
23516
  });
22971
23517
  };
22972
23518
 
@@ -23107,57 +23653,6 @@
23107
23653
  simplePolygonGeoJSON: simplePolygonGeoJSON
23108
23654
  });
23109
23655
 
23110
- /* *
23111
- * Licensed under the Apache License, Version 2.0 (the "License");
23112
- * you may not use this file except in compliance with the License.
23113
- * You may obtain a copy of the License at
23114
- *
23115
- * http://www.apache.org/licenses/LICENSE-2.0
23116
- *
23117
- * Unless required by applicable law or agreed to in writing, software
23118
- * distributed under the License is distributed on an "AS IS" BASIS,
23119
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
23120
- * See the License for the specific language governing permissions and
23121
- * limitations under the License.
23122
- *
23123
- * Copyright 2021 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
23124
- * Copyright 2021 - Finnish Meteorological Institute (FMI)
23125
- * */
23126
- /**
23127
- * A Provider component which provides the GeoWeb theme
23128
- * @param children
23129
- * @returns
23130
- */
23131
-
23132
- var CoreThemeProvider = function CoreThemeProvider(_a) {
23133
- var children = _a.children,
23134
- _b = _a.theme,
23135
- theme$1 = _b === void 0 ? theme.lightTheme : _b;
23136
- return /*#__PURE__*/React__default["default"].createElement(theme.ThemeWrapper, {
23137
- theme: theme$1
23138
- }, children);
23139
- };
23140
- /**
23141
- * A Provider component which provides the GeoWeb theme and store for the core.
23142
- * Note: Should only be used with core components, as the provided store is only for core.
23143
- * @param children
23144
- * @returns
23145
- */
23146
-
23147
- var CoreThemeStoreProvider = function CoreThemeStoreProvider(_a) {
23148
- var children = _a.children,
23149
- _b = _a.theme,
23150
- theme$1 = _b === void 0 ? theme.lightTheme : _b,
23151
- store = _a.store;
23152
- return /*#__PURE__*/React__default["default"].createElement(reactRedux.Provider, {
23153
- store: store
23154
- }, /*#__PURE__*/React__default["default"].createElement(reduxDynamicModules.DynamicModuleLoader, {
23155
- modules: coreModuleConfig
23156
- }, /*#__PURE__*/React__default["default"].createElement(CoreThemeProvider, {
23157
- theme: theme$1
23158
- }, children)));
23159
- };
23160
-
23161
23656
  /* *
23162
23657
  * Licensed under the Apache License, Version 2.0 (the "License");
23163
23658
  * you may not use this file except in compliance with the License.
@@ -23242,6 +23737,57 @@
23242
23737
  }, props)));
23243
23738
  };
23244
23739
 
23740
+ /* *
23741
+ * Licensed under the Apache License, Version 2.0 (the "License");
23742
+ * you may not use this file except in compliance with the License.
23743
+ * You may obtain a copy of the License at
23744
+ *
23745
+ * http://www.apache.org/licenses/LICENSE-2.0
23746
+ *
23747
+ * Unless required by applicable law or agreed to in writing, software
23748
+ * distributed under the License is distributed on an "AS IS" BASIS,
23749
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
23750
+ * See the License for the specific language governing permissions and
23751
+ * limitations under the License.
23752
+ *
23753
+ * Copyright 2021 - Koninklijk Nederlands Meteorologisch Instituut (KNMI)
23754
+ * Copyright 2021 - Finnish Meteorological Institute (FMI)
23755
+ * */
23756
+ /**
23757
+ * A Provider component which provides the GeoWeb theme
23758
+ * @param children
23759
+ * @returns
23760
+ */
23761
+
23762
+ var CoreThemeProvider = function CoreThemeProvider(_a) {
23763
+ var children = _a.children,
23764
+ _b = _a.theme,
23765
+ theme$1 = _b === void 0 ? theme.lightTheme : _b;
23766
+ return /*#__PURE__*/React__default["default"].createElement(theme.ThemeWrapper, {
23767
+ theme: theme$1
23768
+ }, children);
23769
+ };
23770
+ /**
23771
+ * A Provider component which provides the GeoWeb theme and store for the core.
23772
+ * Note: Should only be used with core components, as the provided store is only for core.
23773
+ * @param children
23774
+ * @returns
23775
+ */
23776
+
23777
+ var CoreThemeStoreProvider = function CoreThemeStoreProvider(_a) {
23778
+ var children = _a.children,
23779
+ _b = _a.theme,
23780
+ theme$1 = _b === void 0 ? theme.lightTheme : _b,
23781
+ store = _a.store;
23782
+ return /*#__PURE__*/React__default["default"].createElement(reactRedux.Provider, {
23783
+ store: store
23784
+ }, /*#__PURE__*/React__default["default"].createElement(reduxDynamicModules.DynamicModuleLoader, {
23785
+ modules: coreModuleConfig
23786
+ }, /*#__PURE__*/React__default["default"].createElement(CoreThemeProvider, {
23787
+ theme: theme$1
23788
+ }, /*#__PURE__*/React__default["default"].createElement(SnackbarWrapperConnect, null, children))));
23789
+ };
23790
+
23245
23791
  /* *
23246
23792
  * Licensed under the Apache License, Version 2.0 (the "License");
23247
23793
  * you may not use this file except in compliance with the License.
@@ -23378,6 +23924,7 @@
23378
23924
  exports.uiModuleConfig = uiModuleConfig;
23379
23925
  exports.uiSelectors = selectors$1;
23380
23926
  exports.uiTypes = types;
23927
+ exports.useSetupDialog = useSetupDialog;
23381
23928
 
23382
23929
  Object.defineProperty(exports, '__esModule', { value: true });
23383
23930