@opengeoweb/core 2.15.0 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/index.esm.js CHANGED
@@ -7,7 +7,7 @@ import _, { isEqual, debounce, throttle, range } from 'lodash';
7
7
  import { takeLatest, put, select, call, all, takeEvery } from 'redux-saga/effects';
8
8
  import { connect, useDispatch, useSelector, Provider } from 'react-redux';
9
9
  import { Tooltip, Paper, Typography, Grid, InputLabel, IconButton, Box, CircularProgress, List, ListSubheader, ListItem, ListItemText, Dialog, DialogTitle, DialogContent, DialogContentText, TextField, DialogActions, Button, MenuItem, FormControl, LinearProgress, InputAdornment, ListItemSecondaryAction, ListItemIcon, Checkbox, Switch, Slider, FormControlLabel, Popover, useMediaQuery, useTheme, SliderThumb } from '@mui/material';
10
- import { ToolButton, ToolContainerDraggable, TooltipSelect, AlertIcon, sliderStyles, tooltipContainerStyles, CustomSlider, ToggleMenu, ManagerButton, EnableButton, AlertBanner, ManagerDeleteButton, CustomToggleButton, useIsMounted } from '@opengeoweb/shared';
10
+ import { ToolButton, ToolContainerDraggable, TooltipSelect, AlertIcon, tooltipContainerStyles, sliderHeaderStyle, CustomSlider, ToggleMenu, ManagerButton, EnableButton, AlertBanner, ManagerDeleteButton, CustomToggleButton, useIsMounted } from '@opengeoweb/shared';
11
11
  import { Pause, Play, Cached, Add, Copy, Flag, DragHandle as DragHandle$1, Filter, Close, Search, Clear, ChevronLeft, ChevronRight, Edit, Delete, Home, Minus, Layers, Equalizer, Sort, Link, LinkOff, AutoUpdateActive, AutoUpdateInActive, TextIcon, FastForward, Options, SliderThumb as SliderThumb$1, List as List$1, ThemeWrapper, lightTheme } from '@opengeoweb/theme';
12
12
  import makeStyles from '@mui/styles/makeStyles';
13
13
  import { legendImageStore, WMImageEventType, getLegendGraphicURLForLayer, WMGetServiceFromStore, LayerType as LayerType$1, getMapImageStore, WMBBOX, debug, DebugType, WMJSMap, WMLayer } from '@opengeoweb/webmap';
@@ -1666,6 +1666,17 @@ var slice$5 = createSlice({
1666
1666
  draft.availableBaseLayers.allIds.push(layer.id);
1667
1667
  });
1668
1668
  },
1669
+ setAvailableBaseLayers: function setAvailableBaseLayers(draft, action) {
1670
+ var layers = action.payload.layers;
1671
+ draft.availableBaseLayers.byId = {};
1672
+ draft.availableBaseLayers.allIds = []; // add new available baselayers
1673
+
1674
+ layers.forEach(function (layer) {
1675
+ if (layer.layerType !== LayerType.baseLayer || !layer.mapId) return;
1676
+ draft.availableBaseLayers.byId[layer.id] = createLayer(Object.assign({}, layer));
1677
+ draft.availableBaseLayers.allIds.push(layer.id);
1678
+ });
1679
+ },
1669
1680
  onUpdateLayerInformation: function onUpdateLayerInformation(draft, action) {
1670
1681
  var _action$payload11 = action.payload,
1671
1682
  layerStyle = _action$payload11.layerStyle,
@@ -1949,12 +1960,13 @@ var getLayerStyles = createSelector(getLayerFromService, function (layer) {
1949
1960
  * @returns {array} returnType: [] - array containing services
1950
1961
  */
1951
1962
 
1952
- var getServicesInArray = createSelector(servicesStore, function (store) {
1963
+ createSelector(servicesStore, function (store) {
1953
1964
  var services = store ? store.byId : {};
1954
1965
  var arrayOfServiceObjects = Object.keys(services).map(function (key) {
1955
1966
  return {
1956
1967
  name: services[key].name,
1957
- serviceUrl: services[key].serviceUrl
1968
+ serviceUrl: services[key].serviceUrl,
1969
+ isUserAddedService: services[key].isUserAddedService
1958
1970
  };
1959
1971
  });
1960
1972
  return arrayOfServiceObjects;
@@ -4373,7 +4385,8 @@ var slice = createSlice({
4373
4385
  serviceId = _action$payload.serviceId,
4374
4386
  serviceName = _action$payload.serviceName,
4375
4387
  serviceUrl = _action$payload.serviceUrl,
4376
- keywords = _action$payload.keywords;
4388
+ keywords = _action$payload.keywords,
4389
+ isUserAddedService = _action$payload.isUserAddedService;
4377
4390
 
4378
4391
  if (!draft.filters.activeServices.byId[serviceId]) {
4379
4392
  draft.filters.activeServices.byId[serviceId] = {};
@@ -4408,6 +4421,7 @@ var slice = createSlice({
4408
4421
  draft.filters.activeServices.byId[serviceId].serviceName = serviceName;
4409
4422
  draft.filters.activeServices.byId[serviceId].serviceUrl = serviceUrl;
4410
4423
  draft.filters.activeServices.byId[serviceId].enabled = true;
4424
+ draft.filters.activeServices.byId[serviceId].isUserAddedService = isUserAddedService;
4411
4425
  draft.filters.activeServices.byId[serviceId].keywordsPerService = keywords;
4412
4426
  if (!draft.filters.activeServices.allIds.includes(serviceId)) draft.filters.activeServices.allIds.push(serviceId);
4413
4427
  },
@@ -8198,7 +8212,7 @@ var mergePresetsAndUserAddedServices = function mergePresetsAndUserAddedServices
8198
8212
  };
8199
8213
  var isService = function isService(param) {
8200
8214
  var serviceParam = param;
8201
- return !!((serviceParam === null || serviceParam === void 0 ? void 0 : serviceParam.id) && (serviceParam === null || serviceParam === void 0 ? void 0 : serviceParam.name) && (serviceParam === null || serviceParam === void 0 ? void 0 : serviceParam.url));
8215
+ return !!((serviceParam === null || serviceParam === void 0 ? void 0 : serviceParam.id) && (serviceParam === null || serviceParam === void 0 ? void 0 : serviceParam.name) && (serviceParam === null || serviceParam === void 0 ? void 0 : serviceParam.url), serviceParam === null || serviceParam === void 0 ? void 0 : serviceParam.isUserAddedService);
8202
8216
  };
8203
8217
 
8204
8218
  var getUserAddedServices = function getUserAddedServices() {
@@ -8207,6 +8221,13 @@ var getUserAddedServices = function getUserAddedServices() {
8207
8221
  var parsedData = JSON.parse(storedString);
8208
8222
 
8209
8223
  if (parsedData && _typeof(parsedData) === 'object') {
8224
+ Object.values(parsedData).forEach(function (value) {
8225
+ // eslint-disable-next-line no-prototype-builtins
8226
+ if (value.hasOwnProperty('url') && value.hasOwnProperty('id')) {
8227
+ var service = value;
8228
+ service.isUserAddedService = true;
8229
+ }
8230
+ });
8210
8231
  return Object.entries(parsedData).reduce(function (userServices, _ref) {
8211
8232
  var _ref2 = _slicedToArray(_ref, 2),
8212
8233
  serviceUrl = _ref2[0],
@@ -8233,39 +8254,26 @@ var _marked = /*#__PURE__*/regeneratorRuntime.mark(newServiceAddedSaga),
8233
8254
  _marked2 = /*#__PURE__*/regeneratorRuntime.mark(layerSelectServiceRemovedSaga),
8234
8255
  _marked3 = /*#__PURE__*/regeneratorRuntime.mark(rootSaga);
8235
8256
  function newServiceAddedSaga(capturedAction) {
8236
- var addedService, id, serviceUrl, name, keywords, services, findServiceName;
8257
+ var addedService, id, serviceUrl, name, isUserAddedService, keywords;
8237
8258
  return regeneratorRuntime.wrap(function newServiceAddedSaga$(_context) {
8238
8259
  while (1) {
8239
8260
  switch (_context.prev = _context.next) {
8240
8261
  case 0:
8241
8262
  addedService = capturedAction.payload;
8242
- id = addedService.id, serviceUrl = addedService.serviceUrl, name = addedService.name;
8263
+ id = addedService.id, serviceUrl = addedService.serviceUrl, name = addedService.name, isUserAddedService = addedService.isUserAddedService;
8243
8264
  keywords = addedService.layers.reduce(function (keywordAccumulator, layer) {
8244
8265
  return keywordAccumulator.concat(layer.path, layer.keywords);
8245
8266
  }, []);
8246
8267
  _context.next = 5;
8247
- return select(getServicesInArray);
8248
-
8249
- case 5:
8250
- services = _context.sent;
8251
-
8252
- findServiceName = function findServiceName() {
8253
- var foundService = services.find(function (object) {
8254
- return (object === null || object === void 0 ? void 0 : object.url) === serviceUrl;
8255
- });
8256
- if (foundService) return foundService.name;
8257
- return name;
8258
- };
8259
-
8260
- _context.next = 9;
8261
8268
  return put(layerSelectActions.addKeywordsAndActiveServices({
8262
8269
  serviceId: id,
8263
- serviceName: findServiceName(),
8270
+ serviceName: name,
8264
8271
  serviceUrl: serviceUrl,
8265
- keywords: keywords
8272
+ keywords: keywords,
8273
+ isUserAddedService: isUserAddedService
8266
8274
  }));
8267
8275
 
8268
- case 9:
8276
+ case 5:
8269
8277
  case "end":
8270
8278
  return _context.stop();
8271
8279
  }
@@ -9723,7 +9731,6 @@ var OpacitySelect = function OpacitySelect(_ref) {
9723
9731
  _ref$isEnabled = _ref.isEnabled,
9724
9732
  isEnabled = _ref$isEnabled === void 0 ? true : _ref$isEnabled;
9725
9733
  var classes = useStyles$n();
9726
- var sliderClasses = sliderStyles();
9727
9734
 
9728
9735
  var _React$useState = React.useState(false),
9729
9736
  _React$useState2 = _slicedToArray(_React$useState, 2),
@@ -9789,8 +9796,8 @@ var OpacitySelect = function OpacitySelect(_ref) {
9789
9796
  onBlur: onBlur
9790
9797
  }, currentOpacityText)), open ? /*#__PURE__*/React.createElement("div", {
9791
9798
  className: classes.sliderBackground
9792
- }, /*#__PURE__*/React.createElement("div", {
9793
- className: sliderClasses.sliderHeader
9799
+ }, /*#__PURE__*/React.createElement(Box, {
9800
+ sx: sliderHeaderStyle
9794
9801
  }, "Opacity"), /*#__PURE__*/React.createElement(CustomSlider, {
9795
9802
  "data-testid": "opacitySlider",
9796
9803
  orientation: "vertical",
@@ -10963,6 +10970,15 @@ var constructListAvailableBaseLayers = function constructListAvailableBaseLayers
10963
10970
  }));
10964
10971
  }, baseLayersWithMapId);
10965
10972
  };
10973
+ var areAvailableBaseLayersSame = function areAvailableBaseLayersSame(availableBaseLayerList, newBaseLayerList) {
10974
+ var availableList = availableBaseLayerList.map(function (layer) {
10975
+ return layer.name;
10976
+ });
10977
+ var newList = newBaseLayerList.map(function (layer) {
10978
+ return layer.name;
10979
+ });
10980
+ return isEqual(availableList, newList);
10981
+ };
10966
10982
 
10967
10983
  var BaseLayersConnect = function BaseLayersConnect(_ref) {
10968
10984
  var mapId = _ref.mapId,
@@ -10976,14 +10992,16 @@ var BaseLayersConnect = function BaseLayersConnect(_ref) {
10976
10992
  });
10977
10993
  React.useEffect(function () {
10978
10994
  // Set initial availableBaseLayers only if none set for that map yet
10979
- if (currentAvailableBaseLayers.length < 1) {
10980
- var availableBaseLayersToBeAdded = constructListAvailableBaseLayers(selectedBaseLayers, preloadedAvailableBaseLayers, mapId);
10981
- dispatch(layerActions.addAvailableBaseLayers({
10995
+ var availableBaseLayersToBeAdded = constructListAvailableBaseLayers(selectedBaseLayers, preloadedAvailableBaseLayers, mapId);
10996
+ var areBaseLayersSame = areAvailableBaseLayersSame(availableBaseLayersToBeAdded, currentAvailableBaseLayers);
10997
+
10998
+ if (!areBaseLayersSame) {
10999
+ dispatch(layerActions.setAvailableBaseLayers({
10982
11000
  layers: availableBaseLayersToBeAdded
10983
11001
  }));
10984
11002
  } // eslint-disable-next-line react-hooks/exhaustive-deps
10985
11003
 
10986
- }, [mapId]);
11004
+ }, [mapId, preloadedAvailableBaseLayers]);
10987
11005
 
10988
11006
  var onChangeBaseLayers = function onChangeBaseLayers(newSelectedLayerId) {
10989
11007
  var newBaseLayer = currentAvailableBaseLayers.filter(function (layer) {
@@ -11283,23 +11301,22 @@ var ServicePopup = function ServicePopup(_ref) {
11283
11301
  hideBackdrop = _ref$hideBackdrop === void 0 ? false : _ref$hideBackdrop,
11284
11302
  isOpen = _ref.isOpen,
11285
11303
  closePopup = _ref.closePopup,
11304
+ serviceId = _ref.serviceId,
11286
11305
  url = _ref.url,
11287
11306
  services = _ref.services,
11288
11307
  serviceSetLayers = _ref.serviceSetLayers;
11289
11308
 
11290
- var _a, _b;
11291
-
11292
- var _React$useState = React.useState(servicePopupVariant !== 'edit' || services === undefined ? '' : (_a = services[url]) === null || _a === void 0 ? void 0 : _a.name),
11309
+ var _React$useState = React.useState(''),
11293
11310
  _React$useState2 = _slicedToArray(_React$useState, 2),
11294
11311
  serviceName = _React$useState2[0],
11295
11312
  setServiceName = _React$useState2[1];
11296
11313
 
11297
- var _React$useState3 = React.useState(servicePopupVariant === 'add' || url === undefined ? '' : url),
11314
+ var _React$useState3 = React.useState(''),
11298
11315
  _React$useState4 = _slicedToArray(_React$useState3, 2),
11299
11316
  serviceUrl = _React$useState4[0],
11300
11317
  setServiceUrl = _React$useState4[1];
11301
11318
 
11302
- var _React$useState5 = React.useState(servicePopupVariant !== 'edit' || services === undefined ? '' : (_b = services[url]) === null || _b === void 0 ? void 0 : _b["abstract"]),
11319
+ var _React$useState5 = React.useState(''),
11303
11320
  _React$useState6 = _slicedToArray(_React$useState5, 2),
11304
11321
  _abstract = _React$useState6[0],
11305
11322
  setAbstract = _React$useState6[1];
@@ -11334,6 +11351,19 @@ var ServicePopup = function ServicePopup(_ref) {
11334
11351
  serviceUrlHelperText = _React$useState18[0],
11335
11352
  setServiceUrlHelperText = _React$useState18[1];
11336
11353
 
11354
+ React.useEffect(function () {
11355
+ var _a;
11356
+
11357
+ if (servicePopupVariant === 'edit') {
11358
+ setServiceName(((_a = services[serviceId]) === null || _a === void 0 ? void 0 : _a.serviceName) || '');
11359
+ setServiceUrl(url || '');
11360
+ }
11361
+
11362
+ if (servicePopupVariant === 'save') {
11363
+ setServiceUrl(url || '');
11364
+ }
11365
+ }, [serviceId, services, url, servicePopupVariant, isOpen]);
11366
+
11337
11367
  var validateServiceUrl = function validateServiceUrl(url) {
11338
11368
  if (url === '' || url === null || typeof url === 'undefined') return false;
11339
11369
  var matcher = /^(?:\w+:)?\/\/([^\s.]+\.\S{2}|[0-9a-zA-Z]+[:?\d]*)\S*$/;
@@ -11420,11 +11450,10 @@ var ServicePopup = function ServicePopup(_ref) {
11420
11450
 
11421
11451
  var ServiceNameInRedux = function ServiceNameInRedux() {
11422
11452
  if (servicePopupVariant === 'add' || servicePopupVariant === 'save') {
11423
- for (var service in services) {
11424
- if (services && services[service].name.toLowerCase() === serviceName.toLowerCase()) return true;
11425
- }
11426
-
11427
- return false;
11453
+ var foundName = Object.keys(services).find(function (serviceId) {
11454
+ return services[serviceId].serviceName.toLowerCase() === (serviceName === null || serviceName === void 0 ? void 0 : serviceName.toLowerCase());
11455
+ });
11456
+ return foundName !== undefined;
11428
11457
  }
11429
11458
 
11430
11459
  return false;
@@ -11432,11 +11461,10 @@ var ServicePopup = function ServicePopup(_ref) {
11432
11461
 
11433
11462
  var UrlInRedux = function UrlInRedux() {
11434
11463
  if (servicePopupVariant === 'add' || servicePopupVariant === 'save') {
11435
- if (services && services[serviceUrl]) {
11436
- return true;
11437
- }
11438
-
11439
- return false;
11464
+ var foundUrl = Object.keys(services).find(function (serviceId) {
11465
+ return services[serviceId].serviceUrl === serviceUrl;
11466
+ });
11467
+ return foundUrl !== undefined;
11440
11468
  }
11441
11469
 
11442
11470
  return false;
@@ -11444,6 +11472,7 @@ var ServicePopup = function ServicePopup(_ref) {
11444
11472
 
11445
11473
 
11446
11474
  React.useEffect(function () {
11475
+ if (serviceName === undefined) return;
11447
11476
  setServiceNameHelperText('');
11448
11477
 
11449
11478
  if (ServiceNameInRedux()) {
@@ -11459,7 +11488,7 @@ var ServicePopup = function ServicePopup(_ref) {
11459
11488
  React.useEffect(function () {
11460
11489
  setServiceUrlHelperText('');
11461
11490
 
11462
- if (serviceUrl.length > 0 && !validateServiceUrl(serviceUrl)) {
11491
+ if (serviceUrl && serviceUrl.length > 0 && !validateServiceUrl(serviceUrl)) {
11463
11492
  setServiceUrlHasError(true);
11464
11493
  setServiceUrlHelperText('Error: Not a valid URL.');
11465
11494
  } else if (UrlInRedux()) {
@@ -11546,7 +11575,8 @@ var ServicePopup = function ServicePopup(_ref) {
11546
11575
  return setAbstract(event.target.value);
11547
11576
  },
11548
11577
  value: _abstract,
11549
- "data-testid": "abstractTextField"
11578
+ "data-testid": "abstractTextField",
11579
+ disabled: true
11550
11580
  })), /*#__PURE__*/React.createElement(DialogActions, {
11551
11581
  sx: style$1.footerContent
11552
11582
  }, /*#__PURE__*/React.createElement(Button, {
@@ -11602,10 +11632,11 @@ var ServicePopupConnect = function ServicePopupConnect(_ref) {
11602
11632
  hideBackdrop = _ref.hideBackdrop,
11603
11633
  isOpen = _ref.isOpen,
11604
11634
  closePopup = _ref.closePopup,
11635
+ serviceId = _ref.serviceId,
11605
11636
  url = _ref.url;
11606
11637
  var dispatch = useDispatch();
11607
11638
  var services = useSelector(function (store) {
11608
- return getServices(store);
11639
+ return getActiveServices(store);
11609
11640
  });
11610
11641
  var serviceSetLayers = React__default.useCallback(function (payload) {
11611
11642
  dispatch(serviceActions.serviceSetLayers(payload));
@@ -11615,9 +11646,10 @@ var ServicePopupConnect = function ServicePopupConnect(_ref) {
11615
11646
  hideBackdrop: hideBackdrop,
11616
11647
  isOpen: isOpen,
11617
11648
  closePopup: closePopup,
11618
- url: url,
11649
+ serviceId: serviceId,
11619
11650
  services: services,
11620
- serviceSetLayers: serviceSetLayers
11651
+ serviceSetLayers: serviceSetLayers,
11652
+ url: url
11621
11653
  });
11622
11654
  };
11623
11655
 
@@ -12459,28 +12491,32 @@ var styles = {
12459
12491
 
12460
12492
  var ServiceOptionsDialog = function ServiceOptionsDialog(_ref) {
12461
12493
  var services = _ref.services,
12462
- mapStoreRemoveService = _ref.mapStoreRemoveService,
12463
- _ref$layers = _ref.layers,
12464
- layers = _ref$layers === void 0 ? [] : _ref$layers;
12494
+ mapStoreRemoveService = _ref.mapStoreRemoveService;
12465
12495
 
12466
12496
  var _React$useState = React.useState(false),
12467
12497
  _React$useState2 = _slicedToArray(_React$useState, 2),
12468
- addServiceisOpen = _React$useState2[0],
12498
+ addServiceIsOpen = _React$useState2[0],
12469
12499
  setAddServiceIsOpen = _React$useState2[1];
12470
12500
 
12501
+ var _React$useState3 = React.useState({
12502
+ isOpen: false,
12503
+ serviceId: '',
12504
+ serviceUrl: ''
12505
+ }),
12506
+ _React$useState4 = _slicedToArray(_React$useState3, 2),
12507
+ editServiceIsOpen = _React$useState4[0],
12508
+ setEditServiceIsOpen = _React$useState4[1];
12509
+
12471
12510
  var openAddService = function openAddService() {
12472
12511
  setAddServiceIsOpen(true);
12473
12512
  };
12474
12513
 
12475
12514
  var closePopup = function closePopup() {
12476
12515
  setAddServiceIsOpen(false);
12477
- };
12478
-
12479
- var isDisabled = function isDisabled(service) {
12480
- return layers.some(function (layer) {
12481
- return layer.service && layer.service.includes(service);
12482
- }) || preloadedDefaultMapServices.some(function (defaultMapService) {
12483
- return defaultMapService.url && defaultMapService.url.includes(service);
12516
+ setEditServiceIsOpen({
12517
+ isOpen: false,
12518
+ serviceId: '',
12519
+ serviceUrl: ''
12484
12520
  });
12485
12521
  };
12486
12522
 
@@ -12509,16 +12545,25 @@ var ServiceOptionsDialog = function ServiceOptionsDialog(_ref) {
12509
12545
  marginRight: '-10px'
12510
12546
  }
12511
12547
  }, /*#__PURE__*/React.createElement(Tooltip, {
12512
- title: "Edit Service"
12548
+ title: "Edit Service",
12549
+ disableHoverListener: !services[serviceId].isUserAddedService
12513
12550
  }, /*#__PURE__*/React.createElement("span", null, /*#__PURE__*/React.createElement(IconButton, {
12514
- disabled: isDisabled(services[serviceId].serviceUrl),
12551
+ disabled: !services[serviceId].isUserAddedService,
12515
12552
  "data-testid": "openEditServiceButton",
12516
- size: "large"
12553
+ size: "large",
12554
+ onClick: function onClick() {
12555
+ setEditServiceIsOpen({
12556
+ isOpen: true,
12557
+ serviceId: serviceId,
12558
+ serviceUrl: services[serviceId].serviceUrl
12559
+ });
12560
+ }
12517
12561
  }, /*#__PURE__*/React.createElement(Edit, null)))), /*#__PURE__*/React.createElement(Tooltip, {
12518
- title: "Delete Service"
12562
+ title: "Delete Service",
12563
+ disableHoverListener: !services[serviceId].isUserAddedService
12519
12564
  }, /*#__PURE__*/React.createElement("span", null, /*#__PURE__*/React.createElement(IconButton, {
12520
12565
  size: "large",
12521
- disabled: isDisabled(services[serviceId].serviceUrl),
12566
+ disabled: !services[serviceId].isUserAddedService,
12522
12567
  onClick: function onClick() {
12523
12568
  return mapStoreRemoveService(serviceId, services[serviceId].serviceUrl);
12524
12569
  },
@@ -12532,10 +12577,16 @@ var ServiceOptionsDialog = function ServiceOptionsDialog(_ref) {
12532
12577
  sx: styles.button,
12533
12578
  variant: "tertiary",
12534
12579
  startIcon: /*#__PURE__*/React.createElement(Add, null)
12535
- }, "Add a new service"))), addServiceisOpen && /*#__PURE__*/React.createElement(ServicePopupConnect, {
12580
+ }, "Add a new service"))), addServiceIsOpen && /*#__PURE__*/React.createElement(ServicePopupConnect, {
12536
12581
  servicePopupVariant: "add",
12537
- isOpen: addServiceisOpen,
12582
+ isOpen: addServiceIsOpen,
12538
12583
  closePopup: closePopup
12584
+ }), editServiceIsOpen && /*#__PURE__*/React.createElement(ServicePopupConnect, {
12585
+ servicePopupVariant: "edit",
12586
+ isOpen: editServiceIsOpen.isOpen,
12587
+ closePopup: closePopup,
12588
+ serviceId: editServiceIsOpen.serviceId,
12589
+ url: editServiceIsOpen.serviceUrl
12539
12590
  }));
12540
12591
  };
12541
12592
 
@@ -12558,9 +12609,6 @@ var ServiceOptionsDialog = function ServiceOptionsDialog(_ref) {
12558
12609
 
12559
12610
  var ServiceOptionsDialogConnect = function ServiceOptionsDialogConnect() {
12560
12611
  var dispatch = useDispatch();
12561
- var allLayers = useSelector(function (store) {
12562
- return getAllLayers(store);
12563
- });
12564
12612
  var mapStoreRemoveService = React.useCallback(function (serviceId, serviceUrl) {
12565
12613
  dispatch(serviceActions.mapStoreRemoveService({
12566
12614
  id: serviceId,
@@ -12572,7 +12620,6 @@ var ServiceOptionsDialogConnect = function ServiceOptionsDialogConnect() {
12572
12620
  });
12573
12621
  return /*#__PURE__*/React.createElement(ServiceOptionsDialog, {
12574
12622
  services: services,
12575
- layers: allLayers,
12576
12623
  mapStoreRemoveService: mapStoreRemoveService
12577
12624
  });
12578
12625
  };
@@ -13162,6 +13209,11 @@ var LayerSelectConnect = function LayerSelectConnect(_ref) {
13162
13209
  var serviceSetLayers = React.useCallback(function (payload) {
13163
13210
  dispatch(serviceActions.serviceSetLayers(payload));
13164
13211
  }, [dispatch]);
13212
+
13213
+ var checkIfUserAddedService = function checkIfUserAddedService(service) {
13214
+ return !!service.isUserAddedService;
13215
+ };
13216
+
13165
13217
  React.useEffect(function () {
13166
13218
  if (isOpenInStore && preloadedServices && preloadedServices.length > 0) {
13167
13219
  mergePresetsAndUserAddedServices(preloadedServices, getUserAddedServices()).forEach(function (service) {
@@ -13173,7 +13225,7 @@ var LayerSelectConnect = function LayerSelectConnect(_ref) {
13173
13225
  name: service.name,
13174
13226
  serviceUrl: service.url,
13175
13227
  layers: layers,
13176
- isUserAddedService: false
13228
+ isUserAddedService: checkIfUserAddedService(service)
13177
13229
  });
13178
13230
  }
13179
13231
  })["catch"](function () {
@@ -14225,7 +14277,6 @@ var SpeedButton = function SpeedButton(_ref) {
14225
14277
  var animationDelay = _ref.animationDelay,
14226
14278
  setMapAnimationDelay = _ref.setMapAnimationDelay;
14227
14279
  var classes = useStyles$c();
14228
- var sliderClasses = sliderStyles();
14229
14280
 
14230
14281
  var _React$useState = React.useState(false),
14231
14282
  _React$useState2 = _slicedToArray(_React$useState, 2),
@@ -14290,8 +14341,8 @@ var SpeedButton = function SpeedButton(_ref) {
14290
14341
  text: text
14291
14342
  })))), open ? /*#__PURE__*/React.createElement("div", {
14292
14343
  className: classes.sliderBackground
14293
- }, /*#__PURE__*/React.createElement("div", {
14294
- className: sliderClasses.sliderHeader
14344
+ }, /*#__PURE__*/React.createElement(Box, {
14345
+ sx: sliderHeaderStyle
14295
14346
  }, "Speed"), /*#__PURE__*/React.createElement(CustomSlider, {
14296
14347
  "data-testid": "speedSlider",
14297
14348
  orientation: "vertical",
@@ -14466,7 +14517,6 @@ var TimeStepButton = function TimeStepButton(_ref) {
14466
14517
  return null;
14467
14518
  } : _ref$onToggleTimestep;
14468
14519
  var classes = useStyles$b();
14469
- var sliderClasses = sliderStyles();
14470
14520
 
14471
14521
  var _React$useState = React.useState(false),
14472
14522
  _React$useState2 = _slicedToArray(_React$useState, 2),
@@ -14535,8 +14585,8 @@ var TimeStepButton = function TimeStepButton(_ref) {
14535
14585
  "data-testid": "timeStepButtonText"
14536
14586
  })))), open ? /*#__PURE__*/React.createElement("div", {
14537
14587
  className: classes.sliderBackground
14538
- }, /*#__PURE__*/React.createElement("div", {
14539
- className: sliderClasses.sliderHeader
14588
+ }, /*#__PURE__*/React.createElement(Box, {
14589
+ sx: sliderHeaderStyle
14540
14590
  }, "Time step"), /*#__PURE__*/React.createElement(CustomSlider, {
14541
14591
  "data-testid": "timeStepButtonSlider",
14542
14592
  orientation: "vertical",
package/index.umd.js CHANGED
@@ -1532,6 +1532,17 @@
1532
1532
  draft.availableBaseLayers.allIds.push(layer.id);
1533
1533
  });
1534
1534
  },
1535
+ setAvailableBaseLayers: function setAvailableBaseLayers(draft, action) {
1536
+ var layers = action.payload.layers;
1537
+ draft.availableBaseLayers.byId = {};
1538
+ draft.availableBaseLayers.allIds = []; // add new available baselayers
1539
+
1540
+ layers.forEach(function (layer) {
1541
+ if (layer.layerType !== LayerType.baseLayer || !layer.mapId) return;
1542
+ draft.availableBaseLayers.byId[layer.id] = createLayer(__assign({}, layer));
1543
+ draft.availableBaseLayers.allIds.push(layer.id);
1544
+ });
1545
+ },
1535
1546
  onUpdateLayerInformation: function onUpdateLayerInformation(draft, action) {
1536
1547
  var _a = action.payload,
1537
1548
  layerStyle = _a.layerStyle,
@@ -1815,12 +1826,13 @@
1815
1826
  * @returns {array} returnType: [] - array containing services
1816
1827
  */
1817
1828
 
1818
- var getServicesInArray = toolkit.createSelector(servicesStore, function (store) {
1829
+ toolkit.createSelector(servicesStore, function (store) {
1819
1830
  var services = store ? store.byId : {};
1820
1831
  var arrayOfServiceObjects = Object.keys(services).map(function (key) {
1821
1832
  return {
1822
1833
  name: services[key].name,
1823
- serviceUrl: services[key].serviceUrl
1834
+ serviceUrl: services[key].serviceUrl,
1835
+ isUserAddedService: services[key].isUserAddedService
1824
1836
  };
1825
1837
  });
1826
1838
  return arrayOfServiceObjects;
@@ -4308,7 +4320,8 @@
4308
4320
  serviceId = _b.serviceId,
4309
4321
  serviceName = _b.serviceName,
4310
4322
  serviceUrl = _b.serviceUrl,
4311
- keywords = _b.keywords;
4323
+ keywords = _b.keywords,
4324
+ isUserAddedService = _b.isUserAddedService;
4312
4325
 
4313
4326
  if (!draft.filters.activeServices.byId[serviceId]) {
4314
4327
  draft.filters.activeServices.byId[serviceId] = {};
@@ -4346,6 +4359,7 @@
4346
4359
  draft.filters.activeServices.byId[serviceId].serviceName = serviceName;
4347
4360
  draft.filters.activeServices.byId[serviceId].serviceUrl = serviceUrl;
4348
4361
  draft.filters.activeServices.byId[serviceId].enabled = true;
4362
+ draft.filters.activeServices.byId[serviceId].isUserAddedService = isUserAddedService;
4349
4363
  draft.filters.activeServices.byId[serviceId].keywordsPerService = keywords;
4350
4364
  if (!draft.filters.activeServices.allIds.includes(serviceId)) draft.filters.activeServices.allIds.push(serviceId);
4351
4365
  },
@@ -8459,7 +8473,7 @@
8459
8473
  };
8460
8474
  var isService = function isService(param) {
8461
8475
  var serviceParam = param;
8462
- return !!((serviceParam === null || serviceParam === void 0 ? void 0 : serviceParam.id) && (serviceParam === null || serviceParam === void 0 ? void 0 : serviceParam.name) && (serviceParam === null || serviceParam === void 0 ? void 0 : serviceParam.url));
8476
+ return !!((serviceParam === null || serviceParam === void 0 ? void 0 : serviceParam.id) && (serviceParam === null || serviceParam === void 0 ? void 0 : serviceParam.name) && (serviceParam === null || serviceParam === void 0 ? void 0 : serviceParam.url), serviceParam === null || serviceParam === void 0 ? void 0 : serviceParam.isUserAddedService);
8463
8477
  };
8464
8478
 
8465
8479
  var getUserAddedServices = function getUserAddedServices() {
@@ -8468,6 +8482,13 @@
8468
8482
  var parsedData = JSON.parse(storedString);
8469
8483
 
8470
8484
  if (parsedData && _typeof(parsedData) === 'object') {
8485
+ Object.values(parsedData).forEach(function (value) {
8486
+ // eslint-disable-next-line no-prototype-builtins
8487
+ if (value.hasOwnProperty('url') && value.hasOwnProperty('id')) {
8488
+ var service = value;
8489
+ service.isUserAddedService = true;
8490
+ }
8491
+ });
8471
8492
  return Object.entries(parsedData).reduce(function (userServices, _a) {
8472
8493
  var _b;
8473
8494
 
@@ -8509,40 +8530,26 @@
8509
8530
  * Copyright 2022 - Finnish Meteorological Institute (FMI)
8510
8531
  * */
8511
8532
  function newServiceAddedSaga(capturedAction) {
8512
- var addedService, id, serviceUrl, name, keywords, services, findServiceName;
8533
+ var addedService, id, serviceUrl, name, isUserAddedService, keywords;
8513
8534
  return __generator(this, function (_a) {
8514
8535
  switch (_a.label) {
8515
8536
  case 0:
8516
8537
  addedService = capturedAction.payload;
8517
- id = addedService.id, serviceUrl = addedService.serviceUrl, name = addedService.name;
8538
+ id = addedService.id, serviceUrl = addedService.serviceUrl, name = addedService.name, isUserAddedService = addedService.isUserAddedService;
8518
8539
  keywords = addedService.layers.reduce(function (keywordAccumulator, layer) {
8519
8540
  return keywordAccumulator.concat(layer.path, layer.keywords);
8520
8541
  }, []);
8521
- return [4
8522
- /*yield*/
8523
- , effects.select(getServicesInArray)];
8524
-
8525
- case 1:
8526
- services = _a.sent();
8527
-
8528
- findServiceName = function findServiceName() {
8529
- var foundService = services.find(function (object) {
8530
- return (object === null || object === void 0 ? void 0 : object.url) === serviceUrl;
8531
- });
8532
- if (foundService) return foundService.name;
8533
- return name;
8534
- };
8535
-
8536
8542
  return [4
8537
8543
  /*yield*/
8538
8544
  , effects.put(layerSelectActions.addKeywordsAndActiveServices({
8539
8545
  serviceId: id,
8540
- serviceName: findServiceName(),
8546
+ serviceName: name,
8541
8547
  serviceUrl: serviceUrl,
8542
- keywords: keywords
8548
+ keywords: keywords,
8549
+ isUserAddedService: isUserAddedService
8543
8550
  }))];
8544
8551
 
8545
- case 2:
8552
+ case 1:
8546
8553
  _a.sent();
8547
8554
 
8548
8555
  return [2
@@ -10127,7 +10134,6 @@
10127
10134
  _b = _a.isEnabled,
10128
10135
  isEnabled = _b === void 0 ? true : _b;
10129
10136
  var classes = useStyles$n();
10130
- var sliderClasses = shared.sliderStyles();
10131
10137
 
10132
10138
  var _c = __read(React__namespace.useState(false), 2),
10133
10139
  open = _c[0],
@@ -10191,8 +10197,8 @@
10191
10197
  onBlur: onBlur
10192
10198
  }, currentOpacityText)), open ? /*#__PURE__*/React__namespace.createElement("div", {
10193
10199
  className: classes.sliderBackground
10194
- }, /*#__PURE__*/React__namespace.createElement("div", {
10195
- className: sliderClasses.sliderHeader
10200
+ }, /*#__PURE__*/React__namespace.createElement(material.Box, {
10201
+ sx: shared.sliderHeaderStyle
10196
10202
  }, "Opacity"), /*#__PURE__*/React__namespace.createElement(shared.CustomSlider, {
10197
10203
  "data-testid": "opacitySlider",
10198
10204
  orientation: "vertical",
@@ -11379,6 +11385,15 @@
11379
11385
  }));
11380
11386
  }, baseLayersWithMapId);
11381
11387
  };
11388
+ var areAvailableBaseLayersSame = function areAvailableBaseLayersSame(availableBaseLayerList, newBaseLayerList) {
11389
+ var availableList = availableBaseLayerList.map(function (layer) {
11390
+ return layer.name;
11391
+ });
11392
+ var newList = newBaseLayerList.map(function (layer) {
11393
+ return layer.name;
11394
+ });
11395
+ return _.isEqual(availableList, newList);
11396
+ };
11382
11397
 
11383
11398
  var BaseLayersConnect = function BaseLayersConnect(_a) {
11384
11399
  var mapId = _a.mapId,
@@ -11392,14 +11407,16 @@
11392
11407
  });
11393
11408
  React__namespace.useEffect(function () {
11394
11409
  // Set initial availableBaseLayers only if none set for that map yet
11395
- if (currentAvailableBaseLayers.length < 1) {
11396
- var availableBaseLayersToBeAdded = constructListAvailableBaseLayers(selectedBaseLayers, preloadedAvailableBaseLayers, mapId);
11397
- dispatch(layerActions.addAvailableBaseLayers({
11410
+ var availableBaseLayersToBeAdded = constructListAvailableBaseLayers(selectedBaseLayers, preloadedAvailableBaseLayers, mapId);
11411
+ var areBaseLayersSame = areAvailableBaseLayersSame(availableBaseLayersToBeAdded, currentAvailableBaseLayers);
11412
+
11413
+ if (!areBaseLayersSame) {
11414
+ dispatch(layerActions.setAvailableBaseLayers({
11398
11415
  layers: availableBaseLayersToBeAdded
11399
11416
  }));
11400
11417
  } // eslint-disable-next-line react-hooks/exhaustive-deps
11401
11418
 
11402
- }, [mapId]);
11419
+ }, [mapId, preloadedAvailableBaseLayers]);
11403
11420
 
11404
11421
  var onChangeBaseLayers = function onChangeBaseLayers(newSelectedLayerId) {
11405
11422
  var newBaseLayer = currentAvailableBaseLayers.filter(function (layer) {
@@ -11725,52 +11742,64 @@
11725
11742
  };
11726
11743
 
11727
11744
  var ServicePopup = function ServicePopup(_a) {
11728
- var _b, _c;
11729
-
11730
11745
  var servicePopupVariant = _a.servicePopupVariant,
11731
- _d = _a.hideBackdrop,
11732
- hideBackdrop = _d === void 0 ? false : _d,
11746
+ _b = _a.hideBackdrop,
11747
+ hideBackdrop = _b === void 0 ? false : _b,
11733
11748
  isOpen = _a.isOpen,
11734
11749
  closePopup = _a.closePopup,
11750
+ serviceId = _a.serviceId,
11735
11751
  url = _a.url,
11736
11752
  services = _a.services,
11737
11753
  serviceSetLayers = _a.serviceSetLayers;
11738
11754
 
11739
- var _e = __read(React__namespace.useState(servicePopupVariant !== 'edit' || services === undefined ? '' : (_b = services[url]) === null || _b === void 0 ? void 0 : _b.name), 2),
11740
- serviceName = _e[0],
11741
- setServiceName = _e[1];
11755
+ var _c = __read(React__namespace.useState(''), 2),
11756
+ serviceName = _c[0],
11757
+ setServiceName = _c[1];
11758
+
11759
+ var _d = __read(React__namespace.useState(''), 2),
11760
+ serviceUrl = _d[0],
11761
+ setServiceUrl = _d[1];
11742
11762
 
11743
- var _f = __read(React__namespace.useState(servicePopupVariant === 'add' || url === undefined ? '' : url), 2),
11744
- serviceUrl = _f[0],
11745
- setServiceUrl = _f[1];
11763
+ var _e = __read(React__namespace.useState(''), 2),
11764
+ _abstract = _e[0],
11765
+ setAbstract = _e[1];
11746
11766
 
11747
- var _g = __read(React__namespace.useState(servicePopupVariant !== 'edit' || services === undefined ? '' : (_c = services[url]) === null || _c === void 0 ? void 0 : _c["abstract"]), 2),
11748
- _abstract = _g[0],
11749
- setAbstract = _g[1];
11767
+ var _f = __read(React__namespace.useState(false), 2),
11768
+ disableButton = _f[0],
11769
+ setDisableButton = _f[1];
11770
+
11771
+ var _g = __read(React__namespace.useState(false), 2),
11772
+ isLoading = _g[0],
11773
+ setIsLoading = _g[1];
11750
11774
 
11751
11775
  var _h = __read(React__namespace.useState(false), 2),
11752
- disableButton = _h[0],
11753
- setDisableButton = _h[1];
11776
+ serviceNameHasError = _h[0],
11777
+ setServiceNameHasError = _h[1];
11754
11778
 
11755
- var _j = __read(React__namespace.useState(false), 2),
11756
- isLoading = _j[0],
11757
- setIsLoading = _j[1];
11779
+ var _j = __read(React__namespace.useState(''), 2),
11780
+ serviceNameHelperText = _j[0],
11781
+ setServiceNameHelperText = _j[1];
11758
11782
 
11759
11783
  var _k = __read(React__namespace.useState(false), 2),
11760
- serviceNameHasError = _k[0],
11761
- setServiceNameHasError = _k[1];
11784
+ serviceUrlHasError = _k[0],
11785
+ setServiceUrlHasError = _k[1];
11762
11786
 
11763
11787
  var _l = __read(React__namespace.useState(''), 2),
11764
- serviceNameHelperText = _l[0],
11765
- setServiceNameHelperText = _l[1];
11788
+ serviceUrlHelperText = _l[0],
11789
+ setServiceUrlHelperText = _l[1];
11766
11790
 
11767
- var _m = __read(React__namespace.useState(false), 2),
11768
- serviceUrlHasError = _m[0],
11769
- setServiceUrlHasError = _m[1];
11791
+ React__namespace.useEffect(function () {
11792
+ var _a;
11770
11793
 
11771
- var _o = __read(React__namespace.useState(''), 2),
11772
- serviceUrlHelperText = _o[0],
11773
- setServiceUrlHelperText = _o[1];
11794
+ if (servicePopupVariant === 'edit') {
11795
+ setServiceName(((_a = services[serviceId]) === null || _a === void 0 ? void 0 : _a.serviceName) || '');
11796
+ setServiceUrl(url || '');
11797
+ }
11798
+
11799
+ if (servicePopupVariant === 'save') {
11800
+ setServiceUrl(url || '');
11801
+ }
11802
+ }, [serviceId, services, url, servicePopupVariant, isOpen]);
11774
11803
 
11775
11804
  var validateServiceUrl = function validateServiceUrl(url) {
11776
11805
  if (url === '' || url === null || typeof url === 'undefined') return false;
@@ -11869,11 +11898,10 @@
11869
11898
 
11870
11899
  var ServiceNameInRedux = function ServiceNameInRedux() {
11871
11900
  if (servicePopupVariant === 'add' || servicePopupVariant === 'save') {
11872
- for (var service in services) {
11873
- if (services && services[service].name.toLowerCase() === serviceName.toLowerCase()) return true;
11874
- }
11875
-
11876
- return false;
11901
+ var foundName = Object.keys(services).find(function (serviceId) {
11902
+ return services[serviceId].serviceName.toLowerCase() === (serviceName === null || serviceName === void 0 ? void 0 : serviceName.toLowerCase());
11903
+ });
11904
+ return foundName !== undefined;
11877
11905
  }
11878
11906
 
11879
11907
  return false;
@@ -11881,11 +11909,10 @@
11881
11909
 
11882
11910
  var UrlInRedux = function UrlInRedux() {
11883
11911
  if (servicePopupVariant === 'add' || servicePopupVariant === 'save') {
11884
- if (services && services[serviceUrl]) {
11885
- return true;
11886
- }
11887
-
11888
- return false;
11912
+ var foundUrl = Object.keys(services).find(function (serviceId) {
11913
+ return services[serviceId].serviceUrl === serviceUrl;
11914
+ });
11915
+ return foundUrl !== undefined;
11889
11916
  }
11890
11917
 
11891
11918
  return false;
@@ -11893,6 +11920,7 @@
11893
11920
 
11894
11921
 
11895
11922
  React__namespace.useEffect(function () {
11923
+ if (serviceName === undefined) return;
11896
11924
  setServiceNameHelperText('');
11897
11925
 
11898
11926
  if (ServiceNameInRedux()) {
@@ -11908,7 +11936,7 @@
11908
11936
  React__namespace.useEffect(function () {
11909
11937
  setServiceUrlHelperText('');
11910
11938
 
11911
- if (serviceUrl.length > 0 && !validateServiceUrl(serviceUrl)) {
11939
+ if (serviceUrl && serviceUrl.length > 0 && !validateServiceUrl(serviceUrl)) {
11912
11940
  setServiceUrlHasError(true);
11913
11941
  setServiceUrlHelperText('Error: Not a valid URL.');
11914
11942
  } else if (UrlInRedux()) {
@@ -11995,7 +12023,8 @@
11995
12023
  return setAbstract(event.target.value);
11996
12024
  },
11997
12025
  value: _abstract,
11998
- "data-testid": "abstractTextField"
12026
+ "data-testid": "abstractTextField",
12027
+ disabled: true
11999
12028
  })), /*#__PURE__*/React__namespace.createElement(material.DialogActions, {
12000
12029
  sx: style$1.footerContent
12001
12030
  }, /*#__PURE__*/React__namespace.createElement(material.Button, {
@@ -12051,10 +12080,11 @@
12051
12080
  hideBackdrop = _a.hideBackdrop,
12052
12081
  isOpen = _a.isOpen,
12053
12082
  closePopup = _a.closePopup,
12083
+ serviceId = _a.serviceId,
12054
12084
  url = _a.url;
12055
12085
  var dispatch = reactRedux.useDispatch();
12056
12086
  var services = reactRedux.useSelector(function (store) {
12057
- return getServices(store);
12087
+ return getActiveServices(store);
12058
12088
  });
12059
12089
  var serviceSetLayers = React__default["default"].useCallback(function (payload) {
12060
12090
  dispatch(serviceActions.serviceSetLayers(payload));
@@ -12064,9 +12094,10 @@
12064
12094
  hideBackdrop: hideBackdrop,
12065
12095
  isOpen: isOpen,
12066
12096
  closePopup: closePopup,
12067
- url: url,
12097
+ serviceId: serviceId,
12068
12098
  services: services,
12069
- serviceSetLayers: serviceSetLayers
12099
+ serviceSetLayers: serviceSetLayers,
12100
+ url: url
12070
12101
  });
12071
12102
  };
12072
12103
 
@@ -13026,13 +13057,19 @@
13026
13057
 
13027
13058
  var ServiceOptionsDialog = function ServiceOptionsDialog(_a) {
13028
13059
  var services = _a.services,
13029
- mapStoreRemoveService = _a.mapStoreRemoveService,
13030
- _b = _a.layers,
13031
- layers = _b === void 0 ? [] : _b;
13060
+ mapStoreRemoveService = _a.mapStoreRemoveService;
13032
13061
 
13033
- var _c = __read(React__namespace.useState(false), 2),
13034
- addServiceisOpen = _c[0],
13035
- setAddServiceIsOpen = _c[1];
13062
+ var _b = __read(React__namespace.useState(false), 2),
13063
+ addServiceIsOpen = _b[0],
13064
+ setAddServiceIsOpen = _b[1];
13065
+
13066
+ var _c = __read(React__namespace.useState({
13067
+ isOpen: false,
13068
+ serviceId: '',
13069
+ serviceUrl: ''
13070
+ }), 2),
13071
+ editServiceIsOpen = _c[0],
13072
+ setEditServiceIsOpen = _c[1];
13036
13073
 
13037
13074
  var openAddService = function openAddService() {
13038
13075
  setAddServiceIsOpen(true);
@@ -13040,13 +13077,10 @@
13040
13077
 
13041
13078
  var closePopup = function closePopup() {
13042
13079
  setAddServiceIsOpen(false);
13043
- };
13044
-
13045
- var isDisabled = function isDisabled(service) {
13046
- return layers.some(function (layer) {
13047
- return layer.service && layer.service.includes(service);
13048
- }) || preloadedDefaultMapServices.some(function (defaultMapService) {
13049
- return defaultMapService.url && defaultMapService.url.includes(service);
13080
+ setEditServiceIsOpen({
13081
+ isOpen: false,
13082
+ serviceId: '',
13083
+ serviceUrl: ''
13050
13084
  });
13051
13085
  };
13052
13086
 
@@ -13075,16 +13109,25 @@
13075
13109
  marginRight: '-10px'
13076
13110
  }
13077
13111
  }, /*#__PURE__*/React__namespace.createElement(material.Tooltip, {
13078
- title: "Edit Service"
13112
+ title: "Edit Service",
13113
+ disableHoverListener: !services[serviceId].isUserAddedService
13079
13114
  }, /*#__PURE__*/React__namespace.createElement("span", null, /*#__PURE__*/React__namespace.createElement(material.IconButton, {
13080
- disabled: isDisabled(services[serviceId].serviceUrl),
13115
+ disabled: !services[serviceId].isUserAddedService,
13081
13116
  "data-testid": "openEditServiceButton",
13082
- size: "large"
13117
+ size: "large",
13118
+ onClick: function onClick() {
13119
+ setEditServiceIsOpen({
13120
+ isOpen: true,
13121
+ serviceId: serviceId,
13122
+ serviceUrl: services[serviceId].serviceUrl
13123
+ });
13124
+ }
13083
13125
  }, /*#__PURE__*/React__namespace.createElement(theme.Edit, null)))), /*#__PURE__*/React__namespace.createElement(material.Tooltip, {
13084
- title: "Delete Service"
13126
+ title: "Delete Service",
13127
+ disableHoverListener: !services[serviceId].isUserAddedService
13085
13128
  }, /*#__PURE__*/React__namespace.createElement("span", null, /*#__PURE__*/React__namespace.createElement(material.IconButton, {
13086
13129
  size: "large",
13087
- disabled: isDisabled(services[serviceId].serviceUrl),
13130
+ disabled: !services[serviceId].isUserAddedService,
13088
13131
  onClick: function onClick() {
13089
13132
  return mapStoreRemoveService(serviceId, services[serviceId].serviceUrl);
13090
13133
  },
@@ -13098,10 +13141,16 @@
13098
13141
  sx: styles.button,
13099
13142
  variant: "tertiary",
13100
13143
  startIcon: /*#__PURE__*/React__namespace.createElement(theme.Add, null)
13101
- }, "Add a new service"))), addServiceisOpen && /*#__PURE__*/React__namespace.createElement(ServicePopupConnect, {
13144
+ }, "Add a new service"))), addServiceIsOpen && /*#__PURE__*/React__namespace.createElement(ServicePopupConnect, {
13102
13145
  servicePopupVariant: "add",
13103
- isOpen: addServiceisOpen,
13146
+ isOpen: addServiceIsOpen,
13104
13147
  closePopup: closePopup
13148
+ }), editServiceIsOpen && /*#__PURE__*/React__namespace.createElement(ServicePopupConnect, {
13149
+ servicePopupVariant: "edit",
13150
+ isOpen: editServiceIsOpen.isOpen,
13151
+ closePopup: closePopup,
13152
+ serviceId: editServiceIsOpen.serviceId,
13153
+ url: editServiceIsOpen.serviceUrl
13105
13154
  }));
13106
13155
  };
13107
13156
 
@@ -13124,9 +13173,6 @@
13124
13173
 
13125
13174
  var ServiceOptionsDialogConnect = function ServiceOptionsDialogConnect() {
13126
13175
  var dispatch = reactRedux.useDispatch();
13127
- var allLayers = reactRedux.useSelector(function (store) {
13128
- return getAllLayers(store);
13129
- });
13130
13176
  var mapStoreRemoveService = React__namespace.useCallback(function (serviceId, serviceUrl) {
13131
13177
  dispatch(serviceActions.mapStoreRemoveService({
13132
13178
  id: serviceId,
@@ -13138,7 +13184,6 @@
13138
13184
  });
13139
13185
  return /*#__PURE__*/React__namespace.createElement(ServiceOptionsDialog, {
13140
13186
  services: services,
13141
- layers: allLayers,
13142
13187
  mapStoreRemoveService: mapStoreRemoveService
13143
13188
  });
13144
13189
  };
@@ -13754,6 +13799,11 @@
13754
13799
  var serviceSetLayers = React__namespace.useCallback(function (payload) {
13755
13800
  dispatch(serviceActions.serviceSetLayers(payload));
13756
13801
  }, [dispatch]);
13802
+
13803
+ var checkIfUserAddedService = function checkIfUserAddedService(service) {
13804
+ return !!service.isUserAddedService;
13805
+ };
13806
+
13757
13807
  React__namespace.useEffect(function () {
13758
13808
  if (isOpenInStore && preloadedServices && preloadedServices.length > 0) {
13759
13809
  mergePresetsAndUserAddedServices(preloadedServices, getUserAddedServices()).forEach(function (service) {
@@ -13765,7 +13815,7 @@
13765
13815
  name: service.name,
13766
13816
  serviceUrl: service.url,
13767
13817
  layers: layers,
13768
- isUserAddedService: false
13818
+ isUserAddedService: checkIfUserAddedService(service)
13769
13819
  });
13770
13820
  }
13771
13821
  })["catch"](function () {
@@ -14847,7 +14897,6 @@
14847
14897
  var animationDelay = _a.animationDelay,
14848
14898
  setMapAnimationDelay = _a.setMapAnimationDelay;
14849
14899
  var classes = useStyles$c();
14850
- var sliderClasses = shared.sliderStyles();
14851
14900
 
14852
14901
  var _b = __read(React__namespace.useState(false), 2),
14853
14902
  open = _b[0],
@@ -14911,8 +14960,8 @@
14911
14960
  text: text
14912
14961
  })))), open ? /*#__PURE__*/React__namespace.createElement("div", {
14913
14962
  className: classes.sliderBackground
14914
- }, /*#__PURE__*/React__namespace.createElement("div", {
14915
- className: sliderClasses.sliderHeader
14963
+ }, /*#__PURE__*/React__namespace.createElement(material.Box, {
14964
+ sx: shared.sliderHeaderStyle
14916
14965
  }, "Speed"), /*#__PURE__*/React__namespace.createElement(shared.CustomSlider, {
14917
14966
  "data-testid": "speedSlider",
14918
14967
  orientation: "vertical",
@@ -15103,7 +15152,6 @@
15103
15152
  return null;
15104
15153
  } : _d;
15105
15154
  var classes = useStyles$b();
15106
- var sliderClasses = shared.sliderStyles();
15107
15155
 
15108
15156
  var _e = __read(React__namespace.useState(false), 2),
15109
15157
  open = _e[0],
@@ -15171,8 +15219,8 @@
15171
15219
  "data-testid": "timeStepButtonText"
15172
15220
  })))), open ? /*#__PURE__*/React__namespace.createElement("div", {
15173
15221
  className: classes.sliderBackground
15174
- }, /*#__PURE__*/React__namespace.createElement("div", {
15175
- className: sliderClasses.sliderHeader
15222
+ }, /*#__PURE__*/React__namespace.createElement(material.Box, {
15223
+ sx: shared.sliderHeaderStyle
15176
15224
  }, "Time step"), /*#__PURE__*/React__namespace.createElement(shared.CustomSlider, {
15177
15225
  "data-testid": "timeStepButtonSlider",
15178
15226
  orientation: "vertical",
@@ -2,6 +2,7 @@ import * as React from 'react';
2
2
  import { Layer } from '../../../../store/mapStore/types';
3
3
  export declare const constructLayerId: (baseLayer: Layer, selectedBaseLayers: Layer[]) => string;
4
4
  export declare const constructListAvailableBaseLayers: (selectedBaseLayers: Layer[], preloadedAvailableBaseLayers: Layer[], mapId: string) => Layer[];
5
+ export declare const areAvailableBaseLayersSame: (availableBaseLayerList: Layer[], newBaseLayerList: Layer[]) => boolean;
5
6
  interface BaseLayersConnectProps {
6
7
  mapId: string;
7
8
  preloadedAvailableBaseLayers: Layer[];
@@ -1,10 +1,8 @@
1
1
  import * as React from 'react';
2
- import { ReduxLayer } from '../../../../store/mapStore/layers/types';
3
2
  import { ActiveServiceObject } from '../../../../store/layerSelect/types';
4
3
  interface ServiceOptionsDialogProps {
5
4
  services: Record<string, ActiveServiceObject>;
6
5
  mapStoreRemoveService?: (serviceId: string, serviceUrl: string) => void;
7
- layers?: ReduxLayer[];
8
6
  }
9
7
  declare const ServiceOptionsDialog: React.FC<ServiceOptionsDialogProps>;
10
8
  export default ServiceOptionsDialog;
@@ -1,12 +1,14 @@
1
1
  import * as React from 'react';
2
2
  import { SetLayersForServicePayload } from '../../../../store/mapStore/types';
3
+ import { ActiveServices } from '../../../../store/layerSelect/types';
3
4
  interface ServicePopupProps {
4
5
  servicePopupVariant: 'edit' | 'add' | 'save';
5
6
  hideBackdrop?: boolean;
6
7
  isOpen?: boolean;
7
8
  closePopup?: () => void;
9
+ serviceId?: string;
8
10
  url?: string;
9
- services?: any;
11
+ services?: ActiveServices;
10
12
  serviceSetLayers: (payload: SetLayersForServicePayload) => void;
11
13
  }
12
14
  export declare const ADD_HEADING = "Add a new service";
@@ -4,6 +4,7 @@ interface ServicePopupConnectProps {
4
4
  hideBackdrop?: boolean;
5
5
  isOpen?: boolean;
6
6
  closePopup?: () => void;
7
+ serviceId?: string;
7
8
  url?: string;
8
9
  }
9
10
  declare const ServicePopupConnect: React.FC<ServicePopupConnectProps>;
@@ -2,4 +2,5 @@ export interface Service {
2
2
  name: string;
3
3
  url: string;
4
4
  id: string;
5
+ isUserAddedService?: boolean;
5
6
  }
package/lib/index.d.ts CHANGED
@@ -71,6 +71,7 @@ export declare const mapActions: {
71
71
  layerSetDimensions: import("@reduxjs/toolkit").ActionCreatorWithOptionalPayload<mapTypes.SetLayerDimensionsPayload, string>;
72
72
  addAvailableBaseLayer: import("@reduxjs/toolkit").ActionCreatorWithOptionalPayload<mapTypes.AddAvailableBaseLayerPayload, string>;
73
73
  addAvailableBaseLayers: import("@reduxjs/toolkit").ActionCreatorWithOptionalPayload<mapTypes.AddAvailableBaseLayersPayload, string>;
74
+ setAvailableBaseLayers: import("@reduxjs/toolkit").ActionCreatorWithOptionalPayload<mapTypes.AddAvailableBaseLayersPayload, string>;
74
75
  onUpdateLayerInformation: import("@reduxjs/toolkit").ActionCreatorWithOptionalPayload<mapTypes.UpdateLayerInfoPayload, string>;
75
76
  };
76
77
  export { mapSelectors, mapTypes, mapUtils, layerReducer, layerActions, uiActions, uiSelectors, uiTypes, genericActions as syncGroupActions, };
@@ -3,6 +3,7 @@ export interface ActiveServiceObject {
3
3
  serviceUrl?: string;
4
4
  enabled?: boolean;
5
5
  keywordsPerService?: string[];
6
+ isUserAddedService?: boolean;
6
7
  }
7
8
  export interface ActiveServices {
8
9
  [key: string]: ActiveServiceObject;
@@ -51,6 +52,7 @@ export interface AddKeywordsAndActiveServicesPayload {
51
52
  serviceName: string;
52
53
  serviceUrl: string;
53
54
  keywords: string[];
55
+ isUserAddedService: boolean;
54
56
  }
55
57
  export interface LayerSelectServiceRemovedPayload {
56
58
  serviceId: string;
@@ -1,5 +1,5 @@
1
1
  import { PayloadAction } from '@reduxjs/toolkit';
2
- import { LayerState, Layer, AddLayerPayload, SetLayerDimensionPayload, SetLayerEnabledPayload, SetLayerOpacityPayload, SetLayerStylePayload, SetLayerNamePayload, SetLayerGeojsonPayload, DeleteLayerPayload, ErrorLayerPayload, SetLayersPayload, SetBaseLayersPayload, AddBaseLayerPayload, SetLayerDimensionsPayload, AddAvailableBaseLayerPayload, AddAvailableBaseLayersPayload, UpdateLayerInfoPayload } from './types';
2
+ import { LayerState, Layer, AddLayerPayload, SetLayerDimensionPayload, SetLayerEnabledPayload, SetLayerOpacityPayload, SetLayerStylePayload, SetLayerNamePayload, SetLayerGeojsonPayload, DeleteLayerPayload, ErrorLayerPayload, SetLayersPayload, SetBaseLayersPayload, AddBaseLayerPayload, SetLayerDimensionsPayload, AddAvailableBaseLayerPayload, AddAvailableBaseLayersPayload, UpdateLayerInfoPayload, SetAvailableBaseLayersPayload } from './types';
3
3
  export declare const createLayer: ({ id, opacity, enabled, layerType, status, ...props }: Layer) => Layer;
4
4
  export declare const initialState: LayerState;
5
5
  export declare const slice: import("@reduxjs/toolkit").Slice<LayerState, {
@@ -19,6 +19,7 @@ export declare const slice: import("@reduxjs/toolkit").Slice<LayerState, {
19
19
  layerSetDimensions: (draft: import("immer/dist/internal").WritableDraft<LayerState>, action: PayloadAction<SetLayerDimensionsPayload>) => void;
20
20
  addAvailableBaseLayer: (draft: import("immer/dist/internal").WritableDraft<LayerState>, action: PayloadAction<AddAvailableBaseLayerPayload>) => void;
21
21
  addAvailableBaseLayers: (draft: import("immer/dist/internal").WritableDraft<LayerState>, action: PayloadAction<AddAvailableBaseLayersPayload>) => void;
22
+ setAvailableBaseLayers: (draft: import("immer/dist/internal").WritableDraft<LayerState>, action: PayloadAction<SetAvailableBaseLayersPayload>) => void;
22
23
  onUpdateLayerInformation: (draft: import("immer/dist/internal").WritableDraft<LayerState>, action: PayloadAction<UpdateLayerInfoPayload>) => LayerState;
23
24
  }, "layerReducer">;
24
25
  export declare const reducer: import("@reduxjs/toolkit").Reducer<LayerState, import("@reduxjs/toolkit").AnyAction>;
@@ -39,6 +40,7 @@ export declare const layerActions: import("@reduxjs/toolkit").CaseReducerActions
39
40
  layerSetDimensions: (draft: import("immer/dist/internal").WritableDraft<LayerState>, action: PayloadAction<SetLayerDimensionsPayload>) => void;
40
41
  addAvailableBaseLayer: (draft: import("immer/dist/internal").WritableDraft<LayerState>, action: PayloadAction<AddAvailableBaseLayerPayload>) => void;
41
42
  addAvailableBaseLayers: (draft: import("immer/dist/internal").WritableDraft<LayerState>, action: PayloadAction<AddAvailableBaseLayersPayload>) => void;
43
+ setAvailableBaseLayers: (draft: import("immer/dist/internal").WritableDraft<LayerState>, action: PayloadAction<SetAvailableBaseLayersPayload>) => void;
42
44
  onUpdateLayerInformation: (draft: import("immer/dist/internal").WritableDraft<LayerState>, action: PayloadAction<UpdateLayerInfoPayload>) => LayerState;
43
45
  }>;
44
46
  export declare type LayerActions = ReturnType<typeof layerActions.layerSetDimensions> | ReturnType<typeof layerActions.layerChangeStyle> | ReturnType<typeof layerActions.addAvailableBaseLayer> | ReturnType<typeof layerActions.addAvailableBaseLayers> | ReturnType<typeof layerActions.addBaseLayer> | ReturnType<typeof layerActions.addLayer> | ReturnType<typeof layerActions.baseLayerDelete> | ReturnType<typeof layerActions.onUpdateLayerInformation> | ReturnType<typeof layerActions.layerChangeDimension> | ReturnType<typeof layerActions.layerChangeEnabled> | ReturnType<typeof layerActions.layerChangeGeojson> | ReturnType<typeof layerActions.layerChangeName> | ReturnType<typeof layerActions.layerChangeOpacity> | ReturnType<typeof layerActions.layerDelete> | ReturnType<typeof layerActions.layerError> | ReturnType<typeof layerActions.setBaseLayers> | ReturnType<typeof layerActions.setLayers>;
@@ -143,6 +143,7 @@ export interface AddAvailableBaseLayersPayload {
143
143
  layers: ReduxLayer[];
144
144
  origin?: string;
145
145
  }
146
+ export declare type SetAvailableBaseLayersPayload = AddAvailableBaseLayersPayload;
146
147
  export interface ErrorLayerPayload extends LayerPayload {
147
148
  error: Error;
148
149
  }
@@ -136,9 +136,11 @@ export declare const getServicesInArray: ((state: {
136
136
  }) => {
137
137
  name: string;
138
138
  serviceUrl: string;
139
+ isUserAddedService: boolean;
139
140
  }[]) & import("reselect").OutputSelectorFields<((args_0: ServiceState) => {
140
141
  name: string;
141
142
  serviceUrl: string;
143
+ isUserAddedService: boolean;
142
144
  }[]) & {
143
145
  clearCache: () => void;
144
146
  }> & {
@@ -7,6 +7,7 @@ export interface ReduxService {
7
7
  serviceUrl?: string;
8
8
  active?: boolean;
9
9
  layers?: ServiceLayer[];
10
+ isUserAddedService?: boolean;
10
11
  }
11
12
  /**
12
13
  * Used in the services object of webmap to keep a list of available layers in the service
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opengeoweb/core",
3
- "version": "2.15.0",
3
+ "version": "3.0.0",
4
4
  "description": "GeoWeb Core library for the opengeoweb project",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
@@ -13,22 +13,22 @@
13
13
  "dependencies": {},
14
14
  "peerDependencies": {
15
15
  "react": "^17.0.2",
16
- "@opengeoweb/theme": "2.15.0",
16
+ "@opengeoweb/theme": "3.0.0",
17
17
  "@mui/material": "^5.2.8",
18
18
  "@mui/styles": "^5.2.3",
19
19
  "moment": "^2.29.0",
20
20
  "react-redux": "^8.0.2",
21
21
  "react-intl": "^5.17.5",
22
22
  "lodash": "^4.17.20",
23
- "@opengeoweb/shared": "2.15.0",
23
+ "@opengeoweb/shared": "3.0.0",
24
24
  "react-draggable": "^4.4.3",
25
25
  "re-resizable": "^6.9.0",
26
- "@opengeoweb/form-fields": "2.15.0",
26
+ "@opengeoweb/form-fields": "3.0.0",
27
27
  "react-hook-form": "^6.12.1",
28
28
  "moment-timezone": "^0.5.31",
29
29
  "@mui/lab": "^5.0.0-alpha.64",
30
30
  "axios": "^0.25.0",
31
- "@opengeoweb/webmap": "2.15.0",
31
+ "@opengeoweb/webmap": "3.0.0",
32
32
  "throttle-debounce": "^3.0.1",
33
33
  "proj4": "^2.6.2",
34
34
  "react-sortablejs": "^6.0.0",