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
@@ -290,12 +290,12 @@ var MapFilter = /*#__PURE__*/function (_React$Component) {
290
290
  var commitButtons = [{
291
291
  key: 'Save',
292
292
  icon: 'ok',
293
- label: LocaleUtils.tr("mapfilter.save"),
293
+ label: LocaleUtils.tr("common.save"),
294
294
  extraClasses: "button-accept"
295
295
  }, {
296
296
  key: 'Cancel',
297
297
  icon: 'remove',
298
- label: LocaleUtils.tr("mapfilter.cancel"),
298
+ label: LocaleUtils.tr("common.cancel"),
299
299
  extraClasses: "button-reject"
300
300
  }];
301
301
  var sampleFilters = '["field", "=", "val"]\n' + '[["field", ">", "val1"], "and", ["field", "<", "val2"]]';
@@ -389,7 +389,7 @@ var MapFilter = /*#__PURE__*/function (_React$Component) {
389
389
  value: _this.state.filters[config.id].values[field.id]
390
390
  }, !field.defaultValue ? /*#__PURE__*/React.createElement("option", {
391
391
  value: ""
392
- }, LocaleUtils.tr("mapfilter.select")) : null, field.inputConfig.options.map(function (entry) {
392
+ }, LocaleUtils.tr("common.select")) : null, field.inputConfig.options.map(function (entry) {
393
393
  var _entry$value, _entry$value2, _entry$label;
394
394
  return /*#__PURE__*/React.createElement("option", {
395
395
  key: (_entry$value = entry.value) !== null && _entry$value !== void 0 ? _entry$value : entry,
@@ -483,7 +483,7 @@ var MapFilter = /*#__PURE__*/function (_React$Component) {
483
483
  onChange: function onChange(value) {
484
484
  return _this.updateCustomFilter(key, 'layer', value);
485
485
  },
486
- placeholder: LocaleUtils.tr("mapfilter.selectlayer"),
486
+ placeholder: LocaleUtils.tr("common.selectlayer"),
487
487
  value: entry.layer
488
488
  }, layerNames.map(function (layerName) {
489
489
  return /*#__PURE__*/React.createElement("div", {
@@ -518,19 +518,19 @@ var MapFilter = /*#__PURE__*/function (_React$Component) {
518
518
  var geomFilter = _this.state.geomFilter;
519
519
  var filterButtons = [{
520
520
  key: "Polygon",
521
- tooltip: LocaleUtils.tr("redlining.polygon"),
521
+ tooltip: LocaleUtils.tr("common.polygon"),
522
522
  icon: "polygon",
523
- label: LocaleUtils.tr("redlining.polygon")
523
+ label: LocaleUtils.tr("common.polygon")
524
524
  }, {
525
525
  key: "Circle",
526
- tooltip: LocaleUtils.tr("redlining.circle"),
526
+ tooltip: LocaleUtils.tr("common.circle"),
527
527
  icon: "circle",
528
- label: LocaleUtils.tr("redlining.circle")
528
+ label: LocaleUtils.tr("common.circle")
529
529
  }, {
530
530
  key: "Pick",
531
- tooltip: LocaleUtils.tr("redlining.pick"),
531
+ tooltip: LocaleUtils.tr("common.pick"),
532
532
  icon: "pick",
533
- label: LocaleUtils.tr("redlining.pick")
533
+ label: LocaleUtils.tr("common.pick")
534
534
  }];
535
535
  var active = geomFilter.picking ? "Pick" : geomFilter.geomType || "";
536
536
  return /*#__PURE__*/React.createElement("div", {
@@ -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
@@ -57,7 +57,7 @@ var NewsPopup = /*#__PURE__*/function (_React$Component) {
57
57
  className: "newspopup-dialog-popup-buttonbar"
58
58
  }, /*#__PURE__*/React.createElement("button", {
59
59
  onClick: _this.closeDialog
60
- }, LocaleUtils.tr("newspopup.dialogclose")), /*#__PURE__*/React.createElement("label", null, /*#__PURE__*/React.createElement("input", {
60
+ }, LocaleUtils.tr("common.close")), /*#__PURE__*/React.createElement("label", null, /*#__PURE__*/React.createElement("input", {
61
61
  onChange: function onChange(ev) {
62
62
  return _this.setState({
63
63
  dontShowAgain: ev.target.checked
@@ -23,14 +23,17 @@ function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e
23
23
  import React from 'react';
24
24
  import { connect } from 'react-redux';
25
25
  import axios from 'axios';
26
+ import isEqual from 'lodash.isequal';
26
27
  import ol from 'openlayers';
27
28
  import PropTypes from 'prop-types';
29
+ import { zoomToExtent } from '../actions/map';
28
30
  import { setCurrentTask } from '../actions/task';
29
31
  import Icon from '../components/Icon';
30
32
  import ResizeableWindow from '../components/ResizeableWindow';
31
33
  import LayerRegistry from '../components/map/layers/index';
32
34
  import InputContainer from '../components/widgets/InputContainer';
33
35
  import ConfigUtils from '../utils/ConfigUtils';
36
+ import CoordinatesUtils from '../utils/CoordinatesUtils';
34
37
  import LayerUtils from '../utils/LayerUtils';
35
38
  import LocaleUtils from '../utils/LocaleUtils';
36
39
  import MapUtils from '../utils/MapUtils';
@@ -116,17 +119,6 @@ var ObliqueView = /*#__PURE__*/function (_React$Component) {
116
119
  _this.setState({
117
120
  currentZoom: zoom
118
121
  });
119
- _this.map.on('moveend', function () {
120
- _this.setState(function (state) {
121
- var newZoom = _this.map.getView().getZoom();
122
- if (newZoom !== state.currentZoom) {
123
- return {
124
- currentZoom: newZoom
125
- };
126
- }
127
- return null;
128
- });
129
- });
130
122
  var layers = [];
131
123
  var themeConfig = _this.props.theme.obliqueDatasets.find(function (entry) {
132
124
  return entry.name === _this.state.selectedDataset;
@@ -198,6 +190,33 @@ var ObliqueView = /*#__PURE__*/function (_React$Component) {
198
190
  s: 180
199
191
  }[_this.state.currentDirection];
200
192
  });
193
+ _defineProperty(_this, "sync2DExtent", function () {
194
+ if (!_this.state.datasetConfig) {
195
+ return;
196
+ }
197
+ _this.setState(function (state) {
198
+ var center = CoordinatesUtils.reproject(_this.props.map.center, _this.props.map.projection, state.datasetConfig.crs);
199
+ var resolution = MapUtils.computeForZoom(_this.props.map.resolutions, _this.props.map.zoom);
200
+ _this.map.getView().setCenter(center);
201
+ _this.map.getView().setResolution(resolution);
202
+ return {
203
+ currentCenter: center,
204
+ currentZoom: _this.map.getView().getZoom()
205
+ };
206
+ });
207
+ });
208
+ _defineProperty(_this, "trackFocus", function (ev) {
209
+ var _this$map, _this$map$getTargetEl, _mapEl$contains, _mapObliqueEl$contain;
210
+ var mapEl = document.getElementById("map");
211
+ var mapObliqueEl = (_this$map = _this.map) === null || _this$map === void 0 || (_this$map$getTargetEl = _this$map.getTargetElement) === null || _this$map$getTargetEl === void 0 ? void 0 : _this$map$getTargetEl.call(_this$map);
212
+ if (mapEl !== null && mapEl !== void 0 && (_mapEl$contains = mapEl.contains) !== null && _mapEl$contains !== void 0 && _mapEl$contains.call(mapEl, document.activeElement)) {
213
+ _this.focusedMap = "map";
214
+ } else if (mapObliqueEl !== null && mapObliqueEl !== void 0 && (_mapObliqueEl$contain = mapObliqueEl.contains) !== null && _mapObliqueEl$contain !== void 0 && _mapObliqueEl$contain.call(mapObliqueEl, document.activeElement)) {
215
+ _this.focusedMap = "mapOblique";
216
+ } else {
217
+ _this.focusedMap = null;
218
+ }
219
+ });
201
220
  var controls = ol.control.defaults({
202
221
  zoom: false,
203
222
  attribution: false,
@@ -210,15 +229,39 @@ var ObliqueView = /*#__PURE__*/function (_React$Component) {
210
229
  controls: controls,
211
230
  interactions: interactions
212
231
  });
213
- _this.map.on('moveend', _this.searchClosestImage);
214
232
  _this.map.on('rotateend', _this.searchClosestImage);
233
+ _this.map.on('moveend', function () {
234
+ _this.searchClosestImage();
235
+ _this.setState(function (state) {
236
+ var newZoom = _this.map.getView().getZoom();
237
+ var newCenter = _this.map.getView().getCenter();
238
+ if (newZoom !== state.currentZoom || !isEqual(newCenter, state.currentCenter)) {
239
+ return {
240
+ currentZoom: newZoom,
241
+ currentCenter: newCenter
242
+ };
243
+ }
244
+ return null;
245
+ });
246
+ });
215
247
  _this.closestImage = null;
216
248
  _this.obliqueImageryLayer = null;
217
249
  _this.state = ObliqueView.defaultState;
250
+ _this.focusedMap = null;
218
251
  return _this;
219
252
  }
220
253
  _inherits(ObliqueView, _React$Component);
221
254
  return _createClass(ObliqueView, [{
255
+ key: "componentDidMount",
256
+ value: function componentDidMount() {
257
+ window.addEventListener('focus', this.trackFocus, true);
258
+ }
259
+ }, {
260
+ key: "componentWillUnmount",
261
+ value: function componentWillUnmount() {
262
+ window.removeEventListener('focus', this.trackFocus);
263
+ }
264
+ }, {
222
265
  key: "componentDidUpdate",
223
266
  value: function componentDidUpdate(prevProps, prevState) {
224
267
  if (this.props.active && !prevProps.active) {
@@ -256,6 +299,13 @@ var ObliqueView = /*#__PURE__*/function (_React$Component) {
256
299
  var _this$map$getView2, _this$map$getView2$se;
257
300
  (_this$map$getView2 = this.map.getView()) === null || _this$map$getView2 === void 0 || (_this$map$getView2$se = _this$map$getView2.setZoom) === null || _this$map$getView2$se === void 0 || _this$map$getView2$se.call(_this$map$getView2, this.state.currentZoom);
258
301
  }
302
+ if (this.state.viewsLocked && this.state.datasetConfig) {
303
+ if (this.focusedMap === "map" && this.props.map.bbox !== prevProps.map.bbox) {
304
+ this.sync2DExtent();
305
+ } else if (this.focusedMap === "mapOblique" && (this.state.currentCenter !== prevState.currentCenter || this.state.currentZoom !== prevState.currentZoom)) {
306
+ this.props.zoomToExtent(this.map.getView().calculateExtent(), this.state.datasetConfig.crs);
307
+ }
308
+ }
259
309
  }
260
310
  }, {
261
311
  key: "render",
@@ -265,8 +315,25 @@ var ObliqueView = /*#__PURE__*/function (_React$Component) {
265
315
  return null;
266
316
  }
267
317
  var rot = this.getRotation();
318
+ var extraControls = [{
319
+ icon: "sync",
320
+ callback: this.sync2DExtent,
321
+ title: LocaleUtils.tr("common.sync2dview")
322
+ }, {
323
+ icon: "lock",
324
+ callback: function callback() {
325
+ return _this2.setState(function (state) {
326
+ return {
327
+ viewsLocked: !state.viewsLocked
328
+ };
329
+ });
330
+ },
331
+ title: LocaleUtils.tr("common.lock2dview"),
332
+ active: this.state.viewsLocked
333
+ }];
268
334
  return /*#__PURE__*/React.createElement(ResizeableWindow, {
269
335
  dockable: this.props.geometry.side,
336
+ extraControls: extraControls,
270
337
  icon: "oblique",
271
338
  initialHeight: this.props.geometry.initialHeight,
272
339
  initialWidth: this.props.geometry.initialWidth,
@@ -371,13 +438,14 @@ _defineProperty(ObliqueView, "propTypes", {
371
438
  }),
372
439
  /** The initial map scale. */
373
440
  initialScale: PropTypes.number,
374
- mapBbox: PropTypes.object,
441
+ map: PropTypes.object,
375
442
  projection: PropTypes.string,
376
443
  /** A list of allowed map scales, in decreasing order. */
377
444
  scales: PropTypes.arrayOf(PropTypes.number),
378
445
  setCurrentTask: PropTypes.func,
379
446
  theme: PropTypes.object,
380
- themes: PropTypes.object
447
+ themes: PropTypes.object,
448
+ zoomToExtent: PropTypes.func
381
449
  });
382
450
  _defineProperty(ObliqueView, "defaultProps", {
383
451
  geometry: {
@@ -396,15 +464,18 @@ _defineProperty(ObliqueView, "defaultState", {
396
464
  selectedDataset: null,
397
465
  datasetConfig: null,
398
466
  currentDirection: null,
399
- currentZoom: 0
467
+ currentZoom: 0,
468
+ currentCenter: null,
469
+ viewsLocked: false
400
470
  });
401
471
  export default connect(function (state) {
402
472
  return {
403
473
  active: state.task.id === "ObliqueView",
404
- mapBbox: state.map.bbox,
474
+ map: state.map,
405
475
  theme: state.theme.current,
406
476
  themes: state.theme.themes
407
477
  };
408
478
  }, {
409
- setCurrentTask: setCurrentTask
479
+ setCurrentTask: setCurrentTask,
480
+ zoomToExtent: zoomToExtent
410
481
  })(ObliqueView);
package/plugins/Print.js CHANGED
@@ -255,7 +255,7 @@ var Print = /*#__PURE__*/function (_React$Component) {
255
255
  key: item.name,
256
256
  value: item.name
257
257
  }, _this.translateLayoutName(item));
258
- })))), _this.props.formats.length > 1 ? /*#__PURE__*/React.createElement("tr", null, /*#__PURE__*/React.createElement("td", null, LocaleUtils.tr("print.format")), /*#__PURE__*/React.createElement("td", null, /*#__PURE__*/React.createElement("select", {
258
+ })))), _this.props.formats.length > 1 ? /*#__PURE__*/React.createElement("tr", null, /*#__PURE__*/React.createElement("td", null, LocaleUtils.tr("common.format")), /*#__PURE__*/React.createElement("td", null, /*#__PURE__*/React.createElement("select", {
259
259
  disabled: _this.state.printSeriesEnabled,
260
260
  name: "FORMAT",
261
261
  onChange: _this.formatChanged,
@@ -287,7 +287,7 @@ var Print = /*#__PURE__*/function (_React$Component) {
287
287
  disabled: true,
288
288
  placeholder: LocaleUtils.tr("print.pickatlasfeature", _this.state.layout.atlasCoverageLayer),
289
289
  type: "text"
290
- }))) : null, isEmpty(_this.state.atlasFeatures) ? /*#__PURE__*/React.createElement("tr", null, /*#__PURE__*/React.createElement("td", null, LocaleUtils.tr("print.scale")), /*#__PURE__*/React.createElement("td", null, scaleChooser)) : null, resolutionChooser ? /*#__PURE__*/React.createElement("tr", null, /*#__PURE__*/React.createElement("td", null, LocaleUtils.tr("print.resolution")), /*#__PURE__*/React.createElement("td", null, resolutionChooser)) : null, _this.props.displayRotation ? /*#__PURE__*/React.createElement("tr", null, /*#__PURE__*/React.createElement("td", null, LocaleUtils.tr("print.rotation")), /*#__PURE__*/React.createElement("td", null, /*#__PURE__*/React.createElement(InputContainer, null, /*#__PURE__*/React.createElement(NumberInput, {
290
+ }))) : null, isEmpty(_this.state.atlasFeatures) ? /*#__PURE__*/React.createElement("tr", null, /*#__PURE__*/React.createElement("td", null, LocaleUtils.tr("print.scale")), /*#__PURE__*/React.createElement("td", null, scaleChooser)) : null, resolutionChooser ? /*#__PURE__*/React.createElement("tr", null, /*#__PURE__*/React.createElement("td", null, LocaleUtils.tr("common.resolution")), /*#__PURE__*/React.createElement("td", null, resolutionChooser)) : null, _this.props.displayRotation ? /*#__PURE__*/React.createElement("tr", null, /*#__PURE__*/React.createElement("td", null, LocaleUtils.tr("print.rotation")), /*#__PURE__*/React.createElement("td", null, /*#__PURE__*/React.createElement(InputContainer, null, /*#__PURE__*/React.createElement(NumberInput, {
291
291
  decimals: 1,
292
292
  mobile: true,
293
293
  name: mapName + ":rotation",
@@ -338,7 +338,7 @@ var Print = /*#__PURE__*/function (_React$Component) {
338
338
  value: _this.state.printSeriesOverlap
339
339
  }), /*#__PURE__*/React.createElement("span", {
340
340
  role: "suffix"
341
- }, _this.state.printSeriesOverlap, "\xA0%")))) : null, !_this.props.inlinePrintOutput && _this.state.printSeriesEnabled ? /*#__PURE__*/React.createElement("tr", null, /*#__PURE__*/React.createElement("td", null, LocaleUtils.tr("print.download")), /*#__PURE__*/React.createElement("td", null, /*#__PURE__*/React.createElement("select", {
341
+ }, _this.state.printSeriesOverlap, "\xA0%")))) : null, !_this.props.inlinePrintOutput && _this.state.printSeriesEnabled ? /*#__PURE__*/React.createElement("tr", null, /*#__PURE__*/React.createElement("td", null, LocaleUtils.tr("common.download")), /*#__PURE__*/React.createElement("td", null, /*#__PURE__*/React.createElement("select", {
342
342
  onChange: _this.changeDownloadMode,
343
343
  role: "input",
344
344
  value: _this.state.downloadMode || ""
@@ -426,7 +426,7 @@ var Print = /*#__PURE__*/function (_React$Component) {
426
426
  type: "submit"
427
427
  }, _this.state.printing ? /*#__PURE__*/React.createElement("span", {
428
428
  className: "print-wait"
429
- }, /*#__PURE__*/React.createElement(Spinner, null), " ", LocaleUtils.tr("print.wait")) : LocaleUtils.tr("print.submit")))));
429
+ }, /*#__PURE__*/React.createElement(Spinner, null), " ", LocaleUtils.tr("common.wait")) : LocaleUtils.tr("print.submit")))));
430
430
  });
431
431
  _defineProperty(_this, "renderPrintLabelField", function (label, opts) {
432
432
  var defaultValue = opts.defaultValue || "";
@@ -562,7 +562,7 @@ var Print = /*#__PURE__*/function (_React$Component) {
562
562
  _defineProperty(_this, "renderPrintOutputWindow", function () {
563
563
  var extraControls = [{
564
564
  icon: 'save',
565
- title: LocaleUtils.tr('print.save'),
565
+ title: LocaleUtils.tr('common.save'),
566
566
  callback: _this.savePrintOutput
567
567
  }];
568
568
  return /*#__PURE__*/React.createElement(ResizeableWindow, {
@@ -585,7 +585,7 @@ var Print = /*#__PURE__*/function (_React$Component) {
585
585
  className: "print-output-window-body"
586
586
  }, !_this.state.outputLoaded ? /*#__PURE__*/React.createElement("span", {
587
587
  className: "print-output-window-wait"
588
- }, /*#__PURE__*/React.createElement(Spinner, null), " ", LocaleUtils.tr("print.wait")) : null, /*#__PURE__*/React.createElement("iframe", {
588
+ }, /*#__PURE__*/React.createElement(Spinner, null), " ", LocaleUtils.tr("common.wait")) : null, /*#__PURE__*/React.createElement("iframe", {
589
589
  name: "print-output-window",
590
590
  src: _this.state.pdfDataUrl
591
591
  })));
@@ -844,7 +844,7 @@ var Print = /*#__PURE__*/function (_React$Component) {
844
844
  key: "render",
845
845
  value: function render() {
846
846
  var _this3 = this;
847
- var minMaxTooltip = this.state.minimized ? LocaleUtils.tr("print.maximize") : LocaleUtils.tr("print.minimize");
847
+ var minMaxTooltip = this.state.minimized ? LocaleUtils.tr("window.maximize") : LocaleUtils.tr("window.minimize");
848
848
  var extraTitlebarContent = /*#__PURE__*/React.createElement(Icon, {
849
849
  className: "print-minimize-maximize",
850
850
  icon: this.state.minimized ? 'chevron-down' : 'chevron-up',
@@ -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,
@@ -39,6 +39,7 @@ import { LayerRole, addLayer } from '../actions/layers';
39
39
  import { setSnappingConfig } from '../actions/map';
40
40
  import { changeRedliningState, resetRedliningState } from '../actions/redlining';
41
41
  import Icon from '../components/Icon';
42
+ import MeasureSwitcher from '../components/MeasureSwitcher';
42
43
  import TaskBar from '../components/TaskBar';
43
44
  import ButtonBar from '../components/widgets/ButtonBar';
44
45
  import ColorButton from '../components/widgets/ColorButton';
@@ -114,7 +115,7 @@ var Redlining = /*#__PURE__*/function (_React$Component) {
114
115
  var activeButton = _this.props.redlining.action === "Draw" ? _this.props.redlining.geomType : _this.props.redlining.action;
115
116
  var drawButtons = [{
116
117
  key: "Point",
117
- tooltip: LocaleUtils.tr("redlining.point"),
118
+ tooltip: LocaleUtils.tr("common.point"),
118
119
  icon: "point",
119
120
  data: {
120
121
  action: "Draw",
@@ -123,7 +124,7 @@ var Redlining = /*#__PURE__*/function (_React$Component) {
123
124
  }
124
125
  }, {
125
126
  key: "LineString",
126
- tooltip: LocaleUtils.tr("redlining.line"),
127
+ tooltip: LocaleUtils.tr("common.line"),
127
128
  icon: "line",
128
129
  data: {
129
130
  action: "Draw",
@@ -132,7 +133,7 @@ var Redlining = /*#__PURE__*/function (_React$Component) {
132
133
  }
133
134
  }, [{
134
135
  key: "Polygon",
135
- tooltip: LocaleUtils.tr("redlining.polygon"),
136
+ tooltip: LocaleUtils.tr("common.polygon"),
136
137
  icon: "polygon",
137
138
  data: {
138
139
  action: "Draw",
@@ -141,7 +142,7 @@ var Redlining = /*#__PURE__*/function (_React$Component) {
141
142
  }
142
143
  }, toolEnabled("Circle") ? {
143
144
  key: "Circle",
144
- tooltip: LocaleUtils.tr("redlining.circle"),
145
+ tooltip: LocaleUtils.tr("common.circle"),
145
146
  icon: "circle",
146
147
  data: {
147
148
  action: "Draw",
@@ -150,7 +151,7 @@ var Redlining = /*#__PURE__*/function (_React$Component) {
150
151
  }
151
152
  } : null, toolEnabled("Ellipse") ? {
152
153
  key: "Ellipse",
153
- tooltip: LocaleUtils.tr("redlining.ellipse"),
154
+ tooltip: LocaleUtils.tr("common.ellipse"),
154
155
  icon: "ellipse",
155
156
  data: {
156
157
  action: "Draw",
@@ -159,7 +160,7 @@ var Redlining = /*#__PURE__*/function (_React$Component) {
159
160
  }
160
161
  } : null, toolEnabled("Square") ? {
161
162
  key: "Square",
162
- tooltip: LocaleUtils.tr("redlining.square"),
163
+ tooltip: LocaleUtils.tr("common.square"),
163
164
  icon: "box",
164
165
  data: {
165
166
  action: "Draw",
@@ -168,7 +169,7 @@ var Redlining = /*#__PURE__*/function (_React$Component) {
168
169
  }
169
170
  } : null, toolEnabled("Box") ? {
170
171
  key: "Box",
171
- tooltip: LocaleUtils.tr("redlining.rectangle"),
172
+ tooltip: LocaleUtils.tr("common.rectangle"),
172
173
  icon: "rect",
173
174
  data: {
174
175
  action: "Draw",
@@ -177,7 +178,7 @@ var Redlining = /*#__PURE__*/function (_React$Component) {
177
178
  }
178
179
  } : null].filter(Boolean), {
179
180
  key: "Text",
180
- tooltip: LocaleUtils.tr("redlining.text"),
181
+ tooltip: LocaleUtils.tr("common.text"),
181
182
  icon: "text",
182
183
  data: {
183
184
  action: "Draw",
@@ -204,7 +205,7 @@ var Redlining = /*#__PURE__*/function (_React$Component) {
204
205
  }] : [];
205
206
  var editButtons = [{
206
207
  key: "Pick",
207
- tooltip: LocaleUtils.tr("redlining.pick"),
208
+ tooltip: LocaleUtils.tr("common.pick"),
208
209
  icon: "nodetool",
209
210
  data: {
210
211
  action: "Pick",
@@ -222,7 +223,7 @@ var Redlining = /*#__PURE__*/function (_React$Component) {
222
223
  }
223
224
  } : null, toolEnabled("Clone") ? {
224
225
  key: "Clone",
225
- tooltip: LocaleUtils.tr("redlining.clone"),
226
+ tooltip: LocaleUtils.tr("common.clone"),
226
227
  icon: "clone",
227
228
  data: {
228
229
  action: "Clone",
@@ -231,7 +232,7 @@ var Redlining = /*#__PURE__*/function (_React$Component) {
231
232
  disabled: !_this.props.redlining.selectedFeature
232
233
  } : null, {
233
234
  key: "Delete",
234
- tooltip: LocaleUtils.tr("redlining.delete"),
235
+ tooltip: LocaleUtils.tr("common.delete"),
235
236
  icon: "trash",
236
237
  data: {
237
238
  action: "Delete",
@@ -323,7 +324,7 @@ var Redlining = /*#__PURE__*/function (_React$Component) {
323
324
  disabled: !haveLayer,
324
325
  menuIcon: "export",
325
326
  onActivate: _this["export"],
326
- tooltip: LocaleUtils.tr("redlining.export")
327
+ tooltip: LocaleUtils.tr("common.export")
327
328
  }, /*#__PURE__*/React.createElement("div", {
328
329
  className: "redlining-export-menu-entry",
329
330
  key: "GeoJSON",
@@ -341,7 +342,7 @@ var Redlining = /*#__PURE__*/function (_React$Component) {
341
342
  });
342
343
  });
343
344
  _defineProperty(_this, "renderStandardControls", function () {
344
- var sizeLabel = LocaleUtils.tr("redlining.line");
345
+ var sizeLabel = LocaleUtils.tr("common.line");
345
346
  var showDash = true;
346
347
  if (["Text", "Point"].includes(_this.props.redlining.geomType)) {
347
348
  sizeLabel = LocaleUtils.tr("redlining.size");
@@ -491,21 +492,16 @@ var Redlining = /*#__PURE__*/function (_React$Component) {
491
492
  })))) : null, /*#__PURE__*/React.createElement("div", {
492
493
  className: "redlining-control redlining-control-fill"
493
494
  }, /*#__PURE__*/React.createElement("div", {
494
- className: "controlgroup"
495
- }, _this.props.redlining.geomType !== 'Text' && _this.props.allowGeometryLabels ? /*#__PURE__*/React.createElement("button", {
496
- className: "button" + (_this.props.redlining.measurements ? " pressed" : ""),
497
- onClick: function onClick() {
498
- return _this.props.changeRedliningState({
499
- measurements: !_this.props.redlining.measurements,
500
- style: _objectSpread(_objectSpread({}, _this.props.redlining.style), {}, {
501
- text: ''
502
- })
503
- });
495
+ className: "controlgroup" + (_this.props.redlining.showmeasurements ? " redlining-control-fill" : "")
496
+ }, _this.props.redlining.geomType !== 'Text' && _this.props.allowGeometryLabels ? /*#__PURE__*/React.createElement(MeasureSwitcher, {
497
+ changeMeasureState: function changeMeasureState(diff) {
498
+ return _this.props.changeRedliningState(_objectSpread(_objectSpread({}, diff), {}, {
499
+ text: ''
500
+ }));
504
501
  },
505
- title: LocaleUtils.tr("redlining.measurements")
506
- }, /*#__PURE__*/React.createElement(Icon, {
507
- icon: "measure"
508
- })) : null, (_this.props.redlining.geomType === 'Text' || _this.props.allowGeometryLabels) && !_this.props.redlining.measurements ? /*#__PURE__*/React.createElement("input", {
502
+ geomType: _this.props.redlining.geomType,
503
+ measureState: _this.props.redlining
504
+ }) : null, (_this.props.redlining.geomType === 'Text' || _this.props.allowGeometryLabels) && !_this.props.redlining.showmeasurements ? /*#__PURE__*/React.createElement("input", {
509
505
  className: "controlgroup-fillitem",
510
506
  onChange: function onChange(ev) {
511
507
  return _this.updateRedliningStyle({
@@ -513,57 +509,13 @@ var Redlining = /*#__PURE__*/function (_React$Component) {
513
509
  });
514
510
  },
515
511
  placeholder: labelPlaceholder,
516
- readOnly: _this.props.redlining.measurements,
512
+ readOnly: _this.props.redlining.showmeasurements,
517
513
  ref: function ref(el) {
518
514
  return _this.setLabelRef(el);
519
515
  },
520
516
  type: "text",
521
517
  value: _this.props.redlining.style.text
522
- }) : null, _this.props.redlining.measurements && ['LineString', 'Circle'].includes(_this.props.redlining.geomType) ? /*#__PURE__*/React.createElement("select", {
523
- className: "controlgroup-fillitem",
524
- onChange: function onChange(ev) {
525
- return _this.props.changeRedliningState({
526
- lenUnit: ev.target.value
527
- });
528
- },
529
- value: _this.props.redlining.lenUnit
530
- }, /*#__PURE__*/React.createElement("option", {
531
- value: "metric"
532
- }, LocaleUtils.tr("measureComponent.metric")), /*#__PURE__*/React.createElement("option", {
533
- value: "imperial"
534
- }, LocaleUtils.tr("measureComponent.imperial")), /*#__PURE__*/React.createElement("option", {
535
- value: "m"
536
- }, "m"), /*#__PURE__*/React.createElement("option", {
537
- value: "km"
538
- }, "km"), /*#__PURE__*/React.createElement("option", {
539
- value: "ft"
540
- }, "ft"), /*#__PURE__*/React.createElement("option", {
541
- value: "mi"
542
- }, "mi")) : null, _this.props.redlining.measurements && ['Polygon', 'Ellipse', 'Square', 'Box'].includes(_this.props.redlining.geomType) ? /*#__PURE__*/React.createElement("select", {
543
- className: "controlgroup-fillitem",
544
- onChange: function onChange(ev) {
545
- return _this.props.changeRedliningState({
546
- areaUnit: ev.target.value
547
- });
548
- },
549
- value: _this.props.redlining.areaUnit
550
- }, /*#__PURE__*/React.createElement("option", {
551
- value: "metric"
552
- }, LocaleUtils.tr("measureComponent.metric")), /*#__PURE__*/React.createElement("option", {
553
- value: "imperial"
554
- }, LocaleUtils.tr("measureComponent.imperial")), /*#__PURE__*/React.createElement("option", {
555
- value: "sqm"
556
- }, "m\xB2"), /*#__PURE__*/React.createElement("option", {
557
- value: "ha"
558
- }, "ha"), /*#__PURE__*/React.createElement("option", {
559
- value: "sqkm"
560
- }, "km\xB2"), /*#__PURE__*/React.createElement("option", {
561
- value: "sqft"
562
- }, "ft\xB2"), /*#__PURE__*/React.createElement("option", {
563
- value: "acre"
564
- }, "acre"), /*#__PURE__*/React.createElement("option", {
565
- value: "sqmi"
566
- }, "mi\xB2")) : null)));
518
+ }) : null)));
567
519
  });
568
520
  _defineProperty(_this, "setLabelRef", function (el) {
569
521
  _this.labelInput = el;
@@ -71,7 +71,7 @@ var Reports = /*#__PURE__*/function (_React$Component) {
71
71
  var pickButtons = [{
72
72
  key: 'Pick',
73
73
  icon: 'pick',
74
- label: LocaleUtils.tr("reports.pick")
74
+ label: LocaleUtils.tr("common.pick")
75
75
  }, {
76
76
  key: 'Region',
77
77
  icon: 'pick_region',
@@ -79,7 +79,7 @@ var Reports = /*#__PURE__*/function (_React$Component) {
79
79
  }, {
80
80
  key: 'All',
81
81
  icon: 'ok',
82
- label: LocaleUtils.tr("reports.all"),
82
+ label: LocaleUtils.tr("common.all"),
83
83
  forceLabel: true
84
84
  }];
85
85
  return /*#__PURE__*/React.createElement("div", {
@@ -113,7 +113,7 @@ var Reports = /*#__PURE__*/function (_React$Component) {
113
113
  type: "button"
114
114
  }, _this.state.generatingReport ? /*#__PURE__*/React.createElement(Spinner, null) : /*#__PURE__*/React.createElement(Icon, {
115
115
  icon: "report"
116
- }), /*#__PURE__*/React.createElement("span", null, LocaleUtils.tr("reports.download")))));
116
+ }), /*#__PURE__*/React.createElement("span", null, LocaleUtils.tr("common.download")))));
117
117
  });
118
118
  _defineProperty(_this, "setLayerVisible", function (layerUrl, layerName) {
119
119
  var path = [];
@@ -234,7 +234,7 @@ var Routing = /*#__PURE__*/function (_React$Component) {
234
234
  }
235
235
  }, /*#__PURE__*/React.createElement(Icon, {
236
236
  icon: "clear"
237
- }), " ", LocaleUtils.tr("routing.clear"))), _this.state.mode === 'transit' ? /*#__PURE__*/React.createElement("div", {
237
+ }), " ", LocaleUtils.tr("common.clear"))), _this.state.mode === 'transit' ? /*#__PURE__*/React.createElement("div", {
238
238
  className: "routing-time-settings"
239
239
  }, /*#__PURE__*/React.createElement("select", {
240
240
  onChange: _this.updateTransitTimepoint,
@@ -330,7 +330,7 @@ var Routing = /*#__PURE__*/function (_React$Component) {
330
330
  }), " ", /*#__PURE__*/React.createElement("a", {
331
331
  href: "#",
332
332
  onClick: _this.exportRoute
333
- }, LocaleUtils.tr("routing.export"))), /*#__PURE__*/React.createElement("span", {
333
+ }, LocaleUtils.tr("common.export"))), /*#__PURE__*/React.createElement("span", {
334
334
  className: "routing-result-spacer"
335
335
  }), /*#__PURE__*/React.createElement("span", null, /*#__PURE__*/React.createElement(Icon, {
336
336
  icon: "layers"
@@ -467,7 +467,7 @@ var Routing = /*#__PURE__*/function (_React$Component) {
467
467
  }
468
468
  }, /*#__PURE__*/React.createElement(Icon, {
469
469
  icon: "clear"
470
- }), " ", LocaleUtils.tr("routing.clear")))), isoConfig.busy ? /*#__PURE__*/React.createElement("div", {
470
+ }), " ", LocaleUtils.tr("common.clear")))), isoConfig.busy ? /*#__PURE__*/React.createElement("div", {
471
471
  className: "routing-busy"
472
472
  }, /*#__PURE__*/React.createElement(Spinner, null), " ", LocaleUtils.tr("routing.computing")) : null, isoConfig.result ? _this.renderIsochroneResult(isoConfig) : null);
473
473
  });
@@ -486,7 +486,7 @@ var Routing = /*#__PURE__*/function (_React$Component) {
486
486
  }), " ", /*#__PURE__*/React.createElement("a", {
487
487
  href: "#",
488
488
  onClick: _this.exportIsochrone
489
- }, LocaleUtils.tr("routing.export"))), /*#__PURE__*/React.createElement("span", {
489
+ }, LocaleUtils.tr("common.export"))), /*#__PURE__*/React.createElement("span", {
490
490
  className: "routing-result-spacer"
491
491
  }), /*#__PURE__*/React.createElement("span", null, /*#__PURE__*/React.createElement(Icon, {
492
492
  icon: "layers"
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. */
@@ -178,7 +178,7 @@ var ValueTool = /*#__PURE__*/function (_React$Component) {
178
178
  onChange: function onChange(value) {
179
179
  return _this.setLayerBands(key, value);
180
180
  },
181
- placeholder: LocaleUtils.tr("valuetool.all"),
181
+ placeholder: LocaleUtils.tr("common.all"),
182
182
  value: _this.state.selectedBands[key] || ""
183
183
  })) : null);
184
184
  });