qwc2 2025.12.19 → 2025.12.24

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 (68) hide show
  1. package/actions/display.js +6 -6
  2. package/actions/theme.js +4 -19
  3. package/components/AppMenu.js +1 -1
  4. package/components/AttributeForm.js +7 -7
  5. package/components/AttributeTableWidget.js +2 -2
  6. package/components/AutoEditForm.js +6 -3
  7. package/components/EditComboField.js +1 -4
  8. package/components/IdentifyViewer.js +33 -34
  9. package/components/ImportLayer.js +78 -79
  10. package/components/PluginsContainer.js +2 -2
  11. package/components/ResizeableWindow.js +8 -1
  12. package/components/SearchBox.js +2 -2
  13. package/components/SideBar.js +1 -0
  14. package/components/StandardApp.js +1 -2
  15. package/components/ThemeLayersListWindow.js +10 -1
  16. package/components/{map3d/View3DSwitcher.js → ViewSwitcher.js} +74 -29
  17. package/components/map/OlMap.js +1 -1
  18. package/components/map3d/Map3D.js +50 -48
  19. package/components/map3d/MapControls3D.js +4 -1
  20. package/components/map3d/drawtool/EditTool3D.js +1 -1
  21. package/components/map3d/layers/WFSLayer3D.js +1 -1
  22. package/components/share/ShareQRCode.js +1 -1
  23. package/components/style/ViewSwitcher.css +36 -0
  24. package/components/widgets/ColorButton.js +2 -2
  25. package/components/widgets/CopyButton.js +1 -1
  26. package/components/widgets/LayerCatalogWidget.js +4 -4
  27. package/libs/openlayers.js +11 -11
  28. package/package.json +54 -55
  29. package/plugins/API.js +4 -4
  30. package/plugins/FeatureForm.js +2 -2
  31. package/plugins/FeatureSearch.js +12 -12
  32. package/plugins/GeometryDigitizer.js +2 -3
  33. package/plugins/Map.js +11 -4
  34. package/plugins/MapFilter.js +12 -12
  35. package/plugins/MapTip.js +1 -1
  36. package/plugins/ObliqueView.js +31 -12
  37. package/plugins/Print.js +79 -91
  38. package/plugins/Routing.js +1 -1
  39. package/plugins/Share.js +5 -5
  40. package/plugins/TimeManager.js +1 -2
  41. package/plugins/View3D.js +135 -123
  42. package/plugins/map/RedliningSupport.js +1 -1
  43. package/plugins/map3d/Draw3D.js +4 -4
  44. package/plugins/map3d/ExportObjects3D.js +1 -1
  45. package/plugins/map3d/HideObjects3D.js +7 -7
  46. package/plugins/map3d/Identify3D.js +1 -1
  47. package/plugins/map3d/LayerTree3D.js +1 -1
  48. package/plugins/map3d/MapExport3D.js +25 -25
  49. package/plugins/map3d/Measure3D.js +1 -1
  50. package/plugins/map3d/TopBar3D.js +7 -7
  51. package/plugins/style/ObliqueView.css +21 -9
  52. package/reducers/display.js +2 -2
  53. package/reducers/layers.js +11 -11
  54. package/scripts/gen-plugin-docs.js +11 -4
  55. package/scripts/makeIconkit.js +2 -2
  56. package/scripts/themesConfig.js +5 -5
  57. package/scripts/updateTranslations.js +2 -2
  58. package/utils/CoordinatesUtils.js +1 -1
  59. package/utils/EditingUtils.js +4 -4
  60. package/utils/FeatureStyles.js +1 -1
  61. package/utils/LayerUtils.js +73 -74
  62. package/utils/MiscUtils.js +10 -3
  63. package/utils/PermaLinkUtils.js +68 -71
  64. package/utils/SearchProviders.js +2 -2
  65. package/utils/ServiceLayerUtils.js +12 -12
  66. package/utils/ThemeUtils.js +1 -1
  67. package/utils/VectorLayerUtils.js +3 -3
  68. package/components/map3d/style/View3DSwitcher.css +0 -19
@@ -36,11 +36,11 @@ function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e
36
36
  import React, { Suspense } from 'react';
37
37
  import ReactDOM from 'react-dom';
38
38
  import { connect } from 'react-redux';
39
- import Instance from '@giro3d/giro3d/core/Instance.js';
39
+ import CoordinateSystem from '@giro3d/giro3d/core/geographic/coordinate-system/CoordinateSystem';
40
40
  import Coordinates, { crsIsGeographic } from '@giro3d/giro3d/core/geographic/Coordinates';
41
41
  import Ellipsoid from '@giro3d/giro3d/core/geographic/Ellipsoid';
42
42
  import Extent from '@giro3d/giro3d/core/geographic/Extent.js';
43
- import CoordinateSystem from '@giro3d/giro3d/core/geographic/coordinate-system/CoordinateSystem';
43
+ import Instance from '@giro3d/giro3d/core/Instance.js';
44
44
  import ElevationLayer from '@giro3d/giro3d/core/layer/ElevationLayer.js';
45
45
  import DrapedFeatureCollection from '@giro3d/giro3d/entities/DrapedFeatureCollection';
46
46
  import Map from '@giro3d/giro3d/entities/Map.js';
@@ -65,15 +65,15 @@ import { registerPermalinkDataStoreHook, unregisterPermalinkDataStoreHook, UrlPa
65
65
  import ServiceLayerUtils from '../../utils/ServiceLayerUtils';
66
66
  import ThemeUtils from '../../utils/ThemeUtils';
67
67
  import { MapContainerPortalContext } from '../PluginsContainer';
68
+ import ViewSwitcher from '../ViewSwitcher';
68
69
  import EditDataset3D from './EditDataset3D';
69
- import MapControls3D from './MapControls3D';
70
- import View3DSwitcher from './View3DSwitcher';
71
70
  import LayerRegistry from './layers/index';
71
+ import MapControls3D from './MapControls3D';
72
72
  import { importGltf, updateObjectLabel } from './utils/MiscUtils3D';
73
73
  import Tiles3DStyle from './utils/Tiles3DStyle';
74
74
  import './style/Map3D.css';
75
75
 
76
- // Ensures unUnload is called *after* all other children have unmounted
76
+ // Ensures onUnload is called *after* all other children have unmounted
77
77
  var UnloadWrapper = /*#__PURE__*/function (_React$Component) {
78
78
  function UnloadWrapper() {
79
79
  var _this;
@@ -587,7 +587,7 @@ var Map3D = /*#__PURE__*/function (_React$Component2) {
587
587
  }
588
588
  });
589
589
  _defineProperty(_this2, "setupInstance", function () {
590
- var _this2$props$theme$ma, _this2$props$theme$ma2, _this2$props$theme$ma3, _this2$props$theme$ma4, _this2$props$theme$ma5, _this2$props$theme$ma8, _this2$props$theme$ma9, _this2$props$theme$ma10;
590
+ var _this2$props$theme$ma, _this2$props$theme$ma2, _this2$props$theme$ma3, _this2$props$theme$ma4, _this2$props$theme$ma5, _this2$props$theme$ma8, _this2$props$theme$ma9, _this2$props$theme$ma0;
591
591
  if (_this2.instance) {
592
592
  _this2.disposeInstance();
593
593
  }
@@ -699,19 +699,19 @@ var Map3D = /*#__PURE__*/function (_React$Component2) {
699
699
  _this2.instance.notifyChange(tiles);
700
700
  });
701
701
  // Apply style when loading tile
702
- tiles.tiles.addEventListener('load-model', function (_ref10) {
702
+ tiles.tiles.addEventListener('load-model', function (_ref0) {
703
703
  var _entry$idAttr;
704
- var scene = _ref10.scene;
704
+ var scene = _ref0.scene;
705
705
  scene.userData.tilesetName = entry.name;
706
706
  scene.userData.featureIdAttr = (_entry$idAttr = entry.idAttr) !== null && _entry$idAttr !== void 0 ? _entry$idAttr : "id";
707
707
  Tiles3DStyle.applyTileStyle(scene, _this2.state.sceneContext.sceneObjects[entry.name], _this2.state.sceneContext);
708
708
  _this2.instance.notifyChange(tiles);
709
709
  });
710
710
  // Show/hide labels when tile visibility changes
711
- tiles.tiles.addEventListener('tile-visibility-change', function (_ref11) {
711
+ tiles.tiles.addEventListener('tile-visibility-change', function (_ref1) {
712
712
  var _scene$userData$tileL2, _scene$userData2;
713
- var scene = _ref11.scene,
714
- visible = _ref11.visible;
713
+ var scene = _ref1.scene,
714
+ visible = _ref1.visible;
715
715
  Object.values((_scene$userData$tileL2 = scene === null || scene === void 0 || (_scene$userData2 = scene.userData) === null || _scene$userData2 === void 0 ? void 0 : _scene$userData2.tileLabels) !== null && _scene$userData$tileL2 !== void 0 ? _scene$userData$tileL2 : {}).forEach(function (label) {
716
716
  label.labelObject.visible = visible;
717
717
  label.labelObject.element.style.display = visible ? 'initial' : 'none';
@@ -739,7 +739,7 @@ var Map3D = /*#__PURE__*/function (_React$Component2) {
739
739
  });
740
740
 
741
741
  // Add other objects
742
- (((_this2$props$theme$ma10 = _this2.props.theme.map3d) === null || _this2$props$theme$ma10 === void 0 ? void 0 : _this2$props$theme$ma10.objects3d) || []).forEach(function (entry) {
742
+ (((_this2$props$theme$ma0 = _this2.props.theme.map3d) === null || _this2$props$theme$ma0 === void 0 ? void 0 : _this2$props$theme$ma0.objects3d) || []).forEach(function (entry) {
743
743
  var _entry$title2, _entry$visibility2;
744
744
  importGltf(MiscUtils.resolveAssetsPath(entry.url), (_entry$title2 = entry.title) !== null && _entry$title2 !== void 0 ? _entry$title2 : entry.name, _this2.state.sceneContext, {
745
745
  visibility: (_entry$visibility2 = entry.visibility) !== null && _entry$visibility2 !== void 0 ? _entry$visibility2 : true
@@ -779,10 +779,10 @@ var Map3D = /*#__PURE__*/function (_React$Component2) {
779
779
  var isFirstPerson = _this2.state.sceneContext.scene.view.controls.isFirstPerson;
780
780
  var maxDistance = isFirstPerson ? 200 + 20 * quality : 500 + quality * quality;
781
781
  // Hide scene objects according to scene quality
782
- Object.entries(_this2.state.sceneContext.sceneObjects).forEach(function (_ref12) {
783
- var _ref13 = _slicedToArray(_ref12, 2),
784
- objId = _ref13[0],
785
- options = _ref13[1];
782
+ Object.entries(_this2.state.sceneContext.sceneObjects).forEach(function (_ref10) {
783
+ var _ref11 = _slicedToArray(_ref10, 2),
784
+ objId = _ref11[0],
785
+ options = _ref11[1];
786
786
  var object = _this2.objectMap[objId];
787
787
  if (options.layertree && object.isObject3D && object.visible) {
788
788
  object.children.forEach(function (child) {
@@ -803,10 +803,10 @@ var Map3D = /*#__PURE__*/function (_React$Component2) {
803
803
  });
804
804
  });
805
805
  _defineProperty(_this2, "instanceOnUpdateEnd", function () {
806
- Object.entries(_this2.state.sceneContext.sceneObjects).forEach(function (_ref14) {
807
- var _ref15 = _slicedToArray(_ref14, 2),
808
- objId = _ref15[0],
809
- options = _ref15[1];
806
+ Object.entries(_this2.state.sceneContext.sceneObjects).forEach(function (_ref12) {
807
+ var _ref13 = _slicedToArray(_ref12, 2),
808
+ objId = _ref13[0],
809
+ options = _ref13[1];
810
810
  var object = _this2.objectMap[objId];
811
811
  if (options.layertree && object.isObject3D) {
812
812
  object.children.forEach(function (child) {
@@ -816,8 +816,8 @@ var Map3D = /*#__PURE__*/function (_React$Component2) {
816
816
  }
817
817
  });
818
818
  });
819
- _defineProperty(_this2, "instanceOnBeforeEntityUpdate", function (_ref16) {
820
- var entity = _ref16.entity;
819
+ _defineProperty(_this2, "instanceOnBeforeEntityUpdate", function (_ref14) {
820
+ var entity = _ref14.entity;
821
821
  if (entity !== _this2.map) {
822
822
  _this2.instance.view.camera.userData.__previousFar = _this2.instance.view.camera.far;
823
823
  var quality = _this2.state.sceneContext.settings.sceneQuality;
@@ -826,8 +826,8 @@ var Map3D = /*#__PURE__*/function (_React$Component2) {
826
826
  _this2.instance.view.camera.updateProjectionMatrix();
827
827
  }
828
828
  });
829
- _defineProperty(_this2, "instanceOnAfterEntityUpdate", function (_ref17) {
830
- var entity = _ref17.entity;
829
+ _defineProperty(_this2, "instanceOnAfterEntityUpdate", function (_ref15) {
830
+ var entity = _ref15.entity;
831
831
  if (entity !== _this2.map) {
832
832
  _this2.instance.view.camera.far = _this2.instance.view.camera.userData.__previousFar;
833
833
  delete _this2.instance.view.camera.userData.__previousFar;
@@ -934,12 +934,12 @@ var Map3D = /*#__PURE__*/function (_React$Component2) {
934
934
  ModelPixelScale = _image$fileDirectory.ModelPixelScale;
935
935
 
936
936
  // Extract scale and tiepoint values
937
- var _ref18 = [ModelPixelScale[0], ModelPixelScale[1]],
938
- scaleX = _ref18[0],
939
- scaleY = _ref18[1];
940
- var _ref19 = [ModelTiepoint[3], ModelTiepoint[4]],
941
- tiepointX = _ref19[0],
942
- tiepointY = _ref19[1]; // Tiepoint world coordinates
937
+ var _ref16 = [ModelPixelScale[0], ModelPixelScale[1]],
938
+ scaleX = _ref16[0],
939
+ scaleY = _ref16[1];
940
+ var _ref17 = [ModelTiepoint[3], ModelTiepoint[4]],
941
+ tiepointX = _ref17[0],
942
+ tiepointY = _ref17[1]; // Tiepoint world coordinates
943
943
 
944
944
  // Calculate pixel indices (rounded to nearest integers)
945
945
  var minPixelX = Math.round((dtmExt[0] - tiepointX) / scaleX);
@@ -1021,10 +1021,10 @@ var Map3D = /*#__PURE__*/function (_React$Component2) {
1021
1021
  _this2.state.sceneContext.setViewToExtent(bounds, rotation);
1022
1022
  });
1023
1023
  _defineProperty(_this2, "store3dState", function () {
1024
- var promises = Object.entries(_this2.state.sceneContext.sceneObjects).map(function (_ref20) {
1025
- var _ref21 = _slicedToArray(_ref20, 2),
1026
- objectId = _ref21[0],
1027
- entry = _ref21[1];
1024
+ var promises = Object.entries(_this2.state.sceneContext.sceneObjects).map(function (_ref18) {
1025
+ var _ref19 = _slicedToArray(_ref18, 2),
1026
+ objectId = _ref19[0],
1027
+ entry = _ref19[1];
1028
1028
  if (!entry.layertree) {
1029
1029
  return null;
1030
1030
  }
@@ -1064,10 +1064,10 @@ var Map3D = /*#__PURE__*/function (_React$Component2) {
1064
1064
  var _this2$state$sceneCon2, _this2$state$sceneCon3;
1065
1065
  var camera = _this2.state.sceneContext.scene.view.camera.position;
1066
1066
  var target = _this2.state.sceneContext.scene.view.controls.target;
1067
- var layers = Object.entries(_this2.state.sceneContext.colorLayers).map(function (_ref22) {
1068
- var _ref23 = _slicedToArray(_ref22, 2),
1069
- layerId = _ref23[0],
1070
- options = _ref23[1];
1067
+ var layers = Object.entries(_this2.state.sceneContext.colorLayers).map(function (_ref20) {
1068
+ var _ref21 = _slicedToArray(_ref20, 2),
1069
+ layerId = _ref21[0],
1070
+ options = _ref21[1];
1071
1071
  return {
1072
1072
  id: layerId,
1073
1073
  options: {
@@ -1181,7 +1181,9 @@ var Map3D = /*#__PURE__*/function (_React$Component2) {
1181
1181
  value: function componentDidUpdate(prevProps, prevState) {
1182
1182
  var _this3 = this;
1183
1183
  if (this.props.theme !== prevProps.theme) {
1184
- this.setupInstance();
1184
+ if (this.props.theme.map3d) {
1185
+ this.setupInstance();
1186
+ }
1185
1187
  } else if (this.props.layers !== prevProps.layers) {
1186
1188
  this.setState(function (state) {
1187
1189
  return {
@@ -1207,10 +1209,10 @@ var Map3D = /*#__PURE__*/function (_React$Component2) {
1207
1209
  this.setState(function (state) {
1208
1210
  return {
1209
1211
  sceneContext: _objectSpread(_objectSpread({}, state.sceneContext), {}, {
1210
- collisionObjects: Object.entries(state.sceneContext.sceneObjects).map(function (_ref24) {
1211
- var _ref25 = _slicedToArray(_ref24, 2),
1212
- objId = _ref25[0],
1213
- options = _ref25[1];
1212
+ collisionObjects: Object.entries(state.sceneContext.sceneObjects).map(function (_ref22) {
1213
+ var _ref23 = _slicedToArray(_ref22, 2),
1214
+ objId = _ref23[0],
1215
+ options = _ref23[1];
1214
1216
  if (options.layertree && options.visibility) {
1215
1217
  var _obj$tiles$group, _obj$tiles;
1216
1218
  var obj = _this3.objectMap[objId];
@@ -1249,12 +1251,12 @@ var Map3D = /*#__PURE__*/function (_React$Component2) {
1249
1251
  sceneContext: this.state.sceneContext
1250
1252
  }, /*#__PURE__*/React.createElement(EditDataset3D, {
1251
1253
  sceneContext: this.state.sceneContext
1252
- }), /*#__PURE__*/React.createElement(View3DSwitcher, {
1254
+ }), /*#__PURE__*/React.createElement(ViewSwitcher, {
1253
1255
  position: 1
1254
- }), Object.entries(this.props.plugins3d).map(function (_ref26) {
1255
- var _ref27 = _slicedToArray(_ref26, 2),
1256
- name = _ref27[0],
1257
- Component = _ref27[1];
1256
+ }), Object.entries(this.props.plugins3d).map(function (_ref24) {
1257
+ var _ref25 = _slicedToArray(_ref24, 2),
1258
+ name = _ref25[0],
1259
+ Component = _ref25[1];
1258
1260
  return /*#__PURE__*/React.createElement(Suspense, {
1259
1261
  key: name
1260
1262
  }, /*#__PURE__*/React.createElement(Component, _extends({
@@ -374,7 +374,10 @@ var MapControls3D = /*#__PURE__*/function (_React$Component) {
374
374
  style: {
375
375
  order: 996
376
376
  }
377
- }), this.context) : null];
377
+ }), this.context) : null, /*#__PURE__*/React.createElement("span", {
378
+ key: "Unloader",
379
+ ref: this.unload
380
+ })];
378
381
  }
379
382
  }]);
380
383
  }(React.Component);
@@ -33,8 +33,8 @@ function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e
33
33
  import React from 'react';
34
34
  import PropTypes from 'prop-types';
35
35
  import { Color, Group, Vector3 } from 'three';
36
- import { TransformControls } from 'three/addons/controls/TransformControls';
37
36
  import { CSG } from 'three-csg-ts';
37
+ import { TransformControls } from 'three/addons/controls/TransformControls';
38
38
  import LocaleUtils from '../../../utils/LocaleUtils';
39
39
  import Icon from '../../Icon';
40
40
  import ButtonBar from '../../widgets/ButtonBar';
@@ -22,8 +22,8 @@ function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
22
22
  * LICENSE file in the root directory of this source tree.
23
23
  */
24
24
 
25
- import Extent from '@giro3d/giro3d/core/geographic/Extent';
26
25
  import CoordinateSystem from '@giro3d/giro3d/core/geographic/coordinate-system/CoordinateSystem';
26
+ import Extent from '@giro3d/giro3d/core/geographic/Extent';
27
27
  import ColorLayer from '@giro3d/giro3d/core/layer/ColorLayer';
28
28
  import StreamableFeatureSource, { wfsBuilder, tiledLoadingStrategy } from '@giro3d/giro3d/sources/StreamableFeatureSource';
29
29
  import VectorSource from "@giro3d/giro3d/sources/VectorSource.js";
@@ -21,9 +21,9 @@ function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e
21
21
  * LICENSE file in the root directory of this source tree.
22
22
  */
23
23
 
24
+ import { QRCodeCanvas } from 'qrcode.react';
24
25
  import React from 'react';
25
26
  import PropTypes from 'prop-types';
26
- import { QRCodeCanvas } from 'qrcode.react';
27
27
  import LocaleUtils from '../../utils/LocaleUtils';
28
28
  import CopyButton from '../widgets/CopyButton';
29
29
  var ShareQRCode = /*#__PURE__*/function (_React$Component) {
@@ -0,0 +1,36 @@
1
+ button.view-switcher-button {
2
+ position: relative;
3
+ z-index: 2;
4
+ }
5
+
6
+ div.view-switcher-buttons > button {
7
+ transition: right 0.25s, box-shadow 0.25s;
8
+ position: absolute;
9
+ right: 0;
10
+ bottom: 0;
11
+ z-index: 1;
12
+ }
13
+
14
+ div.view-switcher-buttons:not(div.view-switcher-buttons-expanded) button {
15
+ box-shadow: none;
16
+ }
17
+
18
+ div.view-switcher-buttons-expanded > button:nth-child(1) {
19
+ right: 4em;
20
+ }
21
+
22
+ div.view-switcher-buttons-expanded > button:nth-child(2) {
23
+ right: 8em;
24
+ }
25
+
26
+ div.view-switcher-buttons-expanded > button:nth-child(3) {
27
+ right: 12em;
28
+ }
29
+
30
+ div.view-switcher-buttons-expanded > button:nth-child(4) {
31
+ right: 16em;
32
+ }
33
+
34
+ div.view-switcher-buttons-expanded > button:nth-child(5) {
35
+ right: 20em;
36
+ }
@@ -26,12 +26,12 @@ function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e
26
26
  * LICENSE file in the root directory of this source tree.
27
27
  */
28
28
 
29
- import React from 'react';
30
29
  import { ColorPicker } from '@vtaits/react-color-picker';
30
+ import '@vtaits/react-color-picker/index.css';
31
+ import React from 'react';
31
32
  import PropTypes from 'prop-types';
32
33
  import MiscUtils from '../../utils/MiscUtils';
33
34
  import './style/ColorButton.css';
34
- import '@vtaits/react-color-picker/index.css';
35
35
  var defaultColors = [
36
36
  // [r, g, b, a]
37
37
  [255, 255, 255, 1], [0, 0, 0, 1], [255, 105, 0, 1], [252, 185, 0, 1], [0, 208, 132, 1], [142, 209, 252, 1], [6, 147, 227, 1], [171, 184, 195, 1], [235, 20, 76, 1], [247, 141, 167, 1]];
@@ -45,7 +45,7 @@ var CopyButton = /*#__PURE__*/function (_React$Component) {
45
45
  _this.setState({
46
46
  copied: true
47
47
  });
48
- } catch (e) {
48
+ } catch (_unused) {
49
49
  _this.setState({
50
50
  copied: false
51
51
  });
@@ -121,8 +121,8 @@ var LayerCatalogWidget = /*#__PURE__*/function (_React$PureComponent) {
121
121
  return res;
122
122
  }, []);
123
123
  if (existingSublayers.includes((_entry$name = entry.name) !== null && _entry$name !== void 0 ? _entry$name : resource === null || resource === void 0 ? void 0 : resource.name)) {
124
- var _ref2;
125
- var text = (_ref2 = LocaleUtils.tr("themelayerslist.existinglayers") + ": " + entry.title) !== null && _ref2 !== void 0 ? _ref2 : entry.name;
124
+ var _entry$title;
125
+ var text = LocaleUtils.tr("themelayerslist.existinglayers") + ": " + ((_entry$title = entry.title) !== null && _entry$title !== void 0 ? _entry$title : entry.name);
126
126
  var actions = [{
127
127
  name: LocaleUtils.tr("themelayerslist.addanyway"),
128
128
  onClick: function onClick() {
@@ -139,13 +139,13 @@ var LayerCatalogWidget = /*#__PURE__*/function (_React$PureComponent) {
139
139
  var asGroup = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
140
140
  _this.props.closeWindow("existinglayers");
141
141
  if (resource) {
142
- var _entry$title;
142
+ var _entry$title2;
143
143
  // Create placeholder layer
144
144
  _this.props.addLayer({
145
145
  id: resource.id,
146
146
  type: "placeholder",
147
147
  name: resource.name,
148
- title: (_entry$title = entry.title) !== null && _entry$title !== void 0 ? _entry$title : resource.name,
148
+ title: (_entry$title2 = entry.title) !== null && _entry$title2 !== void 0 ? _entry$title2 : resource.name,
149
149
  role: resource.USERLAYER,
150
150
  loading: true
151
151
  });
@@ -13,15 +13,9 @@ function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e
13
13
  * LICENSE file in the root directory of this source tree.
14
14
  */
15
15
 
16
+ import OlInteractionDrawRegular from 'ol-ext/interaction/DrawRegular';
17
+ import OlInteractionTransform from 'ol-ext/interaction/Transform';
16
18
  import OlCollection from 'ol/Collection';
17
- import OlFeature from 'ol/Feature';
18
- import OlGeolocation from 'ol/Geolocation';
19
- import OlKinetic from 'ol/Kinetic';
20
- import OlMap from 'ol/Map';
21
- import OlObject from 'ol/Object';
22
- import OlOverlay from 'ol/Overlay';
23
- import OlTileQueue from 'ol/TileQueue';
24
- import OlView from 'ol/View';
25
19
  import { defaults as olControlDefaults } from 'ol/control';
26
20
  import OlControlAttribution from 'ol/control/Attribution';
27
21
  import OlControlOverviewMap from 'ol/control/OverviewMap';
@@ -29,16 +23,18 @@ import OlControlScaleLine from 'ol/control/ScaleLine';
29
23
  import OlControlZoom from 'ol/control/Zoom';
30
24
  import * as OlEventsCondition from 'ol/events/condition';
31
25
  import * as OlExtent from 'ol/extent';
26
+ import OlFeature from 'ol/Feature';
27
+ import OlFormatGeoJSON from 'ol/format/GeoJSON';
32
28
  import OlFormatGML2 from 'ol/format/GML2';
33
29
  import OlFormatGML3 from 'ol/format/GML3';
34
30
  import OlFormatGML32 from 'ol/format/GML32';
35
- import OlFormatGeoJSON from 'ol/format/GeoJSON';
36
31
  import OlFormatKML from 'ol/format/KML';
37
32
  import OlFormatMVT from 'ol/format/MVT';
38
33
  import OlFormatWFS from 'ol/format/WFS';
39
34
  import OlFormatWKT from 'ol/format/WKT';
40
35
  import OlFormatWMSCapabilities from 'ol/format/WMSCapabilities';
41
36
  import OlFormatWMTSCapabilities from 'ol/format/WMTSCapabilities';
37
+ import OlGeolocation from 'ol/Geolocation';
42
38
  import OlGeomCircle from 'ol/geom/Circle';
43
39
  import OlGeomGeometryCollection from 'ol/geom/GeometryCollection';
44
40
  import OlGeomLineString from 'ol/geom/LineString';
@@ -63,6 +59,7 @@ import OlInteractionPointer from 'ol/interaction/Pointer';
63
59
  import OlInteractionSelect from 'ol/interaction/Select';
64
60
  import OlInteractionSnap from 'ol/interaction/Snap';
65
61
  import OlInteractionTranslate from 'ol/interaction/Translate';
62
+ import OlKinetic from 'ol/Kinetic';
66
63
  import OlGraticule from 'ol/layer/Graticule';
67
64
  import OlLayerGroup from 'ol/layer/Group';
68
65
  import OlLayerImage from 'ol/layer/Image';
@@ -71,6 +68,9 @@ import OlLayerTile from 'ol/layer/Tile';
71
68
  import OlLayerVector from 'ol/layer/Vector';
72
69
  import OlLayerVectorTile from 'ol/layer/VectorTile';
73
70
  import * as OlLoadingstrategy from 'ol/loadingstrategy';
71
+ import OlMap from 'ol/Map';
72
+ import OlObject from 'ol/Object';
73
+ import OlOverlay from 'ol/Overlay';
74
74
  import * as OlProj from 'ol/proj';
75
75
  import OlSourceBingMaps from 'ol/source/BingMaps';
76
76
  import OlSourceImageStatic from 'ol/source/ImageStatic';
@@ -91,8 +91,8 @@ import OlStyleStyle from 'ol/style/Style';
91
91
  import OlStyleText from 'ol/style/Text';
92
92
  import OlTilegridTileGrid from 'ol/tilegrid/TileGrid';
93
93
  import OlTilegridWMTS from 'ol/tilegrid/WMTS';
94
- import OlInteractionDrawRegular from 'ol-ext/interaction/DrawRegular';
95
- import OlInteractionTransform from 'ol-ext/interaction/Transform';
94
+ import OlTileQueue from 'ol/TileQueue';
95
+ import OlView from 'ol/View';
96
96
  import 'ol/ol.css';
97
97
  export default {
98
98
  Attribution: OlControlAttribution,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "qwc2",
3
- "version": "2025.12.19",
3
+ "version": "2025.12.24",
4
4
  "description": "QGIS Web Client",
5
5
  "author": "Sourcepole AG",
6
6
  "license": "BSD-2-Clause",
@@ -16,75 +16,74 @@
16
16
  "geospatial"
17
17
  ],
18
18
  "dependencies": {
19
- "@furkot/webfonts-generator": "^2.0.2",
20
- "@kayahr/text-encoding": "^2.0.0",
21
- "@loaders.gl/core": "^4.3.3",
22
- "@loaders.gl/shapefile": "^4.3.3",
23
- "@loaders.gl/zip": "^4.3.3",
19
+ "@furkot/webfonts-generator": "^2.0.3",
20
+ "@kayahr/text-encoding": "^2.1.0",
21
+ "@loaders.gl/core": "^4.3.4",
22
+ "@loaders.gl/shapefile": "^4.3.4",
23
+ "@loaders.gl/zip": "^4.3.4",
24
24
  "@mapbox/shp-write": "^0.4.3",
25
25
  "@norbulcz/num-parse": "^0.1.0",
26
- "@panoramax/web-viewer": "^4.0.1",
27
- "@reduxjs/toolkit": "^2.4.0",
26
+ "@panoramax/web-viewer": "^4.2.0",
27
+ "@reduxjs/toolkit": "^2.11.2",
28
28
  "@sourcepole/qwc-giro3d": "^0.44.0-dev",
29
- "@turf/buffer": "^6.5.0",
29
+ "@turf/buffer": "^7.3.1",
30
30
  "@turf/clean-coords": "^7.3.1",
31
- "@turf/helpers": "^6.5.0",
31
+ "@turf/helpers": "^7.3.1",
32
32
  "@vtaits/react-color-picker": "^2.0.0",
33
33
  "any-date-parser": "^1.5.4",
34
- "axios": "^1.11.0",
35
- "chart.js": "^4.4.7",
34
+ "axios": "^1.13.2",
35
+ "chart.js": "^4.5.1",
36
36
  "classnames": "^2.5.1",
37
37
  "clone": "^2.1.2",
38
- "dayjs": "^1.11.13",
38
+ "dayjs": "^1.11.19",
39
39
  "deepmerge": "^4.3.1",
40
40
  "diacritics": "^1.3.0",
41
- "dompurify": "^3.2.6",
42
- "driver.js": "^1.3.6",
41
+ "dompurify": "^3.3.1",
42
+ "driver.js": "^1.4.0",
43
43
  "expr-eval": "^2.0.2",
44
- "fast-xml-parser": "^4.5.0",
44
+ "fast-xml-parser": "^5.3.3",
45
45
  "file-saver": "^2.0.5",
46
46
  "flat": "^6.0.1",
47
47
  "formdata-json": "^1.0.0",
48
48
  "geojson-bounding-box": "^0.2.0",
49
- "html-react-parser": "^5.2.0",
49
+ "html-react-parser": "^5.2.11",
50
50
  "ismobilejs": "^1.1.1",
51
- "js-yaml": "^4.1.0",
51
+ "js-yaml": "^4.1.1",
52
52
  "jszip": "^3.10.1",
53
53
  "lodash.isempty": "^4.4.0",
54
54
  "lodash.isequal": "^4.5.0",
55
- "lodash.omit": "^4.5.0",
56
55
  "mime-to-extensions": "^1.0.2",
57
56
  "mkdirp": "^3.0.1",
58
57
  "mousetrap": "^1.6.5",
59
58
  "nearley": "^2.20.1",
60
59
  "object-path": "^0.11.8",
61
- "ol": "^10.3.1",
62
- "ol-ext": "^4.0.24",
63
- "ol-mapbox-style": "^12.3.5",
64
- "painterro": "^1.2.87",
60
+ "ol": "^10.7.0",
61
+ "ol-ext": "^4.0.37",
62
+ "ol-mapbox-style": "^13.2.0",
63
+ "painterro": "^1.2.92",
65
64
  "parse-css-color": "^0.2.1",
66
65
  "path-browserify": "^1.0.1",
67
66
  "pdf-lib": "^1.17.1",
68
- "pdfjs-dist": "^4.9.155",
67
+ "pdfjs-dist": "^5.4.449",
69
68
  "point-in-polygon": "^1.1.0",
70
69
  "polygon-intersect-test": "^1.0.1",
71
- "proj4": "^2.15.0",
70
+ "proj4": "^2.20.2",
72
71
  "prop-types": "^15.8.1",
73
- "qrcode.react": "^4.1.0",
72
+ "qrcode.react": "^4.2.0",
74
73
  "randomcolor": "^0.6.2",
75
- "react": "^18.3.1",
76
- "react-chartjs-2": "^5.2.0",
77
- "react-dom": "^18.3.1",
74
+ "react": "^19.2.3",
75
+ "react-chartjs-2": "^5.3.1",
76
+ "react-dom": "^19.2.3",
78
77
  "react-google-recaptcha": "^3.1.0",
79
- "react-redux": "^9.1.2",
80
- "react-reverse-portal": "^2.1.2",
81
- "react-rnd": "^10.4.13",
82
- "react-share": "^5.1.1",
78
+ "react-redux": "^9.2.0",
79
+ "react-reverse-portal": "^2.3.0",
80
+ "react-rnd": "^10.5.2",
81
+ "react-share": "^5.2.2",
83
82
  "react-sortablejs": "^1.5.1",
84
83
  "react-swipeable": "^7.0.2",
85
84
  "redux-logger": "^3.0.6",
86
85
  "reselect": "^5.1.1",
87
- "simplepolygon": "^1.2.3",
86
+ "simplepolygon": "^2.0.2",
88
87
  "sortablejs": "^1.15.6",
89
88
  "suncalc": "^1.9.0",
90
89
  "svgpath": "^2.6.0",
@@ -94,36 +93,36 @@
94
93
  "toposort": "^2.0.2",
95
94
  "url": "^0.11.4",
96
95
  "utif": "^3.1.0",
97
- "uuid": "^11.0.3",
96
+ "uuid": "^13.0.0",
98
97
  "xlsx": "^0.18.5"
99
98
  },
100
99
  "devDependencies": {
101
- "@babel/cli": "^7.27.0",
102
- "@babel/core": "^7.26.0",
103
- "@babel/eslint-parser": "^7.25.9",
104
- "@babel/plugin-transform-class-properties": "^7.25.9",
105
- "@babel/plugin-transform-object-rest-spread": "^7.25.9",
106
- "@babel/preset-env": "^7.26.0",
107
- "@babel/preset-react": "^7.26.3",
100
+ "@babel/cli": "^7.28.3",
101
+ "@babel/core": "^7.28.5",
102
+ "@babel/eslint-parser": "^7.28.5",
103
+ "@babel/plugin-transform-class-properties": "^7.27.1",
104
+ "@babel/plugin-transform-object-rest-spread": "^7.28.4",
105
+ "@babel/preset-env": "^7.28.5",
106
+ "@babel/preset-react": "^7.28.5",
108
107
  "@microsoft/eslint-formatter-sarif": "^3.1.0",
109
- "@types/react": "^18.3.1",
110
- "babel-loader": "^9.2.1",
108
+ "@types/react": "^19.2.7",
109
+ "@types/three": "^0.170.0",
110
+ "babel-loader": "^10.0.0",
111
111
  "babel-plugin-transform-react-remove-prop-types": "^0.4.24",
112
- "clean-webpack-plugin": "^4.0.0",
113
- "copy-webpack-plugin": "^12.0.2",
112
+ "copy-webpack-plugin": "^13.0.1",
114
113
  "css-loader": "^7.1.2",
115
- "eslint": "^8.56.0",
116
- "eslint-plugin-perfectionist": "^2.10.0",
117
- "eslint-plugin-react": "^7.37.2",
118
- "html-webpack-plugin": "^5.6.4",
119
- "react-docgen": "^5.4.3",
114
+ "eslint": "^9.39.2",
115
+ "eslint-plugin-perfectionist": "^5.1.0",
116
+ "eslint-plugin-react": "^7.37.5",
117
+ "html-webpack-plugin": "^5.6.5",
118
+ "react-docgen": "^8.0.2",
120
119
  "source-map-loader": "^5.0.0",
121
120
  "style-loader": "^4.0.0",
122
- "typescript": "^5.7.2",
123
- "webpack": "^5.97.1",
121
+ "typescript": "^5.9.3",
122
+ "webpack": "^5.104.1",
124
123
  "webpack-bundle-size-analyzer": "^3.1.0",
125
- "webpack-cli": "^5.1.4",
126
- "webpack-dev-server": "^5.1.0"
124
+ "webpack-cli": "^6.0.1",
125
+ "webpack-dev-server": "^5.2.2"
127
126
  },
128
127
  "bin": {
129
128
  "qwc_build_iconfont": "./scripts/makeIconkit.js",
package/plugins/API.js CHANGED
@@ -69,18 +69,18 @@ import QtDesignerForm from '../components/QtDesignerForm';
69
69
  import ResizeableWindow from '../components/ResizeableWindow';
70
70
  import SearchBox from '../components/SearchBox';
71
71
  import ServiceInfoWindow from '../components/ServiceInfoWindow';
72
+ import ShareLink from '../components/share/ShareLink';
73
+ import ShareQRCode from '../components/share/ShareQRCode';
74
+ import ShareSocials from '../components/share/ShareSocials';
72
75
  import SideBar from '../components/SideBar';
73
76
  import { Swipeable } from '../components/Swipeable';
74
77
  import TaskBar from '../components/TaskBar';
75
78
  import ThemeLayersListWindow from '../components/ThemeLayersListWindow';
76
79
  import ThemeList from '../components/ThemeList';
77
- import Toolbar from '../components/Toolbar';
78
- import ShareLink from '../components/share/ShareLink';
79
- import ShareQRCode from '../components/share/ShareQRCode';
80
- import ShareSocials from '../components/share/ShareSocials';
81
80
  import FixedTimeline from '../components/timeline/FixedTimeline';
82
81
  import InfiniteTimeline from '../components/timeline/InfiniteTimeline';
83
82
  import TimelineFeaturesSlider from '../components/timeline/TimelineFeaturesSlider';
83
+ import Toolbar from '../components/Toolbar';
84
84
  import AccordeonWidget from '../components/widgets/AccordeonWidget';
85
85
  import ButtonBar from '../components/widgets/ButtonBar';
86
86
  import ColorButton from '../components/widgets/ColorButton';