@opengeoweb/webmap-react 20.2.0-nightly-20261022 → 20.2.0-nightly-20261024

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/dist/index.esm.js CHANGED
@@ -7,7 +7,7 @@ import ImageState from 'ol/ImageState';
7
7
  import LayerProperty from 'ol/layer/Property';
8
8
  import { fromResolutionLike } from 'ol/resolution';
9
9
  import ImageSource, { getRequestExtent } from 'ol/source/Image';
10
- import ImageWrapper, { load } from 'ol/Image';
10
+ import ImageWrapper from 'ol/Image';
11
11
  import { getImageSrc, getRequestParams, createLoader } from 'ol/source/wms';
12
12
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
13
13
  import { CustomTooltip, CanvasComponent, useWheelStopPropagation, calculateStartSize, ToolContainerDraggable, CustomIconButton, dateUtils, isDialogFocused, useMakeSureContainerStaysInsideWindow, Draggable, Resizable } from '@opengeoweb/shared';
@@ -1752,6 +1752,27 @@ var TimeawareImageSource = /*#__PURE__*/function (_ImageSource) {
1752
1752
  this._layerName = layerName;
1753
1753
  this.changed();
1754
1754
  }
1755
+ /**
1756
+ * Sets the layer name, style and dimensions at once, so the source never requests a layer with the style or dimensions of another layer.
1757
+ */
1758
+ }, {
1759
+ key: "setLayerProps",
1760
+ value: function setLayerProps(_ref4) {
1761
+ var layerName = _ref4.layerName,
1762
+ styleName = _ref4.styleName,
1763
+ dimProps = _ref4.dimProps;
1764
+ var dimPropsChanged = !isEqual(this._dimProperties, dimProps);
1765
+ if (this._layerName === layerName && this._styleName === styleName && !dimPropsChanged) {
1766
+ return;
1767
+ }
1768
+ this._layerName = layerName;
1769
+ this._styleName = styleName;
1770
+ // Only replace when changed, prefetching compares dimProperties by reference
1771
+ if (dimPropsChanged) {
1772
+ this._dimProperties = _objectSpread2({}, dimProps);
1773
+ }
1774
+ this.changed();
1775
+ }
1755
1776
  }, {
1756
1777
  key: "setTimeValuesValuesToPrefetch",
1757
1778
  value: function setTimeValuesValuesToPrefetch(timeStampsToPrefetch) {
@@ -7077,8 +7098,10 @@ var useGetWMSLayerStyleList = function useGetWMSLayerStyleList(serviceUrl, name)
7077
7098
  /**
7078
7099
  * Returns a WMLayer instance. If the layerType is LayerType.mapLayer or LayerType.wmtsMapLayer, the layer will detect the right type and will contain the parsed dimensions and styles.
7079
7100
  *
7101
+ * When the name changes, the same WMLayer instance is returned, but it is re-parsed asynchronously. Until that is done, it still holds the styles and dimensions of the previous layer name. Use isParsedForName to know when the WMLayer is up to date.
7102
+ *
7080
7103
  * @param layerFoundation
7081
- * @returns object with wmLayer and if set an errorMessage
7104
+ * @returns object with wmLayer, if set an errorMessage, and isParsedForName which is true when wmLayer has been parsed for the requested name
7082
7105
  */
7083
7106
  var useGetWMLayerInstance = function useGetWMLayerInstance(layerFoundation) {
7084
7107
  var hasLayerFoundation = layerFoundation !== undefined;
@@ -7094,6 +7117,11 @@ var useGetWMLayerInstance = function useGetWMLayerInstance(layerFoundation) {
7094
7117
  _React$useState10 = _slicedToArray(_React$useState1, 2),
7095
7118
  errorMessage = _React$useState10[0],
7096
7119
  setErrorMessage = _React$useState10[1];
7120
+ // The layer name for which the WMLayer was last parsed
7121
+ var _React$useState11 = React.useState(null),
7122
+ _React$useState12 = _slicedToArray(_React$useState11, 2),
7123
+ parsedName = _React$useState12[0],
7124
+ setParsedName = _React$useState12[1];
7097
7125
  var refId = useRef(id || webmapUtils.generateLayerId());
7098
7126
  var layerId = refId.current;
7099
7127
  var _useContext = useContext(TimeContext),
@@ -7131,12 +7159,16 @@ var useGetWMLayerInstance = function useGetWMLayerInstance(layerFoundation) {
7131
7159
  wmLayer.setName(name)["catch"](function (e) {
7132
7160
  setErrorMessage(e);
7133
7161
  })["finally"](function () {
7162
+ var _wmLayer$name;
7134
7163
  setLayer(wmLayer);
7164
+ // Use the name of the wmLayer, as it can have been renamed again while parsing
7165
+ setParsedName((_wmLayer$name = wmLayer.name) !== null && _wmLayer$name !== void 0 ? _wmLayer$name : null);
7135
7166
  });
7136
7167
  }, [hasLayerFoundation, layerId, layerType, name, serviceUrl]);
7137
7168
  return {
7138
7169
  wmLayer: layer,
7139
- errorMessage: errorMessage
7170
+ errorMessage: errorMessage,
7171
+ isParsedForName: !!layer && parsedName === name
7140
7172
  };
7141
7173
  };
7142
7174
  /**
@@ -7375,7 +7407,8 @@ var TimeawareImageSourceWMSLayer = function TimeawareImageSourceWMSLayer(_ref) {
7375
7407
  layerType: LayerType.mapLayer
7376
7408
  }),
7377
7409
  wmLayer = _useGetWMLayerInstanc.wmLayer,
7378
- errorMessage = _useGetWMLayerInstanc.errorMessage;
7410
+ errorMessage = _useGetWMLayerInstanc.errorMessage,
7411
+ isParsedForName = _useGetWMLayerInstanc.isParsedForName;
7379
7412
  if (errorMessage && onLayerError) {
7380
7413
  onLayerError(layerId || '', errorMessage);
7381
7414
  }
@@ -7454,12 +7487,12 @@ var TimeawareImageSourceWMSLayer = function TimeawareImageSourceWMSLayer(_ref) {
7454
7487
  firstRefTime = refTimeDim === null || refTimeDim === void 0 ? void 0 : refTimeDim.getClosestValue(refTimeToFind, true);
7455
7488
  firstRefTime && refTimeDim && (wmTimeDim === null || wmTimeDim === void 0 ? void 0 : wmTimeDim.setTimeValuesForReferenceTime(firstRefTime, refTimeDim));
7456
7489
  }
7457
- // Make sure style is set in wmLayer as well
7458
- styleName && wmLayer.setStyle(styleName);
7459
7490
  // Make sure we have the latest dimension values before initializing
7460
7491
  _context.n = 1;
7461
7492
  return wmLayer.parseLayer();
7462
7493
  case 1:
7494
+ // Make sure style is set in wmLayer as well. Done after parsing, so the style is checked against the styles of this layer name.
7495
+ styleName && wmLayer.setStyle(styleName);
7463
7496
  onInitializeLayer === null || onInitializeLayer === void 0 || onInitializeLayer({
7464
7497
  layerId: wmLayer.id,
7465
7498
  style: wmLayer.currentStyle,
@@ -7509,33 +7542,30 @@ var TimeawareImageSourceWMSLayer = function TimeawareImageSourceWMSLayer(_ref) {
7509
7542
  useEffect(function () {
7510
7543
  layer === null || layer === void 0 || layer.setVisible(visible);
7511
7544
  }, [layer, visible]);
7512
- // Layer styleName properties useEffect
7513
- useEffect(function () {
7514
- if (wmLayer) {
7515
- var _styles$, _layer$getSource;
7516
- var styles = wmLayer.getStyles();
7517
- var style = styleName && styleName !== 'default' && styles.some(function (style) {
7518
- return style.name === styleName;
7519
- }) ? styleName : '';
7520
- wmLayer.setStyle(style || ((_styles$ = styles[0]) === null || _styles$ === void 0 ? void 0 : _styles$.name) || '');
7521
- layer === null || layer === void 0 || (_layer$getSource = layer.getSource()) === null || _layer$getSource === void 0 || _layer$getSource.setStyle(style);
7522
- }
7523
- }, [layer, styleName, wmLayer]);
7524
- // layerName useEffect
7525
- useEffect(function () {
7526
- var _layer$getSource2;
7527
- layer === null || layer === void 0 || (_layer$getSource2 = layer.getSource()) === null || _layer$getSource2 === void 0 || _layer$getSource2.setLayerName(layerName);
7528
- }, [layer, layerName]);
7529
- // Layer dim values useEffect,
7545
+ // Layer name, style and dim values useEffect.
7546
+ // After a layer name change, this waits until the wmLayer is parsed for the new name. Until then the wmLayer still has the styles and dimensions of the previous layer.
7547
+ // Name, style and dimensions are set in the source at once, so it never requests the new layer with the style or dimensions of the previous one.
7530
7548
  useEffect(function () {
7531
- var _layer$getSource3;
7532
- dimensionsValues && (layer === null || layer === void 0 || (_layer$getSource3 = layer.getSource()) === null || _layer$getSource3 === void 0 ? void 0 : _layer$getSource3.setDimProps(dimensionsValues));
7549
+ var _styles$, _layer$getSource;
7550
+ if (!wmLayer || !isParsedForName) {
7551
+ return;
7552
+ }
7553
+ var styles = wmLayer.getStyles();
7554
+ var style = styleName && styleName !== 'default' && styles.some(function (style) {
7555
+ return style.name === styleName;
7556
+ }) ? styleName : '';
7557
+ wmLayer.setStyle(style || ((_styles$ = styles[0]) === null || _styles$ === void 0 ? void 0 : _styles$.name) || '');
7558
+ dimensionsValues && (layer === null || layer === void 0 || (_layer$getSource = layer.getSource()) === null || _layer$getSource === void 0 ? void 0 : _layer$getSource.setLayerProps({
7559
+ layerName: layerName,
7560
+ styleName: style,
7561
+ dimProps: dimensionsValues
7562
+ }));
7533
7563
  // eslint-disable-next-line react-hooks/exhaustive-deps
7534
- }, [layer, dimensionsValuesEffectCheck]);
7564
+ }, [layer, wmLayer, isParsedForName, layerName, styleName, dimensionsValuesEffectCheck]);
7535
7565
  // Prefetch useEffect
7536
7566
  useEffect(function () {
7537
7567
  var _wmLayer$dimensions3;
7538
- if (!wmLayer) {
7568
+ if (!wmLayer || !isParsedForName) {
7539
7569
  return;
7540
7570
  }
7541
7571
  var wmTimeDim = wmLayer === null || wmLayer === void 0 || (_wmLayer$dimensions3 = wmLayer.dimensions) === null || _wmLayer$dimensions3 === void 0 ? void 0 : _wmLayer$dimensions3.find(function (dimension) {
@@ -7545,9 +7575,9 @@ var TimeawareImageSourceWMSLayer = function TimeawareImageSourceWMSLayer(_ref) {
7545
7575
  return;
7546
7576
  }
7547
7577
  try {
7548
- var _layer$getSource4;
7578
+ var _layer$getSource2;
7549
7579
  var dimensionValuesToPrefetch = makeDimValuesToPrefetch(wmTimeDim, prefetchList, isAnimating);
7550
- layer === null || layer === void 0 || (_layer$getSource4 = layer.getSource()) === null || _layer$getSource4 === void 0 || _layer$getSource4.setTimeValuesValuesToPrefetch(dimensionValuesToPrefetch);
7580
+ layer === null || layer === void 0 || (_layer$getSource2 = layer.getSource()) === null || _layer$getSource2 === void 0 || _layer$getSource2.setTimeValuesValuesToPrefetch(dimensionValuesToPrefetch);
7551
7581
  } catch (e) {
7552
7582
  window.console.warn(e);
7553
7583
  }
@@ -7557,8 +7587,9 @@ var TimeawareImageSourceWMSLayer = function TimeawareImageSourceWMSLayer(_ref) {
7557
7587
  // - prefetchList
7558
7588
  // - styleName,
7559
7589
  // - dimensionsValuesEffectCheck,
7590
+ // - isParsedForName
7560
7591
  // eslint-disable-next-line react-hooks/exhaustive-deps
7561
- }, [layer, wmLayer, prefetchListEffectCheck, layerName, styleName, dimensionsValuesEffectCheck]);
7592
+ }, [layer, wmLayer, prefetchListEffectCheck, layerName, styleName, dimensionsValuesEffectCheck, isParsedForName]);
7562
7593
  // Only show debug info for data layers with time dimension
7563
7594
  var hasTimeDim = (_wmLayer$dimensions$f = wmLayer === null || wmLayer === void 0 || (_wmLayer$dimensions4 = wmLayer.dimensions) === null || _wmLayer$dimensions4 === void 0 ? void 0 : _wmLayer$dimensions4.findIndex(function (dimension) {
7564
7595
  return dimension.name === 'time';
@@ -7616,14 +7647,13 @@ var WMSLayer = function WMSLayer(_ref) {
7616
7647
  source: new ImageSource({
7617
7648
  loader: createLoader({
7618
7649
  url: url,
7619
- load: load,
7620
- projection: projection,
7621
7650
  params: {
7622
7651
  LAYERS: layerName,
7623
7652
  STYLES: styleName
7624
- }
7625
- }),
7626
- projection: projection
7653
+ },
7654
+ projection: projection,
7655
+ crossOrigin: 'anonymous'
7656
+ })
7627
7657
  })
7628
7658
  });
7629
7659
  map.addLayer(layer);
@@ -7723,9 +7753,11 @@ var WMTSLayer = function WMTSLayer(_ref) {
7723
7753
  if (!map || !wmtsLayer) {
7724
7754
  return function () {};
7725
7755
  }
7726
- var source = new WMTS(_objectSpread2(_objectSpread2({}, wmtsLayer), layerProps !== null && layerProps !== void 0 && layerProps.dimensions ? {
7756
+ var source = new WMTS(_objectSpread2(_objectSpread2(_objectSpread2({}, wmtsLayer), layerProps !== null && layerProps !== void 0 && layerProps.dimensions ? {
7727
7757
  dimensions: WMTSDimensionsFromDimensions(layerProps.dimensions)
7728
- } : {}));
7758
+ } : {}), {}, {
7759
+ crossOrigin: 'anonymous'
7760
+ }));
7729
7761
  var layer = new TileLayer({
7730
7762
  source: source
7731
7763
  });
@@ -7787,7 +7819,8 @@ var XYZLayer = function XYZLayer(_ref) {
7787
7819
  url: urlTemplate,
7788
7820
  projection: tileProjectionCode,
7789
7821
  minZoom: layerOptions === null || layerOptions === void 0 ? void 0 : layerOptions.minZoom,
7790
- maxZoom: layerOptions === null || layerOptions === void 0 ? void 0 : layerOptions.maxZoom
7822
+ maxZoom: layerOptions === null || layerOptions === void 0 ? void 0 : layerOptions.maxZoom,
7823
+ crossOrigin: 'anonymous'
7791
7824
  })
7792
7825
  });
7793
7826
  map.addLayer(layer);
@@ -8063,6 +8096,7 @@ var TiledWMSLayer = function TiledWMSLayer(_ref) {
8063
8096
  source: new TileWMS({
8064
8097
  url: url,
8065
8098
  projection: projection,
8099
+ crossOrigin: 'anonymous',
8066
8100
  params: {
8067
8101
  LAYERS: layerName,
8068
8102
  STYLES: styleName
@@ -10836,9 +10870,11 @@ var TimeAwareWMTSLayer = function TimeAwareWMTSLayer(_ref) {
10836
10870
  if (!map || !wmtsOptions) {
10837
10871
  return function () {};
10838
10872
  }
10839
- var source = new WMTS(_objectSpread2(_objectSpread2({}, wmtsOptions), dimensions ? {
10873
+ var source = new WMTS(_objectSpread2(_objectSpread2(_objectSpread2({}, wmtsOptions), dimensions ? {
10840
10874
  dimensions: WMTSDimensionsFromDimensions(dimensions)
10841
- } : {}));
10875
+ } : {}), {}, {
10876
+ crossOrigin: 'anonymous'
10877
+ }));
10842
10878
  var layer = new TileLayer({
10843
10879
  source: source
10844
10880
  });
@@ -11589,8 +11625,16 @@ var OpenLayersLayer = function OpenLayersLayer(layerProps) {
11589
11625
  });
11590
11626
  }
11591
11627
  } else if (type === 'wmts' && _name && _service) {
11628
+ var capabilitiesUrl = new URL(_service, window.location.href);
11629
+ _toConsumableArray(capabilitiesUrl.searchParams.keys()).forEach(function (key) {
11630
+ if (['service', 'request'].includes(key.toLowerCase())) {
11631
+ capabilitiesUrl.searchParams["delete"](key);
11632
+ }
11633
+ });
11634
+ capabilitiesUrl.searchParams.set('SERVICE', 'WMTS');
11635
+ capabilitiesUrl.searchParams.set('REQUEST', 'GetCapabilities');
11592
11636
  return jsx(WMTSLayer, {
11593
- getCapsURL: "".concat(_service, "?SERVICE=WMTS&REQUEST=GetCapabilities"),
11637
+ getCapsURL: capabilitiesUrl.toString(),
11594
11638
  layerName: _name,
11595
11639
  layerOptions: layerOptions,
11596
11640
  layerProps: layerProps
@@ -69,6 +69,14 @@ export declare class TimeawareImageSource extends ImageSource {
69
69
  setImageForTimeValue(timeStampsToPrefetch: string): void;
70
70
  setStyle(styleName: string): void;
71
71
  setLayerName(layerName: string): void;
72
+ /**
73
+ * Sets the layer name, style and dimensions at once, so the source never requests a layer with the style or dimensions of another layer.
74
+ */
75
+ setLayerProps({ layerName, styleName, dimProps, }: {
76
+ layerName: string;
77
+ styleName: string;
78
+ dimProps: Record<string, string>;
79
+ }): void;
72
80
  setTimeValuesValuesToPrefetch(timeStampsToPrefetch: string[]): void;
73
81
  }
74
82
  export {};
@@ -48,12 +48,15 @@ export declare const useGetWMSLayerStyleList: (serviceUrl: string, name: string)
48
48
  /**
49
49
  * Returns a WMLayer instance. If the layerType is LayerType.mapLayer or LayerType.wmtsMapLayer, the layer will detect the right type and will contain the parsed dimensions and styles.
50
50
  *
51
+ * When the name changes, the same WMLayer instance is returned, but it is re-parsed asynchronously. Until that is done, it still holds the styles and dimensions of the previous layer name. Use isParsedForName to know when the WMLayer is up to date.
52
+ *
51
53
  * @param layerFoundation
52
- * @returns object with wmLayer and if set an errorMessage
54
+ * @returns object with wmLayer, if set an errorMessage, and isParsedForName which is true when wmLayer has been parsed for the requested name
53
55
  */
54
56
  export declare const useGetWMLayerInstance: (layerFoundation?: LayerFoundation) => {
55
57
  wmLayer: WMLayer | null;
56
58
  errorMessage: string | null;
59
+ isParsedForName: boolean;
57
60
  };
58
61
  /**
59
62
  * Used for querying WMTS GetCapabilities documents
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opengeoweb/webmap-react",
3
- "version": "20.2.0-nightly-20261022",
3
+ "version": "20.2.0-nightly-20261024",
4
4
  "description": "GeoWeb react wrapper for webmap",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
@@ -20,9 +20,9 @@
20
20
  }
21
21
  },
22
22
  "dependencies": {
23
- "@opengeoweb/webmap": "20.2.0-nightly-20261022",
24
- "@opengeoweb/theme": "20.2.0-nightly-20261022",
25
- "@opengeoweb/shared": "20.2.0-nightly-20261022",
23
+ "@opengeoweb/webmap": "20.2.0-nightly-20261024",
24
+ "@opengeoweb/theme": "20.2.0-nightly-20261024",
25
+ "@opengeoweb/shared": "20.2.0-nightly-20261024",
26
26
  "lodash": "^4.18.1",
27
27
  "ol": "^10.4.0",
28
28
  "proj4": "^2.9.2",