qwc2 2025.10.9 → 2025.10.14

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 (241) hide show
  1. package/actions/display.js +30 -1
  2. package/actions/editing.js +22 -1
  3. package/actions/layerinfo.js +13 -1
  4. package/actions/layers.js +213 -3
  5. package/actions/localConfig.js +58 -1
  6. package/actions/locale.js +21 -1
  7. package/actions/locate.js +26 -1
  8. package/actions/logging.js +10 -1
  9. package/actions/map.js +105 -2
  10. package/actions/measurement.js +12 -1
  11. package/actions/processNotifications.js +37 -1
  12. package/actions/redlining.js +18 -1
  13. package/actions/redliningPick.js +12 -1
  14. package/actions/search.js +12 -1
  15. package/actions/serviceinfo.js +12 -1
  16. package/actions/task.js +55 -3
  17. package/actions/theme.js +339 -19
  18. package/actions/windows.js +164 -5
  19. package/components/AppMenu.js +435 -3
  20. package/components/AttributeForm.js +928 -32
  21. package/components/AttributeTableWidget.js +1105 -13
  22. package/components/AutoEditForm.js +189 -3
  23. package/components/CoordinateDisplayer.js +78 -2
  24. package/components/EditComboField.js +190 -6
  25. package/components/EditUploadField.js +315 -3
  26. package/components/ExportSelection.js +203 -2
  27. package/components/FullscreenSwitcher.js +90 -3
  28. package/components/Icon.js +81 -2
  29. package/components/IdentifyViewer.js +1161 -6
  30. package/components/ImportLayer.js +718 -20
  31. package/components/LayerInfoWindow.js +145 -2
  32. package/components/LinkFeatureForm.js +246 -5
  33. package/components/MapButton.js +88 -2
  34. package/components/MapSelection.js +287 -8
  35. package/components/MessageBar.js +68 -2
  36. package/components/NumericInputWindow.js +359 -2
  37. package/components/PickFeature.js +266 -2
  38. package/components/PluginsContainer.js +227 -8
  39. package/components/PrintSelection.js +620 -49
  40. package/components/ProcessNotifications.js +104 -2
  41. package/components/QtDesignerForm.js +1137 -18
  42. package/components/ResizeableWindow.js +591 -8
  43. package/components/SearchBox.js +1307 -20
  44. package/components/ServiceInfoWindow.js +107 -2
  45. package/components/SideBar.js +204 -4
  46. package/components/StandardApp.js +381 -20
  47. package/components/Swipeable.js +15 -1
  48. package/components/TaskBar.js +85 -2
  49. package/components/ThemeLayersListWindow.js +216 -4
  50. package/components/ThemeList.js +381 -7
  51. package/components/Toolbar.js +106 -2
  52. package/components/WindowManager.js +178 -2
  53. package/components/map/OlLayer.js +257 -6
  54. package/components/map/OlMap.js +405 -5
  55. package/components/map/layers/BingLayer.js +31 -2
  56. package/components/map/layers/GoogleLayer.js +222 -19
  57. package/components/map/layers/GraticuleLayer.js +21 -1
  58. package/components/map/layers/ImageLayer.js +15 -1
  59. package/components/map/layers/MVTLayer.js +52 -2
  60. package/components/map/layers/OSMLayer.js +24 -2
  61. package/components/map/layers/OverlayLayer.js +55 -3
  62. package/components/map/layers/VectorLayer.js +173 -8
  63. package/components/map/layers/WFSLayer.js +220 -6
  64. package/components/map/layers/WMSLayer.js +180 -6
  65. package/components/map/layers/WMTSLayer.js +67 -3
  66. package/components/map/layers/XYZLayer.js +24 -2
  67. package/components/map/layers/index.js +28 -1
  68. package/components/map3d/EditDataset3D.js +190 -3
  69. package/components/map3d/HeightProfile3D.js +402 -3
  70. package/components/map3d/ImportObjects3D.js +162 -2
  71. package/components/map3d/Map3D.js +1304 -38
  72. package/components/map3d/MapControls3D.js +392 -7
  73. package/components/map3d/SearchField3D.js +183 -11
  74. package/components/map3d/View3DSwitcher.js +98 -2
  75. package/components/map3d/drawtool/CreateTool3D.js +174 -4
  76. package/components/map3d/drawtool/EditTool3D.js +590 -6
  77. package/components/map3d/drawtool/NumericInput3D.js +336 -4
  78. package/components/map3d/layers/GeoTIFFLayer3D.js +15 -1
  79. package/components/map3d/layers/VectorLayer3D.js +53 -2
  80. package/components/map3d/layers/WFSLayer3D.js +109 -3
  81. package/components/map3d/layers/WMSLayer3D.js +70 -2
  82. package/components/map3d/layers/WMTSLayer3D.js +27 -3
  83. package/components/map3d/layers/index.js +14 -1
  84. package/components/map3d/utils/FirstPersonControls3D.js +423 -16
  85. package/components/map3d/utils/MiscUtils3D.js +221 -13
  86. package/components/map3d/utils/OrbitControls3D.js +176 -5
  87. package/components/map3d/utils/Tiles3DStyle.js +238 -9
  88. package/components/share/ShareLink.js +54 -2
  89. package/components/share/ShareQRCode.js +62 -2
  90. package/components/share/ShareSocials.js +125 -3
  91. package/components/timeline/FixedTimeline.js +236 -5
  92. package/components/timeline/InfiniteTimeline.js +347 -8
  93. package/components/timeline/TimelineFeaturesSlider.js +439 -5
  94. package/components/widgets/AccordeonWidget.js +96 -2
  95. package/components/widgets/ButtonBar.js +124 -2
  96. package/components/widgets/ColorButton.js +201 -3
  97. package/components/widgets/ComboBox.js +166 -2
  98. package/components/widgets/CopyButton.js +110 -2
  99. package/components/widgets/DateTimeInput.js +100 -3
  100. package/components/widgets/EditableSelect.js +230 -3
  101. package/components/widgets/FileSelector.js +128 -4
  102. package/components/widgets/Input.js +124 -2
  103. package/components/widgets/InputContainer.js +96 -2
  104. package/components/widgets/LayerCatalogWidget.js +219 -3
  105. package/components/widgets/MenuButton.js +157 -1
  106. package/components/widgets/ModalDialog.js +64 -2
  107. package/components/widgets/NavBar.js +119 -2
  108. package/components/widgets/NumberInput.js +226 -4
  109. package/components/widgets/PopupMenu.js +72 -1
  110. package/components/widgets/Primitives.js +6 -1
  111. package/components/widgets/ReCaptchaWidget.js +55 -1
  112. package/components/widgets/SearchWidget.js +255 -2
  113. package/components/widgets/Spinner.js +44 -2
  114. package/components/widgets/SuggestionInput.js +77 -2
  115. package/components/widgets/TextInput.js +308 -2
  116. package/components/widgets/ToggleSwitch.js +85 -2
  117. package/components/widgets/VectorLayerPicker.js +85 -3
  118. package/libs/openlayers.js +225 -5
  119. package/package.json +1 -1
  120. package/plugins/API.js +358 -15
  121. package/plugins/AttributeTable.js +109 -3
  122. package/plugins/Authentication.js +130 -5
  123. package/plugins/BackgroundSwitcher.js +218 -4
  124. package/plugins/Bookmark.js +289 -3
  125. package/plugins/BottomBar.js +298 -4
  126. package/plugins/CookiePopup.js +67 -3
  127. package/plugins/Cyclomedia.js +442 -5
  128. package/plugins/Editing.js +497 -9
  129. package/plugins/FeatureForm.js +366 -4
  130. package/plugins/FeatureSearch.js +458 -3
  131. package/plugins/GeometryDigitizer.js +664 -7
  132. package/plugins/HeightProfile.js +763 -15
  133. package/plugins/Help.js +102 -3
  134. package/plugins/HomeButton.js +80 -3
  135. package/plugins/Identify.js +543 -5
  136. package/plugins/LayerCatalog.js +215 -4
  137. package/plugins/LayerTree.js +1194 -6
  138. package/plugins/LocateButton.js +94 -3
  139. package/plugins/Map.js +320 -16
  140. package/plugins/MapCompare.js +94 -3
  141. package/plugins/MapCopyright.js +127 -5
  142. package/plugins/MapExport.js +613 -20
  143. package/plugins/MapFilter.js +868 -12
  144. package/plugins/MapInfoTooltip.js +277 -3
  145. package/plugins/MapLegend.js +253 -4
  146. package/plugins/MapTip.js +290 -4
  147. package/plugins/Measure.js +220 -4
  148. package/plugins/NewsPopup.js +137 -3
  149. package/plugins/OverviewMap.js +167 -7
  150. package/plugins/Panoramax.js +340 -2
  151. package/plugins/Portal.js +199 -4
  152. package/plugins/Print.js +1231 -15
  153. package/plugins/Redlining.js +750 -6
  154. package/plugins/Reports.js +332 -3
  155. package/plugins/Routing.js +1278 -15
  156. package/plugins/ScratchDrawing.js +173 -5
  157. package/plugins/Settings.js +241 -4
  158. package/plugins/Share.js +198 -3
  159. package/plugins/StartupMarker.js +84 -4
  160. package/plugins/TaskButton.js +88 -3
  161. package/plugins/ThemeSwitcher.js +164 -4
  162. package/plugins/TimeManager.js +971 -10
  163. package/plugins/TopBar.js +300 -7
  164. package/plugins/TourGuide.js +213 -2
  165. package/plugins/ValueTool.js +419 -4
  166. package/plugins/View3D.js +519 -14
  167. package/plugins/ZoomButtons.js +165 -3
  168. package/plugins/map/EditingSupport.js +199 -7
  169. package/plugins/map/LocateSupport.js +260 -4
  170. package/plugins/map/MeasurementSupport.js +216 -8
  171. package/plugins/map/RedliningPickSupport.js +201 -7
  172. package/plugins/map/RedliningSupport.js +726 -17
  173. package/plugins/map/SnapInteraction.js +101 -1
  174. package/plugins/map/SnapSupport.js +210 -2
  175. package/plugins/map/SnappingSupport.js +356 -17
  176. package/plugins/map3d/BackgroundSwitcher3D.js +44 -3
  177. package/plugins/map3d/BottomBar3D.js +118 -3
  178. package/plugins/map3d/Compare3D.js +422 -8
  179. package/plugins/map3d/Draw3D.js +353 -6
  180. package/plugins/map3d/ExportObjects3D.js +393 -18
  181. package/plugins/map3d/HideObjects3D.js +313 -12
  182. package/plugins/map3d/Identify3D.js +283 -12
  183. package/plugins/map3d/LayerTree3D.js +323 -3
  184. package/plugins/map3d/MapCopyright3D.js +128 -5
  185. package/plugins/map3d/MapExport3D.js +590 -10
  186. package/plugins/map3d/MapLight3D.js +553 -6
  187. package/plugins/map3d/Measure3D.js +571 -20
  188. package/plugins/map3d/OverviewMap3D.js +169 -3
  189. package/plugins/map3d/Settings3D.js +73 -3
  190. package/plugins/map3d/TopBar3D.js +207 -9
  191. package/plugins/redlining/RedliningBufferSupport.js +206 -3
  192. package/reducers/display.js +34 -2
  193. package/reducers/editing.js +68 -3
  194. package/reducers/index.js +9 -1
  195. package/reducers/layerinfo.js +26 -2
  196. package/reducers/layers.js +456 -9
  197. package/reducers/localConfig.js +122 -2
  198. package/reducers/locale.js +38 -2
  199. package/reducers/locate.js +40 -2
  200. package/reducers/map.js +176 -5
  201. package/reducers/measurement.js +42 -2
  202. package/reducers/processNotifications.js +49 -2
  203. package/reducers/redlining.js +50 -2
  204. package/reducers/redliningPick.js +27 -2
  205. package/reducers/search.js +20 -1
  206. package/reducers/serviceinfo.js +25 -2
  207. package/reducers/task.js +45 -2
  208. package/reducers/theme.js +51 -2
  209. package/reducers/windows.js +203 -2
  210. package/scripts/dist.sh +1 -1
  211. package/scripts/gen-plugin-docs.js +152 -2
  212. package/scripts/makeIconkit.js +85 -6
  213. package/scripts/themesConfig.js +742 -40
  214. package/scripts/updateTranslations.js +251 -10
  215. package/selectors/searchproviders.js +44 -2
  216. package/stores/StandardStore.js +42 -2
  217. package/utils/ConfigUtils.js +84 -3
  218. package/utils/CoordinatesUtils.js +234 -23
  219. package/utils/DxfUtils.js +237 -11
  220. package/utils/EditingInterface.js +421 -87
  221. package/utils/EditingUtils.js +357 -13
  222. package/utils/ElevationInterface.js +83 -22
  223. package/utils/FeatureStyles.js +429 -5
  224. package/utils/IdentifyUtils.js +443 -7
  225. package/utils/ImageEditor.js +79 -9
  226. package/utils/LayerUtils.js +1516 -50
  227. package/utils/LocaleUtils.js +117 -7
  228. package/utils/MapUtils.js +241 -59
  229. package/utils/MeasureUtils.js +323 -2
  230. package/utils/MiscUtils.js +189 -11
  231. package/utils/PermaLinkUtils.js +429 -6
  232. package/utils/PluginStore.js +27 -1
  233. package/utils/ResourceRegistry.js +15 -1
  234. package/utils/RoutingInterface.js +307 -7
  235. package/utils/SearchProviders.js +722 -19
  236. package/utils/ServiceLayerUtils.js +669 -14
  237. package/utils/Signal.js +32 -2
  238. package/utils/ThemeUtils.js +341 -7
  239. package/utils/VectorLayerUtils.js +589 -15
  240. package/utils/expr_grammar/grammar.js +2239 -2
  241. package/utils/expr_grammar/test.js +65 -3
@@ -1,20 +1,508 @@
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)}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}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}function _classCallCheck(a,n){if(!(a instanceof n))throw new TypeError("Cannot call a class as a function")}function _defineProperties(e,r){for(var t=0;t<r.length;t++){var o=r[t];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(e,_toPropertyKey(o.key),o)}}function _createClass(e,r,t){return r&&_defineProperties(e.prototype,r),t&&_defineProperties(e,t),Object.defineProperty(e,"prototype",{writable:!1}),e}function _callSuper(t,o,e){return o=_getPrototypeOf(o),_possibleConstructorReturn(t,_isNativeReflectConstruct()?Reflect.construct(o,e||[],_getPrototypeOf(t).constructor):o.apply(t,e))}function _possibleConstructorReturn(t,e){if(e&&("object"==_typeof(e)||"function"==typeof e))return e;if(void 0!==e)throw new TypeError("Derived constructors may only return object or undefined");return _assertThisInitialized(t)}function _assertThisInitialized(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function _isNativeReflectConstruct(){try{var t=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch(t){}return(_isNativeReflectConstruct=function _isNativeReflectConstruct(){return!!t})()}function _getPrototypeOf(t){return _getPrototypeOf=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(t){return t.__proto__||Object.getPrototypeOf(t)},_getPrototypeOf(t)}function _inherits(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),Object.defineProperty(t,"prototype",{writable:!1}),e&&_setPrototypeOf(t,e)}function _setPrototypeOf(t,e){return _setPrototypeOf=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,e){return t.__proto__=e,t},_setPrototypeOf(t,e)}function _defineProperty(e,r,t){return(r=_toPropertyKey(r))in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}function _toPropertyKey(t){var i=_toPrimitive(t,"string");return"symbol"==_typeof(i)?i:i+""}function _toPrimitive(t,r){if("object"!=_typeof(t)||!t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var i=e.call(t,r||"default");if("object"!=_typeof(i))return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===r?String:Number)(t)}/**
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
+ 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; }
3
+ 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; }
4
+ function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); }
5
+ function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } }
6
+ function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; }
7
+ function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); }
8
+ function _possibleConstructorReturn(t, e) { if (e && ("object" == _typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return _assertThisInitialized(t); }
9
+ function _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; }
10
+ function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
11
+ function _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); }
12
+ function _inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && _setPrototypeOf(t, e); }
13
+ function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); }
14
+ function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
15
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
16
+ function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
17
+ /**
2
18
  * Copyright 2017-2024 Sourcepole AG
3
19
  * All rights reserved.
4
20
  *
5
21
  * This source code is licensed under the BSD-style license found in the
6
22
  * LICENSE file in the root directory of this source tree.
7
- */import React from"react";import{connect}from"react-redux";import isEmpty from"lodash.isempty";import isEqual from"lodash.isequal";import PropTypes from"prop-types";import{v4 as uuidv4}from"uuid";import{setEditContext,clearEditContext}from"../actions/editing";import{LayerRole,addLayerFeatures,removeLayer,refreshLayer,changeLayerProperty}from"../actions/layers";import{setSnappingConfig}from"../actions/map";import{setCurrentTask,setCurrentTaskBlocked}from"../actions/task";import AttributeForm from"../components/AttributeForm";import Icon from"../components/Icon";import PickFeature from"../components/PickFeature";import SideBar from"../components/SideBar";import ButtonBar from"../components/widgets/ButtonBar";import ConfigUtils from"../utils/ConfigUtils";import EditingInterface from"../utils/EditingInterface";import{getFeatureTemplate}from"../utils/EditingUtils";import LayerUtils from"../utils/LayerUtils";import LocaleUtils from"../utils/LocaleUtils";import MapUtils from"../utils/MapUtils";import"./style/Editing.css";/**
23
+ */
24
+
25
+ import React from 'react';
26
+ import { connect } from 'react-redux';
27
+ import isEmpty from 'lodash.isempty';
28
+ import isEqual from 'lodash.isequal';
29
+ import PropTypes from 'prop-types';
30
+ import { v4 as uuidv4 } from 'uuid';
31
+ import { setEditContext, clearEditContext } from '../actions/editing';
32
+ import { LayerRole, addLayerFeatures, removeLayer, refreshLayer, changeLayerProperty } from '../actions/layers';
33
+ import { setSnappingConfig } from '../actions/map';
34
+ import { setCurrentTask, setCurrentTaskBlocked } from '../actions/task';
35
+ import AttributeForm from '../components/AttributeForm';
36
+ import Icon from '../components/Icon';
37
+ import PickFeature from '../components/PickFeature';
38
+ import SideBar from '../components/SideBar';
39
+ import ButtonBar from '../components/widgets/ButtonBar';
40
+ import ConfigUtils from '../utils/ConfigUtils';
41
+ import EditingInterface from '../utils/EditingInterface';
42
+ import { getFeatureTemplate } from '../utils/EditingUtils';
43
+ import LayerUtils from '../utils/LayerUtils';
44
+ import LocaleUtils from '../utils/LocaleUtils';
45
+ import MapUtils from '../utils/MapUtils';
46
+ import './style/Editing.css';
47
+
48
+ /**
8
49
  * Allows editing geometries and attributes of datasets.
9
50
  *
10
51
  * The attribute form is generated from the QGIS attribute form configuration.
11
52
  *
12
53
  * This plugin queries the dataset via the editing service specified by
13
54
  * `editServiceUrl` in `config.json` (by default the `qwc-data-service`).
14
- */var Editing=/*#__PURE__*/function(_React$Component){function Editing(){var _this;_classCallCheck(this,Editing);for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++){args[_key]=arguments[_key]}_this=_callSuper(this,Editing,[].concat(args));_defineProperty(_this,"state",{selectedLayer:null,selectedLayerVisibility:null,pickedFeatures:null,busy:false,minimized:false,drawPick:false});_defineProperty(_this,"onShow",function(){if(_this.props.taskData){_this.changeSelectedLayer(_this.props.taskData.layer,_this.props.taskData.feature)}else{_this.changeSelectedLayer(_this.state.selectedLayer)}_this.props.setSnappingConfig(_this.props.snapping,_this.props.snappingActive)});_defineProperty(_this,"onHide",function(){_this.props.clearEditContext("Editing");_this.setLayerVisibility(_this.state.selectedLayer,_this.state.selectedLayerVisibility);_this.setState({minimized:false,drawPick:false})});_defineProperty(_this,"renderBody",function(){if(!_this.props.theme||isEmpty(_this.props.theme.editConfig)){return/*#__PURE__*/React.createElement("div",{role:"body",style:{padding:"1em"}},LocaleUtils.tr("editing.noeditablelayers"))}var editConfig=_this.props.theme.editConfig;var curConfig=editConfig[_this.state.selectedLayer];if(!curConfig){return/*#__PURE__*/React.createElement("div",{role:"body",style:{padding:"1em"}},LocaleUtils.tr("editing.noeditablelayers"))}var editPermissions=curConfig.permissions||{};var actionButtons=[];actionButtons.push({key:"Pick",icon:"pick",label:LocaleUtils.tr("editing.pick"),data:{action:"Pick",feature:null}});if(editPermissions.creatable!==false&&!_this.props.editContext.geomReadOnly){actionButtons.push({key:"Draw",icon:"editdraw",label:LocaleUtils.tr("editing.draw"),data:{action:"Draw"}})}if(ConfigUtils.havePlugin("AttributeTable")&&_this.props.showAttributeTableButton){actionButtons.push({key:"AttribTable",icon:"editing",label:LocaleUtils.tr("editing.attrtable"),data:{action:"AttrTable"}})}var featureSelection=null;if(_this.state.pickedFeatures&&_this.state.pickedFeatures.length>1){var featureText=LocaleUtils.tr("editing.feature");featureSelection=/*#__PURE__*/React.createElement("div",{className:"editing-feature-selection"},/*#__PURE__*/React.createElement("select",{className:"combo editing-feature-select",disabled:_this.props.editContext.changed===true||_this.props.editContext.id!==_this.props.currentEditContext,onChange:function onChange(ev){return _this.setEditFeature(ev.target.value)},value:(_this.props.editContext.feature||{}).id||""},_this.state.pickedFeatures.map(function(feature){return/*#__PURE__*/React.createElement("option",{key:feature.id,value:feature.id},curConfig.displayField?feature.properties[curConfig.displayField]:featureText+" "+feature.id)})))}var pickBar=null;if(_this.props.allowCloneGeometry&&(_this.props.editContext.action==="Draw"||_this.state.drawPick)&&!(_this.props.editContext.feature||{}).geometry){var pickButtons=[{key:"DrawPick",icon:"pick",label:LocaleUtils.tr("editing.pickdrawfeature")}];pickBar=/*#__PURE__*/React.createElement(ButtonBar,{active:_this.state.drawPick?"DrawPick":null,buttons:pickButtons,onClick:_this.toggleDrawPick})}var attributeForm=null;if(_this.props.editContext.feature&&(_this.props.editContext.action==="Pick"||_this.props.editContext.feature.geometry)){attributeForm=/*#__PURE__*/React.createElement(AttributeForm,{editConfig:curConfig,editContext:_this.props.editContext,iface:_this.props.iface,onCommit:_this.updatePickedFeatures})}var themeSublayers=_this.props.layers.reduce(function(accum,layer){return layer.role===LayerRole.THEME?accum.concat(LayerUtils.getSublayerNames(layer)):accum},[]);return/*#__PURE__*/React.createElement("div",{className:"editing-body"},/*#__PURE__*/React.createElement("div",{className:"editing-layer-selection"},/*#__PURE__*/React.createElement("select",{className:"combo editing-layer-select",disabled:_this.props.editContext.changed===true||_this.props.editContext.id!==_this.props.currentEditContext,onChange:function onChange(ev){return _this.changeSelectedLayer(ev.target.value)},value:_this.state.selectedLayer||""},Object.keys(editConfig).filter(function(layerId){return themeSublayers.includes(layerId)}).map(function(layerId){var _this$props$theme$tra,_this$props$theme$tra2,_LayerUtils$searchLay,_LayerUtils$searchLay2;var layerName=editConfig[layerId].layerName;var layerTitle=editConfig[layerId].layerTitle?(_this$props$theme$tra=(_this$props$theme$tra2=_this.props.theme.translations)===null||_this$props$theme$tra2===void 0||(_this$props$theme$tra2=_this$props$theme$tra2.layertree)===null||_this$props$theme$tra2===void 0?void 0:_this$props$theme$tra2[layerName])!==null&&_this$props$theme$tra!==void 0?_this$props$theme$tra:editConfig[layerId].layerTitle:(_LayerUtils$searchLay=(_LayerUtils$searchLay2=LayerUtils.searchLayer(_this.props.layers,_this.props.theme.url,layerName))===null||_LayerUtils$searchLay2===void 0||(_LayerUtils$searchLay2=_LayerUtils$searchLay2.sublayer)===null||_LayerUtils$searchLay2===void 0?void 0:_LayerUtils$searchLay2.title)!==null&&_LayerUtils$searchLay!==void 0?_LayerUtils$searchLay:layerName;return/*#__PURE__*/React.createElement("option",{key:layerId,value:layerId},layerTitle)}))),/*#__PURE__*/React.createElement(ButtonBar,{active:_this.state.drawPick?"Draw":_this.props.editContext.action,buttons:actionButtons,disabled:_this.props.editContext.changed||_this.props.editContext.id!==_this.props.currentEditContext,onClick:_this.actionClicked}),featureSelection,pickBar,attributeForm)});_defineProperty(_this,"actionClicked",function(action,data){_this.setState({drawPick:false,pickedFeatures:null});if(action==="AttribTable"){_this.props.setCurrentTask("AttributeTable",null,null,{layer:_this.state.selectedLayer})}else if(action==="Draw"){var editConfig=_this.props.theme.editConfig;var curConfig=editConfig[_this.state.selectedLayer];var featureSkel={type:"Feature",properties:{}};var mapPrefix=(curConfig.editDataset.match(/^[^.]+\./)||[""])[0];getFeatureTemplate(curConfig,featureSkel,_this.props.iface,mapPrefix,_this.props.map.projection,function(feature){_this.props.setEditContext("Editing",_objectSpread(_objectSpread({},data),{},{feature:feature,geomReadOnly:false}))})}else{_this.props.setEditContext("Editing",_objectSpread({},data))}});_defineProperty(_this,"pickFilter",function(feature){var _this$props$theme$edi;var geomType=(_this$props$theme$edi=_this.props.theme.editConfig[_this.state.selectedLayer])===null||_this$props$theme$edi===void 0?void 0:_this$props$theme$edi.geomType;return feature.geometry&&(feature.geometry.type===geomType||"Multi"+feature.geometry.type===geomType||feature.geometry.type.replace(/^Multi/,"")===geomType&&feature.geometry.coordinates.length===1)});_defineProperty(_this,"geomPicked",function(layer,feature){var _this$props$theme$edi2;var geomType=(_this$props$theme$edi2=_this.props.theme.editConfig[_this.state.selectedLayer])===null||_this$props$theme$edi2===void 0?void 0:_this$props$theme$edi2.geomType;var geometry=feature.geometry;if(geometry.type!==geomType){if("Multi"+feature.geometry.type===geomType){// Convert picked geometry to multi-type
15
- geometry={type:"Multi"+geometry.type,coordinates:[geometry.coordinates]}}else if(geometry.type.replace(/^Multi/,"")===geomType&&geometry.coordinates.length===1){// Convert picked geometry to single type
16
- geometry={type:geometry.type.replace(/^Multi/,""),coordinates:geometry.coordinates[0]}}else{// Should not happen, mismatching geometries should already have been filtered from the list of choices
17
- return}}var editFeature={type:"Feature",geometry:geometry,id:uuidv4()};_this.props.setEditContext("Editing",{action:"Draw",feature:editFeature,changed:true});_this.setState({drawPick:false})});_defineProperty(_this,"setLayerVisibility",function(selectedLayer,visibility){if(selectedLayer!==null){var path=[];var sublayer=null;var layer=_this.props.layers.find(function(l){return l.role===LayerRole.THEME&&(sublayer=LayerUtils.searchSubLayer(l,"name",selectedLayer,path))});if(layer&&sublayer){var oldvisibility=sublayer.visibility;if(oldvisibility!==visibility&&visibility!==null){var recurseDirection=!oldvisibility?"both":"children";_this.props.changeLayerProperty(layer.id,"visibility",visibility,path,recurseDirection)}return oldvisibility}}return null});_defineProperty(_this,"changeSelectedLayer",function(selectedLayer){var feature=arguments.length>1&&arguments[1]!==undefined?arguments[1]:null;var curConfig=_this.props.theme&&_this.props.theme.editConfig&&selectedLayer?_this.props.theme.editConfig[selectedLayer]:null;_this.props.setEditContext("Editing",{action:"Pick",feature:feature,geomType:(curConfig===null||curConfig===void 0?void 0:curConfig.geomType)||null,permissions:(curConfig===null||curConfig===void 0?void 0:curConfig.permissions)||{}});var prevLayerVisibility=null;if(_this.state.selectedLayer!==null){_this.setLayerVisibility(_this.state.selectedLayer,_this.state.selectedLayerVisibility);prevLayerVisibility=_this.setLayerVisibility(selectedLayer,true)}_this.setState({selectedLayer:selectedLayer,selectedLayerVisibility:prevLayerVisibility,drawPick:false})});_defineProperty(_this,"setEditFeature",function(featureId){var feature=_this.state.pickedFeatures.find(function(f){return f.id.toString()===featureId});_this.props.setEditContext("Editing",{feature:feature,changed:false})});_defineProperty(_this,"toggleDrawPick",function(){_this.setState(function(state){var pickActive=!state.drawPick;_this.props.setEditContext("Editing",{action:pickActive?null:"Draw"});return{drawPick:pickActive}})});_defineProperty(_this,"updatePickedFeatures",function(newfeature){if(_this.state.pickedFeatures){_this.setState(function(state){return{pickedFeatures:state.pickedFeatures.map(function(feature){return feature.id===newfeature.id?newfeature:feature})}})}});return _this}_inherits(Editing,_React$Component);return _createClass(Editing,[{key:"componentDidUpdate",value:function componentDidUpdate(prevProps,prevState){var _this2=this;var themeSublayers=this.props.layers.reduce(function(accum,layer){return layer.role===LayerRole.THEME?accum.concat(LayerUtils.getSublayerNames(layer)):accum},[]);// Update selected layer on layers change
18
- if(this.props.enabled&&(this.props.layers!==prevProps.layers||!prevProps.enabled)){var layerIds=Object.keys(this.props.theme&&this.props.theme.editConfig||{}).filter(function(layerId){return themeSublayers.includes(layerId)});if(!isEmpty(layerIds)){if(!layerIds.includes(this.state.selectedLayer)){this.changeSelectedLayer(layerIds[0])}}else if(this.state.selectedLayer){this.changeSelectedLayer(null)}}// If click point changed and in pick mode with a selected layer, trigger a pick
19
- var isCurrentContext=this.props.editContext.id===this.props.currentEditContext;if(this.props.enabled&&isCurrentContext&&this.props.editContext.action==="Pick"&&this.state.selectedLayer&&!this.props.editContext.changed){var newPoint=this.props.map.click||{};var oldPoint=prevProps.map.click||{};if(newPoint.coordinate&&!isEqual(newPoint.coordinate,oldPoint.coordinate)){var _this$props$filter$fi;var scale=Math.round(MapUtils.computeForZoom(this.props.map.scales,this.props.map.zoom));var editConfig=this.props.theme.editConfig[this.state.selectedLayer];this.props.iface.getFeature(editConfig,newPoint.coordinate,this.props.map.projection,scale,96,function(featureCollection){var features=featureCollection?featureCollection.features:null;_this2.setState({pickedFeatures:features});var feature=features?features[0]:null;_this2.props.setEditContext("Editing",{feature:feature,changed:false})},(_this$props$filter$fi=this.props.filter.filterParams)===null||_this$props$filter$fi===void 0?void 0:_this$props$filter$fi[this.state.selectedLayer],this.props.filter.filterGeom)}}if(prevProps.editContext.changed!==this.props.editContext.changed){this.props.setCurrentTaskBlocked(this.props.editContext.changed===true,LocaleUtils.tr("editing.unsavedchanged"))}if(!this.props.editContext.feature&&prevState.pickedFeatures){this.setState({pickedFeatures:null})}}},{key:"render",value:function render(){var _this3=this;var minMaxTooltip=this.state.minimized?LocaleUtils.tr("editing.maximize"):LocaleUtils.tr("editing.minimize");var extraTitlebarContent=/*#__PURE__*/React.createElement(Icon,{className:"editing-minimize-maximize",icon:this.state.minimized?"chevron-down":"chevron-up",onClick:function onClick(){return _this3.setState(function(state){return{minimized:!state.minimized}})},title:minMaxTooltip});var attribFormVisible=!!(this.props.editContext.feature&&(this.props.editContext.action==="Pick"||this.props.editContext.feature.geometry));return[/*#__PURE__*/React.createElement(SideBar,{extraTitlebarContent:extraTitlebarContent,heightResizeable:!this.state.minimized&&attribFormVisible,icon:"editing",id:"Editing",key:"EditingSidebar",onHide:this.onHide,onShow:this.onShow,side:this.props.side,title:LocaleUtils.tr("appmenu.items.Editing"),width:this.props.width},function(){return{body:_this3.state.minimized?null:_this3.renderBody()}}),this.state.drawPick?/*#__PURE__*/React.createElement(PickFeature,{featureFilter:this.pickFilter,featurePicked:this.geomPicked,key:"FeaturePicker"}):null]}}])}(React.Component);_defineProperty(Editing,"propTypes",{addLayerFeatures:PropTypes.func,/** Whether to enable the "Clone existing geometry" functionality. */allowCloneGeometry:PropTypes.bool,changeLayerProperty:PropTypes.func,clearEditContext:PropTypes.func,currentEditContext:PropTypes.string,editContext:PropTypes.object,enabled:PropTypes.bool,filter:PropTypes.object,iface:PropTypes.object,layers:PropTypes.array,map:PropTypes.object,refreshLayer:PropTypes.func,removeLayer:PropTypes.func,setCurrentTask:PropTypes.func,setCurrentTaskBlocked:PropTypes.func,setEditContext:PropTypes.func,setSnappingConfig:PropTypes.func,/** Whether to show a button to open the AttributeTable (if the plugin is available). */showAttributeTableButton:PropTypes.bool,/** The side of the application on which to display the sidebar. */side:PropTypes.string,/** Whether snapping is available when editing. */snapping:PropTypes.bool,/** Whether snapping is enabled by default when editing.
20
- * Either `false`, `edge`, `vertex` or `true` (i.e. both vertex and edge). */snappingActive:PropTypes.oneOfType([PropTypes.bool,PropTypes.string]),taskData:PropTypes.object,theme:PropTypes.object,/** The default width of the editing sidebar, as a CSS width string. */width:PropTypes.string});_defineProperty(Editing,"defaultProps",{width:"30em",side:"right",snapping:true,snappingActive:true,allowCloneGeometry:true,showAttributeTableButton:true});export default(function(){var iface=arguments.length>0&&arguments[0]!==undefined?arguments[0]:EditingInterface;return connect(function(state){return{enabled:state.task.id==="Editing",theme:state.theme.current,layers:state.layers.flat,filter:state.layers.filter,map:state.map,iface:iface,editContext:state.editing.contexts.Editing||{},currentEditContext:state.editing.currentContext,taskData:state.task.id==="Editing"?state.task.data:null}},{addLayerFeatures:addLayerFeatures,removeLayer:removeLayer,clearEditContext:clearEditContext,setEditContext:setEditContext,setSnappingConfig:setSnappingConfig,setCurrentTask:setCurrentTask,setCurrentTaskBlocked:setCurrentTaskBlocked,refreshLayer:refreshLayer,changeLayerProperty:changeLayerProperty})(Editing)});
55
+ */
56
+ var Editing = /*#__PURE__*/function (_React$Component) {
57
+ function Editing() {
58
+ var _this;
59
+ _classCallCheck(this, Editing);
60
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
61
+ args[_key] = arguments[_key];
62
+ }
63
+ _this = _callSuper(this, Editing, [].concat(args));
64
+ _defineProperty(_this, "state", {
65
+ selectedLayer: null,
66
+ selectedLayerVisibility: null,
67
+ pickedFeatures: null,
68
+ busy: false,
69
+ minimized: false,
70
+ drawPick: false
71
+ });
72
+ _defineProperty(_this, "onShow", function () {
73
+ if (_this.props.taskData) {
74
+ _this.changeSelectedLayer(_this.props.taskData.layer, _this.props.taskData.feature);
75
+ } else {
76
+ _this.changeSelectedLayer(_this.state.selectedLayer);
77
+ }
78
+ _this.props.setSnappingConfig(_this.props.snapping, _this.props.snappingActive);
79
+ });
80
+ _defineProperty(_this, "onHide", function () {
81
+ _this.props.clearEditContext('Editing');
82
+ _this.setLayerVisibility(_this.state.selectedLayer, _this.state.selectedLayerVisibility);
83
+ _this.setState({
84
+ minimized: false,
85
+ drawPick: false
86
+ });
87
+ });
88
+ _defineProperty(_this, "renderBody", function () {
89
+ if (!_this.props.theme || isEmpty(_this.props.theme.editConfig)) {
90
+ return /*#__PURE__*/React.createElement("div", {
91
+ role: "body",
92
+ style: {
93
+ padding: "1em"
94
+ }
95
+ }, LocaleUtils.tr("editing.noeditablelayers"));
96
+ }
97
+ var editConfig = _this.props.theme.editConfig;
98
+ var curConfig = editConfig[_this.state.selectedLayer];
99
+ if (!curConfig) {
100
+ return /*#__PURE__*/React.createElement("div", {
101
+ role: "body",
102
+ style: {
103
+ padding: "1em"
104
+ }
105
+ }, LocaleUtils.tr("editing.noeditablelayers"));
106
+ }
107
+ var editPermissions = curConfig.permissions || {};
108
+ var actionButtons = [];
109
+ actionButtons.push({
110
+ key: 'Pick',
111
+ icon: 'pick',
112
+ label: LocaleUtils.tr("editing.pick"),
113
+ data: {
114
+ action: 'Pick',
115
+ feature: null
116
+ }
117
+ });
118
+ if (editPermissions.creatable !== false && !_this.props.editContext.geomReadOnly) {
119
+ actionButtons.push({
120
+ key: 'Draw',
121
+ icon: 'editdraw',
122
+ label: LocaleUtils.tr("editing.draw"),
123
+ data: {
124
+ action: 'Draw'
125
+ }
126
+ });
127
+ }
128
+ if (ConfigUtils.havePlugin("AttributeTable") && _this.props.showAttributeTableButton) {
129
+ actionButtons.push({
130
+ key: 'AttribTable',
131
+ icon: 'editing',
132
+ label: LocaleUtils.tr("editing.attrtable"),
133
+ data: {
134
+ action: 'AttrTable'
135
+ }
136
+ });
137
+ }
138
+ var featureSelection = null;
139
+ if (_this.state.pickedFeatures && _this.state.pickedFeatures.length > 1) {
140
+ var featureText = LocaleUtils.tr("editing.feature");
141
+ featureSelection = /*#__PURE__*/React.createElement("div", {
142
+ className: "editing-feature-selection"
143
+ }, /*#__PURE__*/React.createElement("select", {
144
+ className: "combo editing-feature-select",
145
+ disabled: _this.props.editContext.changed === true || _this.props.editContext.id !== _this.props.currentEditContext,
146
+ onChange: function onChange(ev) {
147
+ return _this.setEditFeature(ev.target.value);
148
+ },
149
+ value: (_this.props.editContext.feature || {}).id || ""
150
+ }, _this.state.pickedFeatures.map(function (feature) {
151
+ return /*#__PURE__*/React.createElement("option", {
152
+ key: feature.id,
153
+ value: feature.id
154
+ }, curConfig.displayField ? feature.properties[curConfig.displayField] : featureText + " " + feature.id);
155
+ })));
156
+ }
157
+ var pickBar = null;
158
+ if (_this.props.allowCloneGeometry && (_this.props.editContext.action === "Draw" || _this.state.drawPick) && !(_this.props.editContext.feature || {}).geometry) {
159
+ var pickButtons = [{
160
+ key: 'DrawPick',
161
+ icon: 'pick',
162
+ label: LocaleUtils.tr("editing.pickdrawfeature")
163
+ }];
164
+ pickBar = /*#__PURE__*/React.createElement(ButtonBar, {
165
+ active: _this.state.drawPick ? "DrawPick" : null,
166
+ buttons: pickButtons,
167
+ onClick: _this.toggleDrawPick
168
+ });
169
+ }
170
+ var attributeForm = null;
171
+ if (_this.props.editContext.feature && (_this.props.editContext.action === "Pick" || _this.props.editContext.feature.geometry)) {
172
+ attributeForm = /*#__PURE__*/React.createElement(AttributeForm, {
173
+ editConfig: curConfig,
174
+ editContext: _this.props.editContext,
175
+ iface: _this.props.iface,
176
+ onCommit: _this.updatePickedFeatures
177
+ });
178
+ }
179
+ var themeSublayers = _this.props.layers.reduce(function (accum, layer) {
180
+ return layer.role === LayerRole.THEME ? accum.concat(LayerUtils.getSublayerNames(layer)) : accum;
181
+ }, []);
182
+ return /*#__PURE__*/React.createElement("div", {
183
+ className: "editing-body"
184
+ }, /*#__PURE__*/React.createElement("div", {
185
+ className: "editing-layer-selection"
186
+ }, /*#__PURE__*/React.createElement("select", {
187
+ className: "combo editing-layer-select",
188
+ disabled: _this.props.editContext.changed === true || _this.props.editContext.id !== _this.props.currentEditContext,
189
+ onChange: function onChange(ev) {
190
+ return _this.changeSelectedLayer(ev.target.value);
191
+ },
192
+ value: _this.state.selectedLayer || ""
193
+ }, Object.keys(editConfig).filter(function (layerId) {
194
+ return themeSublayers.includes(layerId);
195
+ }).map(function (layerId) {
196
+ var _this$props$theme$tra, _this$props$theme$tra2, _LayerUtils$searchLay, _LayerUtils$searchLay2;
197
+ var layerName = editConfig[layerId].layerName;
198
+ var layerTitle = editConfig[layerId].layerTitle ? (_this$props$theme$tra = (_this$props$theme$tra2 = _this.props.theme.translations) === null || _this$props$theme$tra2 === void 0 || (_this$props$theme$tra2 = _this$props$theme$tra2.layertree) === null || _this$props$theme$tra2 === void 0 ? void 0 : _this$props$theme$tra2[layerName]) !== null && _this$props$theme$tra !== void 0 ? _this$props$theme$tra : editConfig[layerId].layerTitle : (_LayerUtils$searchLay = (_LayerUtils$searchLay2 = LayerUtils.searchLayer(_this.props.layers, _this.props.theme.url, layerName)) === null || _LayerUtils$searchLay2 === void 0 || (_LayerUtils$searchLay2 = _LayerUtils$searchLay2.sublayer) === null || _LayerUtils$searchLay2 === void 0 ? void 0 : _LayerUtils$searchLay2.title) !== null && _LayerUtils$searchLay !== void 0 ? _LayerUtils$searchLay : layerName;
199
+ return /*#__PURE__*/React.createElement("option", {
200
+ key: layerId,
201
+ value: layerId
202
+ }, layerTitle);
203
+ }))), /*#__PURE__*/React.createElement(ButtonBar, {
204
+ active: _this.state.drawPick ? "Draw" : _this.props.editContext.action,
205
+ buttons: actionButtons,
206
+ disabled: _this.props.editContext.changed || _this.props.editContext.id !== _this.props.currentEditContext,
207
+ onClick: _this.actionClicked
208
+ }), featureSelection, pickBar, attributeForm);
209
+ });
210
+ _defineProperty(_this, "actionClicked", function (action, data) {
211
+ _this.setState({
212
+ drawPick: false,
213
+ pickedFeatures: null
214
+ });
215
+ if (action === "AttribTable") {
216
+ _this.props.setCurrentTask("AttributeTable", null, null, {
217
+ layer: _this.state.selectedLayer
218
+ });
219
+ } else if (action === "Draw") {
220
+ var editConfig = _this.props.theme.editConfig;
221
+ var curConfig = editConfig[_this.state.selectedLayer];
222
+ var featureSkel = {
223
+ type: "Feature",
224
+ properties: {}
225
+ };
226
+ var mapPrefix = (curConfig.editDataset.match(/^[^.]+\./) || [""])[0];
227
+ getFeatureTemplate(curConfig, featureSkel, _this.props.iface, mapPrefix, _this.props.map.projection, function (feature) {
228
+ _this.props.setEditContext('Editing', _objectSpread(_objectSpread({}, data), {}, {
229
+ feature: feature,
230
+ geomReadOnly: false
231
+ }));
232
+ });
233
+ } else {
234
+ _this.props.setEditContext('Editing', _objectSpread({}, data));
235
+ }
236
+ });
237
+ _defineProperty(_this, "pickFilter", function (feature) {
238
+ var _this$props$theme$edi;
239
+ var geomType = (_this$props$theme$edi = _this.props.theme.editConfig[_this.state.selectedLayer]) === null || _this$props$theme$edi === void 0 ? void 0 : _this$props$theme$edi.geomType;
240
+ return feature.geometry && (feature.geometry.type === geomType || "Multi" + feature.geometry.type === geomType || feature.geometry.type.replace(/^Multi/, "") === geomType && feature.geometry.coordinates.length === 1);
241
+ });
242
+ _defineProperty(_this, "geomPicked", function (layer, feature) {
243
+ var _this$props$theme$edi2;
244
+ var geomType = (_this$props$theme$edi2 = _this.props.theme.editConfig[_this.state.selectedLayer]) === null || _this$props$theme$edi2 === void 0 ? void 0 : _this$props$theme$edi2.geomType;
245
+ var geometry = feature.geometry;
246
+ if (geometry.type !== geomType) {
247
+ if ("Multi" + feature.geometry.type === geomType) {
248
+ // Convert picked geometry to multi-type
249
+ geometry = {
250
+ type: "Multi" + geometry.type,
251
+ coordinates: [geometry.coordinates]
252
+ };
253
+ } else if (geometry.type.replace(/^Multi/, "") === geomType && geometry.coordinates.length === 1) {
254
+ // Convert picked geometry to single type
255
+ geometry = {
256
+ type: geometry.type.replace(/^Multi/, ""),
257
+ coordinates: geometry.coordinates[0]
258
+ };
259
+ } else {
260
+ // Should not happen, mismatching geometries should already have been filtered from the list of choices
261
+ return;
262
+ }
263
+ }
264
+ var editFeature = {
265
+ type: "Feature",
266
+ geometry: geometry,
267
+ id: uuidv4()
268
+ };
269
+ _this.props.setEditContext('Editing', {
270
+ action: "Draw",
271
+ feature: editFeature,
272
+ changed: true
273
+ });
274
+ _this.setState({
275
+ drawPick: false
276
+ });
277
+ });
278
+ _defineProperty(_this, "setLayerVisibility", function (selectedLayer, visibility) {
279
+ if (selectedLayer !== null) {
280
+ var path = [];
281
+ var sublayer = null;
282
+ var layer = _this.props.layers.find(function (l) {
283
+ return l.role === LayerRole.THEME && (sublayer = LayerUtils.searchSubLayer(l, 'name', selectedLayer, path));
284
+ });
285
+ if (layer && sublayer) {
286
+ var oldvisibility = sublayer.visibility;
287
+ if (oldvisibility !== visibility && visibility !== null) {
288
+ var recurseDirection = !oldvisibility ? "both" : "children";
289
+ _this.props.changeLayerProperty(layer.id, "visibility", visibility, path, recurseDirection);
290
+ }
291
+ return oldvisibility;
292
+ }
293
+ }
294
+ return null;
295
+ });
296
+ _defineProperty(_this, "changeSelectedLayer", function (selectedLayer) {
297
+ var feature = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
298
+ var curConfig = _this.props.theme && _this.props.theme.editConfig && selectedLayer ? _this.props.theme.editConfig[selectedLayer] : null;
299
+ _this.props.setEditContext('Editing', {
300
+ action: "Pick",
301
+ feature: feature,
302
+ geomType: (curConfig === null || curConfig === void 0 ? void 0 : curConfig.geomType) || null,
303
+ permissions: (curConfig === null || curConfig === void 0 ? void 0 : curConfig.permissions) || {}
304
+ });
305
+ var prevLayerVisibility = null;
306
+ if (_this.state.selectedLayer !== null) {
307
+ _this.setLayerVisibility(_this.state.selectedLayer, _this.state.selectedLayerVisibility);
308
+ prevLayerVisibility = _this.setLayerVisibility(selectedLayer, true);
309
+ }
310
+ _this.setState({
311
+ selectedLayer: selectedLayer,
312
+ selectedLayerVisibility: prevLayerVisibility,
313
+ drawPick: false
314
+ });
315
+ });
316
+ _defineProperty(_this, "setEditFeature", function (featureId) {
317
+ var feature = _this.state.pickedFeatures.find(function (f) {
318
+ return f.id.toString() === featureId;
319
+ });
320
+ _this.props.setEditContext('Editing', {
321
+ feature: feature,
322
+ changed: false
323
+ });
324
+ });
325
+ _defineProperty(_this, "toggleDrawPick", function () {
326
+ _this.setState(function (state) {
327
+ var pickActive = !state.drawPick;
328
+ _this.props.setEditContext('Editing', {
329
+ action: pickActive ? null : "Draw"
330
+ });
331
+ return {
332
+ drawPick: pickActive
333
+ };
334
+ });
335
+ });
336
+ _defineProperty(_this, "updatePickedFeatures", function (newfeature) {
337
+ if (_this.state.pickedFeatures) {
338
+ _this.setState(function (state) {
339
+ return {
340
+ pickedFeatures: state.pickedFeatures.map(function (feature) {
341
+ return feature.id === newfeature.id ? newfeature : feature;
342
+ })
343
+ };
344
+ });
345
+ }
346
+ });
347
+ return _this;
348
+ }
349
+ _inherits(Editing, _React$Component);
350
+ return _createClass(Editing, [{
351
+ key: "componentDidUpdate",
352
+ value: function componentDidUpdate(prevProps, prevState) {
353
+ var _this2 = this;
354
+ var themeSublayers = this.props.layers.reduce(function (accum, layer) {
355
+ return layer.role === LayerRole.THEME ? accum.concat(LayerUtils.getSublayerNames(layer)) : accum;
356
+ }, []);
357
+ // Update selected layer on layers change
358
+ if (this.props.enabled && (this.props.layers !== prevProps.layers || !prevProps.enabled)) {
359
+ var layerIds = Object.keys(this.props.theme && this.props.theme.editConfig || {}).filter(function (layerId) {
360
+ return themeSublayers.includes(layerId);
361
+ });
362
+ if (!isEmpty(layerIds)) {
363
+ if (!layerIds.includes(this.state.selectedLayer)) {
364
+ this.changeSelectedLayer(layerIds[0]);
365
+ }
366
+ } else if (this.state.selectedLayer) {
367
+ this.changeSelectedLayer(null);
368
+ }
369
+ }
370
+ // If click point changed and in pick mode with a selected layer, trigger a pick
371
+ var isCurrentContext = this.props.editContext.id === this.props.currentEditContext;
372
+ if (this.props.enabled && isCurrentContext && this.props.editContext.action === 'Pick' && this.state.selectedLayer && !this.props.editContext.changed) {
373
+ var newPoint = this.props.map.click || {};
374
+ var oldPoint = prevProps.map.click || {};
375
+ if (newPoint.coordinate && !isEqual(newPoint.coordinate, oldPoint.coordinate)) {
376
+ var _this$props$filter$fi;
377
+ var scale = Math.round(MapUtils.computeForZoom(this.props.map.scales, this.props.map.zoom));
378
+ var editConfig = this.props.theme.editConfig[this.state.selectedLayer];
379
+ this.props.iface.getFeature(editConfig, newPoint.coordinate, this.props.map.projection, scale, 96, function (featureCollection) {
380
+ var features = featureCollection ? featureCollection.features : null;
381
+ _this2.setState({
382
+ pickedFeatures: features
383
+ });
384
+ var feature = features ? features[0] : null;
385
+ _this2.props.setEditContext('Editing', {
386
+ feature: feature,
387
+ changed: false
388
+ });
389
+ }, (_this$props$filter$fi = this.props.filter.filterParams) === null || _this$props$filter$fi === void 0 ? void 0 : _this$props$filter$fi[this.state.selectedLayer], this.props.filter.filterGeom);
390
+ }
391
+ }
392
+ if (prevProps.editContext.changed !== this.props.editContext.changed) {
393
+ this.props.setCurrentTaskBlocked(this.props.editContext.changed === true, LocaleUtils.tr("editing.unsavedchanged"));
394
+ }
395
+ if (!this.props.editContext.feature && prevState.pickedFeatures) {
396
+ this.setState({
397
+ pickedFeatures: null
398
+ });
399
+ }
400
+ }
401
+ }, {
402
+ key: "render",
403
+ value: function render() {
404
+ var _this3 = this;
405
+ var minMaxTooltip = this.state.minimized ? LocaleUtils.tr("editing.maximize") : LocaleUtils.tr("editing.minimize");
406
+ var extraTitlebarContent = /*#__PURE__*/React.createElement(Icon, {
407
+ className: "editing-minimize-maximize",
408
+ icon: this.state.minimized ? 'chevron-down' : 'chevron-up',
409
+ onClick: function onClick() {
410
+ return _this3.setState(function (state) {
411
+ return {
412
+ minimized: !state.minimized
413
+ };
414
+ });
415
+ },
416
+ title: minMaxTooltip
417
+ });
418
+ var attribFormVisible = !!(this.props.editContext.feature && (this.props.editContext.action === "Pick" || this.props.editContext.feature.geometry));
419
+ return [/*#__PURE__*/React.createElement(SideBar, {
420
+ extraTitlebarContent: extraTitlebarContent,
421
+ heightResizeable: !this.state.minimized && attribFormVisible,
422
+ icon: "editing",
423
+ id: "Editing",
424
+ key: "EditingSidebar",
425
+ onHide: this.onHide,
426
+ onShow: this.onShow,
427
+ side: this.props.side,
428
+ title: LocaleUtils.tr("appmenu.items.Editing"),
429
+ width: this.props.width
430
+ }, function () {
431
+ return {
432
+ body: _this3.state.minimized ? null : _this3.renderBody()
433
+ };
434
+ }), this.state.drawPick ? /*#__PURE__*/React.createElement(PickFeature, {
435
+ featureFilter: this.pickFilter,
436
+ featurePicked: this.geomPicked,
437
+ key: "FeaturePicker"
438
+ }) : null];
439
+ }
440
+ }]);
441
+ }(React.Component);
442
+ _defineProperty(Editing, "propTypes", {
443
+ addLayerFeatures: PropTypes.func,
444
+ /** Whether to enable the "Clone existing geometry" functionality. */
445
+ allowCloneGeometry: PropTypes.bool,
446
+ changeLayerProperty: PropTypes.func,
447
+ clearEditContext: PropTypes.func,
448
+ currentEditContext: PropTypes.string,
449
+ editContext: PropTypes.object,
450
+ enabled: PropTypes.bool,
451
+ filter: PropTypes.object,
452
+ iface: PropTypes.object,
453
+ layers: PropTypes.array,
454
+ map: PropTypes.object,
455
+ refreshLayer: PropTypes.func,
456
+ removeLayer: PropTypes.func,
457
+ setCurrentTask: PropTypes.func,
458
+ setCurrentTaskBlocked: PropTypes.func,
459
+ setEditContext: PropTypes.func,
460
+ setSnappingConfig: PropTypes.func,
461
+ /** Whether to show a button to open the AttributeTable (if the plugin is available). */
462
+ showAttributeTableButton: PropTypes.bool,
463
+ /** The side of the application on which to display the sidebar. */
464
+ side: PropTypes.string,
465
+ /** Whether snapping is available when editing. */
466
+ snapping: PropTypes.bool,
467
+ /** Whether snapping is enabled by default when editing.
468
+ * Either `false`, `edge`, `vertex` or `true` (i.e. both vertex and edge). */
469
+ snappingActive: PropTypes.oneOfType([PropTypes.bool, PropTypes.string]),
470
+ taskData: PropTypes.object,
471
+ theme: PropTypes.object,
472
+ /** The default width of the editing sidebar, as a CSS width string. */
473
+ width: PropTypes.string
474
+ });
475
+ _defineProperty(Editing, "defaultProps", {
476
+ width: "30em",
477
+ side: 'right',
478
+ snapping: true,
479
+ snappingActive: true,
480
+ allowCloneGeometry: true,
481
+ showAttributeTableButton: true
482
+ });
483
+ export default (function () {
484
+ var iface = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : EditingInterface;
485
+ return connect(function (state) {
486
+ return {
487
+ enabled: state.task.id === 'Editing',
488
+ theme: state.theme.current,
489
+ layers: state.layers.flat,
490
+ filter: state.layers.filter,
491
+ map: state.map,
492
+ iface: iface,
493
+ editContext: state.editing.contexts.Editing || {},
494
+ currentEditContext: state.editing.currentContext,
495
+ taskData: state.task.id === "Editing" ? state.task.data : null
496
+ };
497
+ }, {
498
+ addLayerFeatures: addLayerFeatures,
499
+ removeLayer: removeLayer,
500
+ clearEditContext: clearEditContext,
501
+ setEditContext: setEditContext,
502
+ setSnappingConfig: setSnappingConfig,
503
+ setCurrentTask: setCurrentTask,
504
+ setCurrentTaskBlocked: setCurrentTaskBlocked,
505
+ refreshLayer: refreshLayer,
506
+ changeLayerProperty: changeLayerProperty
507
+ })(Editing);
508
+ });