qwc2 2025.12.15 → 2025.12.18

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 (87) hide show
  1. package/components/AttributeForm.js +8 -8
  2. package/components/AttributeTableWidget.js +3 -3
  3. package/components/EditComboField.js +1 -1
  4. package/components/EditUploadField.js +1 -1
  5. package/components/IdentifyViewer.js +91 -38
  6. package/components/LinkFeatureForm.js +21 -4
  7. package/components/MeasureSwitcher.js +115 -0
  8. package/components/PluginsContainer.js +3 -2
  9. package/components/QtDesignerForm.js +2 -2
  10. package/components/ResizeableWindow.js +9 -1
  11. package/components/SearchBox.js +19 -12
  12. package/components/SideBar.js +4 -0
  13. package/components/map3d/drawtool/EditTool3D.js +1 -1
  14. package/components/style/IdentifyViewer.css +8 -6
  15. package/components/style/LocationRecorder.css +1 -6
  16. package/components/style/PluginsContainer.css +11 -6
  17. package/components/timeline/FixedTimeline.js +2 -2
  18. package/components/timeline/InfiniteTimeline.js +2 -2
  19. package/components/timeline/TimelineFeaturesSlider.js +1 -1
  20. package/components/widgets/EditableSelect.js +2 -1
  21. package/components/widgets/LayerCatalogWidget.js +26 -15
  22. package/components/widgets/MenuButton.js +7 -2
  23. package/components/widgets/NavBar.js +4 -2
  24. package/components/widgets/PopupMenu.js +44 -13
  25. package/components/widgets/SearchWidget.js +39 -50
  26. package/components/widgets/style/SearchWidget.css +3 -19
  27. package/package.json +1 -1
  28. package/plugins/Editing.js +20 -5
  29. package/plugins/FeatureForm.js +1 -1
  30. package/plugins/FeatureSearch.js +3 -3
  31. package/plugins/GeometryDigitizer.js +32 -18
  32. package/plugins/HeightProfile.js +4 -1
  33. package/plugins/Identify.js +5 -4
  34. package/plugins/LayerTree.js +5 -1
  35. package/plugins/MapExport.js +4 -4
  36. package/plugins/MapFilter.js +10 -10
  37. package/plugins/Measure.js +5 -1
  38. package/plugins/NewsPopup.js +1 -1
  39. package/plugins/ObliqueView.js +88 -17
  40. package/plugins/Print.js +8 -8
  41. package/plugins/Redlining.js +25 -73
  42. package/plugins/Reports.js +3 -3
  43. package/plugins/Routing.js +4 -4
  44. package/plugins/TopBar.js +2 -0
  45. package/plugins/ValueTool.js +1 -1
  46. package/plugins/View3D.js +2 -2
  47. package/plugins/ZoomButtons.js +1 -1
  48. package/plugins/map/EditingSupport.js +50 -20
  49. package/plugins/map/MeasurementSupport.js +1 -0
  50. package/plugins/map/RedliningSupport.js +9 -7
  51. package/plugins/map/SnapSupport.js +12 -10
  52. package/plugins/map/style/SnappingSupport.css +1 -8
  53. package/plugins/map3d/Draw3D.js +2 -2
  54. package/plugins/map3d/ExportObjects3D.js +2 -2
  55. package/plugins/map3d/MapExport3D.js +4 -4
  56. package/reducers/editing.js +6 -1
  57. package/reducers/layers.js +18 -36
  58. package/reducers/measurement.js +2 -1
  59. package/scripts/wmts_config_generator.py +1 -1
  60. package/static/translations/bg-BG.json +45 -75
  61. package/static/translations/ca-ES.json +45 -75
  62. package/static/translations/cs-CZ.json +45 -75
  63. package/static/translations/de-CH.json +45 -75
  64. package/static/translations/de-DE.json +45 -75
  65. package/static/translations/en-US.json +45 -75
  66. package/static/translations/es-ES.json +45 -75
  67. package/static/translations/fi-FI.json +45 -75
  68. package/static/translations/fr-FR.json +46 -76
  69. package/static/translations/hu-HU.json +45 -75
  70. package/static/translations/it-IT.json +45 -75
  71. package/static/translations/ja-JP.json +45 -75
  72. package/static/translations/nl-NL.json +45 -75
  73. package/static/translations/no-NO.json +45 -75
  74. package/static/translations/pl-PL.json +45 -75
  75. package/static/translations/pt-BR.json +45 -75
  76. package/static/translations/pt-PT.json +45 -75
  77. package/static/translations/ro-RO.json +45 -75
  78. package/static/translations/ru-RU.json +45 -75
  79. package/static/translations/sv-SE.json +45 -75
  80. package/static/translations/tr-TR.json +45 -75
  81. package/static/translations/tsconfig.json +35 -67
  82. package/static/translations/uk-UA.json +45 -75
  83. package/utils/FeatureStyles.js +18 -20
  84. package/utils/IdentifyUtils.js +14 -11
  85. package/utils/MiscUtils.js +2 -1
  86. package/utils/SearchProviders.js +1 -1
  87. package/utils/VectorLayerUtils.js +4 -2
@@ -174,6 +174,7 @@ var defaultStyle = function defaultStyle(feature, options) {
174
174
  }
175
175
  }
176
176
  if (feature.getGeometry().getType() === "LineString" && opts.headmarker in END_MARKERS) {
177
+ var _opts$markerscale;
177
178
  var _p = feature.getGeometry().getCoordinates()[0];
178
179
  var _p2 = feature.getGeometry().getCoordinates()[1];
179
180
  var rotation = 0.5 * Math.PI + Math.atan2(_p[0] - _p2[0], _p[1] - _p2[1]);
@@ -184,11 +185,12 @@ var defaultStyle = function defaultStyle(feature, options) {
184
185
  anchorYUnits: 'fraction',
185
186
  color: opts.strokeColor,
186
187
  rotation: END_MARKERS[opts.headmarker].baserotation / 180 * Math.PI + rotation,
187
- scale: 0.125 * (1 + opts.strokeWidth) // Also update in VectorLayerUtils.generateMarkerGeometry
188
+ scale: 0.125 * (1 + opts.strokeWidth) * ((_opts$markerscale = opts.markerscale) !== null && _opts$markerscale !== void 0 ? _opts$markerscale : 1) // Also update in VectorLayerUtils.generateMarkerGeometry
188
189
  }))
189
190
  }));
190
191
  }
191
192
  if (feature.getGeometry().getType() === "LineString" && opts.tailmarker in END_MARKERS) {
193
+ var _opts$markerscale2;
192
194
  var l = feature.getGeometry().getCoordinates().length;
193
195
  var _p3 = feature.getGeometry().getCoordinates()[l - 1];
194
196
  var _p4 = feature.getGeometry().getCoordinates()[l - 2];
@@ -200,7 +202,7 @@ var defaultStyle = function defaultStyle(feature, options) {
200
202
  anchorYUnits: 'fraction',
201
203
  color: opts.strokeColor,
202
204
  rotation: END_MARKERS[opts.tailmarker].baserotation / 180 * Math.PI + _rotation,
203
- scale: 0.125 * (1 + opts.strokeWidth) // Also update in VectorLayerUtils.generateMarkerGeometry
205
+ scale: 0.125 * (1 + opts.strokeWidth) * ((_opts$markerscale2 = opts.markerscale) !== null && _opts$markerscale2 !== void 0 ? _opts$markerscale2 : 1) // Also update in VectorLayerUtils.generateMarkerGeometry
204
206
  }))
205
207
  }));
206
208
  }
@@ -235,25 +237,20 @@ export default {
235
237
  })
236
238
  })];
237
239
  },
238
- interaction: function interaction(options, isSnap) {
240
+ interaction: function interaction(feature, options, isSnap) {
239
241
  var opts = _objectSpread(_objectSpread(_objectSpread({}, DEFAULT_INTERACTION_STYLE), ConfigUtils.getConfigProp("defaultInteractionStyle")), options);
240
- var fillColor = opts.fillColor;
241
- var strokeColor = opts.strokeColor;
242
- var strokeWidth = opts.strokeWidth;
243
- if (isSnap) {
244
- fillColor = opts.snapFillColor;
245
- strokeColor = opts.snapStrokeColor;
246
- strokeWidth = opts.snapStrokeWidth;
247
- }
248
- return new ol.style.Style({
249
- fill: new ol.style.Fill({
250
- color: fillColor
251
- }),
252
- stroke: new ol.style.Stroke({
253
- color: strokeColor,
254
- width: strokeWidth
255
- })
256
- });
242
+ var styleOptions = isSnap ? {
243
+ strokeColor: opts.snapStrokeColor,
244
+ strokeWidth: opts.snapStrokeWidth,
245
+ fillColor: opts.snapFillColor
246
+ } : {
247
+ strokeColor: opts.strokeColor,
248
+ strokeWidth: opts.strokeWidth,
249
+ fillColor: opts.fillColor
250
+ };
251
+ styleOptions.strokeDash = [];
252
+ styleOptions.circleRadius = 0;
253
+ return defaultStyle(feature, styleOptions);
257
254
  },
258
255
  interactionVertex: function interactionVertex(options, isSnap) {
259
256
  var opts = _objectSpread(_objectSpread(_objectSpread({}, DEFAULT_INTERACTION_STYLE), ConfigUtils.getConfigProp("defaultInteractionStyle")), options);
@@ -295,6 +292,7 @@ export default {
295
292
  fillColor: opts.measureFillColor,
296
293
  headmarker: opts.headmarker,
297
294
  tailmarker: opts.tailmarker,
295
+ markerscale: opts.markerscale,
298
296
  strokeDash: []
299
297
  };
300
298
  return defaultStyle(feature, styleOptions);
@@ -27,6 +27,8 @@ import CoordinatesUtils from '../utils/CoordinatesUtils';
27
27
  import LayerUtils from '../utils/LayerUtils';
28
28
  import MapUtils from '../utils/MapUtils';
29
29
  import VectorLayerUtils from './VectorLayerUtils';
30
+ export var EXCLUDE_PROPS = ['featurereport', 'displayfield', 'layername', 'layertitle', 'layerinfo', 'attribnames', 'clickPos', 'displayname', 'bbox'];
31
+ export var EXCLUDE_ATTRS = ['htmlContent', 'htmlContentInline'];
30
32
  function identifyRequestParams(layer, queryLayers, projection, params) {
31
33
  var _layer$format;
32
34
  var format = 'text/plain';
@@ -184,14 +186,14 @@ var IdentifyUtils = {
184
186
  });
185
187
  }
186
188
  },
187
- parseResponse: function parseResponse(response, layer, format, clickPoint, projection, featureInfoReturnsLayerName) {
189
+ parseResponse: function parseResponse(response, layer, format, clickPoint, projection) {
188
190
  var decimals = CoordinatesUtils.getPrecision(projection);
189
191
  var posstr = clickPoint ? clickPoint[0].toFixed(decimals) + ", " + clickPoint[1].toFixed(decimals) : "";
190
192
  var results = {};
191
193
  if (["application/json", "application/geojson", "application/geo+json", "GeoJSON"].includes(format)) {
192
194
  results = IdentifyUtils.parseGeoJSONResponse(response, projection, layer);
193
195
  } else if (format === "text/xml") {
194
- results = IdentifyUtils.parseXmlResponse(response, projection, layer, posstr, featureInfoReturnsLayerName);
196
+ results = IdentifyUtils.parseXmlResponse(response, projection, layer, posstr);
195
197
  } else if (format === "application/vnd.ogc.gml") {
196
198
  results = IdentifyUtils.parseGmlResponse(response, projection, layer, posstr);
197
199
  } else if (format.startsWith("text/xml;subtype=gml/3.1") || format.startsWith("text/xml;subtype=gml/3.0")) {
@@ -310,8 +312,6 @@ var IdentifyUtils = {
310
312
  _doc$firstChild$getEl,
311
313
  _this = this;
312
314
  var posstr = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;
313
- var featureInfoReturnsLayerName = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;
314
- var mapLayers = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : null;
315
315
  var parser = new DOMParser();
316
316
  var doc = parser.parseFromString(response, "text/xml");
317
317
  var layersEl = [].slice.call(((_doc$firstChild = doc.firstChild) === null || _doc$firstChild === void 0 || (_doc$firstChild$getEl = _doc$firstChild.getElementsByTagName) === null || _doc$firstChild$getEl === void 0 ? void 0 : _doc$firstChild$getEl.call(_doc$firstChild, "Layer")) || []);
@@ -326,18 +326,21 @@ var IdentifyUtils = {
326
326
  var displayfield = layerEl.attributes.displayfield ? layerEl.attributes.displayfield.value : null;
327
327
  var layername = "";
328
328
  var layertitle = "";
329
- if (layerEl.attributes.layername) {
329
+ if (layerEl.attributes.title) {
330
330
  var _layer$translations$l, _layer$translations;
331
+ // QGIS Server 3.36+ / qwc-feature-info-service 2025.12.18+
332
+ layername = layerEl.attributes.name.value;
333
+ layertitle = (_layer$translations$l = (_layer$translations = layer.translations) === null || _layer$translations === void 0 || (_layer$translations = _layer$translations.layertree) === null || _layer$translations === void 0 ? void 0 : _layer$translations[layername]) !== null && _layer$translations$l !== void 0 ? _layer$translations$l : layerEl.attributes.title.value;
334
+ } else if (layerEl.attributes.layername) {
335
+ var _layer$translations$l2, _layer$translations2;
336
+ // qwc-feature-info-service < 2025.12.18
331
337
  layername = layerEl.attributes.layername.value;
332
- layertitle = (_layer$translations$l = (_layer$translations = layer.translations) === null || _layer$translations === void 0 || (_layer$translations = _layer$translations.layertree) === null || _layer$translations === void 0 ? void 0 : _layer$translations[layername]) !== null && _layer$translations$l !== void 0 ? _layer$translations$l : layerEl.attributes.name.value;
333
- } else if (featureInfoReturnsLayerName) {
338
+ layertitle = (_layer$translations$l2 = (_layer$translations2 = layer.translations) === null || _layer$translations2 === void 0 || (_layer$translations2 = _layer$translations2.layertree) === null || _layer$translations2 === void 0 ? void 0 : _layer$translations2[layername]) !== null && _layer$translations$l2 !== void 0 ? _layer$translations$l2 : layerEl.attributes.name.value;
339
+ } else {
334
340
  var _LayerUtils$searchSub, _LayerUtils$searchSub2;
341
+ // QGIS Server < 3.36
335
342
  layername = layerEl.attributes.name.value;
336
343
  layertitle = (_LayerUtils$searchSub = (_LayerUtils$searchSub2 = LayerUtils.searchSubLayer(layer, 'name', layername)) === null || _LayerUtils$searchSub2 === void 0 ? void 0 : _LayerUtils$searchSub2.title) !== null && _LayerUtils$searchSub !== void 0 ? _LayerUtils$searchSub : layername;
337
- } else {
338
- var _LayerUtils$searchSub3, _LayerUtils$searchSub4;
339
- layertitle = layerEl.attributes.name.value;
340
- layername = (_LayerUtils$searchSub3 = (_LayerUtils$searchSub4 = LayerUtils.searchSubLayer(layer, 'title', layertitle)) === null || _LayerUtils$searchSub4 === void 0 ? void 0 : _LayerUtils$searchSub4.name) !== null && _LayerUtils$searchSub3 !== void 0 ? _LayerUtils$searchSub3 : layertitle;
341
344
  }
342
345
  var layerinfo = layerEl.attributes.layerinfo ? layerEl.attributes.layerinfo.value : null;
343
346
  var features = [].slice.call(layerEl.getElementsByTagName("Feature"));
@@ -93,7 +93,8 @@ var MiscUtils = {
93
93
  },
94
94
  checkKeyActivate: function checkKeyActivate(ev) {
95
95
  var onEsc = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
96
- if (ev.code === "Space" || ev.code === "Enter") {
96
+ var spaceActivate = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
97
+ if (spaceActivate && ev.code === "Space" || ev.code === "Enter") {
97
98
  MiscUtils.killEvent(ev);
98
99
  ev.currentTarget.click();
99
100
  } else if (ev.code === "Escape" && onEsc) {
@@ -419,7 +419,7 @@ export var FulltextSearch = /*#__PURE__*/function () {
419
419
  resultCount: placeResultCount,
420
420
  type: SearchResultType.PLACE,
421
421
  items: data.results.filter(function (entry) {
422
- return entry.feature;
422
+ return entry.feature && entry.feature.bbox;
423
423
  }).map(function (entry) {
424
424
  return {
425
425
  id: entry.feature.feature_id,
@@ -95,12 +95,14 @@ var VectorLayerUtils = {
95
95
  var properties = feature.properties || {};
96
96
  var geometry = VectorLayerUtils.reprojectGeometry(feature.geometry, feature.crs || printCrs, printCrs);
97
97
  if (feature.geometry.type === "LineString") {
98
+ var _styleOptions$markers;
99
+ var markerScale = (_styleOptions$markers = styleOptions.markerscale) !== null && _styleOptions$markers !== void 0 ? _styleOptions$markers : 1;
98
100
  // Generate arrow heads
99
101
  if (styleOptions.headmarker) {
100
- VectorLayerUtils.generateMarkerGeometry(params, styleOptions.headmarker, false, feature, layer, dpi, printScale, printCrs, scaleFactor);
102
+ VectorLayerUtils.generateMarkerGeometry(params, styleOptions.headmarker, false, feature, layer, dpi, printScale, printCrs, scaleFactor * markerScale);
101
103
  }
102
104
  if (styleOptions.tailmarker) {
103
- VectorLayerUtils.generateMarkerGeometry(params, styleOptions.tailmarker, true, feature, layer, dpi, printScale, printCrs, scaleFactor);
105
+ VectorLayerUtils.generateMarkerGeometry(params, styleOptions.tailmarker, true, feature, layer, dpi, printScale, printCrs, scaleFactor * markerScale);
104
106
  }
105
107
  }
106
108
  if (feature.geometry.type === "LineString" && !isEmpty(properties.segment_labels)) {