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,4 +1,342 @@
1
- function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(o){return typeof o}:function(o){return o&&"function"==typeof Symbol&&o.constructor===Symbol&&o!==Symbol.prototype?"symbol":typeof o},_typeof(o)}function _slicedToArray(r,e){return _arrayWithHoles(r)||_iterableToArrayLimit(r,e)||_unsupportedIterableToArray(r,e)||_nonIterableRest()}function _nonIterableRest(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _unsupportedIterableToArray(r,a){if(r){if("string"==typeof r)return _arrayLikeToArray(r,a);var t={}.toString.call(r).slice(8,-1);return"Object"===t&&r.constructor&&(t=r.constructor.name),"Map"===t||"Set"===t?Array.from(r):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?_arrayLikeToArray(r,a):void 0}}function _arrayLikeToArray(r,a){(null==a||a>r.length)&&(a=r.length);for(var e=0,n=Array(a);e<a;e++)n[e]=r[e];return n}function _iterableToArrayLimit(r,l){var t=null==r?null:"undefined"!=typeof Symbol&&r[Symbol.iterator]||r["@@iterator"];if(null!=t){var e,n,i,u,a=[],f=!0,o=!1;try{if(i=(t=t.call(r)).next,0===l){if(Object(t)!==t)return;f=!1}else for(;!(f=(e=i.call(t)).done)&&(a.push(e.value),a.length!==l);f=!0);}catch(r){o=!0,n=r}finally{try{if(!f&&null!=t["return"]&&(u=t["return"](),Object(u)!==u))return}finally{if(o)throw n}}return a}}function _arrayWithHoles(r){if(Array.isArray(r))return r}function _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)}import React from"react";import{connect}from"react-redux";import axios from"axios";import PropTypes from"prop-types";import{addLayer,addLayerFeatures,LayerRole,removeLayer}from"../actions/layers";import{setCurrentTask}from"../actions/task";import MapSelection from"../components/MapSelection";import ResizeableWindow from"../components/ResizeableWindow";import ConfigUtils from"../utils/ConfigUtils";import CoordinatesUtils from"../utils/CoordinatesUtils";import LocaleUtils from"../utils/LocaleUtils";import MapUtils from"../utils/MapUtils";import ResourceRegistry from"../utils/ResourceRegistry";import"@panoramax/web-viewer";import"@panoramax/web-viewer/build/index.css";import"./style/Panoramax.css";/**
1
+ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
2
+ function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
3
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
4
+ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
5
+ function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
6
+ function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
7
+ function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
8
+ function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); }
9
+ 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); } }
10
+ function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; }
11
+ function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); }
12
+ 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); }
13
+ function _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; }
14
+ function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
15
+ function _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); }
16
+ 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); }
17
+ function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); }
18
+ 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; }
19
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
20
+ 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); }
21
+ import React from 'react';
22
+ import { connect } from 'react-redux';
23
+ import axios from 'axios';
24
+ import PropTypes from 'prop-types';
25
+ import { addLayer, addLayerFeatures, LayerRole, removeLayer } from '../actions/layers';
26
+ import { setCurrentTask } from '../actions/task';
27
+ import MapSelection from '../components/MapSelection';
28
+ import ResizeableWindow from '../components/ResizeableWindow';
29
+ import ConfigUtils from '../utils/ConfigUtils';
30
+ import CoordinatesUtils from '../utils/CoordinatesUtils';
31
+ import LocaleUtils from '../utils/LocaleUtils';
32
+ import MapUtils from '../utils/MapUtils';
33
+ import ResourceRegistry from '../utils/ResourceRegistry';
34
+ import '@panoramax/web-viewer';
35
+ import '@panoramax/web-viewer/build/index.css';
36
+ import './style/Panoramax.css';
37
+
38
+ /**
2
39
  * Panoramax Integration for QWC2.
3
40
  *
4
- */var Panoramax=/*#__PURE__*/function(_React$Component){function Panoramax(_props){var _this;_classCallCheck(this,Panoramax);_this=_callSuper(this,Panoramax,[_props]);_defineProperty(_this,"state",{lon:null,lat:null,queryData:null,selectionActive:false,selectionGeom:null,yaw:null,currentTooltip:"",viewerInitialized:false});_defineProperty(_this,"onClose",function(){var _this$viewer;_this.props.setCurrentTask(null);_this.props.removeLayer("panoramax-recordings");_this.props.removeLayer("panoramaxselection");_this.setState({selectionGeom:null,queryData:null,lon:null,lat:null,selectionActive:null,yaw:null,currentTooltip:"",viewerInitialized:false});ResourceRegistry.removeResource("selected");(_this$viewer=_this.viewer)===null||_this$viewer===void 0||_this$viewer.select(null,null,true)});_defineProperty(_this,"initializeViewer",function(){var viewerElement=_this.viewerRef.current;if(viewerElement){_this.viewer=viewerElement;_this.viewer.addEventListener("psv:picture-loading",function(event){_this.setState({lon:event.detail.lon,lat:event.detail.lat},function(){return _this.handlePanoramaxEvent()})});_this.viewer.addEventListener("psv:view-rotated",function(event){_this.setState({yaw:event.detail.x},function(){return _this.handlePanoramaxEvent()})});_this.viewer.addEventListener("psv:picture-loaded",function(event){_this.setState({yaw:event.detail.x},function(){return _this.handlePanoramaxEvent()})})}});_defineProperty(_this,"handlePanoramaxEvent",function(){ResourceRegistry.addResource("selected","".concat(ConfigUtils.getAssetsPath(),"/img/panoramax-cursor.svg"));var layer={id:"panoramaxselection",role:LayerRole.SELECTION};var feature={geometry:{type:"Point",coordinates:[_this.state.lon,_this.state.lat]},crs:"EPSG:4326",styleName:"image",styleOptions:{img:"selected",rotation:MapUtils.degreesToRadians(_this.state.yaw),anchor:[0.5,0.5]}};_this.props.addLayerFeatures(layer,[feature],true)});_defineProperty(_this,"handleKeyDown",function(event){if(event.key==="Escape"){_this.onClose()}});_defineProperty(_this,"addRecordingsMVT",function(){var resolutions=MapUtils.getResolutionsForScales(_this.props.theme.scales,_this.props.theme.mapCrs);var layer={id:"panoramax-recordings",type:"mvt",projection:_this.props.theme.mapCrs,tileGridConfig:{origin:[0,0],resolutions:resolutions},style:"https://".concat(_this.props.panoramaxInstance,"/api/map/style.json"),role:LayerRole.USERLAYER};_this.props.addLayer(layer)});_defineProperty(_this,"addRecordingsWMS",function(){var layer={id:"panoramax-recordings",type:"wms",projection:_this.props.theme.mapCrs,url:_this.props.wmsUrl,role:LayerRole.USERLAYER};_this.props.addLayer(layer)});_defineProperty(_this,"queryPoint",function(props){var _CoordinatesUtils$rep=CoordinatesUtils.reproject(props.coordinates,_this.props.theme.mapCrs,"EPSG:4326"),_CoordinatesUtils$rep2=_slicedToArray(_CoordinatesUtils$rep,2),centerX=_CoordinatesUtils$rep2[0],centerY=_CoordinatesUtils$rep2[1];var offset=0.001;var bbox="".concat(centerX-offset,",").concat(centerY-offset,",").concat(centerX+offset,",").concat(centerY+offset);axios.get("https://".concat(_this.props.panoramaxInstance,"/api/search?bbox=").concat(bbox)).then(function(response){_this.setState({queryData:{queryImage:response.data.features[0].id,querySequence:response.data.features[0].collection,querySource:response.data.features[0].providers[0].name,queryDate:response.data.features[0].properties.datetime}});if(_this.viewer){_this.viewer.select(response.data.features[0].collection,response.data.features[0].id,true)}})["catch"](function(){_this.setState({queryData:null})})});_this.viewerRef=/*#__PURE__*/React.createRef();return _this}_inherits(Panoramax,_React$Component);return _createClass(Panoramax,[{key:"componentDidMount",value:function componentDidMount(){document.addEventListener("keydown",this.handleKeyDown)}},{key:"componentDidUpdate",value:function componentDidUpdate(prevProps,prevState){if(!prevProps.active&&this.props.active){this.setState({selectionActive:true});if(this.props.loadSequencesTiles){if(this.props.tileMode==="wms"&&this.props.wmsUrl){this.addRecordingsWMS()}else{this.addRecordingsMVT()}}}else if(this.state.selectionGeom&&this.state.selectionGeom!==prevState.selectionGeom){this.queryPoint(this.state.selectionGeom)}if(this.state.queryData&&!this.state.viewerInitialized&&(!prevState.queryData||this.state.queryData!==prevState.queryData)){this.initializeViewer();this.setState({viewerInitialized:true})}}},{key:"componentWillUnmount",value:function componentWillUnmount(){document.removeEventListener("keydown",this.handleKeyDown);this.onClose()}},{key:"render",value:function render(){var _this2=this;if(!this.props.active){return null}var _this$state=this.state,selectionGeom=_this$state.selectionGeom,queryData=_this$state.queryData;return/*#__PURE__*/React.createElement(React.Fragment,null,selectionGeom&&/*#__PURE__*/React.createElement(ResizeableWindow,{dockable:this.props.geometry.side,icon:"Panoramax",initialHeight:this.props.geometry.initialHeight,initialWidth:this.props.geometry.initialWidth,initialX:this.props.geometry.initialX,initialY:this.props.geometry.initialY,initiallyDocked:this.props.geometry.initiallyDocked,onClose:this.onClose,splitScreenWhenDocked:true,title:LocaleUtils.tr("panoramax.title")},/*#__PURE__*/React.createElement("div",{className:"panoramax-body",role:"body"},!queryData?/*#__PURE__*/React.createElement("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100%",textAlign:"center"}},/*#__PURE__*/React.createElement("p",null,LocaleUtils.tr("panoramax.notfound"))):/*#__PURE__*/React.createElement("pnx-photo-viewer",{currentTooltip:"",endpoint:"https://".concat(this.props.panoramaxInstance,"/api"),picture:queryData.queryImage,ref:this.viewerRef,sequence:queryData.querySequence,style:{width:"100%",height:"calc(100% + 0.5em)"},widgets:false},/*#__PURE__*/React.createElement("p",{className:"panoramax-widget",slot:"bottom-left"},new Date(queryData.queryDate).toLocaleString(undefined,{year:"numeric",month:"long",day:"numeric",hour:"2-digit",minute:"2-digit",second:"2-digit",timeZoneName:"short"})),/*#__PURE__*/React.createElement("p",{className:"panoramax-widget",slot:"bottom-right"},queryData.querySource)))),/*#__PURE__*/React.createElement(MapSelection,{active:this.state.selectionActive,cursor:"url(\"".concat(ConfigUtils.getAssetsPath(),"/img/target.svg\") 1 1, default"),geomType:"Point",geometry:selectionGeom,geometryChanged:function geometryChanged(geom){return _this2.setState({selectionGeom:geom})},styleOptions:{fillColor:[0,0,0,0],strokeColor:[0,0,0,0]}}))}}])}(React.Component);_defineProperty(Panoramax,"propTypes",{active:PropTypes.bool,addLayer:PropTypes.func,addLayerFeatures:PropTypes.func,geometry:PropTypes.shape({initialWidth:PropTypes.number,initialHeight:PropTypes.number,initialX:PropTypes.number,initialY:PropTypes.number,initiallyDocked:PropTypes.bool,side:PropTypes.string}),/** Whether or not to load the layer containing the image sequences. */loadSequencesTiles:PropTypes.bool,/** URL of the Panoramax instance. */panoramaxInstance:PropTypes.string,removeLayer:PropTypes.func,setCurrentTask:PropTypes.func,theme:PropTypes.object,/** Mode for the image sequences layer: either WMS (Require a custom URL) or MVT(EPSG:3857 only). */tileMode:PropTypes.string,/** URL of the WMS image sequences layer. */wmsUrl:PropTypes.string});_defineProperty(Panoramax,"defaultProps",{geometry:{initialWidth:640,initialHeight:640,initialX:0,initialY:0,initiallyDocked:false,side:"left"},loadSequencesTiles:true,panoramaxInstance:"api.panoramax.xyz",tileMode:"mvt"});export default connect(function(state){return{active:state.task.id==="Panoramax",click:state.map.click,mapScale:MapUtils.computeForZoom(state.map.scales,state.map.zoom),theme:state.theme.current}},{addLayer:addLayer,addLayerFeatures:addLayerFeatures,removeLayer:removeLayer,setCurrentTask:setCurrentTask})(Panoramax);
41
+ */
42
+ var Panoramax = /*#__PURE__*/function (_React$Component) {
43
+ function Panoramax(_props) {
44
+ var _this;
45
+ _classCallCheck(this, Panoramax);
46
+ _this = _callSuper(this, Panoramax, [_props]);
47
+ _defineProperty(_this, "state", {
48
+ lon: null,
49
+ lat: null,
50
+ queryData: null,
51
+ selectionActive: false,
52
+ selectionGeom: null,
53
+ yaw: null,
54
+ currentTooltip: '',
55
+ viewerInitialized: false
56
+ });
57
+ _defineProperty(_this, "onClose", function () {
58
+ var _this$viewer;
59
+ _this.props.setCurrentTask(null);
60
+ _this.props.removeLayer('panoramax-recordings');
61
+ _this.props.removeLayer('panoramaxselection');
62
+ _this.setState({
63
+ selectionGeom: null,
64
+ queryData: null,
65
+ lon: null,
66
+ lat: null,
67
+ selectionActive: null,
68
+ yaw: null,
69
+ currentTooltip: '',
70
+ viewerInitialized: false
71
+ });
72
+ ResourceRegistry.removeResource('selected');
73
+ (_this$viewer = _this.viewer) === null || _this$viewer === void 0 || _this$viewer.select(null, null, true);
74
+ });
75
+ _defineProperty(_this, "initializeViewer", function () {
76
+ var viewerElement = _this.viewerRef.current;
77
+ if (viewerElement) {
78
+ _this.viewer = viewerElement;
79
+ _this.viewer.addEventListener('psv:picture-loading', function (event) {
80
+ _this.setState({
81
+ lon: event.detail.lon,
82
+ lat: event.detail.lat
83
+ }, function () {
84
+ return _this.handlePanoramaxEvent();
85
+ });
86
+ });
87
+ _this.viewer.addEventListener('psv:view-rotated', function (event) {
88
+ _this.setState({
89
+ yaw: event.detail.x
90
+ }, function () {
91
+ return _this.handlePanoramaxEvent();
92
+ });
93
+ });
94
+ _this.viewer.addEventListener('psv:picture-loaded', function (event) {
95
+ _this.setState({
96
+ yaw: event.detail.x
97
+ }, function () {
98
+ return _this.handlePanoramaxEvent();
99
+ });
100
+ });
101
+ }
102
+ });
103
+ _defineProperty(_this, "handlePanoramaxEvent", function () {
104
+ ResourceRegistry.addResource('selected', "".concat(ConfigUtils.getAssetsPath(), "/img/panoramax-cursor.svg"));
105
+ var layer = {
106
+ id: "panoramaxselection",
107
+ role: LayerRole.SELECTION
108
+ };
109
+ var feature = {
110
+ geometry: {
111
+ type: 'Point',
112
+ coordinates: [_this.state.lon, _this.state.lat]
113
+ },
114
+ crs: 'EPSG:4326',
115
+ styleName: 'image',
116
+ styleOptions: {
117
+ img: 'selected',
118
+ rotation: MapUtils.degreesToRadians(_this.state.yaw),
119
+ anchor: [0.5, 0.5]
120
+ }
121
+ };
122
+ _this.props.addLayerFeatures(layer, [feature], true);
123
+ });
124
+ _defineProperty(_this, "handleKeyDown", function (event) {
125
+ if (event.key === 'Escape') {
126
+ _this.onClose();
127
+ }
128
+ });
129
+ _defineProperty(_this, "addRecordingsMVT", function () {
130
+ var resolutions = MapUtils.getResolutionsForScales(_this.props.theme.scales, _this.props.theme.mapCrs);
131
+ var layer = {
132
+ id: 'panoramax-recordings',
133
+ type: 'mvt',
134
+ projection: _this.props.theme.mapCrs,
135
+ tileGridConfig: {
136
+ origin: [0, 0],
137
+ resolutions: resolutions
138
+ },
139
+ style: "https://".concat(_this.props.panoramaxInstance, "/api/map/style.json"),
140
+ role: LayerRole.USERLAYER
141
+ };
142
+ _this.props.addLayer(layer);
143
+ });
144
+ _defineProperty(_this, "addRecordingsWMS", function () {
145
+ var layer = {
146
+ id: 'panoramax-recordings',
147
+ type: 'wms',
148
+ projection: _this.props.theme.mapCrs,
149
+ url: _this.props.wmsUrl,
150
+ role: LayerRole.USERLAYER
151
+ };
152
+ _this.props.addLayer(layer);
153
+ });
154
+ _defineProperty(_this, "queryPoint", function (props) {
155
+ var _CoordinatesUtils$rep = CoordinatesUtils.reproject(props.coordinates, _this.props.theme.mapCrs, 'EPSG:4326'),
156
+ _CoordinatesUtils$rep2 = _slicedToArray(_CoordinatesUtils$rep, 2),
157
+ centerX = _CoordinatesUtils$rep2[0],
158
+ centerY = _CoordinatesUtils$rep2[1];
159
+ var offset = 0.001;
160
+ var bbox = "".concat(centerX - offset, ",").concat(centerY - offset, ",").concat(centerX + offset, ",").concat(centerY + offset);
161
+ axios.get("https://".concat(_this.props.panoramaxInstance, "/api/search?bbox=").concat(bbox)).then(function (response) {
162
+ _this.setState({
163
+ queryData: {
164
+ queryImage: response.data.features[0].id,
165
+ querySequence: response.data.features[0].collection,
166
+ querySource: response.data.features[0].providers[0].name,
167
+ queryDate: response.data.features[0].properties.datetime
168
+ }
169
+ });
170
+ if (_this.viewer) {
171
+ _this.viewer.select(response.data.features[0].collection, response.data.features[0].id, true);
172
+ }
173
+ })["catch"](function () {
174
+ _this.setState({
175
+ queryData: null
176
+ });
177
+ });
178
+ });
179
+ _this.viewerRef = /*#__PURE__*/React.createRef();
180
+ return _this;
181
+ }
182
+ _inherits(Panoramax, _React$Component);
183
+ return _createClass(Panoramax, [{
184
+ key: "componentDidMount",
185
+ value: function componentDidMount() {
186
+ document.addEventListener('keydown', this.handleKeyDown);
187
+ }
188
+ }, {
189
+ key: "componentDidUpdate",
190
+ value: function componentDidUpdate(prevProps, prevState) {
191
+ if (!prevProps.active && this.props.active) {
192
+ this.setState({
193
+ selectionActive: true
194
+ });
195
+ if (this.props.loadSequencesTiles) {
196
+ if (this.props.tileMode === "wms" && this.props.wmsUrl) {
197
+ this.addRecordingsWMS();
198
+ } else {
199
+ this.addRecordingsMVT();
200
+ }
201
+ }
202
+ } else if (this.state.selectionGeom && this.state.selectionGeom !== prevState.selectionGeom) {
203
+ this.queryPoint(this.state.selectionGeom);
204
+ }
205
+ if (this.state.queryData && !this.state.viewerInitialized && (!prevState.queryData || this.state.queryData !== prevState.queryData)) {
206
+ this.initializeViewer();
207
+ this.setState({
208
+ viewerInitialized: true
209
+ });
210
+ }
211
+ }
212
+ }, {
213
+ key: "componentWillUnmount",
214
+ value: function componentWillUnmount() {
215
+ document.removeEventListener('keydown', this.handleKeyDown);
216
+ this.onClose();
217
+ }
218
+ }, {
219
+ key: "render",
220
+ value: function render() {
221
+ var _this2 = this;
222
+ if (!this.props.active) {
223
+ return null;
224
+ }
225
+ var _this$state = this.state,
226
+ selectionGeom = _this$state.selectionGeom,
227
+ queryData = _this$state.queryData;
228
+ return /*#__PURE__*/React.createElement(React.Fragment, null, selectionGeom && /*#__PURE__*/React.createElement(ResizeableWindow, {
229
+ dockable: this.props.geometry.side,
230
+ icon: "Panoramax",
231
+ initialHeight: this.props.geometry.initialHeight,
232
+ initialWidth: this.props.geometry.initialWidth,
233
+ initialX: this.props.geometry.initialX,
234
+ initialY: this.props.geometry.initialY,
235
+ initiallyDocked: this.props.geometry.initiallyDocked,
236
+ onClose: this.onClose,
237
+ splitScreenWhenDocked: true,
238
+ title: LocaleUtils.tr("panoramax.title")
239
+ }, /*#__PURE__*/React.createElement("div", {
240
+ className: "panoramax-body",
241
+ role: "body"
242
+ }, !queryData ? /*#__PURE__*/React.createElement("div", {
243
+ style: {
244
+ display: 'flex',
245
+ justifyContent: 'center',
246
+ alignItems: 'center',
247
+ height: '100%',
248
+ textAlign: 'center'
249
+ }
250
+ }, /*#__PURE__*/React.createElement("p", null, LocaleUtils.tr("panoramax.notfound"))) : /*#__PURE__*/React.createElement("pnx-photo-viewer", {
251
+ currentTooltip: "",
252
+ endpoint: "https://".concat(this.props.panoramaxInstance, "/api"),
253
+ picture: queryData.queryImage,
254
+ ref: this.viewerRef,
255
+ sequence: queryData.querySequence,
256
+ style: {
257
+ width: '100%',
258
+ height: 'calc(100% + 0.5em)'
259
+ },
260
+ widgets: false
261
+ }, /*#__PURE__*/React.createElement("p", {
262
+ className: "panoramax-widget",
263
+ slot: "bottom-left"
264
+ }, new Date(queryData.queryDate).toLocaleString(undefined, {
265
+ year: 'numeric',
266
+ month: 'long',
267
+ day: 'numeric',
268
+ hour: '2-digit',
269
+ minute: '2-digit',
270
+ second: '2-digit',
271
+ timeZoneName: 'short'
272
+ })), /*#__PURE__*/React.createElement("p", {
273
+ className: "panoramax-widget",
274
+ slot: "bottom-right"
275
+ }, queryData.querySource)))), /*#__PURE__*/React.createElement(MapSelection, {
276
+ active: this.state.selectionActive,
277
+ cursor: "url(\"".concat(ConfigUtils.getAssetsPath(), "/img/target.svg\") 1 1, default"),
278
+ geomType: 'Point',
279
+ geometry: selectionGeom,
280
+ geometryChanged: function geometryChanged(geom) {
281
+ return _this2.setState({
282
+ selectionGeom: geom
283
+ });
284
+ },
285
+ styleOptions: {
286
+ fillColor: [0, 0, 0, 0],
287
+ strokeColor: [0, 0, 0, 0]
288
+ }
289
+ }));
290
+ }
291
+ }]);
292
+ }(React.Component);
293
+ _defineProperty(Panoramax, "propTypes", {
294
+ active: PropTypes.bool,
295
+ addLayer: PropTypes.func,
296
+ addLayerFeatures: PropTypes.func,
297
+ geometry: PropTypes.shape({
298
+ initialWidth: PropTypes.number,
299
+ initialHeight: PropTypes.number,
300
+ initialX: PropTypes.number,
301
+ initialY: PropTypes.number,
302
+ initiallyDocked: PropTypes.bool,
303
+ side: PropTypes.string
304
+ }),
305
+ /** Whether or not to load the layer containing the image sequences. */
306
+ loadSequencesTiles: PropTypes.bool,
307
+ /** URL of the Panoramax instance. */
308
+ panoramaxInstance: PropTypes.string,
309
+ removeLayer: PropTypes.func,
310
+ setCurrentTask: PropTypes.func,
311
+ theme: PropTypes.object,
312
+ /** Mode for the image sequences layer: either WMS (Require a custom URL) or MVT(EPSG:3857 only). */
313
+ tileMode: PropTypes.string,
314
+ /** URL of the WMS image sequences layer. */
315
+ wmsUrl: PropTypes.string
316
+ });
317
+ _defineProperty(Panoramax, "defaultProps", {
318
+ geometry: {
319
+ initialWidth: 640,
320
+ initialHeight: 640,
321
+ initialX: 0,
322
+ initialY: 0,
323
+ initiallyDocked: false,
324
+ side: 'left'
325
+ },
326
+ loadSequencesTiles: true,
327
+ panoramaxInstance: 'api.panoramax.xyz',
328
+ tileMode: 'mvt'
329
+ });
330
+ export default connect(function (state) {
331
+ return {
332
+ active: state.task.id === "Panoramax",
333
+ click: state.map.click,
334
+ mapScale: MapUtils.computeForZoom(state.map.scales, state.map.zoom),
335
+ theme: state.theme.current
336
+ };
337
+ }, {
338
+ addLayer: addLayer,
339
+ addLayerFeatures: addLayerFeatures,
340
+ removeLayer: removeLayer,
341
+ setCurrentTask: setCurrentTask
342
+ })(Panoramax);
package/plugins/Portal.js CHANGED
@@ -1,10 +1,205 @@
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 _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 _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); }
3
+ 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); } }
4
+ function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; }
5
+ function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); }
6
+ 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); }
7
+ function _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; }
8
+ function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
9
+ function _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); }
10
+ 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); }
11
+ function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); }
12
+ 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; }
13
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
14
+ 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); }
15
+ /**
2
16
  * Copyright 2020, Sourcepole AG.
3
17
  * All rights reserved.
4
18
  *
5
19
  * This source code is licensed under the BSD-style license found in the
6
20
  * LICENSE file in the root directory of this source tree.
7
- */import React from"react";import{connect}from"react-redux";import PropTypes from"prop-types";import{setCurrentTask}from"../actions/task";import{openExternalUrl}from"../actions/windows";import AppMenu from"../components/AppMenu";import Icon from"../components/Icon";import ThemeList from"../components/ThemeList";import ConfigUtils from"../utils/ConfigUtils";import LocaleUtils from"../utils/LocaleUtils";import{UrlParams}from"../utils/PermaLinkUtils";import ThemeUtils from"../utils/ThemeUtils";import"./style/Portal.css";/**
21
+ */
22
+
23
+ import React from 'react';
24
+ import { connect } from 'react-redux';
25
+ import PropTypes from 'prop-types';
26
+ import { setCurrentTask } from '../actions/task';
27
+ import { openExternalUrl } from '../actions/windows';
28
+ import AppMenu from '../components/AppMenu';
29
+ import Icon from '../components/Icon';
30
+ import ThemeList from '../components/ThemeList';
31
+ import ConfigUtils from '../utils/ConfigUtils';
32
+ import LocaleUtils from '../utils/LocaleUtils';
33
+ import { UrlParams } from '../utils/PermaLinkUtils';
34
+ import ThemeUtils from '../utils/ThemeUtils';
35
+ import './style/Portal.css';
36
+
37
+ /**
8
38
  * Displays a landing lage, consisting of a full-screen theme switcher and a configurable menu.
9
- */var Portal=/*#__PURE__*/function(_React$Component){function Portal(){var _this;_classCallCheck(this,Portal);for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++){args[_key]=arguments[_key]}_this=_callSuper(this,Portal,[].concat(args));_defineProperty(_this,"state",{filter:"",popupClosed:false,menuVisible:false});_defineProperty(_this,"openUrl",function(url,target,title){if(target==="iframe"){target=":iframedialog:externallinkiframe"}_this.props.openExternalUrl(url,target,{title:title,zIndex:250})});_defineProperty(_this,"menuToggled",function(visible){_this.setState({menuVisible:visible})});return _this}_inherits(Portal,_React$Component);return _createClass(Portal,[{key:"componentDidMount",value:function componentDidMount(){if(!this.props.startupParams.t&&!this.props.startupParams.k&&!this.props.startupParams.bk){this.props.setCurrentTask("Portal")}}},{key:"componentDidUpdate",value:function componentDidUpdate(prevProps){if(this.props.currentTask==="Portal"&&(this.props.currentTask!==prevProps.currentTask||this.props.currentTheme!==prevProps.currentTheme||this.props.map!==prevProps.map)){UrlParams.clear()}else if(!prevProps.themes&&this.props.themes&&this.props.currentTask!=="Portal"){// Show portal if no theme is to be loaded
10
- var theme=ThemeUtils.getThemeById(this.props.themes,this.props.startupParams.t);if((!theme||theme.restricted)&&(ConfigUtils.getConfigProp("dontLoadDefaultTheme")||!this.props.themes.defaultTheme)){this.props.setCurrentTask("Portal")}}}},{key:"render",value:function render(){var _this2=this;if(this.props.currentTask!=="Portal"){return null}var assetsPath=ConfigUtils.getAssetsPath();var preserveSettings=ConfigUtils.getConfigProp("preserveSettingsOnPortalThemeSwitch");return/*#__PURE__*/React.createElement("div",{className:"Portal"},/*#__PURE__*/React.createElement("div",{className:"portal-topbar"},/*#__PURE__*/React.createElement("img",{className:"portal-logo",src:assetsPath+"/img/"+this.props.logo}),/*#__PURE__*/React.createElement("span",{className:"portal-topbar-text",dangerouslySetInnerHTML:{__html:this.props.topBarText}}),/*#__PURE__*/React.createElement("input",{className:"portal-search-field",onChange:function onChange(ev){return _this2.setState({filter:ev.target.value})},placeholder:LocaleUtils.tr("portal.filter"),type:"text",value:this.state.filter}),/*#__PURE__*/React.createElement("span",{className:"portal-topbar-spacer"}),this.props.menuItems.length>0?/*#__PURE__*/React.createElement(AppMenu,{appMenuClearsTask:false,buttonLabel:LocaleUtils.tr("portal.menulabel"),keepMenuOpen:this.props.keepMenuOpen,menuItems:this.props.menuItems,onMenuToggled:this.menuToggled,openExternalUrl:this.openUrl,showOnStartup:this.props.showMenuOnStartup}):null),/*#__PURE__*/React.createElement("div",{className:"portal-body "+(this.state.menuVisible?"portal-body-menuvisible":"")},/*#__PURE__*/React.createElement(ThemeList,{collapsibleGroups:this.props.collapsibleGroups,dontPreserveSettingsOnSwitch:!preserveSettings,filter:this.state.filter})),/*#__PURE__*/React.createElement("div",{className:"portal-bottombar"},this.props.userName?/*#__PURE__*/React.createElement("div",{className:"portal-bottombar-user"},/*#__PURE__*/React.createElement(Icon,{icon:"logout"}),/*#__PURE__*/React.createElement("span",null,this.props.userName)):null,/*#__PURE__*/React.createElement("div",{className:"portal-bottombar-links"},(this.props.bottomBarLinks||[]).map(function(link,idx){var _link$label;var label=(_link$label=link.label)!==null&&_link$label!==void 0?_link$label:LocaleUtils.tr(link.labelmsgid);return/*#__PURE__*/React.createElement("a",{href:"#",key:"l"+idx,onClick:function onClick(ev){ev.preventDefault();_this2.openUrl(link.href,link.target,label)}},label)}))))}}])}(React.Component);_defineProperty(Portal,"propTypes",{/** Links to show in the portal bottom bar */bottomBarLinks:PropTypes.arrayOf(PropTypes.shape({href:PropTypes.string,label:PropTypes.string,labelmsgid:PropTypes.string,target:PropTypes.string})),/** Whether to allow collapsing groups in the theme switcher. */collapsibleGroups:PropTypes.bool,currentTask:PropTypes.string,currentTheme:PropTypes.object,keepMenuOpen:PropTypes.bool,/** Name of a logo image below assets/img. */logo:PropTypes.string,map:PropTypes.object,/** Portal menu items, in the same format as the TopBar menu items. */menuItems:PropTypes.array,openExternalUrl:PropTypes.func,setCurrentTask:PropTypes.func,/** Whether the menu should be visible on startup. */showMenuOnStartup:PropTypes.bool,startupParams:PropTypes.object,themes:PropTypes.object,/** Portal title text to show in the top bar. */topBarText:PropTypes.string,userName:PropTypes.string});_defineProperty(Portal,"defaultProps",{collapsibleGroups:true,menuItems:[]});var selector=function selector(state){return{currentTask:state.task.id,currentTheme:state.theme.current,map:state.map,themes:state.theme.themes,startupParams:state.localConfig.startupParams,userName:state.localConfig.username||""}};export default connect(selector,{setCurrentTask:setCurrentTask,openExternalUrl:openExternalUrl})(Portal);
39
+ */
40
+ var Portal = /*#__PURE__*/function (_React$Component) {
41
+ function Portal() {
42
+ var _this;
43
+ _classCallCheck(this, Portal);
44
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
45
+ args[_key] = arguments[_key];
46
+ }
47
+ _this = _callSuper(this, Portal, [].concat(args));
48
+ _defineProperty(_this, "state", {
49
+ filter: "",
50
+ popupClosed: false,
51
+ menuVisible: false
52
+ });
53
+ _defineProperty(_this, "openUrl", function (url, target, title) {
54
+ if (target === "iframe") {
55
+ target = ":iframedialog:externallinkiframe";
56
+ }
57
+ _this.props.openExternalUrl(url, target, {
58
+ title: title,
59
+ zIndex: 250
60
+ });
61
+ });
62
+ _defineProperty(_this, "menuToggled", function (visible) {
63
+ _this.setState({
64
+ menuVisible: visible
65
+ });
66
+ });
67
+ return _this;
68
+ }
69
+ _inherits(Portal, _React$Component);
70
+ return _createClass(Portal, [{
71
+ key: "componentDidMount",
72
+ value: function componentDidMount() {
73
+ if (!this.props.startupParams.t && !this.props.startupParams.k && !this.props.startupParams.bk) {
74
+ this.props.setCurrentTask("Portal");
75
+ }
76
+ }
77
+ }, {
78
+ key: "componentDidUpdate",
79
+ value: function componentDidUpdate(prevProps) {
80
+ if (this.props.currentTask === "Portal" && (this.props.currentTask !== prevProps.currentTask || this.props.currentTheme !== prevProps.currentTheme || this.props.map !== prevProps.map)) {
81
+ UrlParams.clear();
82
+ } else if (!prevProps.themes && this.props.themes && this.props.currentTask !== "Portal") {
83
+ // Show portal if no theme is to be loaded
84
+ var theme = ThemeUtils.getThemeById(this.props.themes, this.props.startupParams.t);
85
+ if ((!theme || theme.restricted) && (ConfigUtils.getConfigProp("dontLoadDefaultTheme") || !this.props.themes.defaultTheme)) {
86
+ this.props.setCurrentTask("Portal");
87
+ }
88
+ }
89
+ }
90
+ }, {
91
+ key: "render",
92
+ value: function render() {
93
+ var _this2 = this;
94
+ if (this.props.currentTask !== "Portal") {
95
+ return null;
96
+ }
97
+ var assetsPath = ConfigUtils.getAssetsPath();
98
+ var preserveSettings = ConfigUtils.getConfigProp("preserveSettingsOnPortalThemeSwitch");
99
+ return /*#__PURE__*/React.createElement("div", {
100
+ className: "Portal"
101
+ }, /*#__PURE__*/React.createElement("div", {
102
+ className: "portal-topbar"
103
+ }, /*#__PURE__*/React.createElement("img", {
104
+ className: "portal-logo",
105
+ src: assetsPath + "/img/" + this.props.logo
106
+ }), /*#__PURE__*/React.createElement("span", {
107
+ className: "portal-topbar-text",
108
+ dangerouslySetInnerHTML: {
109
+ __html: this.props.topBarText
110
+ }
111
+ }), /*#__PURE__*/React.createElement("input", {
112
+ className: "portal-search-field",
113
+ onChange: function onChange(ev) {
114
+ return _this2.setState({
115
+ filter: ev.target.value
116
+ });
117
+ },
118
+ placeholder: LocaleUtils.tr("portal.filter"),
119
+ type: "text",
120
+ value: this.state.filter
121
+ }), /*#__PURE__*/React.createElement("span", {
122
+ className: "portal-topbar-spacer"
123
+ }), this.props.menuItems.length > 0 ? /*#__PURE__*/React.createElement(AppMenu, {
124
+ appMenuClearsTask: false,
125
+ buttonLabel: LocaleUtils.tr("portal.menulabel"),
126
+ keepMenuOpen: this.props.keepMenuOpen,
127
+ menuItems: this.props.menuItems,
128
+ onMenuToggled: this.menuToggled,
129
+ openExternalUrl: this.openUrl,
130
+ showOnStartup: this.props.showMenuOnStartup
131
+ }) : null), /*#__PURE__*/React.createElement("div", {
132
+ className: "portal-body " + (this.state.menuVisible ? "portal-body-menuvisible" : "")
133
+ }, /*#__PURE__*/React.createElement(ThemeList, {
134
+ collapsibleGroups: this.props.collapsibleGroups,
135
+ dontPreserveSettingsOnSwitch: !preserveSettings,
136
+ filter: this.state.filter
137
+ })), /*#__PURE__*/React.createElement("div", {
138
+ className: "portal-bottombar"
139
+ }, this.props.userName ? /*#__PURE__*/React.createElement("div", {
140
+ className: "portal-bottombar-user"
141
+ }, /*#__PURE__*/React.createElement(Icon, {
142
+ icon: "logout"
143
+ }), /*#__PURE__*/React.createElement("span", null, this.props.userName)) : null, /*#__PURE__*/React.createElement("div", {
144
+ className: "portal-bottombar-links"
145
+ }, (this.props.bottomBarLinks || []).map(function (link, idx) {
146
+ var _link$label;
147
+ var label = (_link$label = link.label) !== null && _link$label !== void 0 ? _link$label : LocaleUtils.tr(link.labelmsgid);
148
+ return /*#__PURE__*/React.createElement("a", {
149
+ href: "#",
150
+ key: "l" + idx,
151
+ onClick: function onClick(ev) {
152
+ ev.preventDefault();
153
+ _this2.openUrl(link.href, link.target, label);
154
+ }
155
+ }, label);
156
+ }))));
157
+ }
158
+ }]);
159
+ }(React.Component);
160
+ _defineProperty(Portal, "propTypes", {
161
+ /** Links to show in the portal bottom bar */
162
+ bottomBarLinks: PropTypes.arrayOf(PropTypes.shape({
163
+ href: PropTypes.string,
164
+ label: PropTypes.string,
165
+ labelmsgid: PropTypes.string,
166
+ target: PropTypes.string
167
+ })),
168
+ /** Whether to allow collapsing groups in the theme switcher. */
169
+ collapsibleGroups: PropTypes.bool,
170
+ currentTask: PropTypes.string,
171
+ currentTheme: PropTypes.object,
172
+ keepMenuOpen: PropTypes.bool,
173
+ /** Name of a logo image below assets/img. */
174
+ logo: PropTypes.string,
175
+ map: PropTypes.object,
176
+ /** Portal menu items, in the same format as the TopBar menu items. */
177
+ menuItems: PropTypes.array,
178
+ openExternalUrl: PropTypes.func,
179
+ setCurrentTask: PropTypes.func,
180
+ /** Whether the menu should be visible on startup. */
181
+ showMenuOnStartup: PropTypes.bool,
182
+ startupParams: PropTypes.object,
183
+ themes: PropTypes.object,
184
+ /** Portal title text to show in the top bar. */
185
+ topBarText: PropTypes.string,
186
+ userName: PropTypes.string
187
+ });
188
+ _defineProperty(Portal, "defaultProps", {
189
+ collapsibleGroups: true,
190
+ menuItems: []
191
+ });
192
+ var selector = function selector(state) {
193
+ return {
194
+ currentTask: state.task.id,
195
+ currentTheme: state.theme.current,
196
+ map: state.map,
197
+ themes: state.theme.themes,
198
+ startupParams: state.localConfig.startupParams,
199
+ userName: state.localConfig.username || ""
200
+ };
201
+ };
202
+ export default connect(selector, {
203
+ setCurrentTask: setCurrentTask,
204
+ openExternalUrl: openExternalUrl
205
+ })(Portal);