qwc2 2025.12.15 → 2025.12.17

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 (50) hide show
  1. package/components/IdentifyViewer.js +89 -35
  2. package/components/ResizeableWindow.js +8 -0
  3. package/components/SearchBox.js +12 -5
  4. package/components/SideBar.js +4 -0
  5. package/components/style/IdentifyViewer.css +7 -5
  6. package/components/widgets/EditableSelect.js +2 -1
  7. package/components/widgets/LayerCatalogWidget.js +25 -14
  8. package/components/widgets/MenuButton.js +7 -2
  9. package/components/widgets/NavBar.js +4 -2
  10. package/components/widgets/PopupMenu.js +44 -13
  11. package/components/widgets/SearchWidget.js +39 -50
  12. package/components/widgets/style/SearchWidget.css +3 -19
  13. package/package.json +1 -1
  14. package/plugins/HeightProfile.js +4 -1
  15. package/plugins/Identify.js +4 -0
  16. package/plugins/LayerTree.js +5 -1
  17. package/plugins/Measure.js +5 -1
  18. package/plugins/Print.js +1 -1
  19. package/plugins/TopBar.js +2 -0
  20. package/plugins/map/MeasurementSupport.js +1 -0
  21. package/plugins/map/RedliningSupport.js +7 -5
  22. package/reducers/layers.js +18 -36
  23. package/reducers/measurement.js +2 -1
  24. package/scripts/wmts_config_generator.py +1 -1
  25. package/static/translations/bg-BG.json +6 -1
  26. package/static/translations/ca-ES.json +6 -1
  27. package/static/translations/cs-CZ.json +6 -1
  28. package/static/translations/de-CH.json +6 -1
  29. package/static/translations/de-DE.json +6 -1
  30. package/static/translations/en-US.json +6 -1
  31. package/static/translations/es-ES.json +6 -1
  32. package/static/translations/fi-FI.json +6 -1
  33. package/static/translations/fr-FR.json +7 -2
  34. package/static/translations/hu-HU.json +6 -1
  35. package/static/translations/it-IT.json +6 -1
  36. package/static/translations/ja-JP.json +6 -1
  37. package/static/translations/nl-NL.json +6 -1
  38. package/static/translations/no-NO.json +6 -1
  39. package/static/translations/pl-PL.json +6 -1
  40. package/static/translations/pt-BR.json +6 -1
  41. package/static/translations/pt-PT.json +6 -1
  42. package/static/translations/ro-RO.json +6 -1
  43. package/static/translations/ru-RU.json +6 -1
  44. package/static/translations/sv-SE.json +6 -1
  45. package/static/translations/tr-TR.json +6 -1
  46. package/static/translations/tsconfig.json +5 -0
  47. package/static/translations/uk-UA.json +6 -1
  48. package/utils/FeatureStyles.js +5 -2
  49. package/utils/MiscUtils.js +2 -1
  50. package/utils/VectorLayerUtils.js +4 -2
@@ -34,11 +34,11 @@ import isEmpty from 'lodash.isempty';
34
34
  import PropTypes from 'prop-types';
35
35
  import { v4 as uuidv4 } from 'uuid';
36
36
  import LocaleUtils from '../../utils/LocaleUtils';
37
- import MiscUtils from '../../utils/MiscUtils';
38
37
  import { SearchResultType } from '../../utils/SearchProviders';
39
38
  import VectorLayerUtils from '../../utils/VectorLayerUtils';
40
39
  import Icon from '../Icon';
41
40
  import InputContainer from './InputContainer';
41
+ import PopupMenu from './PopupMenu';
42
42
  import Spinner from './Spinner';
43
43
  import './style/SearchWidget.css';
44
44
  var SearchWidget = /*#__PURE__*/function (_React$Component) {
@@ -51,42 +51,40 @@ var SearchWidget = /*#__PURE__*/function (_React$Component) {
51
51
  reqId: null,
52
52
  results: [],
53
53
  pending: 0,
54
- active: false
54
+ resultsVisible: false
55
55
  });
56
56
  _defineProperty(_this, "renderResults", function () {
57
- return /*#__PURE__*/React.createElement("div", {
57
+ return /*#__PURE__*/React.createElement(PopupMenu, {
58
+ anchor: _this.input,
58
59
  className: "search-widget-results",
59
- onMouseDown: _this.setPreventBlur
60
+ onClose: function onClose() {
61
+ return _this.setState({
62
+ resultsVisible: false
63
+ });
64
+ },
65
+ setMaxWidth: true,
66
+ spaceKeyActivation: false
60
67
  }, _this.state.results.filter(function (group) {
61
68
  var _group$type;
62
69
  return _this.props.resultTypeFilter.includes((_group$type = group.type) !== null && _group$type !== void 0 ? _group$type : SearchResultType.PLACE);
63
70
  }).map(function (group) {
64
71
  var _group$title;
65
- return /*#__PURE__*/React.createElement("div", {
66
- className: "search-widget-results-group",
67
- key: group.id,
68
- onMouseDown: MiscUtils.killEvent
69
- }, /*#__PURE__*/React.createElement("div", {
70
- className: "search-widget-results-group-title"
72
+ return [/*#__PURE__*/React.createElement("div", {
73
+ className: "search-widget-results-group-title",
74
+ disabled: true,
75
+ key: group.id
71
76
  }, /*#__PURE__*/React.createElement("span", null, (_group$title = group.title) !== null && _group$title !== void 0 ? _group$title : LocaleUtils.tr(group.titlemsgid))), group.items.map(function (item) {
72
77
  item.text = (item.label !== undefined ? item.label : item.text || '').replace(/<\/?\w+\s*\/?>/g, '');
73
78
  return /*#__PURE__*/React.createElement("div", {
74
- className: "search-widget-results-group-item",
75
- key: item.id,
79
+ className: "search-widget-results-item",
80
+ key: group.id + ":" + item.id,
76
81
  onClick: function onClick() {
77
82
  return _this.resultSelected(group, item);
78
83
  },
79
84
  title: item.text
80
85
  }, item.text);
81
- }));
82
- }));
83
- });
84
- _defineProperty(_this, "setPreventBlur", function () {
85
- _this.preventBlur = true;
86
- setTimeout(function () {
87
- _this.preventBlur = false;
88
- return false;
89
- }, 100);
86
+ })];
87
+ }).flat());
90
88
  });
91
89
  _defineProperty(_this, "textChanged", function (ev) {
92
90
  _this.setState({
@@ -102,27 +100,19 @@ var SearchWidget = /*#__PURE__*/function (_React$Component) {
102
100
  _this.searchTimeout = setTimeout(_this.startSearch, 250);
103
101
  }
104
102
  });
105
- _defineProperty(_this, "onBlur", function () {
106
- if (!_this.preventBlur) {
107
- clearTimeout(_this.searchTimeout);
108
- _this.props.onBlur();
109
- _this.setState({
110
- active: false
111
- });
112
- }
113
- });
114
103
  _defineProperty(_this, "onFocus", function (ev) {
115
- ev.target.select();
116
- _this.props.onFocus();
117
- _this.setState({
118
- active: true
119
- });
104
+ if (_this.input && !_this.state.resultsVisible) {
105
+ ev.target.select();
106
+ }
120
107
  });
121
108
  _defineProperty(_this, "onKeyDown", function (ev) {
122
109
  if (ev.key === 'Enter') {
123
110
  _this.startSearch();
124
- } else if (ev.key === 'Escape') {
125
- ev.target.blur();
111
+ } else if (ev.key === 'ArrowDown' || ev.key === 'ArrowUp') {
112
+ ev.preventDefault();
113
+ _this.setState({
114
+ resultsVisible: true
115
+ });
126
116
  }
127
117
  });
128
118
  _defineProperty(_this, "startSearch", function () {
@@ -149,7 +139,8 @@ var SearchWidget = /*#__PURE__*/function (_React$Component) {
149
139
  provider: provider
150
140
  });
151
141
  }))),
152
- pending: state.pending - 1
142
+ pending: state.pending - 1,
143
+ resultsVisible: true
153
144
  };
154
145
  });
155
146
  }, axios);
@@ -174,14 +165,12 @@ var SearchWidget = /*#__PURE__*/function (_React$Component) {
174
165
  } : null
175
166
  }));
176
167
  }
177
- if (_this.input) {
178
- _this.input.blur();
179
- }
180
168
  });
181
169
  _defineProperty(_this, "clear", function () {
182
170
  _this.setState({
183
171
  results: [],
184
- text: ""
172
+ text: "",
173
+ resultsVisible: false
185
174
  });
186
175
  _this.props.resultSelected(null);
187
176
  });
@@ -209,13 +198,17 @@ var SearchWidget = /*#__PURE__*/function (_React$Component) {
209
198
  }, {
210
199
  key: "render",
211
200
  value: function render() {
212
- var _this$props$placehold,
213
- _this2 = this;
201
+ var _this2 = this,
202
+ _this$props$placehold;
214
203
  return /*#__PURE__*/React.createElement("div", {
215
204
  className: "search-widget-container"
216
205
  }, /*#__PURE__*/React.createElement(InputContainer, null, /*#__PURE__*/React.createElement("input", {
217
- onBlur: this.onBlur,
218
206
  onChange: this.textChanged,
207
+ onClick: function onClick() {
208
+ return _this2.setState({
209
+ resultsVisible: true
210
+ });
211
+ },
219
212
  onFocus: this.onFocus,
220
213
  onKeyDown: this.onKeyDown,
221
214
  placeholder: (_this$props$placehold = this.props.placeholder) !== null && _this$props$placehold !== void 0 ? _this$props$placehold : LocaleUtils.tr("search.search"),
@@ -231,14 +224,12 @@ var SearchWidget = /*#__PURE__*/function (_React$Component) {
231
224
  icon: "clear",
232
225
  onClick: this.clear,
233
226
  role: "suffix"
234
- })), (!isEmpty(this.state.results) || this.state.pending > 0) && this.state.active ? this.renderResults() : null);
227
+ })), (!isEmpty(this.state.results) || this.state.pending > 0) && this.state.resultsVisible ? this.renderResults() : null);
235
228
  }
236
229
  }]);
237
230
  }(React.Component);
238
231
  _defineProperty(SearchWidget, "propTypes", {
239
232
  className: PropTypes.string,
240
- onBlur: PropTypes.func,
241
- onFocus: PropTypes.func,
242
233
  placeholder: PropTypes.string,
243
234
  queryGeometries: PropTypes.bool,
244
235
  resultSelected: PropTypes.func.isRequired,
@@ -251,8 +242,6 @@ _defineProperty(SearchWidget, "propTypes", {
251
242
  value: PropTypes.string
252
243
  });
253
244
  _defineProperty(SearchWidget, "defaultProps", {
254
- onBlur: function onBlur() {},
255
- onFocus: function onFocus() {},
256
245
  resultTypeFilter: [SearchResultType.PLACE],
257
246
  searchParams: {},
258
247
  searchProviders: []
@@ -11,31 +11,15 @@ div.search-widget-container > div.input-container > div.spinner {
11
11
  height: 2em;
12
12
  }
13
13
 
14
- div.search-widget-results {
15
- position: absolute;
16
- left: 0;
17
- right: 0;
18
- top: 100%;
19
- border: 1px solid var(--border-color);
20
- background-color: var(--list-bg-color);
21
- max-height: 10em;
22
- overflow-y: auto;
23
- z-index: 1;
24
- box-shadow: 0px 2px 4px rgba(136, 136, 136, 0.5);
25
- }
26
14
 
27
15
  div.search-widget-results-group-title {
28
16
  background-color: var(--list-section-bg-color);
29
17
  color: var(--list-section-text-color);
30
- font-weight: bold;;
31
- }
32
-
33
- div.search-widget-results-group-item:hover {
34
- background-color: var(--list-item-bg-color-hover);
35
- color: var(--list-item-text-color-hover);
18
+ font-weight: bold;
19
+ padding: 0.25em;
36
20
  }
37
21
 
38
- div.search-widget-results-group div {
22
+ div.search-widget-results-item {
39
23
  padding: 0.25em;
40
24
  white-space: nowrap;
41
25
  overflow: hidden;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "qwc2",
3
- "version": "2025.12.15",
3
+ "version": "2025.12.17",
4
4
  "description": "QGIS Web Client",
5
5
  "author": "Sourcepole AG",
6
6
  "license": "BSD-2-Clause",
@@ -124,7 +124,8 @@ var HeightProfilePrintDialog_ = /*#__PURE__*/function (_React$PureComponent) {
124
124
  strokeWidth: 4,
125
125
  strokeDash: [],
126
126
  headmarker: _this.props.measurement.lineHeadMarker,
127
- tailmarker: _this.props.measurement.lineTailMarker
127
+ tailmarker: _this.props.measurement.lineTailMarker,
128
+ markerscale: _this.props.measurement.markerScale
128
129
  },
129
130
  properties: {
130
131
  segment_labels: measurement.segment_lengths.map(function (length) {
@@ -147,6 +148,8 @@ var HeightProfilePrintDialog_ = /*#__PURE__*/function (_React$PureComponent) {
147
148
  REQUEST: 'GetMap',
148
149
  TRANSPARENT: 'true',
149
150
  TILED: 'false',
151
+ filename: 'heightprofile.png',
152
+ // To make the ogc-service treat this as a raster export
150
153
  CRS: _this.props.map.projection,
151
154
  BBOX: bounds,
152
155
  WIDTH: _this.props.map.size.width,
@@ -415,6 +415,7 @@ var Identify = /*#__PURE__*/function (_React$Component) {
415
415
  longAttributesDisplay: this.props.longAttributesDisplay,
416
416
  replaceImageUrls: this.props.replaceImageUrls,
417
417
  resultDisplayMode: this.props.resultDisplayMode,
418
+ resultGridSize: this.props.resultGridSize,
418
419
  showLayerSelector: this.props.showLayerSelector
419
420
  });
420
421
  }
@@ -507,6 +508,8 @@ _defineProperty(Identify, "propTypes", {
507
508
  replaceImageUrls: PropTypes.bool,
508
509
  /** Result display mode, one of `tree`, `flat`, `paginated`. */
509
510
  resultDisplayMode: PropTypes.string,
511
+ /** Target cell size of the result grid in comparison mode. */
512
+ resultGridSize: PropTypes.number,
510
513
  selection: PropTypes.object,
511
514
  setCurrentTask: PropTypes.func,
512
515
  /** Whether to show a layer selector to filter the identify results by layer. */
@@ -522,6 +525,7 @@ _defineProperty(Identify, "defaultProps", {
522
525
  customExporters: [],
523
526
  longAttributesDisplay: 'ellipsis',
524
527
  resultDisplayMode: 'flat',
528
+ resultGridSize: 200,
525
529
  replaceImageUrls: true,
526
530
  featureInfoReturnsLayerName: true,
527
531
  geometry: {
@@ -441,7 +441,8 @@ var LayerTree = /*#__PURE__*/function (_React$Component) {
441
441
  icon: "tree",
442
442
  onClick: function onClick() {
443
443
  return _this.props.changeLayerProperty(layer.id, "visibility", subtreevisibility !== 1, path, "children");
444
- }
444
+ },
445
+ title: LocaleUtils.tr("layertree.togglegroup")
445
446
  });
446
447
  }
447
448
  var infoButton = null;
@@ -689,18 +690,21 @@ var LayerTree = /*#__PURE__*/function (_React$Component) {
689
690
  }), _this.state.visibilityMenu ? /*#__PURE__*/React.createElement(PopupMenu, {
690
691
  anchor: _this.visibilityButton,
691
692
  className: "layertree-visibility-menu",
693
+ keepMenuOpen: true,
692
694
  onClose: function onClose() {
693
695
  return _this.setState({
694
696
  visibilityMenu: false
695
697
  });
696
698
  }
697
699
  }, _this.props.showToggleAllLayersCheckbox ? /*#__PURE__*/React.createElement("div", {
700
+ key: "hidealllayers",
698
701
  onClick: function onClick() {
699
702
  return _this.toggleLayerTreeVisibility(vis === 0);
700
703
  }
701
704
  }, /*#__PURE__*/React.createElement(Icon, {
702
705
  icon: vis === 0 ? "checked" : "unchecked"
703
706
  }), " ", LocaleUtils.tr("layertree.hidealllayers")) : null, _this.props.enableVisibleFilter ? /*#__PURE__*/React.createElement("div", {
707
+ key: "filtervisible",
704
708
  onClick: function onClick() {
705
709
  return _this.setState(function (state) {
706
710
  return {
@@ -52,7 +52,8 @@ var Measure = /*#__PURE__*/function (_React$Component) {
52
52
  bearingHeadMarker: _this.props.bearingHeadMarker,
53
53
  bearingTailMarker: _this.props.bearingTailMarker,
54
54
  lineHeadMarker: _this.props.lineHeadMarker,
55
- lineTailMarker: _this.props.lineTailMarker
55
+ lineTailMarker: _this.props.lineTailMarker,
56
+ markerScale: _this.props.markerScale
56
57
  });
57
58
  _this.props.setSnappingConfig(_this.props.snapping, _this.props.snappingActive);
58
59
  });
@@ -199,6 +200,8 @@ _defineProperty(Measure, "propTypes", {
199
200
  /** Tail marker of distance line measurement geometry. Can be one of `OUTARROW`, `INARROW`, `LINE`. */
200
201
  lineTailMarker: PropTypes.string,
201
202
  mapCrs: PropTypes.string,
203
+ /** Scale factor for all heade/tail markers. */
204
+ markerScale: PropTypes.number,
202
205
  measureState: PropTypes.object,
203
206
  setSnappingConfig: PropTypes.func,
204
207
  /** Whether to show the widget to switch between measure modes. */
@@ -210,6 +213,7 @@ _defineProperty(Measure, "propTypes", {
210
213
  snappingActive: PropTypes.oneOfType([PropTypes.bool, PropTypes.string])
211
214
  });
212
215
  _defineProperty(Measure, "defaultProps", {
216
+ markerScale: 1,
213
217
  showMeasureModeSwitcher: true,
214
218
  snapping: true,
215
219
  snappingActive: true
package/plugins/Print.js CHANGED
@@ -1196,7 +1196,7 @@ _defineProperty(Print, "propTypes", {
1196
1196
  printExternalLayers: PropTypes.bool,
1197
1197
  /** Whether to print highlights on the map, e.g. selected features or redlining. */
1198
1198
  printMapHighlights: PropTypes.bool,
1199
- /** Restrict print scale to list of predefine print scales, if any. */
1199
+ /** Restrict print scale to list of predefined print scales, if any. */
1200
1200
  restrictToPrintScales: PropTypes.bool,
1201
1201
  /** Scale factor to apply to line widths, font sizes, ... of redlining drawings passed to GetPrint. */
1202
1202
  scaleFactor: PropTypes.number,
package/plugins/TopBar.js CHANGED
@@ -243,6 +243,8 @@ _defineProperty(TopBar, "propTypes", {
243
243
  searchOptions: PropTypes.shape({
244
244
  /** Whether to show the search filter widget. */
245
245
  allowSearchFilters: PropTypes.bool,
246
+ /** Whether to focus the search field on startup. */
247
+ focusOnStartup: PropTypes.bool,
246
248
  /** Whether to hide the result labels on the map. */
247
249
  hideResultLabels: PropTypes.bool,
248
250
  /** The style used for highlighting search result geometries. */
@@ -179,6 +179,7 @@ var MeasurementSupport = /*#__PURE__*/function (_React$Component) {
179
179
  opts.headmarker = _this.props.measurement.bearingHeadMarker;
180
180
  opts.tailmarker = _this.props.measurement.bearingTailMarker;
181
181
  }
182
+ opts.markerscale = _this.props.measurement.markerScale;
182
183
  return [].concat(_toConsumableArray(FeatureStyles.measureInteraction(feature, opts)), [FeatureStyles.measureInteractionVertex({
183
184
  geometryFunction: geometryFunction
184
185
  })]);
@@ -181,7 +181,7 @@ var RedliningSupport = /*#__PURE__*/function (_React$Component) {
181
181
  var isText = feature.get("shape") === "Text";
182
182
  var styleName = isText ? "text" : "default";
183
183
  var opts = _this.styleOptions(styleProps, isText);
184
- if (!feature.get('measurements')) {
184
+ if (!feature.get('measurements') && _this.selectedFeatures.length <= 1 && !(isText && !styleProps.text)) {
185
185
  feature.set('label', styleProps.text);
186
186
  }
187
187
  feature.set('styleName', styleName);
@@ -559,7 +559,6 @@ var RedliningSupport = /*#__PURE__*/function (_React$Component) {
559
559
  cloneIds.push(featureObj.id);
560
560
  return featureObj;
561
561
  });
562
- _this.updateRedliningState(true);
563
562
  var layer = {
564
563
  id: _this.props.redlining.layer,
565
564
  title: _this.props.redlining.layerTitle,
@@ -570,7 +569,7 @@ var RedliningSupport = /*#__PURE__*/function (_React$Component) {
570
569
  var features = cloneIds.map(function (id) {
571
570
  return l.getSource().getFeatureById(id);
572
571
  });
573
- _this.selectFeatures(features);
572
+ _this.selectFeatures(features, false);
574
573
  while (_this.interactions.length > 0) {
575
574
  _this.props.map.removeInteraction(_this.interactions.shift());
576
575
  }
@@ -606,13 +605,16 @@ var RedliningSupport = /*#__PURE__*/function (_React$Component) {
606
605
  }
607
606
  });
608
607
  _defineProperty(_this, "selectFeatures", function (features) {
608
+ var updateState = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
609
609
  var firstSelection = isEmpty(_this.selectedFeatures);
610
610
  features.forEach(function (feature) {
611
611
  feature.setStyle(_this.styleFunction);
612
612
  feature.on('change', _this.updateMeasurements);
613
613
  _this.selectedFeatures.push(feature);
614
614
  });
615
- _this.updateRedliningState(firstSelection);
615
+ if (updateState) {
616
+ _this.updateRedliningState(firstSelection);
617
+ }
616
618
  });
617
619
  _defineProperty(_this, "deselectFeature", function (feature, updateState) {
618
620
  var styleName = feature.get("shape") === "Text" ? "text" : "default";
@@ -655,7 +657,7 @@ var RedliningSupport = /*#__PURE__*/function (_React$Component) {
655
657
  return featureObj;
656
658
  }).filter(Boolean);
657
659
  if (isEmpty(featureObjects)) {
658
- return null;
660
+ return [];
659
661
  }
660
662
  var layer = {
661
663
  id: redliningProps.layer,
@@ -1,10 +1,9 @@
1
1
  function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
2
2
  function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); }
3
3
  function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
4
+ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
4
5
  function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); }
5
6
  function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); }
6
- function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
7
- function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
8
7
  function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
9
8
  function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
10
9
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
@@ -175,20 +174,12 @@ export default function layers() {
175
174
  // Compress layers if possible
176
175
  _newLayers2 = LayerUtils.implodeLayers(LayerUtils.explodeLayers(_newLayers2));
177
176
  }
178
- var _iterator = _createForOfIteratorHelper(_newLayers2),
179
- _step;
180
- try {
181
- for (_iterator.s(); !(_step = _iterator.n()).done;) {
182
- var lyr = _step.value;
183
- if (lyr.type === "wms") {
184
- Object.assign(lyr, LayerUtils.buildWMSLayerParams(lyr, state.filter));
185
- }
177
+ _newLayers2 = _newLayers2.map(function (layer) {
178
+ if (layer.type === "wms") {
179
+ return _objectSpread(_objectSpread({}, layer), LayerUtils.buildWMSLayerParams(layer, state.filter));
186
180
  }
187
- } catch (err) {
188
- _iterator.e(err);
189
- } finally {
190
- _iterator.f();
191
- }
181
+ return layer;
182
+ });
192
183
  UrlParams.updateParams({
193
184
  l: LayerUtils.buildWMSLayerUrlParam(_newLayers2)
194
185
  });
@@ -208,21 +199,12 @@ export default function layers() {
208
199
  }
209
200
  case ADD_LAYER_SEPARATOR:
210
201
  {
211
- var _newLayers3 = LayerUtils.insertSeparator(state.flat, action.title, action.afterLayerId, action.afterSublayerPath);
212
- var _iterator2 = _createForOfIteratorHelper(_newLayers3),
213
- _step2;
214
- try {
215
- for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
216
- var layer = _step2.value;
217
- if (layer.type === "wms") {
218
- Object.assign(layer, LayerUtils.buildWMSLayerParams(layer, state.filter));
219
- }
202
+ var _newLayers3 = LayerUtils.insertSeparator(state.flat, action.title, action.afterLayerId, action.afterSublayerPath).map(function (layer) {
203
+ if (layer.type === "wms") {
204
+ return _objectSpread(_objectSpread({}, layer), LayerUtils.buildWMSLayerParams(layer, state.filter));
220
205
  }
221
- } catch (err) {
222
- _iterator2.e(err);
223
- } finally {
224
- _iterator2.f();
225
- }
206
+ return layer;
207
+ });
226
208
  UrlParams.updateParams({
227
209
  l: LayerUtils.buildWMSLayerUrlParam(_newLayers3)
228
210
  });
@@ -232,30 +214,30 @@ export default function layers() {
232
214
  }
233
215
  case REMOVE_LAYER:
234
216
  {
235
- var _layer = state.flat.find(function (l) {
217
+ var layer = state.flat.find(function (l) {
236
218
  return l.id === action.layerId;
237
219
  });
238
- if (!_layer) {
220
+ if (!layer) {
239
221
  return state;
240
222
  }
241
223
  var _newLayers4 = state.flat;
242
224
  var _newEditConfigs = state.editConfigs;
243
- if (_layer.role === LayerRole.BACKGROUND || isEmpty(action.sublayerpath)) {
225
+ if (layer.role === LayerRole.BACKGROUND || isEmpty(action.sublayerpath)) {
244
226
  var position = state.flat.findIndex(function (l) {
245
227
  return l.id === action.layerId;
246
228
  });
247
229
  _newLayers4 = _toConsumableArray(_newLayers4);
248
230
  _newLayers4.splice(position, 1);
249
- if (position > 0 && position < _newLayers4.length && _newLayers4[position - 1].id === _newLayers4[position].id) {
231
+ if (position > 0 && position < _newLayers4.length && _newLayers4[position - 1].url && _newLayers4[position - 1].url === _newLayers4[position].url) {
250
232
  // Compress layers
251
233
  _newLayers4 = LayerUtils.implodeLayers(LayerUtils.explodeLayers(_newLayers4));
252
234
  }
253
- if (_newEditConfigs[_layer.wms_name]) {
235
+ if (_newEditConfigs[layer.wms_name]) {
254
236
  _newEditConfigs = _objectSpread({}, _newEditConfigs);
255
- delete _newEditConfigs[_layer.wms_name];
237
+ delete _newEditConfigs[layer.wms_name];
256
238
  }
257
239
  } else {
258
- _newLayers4 = LayerUtils.removeLayer(state.flat, _layer, action.sublayerpath).map(function (l) {
240
+ _newLayers4 = LayerUtils.removeLayer(state.flat, layer, action.sublayerpath).map(function (l) {
259
241
  if (l.type === "wms") {
260
242
  return _objectSpread(_objectSpread({}, l), LayerUtils.buildWMSLayerParams(l, state.filter));
261
243
  } else {
@@ -39,7 +39,8 @@ export default function measurement() {
39
39
  bearingHeadMarker: state.bearingHeadMarker,
40
40
  bearingTailMarker: state.bearingTailMarker,
41
41
  lineHeadMarker: state.lineHeadMarker,
42
- lineTailMarker: state.lineTailMarker
42
+ lineTailMarker: state.lineTailMarker,
43
+ markerScale: state.markerScale
43
44
  }, action.data);
44
45
  }
45
46
  default:
@@ -126,7 +126,7 @@ if not styleIdentifier:
126
126
  break
127
127
 
128
128
  # Resource URL
129
- tileUrl = None
129
+ tileUrl = capabilitiesUrl.split("?")[0]
130
130
  for resourceURL in targetLayer.getElementsByTagName("ResourceURL"):
131
131
  if resourceURL.getAttribute("resourceType") == "tile":
132
132
  tileUrl = resourceURL.getAttribute("template")
@@ -268,11 +268,13 @@
268
268
  "featurecount": "",
269
269
  "layerall": "Всички слоеве",
270
270
  "link": "Връзка към",
271
+ "multiview": "",
271
272
  "noattributes": "Без атрибути",
272
273
  "noresults": "Няма налична информация за избраната точка",
273
274
  "querying": "Запитване...",
274
275
  "reportfail": "Неуспешно генериране на отчет",
275
276
  "results": "",
277
+ "selectforcompare": "",
276
278
  "selectreport": "",
277
279
  "title": "Информация за функциите"
278
280
  },
@@ -331,6 +333,7 @@
331
333
  "printlegend": "Легенда за печат",
332
334
  "separator": "Сепаратор",
333
335
  "separatortooltip": "Добавяне на разделител",
336
+ "togglegroup": "",
334
337
  "transparency": "Trasparency",
335
338
  "visiblefilter": "Филтриране на невидими слоеве",
336
339
  "zoomtolayer": "Увеличаване на слоя"
@@ -446,7 +449,9 @@
446
449
  "ctrlclickhint": "Отваряне с Ctrl+Click"
447
450
  },
448
451
  "navbar": {
449
- "perpage": "на страница"
452
+ "next": "",
453
+ "perpage": "на страница",
454
+ "prev": ""
450
455
  },
451
456
  "newspopup": {
452
457
  "dialogclose": "Затвори",
@@ -268,11 +268,13 @@
268
268
  "featurecount": "{0} element(s)",
269
269
  "layerall": "Totes les capes",
270
270
  "link": "Link",
271
+ "multiview": "",
271
272
  "noattributes": "Sense atributs",
272
273
  "noresults": "Sense informació disponible sobre el punt seleccionat",
273
274
  "querying": "Consultant...",
274
275
  "reportfail": "No s'ha pogut generar l'informe",
275
276
  "results": "Resultats",
277
+ "selectforcompare": "",
276
278
  "selectreport": "Seleccionar informe...",
277
279
  "title": "Informació del element"
278
280
  },
@@ -331,6 +333,7 @@
331
333
  "printlegend": "Imprimir llegenda",
332
334
  "separator": "Separador",
333
335
  "separatortooltip": "Afegir separador",
336
+ "togglegroup": "",
334
337
  "transparency": "Transparència",
335
338
  "visiblefilter": "Filtrar capes no visibles",
336
339
  "zoomtolayer": "Zoom a la capa"
@@ -446,7 +449,9 @@
446
449
  "ctrlclickhint": "Obrir amb Ctrl+Click"
447
450
  },
448
451
  "navbar": {
449
- "perpage": "per pàgina"
452
+ "next": "",
453
+ "perpage": "per pàgina",
454
+ "prev": ""
450
455
  },
451
456
  "newspopup": {
452
457
  "dialogclose": "Tancar",
@@ -268,11 +268,13 @@
268
268
  "featurecount": "",
269
269
  "layerall": "",
270
270
  "link": "Odkaz",
271
+ "multiview": "",
271
272
  "noattributes": "Bez atributů",
272
273
  "noresults": "V tomto bodu nejsou k dispozici informace o žádném prvku",
273
274
  "querying": "Dotazování...",
274
275
  "reportfail": "",
275
276
  "results": "",
277
+ "selectforcompare": "",
276
278
  "selectreport": "",
277
279
  "title": "Informace o prvku"
278
280
  },
@@ -331,6 +333,7 @@
331
333
  "printlegend": "Tisk legendy",
332
334
  "separator": "",
333
335
  "separatortooltip": "",
336
+ "togglegroup": "",
334
337
  "transparency": "Průhlednost",
335
338
  "visiblefilter": "Skrýt nezobrazující se vrstvy",
336
339
  "zoomtolayer": "Vycentrovat na vrstvu"
@@ -446,7 +449,9 @@
446
449
  "ctrlclickhint": ""
447
450
  },
448
451
  "navbar": {
449
- "perpage": "na stránku"
452
+ "next": "",
453
+ "perpage": "na stránku",
454
+ "prev": ""
450
455
  },
451
456
  "newspopup": {
452
457
  "dialogclose": "Zavřít",