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,10 +1,53 @@
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 _slicedToArray(r,e){return _arrayWithHoles(r)||_iterableToArrayLimit(r,e)||_unsupportedIterableToArray(r,e)||_nonIterableRest()}function _nonIterableRest(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _unsupportedIterableToArray(r,a){if(r){if("string"==typeof r)return _arrayLikeToArray(r,a);var t={}.toString.call(r).slice(8,-1);return"Object"===t&&r.constructor&&(t=r.constructor.name),"Map"===t||"Set"===t?Array.from(r):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?_arrayLikeToArray(r,a):void 0}}function _arrayLikeToArray(r,a){(null==a||a>r.length)&&(a=r.length);for(var e=0,n=Array(a);e<a;e++)n[e]=r[e];return n}function _iterableToArrayLimit(r,l){var t=null==r?null:"undefined"!=typeof Symbol&&r[Symbol.iterator]||r["@@iterator"];if(null!=t){var e,n,i,u,a=[],f=!0,o=!1;try{if(i=(t=t.call(r)).next,0===l){if(Object(t)!==t)return;f=!1}else for(;!(f=(e=i.call(t)).done)&&(a.push(e.value),a.length!==l);f=!0);}catch(r){o=!0,n=r}finally{try{if(!f&&null!=t["return"]&&(u=t["return"](),Object(u)!==u))return}finally{if(o)throw n}}return a}}function _arrayWithHoles(r){if(Array.isArray(r))return r}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 _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
3
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
4
+ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
5
+ function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
6
+ function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
7
+ function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
8
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
9
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
10
+ function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); }
11
+ 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); } }
12
+ function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; }
13
+ function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); }
14
+ 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); }
15
+ function _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; }
16
+ function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
17
+ function _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); }
18
+ 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); }
19
+ function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); }
20
+ 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; }
21
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
22
+ 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); }
23
+ /**
2
24
  * Copyright 2017-2024 Sourcepole AG
3
25
  * All rights reserved.
4
26
  *
5
27
  * This source code is licensed under the BSD-style license found in the
6
28
  * 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 PropTypes from"prop-types";import{LayerRole,addLayerFeatures,addMarker,removeMarker,removeLayer}from"../actions/layers";import{setCurrentTask}from"../actions/task";import IdentifyViewer from"../components/IdentifyViewer";import MapSelection from"../components/MapSelection";import ResizeableWindow from"../components/ResizeableWindow";import TaskBar from"../components/TaskBar";import NumberInput from"../components/widgets/NumberInput";import ConfigUtils from"../utils/ConfigUtils";import CoordinatesUtils from"../utils/CoordinatesUtils";import IdentifyUtils from"../utils/IdentifyUtils";import LocaleUtils from"../utils/LocaleUtils";import MeasureUtils from"../utils/MeasureUtils";import VectorLayerUtils from"../utils/VectorLayerUtils";import"./style/Identify.css";/**
29
+ */
30
+
31
+ import React from 'react';
32
+ import { connect } from 'react-redux';
33
+ import isEmpty from 'lodash.isempty';
34
+ import PropTypes from 'prop-types';
35
+ import { LayerRole, addLayerFeatures, addMarker, removeMarker, removeLayer } from '../actions/layers';
36
+ import { setCurrentTask } from '../actions/task';
37
+ import IdentifyViewer from '../components/IdentifyViewer';
38
+ import MapSelection from '../components/MapSelection';
39
+ import ResizeableWindow from '../components/ResizeableWindow';
40
+ import TaskBar from '../components/TaskBar';
41
+ import NumberInput from '../components/widgets/NumberInput';
42
+ import ConfigUtils from '../utils/ConfigUtils';
43
+ import CoordinatesUtils from '../utils/CoordinatesUtils';
44
+ import IdentifyUtils from '../utils/IdentifyUtils';
45
+ import LocaleUtils from '../utils/LocaleUtils';
46
+ import MeasureUtils from '../utils/MeasureUtils';
47
+ import VectorLayerUtils from '../utils/VectorLayerUtils';
48
+ import './style/Identify.css';
49
+
50
+ /**
8
51
  * Displays queried feature attributes.
9
52
  *
10
53
  * Uses WMS GetFeatureInfo to query features and displays the result in
@@ -13,6 +56,501 @@ function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof
13
56
  *
14
57
  * Extendable in combination with the `qwc-feature-info-service`, which provides support
15
58
  * for customized queries and templates for the result presentation.
16
- */var Identify=/*#__PURE__*/function(_React$Component){function Identify(){var _this;_classCallCheck(this,Identify);for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++){args[_key]=arguments[_key]}_this=_callSuper(this,Identify,[].concat(args));_defineProperty(_this,"state",{mode:"Point",identifyResults:null,pendingRequests:0,radius:0,radiusUnits:_this.props.initialRadiusUnits,exitTaskOnResultsClose:null,filterGeom:null,filterGeomModifiers:{}});_defineProperty(_this,"identifyPoint",function(clickPoint){if(clickPoint){_this.setState(function(state){// Remove any search selection layer to avoid confusion
17
- _this.props.removeLayer("searchselection");var pendingRequests=0;var identifyResults=_this.props.click.modifiers.ctrl!==true?{}:state.identifyResults;var queryableLayers=[];queryableLayers=IdentifyUtils.getQueryLayers(_this.props.layers,_this.props.map);queryableLayers.forEach(function(l){var request=IdentifyUtils.buildRequest(l,l.queryLayers.join(","),clickPoint,_this.props.map,_this.props.params);++pendingRequests;IdentifyUtils.sendRequest(request,function(response){_this.setState(function(state2){return{pendingRequests:state2.pendingRequests-1}});if(response){_this.parseResult(response,l,request.params.info_format,clickPoint)}})});if(!isEmpty(_this.props.click.features)){_this.props.click.features.forEach(function(feature){var layer=_this.props.layers.find(function(l){return l.id===feature.layerId});if((layer===null||layer===void 0?void 0:layer.role)===LayerRole.USERLAYER){var _layer$features$find,_layer$features,_layer$features$find2,_layer$projection;var queryFeature=_objectSpread({},(_layer$features$find=(_layer$features=layer.features)===null||_layer$features===void 0||(_layer$features$find2=_layer$features.find)===null||_layer$features$find2===void 0?void 0:_layer$features$find2.call(_layer$features,function(f){return f.id===feature.id}))!==null&&_layer$features$find!==void 0?_layer$features$find:feature);if(!(queryFeature!==null&&queryFeature!==void 0&&queryFeature.properties)){return}if(!identifyResults[layer.name]){identifyResults[layer.name]=[]}queryFeature.crs=(_layer$projection=layer.projection)!==null&&_layer$projection!==void 0?_layer$projection:_this.props.map.projection;queryFeature.displayname=queryFeature.properties.name||queryFeature.properties.Name||queryFeature.properties.NAME||queryFeature.properties.label||queryFeature.properties.id||queryFeature.id;queryFeature.layertitle=layer.title||layer.name||layer.id;queryFeature.properties=Object.entries(queryFeature.properties).reduce(function(res,_ref){var _ref2=_slicedToArray(_ref,2),key=_ref2[0],val=_ref2[1];return _objectSpread(_objectSpread({},res),{},_defineProperty({},key,_typeof(val)==="object"?JSON.stringify(val):val))},{});identifyResults[layer.name].push(queryFeature)}})}_this.props.addMarker("identify",clickPoint,"",_this.props.map.projection);return{identifyResults:identifyResults,pendingRequests:pendingRequests}})}});_defineProperty(_this,"queryPoint",function(prevProps){if(_this.props.click.button!==0||_this.props.click===prevProps.click||(_this.props.click.features||[]).find(function(feature){return feature.id==="startupposmarker"})){return null}var searchMarker=(_this.props.click.features||[]).find(function(feature){return feature.id==="searchmarker"});if(searchMarker&&searchMarker.geometry.type==="Point"){return searchMarker.geometry.coordinates}return _this.props.click.coordinate});_defineProperty(_this,"identifyRegion",function(){var queryableLayers=IdentifyUtils.getQueryLayers(_this.props.layers,_this.props.map);var poly=_this.state.filterGeom.coordinates[0];if(poly.length<3||isEmpty(queryableLayers)){return}var identifyResults=_this.state.filterGeomModifiers.ctrl!==true?{}:_this.state.identifyResults;var center=[0,0];poly.forEach(function(point){center[0]+=point[0];center[1]+=point[1]});center[0]/=poly.length;center[1]/=poly.length;var filter=VectorLayerUtils.geoJSONGeomToWkt(_this.state.filterGeom);var pendingRequests=0;var params=_objectSpread({},_this.props.params);if(_this.props.params.region_feature_count){params.feature_count=_this.props.params.region_feature_count;delete params.region_feature_count}queryableLayers.forEach(function(layer){var request=IdentifyUtils.buildFilterRequest(layer,layer.queryLayers.join(","),filter,_this.props.map,params);++pendingRequests;IdentifyUtils.sendRequest(request,function(response){_this.setState(function(state){return{pendingRequests:state.pendingRequests-1}});if(response){_this.parseResult(response,layer,request.params.info_format,center)}});_this.setState({identifyResults:identifyResults,pendingRequests:pendingRequests})})});_defineProperty(_this,"identifyRadius",function(){var clickPoint=_this.state.filterGeom.center;var queryableLayers=IdentifyUtils.getQueryLayers(_this.props.layers,_this.props.map);if(isEmpty(queryableLayers)){return}var identifyResults=_this.state.filterGeomModifiers.ctrl!==true?{}:_this.state.identifyResults;var filter=VectorLayerUtils.geoJSONGeomToWkt(_this.state.filterGeom);var pendingRequests=0;var params=_objectSpread({},_this.props.params);if(_this.props.params.radius_feature_count){params.feature_count=_this.props.params.radius_feature_count;delete params.radius_feature_count}queryableLayers.forEach(function(layer){var request=IdentifyUtils.buildFilterRequest(layer,layer.queryLayers.join(","),filter,_this.props.map,params);++pendingRequests;IdentifyUtils.sendRequest(request,function(response){_this.setState(function(state){return{pendingRequests:state.pendingRequests-1}});if(response){_this.parseResult(response,layer,request.params.info_format,clickPoint)}});_this.setState({identifyResults:identifyResults,pendingRequests:pendingRequests})});_this.props.addMarker("identify",clickPoint,"",_this.props.map.projection)});_defineProperty(_this,"changeBufferUnit",function(ev){_this.setState({radiusUnits:ev.target.value})});_defineProperty(_this,"parseResult",function(response,layer,format,clickPoint){var newResults=IdentifyUtils.parseResponse(response,layer,format,clickPoint,_this.props.map.projection,_this.props.featureInfoReturnsLayerName);// Merge with previous
18
- _this.setState(function(state){var identifyResults=_objectSpread({},state.identifyResults);Object.entries(newResults).forEach(function(_ref3){var _ref4=_slicedToArray(_ref3,2),layername=_ref4[0],features=_ref4[1];var key=layer.url+"#"+layername;identifyResults[key]=features.reduce(function(result,feature){if(result.find(function(f){return f.id===feature.id})===undefined){result.push(feature)}return result},identifyResults[key]||[])});return{identifyResults:identifyResults}})});_defineProperty(_this,"onShow",function(mode,data){_this.setState({mode:mode||"Point",exitTaskOnResultsClose:data===null||data===void 0?void 0:data.exitTaskOnResultsClose});if(mode==="Point"&&data!==null&&data!==void 0&&data.pos){_this.identifyPoint(data.pos)}});_defineProperty(_this,"onToolClose",function(){_this.setState({mode:"Point",exitTaskOnResultsClose:null,filterGeom:null});if(_this.props.clearResultsOnClose){_this.clearResults()}});_defineProperty(_this,"onWindowClose",function(){_this.clearResults();if(_this.state.exitTaskOnResultsClose||_this.props.exitTaskOnResultsClose){_this.props.setCurrentTask(null)}});_defineProperty(_this,"clearResults",function(){_this.props.removeMarker("identify");_this.props.removeLayer("identifyslection");_this.props.removeLayer("identifyradiusbuffer");_this.setState({identifyResults:null,pendingRequests:0})});_defineProperty(_this,"updateRadius",function(radius,units){_this.setState(function(state){return{radius:radius,radiusUnits:units,filterGeom:_objectSpread(_objectSpread({},state.filterGeom),{},{radius:MeasureUtils.convertLength(radius,units,"m")})}})});_defineProperty(_this,"renderBody",function(){if(_this.state.mode==="Point"){return LocaleUtils.tr("infotool.clickhelpPoint")}else if(_this.state.mode==="Region"){return LocaleUtils.tr("infotool.clickhelpPolygon")}else if(_this.state.mode==="Radius"){var text=LocaleUtils.tr("infotool.clickhelpRadius");return/*#__PURE__*/React.createElement("div",null,/*#__PURE__*/React.createElement("div",null,text),/*#__PURE__*/React.createElement("div",{className:"identify-radius-controls controlgroup"},/*#__PURE__*/React.createElement("span",null,LocaleUtils.tr("infotool.radius"),":\xA0"),/*#__PURE__*/React.createElement(NumberInput,{disabled:!_this.state.filterGeom,max:1000000,min:1,mobile:true,onChange:function onChange(rad){return _this.updateRadius(rad,_this.state.radiusUnits)},value:_this.state.radius}),/*#__PURE__*/React.createElement("select",{onChange:function onChange(ev){return _this.updateRadius(_this.state.radius,ev.target.value)},value:_this.state.radiusUnits},/*#__PURE__*/React.createElement("option",{value:"m"},"m"),/*#__PURE__*/React.createElement("option",{value:"ft"},"ft"),/*#__PURE__*/React.createElement("option",{value:"km"},"km"),/*#__PURE__*/React.createElement("option",{value:"mi"},"mi"))))}return null});return _this}_inherits(Identify,_React$Component);return _createClass(Identify,[{key:"componentDidUpdate",value:function componentDidUpdate(prevProps,prevState){if(this.props.enabled&&this.props.theme&&!prevProps.theme){var startupParams=this.props.startupParams;var haveIc=["1","true"].includes((startupParams.ic||"").toLowerCase());var c=(startupParams.c||"").split(/[;,]/g).map(function(x){return parseFloat(x)||0});if(haveIc&&c.length===2){var mapCrs=this.props.theme.mapCrs;this.identifyPoint(CoordinatesUtils.reproject(c,startupParams.crs||mapCrs,mapCrs))}}else if(this.props.theme!==prevProps.theme){this.clearResults()}else if(!this.props.enabled&&prevProps.enabled){if(this.props.clearResultsOnClose){this.clearResults()}}if(this.props.enabled){if(this.state.mode==="Point"){var clickPoint=this.queryPoint(prevProps);this.identifyPoint(clickPoint)}else if(this.state.mode==="Region"){if(this.state.filterGeom&&this.state.filterGeom!==prevState.filterGeom){this.identifyRegion()}}else if(this.state.mode==="Radius"){if(this.state.filterGeom&&this.state.filterGeom!==prevState.filterGeom){this.setState(function(state){return{radius:MeasureUtils.convertLength(state.filterGeom.radius,"m",state.radiusUnits)}});this.identifyRadius()}}}}},{key:"render",value:function render(){var _this2=this;var resultWindow=null;if(this.state.pendingRequests>0||this.state.identifyResults!==null){var body=null;if(isEmpty(this.state.identifyResults)){if(this.state.pendingRequests>0){body=/*#__PURE__*/React.createElement("div",{className:"identify-body",role:"body"},/*#__PURE__*/React.createElement("span",{className:"identify-body-message"},LocaleUtils.tr("identify.querying")))}else{body=/*#__PURE__*/React.createElement("div",{className:"identify-body",role:"body"},/*#__PURE__*/React.createElement("span",{className:"identify-body-message"},LocaleUtils.tr("identify.noresults")))}}else{body=/*#__PURE__*/React.createElement(IdentifyViewer,{attributeCalculator:this.props.attributeCalculator,attributeTransform:this.props.attributeTransform,customExporters:this.props.customExporters,displayResultTree:this.props.displayResultTree,enableAggregatedReports:this.props.enableAggregatedReports,enableExport:this.props.enableExport,exportGeometry:this.props.exportGeometry,highlightAllResults:this.props.highlightAllResults,identifyResults:this.state.identifyResults,iframeDialogsInitiallyDocked:this.props.iframeDialogsInitiallyDocked,longAttributesDisplay:this.props.longAttributesDisplay,replaceImageUrls:this.props.replaceImageUrls,role:"body",showLayerSelector:this.props.showLayerSelector})}resultWindow=/*#__PURE__*/React.createElement(ResizeableWindow,{busyIcon:this.state.pendingRequests>0,dockable:this.props.geometry.side,icon:"info-sign",initialHeight:this.props.geometry.initialHeight,initialWidth:this.props.geometry.initialWidth,initialX:this.props.geometry.initialX,initialY:this.props.geometry.initialY,initiallyDocked:this.props.geometry.initiallyDocked,key:"IdentifyWindow",onClose:this.onWindowClose,title:LocaleUtils.tr("identify.title")},body)}return[resultWindow,/*#__PURE__*/React.createElement(TaskBar,{key:"IdentifyTaskBar",onHide:this.onToolClose,onShow:this.onShow,task:"Identify"},function(){return{body:_this2.renderBody()}}),this.state.mode==="Region"||this.state.mode==="Radius"?/*#__PURE__*/React.createElement(MapSelection,{active:true,geomType:this.state.mode==="Radius"?"Circle":"Polygon",geometry:this.state.filterGeom,geometryChanged:function geometryChanged(geom,mod){return _this2.setState({filterGeom:geom,filterGeomModifiers:mod})},key:"MapSelection",measure:this.state.mode==="Radius"}):null]}}])}(React.Component);_defineProperty(Identify,"propTypes",{addLayerFeatures:PropTypes.func,addMarker:PropTypes.func,/** Optional function for computing derived attributes. See js/IdentifyExtensions.js for details. This prop can be specified in the appConfig.js cfg section. */attributeCalculator:PropTypes.func,/** Optional function for transforming attribute values. See js/IdentifyExtensions.js for details. This prop can be specified in the appConfig.js cfg section. */attributeTransform:PropTypes.func,/** Whether to clear the identify results when exiting the identify tool. */clearResultsOnClose:PropTypes.bool,click:PropTypes.object,currentIdentifyTool:PropTypes.string,currentTask:PropTypes.string,/** Optional list of custom exporters to offer along with the built-in exporters. See js/IdentifyExtensions.js for details. This prop can be specified in the appConfig.js cfg section. */customExporters:PropTypes.array,/** Whether to display a tree overview of results (as opposed to a flat list of results). */displayResultTree:PropTypes.bool,/** Whether to enable the aggregated report download button. */enableAggregatedReports:PropTypes.bool,/** Whether to enable the export functionality. Either `true|false` or a list of single allowed formats (builtin formats: `json`, `geojson`, `csv`, `csvzip`) */enableExport:PropTypes.oneOfType([PropTypes.bool,PropTypes.array]),enabled:PropTypes.bool,/** Whether to clear the task when the results window is closed. */exitTaskOnResultsClose:PropTypes.bool,/** Whether to include the geometry in exported features. Default: `true`. */exportGeometry:PropTypes.bool,/** Whether to assume that XML GetFeatureInfo responses specify the technical layer name in the `name` attribute, rather than the layer title. */featureInfoReturnsLayerName:PropTypes.bool,/** Default window geometry with size, position and docking status. Positive position values (including '0') are related to top (InitialY) and left (InitialX), negative values (including '-0') to bottom (InitialY) and right (InitialX). */geometry:PropTypes.shape({initialWidth:PropTypes.number,initialHeight:PropTypes.number,initialX:PropTypes.number,initialY:PropTypes.number,initiallyDocked:PropTypes.bool,side:PropTypes.string}),/** Whether to highlight all results if no result is hovered */highlightAllResults:PropTypes.bool,iframeDialogsInitiallyDocked:PropTypes.bool,/** The initial radius units of the identify dialog in radius mode. One of 'm', 'ft', 'km', 'mi'. */initialRadiusUnits:PropTypes.string,layers:PropTypes.array,longAttributesDisplay:PropTypes.string,map:PropTypes.object,/** Extra params to append to the GetFeatureInfo request (i.e. `FI_POINT_TOLERANCE`, `FI_LINE_TOLERANCE`, `feature_count`, ...). Additionally, `region_feature_count` and `radius_feature_count` are supported. */params:PropTypes.object,removeLayer:PropTypes.func,removeMarker:PropTypes.func,/** Whether to replace an attribute value containing an URL to an image with an inline image. */replaceImageUrls:PropTypes.bool,selection:PropTypes.object,setCurrentTask:PropTypes.func,/** Whether to show a layer selector to filter the identify results by layer. */showLayerSelector:PropTypes.bool,startupParams:PropTypes.object,theme:PropTypes.object});_defineProperty(Identify,"defaultProps",{enableAggregatedReports:true,enableExport:true,exportGeometry:true,clearResultsOnClose:true,customExporters:[],longAttributesDisplay:"ellipsis",displayResultTree:true,replaceImageUrls:true,featureInfoReturnsLayerName:true,geometry:{initialWidth:240,initialHeight:320,initialX:0,initialY:0,initiallyDocked:false,side:"left"},initialRadiusUnits:"m",highlightAllResults:true,showLayerSelector:true});export default connect(function(state){var enabled=state.task.id==="Identify"||state.task.identifyEnabled&&ConfigUtils.getConfigProp("identifyTool",state.theme.current,"Identify")==="Identify";return{click:state.map.click||{modifiers:{}},enabled:enabled,layers:state.layers.flat,map:state.map,selection:state.selection,theme:state.theme.current,startupParams:state.localConfig.startupParams}},{addLayerFeatures:addLayerFeatures,addMarker:addMarker,removeMarker:removeMarker,removeLayer:removeLayer,setCurrentTask:setCurrentTask})(Identify);
59
+ */
60
+ var Identify = /*#__PURE__*/function (_React$Component) {
61
+ function Identify() {
62
+ var _this;
63
+ _classCallCheck(this, Identify);
64
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
65
+ args[_key] = arguments[_key];
66
+ }
67
+ _this = _callSuper(this, Identify, [].concat(args));
68
+ _defineProperty(_this, "state", {
69
+ mode: 'Point',
70
+ identifyResults: null,
71
+ pendingRequests: 0,
72
+ radius: 0,
73
+ radiusUnits: _this.props.initialRadiusUnits,
74
+ exitTaskOnResultsClose: null,
75
+ filterGeom: null,
76
+ filterGeomModifiers: {}
77
+ });
78
+ _defineProperty(_this, "identifyPoint", function (clickPoint) {
79
+ if (clickPoint) {
80
+ _this.setState(function (state) {
81
+ // Remove any search selection layer to avoid confusion
82
+ _this.props.removeLayer("searchselection");
83
+ var pendingRequests = 0;
84
+ var identifyResults = _this.props.click.modifiers.ctrl !== true ? {} : state.identifyResults;
85
+ var queryableLayers = [];
86
+ queryableLayers = IdentifyUtils.getQueryLayers(_this.props.layers, _this.props.map);
87
+ queryableLayers.forEach(function (l) {
88
+ var request = IdentifyUtils.buildRequest(l, l.queryLayers.join(","), clickPoint, _this.props.map, _this.props.params);
89
+ ++pendingRequests;
90
+ IdentifyUtils.sendRequest(request, function (response) {
91
+ _this.setState(function (state2) {
92
+ return {
93
+ pendingRequests: state2.pendingRequests - 1
94
+ };
95
+ });
96
+ if (response) {
97
+ _this.parseResult(response, l, request.params.info_format, clickPoint);
98
+ }
99
+ });
100
+ });
101
+ if (!isEmpty(_this.props.click.features)) {
102
+ _this.props.click.features.forEach(function (feature) {
103
+ var layer = _this.props.layers.find(function (l) {
104
+ return l.id === feature.layerId;
105
+ });
106
+ if ((layer === null || layer === void 0 ? void 0 : layer.role) === LayerRole.USERLAYER) {
107
+ var _layer$features$find, _layer$features, _layer$features$find2, _layer$projection;
108
+ var queryFeature = _objectSpread({}, (_layer$features$find = (_layer$features = layer.features) === null || _layer$features === void 0 || (_layer$features$find2 = _layer$features.find) === null || _layer$features$find2 === void 0 ? void 0 : _layer$features$find2.call(_layer$features, function (f) {
109
+ return f.id === feature.id;
110
+ })) !== null && _layer$features$find !== void 0 ? _layer$features$find : feature);
111
+ if (!(queryFeature !== null && queryFeature !== void 0 && queryFeature.properties)) {
112
+ return;
113
+ }
114
+ if (!identifyResults[layer.name]) {
115
+ identifyResults[layer.name] = [];
116
+ }
117
+ queryFeature.crs = (_layer$projection = layer.projection) !== null && _layer$projection !== void 0 ? _layer$projection : _this.props.map.projection;
118
+ queryFeature.displayname = queryFeature.properties.name || queryFeature.properties.Name || queryFeature.properties.NAME || queryFeature.properties.label || queryFeature.properties.id || queryFeature.id;
119
+ queryFeature.layertitle = layer.title || layer.name || layer.id;
120
+ queryFeature.properties = Object.entries(queryFeature.properties).reduce(function (res, _ref) {
121
+ var _ref2 = _slicedToArray(_ref, 2),
122
+ key = _ref2[0],
123
+ val = _ref2[1];
124
+ return _objectSpread(_objectSpread({}, res), {}, _defineProperty({}, key, _typeof(val) === "object" ? JSON.stringify(val) : val));
125
+ }, {});
126
+ identifyResults[layer.name].push(queryFeature);
127
+ }
128
+ });
129
+ }
130
+ _this.props.addMarker('identify', clickPoint, '', _this.props.map.projection);
131
+ return {
132
+ identifyResults: identifyResults,
133
+ pendingRequests: pendingRequests
134
+ };
135
+ });
136
+ }
137
+ });
138
+ _defineProperty(_this, "queryPoint", function (prevProps) {
139
+ if (_this.props.click.button !== 0 || _this.props.click === prevProps.click || (_this.props.click.features || []).find(function (feature) {
140
+ return feature.id === 'startupposmarker';
141
+ })) {
142
+ return null;
143
+ }
144
+ var searchMarker = (_this.props.click.features || []).find(function (feature) {
145
+ return feature.id === 'searchmarker';
146
+ });
147
+ if (searchMarker && searchMarker.geometry.type === "Point") {
148
+ return searchMarker.geometry.coordinates;
149
+ }
150
+ return _this.props.click.coordinate;
151
+ });
152
+ _defineProperty(_this, "identifyRegion", function () {
153
+ var queryableLayers = IdentifyUtils.getQueryLayers(_this.props.layers, _this.props.map);
154
+ var poly = _this.state.filterGeom.coordinates[0];
155
+ if (poly.length < 3 || isEmpty(queryableLayers)) {
156
+ return;
157
+ }
158
+ var identifyResults = _this.state.filterGeomModifiers.ctrl !== true ? {} : _this.state.identifyResults;
159
+ var center = [0, 0];
160
+ poly.forEach(function (point) {
161
+ center[0] += point[0];
162
+ center[1] += point[1];
163
+ });
164
+ center[0] /= poly.length;
165
+ center[1] /= poly.length;
166
+ var filter = VectorLayerUtils.geoJSONGeomToWkt(_this.state.filterGeom);
167
+ var pendingRequests = 0;
168
+ var params = _objectSpread({}, _this.props.params);
169
+ if (_this.props.params.region_feature_count) {
170
+ params.feature_count = _this.props.params.region_feature_count;
171
+ delete params.region_feature_count;
172
+ }
173
+ queryableLayers.forEach(function (layer) {
174
+ var request = IdentifyUtils.buildFilterRequest(layer, layer.queryLayers.join(","), filter, _this.props.map, params);
175
+ ++pendingRequests;
176
+ IdentifyUtils.sendRequest(request, function (response) {
177
+ _this.setState(function (state) {
178
+ return {
179
+ pendingRequests: state.pendingRequests - 1
180
+ };
181
+ });
182
+ if (response) {
183
+ _this.parseResult(response, layer, request.params.info_format, center);
184
+ }
185
+ });
186
+ _this.setState({
187
+ identifyResults: identifyResults,
188
+ pendingRequests: pendingRequests
189
+ });
190
+ });
191
+ });
192
+ _defineProperty(_this, "identifyRadius", function () {
193
+ var clickPoint = _this.state.filterGeom.center;
194
+ var queryableLayers = IdentifyUtils.getQueryLayers(_this.props.layers, _this.props.map);
195
+ if (isEmpty(queryableLayers)) {
196
+ return;
197
+ }
198
+ var identifyResults = _this.state.filterGeomModifiers.ctrl !== true ? {} : _this.state.identifyResults;
199
+ var filter = VectorLayerUtils.geoJSONGeomToWkt(_this.state.filterGeom);
200
+ var pendingRequests = 0;
201
+ var params = _objectSpread({}, _this.props.params);
202
+ if (_this.props.params.radius_feature_count) {
203
+ params.feature_count = _this.props.params.radius_feature_count;
204
+ delete params.radius_feature_count;
205
+ }
206
+ queryableLayers.forEach(function (layer) {
207
+ var request = IdentifyUtils.buildFilterRequest(layer, layer.queryLayers.join(","), filter, _this.props.map, params);
208
+ ++pendingRequests;
209
+ IdentifyUtils.sendRequest(request, function (response) {
210
+ _this.setState(function (state) {
211
+ return {
212
+ pendingRequests: state.pendingRequests - 1
213
+ };
214
+ });
215
+ if (response) {
216
+ _this.parseResult(response, layer, request.params.info_format, clickPoint);
217
+ }
218
+ });
219
+ _this.setState({
220
+ identifyResults: identifyResults,
221
+ pendingRequests: pendingRequests
222
+ });
223
+ });
224
+ _this.props.addMarker("identify", clickPoint, "", _this.props.map.projection);
225
+ });
226
+ _defineProperty(_this, "changeBufferUnit", function (ev) {
227
+ _this.setState({
228
+ radiusUnits: ev.target.value
229
+ });
230
+ });
231
+ _defineProperty(_this, "parseResult", function (response, layer, format, clickPoint) {
232
+ var newResults = IdentifyUtils.parseResponse(response, layer, format, clickPoint, _this.props.map.projection, _this.props.featureInfoReturnsLayerName);
233
+ // Merge with previous
234
+ _this.setState(function (state) {
235
+ var identifyResults = _objectSpread({}, state.identifyResults);
236
+ Object.entries(newResults).forEach(function (_ref3) {
237
+ var _ref4 = _slicedToArray(_ref3, 2),
238
+ layername = _ref4[0],
239
+ features = _ref4[1];
240
+ var key = layer.url + "#" + layername;
241
+ identifyResults[key] = features.reduce(function (result, feature) {
242
+ if (result.find(function (f) {
243
+ return f.id === feature.id;
244
+ }) === undefined) {
245
+ result.push(feature);
246
+ }
247
+ return result;
248
+ }, identifyResults[key] || []);
249
+ });
250
+ return {
251
+ identifyResults: identifyResults
252
+ };
253
+ });
254
+ });
255
+ _defineProperty(_this, "onShow", function (mode, data) {
256
+ _this.setState({
257
+ mode: mode || 'Point',
258
+ exitTaskOnResultsClose: data === null || data === void 0 ? void 0 : data.exitTaskOnResultsClose
259
+ });
260
+ if (mode === "Point" && data !== null && data !== void 0 && data.pos) {
261
+ _this.identifyPoint(data.pos);
262
+ }
263
+ });
264
+ _defineProperty(_this, "onToolClose", function () {
265
+ _this.setState({
266
+ mode: 'Point',
267
+ exitTaskOnResultsClose: null,
268
+ filterGeom: null
269
+ });
270
+ if (_this.props.clearResultsOnClose) {
271
+ _this.clearResults();
272
+ }
273
+ });
274
+ _defineProperty(_this, "onWindowClose", function () {
275
+ _this.clearResults();
276
+ if (_this.state.exitTaskOnResultsClose || _this.props.exitTaskOnResultsClose) {
277
+ _this.props.setCurrentTask(null);
278
+ }
279
+ });
280
+ _defineProperty(_this, "clearResults", function () {
281
+ _this.props.removeMarker('identify');
282
+ _this.props.removeLayer("identifyslection");
283
+ _this.props.removeLayer("identifyradiusbuffer");
284
+ _this.setState({
285
+ identifyResults: null,
286
+ pendingRequests: 0
287
+ });
288
+ });
289
+ _defineProperty(_this, "updateRadius", function (radius, units) {
290
+ _this.setState(function (state) {
291
+ return {
292
+ radius: radius,
293
+ radiusUnits: units,
294
+ filterGeom: _objectSpread(_objectSpread({}, state.filterGeom), {}, {
295
+ radius: MeasureUtils.convertLength(radius, units, 'm')
296
+ })
297
+ };
298
+ });
299
+ });
300
+ _defineProperty(_this, "renderBody", function () {
301
+ if (_this.state.mode === "Point") {
302
+ return LocaleUtils.tr("infotool.clickhelpPoint");
303
+ } else if (_this.state.mode === "Region") {
304
+ return LocaleUtils.tr("infotool.clickhelpPolygon");
305
+ } else if (_this.state.mode === "Radius") {
306
+ var text = LocaleUtils.tr("infotool.clickhelpRadius");
307
+ return /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("div", null, text), /*#__PURE__*/React.createElement("div", {
308
+ className: "identify-radius-controls controlgroup"
309
+ }, /*#__PURE__*/React.createElement("span", null, LocaleUtils.tr("infotool.radius"), ":\xA0"), /*#__PURE__*/React.createElement(NumberInput, {
310
+ disabled: !_this.state.filterGeom,
311
+ max: 1000000,
312
+ min: 1,
313
+ mobile: true,
314
+ onChange: function onChange(rad) {
315
+ return _this.updateRadius(rad, _this.state.radiusUnits);
316
+ },
317
+ value: _this.state.radius
318
+ }), /*#__PURE__*/React.createElement("select", {
319
+ onChange: function onChange(ev) {
320
+ return _this.updateRadius(_this.state.radius, ev.target.value);
321
+ },
322
+ value: _this.state.radiusUnits
323
+ }, /*#__PURE__*/React.createElement("option", {
324
+ value: "m"
325
+ }, "m"), /*#__PURE__*/React.createElement("option", {
326
+ value: "ft"
327
+ }, "ft"), /*#__PURE__*/React.createElement("option", {
328
+ value: "km"
329
+ }, "km"), /*#__PURE__*/React.createElement("option", {
330
+ value: "mi"
331
+ }, "mi"))));
332
+ }
333
+ return null;
334
+ });
335
+ return _this;
336
+ }
337
+ _inherits(Identify, _React$Component);
338
+ return _createClass(Identify, [{
339
+ key: "componentDidUpdate",
340
+ value: function componentDidUpdate(prevProps, prevState) {
341
+ if (this.props.enabled && this.props.theme && !prevProps.theme) {
342
+ var startupParams = this.props.startupParams;
343
+ var haveIc = ["1", "true"].includes((startupParams.ic || "").toLowerCase());
344
+ var c = (startupParams.c || "").split(/[;,]/g).map(function (x) {
345
+ return parseFloat(x) || 0;
346
+ });
347
+ if (haveIc && c.length === 2) {
348
+ var mapCrs = this.props.theme.mapCrs;
349
+ this.identifyPoint(CoordinatesUtils.reproject(c, startupParams.crs || mapCrs, mapCrs));
350
+ }
351
+ } else if (this.props.theme !== prevProps.theme) {
352
+ this.clearResults();
353
+ } else if (!this.props.enabled && prevProps.enabled) {
354
+ if (this.props.clearResultsOnClose) {
355
+ this.clearResults();
356
+ }
357
+ }
358
+ if (this.props.enabled) {
359
+ if (this.state.mode === "Point") {
360
+ var clickPoint = this.queryPoint(prevProps);
361
+ this.identifyPoint(clickPoint);
362
+ } else if (this.state.mode === "Region") {
363
+ if (this.state.filterGeom && this.state.filterGeom !== prevState.filterGeom) {
364
+ this.identifyRegion();
365
+ }
366
+ } else if (this.state.mode === "Radius") {
367
+ if (this.state.filterGeom && this.state.filterGeom !== prevState.filterGeom) {
368
+ this.setState(function (state) {
369
+ return {
370
+ radius: MeasureUtils.convertLength(state.filterGeom.radius, 'm', state.radiusUnits)
371
+ };
372
+ });
373
+ this.identifyRadius();
374
+ }
375
+ }
376
+ }
377
+ }
378
+ }, {
379
+ key: "render",
380
+ value: function render() {
381
+ var _this2 = this;
382
+ var resultWindow = null;
383
+ if (this.state.pendingRequests > 0 || this.state.identifyResults !== null) {
384
+ var body = null;
385
+ if (isEmpty(this.state.identifyResults)) {
386
+ if (this.state.pendingRequests > 0) {
387
+ body = /*#__PURE__*/React.createElement("div", {
388
+ className: "identify-body",
389
+ role: "body"
390
+ }, /*#__PURE__*/React.createElement("span", {
391
+ className: "identify-body-message"
392
+ }, LocaleUtils.tr("identify.querying")));
393
+ } else {
394
+ body = /*#__PURE__*/React.createElement("div", {
395
+ className: "identify-body",
396
+ role: "body"
397
+ }, /*#__PURE__*/React.createElement("span", {
398
+ className: "identify-body-message"
399
+ }, LocaleUtils.tr("identify.noresults")));
400
+ }
401
+ } else {
402
+ body = /*#__PURE__*/React.createElement(IdentifyViewer, {
403
+ attributeCalculator: this.props.attributeCalculator,
404
+ attributeTransform: this.props.attributeTransform,
405
+ customExporters: this.props.customExporters,
406
+ displayResultTree: this.props.displayResultTree,
407
+ enableAggregatedReports: this.props.enableAggregatedReports,
408
+ enableExport: this.props.enableExport,
409
+ exportGeometry: this.props.exportGeometry,
410
+ highlightAllResults: this.props.highlightAllResults,
411
+ identifyResults: this.state.identifyResults,
412
+ iframeDialogsInitiallyDocked: this.props.iframeDialogsInitiallyDocked,
413
+ longAttributesDisplay: this.props.longAttributesDisplay,
414
+ replaceImageUrls: this.props.replaceImageUrls,
415
+ role: "body",
416
+ showLayerSelector: this.props.showLayerSelector
417
+ });
418
+ }
419
+ resultWindow = /*#__PURE__*/React.createElement(ResizeableWindow, {
420
+ busyIcon: this.state.pendingRequests > 0,
421
+ dockable: this.props.geometry.side,
422
+ icon: "info-sign",
423
+ initialHeight: this.props.geometry.initialHeight,
424
+ initialWidth: this.props.geometry.initialWidth,
425
+ initialX: this.props.geometry.initialX,
426
+ initialY: this.props.geometry.initialY,
427
+ initiallyDocked: this.props.geometry.initiallyDocked,
428
+ key: "IdentifyWindow",
429
+ onClose: this.onWindowClose,
430
+ title: LocaleUtils.tr("identify.title")
431
+ }, body);
432
+ }
433
+ return [resultWindow, /*#__PURE__*/React.createElement(TaskBar, {
434
+ key: "IdentifyTaskBar",
435
+ onHide: this.onToolClose,
436
+ onShow: this.onShow,
437
+ task: "Identify"
438
+ }, function () {
439
+ return {
440
+ body: _this2.renderBody()
441
+ };
442
+ }), this.state.mode === "Region" || this.state.mode === "Radius" ? /*#__PURE__*/React.createElement(MapSelection, {
443
+ active: true,
444
+ geomType: this.state.mode === "Radius" ? "Circle" : "Polygon",
445
+ geometry: this.state.filterGeom,
446
+ geometryChanged: function geometryChanged(geom, mod) {
447
+ return _this2.setState({
448
+ filterGeom: geom,
449
+ filterGeomModifiers: mod
450
+ });
451
+ },
452
+ key: "MapSelection",
453
+ measure: this.state.mode === "Radius"
454
+ }) : null];
455
+ }
456
+ }]);
457
+ }(React.Component);
458
+ _defineProperty(Identify, "propTypes", {
459
+ addLayerFeatures: PropTypes.func,
460
+ addMarker: PropTypes.func,
461
+ /** Optional function for computing derived attributes. See js/IdentifyExtensions.js for details. This prop can be specified in the appConfig.js cfg section. */
462
+ attributeCalculator: PropTypes.func,
463
+ /** Optional function for transforming attribute values. See js/IdentifyExtensions.js for details. This prop can be specified in the appConfig.js cfg section. */
464
+ attributeTransform: PropTypes.func,
465
+ /** Whether to clear the identify results when exiting the identify tool. */
466
+ clearResultsOnClose: PropTypes.bool,
467
+ click: PropTypes.object,
468
+ currentIdentifyTool: PropTypes.string,
469
+ currentTask: PropTypes.string,
470
+ /** Optional list of custom exporters to offer along with the built-in exporters. See js/IdentifyExtensions.js for details. This prop can be specified in the appConfig.js cfg section. */
471
+ customExporters: PropTypes.array,
472
+ /** Whether to display a tree overview of results (as opposed to a flat list of results). */
473
+ displayResultTree: PropTypes.bool,
474
+ /** Whether to enable the aggregated report download button. */
475
+ enableAggregatedReports: PropTypes.bool,
476
+ /** Whether to enable the export functionality. Either `true|false` or a list of single allowed formats (builtin formats: `json`, `geojson`, `csv`, `csvzip`, `shapefile`, `xlsx`). If a list is provided, the export formats will be sorted according to that list, and the default format will be the first format of the list. */
477
+ enableExport: PropTypes.oneOfType([PropTypes.bool, PropTypes.array]),
478
+ enabled: PropTypes.bool,
479
+ /** Whether to clear the task when the results window is closed. */
480
+ exitTaskOnResultsClose: PropTypes.bool,
481
+ /** Whether to include the geometry in exported features. Default: `true`. */
482
+ exportGeometry: PropTypes.bool,
483
+ /** Whether to assume that XML GetFeatureInfo responses specify the technical layer name in the `name` attribute, rather than the layer title. */
484
+ featureInfoReturnsLayerName: PropTypes.bool,
485
+ /** Default window geometry with size, position and docking status. Positive position values (including '0') are related to top (InitialY) and left (InitialX), negative values (including '-0') to bottom (InitialY) and right (InitialX). */
486
+ geometry: PropTypes.shape({
487
+ initialWidth: PropTypes.number,
488
+ initialHeight: PropTypes.number,
489
+ initialX: PropTypes.number,
490
+ initialY: PropTypes.number,
491
+ initiallyDocked: PropTypes.bool,
492
+ side: PropTypes.string
493
+ }),
494
+ /** Whether to highlight all results if no result is hovered */
495
+ highlightAllResults: PropTypes.bool,
496
+ iframeDialogsInitiallyDocked: PropTypes.bool,
497
+ /** The initial radius units of the identify dialog in radius mode. One of 'm', 'ft', 'km', 'mi'. */
498
+ initialRadiusUnits: PropTypes.string,
499
+ layers: PropTypes.array,
500
+ longAttributesDisplay: PropTypes.string,
501
+ map: PropTypes.object,
502
+ /** Extra params to append to the GetFeatureInfo request (i.e. `FI_POINT_TOLERANCE`, `FI_LINE_TOLERANCE`, `feature_count`, ...). Additionally, `region_feature_count` and `radius_feature_count` are supported. */
503
+ params: PropTypes.object,
504
+ removeLayer: PropTypes.func,
505
+ removeMarker: PropTypes.func,
506
+ /** Whether to replace an attribute value containing an URL to an image with an inline image. */
507
+ replaceImageUrls: PropTypes.bool,
508
+ selection: PropTypes.object,
509
+ setCurrentTask: PropTypes.func,
510
+ /** Whether to show a layer selector to filter the identify results by layer. */
511
+ showLayerSelector: PropTypes.bool,
512
+ startupParams: PropTypes.object,
513
+ theme: PropTypes.object
514
+ });
515
+ _defineProperty(Identify, "defaultProps", {
516
+ enableAggregatedReports: true,
517
+ enableExport: true,
518
+ exportGeometry: true,
519
+ clearResultsOnClose: true,
520
+ customExporters: [],
521
+ longAttributesDisplay: 'ellipsis',
522
+ displayResultTree: true,
523
+ replaceImageUrls: true,
524
+ featureInfoReturnsLayerName: true,
525
+ geometry: {
526
+ initialWidth: 240,
527
+ initialHeight: 320,
528
+ initialX: 0,
529
+ initialY: 0,
530
+ initiallyDocked: false,
531
+ side: 'left'
532
+ },
533
+ initialRadiusUnits: 'm',
534
+ highlightAllResults: true,
535
+ showLayerSelector: true
536
+ });
537
+ export default connect(function (state) {
538
+ var enabled = state.task.id === "Identify" || state.task.identifyEnabled && ConfigUtils.getConfigProp("identifyTool", state.theme.current, "Identify") === "Identify";
539
+ return {
540
+ click: state.map.click || {
541
+ modifiers: {}
542
+ },
543
+ enabled: enabled,
544
+ layers: state.layers.flat,
545
+ map: state.map,
546
+ selection: state.selection,
547
+ theme: state.theme.current,
548
+ startupParams: state.localConfig.startupParams
549
+ };
550
+ }, {
551
+ addLayerFeatures: addLayerFeatures,
552
+ addMarker: addMarker,
553
+ removeMarker: removeMarker,
554
+ removeLayer: removeLayer,
555
+ setCurrentTask: setCurrentTask
556
+ })(Identify);