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,25 +1,1312 @@
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 _toConsumableArray(r){return _arrayWithoutHoles(r)||_iterableToArray(r)||_unsupportedIterableToArray(r)||_nonIterableSpread()}function _nonIterableSpread(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _iterableToArray(r){if("undefined"!=typeof Symbol&&null!=r[Symbol.iterator]||null!=r["@@iterator"])return Array.from(r)}function _arrayWithoutHoles(r){if(Array.isArray(r))return _arrayLikeToArray(r)}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 _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 _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); }
5
+ function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
6
+ function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); }
7
+ function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); }
8
+ function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
9
+ 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."); }
10
+ 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; } }
11
+ 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; }
12
+ 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; } }
13
+ function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
14
+ function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); }
15
+ 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); } }
16
+ function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; }
17
+ function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); }
18
+ 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); }
19
+ function _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; }
20
+ function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
21
+ function _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); }
22
+ 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); }
23
+ function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); }
24
+ 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; }
25
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
26
+ 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); }
27
+ /**
2
28
  * Copyright 2019-2024 Sourcepole AG
3
29
  * All rights reserved.
4
30
  *
5
31
  * This source code is licensed under the BSD-style license found in the
6
32
  * LICENSE file in the root directory of this source tree.
7
- */import React from"react";import{connect}from"react-redux";import axios from"axios";import classnames from"classnames";import DOMPurify from"dompurify";import isEmpty from"lodash.isempty";import pointInPolygon from"point-in-polygon";import polygonIntersectTest from"polygon-intersect-test";import PropTypes from"prop-types";import{createSelector}from"reselect";import{v4 as uuidv4}from"uuid";import{LayerRole,addLayerFeatures,addThemeSublayer,changeLayerProperty,removeLayer,replacePlaceholderLayer,addLayer}from"../actions/layers";import{logAction}from"../actions/logging";import{panTo,zoomToExtent,zoomToPoint}from"../actions/map";import{setCurrentSearchResult}from"../actions/search";import{setCurrentTask}from"../actions/task";import{setCurrentTheme}from"../actions/theme";import{openExternalUrl,showNotification}from"../actions/windows";import searchProvidersSelector from"../selectors/searchproviders";import ConfigUtils from"../utils/ConfigUtils";import CoordinatesUtils from"../utils/CoordinatesUtils";import LayerUtils from"../utils/LayerUtils";import LocaleUtils from"../utils/LocaleUtils";import MapUtils from"../utils/MapUtils";import MiscUtils from"../utils/MiscUtils";import{UrlParams}from"../utils/PermaLinkUtils";import{FulltextSearch,SearchResultType}from"../utils/SearchProviders";import ServiceLayerUtils from"../utils/ServiceLayerUtils";import VectorLayerUtils from"../utils/VectorLayerUtils";import Icon from"./Icon";import MapSelection from"./MapSelection";import ButtonBar from"./widgets/ButtonBar";import ComboBox from"./widgets/ComboBox";import InputContainer from"./widgets/InputContainer";import NumberInput from"./widgets/NumberInput";import Spinner from"./widgets/Spinner";import"./style/SearchBox.css";var SearchBox=/*#__PURE__*/function(_React$Component){function SearchBox(props){var _this;_classCallCheck(this,SearchBox);_this=_callSuper(this,SearchBox,[props]);_defineProperty(_this,"state",{searchText:"",searchSession:null,pendingSearches:[],recentSearches:[],searchResults:{},resultsVisible:false,collapsedSections:{},expandedLayerGroup:null,activeLayerInfo:null,filterOptionsVisible:false,searchFilterRegions:null,selectedProvider:"",filterRegionName:"",filterGeomType:null,filterGeometry:null});_defineProperty(_this,"loadFilterRegions",function(){var searchRegions=ConfigUtils.getConfigProp("searchFilterRegions",_this.props.theme);if(Array.isArray(searchRegions)){_this.setState({searchFilterRegions:searchRegions})}else if(typeof searchRegions==="string"){axios.get(searchRegions).then(function(response){_this.setState({searchFilterRegions:response.data})})["catch"](function(){_this.setState({searchFilterRegions:null})})}else{_this.setState({searchFilterRegions:null})}});_defineProperty(_this,"renderFilterOptions",function(){var _this$state$filterGeo;if(!_this.state.filterOptionsVisible){return null}var providerSelection=/*#__PURE__*/React.createElement(ComboBox,{onChange:function onChange(value){return _this.setState({selectedProvider:value})},value:_this.state.selectedProvider},/*#__PURE__*/React.createElement("div",{value:""},LocaleUtils.tr("search.all")),Object.entries(_this.props.searchProviders).map(function(_ref){var _prov$params,_prov$label;var _ref2=_slicedToArray(_ref,2),key=_ref2[0],prov=_ref2[1];return/*#__PURE__*/React.createElement("div",{key:key,value:key},(prov===null||prov===void 0||(_prov$params=prov.params)===null||_prov$params===void 0?void 0:_prov$params.title)||((_prov$label=prov.label)!==null&&_prov$label!==void 0?_prov$label:LocaleUtils.tr(prov.labelmsgid)))}));var searchRegionSelection=null;if(Array.isArray(_this.state.searchFilterRegions)){searchRegionSelection=/*#__PURE__*/React.createElement(ComboBox,{onChange:function onChange(value){return _this.setFilterRegion(value,_this.state.searchFilterRegions)},value:_this.state.filterRegionName},/*#__PURE__*/React.createElement("div",{value:""},LocaleUtils.tr("search.none")),_this.state.searchFilterRegions.map(function(group,gidx){return[/*#__PURE__*/React.createElement("div",{"data-group-header":gidx,disabled:true,key:"group"+gidx},group.name)].concat(_toConsumableArray(group.items.map(function(item,idx){return/*#__PURE__*/React.createElement("div",{"data-group":gidx,key:item.name,value:gidx+":"+idx+":"+item.name},item.name)})))}))}var filterButtons=[{key:"Polygon",tooltip:LocaleUtils.tr("redlining.polygon"),icon:"polygon",label:LocaleUtils.tr("redlining.polygon")},{key:"Circle",tooltip:LocaleUtils.tr("redlining.circle"),icon:"circle",label:LocaleUtils.tr("redlining.circle")}];return/*#__PURE__*/React.createElement("div",{className:"searchbox-filter-options"},/*#__PURE__*/React.createElement("table",null,/*#__PURE__*/React.createElement("tbody",null,/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",null,LocaleUtils.tr("search.providerselection"),":"),/*#__PURE__*/React.createElement("td",null,providerSelection)),/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",null,LocaleUtils.tr("search.limittoarea"),":"),/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement("div",{className:"searchbox-filter-options-geometry controlgroup"},/*#__PURE__*/React.createElement(ButtonBar,{active:_this.state.filterGeomType,buttons:filterButtons,onClick:_this.setFilterGeomType}),searchRegionSelection,/*#__PURE__*/React.createElement("button",{className:"button",onClick:_this.clearFilter,title:LocaleUtils.tr("search.clearfilter")},/*#__PURE__*/React.createElement(Icon,{icon:"clear"}))))),_this.state.filterGeomType==="Circle"?/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",null,LocaleUtils.tr("search.circleradius"),":"),/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement(NumberInput,{disabled:!_this.state.filterGeometry,min:1,mobile:true,onChange:_this.setCircleRadius,suffix:" m",value:((_this$state$filterGeo=_this.state.filterGeometry)===null||_this$state$filterGeo===void 0?void 0:_this$state$filterGeo.radius)||0}))):null)))});_defineProperty(_this,"setFilterGeomType",function(geomType){_this.setState({filterGeomType:geomType,filterRegionName:"",filterGeometry:null})});_defineProperty(_this,"setFilterRegion",function(value,searchRegions){if(value){var parts=value.split(":");var item=searchRegions[parts[0]].items[parts[1]];var geometry={type:"Polygon",coordinates:[item.coordinates]};var mapGeometry=VectorLayerUtils.reprojectGeometry(geometry,item.crs,_this.props.map.projection);_this.setState({filterGeomType:null,filterRegionName:value,filterGeometry:mapGeometry})}else{_this.setState({filterGeomType:null,filterRegionName:"",filterGeometry:null})}});_defineProperty(_this,"setCircleRadius",function(value){_this.setState(function(state){return{filterGeometry:_objectSpread(_objectSpread({},state.filterGeometry),{},{radius:value})}})});_defineProperty(_this,"clearFilter",function(){_this.setState({filterGeomType:null,filterRegionName:"",filterGeometry:null})});_defineProperty(_this,"renderResultsMenu",function(){if(!_this.state.resultsVisible){return false}var children=[_this.renderRecentResults(),_this.renderFilters(),_this.renderResults()];children=children.filter(function(child){return!isEmpty(child)});if(isEmpty(children)){if(isEmpty(_this.state.pendingSearches)&&_this.state.searchResults.query_text){children=/*#__PURE__*/React.createElement("div",{className:"searchbox-noresults"},LocaleUtils.tr("search.noresults"))}else{return null}}return/*#__PURE__*/React.createElement("div",{className:"searchbox-results",onMouseDown:_this.setPreventBlur,ref:MiscUtils.setupKillTouchEvents},children)});_defineProperty(_this,"renderRecentResults",function(){var recentSearches=_this.state.recentSearches.filter(function(entry){return entry.toLowerCase().includes(_this.state.searchText.toLowerCase())});if(isEmpty(recentSearches)||recentSearches.length===1&&recentSearches[0].toLowerCase()===_this.state.searchText.toLowerCase()){return null}return/*#__PURE__*/React.createElement("div",{key:"recent"},/*#__PURE__*/React.createElement("div",{className:"searchbox-results-section-title",onClick:function onClick(){return _this.toggleSection("recent")},onMouseDown:MiscUtils.killEvent},/*#__PURE__*/React.createElement(Icon,{icon:_this.isCollapsed("recent")?"expand":"collapse"}),LocaleUtils.tr("search.recent")),!_this.isCollapsed("recent")?/*#__PURE__*/React.createElement("div",{className:"searchbox-results-section-body"},recentSearches.map(function(entry,idx){return/*#__PURE__*/React.createElement("div",{className:"searchbox-result",key:"r"+idx,onClick:function onClick(){return _this.searchTextChanged(entry)},onMouseDown:MiscUtils.killEvent},entry)})):null)});_defineProperty(_this,"renderFilters",function(){return Object.entries(_this.state.searchResults).map(function(_ref3){var _ref4=_slicedToArray(_ref3,2),provider=_ref4[0],results=_ref4[1];if(isEmpty(results.result_counts)||results.result_counts.length<2){return null}var collapsed=_this.isCollapsed("filter",false);var values=results.result_counts.map(function(entry){return entry.filterword+": "+_this.state.searchResults.query_text});values.sort(function(a,b){return a.localeCompare(b)});return/*#__PURE__*/React.createElement("div",{key:"filter"},/*#__PURE__*/React.createElement("div",{className:"searchbox-results-section-title",onClick:function onClick(){return _this.toggleSection("filter")},onMouseDown:MiscUtils.killEvent},/*#__PURE__*/React.createElement(Icon,{icon:collapsed?"expand":"collapse"}),LocaleUtils.tr("search.filter")),!collapsed?/*#__PURE__*/React.createElement("div",{className:"searchbox-results-section-body"},values.map(function(value,idx){return/*#__PURE__*/React.createElement("div",{className:"searchbox-result",key:"f"+idx,onClick:function onClick(){return _this.searchTextChanged(value,true,provider)},onMouseDown:MiscUtils.killEvent},/*#__PURE__*/React.createElement("span",{className:"searchbox-result-label"},value))})):null)}).filter(Boolean)});_defineProperty(_this,"renderResults",function(){var resultRenderers=_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty({},SearchResultType.PLACE,_this.renderPlaceResult),SearchResultType.THEMELAYER,_this.renderLayerResult),SearchResultType.EXTERNALLAYER,_this.renderLayerResult),SearchResultType.THEME,_this.renderThemeResult),SearchResultType.TASK,_this.renderTaskResult);var layersBeforePlaces=_this.props.searchOptions.showLayerResultsBeforePlaces;var priorities=_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty({},SearchResultType.PLACE,layersBeforePlaces?0:3),SearchResultType.THEMELAYER,layersBeforePlaces?2:1),SearchResultType.EXTERNALLAYER,layersBeforePlaces?3:2),SearchResultType.THEME,layersBeforePlaces?1:0),SearchResultType.TASK,4);var results=Object.keys(_this.props.searchProviders).reduce(function(result,provider){if(!_this.state.searchResults[provider]){return result}return result.concat(_this.state.searchResults[provider].results.map(function(group){var _group$type,_group$type2,_group$title,_group$title2;var sectionId=provider+":"+group.id;var moreLabel=null;if(group.resultCount>0&&group.resultCount>group.items.length){moreLabel=LocaleUtils.tr("search.more",group.resultCount-group.items.length)}else if(group.resultCount===-1){moreLabel=LocaleUtils.tr("search.unknownmore")}if(group.items.length===0){return null}var renderer=resultRenderers[(_group$type=group.type)!==null&&_group$type!==void 0?_group$type:SearchResultType.PLACE];if(!renderer){return null}var priority=priorities[(_group$type2=group.type)!==null&&_group$type2!==void 0?_group$type2:SearchResultType.PLACE];return{priority:priority*1000000+(group.priority||0),title:(_group$title=group.title)!==null&&_group$title!==void 0?_group$title:LocaleUtils.tr(group.titlemsgid),tree:/*#__PURE__*/React.createElement("div",{key:sectionId},/*#__PURE__*/React.createElement("div",{className:"searchbox-results-section-title",onClick:function onClick(){return _this.toggleSection(sectionId)},onMouseDown:MiscUtils.killEvent},/*#__PURE__*/React.createElement(Icon,{icon:_this.isCollapsed(sectionId)?"expand":"collapse"}),/*#__PURE__*/React.createElement("span",null,(_group$title2=group.title)!==null&&_group$title2!==void 0?_group$title2:LocaleUtils.tr(group.titlemsgid))),!_this.isCollapsed(sectionId)?/*#__PURE__*/React.createElement("div",{className:"searchbox-results-section-body"},group.items.map(function(entry){return renderer(provider,group,entry)}),moreLabel?/*#__PURE__*/React.createElement("div",{className:"searchbox-more-results"},moreLabel):null):null)}}))},[]).filter(Boolean);results.sort(function(a,b){if(b.priority!==a.priority){return b.priority-a.priority}else{return b.title.localeCompare(a.title)}});return isEmpty(results)?null:results.map(function(entry){return entry.tree})});_defineProperty(_this,"renderPlaceResult",function(provider,group,result){var _result$label;var key=provider+":"+group.id+":"+result.id;return/*#__PURE__*/React.createElement("div",{className:"searchbox-result",key:key,onClick:function onClick(){_this.selectPlaceResult(provider,group,result);_this.blur()},onMouseDown:MiscUtils.killEvent},result.thumbnail?/*#__PURE__*/React.createElement("img",{className:"searchbox-result-thumbnail",onError:function onError(ev){return _this.loadFallbackResultImage(ev,group.type)},src:result.thumbnail}):null,/*#__PURE__*/React.createElement("span",{className:"searchbox-result-label",dangerouslySetInnerHTML:{__html:DOMPurify.sanitize(result.text).replace(/<br\s*\/>/ig," ")},title:(_result$label=result.label)!==null&&_result$label!==void 0?_result$label:result.text}),result.externalLink?/*#__PURE__*/React.createElement(Icon,{icon:"info-sign",onClick:function onClick(ev){var _result$label2;MiscUtils.killEvent(ev);_this.openUrl(result.externalLink,result.target,(_result$label2=result.label)!==null&&_result$label2!==void 0?_result$label2:result.text)}}):null)});_defineProperty(_this,"renderLayerResult",function(provider,group,result){var _result$label3,_result$layer;var parent=arguments.length>3&&arguments[3]!==undefined?arguments[3]:null;var key=provider+":"+group.id+":"+result.id;var addThemes=ConfigUtils.getConfigProp("allowAddingOtherThemes",_this.props.theme);var icon=null;if(result.sublayers){var toggleLayerGroup=function toggleLayerGroup(){_this.setState(function(state){return{expandedLayerGroup:state.expandedLayerGroup===key?null:key}})};icon=/*#__PURE__*/React.createElement(Icon,{icon:_this.state.expandedLayerGroup===key?"minus":"plus",onClick:function onClick(ev){MiscUtils.killEvent(ev);toggleLayerGroup()}})}else if(result.thumbnail){icon=/*#__PURE__*/React.createElement("img",{className:"searchbox-result-thumbnail",onError:function onError(ev){return _this.loadFallbackResultImage(ev,group.type)},src:result.thumbnail})}var selectResult=result.theme?_this.selectThemeResult:_this.selectLayerResult;return/*#__PURE__*/React.createElement("div",{key:key},/*#__PURE__*/React.createElement("div",{className:"searchbox-result",onClick:function onClick(){selectResult(provider,group,result);_this.blur()},onMouseDown:MiscUtils.killEvent},icon,result.theme?/*#__PURE__*/React.createElement(Icon,{className:"searchbox-result-openicon",icon:"open"}):null,/*#__PURE__*/React.createElement("span",{className:"searchbox-result-label",dangerouslySetInnerHTML:{__html:DOMPurify.sanitize(result.text).replace(/<br\s*\/>/ig," ")},title:(_result$label3=result.label)!==null&&_result$label3!==void 0?_result$label3:result.text}),result.theme&&addThemes?/*#__PURE__*/React.createElement(Icon,{icon:"plus",onClick:function onClick(ev){MiscUtils.killEvent(ev);_this.selectLayerResult(provider,group,result);_this.blur()},title:LocaleUtils.tr("themeswitcher.addtotheme")}):null,result.sublayers?/*#__PURE__*/React.createElement(Icon,{icon:"group",onClick:function onClick(ev){MiscUtils.killEvent(ev);_this.selectLayerResult(provider,group,result,true)},title:LocaleUtils.tr("importlayer.asgroup")}):null,result.info?/*#__PURE__*/React.createElement(Icon,{icon:"info-sign",onClick:function onClick(ev){MiscUtils.killEvent(ev);_this.toggleLayerInfo(provider,group,result,key,parent)}}):null),_this.state.activeLayerInfo===key?/*#__PURE__*/React.createElement("div",{className:"searchbox-result-abstract",dangerouslySetInnerHTML:{__html:MiscUtils.addLinkAnchors(DOMPurify.sanitize(((_result$layer=result.layer)===null||_result$layer===void 0?void 0:_result$layer["abstract"])||""))||LocaleUtils.tr("search.nodescription")}}):null,_this.state.expandedLayerGroup===key?/*#__PURE__*/React.createElement("div",{className:"searchbox-result-group"},result.sublayers.map(function(sublayer){return _this.renderLayerResult(provider,group,sublayer,result.id)})):null)});_defineProperty(_this,"renderThemeResult",function(provider,group,result){var _result$label4;var addThemes=ConfigUtils.getConfigProp("allowAddingOtherThemes",_this.props.theme);return/*#__PURE__*/React.createElement("div",{className:"searchbox-result",key:provider+":"+group.id+":"+result.id,onClick:function onClick(){_this.selectThemeResult(provider,group,result);_this.blur()},onMouseDown:MiscUtils.killEvent},result.thumbnail?/*#__PURE__*/React.createElement("img",{className:"searchbox-result-thumbnail",onError:function onError(ev){return _this.loadFallbackResultImage(ev,group.type)},src:result.thumbnail}):null,/*#__PURE__*/React.createElement(Icon,{className:"searchbox-result-openicon",icon:"open"}),/*#__PURE__*/React.createElement("span",{className:"searchbox-result-label",dangerouslySetInnerHTML:{__html:DOMPurify.sanitize(result.text).replace(/<br\s*\/>/ig," ")},title:(_result$label4=result.label)!==null&&_result$label4!==void 0?_result$label4:result.text}),result.theme&&addThemes?/*#__PURE__*/React.createElement(Icon,{icon:"plus",onClick:function onClick(ev){MiscUtils.killEvent(ev);_this.addThemeLayers(result.layer);_this.blur()},title:LocaleUtils.tr("themeswitcher.addtotheme")}):null)});_defineProperty(_this,"renderTaskResult",function(provider,group,result){return/*#__PURE__*/React.createElement("div",{className:"searchbox-result",key:provider+":"+group.id+":"+result.id,onClick:function onClick(){_this.selectTaskResult(provider,group,result);_this.blur()},onMouseDown:MiscUtils.killEvent},result.task.icon?/*#__PURE__*/React.createElement(Icon,{icon:result.task.icon}):null,/*#__PURE__*/React.createElement("span",{className:"searchbox-result-label"},result.text))});_defineProperty(_this,"selectPlaceResult",function(provider,group,result){var resultText=result.text.replace(/<\/?\w+\s*\/?>/g,"");if(_this.props.searchOptions.showResultInSearchText!==false){// Show selected result text in search field
8
- _this.setState({searchText:resultText,searchResults:_defineProperty({query_text:resultText},provider,{results:[_objectSpread(_objectSpread({},group),{},{items:[result]})],tot_result_count:1})})}_this.updateRecentSearches();if(result.geometry){_this.showResultGeometry(result,{feature:{type:"Feature",geometry:result.geometry},crs:result.crs})}else if(_this.props.searchProviders[provider].getResultGeometry){_this.props.searchProviders[provider].getResultGeometry(result,function(response){_this.showResultGeometry(result,response)},axios)}else{// Display marker
9
- _this.showResultGeometry(result,{feature:{type:"Feature",geometry:{type:"Point",coordinates:[result.x,result.y]}},crs:result.crs})}if(result.dataproduct_id){var quot=typeof result.id==="string"?"\"":"";var filter="[[\"".concat(result.id_field_name,"\",\"=\", ").concat(quot).concat(result.id).concat(quot,"]]");UrlParams.updateParams({hp:result.dataproduct_id,hf:filter,st:resultText})}else{UrlParams.updateParams({hp:undefined,hf:undefined,st:resultText})}_this.props.logAction("SEARCH_TEXT",{searchText:_this.state.searchText});_this.props.logAction("SEARCH_RESULT_SELECTED",{place:resultText});// Enable layer
10
- if(result.layername){var path=[];var sublayer=null;var layer=_this.props.layers.find(function(l){return l.role===LayerRole.THEME&&(sublayer=LayerUtils.searchSubLayer(l,"name",result.layername,path))});if(layer&&sublayer){_this.props.changeLayerProperty(layer.id,"visibility",true,path,"both")}}});_defineProperty(_this,"selectLayerResult",function(provider,group,result){var asGroup=arguments.length>3&&arguments[3]!==undefined?arguments[3]:false;if(result.layer){if(result.theme){_this.addThemeLayers(result.layer)}else if(group.type===SearchResultType.THEMELAYER){_this.props.addThemeSublayer(result.layer)}else if(group.type===SearchResultType.EXTERNALLAYER){_this.addExternalLayer(result.layer,asGroup)}// Show layer tree to notify user that something has happened
11
- _this.props.setCurrentTask("LayerTree")}else if(_this.props.searchProviders[provider].getLayerDefinition){_this.props.searchProviders[provider].getLayerDefinition(result,function(layer){if(layer){if(result.theme){_this.addThemeLayers(layer)}else if(group.type===SearchResultType.THEMELAYER){_this.props.addThemeSublayer({sublayers:[layer]})}else if(group.type===SearchResultType.EXTERNALLAYER){_this.addExternalLayer(layer,asGroup)}// Show layer tree to notify user that something has happened
12
- _this.props.setCurrentTask("LayerTree")}},axios)}});_defineProperty(_this,"addExternalLayer",function(entry){var asGroup=arguments.length>1&&arguments[1]!==undefined?arguments[1]:false;if(entry.resource){var _entry$title;var params=LayerUtils.splitLayerUrlParam(entry.resource);// Create placeholder layer
13
- _this.props.addLayer({id:params.id,type:"placeholder",name:params.name,title:(_entry$title=entry.title)!==null&&_entry$title!==void 0?_entry$title:params.name,role:params.USERLAYER,loading:true});ServiceLayerUtils.findLayers(params.type,params.url,[params],_this.props.map.projection,function(id,layer){if(layer){if(!asGroup){layer.sublayers=null}LayerUtils.propagateLayerProperty(layer,"opacity",params.opacity);_this.props.replacePlaceholderLayer(params.id,layer)}else{// eslint-disable-next-line
14
- alert(LocaleUtils.tr("importlayer.addfailed"));_this.props.removeLayer(params.id)}})}else if(entry.type==="wms"||entry.type==="wfs"||entry.type==="wmts"){if(asGroup){_this.props.addLayer(entry)}else{_this.props.addLayer(_objectSpread(_objectSpread({},entry),{},{sublayers:null}))}}});_defineProperty(_this,"selectThemeResult",function(provider,group,result){_this.props.setCurrentTheme(result.theme,_this.props.themes);if(_this.props.searchOptions.showLayerAfterChangeTheme){_this.props.setCurrentTask("LayerTree")}});_defineProperty(_this,"selectTaskResult",function(provider,group,result){if(result.task.url){_this.props.openExternalUrl(result.task.url,result.task.target,result.text,result.task.icon)}else{_this.props.setCurrentTask(result.task.task||result.task.key,result.task.mode,result.task.mapClickAction||(result.task.identifyEnabled?"identify":null))}});_defineProperty(_this,"loadFallbackResultImage",function(ev,type){if(type===SearchResultType.PLACE){var iconPath=ConfigUtils.getAssetsPath()+"/img/search/";if(!ev.target.src.endsWith(iconPath+"feature.svg")){ev.target.src=iconPath+"feature.svg"}}else{ev.target.style.display="none"}});_defineProperty(_this,"toggleLayerInfo",function(provider,group,result,key,parent){var setResultLayerAndActiveInfo=function setResultLayerAndActiveInfo(layer){// Embed returned layer into result item, so that layer info is read from item.layer.abstract
15
- _this.setState(function(state){return{searchResults:_objectSpread(_objectSpread({},state.searchResults),{},_defineProperty({},provider,_objectSpread(_objectSpread({},state.searchResults[provider]),{},{results:state.searchResults[provider].results.map(function(g){if(g.id===group.id){return _objectSpread(_objectSpread({},g),{},{items:g.items.map(function(item){if(item.id===result.id){return _objectSpread(_objectSpread({},item),{},{layer:layer})}else if(item.id===parent){return _objectSpread(_objectSpread({},item),{},{sublayers:item.sublayers.map(function(sublayer){if(sublayer.id===result.id){return _objectSpread(_objectSpread({},sublayer),{},{layer:layer})}else{return sublayer}})})}else{return item}})})}else{return g}})}))),activeLayerInfo:key}})};_this.setState(function(state){if(state.activeLayerInfo===key){return{activeLayerInfo:null}}else{if(!result.layer&&_this.props.searchProviders[provider].getLayerDefinition){_this.props.searchProviders[provider].getLayerDefinition(result,setResultLayerAndActiveInfo,axios);return{}}else{return{activeLayerInfo:key}}}})});_defineProperty(_this,"setPreventBlur",function(){_this.preventBlur=true;setTimeout(function(){_this.preventBlur=false;return false},100)});_defineProperty(_this,"toggleSection",function(key){return _this.setState(function(state){var _newCollapsedSections;var newCollapsedSections=_objectSpread({},state.collapsedSections);var deflt=_this.props.searchOptions.sectionsDefaultCollapsed||false;newCollapsedSections[key]=!((_newCollapsedSections=newCollapsedSections[key])!==null&&_newCollapsedSections!==void 0?_newCollapsedSections:deflt);return{collapsedSections:newCollapsedSections}})});_defineProperty(_this,"isCollapsed",function(section){var _this$state$collapsed;var deflt=arguments.length>1&&arguments[1]!==undefined?arguments[1]:null;deflt=deflt!==null&&deflt!==void 0?deflt:_this.props.searchOptions.sectionsDefaultCollapsed||false;return(_this$state$collapsed=_this.state.collapsedSections[section])!==null&&_this$state$collapsed!==void 0?_this$state$collapsed:deflt});_defineProperty(_this,"toggleFilterOptions",function(visible){_this.setState({filterOptionsVisible:visible})});_defineProperty(_this,"searchTextChanged",function(text){var expandSections=arguments.length>1&&arguments[1]!==undefined?arguments[1]:false;var provider=arguments.length>2&&arguments[2]!==undefined?arguments[2]:null;if(_this.props.layers.find(function(layer){return layer.id==="searchselection"})){_this.props.removeLayer("searchselection")}var newState={searchText:text,expandedLayerGroup:null,activeLayerInfo:null,pendingSearches:[],searchSession:null};if(expandSections){newState.collapsedSections={}}_this.setState(newState);clearTimeout(_this.searchTimeout);_this.searchTimeout=setTimeout(function(){return _this.startSearch(provider)},250)});_defineProperty(_this,"onFocus",function(){_this.setState({resultsVisible:true});if(_this.searchBox){_this.searchBox.select()}if(isEmpty(_this.state.searchResults)&&_this.props.theme){_this.startSearch()}if(_this.props.searchOptions.allowSearchFilters){_this.toggleFilterOptions(false)}});_defineProperty(_this,"onBlur",function(){if(_this.preventBlur&&_this.searchBox){_this.searchBox.focus()}else{_this.setState({resultsVisible:false,collapsedSections:{},expandedLayerGroup:null,activeLayerInfo:null})}});_defineProperty(_this,"clear",function(){_this.props.setCurrentSearchResult(null);_this.blur();_this.setState({searchText:"",searchResults:{},selectedProvider:"",filterRegionName:"",filterGeometry:null});_this.props.removeLayer("searchselection");UrlParams.updateParams({hp:undefined,hf:undefined,st:undefined})});_defineProperty(_this,"startSearch",function(){var _this$state$filterGeo2;var provider=arguments.length>0&&arguments[0]!==undefined?arguments[0]:null;var uniquePlaceResult=arguments.length>1&&arguments[1]!==undefined?arguments[1]:false;var availableProviders=_this.props.searchProviders;var selectedProvider=provider!==null&&provider!==void 0?provider:_this.state.selectedProvider;if(selectedProvider){availableProviders=_defineProperty({},selectedProvider,_this.props.searchProviders[selectedProvider])}// eslint-disable-next-line
16
- var searchText=_this.state.searchText.trim();if(isEmpty(searchText)){_this.setState({searchResults:{}});return}var searchSession=uuidv4();_this.setState({searchResults:{query_text:searchText},searchSession:searchSession,pendingSearches:Object.keys(availableProviders)});var searchParams={mapcrs:_this.props.map.projection,displaycrs:_this.props.map.displayCrs,lang:LocaleUtils.lang(),limit:_this.props.searchOptions.resultLimit,filterPoly:(_this$state$filterGeo2=_this.state.filterGeometry)===null||_this$state$filterGeo2===void 0||(_this$state$filterGeo2=_this$state$filterGeo2.coordinates)===null||_this$state$filterGeo2===void 0?void 0:_this$state$filterGeo2[0],filterBBox:_this.state.filterGeometry?VectorLayerUtils.computeFeatureBBox(_this.state.filterGeometry):null};Object.entries(availableProviders).forEach(function(_ref5){var _ref6=_slicedToArray(_ref5,2),provKey=_ref6[0],prov=_ref6[1];prov.onSearch(searchText,_objectSpread(_objectSpread({cfgParams:prov.cfgParams},prov.params),searchParams),function(response){var results=prov.handlesGeomFilter?response.results:_this.filterProviderResults(response.results);var totResultCount=results.reduce(function(tot,group){var _group$resultCount;return tot+((_group$resultCount=group.resultCount)!==null&&_group$resultCount!==void 0?_group$resultCount:group.items.length)},0);if(uniquePlaceResult){// If looking for unique place result, filter non-place results
17
- results=results.filter(function(group){var _group$type3;return((_group$type3=group.type)!==null&&_group$type3!==void 0?_group$type3:SearchResultType.PLACE)===SearchResultType.PLACE})}_this.setState(function(state){if(searchSession!==state.searchSession){return{}}var searchResults=_objectSpread(_objectSpread({},state.searchResults),{},_defineProperty({},provKey,{results:results,result_counts:response.result_counts,tot_result_count:totResultCount}));var newPendingSearches=state.pendingSearches.filter(function(entry){return entry!==provKey});if(isEmpty(newPendingSearches)&&uniquePlaceResult){var providersWithResults=Object.entries(searchResults).filter(function(_ref7){var _ref8=_slicedToArray(_ref7,2),_=_ref8[0],providerResults=_ref8[1];return providerResults.tot_result_count>0});if(providersWithResults.length===1&&providersWithResults[0][1].tot_result_count===1){var group=providersWithResults[0][1].results[0];// Avoid warning about setState called in setState
18
- setTimeout(function(){_this.selectPlaceResult(providersWithResults[0][0],group,group.items[0])},0)}}return{searchResults:searchResults,pendingSearches:newPendingSearches}})},axios)})});_defineProperty(_this,"filterProviderResults",function(results){if(!_this.state.filterGeometry){return results}var filterPolygon=_this.state.filterGeometry.coordinates[0];return results.map(function(group){var _group$type4;var resultType=(_group$type4=group.type)!==null&&_group$type4!==void 0?_group$type4:SearchResultType.PLACE;if(resultType!==SearchResultType.PLACE){return group}var newItems=group.items.filter(function(item){var _item$crs;var geometry=null;var itemCrs=(_item$crs=item.crs)!==null&&_item$crs!==void 0?_item$crs:_this.props.map.projection;if(item.geometry){geometry=VectorLayerUtils.reprojectGeometry(item.geometry,itemCrs,_this.props.map.projection)}else{geometry={type:"Point",coordinates:CoordinatesUtils.reproject([item.x,item.y],itemCrs,_this.props.map.projection)}}if(geometry.type==="Polygon"){return polygonIntersectTest(geometry.coordinates[0],filterPolygon)}else if(item.bbox){var _CoordinatesUtils$rep=CoordinatesUtils.reprojectBbox(item.bbox,itemCrs,_this.props.map.projection),_CoordinatesUtils$rep2=_slicedToArray(_CoordinatesUtils$rep,4),xmin=_CoordinatesUtils$rep2[0],ymin=_CoordinatesUtils$rep2[1],xmax=_CoordinatesUtils$rep2[2],ymax=_CoordinatesUtils$rep2[3];return polygonIntersectTest([[xmin,ymin],[xmax,ymin],[xmax,ymax],[xmin,ymax],[xmin,ymin]],filterPolygon)}else if(geometry.type==="Point"){return pointInPolygon(geometry.coordinates,filterPolygon)}return true});return newItems.length>0?_objectSpread(_objectSpread({},group),{},{items:newItems}):null}).filter(Boolean)});_defineProperty(_this,"updateRecentSearches",function(){var text=_this.state.searchResults.query_text;if(text&&!_this.state.recentSearches.includes(text)){_this.setState(function(state){return{recentSearches:[text].concat(_toConsumableArray(state.recentSearches.slice(0,4)))}})}});_defineProperty(_this,"blur",function(){if(_this.searchBox){_this.searchBox.blur()}});_defineProperty(_this,"addThemeLayers",function(layer){// Check if layer is already in the LayerTree
19
- var sublayers=LayerUtils.getSublayerNames(layer);var existing=_this.props.layers.find(function(l){return l.type===layer.type&&l.url===layer.url&&!isEmpty(LayerUtils.getSublayerNames(l).filter(function(v){return sublayers.includes(v)}))});if(existing){var existingLayerName=(layer.sublayers||[]).length===1?layer.sublayers[0].title:layer.title;var text=LocaleUtils.tr("search.existinglayer")+": "+existingLayerName;_this.props.showNotification("existinglayer",text)}else{_this.props.addLayer(_objectSpread(_objectSpread({},layer),{},{role:LayerRole.USERLAYER}))}if(_this.props.searchOptions.zoomToLayers&&layer.bbox){_this.props.zoomToExtent(layer.bbox.bounds,layer.bbox.crs)}// Show layer tree to notify user that something has happened
20
- _this.props.setCurrentTask("LayerTree")});_defineProperty(_this,"showResultGeometry",function(item,response){var _response$crs3,_item$bbox,_item$crs4;var scale=arguments.length>2&&arguments[2]!==undefined?arguments[2]:undefined;var mapCrs=_this.props.map.projection;var feature=response!==null&&response!==void 0&&response.geometry?{type:"Feature",geometry:response.geometry}:response===null||response===void 0?void 0:response.feature;var layer={id:"searchselection",role:LayerRole.SELECTION};if(feature){var _feature$features;var features=(_feature$features=feature.features)!==null&&_feature$features!==void 0?_feature$features:[feature];features.forEach(function(feat){var _response$crs,_feat$geometry,_feat$crs;feat.geometry=VectorLayerUtils.reprojectGeometry(feat.geometry,(_response$crs=response.crs)!==null&&_response$crs!==void 0?_response$crs:mapCrs,mapCrs);feat.styleName=((_feat$geometry=feat.geometry)===null||_feat$geometry===void 0?void 0:_feat$geometry.type)==="Point"&&_this.props.searchOptions.showHighlightMarker?"marker":"default";feat.styleOptions=_this.props.searchOptions.highlightStyle||{};if((_feat$crs=feat.crs)!==null&&_feat$crs!==void 0&&(_feat$crs=_feat$crs.properties)!==null&&_feat$crs!==void 0&&_feat$crs.name){feat.crs=CoordinatesUtils.fromOgcUrnCrs(feat.crs.properties.name)}});// If first feature is not a point(=marker), add a marker
21
- if(features[0].styleName!=="marker"&&!response.hidemarker&&_this.props.searchOptions.showHighlightMarker){var _response$crs2,_item$crs2;var center=response.center?CoordinatesUtils.reproject(response.center,(_response$crs2=response.crs)!==null&&_response$crs2!==void 0?_response$crs2:mapCrs,mapCrs):CoordinatesUtils.reproject([item.x,item.y],(_item$crs2=item.crs)!==null&&_item$crs2!==void 0?_item$crs2:mapCrs,mapCrs);features.unshift({geometry:{type:"Point",coordinates:center},styleName:"marker"})}// Label first feature
22
- if(!_this.props.searchOptions.hideResultLabels){var _ref9,_item$label;var label=((_ref9=(_item$label=item.label)!==null&&_item$label!==void 0?_item$label:item.text)!==null&&_ref9!==void 0?_ref9:"").replace(/<\/?\w+\s*\/?>/g,"");features[0].properties=_objectSpread(_objectSpread({},features[0].properties),{},{label:label})}// Mark first feature as searchmarker
23
- features[0].id="searchmarker";_this.props.addLayerFeatures(layer,features,true)}else{var _item$crs3;var _center=CoordinatesUtils.reproject([item.x,item.y],(_item$crs3=item.crs)!==null&&_item$crs3!==void 0?_item$crs3:mapCrs,mapCrs);var marker={type:"Feature",geometry:{type:"Point",coordinates:_center},styleName:"marker"};if(!_this.props.searchOptions.hideResultLabels){var _ref10,_item$label2;var _label=((_ref10=(_item$label2=item.label)!==null&&_item$label2!==void 0?_item$label2:item.text)!==null&&_ref10!==void 0?_ref10:"").replace(/<\/?\w+\s*\/?>/g,"");marker.properties={label:_label}}_this.props.addLayerFeatures(layer,[marker],true)}var bbox=response!==null&&response!==void 0&&response.bbox?CoordinatesUtils.reprojectBbox(response.bbox,(_response$crs3=response.crs)!==null&&_response$crs3!==void 0?_response$crs3:mapCrs,mapCrs):CoordinatesUtils.reprojectBbox((_item$bbox=item.bbox)!==null&&_item$bbox!==void 0?_item$bbox:[item.x,item.y,item.x,item.y],(_item$crs4=item.crs)!==null&&_item$crs4!==void 0?_item$crs4:mapCrs,mapCrs);_this.zoomToResultBBox(bbox,scale);_this.props.setCurrentSearchResult(item)});_defineProperty(_this,"zoomToResultBBox",function(bbox,scale){var zoom=0;if(scale){zoom=MapUtils.computeZoom(_this.props.map.scales,scale)}else{var maxZoom=MapUtils.computeZoom(_this.props.map.scales,_this.props.theme.minSearchScaleDenom||_this.props.searchOptions.minScaleDenom);if(bbox[0]!==bbox[2]&&bbox[1]!==bbox[3]){zoom=Math.max(0,MapUtils.getZoomForExtent(bbox,_this.props.map.resolutions,_this.props.map.size,0,maxZoom+1)-1)}else{zoom=maxZoom}}var x=0.5*(bbox[0]+bbox[2]);var y=0.5*(bbox[1]+bbox[3]);_this.props.zoomToPoint([x,y],zoom,_this.props.map.projection)});_defineProperty(_this,"openUrl",function(url,target,title){if(target==="iframe"){target=":iframedialog:externallinkiframe"}_this.props.openExternalUrl(url,target,{title:title})});_this.searchBox=null;_this.searchTimeout=null;_this.preventBlur=false;return _this}_inherits(SearchBox,_React$Component);return _createClass(SearchBox,[{key:"componentDidUpdate",value:function componentDidUpdate(prevProps,prevState){var _this2=this;// Restore highlight from URL as soon as theme is loaded
24
- if(this.props.theme&&!prevProps.theme){var hp=this.props.startupParams.hp;var hf=this.props.startupParams.hf;var st=this.props.startupParams.st||this.props.startupParams.ht||"";if(hp&&(hf||st)){this.setState({searchText:st});FulltextSearch.handleHighlightParameters(hp,hf,st,function(item,result){_this2.showResultGeometry(item,result,_this2.props.startupParams.s)})}else{this.setState({searchText:st},function(){return _this2.startSearch(null,true)})}UrlParams.updateParams({hp:undefined,hf:undefined,ht:undefined,st:undefined});this.loadFilterRegions()}else if(this.props.theme!==prevProps.theme){this.clear();this.loadFilterRegions()}// Trigger search when closing filter options
25
- if(!this.state.filterOptionsVisible&&prevState.filterOptionsVisible){this.searchTextChanged(this.state.searchText)}}},{key:"render",value:function render(){var _this3=this;var placeholder=LocaleUtils.tr("search.placeholder");var filterButtonClasses=classnames({"button":true,"searchbox-filter-button":true,"pressed":this.state.filterOptionsVisible||this.state.selectedProvider||this.state.filterGeometry});return[/*#__PURE__*/React.createElement("div",{className:"SearchBox",key:"SearchBox"},/*#__PURE__*/React.createElement(InputContainer,{className:"searchbox-field"},/*#__PURE__*/React.createElement(Icon,{icon:"search",role:"prefix"}),/*#__PURE__*/React.createElement("input",{onBlur:this.onBlur,onChange:function onChange(ev){return _this3.searchTextChanged(ev.target.value)},onFocus:this.onFocus,placeholder:placeholder,ref:function ref(el){_this3.searchBox=el},role:"input",type:"text",value:this.state.searchText}),this.state.pendingSearches.length>0?/*#__PURE__*/React.createElement(Spinner,{role:"suffix"}):/*#__PURE__*/React.createElement(Icon,{icon:"clear",onClick:this.clear,role:"suffix"})),this.props.searchOptions.allowSearchFilters?/*#__PURE__*/React.createElement("button",{className:filterButtonClasses,onClick:function onClick(){return _this3.toggleFilterOptions(!_this3.state.filterOptionsVisible)},title:LocaleUtils.tr("search.filter")},/*#__PURE__*/React.createElement(Icon,{icon:"filter"}),/*#__PURE__*/React.createElement(Icon,{icon:"chevron-down"})):null,this.renderResultsMenu(),this.renderFilterOptions()),/*#__PURE__*/React.createElement(MapSelection,{active:this.state.filterOptionsVisible&&this.state.filterGeomType!==null,geomType:this.state.filterGeomType,geometry:this.state.filterGeometry,geometryChanged:function geometryChanged(geom){return _this3.setState({filterGeometry:geom})},key:"MapSelection",measure:this.state.filterGeomType==="Circle"})]}}])}(React.Component);_defineProperty(SearchBox,"propTypes",{addLayer:PropTypes.func,addLayerFeatures:PropTypes.func,addThemeSublayer:PropTypes.func,changeLayerProperty:PropTypes.func,layers:PropTypes.array,logAction:PropTypes.func,map:PropTypes.object,openExternalUrl:PropTypes.func,panTo:PropTypes.func,removeLayer:PropTypes.func,replacePlaceholderLayer:PropTypes.func,searchOptions:PropTypes.shape({allowSearchFilters:PropTypes.bool,hideResultLabels:PropTypes.bool,highlightStyle:PropTypes.object,minScaleDenom:PropTypes.number,resultLimit:PropTypes.number,sectionsDefaultCollapsed:PropTypes.bool,showHighlightMarker:PropTypes.bool,showLayerAfterChangeTheme:PropTypes.bool,showLayerResultsBeforePlaces:PropTypes.bool,showResultInSearchText:PropTypes.bool,zoomToLayers:PropTypes.bool}),searchProviders:PropTypes.object,setCurrentSearchResult:PropTypes.func,setCurrentTask:PropTypes.func,setCurrentTheme:PropTypes.func,showNotification:PropTypes.func,startupParams:PropTypes.object,theme:PropTypes.object,themes:PropTypes.object,zoomToExtent:PropTypes.func,zoomToPoint:PropTypes.func});export default connect(createSelector([function(state){return state},searchProvidersSelector],function(state,searchProviders){return{map:state.map,layers:state.layers.flat,theme:state.theme.current,themes:state.theme.themes,selection:state.selection,searchProviders:searchProviders,startupParams:state.localConfig.startupParams}}),{addThemeSublayer:addThemeSublayer,addLayer:addLayer,addLayerFeatures:addLayerFeatures,changeLayerProperty:changeLayerProperty,removeLayer:removeLayer,replacePlaceholderLayer:replacePlaceholderLayer,setCurrentSearchResult:setCurrentSearchResult,setCurrentTask:setCurrentTask,zoomToExtent:zoomToExtent,zoomToPoint:zoomToPoint,panTo:panTo,logAction:logAction,setCurrentTheme:setCurrentTheme,showNotification:showNotification,openExternalUrl:openExternalUrl})(SearchBox);
33
+ */
34
+
35
+ import React from 'react';
36
+ import { connect } from 'react-redux';
37
+ import axios from 'axios';
38
+ import classnames from 'classnames';
39
+ import DOMPurify from 'dompurify';
40
+ import isEmpty from 'lodash.isempty';
41
+ import pointInPolygon from 'point-in-polygon';
42
+ import polygonIntersectTest from 'polygon-intersect-test';
43
+ import PropTypes from 'prop-types';
44
+ import { createSelector } from 'reselect';
45
+ import { v4 as uuidv4 } from 'uuid';
46
+ import { LayerRole, addLayerFeatures, addThemeSublayer, changeLayerProperty, removeLayer, replacePlaceholderLayer, addLayer } from '../actions/layers';
47
+ import { logAction } from '../actions/logging';
48
+ import { panTo, zoomToExtent, zoomToPoint } from '../actions/map';
49
+ import { setCurrentSearchResult } from '../actions/search';
50
+ import { setCurrentTask } from '../actions/task';
51
+ import { setCurrentTheme } from '../actions/theme';
52
+ import { openExternalUrl, showNotification } from '../actions/windows';
53
+ import searchProvidersSelector from '../selectors/searchproviders';
54
+ import ConfigUtils from '../utils/ConfigUtils';
55
+ import CoordinatesUtils from '../utils/CoordinatesUtils';
56
+ import LayerUtils from '../utils/LayerUtils';
57
+ import LocaleUtils from '../utils/LocaleUtils';
58
+ import MapUtils from '../utils/MapUtils';
59
+ import MiscUtils from '../utils/MiscUtils';
60
+ import { UrlParams } from '../utils/PermaLinkUtils';
61
+ import { FulltextSearch, SearchResultType } from '../utils/SearchProviders';
62
+ import ServiceLayerUtils from '../utils/ServiceLayerUtils';
63
+ import VectorLayerUtils from '../utils/VectorLayerUtils';
64
+ import Icon from './Icon';
65
+ import MapSelection from './MapSelection';
66
+ import ButtonBar from './widgets/ButtonBar';
67
+ import ComboBox from './widgets/ComboBox';
68
+ import InputContainer from './widgets/InputContainer';
69
+ import NumberInput from './widgets/NumberInput';
70
+ import Spinner from './widgets/Spinner';
71
+ import './style/SearchBox.css';
72
+ var SearchBox = /*#__PURE__*/function (_React$Component) {
73
+ function SearchBox(props) {
74
+ var _this;
75
+ _classCallCheck(this, SearchBox);
76
+ _this = _callSuper(this, SearchBox, [props]);
77
+ _defineProperty(_this, "state", {
78
+ searchText: "",
79
+ searchSession: null,
80
+ pendingSearches: [],
81
+ recentSearches: [],
82
+ searchResults: {},
83
+ resultsVisible: false,
84
+ collapsedSections: {},
85
+ expandedLayerGroup: null,
86
+ activeLayerInfo: null,
87
+ filterOptionsVisible: false,
88
+ searchFilterRegions: null,
89
+ selectedProvider: "",
90
+ filterRegionName: "",
91
+ filterGeomType: null,
92
+ filterGeometry: null
93
+ });
94
+ _defineProperty(_this, "loadFilterRegions", function () {
95
+ var searchRegions = ConfigUtils.getConfigProp("searchFilterRegions", _this.props.theme);
96
+ if (Array.isArray(searchRegions)) {
97
+ _this.setState({
98
+ searchFilterRegions: searchRegions
99
+ });
100
+ } else if (typeof searchRegions === 'string') {
101
+ axios.get(searchRegions).then(function (response) {
102
+ _this.setState({
103
+ searchFilterRegions: response.data
104
+ });
105
+ })["catch"](function () {
106
+ _this.setState({
107
+ searchFilterRegions: null
108
+ });
109
+ });
110
+ } else {
111
+ _this.setState({
112
+ searchFilterRegions: null
113
+ });
114
+ }
115
+ });
116
+ _defineProperty(_this, "renderFilterOptions", function () {
117
+ var _this$state$filterGeo;
118
+ if (!_this.state.filterOptionsVisible) {
119
+ return null;
120
+ }
121
+ var providerSelection = /*#__PURE__*/React.createElement(ComboBox, {
122
+ onChange: function onChange(value) {
123
+ return _this.setState({
124
+ selectedProvider: value
125
+ });
126
+ },
127
+ value: _this.state.selectedProvider
128
+ }, /*#__PURE__*/React.createElement("div", {
129
+ value: ""
130
+ }, LocaleUtils.tr("search.all")), Object.entries(_this.props.searchProviders).map(function (_ref) {
131
+ var _prov$params, _prov$label;
132
+ var _ref2 = _slicedToArray(_ref, 2),
133
+ key = _ref2[0],
134
+ prov = _ref2[1];
135
+ return /*#__PURE__*/React.createElement("div", {
136
+ key: key,
137
+ value: key
138
+ }, (prov === null || prov === void 0 || (_prov$params = prov.params) === null || _prov$params === void 0 ? void 0 : _prov$params.title) || ((_prov$label = prov.label) !== null && _prov$label !== void 0 ? _prov$label : LocaleUtils.tr(prov.labelmsgid)));
139
+ }));
140
+ var searchRegionSelection = null;
141
+ if (Array.isArray(_this.state.searchFilterRegions)) {
142
+ searchRegionSelection = /*#__PURE__*/React.createElement(ComboBox, {
143
+ onChange: function onChange(value) {
144
+ return _this.setFilterRegion(value, _this.state.searchFilterRegions);
145
+ },
146
+ value: _this.state.filterRegionName
147
+ }, /*#__PURE__*/React.createElement("div", {
148
+ value: ""
149
+ }, LocaleUtils.tr("search.none")), _this.state.searchFilterRegions.map(function (group, gidx) {
150
+ return [/*#__PURE__*/React.createElement("div", {
151
+ "data-group-header": gidx,
152
+ disabled: true,
153
+ key: "group" + gidx
154
+ }, group.name)].concat(_toConsumableArray(group.items.map(function (item, idx) {
155
+ return /*#__PURE__*/React.createElement("div", {
156
+ "data-group": gidx,
157
+ key: item.name,
158
+ value: gidx + ":" + idx + ":" + item.name
159
+ }, item.name);
160
+ })));
161
+ }));
162
+ }
163
+ var filterButtons = [{
164
+ key: "Polygon",
165
+ tooltip: LocaleUtils.tr("redlining.polygon"),
166
+ icon: "polygon",
167
+ label: LocaleUtils.tr("redlining.polygon")
168
+ }, {
169
+ key: "Circle",
170
+ tooltip: LocaleUtils.tr("redlining.circle"),
171
+ icon: "circle",
172
+ label: LocaleUtils.tr("redlining.circle")
173
+ }];
174
+ return /*#__PURE__*/React.createElement("div", {
175
+ className: "searchbox-filter-options"
176
+ }, /*#__PURE__*/React.createElement("table", null, /*#__PURE__*/React.createElement("tbody", null, /*#__PURE__*/React.createElement("tr", null, /*#__PURE__*/React.createElement("td", null, LocaleUtils.tr("search.providerselection"), ":"), /*#__PURE__*/React.createElement("td", null, providerSelection)), /*#__PURE__*/React.createElement("tr", null, /*#__PURE__*/React.createElement("td", null, LocaleUtils.tr("search.limittoarea"), ":"), /*#__PURE__*/React.createElement("td", null, /*#__PURE__*/React.createElement("div", {
177
+ className: "searchbox-filter-options-geometry controlgroup"
178
+ }, /*#__PURE__*/React.createElement(ButtonBar, {
179
+ active: _this.state.filterGeomType,
180
+ buttons: filterButtons,
181
+ onClick: _this.setFilterGeomType
182
+ }), searchRegionSelection, /*#__PURE__*/React.createElement("button", {
183
+ className: "button",
184
+ onClick: _this.clearFilter,
185
+ title: LocaleUtils.tr("search.clearfilter")
186
+ }, /*#__PURE__*/React.createElement(Icon, {
187
+ icon: "clear"
188
+ }))))), _this.state.filterGeomType === 'Circle' ? /*#__PURE__*/React.createElement("tr", null, /*#__PURE__*/React.createElement("td", null, LocaleUtils.tr("search.circleradius"), ":"), /*#__PURE__*/React.createElement("td", null, /*#__PURE__*/React.createElement(NumberInput, {
189
+ disabled: !_this.state.filterGeometry,
190
+ min: 1,
191
+ mobile: true,
192
+ onChange: _this.setCircleRadius,
193
+ suffix: " m",
194
+ value: ((_this$state$filterGeo = _this.state.filterGeometry) === null || _this$state$filterGeo === void 0 ? void 0 : _this$state$filterGeo.radius) || 0
195
+ }))) : null)));
196
+ });
197
+ _defineProperty(_this, "setFilterGeomType", function (geomType) {
198
+ _this.setState({
199
+ filterGeomType: geomType,
200
+ filterRegionName: "",
201
+ filterGeometry: null
202
+ });
203
+ });
204
+ _defineProperty(_this, "setFilterRegion", function (value, searchRegions) {
205
+ if (value) {
206
+ var parts = value.split(":");
207
+ var item = searchRegions[parts[0]].items[parts[1]];
208
+ var geometry = {
209
+ type: "Polygon",
210
+ coordinates: [item.coordinates]
211
+ };
212
+ var mapGeometry = VectorLayerUtils.reprojectGeometry(geometry, item.crs, _this.props.map.projection);
213
+ _this.setState({
214
+ filterGeomType: null,
215
+ filterRegionName: value,
216
+ filterGeometry: mapGeometry
217
+ });
218
+ } else {
219
+ _this.setState({
220
+ filterGeomType: null,
221
+ filterRegionName: "",
222
+ filterGeometry: null
223
+ });
224
+ }
225
+ });
226
+ _defineProperty(_this, "setCircleRadius", function (value) {
227
+ _this.setState(function (state) {
228
+ return {
229
+ filterGeometry: _objectSpread(_objectSpread({}, state.filterGeometry), {}, {
230
+ radius: value
231
+ })
232
+ };
233
+ });
234
+ });
235
+ _defineProperty(_this, "clearFilter", function () {
236
+ _this.setState({
237
+ filterGeomType: null,
238
+ filterRegionName: "",
239
+ filterGeometry: null
240
+ });
241
+ });
242
+ _defineProperty(_this, "renderResultsMenu", function () {
243
+ if (!_this.state.resultsVisible) {
244
+ return false;
245
+ }
246
+ var children = [_this.renderRecentResults(), _this.renderFilters(), _this.renderResults()];
247
+ children = children.filter(function (child) {
248
+ return !isEmpty(child);
249
+ });
250
+ if (isEmpty(children)) {
251
+ if (isEmpty(_this.state.pendingSearches) && _this.state.searchResults.query_text) {
252
+ children = /*#__PURE__*/React.createElement("div", {
253
+ className: "searchbox-noresults"
254
+ }, LocaleUtils.tr("search.noresults"));
255
+ } else {
256
+ return null;
257
+ }
258
+ }
259
+ return /*#__PURE__*/React.createElement("div", {
260
+ className: "searchbox-results",
261
+ onMouseDown: _this.setPreventBlur,
262
+ ref: MiscUtils.setupKillTouchEvents
263
+ }, children);
264
+ });
265
+ _defineProperty(_this, "renderRecentResults", function () {
266
+ var recentSearches = _this.state.recentSearches.filter(function (entry) {
267
+ return entry.toLowerCase().includes(_this.state.searchText.toLowerCase());
268
+ });
269
+ if (isEmpty(recentSearches) || recentSearches.length === 1 && recentSearches[0].toLowerCase() === _this.state.searchText.toLowerCase()) {
270
+ return null;
271
+ }
272
+ return /*#__PURE__*/React.createElement("div", {
273
+ key: "recent"
274
+ }, /*#__PURE__*/React.createElement("div", {
275
+ className: "searchbox-results-section-title",
276
+ onClick: function onClick() {
277
+ return _this.toggleSection("recent");
278
+ },
279
+ onMouseDown: MiscUtils.killEvent
280
+ }, /*#__PURE__*/React.createElement(Icon, {
281
+ icon: _this.isCollapsed("recent") ? "expand" : "collapse"
282
+ }), LocaleUtils.tr("search.recent")), !_this.isCollapsed("recent") ? /*#__PURE__*/React.createElement("div", {
283
+ className: "searchbox-results-section-body"
284
+ }, recentSearches.map(function (entry, idx) {
285
+ return /*#__PURE__*/React.createElement("div", {
286
+ className: "searchbox-result",
287
+ key: "r" + idx,
288
+ onClick: function onClick() {
289
+ return _this.searchTextChanged(entry);
290
+ },
291
+ onMouseDown: MiscUtils.killEvent
292
+ }, entry);
293
+ })) : null);
294
+ });
295
+ _defineProperty(_this, "renderFilters", function () {
296
+ return Object.entries(_this.state.searchResults).map(function (_ref3) {
297
+ var _ref4 = _slicedToArray(_ref3, 2),
298
+ provider = _ref4[0],
299
+ results = _ref4[1];
300
+ if (isEmpty(results.result_counts) || results.result_counts.length < 2) {
301
+ return null;
302
+ }
303
+ var collapsed = _this.isCollapsed('filter', false);
304
+ var values = results.result_counts.map(function (entry) {
305
+ return entry.filterword + ": " + _this.state.searchResults.query_text;
306
+ });
307
+ values.sort(function (a, b) {
308
+ return a.localeCompare(b);
309
+ });
310
+ return /*#__PURE__*/React.createElement("div", {
311
+ key: "filter"
312
+ }, /*#__PURE__*/React.createElement("div", {
313
+ className: "searchbox-results-section-title",
314
+ onClick: function onClick() {
315
+ return _this.toggleSection("filter");
316
+ },
317
+ onMouseDown: MiscUtils.killEvent
318
+ }, /*#__PURE__*/React.createElement(Icon, {
319
+ icon: collapsed ? "expand" : "collapse"
320
+ }), LocaleUtils.tr("search.filter")), !collapsed ? /*#__PURE__*/React.createElement("div", {
321
+ className: "searchbox-results-section-body"
322
+ }, values.map(function (value, idx) {
323
+ return /*#__PURE__*/React.createElement("div", {
324
+ className: "searchbox-result",
325
+ key: "f" + idx,
326
+ onClick: function onClick() {
327
+ return _this.searchTextChanged(value, true, provider);
328
+ },
329
+ onMouseDown: MiscUtils.killEvent
330
+ }, /*#__PURE__*/React.createElement("span", {
331
+ className: "searchbox-result-label"
332
+ }, value));
333
+ })) : null);
334
+ }).filter(Boolean);
335
+ });
336
+ _defineProperty(_this, "renderResults", function () {
337
+ var resultRenderers = _defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty({}, SearchResultType.PLACE, _this.renderPlaceResult), SearchResultType.THEMELAYER, _this.renderLayerResult), SearchResultType.EXTERNALLAYER, _this.renderLayerResult), SearchResultType.THEME, _this.renderThemeResult), SearchResultType.TASK, _this.renderTaskResult);
338
+ var layersBeforePlaces = _this.props.searchOptions.showLayerResultsBeforePlaces;
339
+ var priorities = _defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty({}, SearchResultType.PLACE, layersBeforePlaces ? 0 : 3), SearchResultType.THEMELAYER, layersBeforePlaces ? 2 : 1), SearchResultType.EXTERNALLAYER, layersBeforePlaces ? 3 : 2), SearchResultType.THEME, layersBeforePlaces ? 1 : 0), SearchResultType.TASK, 4);
340
+ var results = Object.keys(_this.props.searchProviders).reduce(function (result, provider) {
341
+ if (!_this.state.searchResults[provider]) {
342
+ return result;
343
+ }
344
+ return result.concat(_this.state.searchResults[provider].results.map(function (group) {
345
+ var _group$type, _group$type2, _group$title, _group$title2;
346
+ var sectionId = provider + ":" + group.id;
347
+ var moreLabel = null;
348
+ if (group.resultCount > 0 && group.resultCount > group.items.length) {
349
+ moreLabel = LocaleUtils.tr("search.more", group.resultCount - group.items.length);
350
+ } else if (group.resultCount === -1) {
351
+ moreLabel = LocaleUtils.tr("search.unknownmore");
352
+ }
353
+ if (group.items.length === 0) {
354
+ return null;
355
+ }
356
+ var renderer = resultRenderers[(_group$type = group.type) !== null && _group$type !== void 0 ? _group$type : SearchResultType.PLACE];
357
+ if (!renderer) {
358
+ return null;
359
+ }
360
+ var priority = priorities[(_group$type2 = group.type) !== null && _group$type2 !== void 0 ? _group$type2 : SearchResultType.PLACE];
361
+ return {
362
+ priority: priority * 1000000 + (group.priority || 0),
363
+ title: (_group$title = group.title) !== null && _group$title !== void 0 ? _group$title : LocaleUtils.tr(group.titlemsgid),
364
+ tree: /*#__PURE__*/React.createElement("div", {
365
+ key: sectionId
366
+ }, /*#__PURE__*/React.createElement("div", {
367
+ className: "searchbox-results-section-title",
368
+ onClick: function onClick() {
369
+ return _this.toggleSection(sectionId);
370
+ },
371
+ onMouseDown: MiscUtils.killEvent
372
+ }, /*#__PURE__*/React.createElement(Icon, {
373
+ icon: _this.isCollapsed(sectionId) ? "expand" : "collapse"
374
+ }), /*#__PURE__*/React.createElement("span", null, (_group$title2 = group.title) !== null && _group$title2 !== void 0 ? _group$title2 : LocaleUtils.tr(group.titlemsgid))), !_this.isCollapsed(sectionId) ? /*#__PURE__*/React.createElement("div", {
375
+ className: "searchbox-results-section-body"
376
+ }, group.items.map(function (entry) {
377
+ return renderer(provider, group, entry);
378
+ }), moreLabel ? /*#__PURE__*/React.createElement("div", {
379
+ className: "searchbox-more-results"
380
+ }, moreLabel) : null) : null)
381
+ };
382
+ }));
383
+ }, []).filter(Boolean);
384
+ results.sort(function (a, b) {
385
+ if (b.priority !== a.priority) {
386
+ return b.priority - a.priority;
387
+ } else {
388
+ return b.title.localeCompare(a.title);
389
+ }
390
+ });
391
+ return isEmpty(results) ? null : results.map(function (entry) {
392
+ return entry.tree;
393
+ });
394
+ });
395
+ _defineProperty(_this, "renderPlaceResult", function (provider, group, result) {
396
+ var _result$label;
397
+ var key = provider + ":" + group.id + ":" + result.id;
398
+ return /*#__PURE__*/React.createElement("div", {
399
+ className: "searchbox-result",
400
+ key: key,
401
+ onClick: function onClick() {
402
+ _this.selectPlaceResult(provider, group, result);
403
+ _this.blur();
404
+ },
405
+ onMouseDown: MiscUtils.killEvent
406
+ }, result.thumbnail ? /*#__PURE__*/React.createElement("img", {
407
+ className: "searchbox-result-thumbnail",
408
+ onError: function onError(ev) {
409
+ return _this.loadFallbackResultImage(ev, group.type);
410
+ },
411
+ src: result.thumbnail
412
+ }) : null, /*#__PURE__*/React.createElement("span", {
413
+ className: "searchbox-result-label",
414
+ dangerouslySetInnerHTML: {
415
+ __html: DOMPurify.sanitize(result.text).replace(/<br\s*\/>/ig, ' ')
416
+ },
417
+ title: (_result$label = result.label) !== null && _result$label !== void 0 ? _result$label : result.text
418
+ }), result.externalLink ? /*#__PURE__*/React.createElement(Icon, {
419
+ icon: "info-sign",
420
+ onClick: function onClick(ev) {
421
+ var _result$label2;
422
+ MiscUtils.killEvent(ev);
423
+ _this.openUrl(result.externalLink, result.target, (_result$label2 = result.label) !== null && _result$label2 !== void 0 ? _result$label2 : result.text);
424
+ }
425
+ }) : null);
426
+ });
427
+ _defineProperty(_this, "renderLayerResult", function (provider, group, result) {
428
+ var _result$label3, _result$layer;
429
+ var parent = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;
430
+ var key = provider + ":" + group.id + ":" + result.id;
431
+ var addThemes = ConfigUtils.getConfigProp("allowAddingOtherThemes", _this.props.theme);
432
+ var icon = null;
433
+ if (result.sublayers) {
434
+ var toggleLayerGroup = function toggleLayerGroup() {
435
+ _this.setState(function (state) {
436
+ return {
437
+ expandedLayerGroup: state.expandedLayerGroup === key ? null : key
438
+ };
439
+ });
440
+ };
441
+ icon = /*#__PURE__*/React.createElement(Icon, {
442
+ icon: _this.state.expandedLayerGroup === key ? "minus" : "plus",
443
+ onClick: function onClick(ev) {
444
+ MiscUtils.killEvent(ev);
445
+ toggleLayerGroup();
446
+ }
447
+ });
448
+ } else if (result.thumbnail) {
449
+ icon = /*#__PURE__*/React.createElement("img", {
450
+ className: "searchbox-result-thumbnail",
451
+ onError: function onError(ev) {
452
+ return _this.loadFallbackResultImage(ev, group.type);
453
+ },
454
+ src: result.thumbnail
455
+ });
456
+ }
457
+ var selectResult = result.theme ? _this.selectThemeResult : _this.selectLayerResult;
458
+ return /*#__PURE__*/React.createElement("div", {
459
+ key: key
460
+ }, /*#__PURE__*/React.createElement("div", {
461
+ className: "searchbox-result",
462
+ onClick: function onClick() {
463
+ selectResult(provider, group, result);
464
+ _this.blur();
465
+ },
466
+ onMouseDown: MiscUtils.killEvent
467
+ }, icon, result.theme ? /*#__PURE__*/React.createElement(Icon, {
468
+ className: "searchbox-result-openicon",
469
+ icon: "open"
470
+ }) : null, /*#__PURE__*/React.createElement("span", {
471
+ className: "searchbox-result-label",
472
+ dangerouslySetInnerHTML: {
473
+ __html: DOMPurify.sanitize(result.text).replace(/<br\s*\/>/ig, ' ')
474
+ },
475
+ title: (_result$label3 = result.label) !== null && _result$label3 !== void 0 ? _result$label3 : result.text
476
+ }), result.theme && addThemes ? /*#__PURE__*/React.createElement(Icon, {
477
+ icon: "plus",
478
+ onClick: function onClick(ev) {
479
+ MiscUtils.killEvent(ev);
480
+ _this.selectLayerResult(provider, group, result);
481
+ _this.blur();
482
+ },
483
+ title: LocaleUtils.tr("themeswitcher.addtotheme")
484
+ }) : null, result.sublayers ? /*#__PURE__*/React.createElement(Icon, {
485
+ icon: "group",
486
+ onClick: function onClick(ev) {
487
+ MiscUtils.killEvent(ev);
488
+ _this.selectLayerResult(provider, group, result, true);
489
+ },
490
+ title: LocaleUtils.tr("importlayer.asgroup")
491
+ }) : null, result.info ? /*#__PURE__*/React.createElement(Icon, {
492
+ icon: "info-sign",
493
+ onClick: function onClick(ev) {
494
+ MiscUtils.killEvent(ev);
495
+ _this.toggleLayerInfo(provider, group, result, key, parent);
496
+ }
497
+ }) : null), _this.state.activeLayerInfo === key ? /*#__PURE__*/React.createElement("div", {
498
+ className: "searchbox-result-abstract",
499
+ dangerouslySetInnerHTML: {
500
+ __html: MiscUtils.addLinkAnchors(DOMPurify.sanitize(((_result$layer = result.layer) === null || _result$layer === void 0 ? void 0 : _result$layer["abstract"]) || "")) || LocaleUtils.tr("search.nodescription")
501
+ }
502
+ }) : null, _this.state.expandedLayerGroup === key ? /*#__PURE__*/React.createElement("div", {
503
+ className: "searchbox-result-group"
504
+ }, result.sublayers.map(function (sublayer) {
505
+ return _this.renderLayerResult(provider, group, sublayer, result.id);
506
+ })) : null);
507
+ });
508
+ _defineProperty(_this, "renderThemeResult", function (provider, group, result) {
509
+ var _result$label4;
510
+ var addThemes = ConfigUtils.getConfigProp("allowAddingOtherThemes", _this.props.theme);
511
+ return /*#__PURE__*/React.createElement("div", {
512
+ className: "searchbox-result",
513
+ key: provider + ":" + group.id + ":" + result.id,
514
+ onClick: function onClick() {
515
+ _this.selectThemeResult(provider, group, result);
516
+ _this.blur();
517
+ },
518
+ onMouseDown: MiscUtils.killEvent
519
+ }, result.thumbnail ? /*#__PURE__*/React.createElement("img", {
520
+ className: "searchbox-result-thumbnail",
521
+ onError: function onError(ev) {
522
+ return _this.loadFallbackResultImage(ev, group.type);
523
+ },
524
+ src: result.thumbnail
525
+ }) : null, /*#__PURE__*/React.createElement(Icon, {
526
+ className: "searchbox-result-openicon",
527
+ icon: "open"
528
+ }), /*#__PURE__*/React.createElement("span", {
529
+ className: "searchbox-result-label",
530
+ dangerouslySetInnerHTML: {
531
+ __html: DOMPurify.sanitize(result.text).replace(/<br\s*\/>/ig, ' ')
532
+ },
533
+ title: (_result$label4 = result.label) !== null && _result$label4 !== void 0 ? _result$label4 : result.text
534
+ }), result.theme && addThemes ? /*#__PURE__*/React.createElement(Icon, {
535
+ icon: "plus",
536
+ onClick: function onClick(ev) {
537
+ MiscUtils.killEvent(ev);
538
+ _this.addThemeLayers(result.layer);
539
+ _this.blur();
540
+ },
541
+ title: LocaleUtils.tr("themeswitcher.addtotheme")
542
+ }) : null);
543
+ });
544
+ _defineProperty(_this, "renderTaskResult", function (provider, group, result) {
545
+ return /*#__PURE__*/React.createElement("div", {
546
+ className: "searchbox-result",
547
+ key: provider + ":" + group.id + ":" + result.id,
548
+ onClick: function onClick() {
549
+ _this.selectTaskResult(provider, group, result);
550
+ _this.blur();
551
+ },
552
+ onMouseDown: MiscUtils.killEvent
553
+ }, result.task.icon ? /*#__PURE__*/React.createElement(Icon, {
554
+ icon: result.task.icon
555
+ }) : null, /*#__PURE__*/React.createElement("span", {
556
+ className: "searchbox-result-label"
557
+ }, result.text));
558
+ });
559
+ _defineProperty(_this, "selectPlaceResult", function (provider, group, result) {
560
+ var resultText = result.text.replace(/<\/?\w+\s*\/?>/g, '');
561
+ if (_this.props.searchOptions.showResultInSearchText !== false) {
562
+ // Show selected result text in search field
563
+ _this.setState({
564
+ searchText: resultText,
565
+ searchResults: _defineProperty({
566
+ query_text: resultText
567
+ }, provider, {
568
+ results: [_objectSpread(_objectSpread({}, group), {}, {
569
+ items: [result]
570
+ })],
571
+ tot_result_count: 1
572
+ })
573
+ });
574
+ }
575
+ _this.updateRecentSearches();
576
+ if (result.geometry) {
577
+ _this.showResultGeometry(result, {
578
+ feature: {
579
+ type: "Feature",
580
+ geometry: result.geometry
581
+ },
582
+ crs: result.crs
583
+ });
584
+ } else if (_this.props.searchProviders[provider].getResultGeometry) {
585
+ _this.props.searchProviders[provider].getResultGeometry(result, function (response) {
586
+ _this.showResultGeometry(result, response);
587
+ }, axios);
588
+ } else {
589
+ // Display marker
590
+ _this.showResultGeometry(result, {
591
+ feature: {
592
+ type: "Feature",
593
+ geometry: {
594
+ type: "Point",
595
+ coordinates: [result.x, result.y]
596
+ }
597
+ },
598
+ crs: result.crs
599
+ });
600
+ }
601
+ if (result.dataproduct_id) {
602
+ var quot = typeof result.id === 'string' ? '"' : '';
603
+ var filter = "[[\"".concat(result.id_field_name, "\",\"=\", ").concat(quot).concat(result.id).concat(quot, "]]");
604
+ UrlParams.updateParams({
605
+ hp: result.dataproduct_id,
606
+ hf: filter,
607
+ st: resultText
608
+ });
609
+ } else {
610
+ UrlParams.updateParams({
611
+ hp: undefined,
612
+ hf: undefined,
613
+ st: resultText
614
+ });
615
+ }
616
+ _this.props.logAction("SEARCH_TEXT", {
617
+ searchText: _this.state.searchText
618
+ });
619
+ _this.props.logAction("SEARCH_RESULT_SELECTED", {
620
+ place: resultText
621
+ });
622
+
623
+ // Enable layer
624
+ if (result.layername) {
625
+ var path = [];
626
+ var sublayer = null;
627
+ var layer = _this.props.layers.find(function (l) {
628
+ return l.role === LayerRole.THEME && (sublayer = LayerUtils.searchSubLayer(l, 'name', result.layername, path));
629
+ });
630
+ if (layer && sublayer) {
631
+ _this.props.changeLayerProperty(layer.id, "visibility", true, path, 'both');
632
+ }
633
+ }
634
+ });
635
+ _defineProperty(_this, "selectLayerResult", function (provider, group, result) {
636
+ var asGroup = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
637
+ if (result.layer) {
638
+ if (result.theme) {
639
+ _this.addThemeLayers(result.layer);
640
+ } else if (group.type === SearchResultType.THEMELAYER) {
641
+ _this.props.addThemeSublayer(result.layer);
642
+ } else if (group.type === SearchResultType.EXTERNALLAYER) {
643
+ _this.addExternalLayer(result.layer, asGroup);
644
+ }
645
+ // Show layer tree to notify user that something has happened
646
+ _this.props.setCurrentTask('LayerTree');
647
+ } else if (_this.props.searchProviders[provider].getLayerDefinition) {
648
+ _this.props.searchProviders[provider].getLayerDefinition(result, function (layer) {
649
+ if (layer) {
650
+ if (result.theme) {
651
+ _this.addThemeLayers(layer);
652
+ } else if (group.type === SearchResultType.THEMELAYER) {
653
+ _this.props.addThemeSublayer({
654
+ sublayers: [layer]
655
+ });
656
+ } else if (group.type === SearchResultType.EXTERNALLAYER) {
657
+ _this.addExternalLayer(layer, asGroup);
658
+ }
659
+ // Show layer tree to notify user that something has happened
660
+ _this.props.setCurrentTask('LayerTree');
661
+ }
662
+ }, axios);
663
+ }
664
+ });
665
+ _defineProperty(_this, "addExternalLayer", function (entry) {
666
+ var asGroup = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
667
+ if (entry.resource) {
668
+ var _entry$title;
669
+ var params = LayerUtils.splitLayerUrlParam(entry.resource);
670
+ // Create placeholder layer
671
+ _this.props.addLayer({
672
+ id: params.id,
673
+ type: "placeholder",
674
+ name: params.name,
675
+ title: (_entry$title = entry.title) !== null && _entry$title !== void 0 ? _entry$title : params.name,
676
+ role: params.USERLAYER,
677
+ loading: true
678
+ });
679
+ ServiceLayerUtils.findLayers(params.type, params.url, [params], _this.props.map.projection, function (id, layer) {
680
+ if (layer) {
681
+ if (!asGroup) {
682
+ layer.sublayers = null;
683
+ }
684
+ LayerUtils.propagateLayerProperty(layer, "opacity", params.opacity);
685
+ _this.props.replacePlaceholderLayer(params.id, layer);
686
+ } else {
687
+ // eslint-disable-next-line
688
+ alert(LocaleUtils.tr("importlayer.addfailed"));
689
+ _this.props.removeLayer(params.id);
690
+ }
691
+ });
692
+ } else if (entry.type === "wms" || entry.type === "wfs" || entry.type === "wmts") {
693
+ if (asGroup) {
694
+ _this.props.addLayer(entry);
695
+ } else {
696
+ _this.props.addLayer(_objectSpread(_objectSpread({}, entry), {}, {
697
+ sublayers: null
698
+ }));
699
+ }
700
+ }
701
+ });
702
+ _defineProperty(_this, "selectThemeResult", function (provider, group, result) {
703
+ _this.props.setCurrentTheme(result.theme, _this.props.themes);
704
+ if (_this.props.searchOptions.showLayerAfterChangeTheme) {
705
+ _this.props.setCurrentTask('LayerTree');
706
+ }
707
+ });
708
+ _defineProperty(_this, "selectTaskResult", function (provider, group, result) {
709
+ if (result.task.url) {
710
+ _this.props.openExternalUrl(result.task.url, result.task.target, result.text, result.task.icon);
711
+ } else {
712
+ _this.props.setCurrentTask(result.task.task || result.task.key, result.task.mode, result.task.mapClickAction || (result.task.identifyEnabled ? "identify" : null));
713
+ }
714
+ });
715
+ _defineProperty(_this, "loadFallbackResultImage", function (ev, type) {
716
+ if (type === SearchResultType.PLACE) {
717
+ var iconPath = ConfigUtils.getAssetsPath() + '/img/search/';
718
+ if (!ev.target.src.endsWith(iconPath + "feature.svg")) {
719
+ ev.target.src = iconPath + "feature.svg";
720
+ }
721
+ } else {
722
+ ev.target.style.display = 'none';
723
+ }
724
+ });
725
+ _defineProperty(_this, "toggleLayerInfo", function (provider, group, result, key, parent) {
726
+ var setResultLayerAndActiveInfo = function setResultLayerAndActiveInfo(layer) {
727
+ // Embed returned layer into result item, so that layer info is read from item.layer.abstract
728
+ _this.setState(function (state) {
729
+ return {
730
+ searchResults: _objectSpread(_objectSpread({}, state.searchResults), {}, _defineProperty({}, provider, _objectSpread(_objectSpread({}, state.searchResults[provider]), {}, {
731
+ results: state.searchResults[provider].results.map(function (g) {
732
+ if (g.id === group.id) {
733
+ return _objectSpread(_objectSpread({}, g), {}, {
734
+ items: g.items.map(function (item) {
735
+ if (item.id === result.id) {
736
+ return _objectSpread(_objectSpread({}, item), {}, {
737
+ layer: layer
738
+ });
739
+ } else if (item.id === parent) {
740
+ return _objectSpread(_objectSpread({}, item), {}, {
741
+ sublayers: item.sublayers.map(function (sublayer) {
742
+ if (sublayer.id === result.id) {
743
+ return _objectSpread(_objectSpread({}, sublayer), {}, {
744
+ layer: layer
745
+ });
746
+ } else {
747
+ return sublayer;
748
+ }
749
+ })
750
+ });
751
+ } else {
752
+ return item;
753
+ }
754
+ })
755
+ });
756
+ } else {
757
+ return g;
758
+ }
759
+ })
760
+ }))),
761
+ activeLayerInfo: key
762
+ };
763
+ });
764
+ };
765
+ _this.setState(function (state) {
766
+ if (state.activeLayerInfo === key) {
767
+ return {
768
+ activeLayerInfo: null
769
+ };
770
+ } else {
771
+ if (!result.layer && _this.props.searchProviders[provider].getLayerDefinition) {
772
+ _this.props.searchProviders[provider].getLayerDefinition(result, setResultLayerAndActiveInfo, axios);
773
+ return {};
774
+ } else {
775
+ return {
776
+ activeLayerInfo: key
777
+ };
778
+ }
779
+ }
780
+ });
781
+ });
782
+ _defineProperty(_this, "setPreventBlur", function () {
783
+ _this.preventBlur = true;
784
+ setTimeout(function () {
785
+ _this.preventBlur = false;
786
+ return false;
787
+ }, 100);
788
+ });
789
+ _defineProperty(_this, "toggleSection", function (key) {
790
+ return _this.setState(function (state) {
791
+ var _newCollapsedSections;
792
+ var newCollapsedSections = _objectSpread({}, state.collapsedSections);
793
+ var deflt = _this.props.searchOptions.sectionsDefaultCollapsed || false;
794
+ newCollapsedSections[key] = !((_newCollapsedSections = newCollapsedSections[key]) !== null && _newCollapsedSections !== void 0 ? _newCollapsedSections : deflt);
795
+ return {
796
+ collapsedSections: newCollapsedSections
797
+ };
798
+ });
799
+ });
800
+ _defineProperty(_this, "isCollapsed", function (section) {
801
+ var _this$state$collapsed;
802
+ var deflt = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
803
+ deflt = deflt !== null && deflt !== void 0 ? deflt : _this.props.searchOptions.sectionsDefaultCollapsed || false;
804
+ return (_this$state$collapsed = _this.state.collapsedSections[section]) !== null && _this$state$collapsed !== void 0 ? _this$state$collapsed : deflt;
805
+ });
806
+ _defineProperty(_this, "toggleFilterOptions", function (visible) {
807
+ _this.setState({
808
+ filterOptionsVisible: visible
809
+ });
810
+ });
811
+ _defineProperty(_this, "searchTextChanged", function (text) {
812
+ var expandSections = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
813
+ var provider = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
814
+ if (_this.props.layers.find(function (layer) {
815
+ return layer.id === 'searchselection';
816
+ })) {
817
+ _this.props.removeLayer('searchselection');
818
+ }
819
+ var newState = {
820
+ searchText: text,
821
+ expandedLayerGroup: null,
822
+ activeLayerInfo: null,
823
+ pendingSearches: [],
824
+ searchSession: null
825
+ };
826
+ if (expandSections) {
827
+ newState.collapsedSections = {};
828
+ }
829
+ _this.setState(newState);
830
+ clearTimeout(_this.searchTimeout);
831
+ _this.searchTimeout = setTimeout(function () {
832
+ return _this.startSearch(provider);
833
+ }, 250);
834
+ });
835
+ _defineProperty(_this, "onFocus", function () {
836
+ _this.setState({
837
+ resultsVisible: true
838
+ });
839
+ if (_this.searchBox) {
840
+ _this.searchBox.select();
841
+ }
842
+ if (isEmpty(_this.state.searchResults) && _this.props.theme) {
843
+ _this.startSearch();
844
+ }
845
+ if (_this.props.searchOptions.allowSearchFilters) {
846
+ _this.toggleFilterOptions(false);
847
+ }
848
+ });
849
+ _defineProperty(_this, "onBlur", function () {
850
+ if (_this.preventBlur && _this.searchBox) {
851
+ _this.searchBox.focus();
852
+ } else {
853
+ _this.setState({
854
+ resultsVisible: false,
855
+ collapsedSections: {},
856
+ expandedLayerGroup: null,
857
+ activeLayerInfo: null
858
+ });
859
+ }
860
+ });
861
+ _defineProperty(_this, "clear", function () {
862
+ _this.props.setCurrentSearchResult(null);
863
+ _this.blur();
864
+ _this.setState({
865
+ searchText: '',
866
+ searchResults: {},
867
+ selectedProvider: '',
868
+ filterRegionName: "",
869
+ filterGeometry: null
870
+ });
871
+ _this.props.removeLayer('searchselection');
872
+ UrlParams.updateParams({
873
+ hp: undefined,
874
+ hf: undefined,
875
+ st: undefined
876
+ });
877
+ });
878
+ _defineProperty(_this, "startSearch", function () {
879
+ var _this$state$filterGeo2;
880
+ var provider = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
881
+ var uniquePlaceResult = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
882
+ var availableProviders = _this.props.searchProviders;
883
+ var selectedProvider = provider !== null && provider !== void 0 ? provider : _this.state.selectedProvider;
884
+ if (selectedProvider) {
885
+ availableProviders = _defineProperty({}, selectedProvider, _this.props.searchProviders[selectedProvider]);
886
+ }
887
+ // eslint-disable-next-line
888
+ var searchText = _this.state.searchText.trim();
889
+ if (isEmpty(searchText)) {
890
+ _this.setState({
891
+ searchResults: {}
892
+ });
893
+ return;
894
+ }
895
+ var searchSession = uuidv4();
896
+ _this.setState({
897
+ searchResults: {
898
+ query_text: searchText
899
+ },
900
+ searchSession: searchSession,
901
+ pendingSearches: Object.keys(availableProviders)
902
+ });
903
+ var searchParams = {
904
+ mapcrs: _this.props.map.projection,
905
+ displaycrs: _this.props.map.displayCrs,
906
+ lang: LocaleUtils.lang(),
907
+ limit: _this.props.searchOptions.resultLimit,
908
+ filterPoly: (_this$state$filterGeo2 = _this.state.filterGeometry) === null || _this$state$filterGeo2 === void 0 || (_this$state$filterGeo2 = _this$state$filterGeo2.coordinates) === null || _this$state$filterGeo2 === void 0 ? void 0 : _this$state$filterGeo2[0],
909
+ filterBBox: _this.state.filterGeometry ? VectorLayerUtils.computeFeatureBBox(_this.state.filterGeometry) : null
910
+ };
911
+ Object.entries(availableProviders).forEach(function (_ref5) {
912
+ var _ref6 = _slicedToArray(_ref5, 2),
913
+ provKey = _ref6[0],
914
+ prov = _ref6[1];
915
+ prov.onSearch(searchText, _objectSpread(_objectSpread({
916
+ cfgParams: prov.cfgParams
917
+ }, prov.params), searchParams), function (response) {
918
+ var results = prov.handlesGeomFilter ? response.results : _this.filterProviderResults(response.results);
919
+ var totResultCount = results.reduce(function (tot, group) {
920
+ var _group$resultCount;
921
+ return tot + ((_group$resultCount = group.resultCount) !== null && _group$resultCount !== void 0 ? _group$resultCount : group.items.length);
922
+ }, 0);
923
+ if (uniquePlaceResult) {
924
+ // If looking for unique place result, filter non-place results
925
+ results = results.filter(function (group) {
926
+ var _group$type3;
927
+ return ((_group$type3 = group.type) !== null && _group$type3 !== void 0 ? _group$type3 : SearchResultType.PLACE) === SearchResultType.PLACE;
928
+ });
929
+ }
930
+ _this.setState(function (state) {
931
+ if (searchSession !== state.searchSession) {
932
+ return {};
933
+ }
934
+ var searchResults = _objectSpread(_objectSpread({}, state.searchResults), {}, _defineProperty({}, provKey, {
935
+ results: results,
936
+ result_counts: response.result_counts,
937
+ tot_result_count: totResultCount
938
+ }));
939
+ var newPendingSearches = state.pendingSearches.filter(function (entry) {
940
+ return entry !== provKey;
941
+ });
942
+ if (isEmpty(newPendingSearches) && uniquePlaceResult) {
943
+ var providersWithResults = Object.entries(searchResults).filter(function (_ref7) {
944
+ var _ref8 = _slicedToArray(_ref7, 2),
945
+ _ = _ref8[0],
946
+ providerResults = _ref8[1];
947
+ return providerResults.tot_result_count > 0;
948
+ });
949
+ if (providersWithResults.length === 1 && providersWithResults[0][1].tot_result_count === 1) {
950
+ var group = providersWithResults[0][1].results[0];
951
+ // Avoid warning about setState called in setState
952
+ setTimeout(function () {
953
+ _this.selectPlaceResult(providersWithResults[0][0], group, group.items[0]);
954
+ }, 0);
955
+ }
956
+ }
957
+ return {
958
+ searchResults: searchResults,
959
+ pendingSearches: newPendingSearches
960
+ };
961
+ });
962
+ }, axios);
963
+ });
964
+ });
965
+ _defineProperty(_this, "filterProviderResults", function (results) {
966
+ if (!_this.state.filterGeometry) {
967
+ return results;
968
+ }
969
+ var filterPolygon = _this.state.filterGeometry.coordinates[0];
970
+ return results.map(function (group) {
971
+ var _group$type4;
972
+ var resultType = (_group$type4 = group.type) !== null && _group$type4 !== void 0 ? _group$type4 : SearchResultType.PLACE;
973
+ if (resultType !== SearchResultType.PLACE) {
974
+ return group;
975
+ }
976
+ var newItems = group.items.filter(function (item) {
977
+ var _item$crs;
978
+ var geometry = null;
979
+ var itemCrs = (_item$crs = item.crs) !== null && _item$crs !== void 0 ? _item$crs : _this.props.map.projection;
980
+ if (item.geometry) {
981
+ geometry = VectorLayerUtils.reprojectGeometry(item.geometry, itemCrs, _this.props.map.projection);
982
+ } else {
983
+ geometry = {
984
+ type: 'Point',
985
+ coordinates: CoordinatesUtils.reproject([item.x, item.y], itemCrs, _this.props.map.projection)
986
+ };
987
+ }
988
+ if (geometry.type === 'Polygon') {
989
+ return polygonIntersectTest(geometry.coordinates[0], filterPolygon);
990
+ } else if (item.bbox) {
991
+ var _CoordinatesUtils$rep = CoordinatesUtils.reprojectBbox(item.bbox, itemCrs, _this.props.map.projection),
992
+ _CoordinatesUtils$rep2 = _slicedToArray(_CoordinatesUtils$rep, 4),
993
+ xmin = _CoordinatesUtils$rep2[0],
994
+ ymin = _CoordinatesUtils$rep2[1],
995
+ xmax = _CoordinatesUtils$rep2[2],
996
+ ymax = _CoordinatesUtils$rep2[3];
997
+ return polygonIntersectTest([[xmin, ymin], [xmax, ymin], [xmax, ymax], [xmin, ymax], [xmin, ymin]], filterPolygon);
998
+ } else if (geometry.type === 'Point') {
999
+ return pointInPolygon(geometry.coordinates, filterPolygon);
1000
+ }
1001
+ return true;
1002
+ });
1003
+ return newItems.length > 0 ? _objectSpread(_objectSpread({}, group), {}, {
1004
+ items: newItems
1005
+ }) : null;
1006
+ }).filter(Boolean);
1007
+ });
1008
+ _defineProperty(_this, "updateRecentSearches", function () {
1009
+ var text = _this.state.searchResults.query_text;
1010
+ if (text && !_this.state.recentSearches.includes(text)) {
1011
+ _this.setState(function (state) {
1012
+ return {
1013
+ recentSearches: [text].concat(_toConsumableArray(state.recentSearches.slice(0, 4)))
1014
+ };
1015
+ });
1016
+ }
1017
+ });
1018
+ _defineProperty(_this, "blur", function () {
1019
+ if (_this.searchBox) {
1020
+ _this.searchBox.blur();
1021
+ }
1022
+ });
1023
+ _defineProperty(_this, "addThemeLayers", function (layer) {
1024
+ // Check if layer is already in the LayerTree
1025
+ var sublayers = LayerUtils.getSublayerNames(layer);
1026
+ var existing = _this.props.layers.find(function (l) {
1027
+ return l.type === layer.type && l.url === layer.url && !isEmpty(LayerUtils.getSublayerNames(l).filter(function (v) {
1028
+ return sublayers.includes(v);
1029
+ }));
1030
+ });
1031
+ if (existing) {
1032
+ var existingLayerName = (layer.sublayers || []).length === 1 ? layer.sublayers[0].title : layer.title;
1033
+ var text = LocaleUtils.tr("search.existinglayer") + ": " + existingLayerName;
1034
+ _this.props.showNotification("existinglayer", text);
1035
+ } else {
1036
+ _this.props.addLayer(_objectSpread(_objectSpread({}, layer), {}, {
1037
+ role: LayerRole.USERLAYER
1038
+ }));
1039
+ }
1040
+ if (_this.props.searchOptions.zoomToLayers && layer.bbox) {
1041
+ _this.props.zoomToExtent(layer.bbox.bounds, layer.bbox.crs);
1042
+ }
1043
+ // Show layer tree to notify user that something has happened
1044
+ _this.props.setCurrentTask('LayerTree');
1045
+ });
1046
+ _defineProperty(_this, "showResultGeometry", function (item, response) {
1047
+ var _response$crs3, _item$bbox, _item$crs4;
1048
+ var scale = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : undefined;
1049
+ var mapCrs = _this.props.map.projection;
1050
+ var feature = response !== null && response !== void 0 && response.geometry ? {
1051
+ type: "Feature",
1052
+ geometry: response.geometry
1053
+ } : response === null || response === void 0 ? void 0 : response.feature;
1054
+ var layer = {
1055
+ id: "searchselection",
1056
+ role: LayerRole.SELECTION
1057
+ };
1058
+ if (feature) {
1059
+ var _feature$features;
1060
+ var features = (_feature$features = feature.features) !== null && _feature$features !== void 0 ? _feature$features : [feature];
1061
+ features.forEach(function (feat) {
1062
+ var _response$crs, _feat$geometry, _feat$crs;
1063
+ feat.geometry = VectorLayerUtils.reprojectGeometry(feat.geometry, (_response$crs = response.crs) !== null && _response$crs !== void 0 ? _response$crs : mapCrs, mapCrs);
1064
+ feat.styleName = ((_feat$geometry = feat.geometry) === null || _feat$geometry === void 0 ? void 0 : _feat$geometry.type) === 'Point' && _this.props.searchOptions.showHighlightMarker ? 'marker' : 'default';
1065
+ feat.styleOptions = _this.props.searchOptions.highlightStyle || {};
1066
+ if ((_feat$crs = feat.crs) !== null && _feat$crs !== void 0 && (_feat$crs = _feat$crs.properties) !== null && _feat$crs !== void 0 && _feat$crs.name) {
1067
+ feat.crs = CoordinatesUtils.fromOgcUrnCrs(feat.crs.properties.name);
1068
+ }
1069
+ });
1070
+ // If first feature is not a point(=marker), add a marker
1071
+ if (features[0].styleName !== "marker" && !response.hidemarker && _this.props.searchOptions.showHighlightMarker) {
1072
+ var _response$crs2, _item$crs2;
1073
+ var center = response.center ? CoordinatesUtils.reproject(response.center, (_response$crs2 = response.crs) !== null && _response$crs2 !== void 0 ? _response$crs2 : mapCrs, mapCrs) : CoordinatesUtils.reproject([item.x, item.y], (_item$crs2 = item.crs) !== null && _item$crs2 !== void 0 ? _item$crs2 : mapCrs, mapCrs);
1074
+ features.unshift({
1075
+ geometry: {
1076
+ type: 'Point',
1077
+ coordinates: center
1078
+ },
1079
+ styleName: 'marker'
1080
+ });
1081
+ }
1082
+ // Label first feature
1083
+ if (!_this.props.searchOptions.hideResultLabels) {
1084
+ var _ref9, _item$label;
1085
+ var label = ((_ref9 = (_item$label = item.label) !== null && _item$label !== void 0 ? _item$label : item.text) !== null && _ref9 !== void 0 ? _ref9 : '').replace(/<\/?\w+\s*\/?>/g, '');
1086
+ features[0].properties = _objectSpread(_objectSpread({}, features[0].properties), {}, {
1087
+ label: label
1088
+ });
1089
+ }
1090
+ // Mark first feature as searchmarker
1091
+ features[0].id = 'searchmarker';
1092
+ _this.props.addLayerFeatures(layer, features, true);
1093
+ } else {
1094
+ var _item$crs3;
1095
+ var _center = CoordinatesUtils.reproject([item.x, item.y], (_item$crs3 = item.crs) !== null && _item$crs3 !== void 0 ? _item$crs3 : mapCrs, mapCrs);
1096
+ var marker = {
1097
+ type: "Feature",
1098
+ geometry: {
1099
+ type: "Point",
1100
+ coordinates: _center
1101
+ },
1102
+ styleName: 'marker'
1103
+ };
1104
+ if (!_this.props.searchOptions.hideResultLabels) {
1105
+ var _ref10, _item$label2;
1106
+ var _label = ((_ref10 = (_item$label2 = item.label) !== null && _item$label2 !== void 0 ? _item$label2 : item.text) !== null && _ref10 !== void 0 ? _ref10 : '').replace(/<\/?\w+\s*\/?>/g, '');
1107
+ marker.properties = {
1108
+ label: _label
1109
+ };
1110
+ }
1111
+ _this.props.addLayerFeatures(layer, [marker], true);
1112
+ }
1113
+ var bbox = response !== null && response !== void 0 && response.bbox ? CoordinatesUtils.reprojectBbox(response.bbox, (_response$crs3 = response.crs) !== null && _response$crs3 !== void 0 ? _response$crs3 : mapCrs, mapCrs) : CoordinatesUtils.reprojectBbox((_item$bbox = item.bbox) !== null && _item$bbox !== void 0 ? _item$bbox : [item.x, item.y, item.x, item.y], (_item$crs4 = item.crs) !== null && _item$crs4 !== void 0 ? _item$crs4 : mapCrs, mapCrs);
1114
+ _this.zoomToResultBBox(bbox, scale);
1115
+ _this.props.setCurrentSearchResult(item);
1116
+ });
1117
+ _defineProperty(_this, "zoomToResultBBox", function (bbox, scale) {
1118
+ var zoom = 0;
1119
+ if (scale) {
1120
+ zoom = MapUtils.computeZoom(_this.props.map.scales, scale);
1121
+ } else {
1122
+ var maxZoom = MapUtils.computeZoom(_this.props.map.scales, _this.props.theme.minSearchScaleDenom || _this.props.searchOptions.minScaleDenom);
1123
+ if (bbox[0] !== bbox[2] && bbox[1] !== bbox[3]) {
1124
+ zoom = Math.max(0, MapUtils.getZoomForExtent(bbox, _this.props.map.resolutions, _this.props.map.size, 0, maxZoom + 1) - 1);
1125
+ } else {
1126
+ zoom = maxZoom;
1127
+ }
1128
+ }
1129
+ var x = 0.5 * (bbox[0] + bbox[2]);
1130
+ var y = 0.5 * (bbox[1] + bbox[3]);
1131
+ _this.props.zoomToPoint([x, y], zoom, _this.props.map.projection);
1132
+ });
1133
+ _defineProperty(_this, "openUrl", function (url, target, title) {
1134
+ if (target === "iframe") {
1135
+ target = ":iframedialog:externallinkiframe";
1136
+ }
1137
+ _this.props.openExternalUrl(url, target, {
1138
+ title: title
1139
+ });
1140
+ });
1141
+ _this.searchBox = null;
1142
+ _this.searchTimeout = null;
1143
+ _this.preventBlur = false;
1144
+ return _this;
1145
+ }
1146
+ _inherits(SearchBox, _React$Component);
1147
+ return _createClass(SearchBox, [{
1148
+ key: "componentDidUpdate",
1149
+ value: function componentDidUpdate(prevProps, prevState) {
1150
+ var _this2 = this;
1151
+ // Restore highlight from URL as soon as theme is loaded
1152
+ if (this.props.theme && !prevProps.theme) {
1153
+ var hp = this.props.startupParams.hp;
1154
+ var hf = this.props.startupParams.hf;
1155
+ var st = this.props.startupParams.st || this.props.startupParams.ht || "";
1156
+ if (hp && (hf || st)) {
1157
+ this.setState({
1158
+ searchText: st
1159
+ });
1160
+ FulltextSearch.handleHighlightParameters(hp, hf, st, function (item, result) {
1161
+ _this2.showResultGeometry(item, result, _this2.props.startupParams.s);
1162
+ });
1163
+ } else {
1164
+ this.setState({
1165
+ searchText: st
1166
+ }, function () {
1167
+ return _this2.startSearch(null, true);
1168
+ });
1169
+ }
1170
+ UrlParams.updateParams({
1171
+ hp: undefined,
1172
+ hf: undefined,
1173
+ ht: undefined,
1174
+ st: undefined
1175
+ });
1176
+ this.loadFilterRegions();
1177
+ } else if (this.props.theme !== prevProps.theme) {
1178
+ this.clear();
1179
+ this.loadFilterRegions();
1180
+ }
1181
+ // Trigger search when closing filter options
1182
+ if (!this.state.filterOptionsVisible && prevState.filterOptionsVisible) {
1183
+ this.searchTextChanged(this.state.searchText);
1184
+ }
1185
+ }
1186
+ }, {
1187
+ key: "render",
1188
+ value: function render() {
1189
+ var _this3 = this;
1190
+ var placeholder = LocaleUtils.tr("search.placeholder");
1191
+ var filterButtonClasses = classnames({
1192
+ "button": true,
1193
+ "searchbox-filter-button": true,
1194
+ "pressed": this.state.filterOptionsVisible || this.state.selectedProvider || this.state.filterGeometry
1195
+ });
1196
+ return [/*#__PURE__*/React.createElement("div", {
1197
+ className: "SearchBox",
1198
+ key: "SearchBox"
1199
+ }, /*#__PURE__*/React.createElement(InputContainer, {
1200
+ className: "searchbox-field"
1201
+ }, /*#__PURE__*/React.createElement(Icon, {
1202
+ icon: "search",
1203
+ role: "prefix"
1204
+ }), /*#__PURE__*/React.createElement("input", {
1205
+ onBlur: this.onBlur,
1206
+ onChange: function onChange(ev) {
1207
+ return _this3.searchTextChanged(ev.target.value);
1208
+ },
1209
+ onFocus: this.onFocus,
1210
+ placeholder: placeholder,
1211
+ ref: function ref(el) {
1212
+ _this3.searchBox = el;
1213
+ },
1214
+ role: "input",
1215
+ type: "text",
1216
+ value: this.state.searchText
1217
+ }), this.state.pendingSearches.length > 0 ? /*#__PURE__*/React.createElement(Spinner, {
1218
+ role: "suffix"
1219
+ }) : /*#__PURE__*/React.createElement(Icon, {
1220
+ icon: "clear",
1221
+ onClick: this.clear,
1222
+ role: "suffix"
1223
+ })), this.props.searchOptions.allowSearchFilters ? /*#__PURE__*/React.createElement("button", {
1224
+ className: filterButtonClasses,
1225
+ onClick: function onClick() {
1226
+ return _this3.toggleFilterOptions(!_this3.state.filterOptionsVisible);
1227
+ },
1228
+ title: LocaleUtils.tr("search.filter")
1229
+ }, /*#__PURE__*/React.createElement(Icon, {
1230
+ icon: "filter"
1231
+ }), /*#__PURE__*/React.createElement(Icon, {
1232
+ icon: "chevron-down"
1233
+ })) : null, this.renderResultsMenu(), this.renderFilterOptions()), /*#__PURE__*/React.createElement(MapSelection, {
1234
+ active: this.state.filterOptionsVisible && this.state.filterGeomType !== null,
1235
+ geomType: this.state.filterGeomType,
1236
+ geometry: this.state.filterGeometry,
1237
+ geometryChanged: function geometryChanged(geom) {
1238
+ return _this3.setState({
1239
+ filterGeometry: geom
1240
+ });
1241
+ },
1242
+ key: "MapSelection",
1243
+ measure: this.state.filterGeomType === "Circle"
1244
+ })];
1245
+ }
1246
+ }]);
1247
+ }(React.Component);
1248
+ _defineProperty(SearchBox, "propTypes", {
1249
+ addLayer: PropTypes.func,
1250
+ addLayerFeatures: PropTypes.func,
1251
+ addThemeSublayer: PropTypes.func,
1252
+ changeLayerProperty: PropTypes.func,
1253
+ layers: PropTypes.array,
1254
+ logAction: PropTypes.func,
1255
+ map: PropTypes.object,
1256
+ openExternalUrl: PropTypes.func,
1257
+ panTo: PropTypes.func,
1258
+ removeLayer: PropTypes.func,
1259
+ replacePlaceholderLayer: PropTypes.func,
1260
+ searchOptions: PropTypes.shape({
1261
+ allowSearchFilters: PropTypes.bool,
1262
+ hideResultLabels: PropTypes.bool,
1263
+ highlightStyle: PropTypes.object,
1264
+ minScaleDenom: PropTypes.number,
1265
+ resultLimit: PropTypes.number,
1266
+ sectionsDefaultCollapsed: PropTypes.bool,
1267
+ showHighlightMarker: PropTypes.bool,
1268
+ showLayerAfterChangeTheme: PropTypes.bool,
1269
+ showLayerResultsBeforePlaces: PropTypes.bool,
1270
+ showResultInSearchText: PropTypes.bool,
1271
+ zoomToLayers: PropTypes.bool
1272
+ }),
1273
+ searchProviders: PropTypes.object,
1274
+ setCurrentSearchResult: PropTypes.func,
1275
+ setCurrentTask: PropTypes.func,
1276
+ setCurrentTheme: PropTypes.func,
1277
+ showNotification: PropTypes.func,
1278
+ startupParams: PropTypes.object,
1279
+ theme: PropTypes.object,
1280
+ themes: PropTypes.object,
1281
+ zoomToExtent: PropTypes.func,
1282
+ zoomToPoint: PropTypes.func
1283
+ });
1284
+ export default connect(createSelector([function (state) {
1285
+ return state;
1286
+ }, searchProvidersSelector], function (state, searchProviders) {
1287
+ return {
1288
+ map: state.map,
1289
+ layers: state.layers.flat,
1290
+ theme: state.theme.current,
1291
+ themes: state.theme.themes,
1292
+ selection: state.selection,
1293
+ searchProviders: searchProviders,
1294
+ startupParams: state.localConfig.startupParams
1295
+ };
1296
+ }), {
1297
+ addThemeSublayer: addThemeSublayer,
1298
+ addLayer: addLayer,
1299
+ addLayerFeatures: addLayerFeatures,
1300
+ changeLayerProperty: changeLayerProperty,
1301
+ removeLayer: removeLayer,
1302
+ replacePlaceholderLayer: replacePlaceholderLayer,
1303
+ setCurrentSearchResult: setCurrentSearchResult,
1304
+ setCurrentTask: setCurrentTask,
1305
+ zoomToExtent: zoomToExtent,
1306
+ zoomToPoint: zoomToPoint,
1307
+ panTo: panTo,
1308
+ logAction: logAction,
1309
+ setCurrentTheme: setCurrentTheme,
1310
+ showNotification: showNotification,
1311
+ openExternalUrl: openExternalUrl
1312
+ })(SearchBox);