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
package/plugins/View3D.js CHANGED
@@ -1,22 +1,527 @@
1
- function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(o){return typeof o}:function(o){return o&&"function"==typeof Symbol&&o.constructor===Symbol&&o!==Symbol.prototype?"symbol":typeof o},_typeof(o)}function ownKeys(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);r&&(o=o.filter(function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable})),t.push.apply(t,o)}return t}function _objectSpread(e){for(var r=1;r<arguments.length;r++){var t=null!=arguments[r]?arguments[r]:{};r%2?ownKeys(Object(t),!0).forEach(function(r){_defineProperty(e,r,t[r])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):ownKeys(Object(t)).forEach(function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(t,r))})}return e}function _classCallCheck(a,n){if(!(a instanceof n))throw new TypeError("Cannot call a class as a function")}function _defineProperties(e,r){for(var t=0;t<r.length;t++){var o=r[t];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(e,_toPropertyKey(o.key),o)}}function _createClass(e,r,t){return r&&_defineProperties(e.prototype,r),t&&_defineProperties(e,t),Object.defineProperty(e,"prototype",{writable:!1}),e}function _callSuper(t,o,e){return o=_getPrototypeOf(o),_possibleConstructorReturn(t,_isNativeReflectConstruct()?Reflect.construct(o,e||[],_getPrototypeOf(t).constructor):o.apply(t,e))}function _possibleConstructorReturn(t,e){if(e&&("object"==_typeof(e)||"function"==typeof e))return e;if(void 0!==e)throw new TypeError("Derived constructors may only return object or undefined");return _assertThisInitialized(t)}function _assertThisInitialized(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function _isNativeReflectConstruct(){try{var t=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch(t){}return(_isNativeReflectConstruct=function _isNativeReflectConstruct(){return!!t})()}function _getPrototypeOf(t){return _getPrototypeOf=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(t){return t.__proto__||Object.getPrototypeOf(t)},_getPrototypeOf(t)}function _inherits(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),Object.defineProperty(t,"prototype",{writable:!1}),e&&_setPrototypeOf(t,e)}function _setPrototypeOf(t,e){return _setPrototypeOf=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,e){return t.__proto__=e,t},_setPrototypeOf(t,e)}function _defineProperty(e,r,t){return(r=_toPropertyKey(r))in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}function _toPropertyKey(t){var i=_toPrimitive(t,"string");return"symbol"==_typeof(i)?i:i+""}function _toPrimitive(t,r){if("object"!=_typeof(t)||!t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var i=e.call(t,r||"default");if("object"!=_typeof(i))return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===r?String:Number)(t)}/**
1
+ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
2
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
3
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
4
+ function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); }
5
+ function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } }
6
+ function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; }
7
+ function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); }
8
+ function _possibleConstructorReturn(t, e) { if (e && ("object" == _typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return _assertThisInitialized(t); }
9
+ function _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; }
10
+ function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
11
+ function _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); }
12
+ function _inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && _setPrototypeOf(t, e); }
13
+ function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); }
14
+ function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
15
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
16
+ function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
17
+ /**
2
18
  * Copyright 2024 Sourcepole AG
3
19
  * All rights reserved.
4
20
  *
5
21
  * This source code is licensed under the BSD-style license found in the
6
22
  * LICENSE file in the root directory of this source tree.
7
- */import React from"react";import{connect,Provider}from"react-redux";import isEmpty from"lodash.isempty";import PropTypes from"prop-types";import*as displayExports from"../actions/display";import{setView3dMode,View3DMode}from"../actions/display";import*as layersExports from"../actions/layers";import{LayerRole,addLayerFeatures,removeLayer}from"../actions/layers";import{panTo,zoomToPoint}from"../actions/map";import*as mapExports from"../actions/map";import*as themeExports from"../actions/theme";import PluginsContainer from"../components/PluginsContainer";import ResizeableWindow from"../components/ResizeableWindow";import StandardApp from"../components/StandardApp";import View3DSwitcher from"../components/map3d/View3DSwitcher";import Spinner from"../components/widgets/Spinner";import ReducerIndex from"../reducers/index";import personIcon from"../resources/person.png";import{createStore}from"../stores/StandardStore";import ConfigUtils from"../utils/ConfigUtils";import LocaleUtils from"../utils/LocaleUtils";import MapUtils from"../utils/MapUtils";import{UrlParams}from"../utils/PermaLinkUtils";import"./style/View3D.css";/**
23
+ */
24
+
25
+ import React from 'react';
26
+ import { connect, Provider } from 'react-redux';
27
+ import isEmpty from 'lodash.isempty';
28
+ import PropTypes from 'prop-types';
29
+ import * as displayExports from '../actions/display';
30
+ import { setView3dMode, View3DMode } from '../actions/display';
31
+ import * as layersExports from '../actions/layers';
32
+ import { LayerRole, addLayerFeatures, removeLayer } from '../actions/layers';
33
+ import { panTo, zoomToPoint } from '../actions/map';
34
+ import * as mapExports from '../actions/map';
35
+ import * as themeExports from '../actions/theme';
36
+ import PluginsContainer from '../components/PluginsContainer';
37
+ import ResizeableWindow from '../components/ResizeableWindow';
38
+ import StandardApp from '../components/StandardApp';
39
+ import View3DSwitcher from '../components/map3d/View3DSwitcher';
40
+ import Spinner from '../components/widgets/Spinner';
41
+ import ReducerIndex from '../reducers/index';
42
+ import personIcon from '../resources/person.png';
43
+ import { createStore } from '../stores/StandardStore';
44
+ import ConfigUtils from '../utils/ConfigUtils';
45
+ import LocaleUtils from '../utils/LocaleUtils';
46
+ import MapUtils from '../utils/MapUtils';
47
+ import { UrlParams } from '../utils/PermaLinkUtils';
48
+ import './style/View3D.css';
49
+
50
+ /**
8
51
  * Displays a 3D map view.
9
52
  *
10
53
  * See [3D View](../../topics/View3D).
11
- */var View3D=/*#__PURE__*/function(_React$Component){function View3D(props){var _this;_classCallCheck(this,View3D);_this=_callSuper(this,View3D,[props]);_defineProperty(_this,"state",{componentLoaded:false,windowDetached:false,viewsLocked:false,storedState:null});_defineProperty(_this,"render3DWindow",function(){if(_this.props.view3dMode>View3DMode.DISABLED){var extraControls=[{icon:"sync",callback:_this.sync2DExtent,title:LocaleUtils.tr("map3d.syncview")},{icon:"lock",callback:_this.setLockViews,title:LocaleUtils.tr("map3d.lockview"),active:_this.state.viewsLocked}];if(!_this.state.windowDetached){extraControls.push({icon:"maximize",callback:function callback(){return _this.props.setView3dMode(View3DMode.FULLSCREEN)},title:LocaleUtils.tr("window.maximize")})}var Map3D=_this.map3dComponent;var device=ConfigUtils.isMobile()?"mobile":"desktop";var pluginsConfig=_this.props.view3dMode===View3DMode.FULLSCREEN?_this.props.localConfig.plugins[device].filter(function(entry){return entry.availableIn3D}):[];return/*#__PURE__*/React.createElement(ResizeableWindow,{extraControls:extraControls,fullscreen:_this.props.view3dMode===View3DMode.FULLSCREEN,icon:"map3d",initialHeight:_this.props.geometry.initialHeight,initialWidth:_this.props.geometry.initialWidth,initialX:_this.props.geometry.initialX,initialY:_this.props.geometry.initialY,initiallyDocked:_this.props.geometry.initiallyDocked,key:"View3DWindow",maximizeable:false,onClose:_this.onClose,onExternalWindowResized:_this.redrawScene,onFocusChanged:_this.windowFocusChanged,onGeometryChanged:_this.onGeometryChanged,splitScreenWhenDocked:true,splitTopAndBottomBar:true,title:LocaleUtils.tr("map3d.title")},_this.state.componentLoaded?/*#__PURE__*/React.createElement(Provider,{role:"body",store:_this.store},/*#__PURE__*/React.createElement(PluginsContainer,{pluginsConfig:pluginsConfig},/*#__PURE__*/React.createElement(Map3D,{controlsPosition:_this.props.controlsPosition,defaultSceneQuality:_this.props.defaultSceneQuality,innerRef:_this.setRef,mouseButtons:_this.props.mouseButtons,onCameraChanged:_this.onCameraChanged,onMapInitialized:_this.setupMap,pluginOptions:_this.props.pluginOptions,plugins3d:_this.props.plugins3d,searchProviders:_this.props.searchProviders,theme:_this.props.theme}),_this.props.view3dMode===View3DMode.DISABLING?/*#__PURE__*/React.createElement("div",{className:"view3d-busy-overlay"},/*#__PURE__*/React.createElement(Spinner,null),/*#__PURE__*/React.createElement("span",null,LocaleUtils.tr("view3d.storingstate"))):null)):null)}return null});_defineProperty(_this,"onClose",function(){_this.props.setView3dMode(View3DMode.DISABLING)});_defineProperty(_this,"onGeometryChanged",function(geometry){if(geometry.maximized&&_this.props.view3dMode!==View3DMode.FULLSCREEN){_this.props.setView3dMode(View3DMode.FULLSCREEN)}_this.setState({windowDetached:geometry.detached})});_defineProperty(_this,"onCameraChanged",function(center,camera,fov){// Note: If camera pos is NULL, we are in first-person-view
12
- if(_this.state.viewsLocked&&_this.focusedMap==="map3d"){var rotation=undefined;if(camera){rotation=Math.atan2(center[1]-camera[1],center[0]-camera[0])-0.5*Math.PI;var distance=Math.sqrt((camera[0]-center[0])*(camera[0]-center[0])+(camera[1]-center[1])*(camera[1]-center[1])+(camera[2]-center[2])*(camera[2]-center[2]));var fovrad=fov/180*Math.PI;var bboxWidth=distance*(2*Math.tan(fovrad/2));var bbox=[-0.5*bboxWidth,0,0.5*bboxWidth,0];var zoom=MapUtils.getZoomForExtent(bbox,_this.props.map.resolutions,_this.props.map.size,0,_this.props.map.scales.length-1);_this.props.zoomToPoint(center.slice(0,2),zoom,_this.props.theme.mapCrs,rotation);if(_this.firstPersonMarker){_this.props.removeLayer("view3d-firstperson-cone");_this.firstPersonMarker=false}}else{_this.props.panTo(center.slice(0,2),_this.props.theme.mapCrs,rotation);var feature={geometry:{type:"Point",coordinates:center.slice(0,2)},crs:_this.props.theme.mapCrs,styleName:"marker",styleOptions:{iconSrc:personIcon}};var layer={id:"view3d-firstperson-marker",role:LayerRole.MARKER};_this.props.addLayerFeatures(layer,[feature],true);_this.firstPersonMarker=true}}else if(_this.firstPersonMarker){_this.props.removeLayer("view3d-firstperson-marker");_this.firstPersonMarker=false}});_defineProperty(_this,"setRef",function(ref){_this.map3dComponentRef=ref});_defineProperty(_this,"sync2DExtent",function(){if(_this.map3dComponentRef){_this.map3dComponentRef.setViewToExtent(_this.props.map.bbox.bounds,_this.props.map.bbox.rotation)}});_defineProperty(_this,"setLockViews",function(){_this.setState(function(state){return{viewsLocked:!state.viewsLocked}});if(_this.firstPersonMarker){_this.props.removeLayer("view3d-firstperson-marker");_this.firstPersonMarker=false}});_defineProperty(_this,"setupMap",function(){if(_this.map3dComponentRef){if(!isEmpty(_this.state.storedState)){_this.map3dComponentRef.restore3dState(_this.state.storedState)}else if(_this.props.theme.current.map3d.initialView){_this.map3dComponentRef.restore3dState(_this.props.theme.current.map3d.initialView)}else{_this.sync2DExtent()}}});_defineProperty(_this,"redrawScene",function(ev){if(_this.map3dComponentRef){_this.map3dComponentRef.redrawScene(ev)}});_defineProperty(_this,"trackFocus",function(ev){var _mapEl$contains,_map3dEl$contains;var mapEl=document.getElementById("map");var map3dEl=document.getElementById("map3d");if(mapEl!==null&&mapEl!==void 0&&(_mapEl$contains=mapEl.contains)!==null&&_mapEl$contains!==void 0&&_mapEl$contains.call(mapEl,document.activeElement)){_this.focusedMap="map"}else if(map3dEl!==null&&map3dEl!==void 0&&(_map3dEl$contains=map3dEl.contains)!==null&&_map3dEl$contains!==void 0&&_map3dEl$contains.call(map3dEl,document.activeElement)){_this.focusedMap="map3d"}else{_this.focusedMap=null}});_this.map3dComponent=null;_this.map3dComponentRef=null;_this.focusedMap=null;_this.firstPersonMarker=true;// Subset of 2d reducers
13
- var _ReducerIndex$reducer=ReducerIndex.reducers,processNotifications=_ReducerIndex$reducer.processNotifications,task=_ReducerIndex$reducer.task,windows=_ReducerIndex$reducer.windows;// Reducer for syncronization with parent store
14
- var forwardReducer=function forwardReducer(key,forwardActions,syncAction){return function(){var state=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};var action=arguments.length>1?arguments[1]:undefined;if(forwardActions.includes(action.type)){// Forward to parent store
15
- StandardApp.store.dispatch(action);return state}else{return action.type===syncAction?action[key]:state}}};var displayActions=Object.values(displayExports).filter(function(x){return typeof x==="string"});var layersActions=Object.values(layersExports).filter(function(x){return typeof x==="string"});var mapActions=Object.values(mapExports).filter(function(x){return typeof x==="string"});var themeActions=Object.values(themeExports).filter(function(x){return typeof x==="string"});var display=forwardReducer("display",displayActions,"SYNC_DISPLAY_FROM_PARENT_STORE");var layers=forwardReducer("layers",layersActions,"SYNC_LAYERS_FROM_PARENT_STORE");var map=forwardReducer("map",mapActions,"SYNC_MAP_FROM_PARENT_STORE");var localConfig=forwardReducer("localConfig",[],"SYNC_LOCAL_CONFIG_FROM_PARENT_STORE");var theme=forwardReducer("theme",themeActions,"SYNC_THEME_FROM_PARENT_STORE");_this.store=createStore({display:display,layers:layers,localConfig:localConfig,map:map,processNotifications:processNotifications,theme:theme,task:task,windows:windows});// Set stored state
16
- var storedState=_objectSpread({},props.startupState.map3d);if(props.startupParams.v3d){var values=props.startupParams.v3d.split(",").map(parseFloat).filter(function(x){return!isNaN(x)});if(values.length>=6){var _values$;storedState.camera=[values[0],values[1],values[2]];storedState.target=[values[3],values[4],values[5]];storedState.personHeight=(_values$=values[6])!==null&&_values$!==void 0?_values$:0}}if(props.startupParams.bl3d!==undefined){storedState.baseLayer=props.startupParams.bl3d}_this.state.storedState=storedState;return _this}_inherits(View3D,_React$Component);return _createClass(View3D,[{key:"componentDidMount",value:function componentDidMount(){if(this.props.startupParams.v==="3d"){this.props.setView3dMode(View3DMode.FULLSCREEN)}else if(this.props.startupParams.v==="3d2d"){this.props.setView3dMode(View3DMode.SPLITSCREEN)}window.addEventListener("focus",this.trackFocus,true);this.syncParentStore({})}},{key:"componentWillUnmount",value:function componentWillUnmount(){window.removeEventListener("focus",this.trackFocus)}},{key:"componentDidUpdate",value:function componentDidUpdate(prevProps,prevState){var _this2=this,_this$props$theme$cur;if(this.props.view3dMode!==View3DMode.DISABLED&&prevProps.view3dMode===View3DMode.DISABLED){import("../components/map3d/Map3D").then(function(component){_this2.map3dComponent=component["default"];_this2.map3dComponentRef=null;_this2.setState({componentLoaded:true})});this.syncParentStore(this.props,true)}else if(this.props.view3dMode===View3DMode.DISABLING&&prevProps.view3dMode!==View3DMode.DISABLING){if(this.map3dComponentRef){this.map3dComponentRef.store3dState().then(function(storedState){_this2.setState({storedState:storedState});UrlParams.updateParams({v3d:undefined,bl3d:undefined});_this2.props.setView3dMode(View3DMode.DISABLED)})}else{UrlParams.updateParams({v3d:undefined,bl3d:undefined});this.props.setView3dMode(View3DMode.DISABLED)}}else if(this.props.view3dMode===View3DMode.DISABLED&&prevProps.view3dMode!==View3DMode.DISABLED){this.map3dComponent=null;this.map3dComponentRef=null;this.setState({componentLoaded:false});if(this.firstPersonMarker){this.props.removeLayer("view3d-firstperson-marker");this.firstPersonMarker=false}}// Sync parts of parent store
17
- this.syncParentStore(prevProps);// Handle view mode change
18
- if(this.props.view3dMode!==prevProps.view3dMode){if(this.props.view3dMode===View3DMode.FULLSCREEN){UrlParams.updateParams({v:"3d"});this.setState({viewsLocked:false})}else if(this.props.view3dMode===View3DMode.SPLITSCREEN){UrlParams.updateParams({v:"3d2d"})}else{UrlParams.updateParams({v:"2d"})}}// Switch to 2D mode if new theme has no 3D configuration
19
- if(this.props.theme.current!==prevProps.theme.current&&!((_this$props$theme$cur=this.props.theme.current)!==null&&_this$props$theme$cur!==void 0&&_this$props$theme$cur.map3d)&&this.props.view3dMode!==View3DMode.DISABLED){this.props.setView3dMode(View3D.DISABLED)}// Lock views
20
- if(this.state.viewsLocked&&this.props.map.bbox!==prevProps.map.bbox&&this.focusedMap==="map"){this.sync2DExtent()}// Clear stored state when switching away from a theme
21
- if(prevProps.theme.current&&this.props.theme.current!==prevProps.theme.current){this.setState({storedState:null})}}},{key:"syncParentStore",value:function syncParentStore(prevProps){var force=arguments.length>1&&arguments[1]!==undefined?arguments[1]:false;if(this.props.view3dMode===View3DMode.DISABLED){return}if(this.props.display!==prevProps.display||force){this.store.dispatch({type:"SYNC_DISPLAY_FROM_PARENT_STORE",display:this.props.display})}if(this.props.theme!==prevProps.theme||force){this.store.dispatch({type:"SYNC_THEME_FROM_PARENT_STORE",theme:this.props.theme})}if(this.props.localConfig!==prevProps.localConfig||force){this.store.dispatch({type:"SYNC_LOCAL_CONFIG_FROM_PARENT_STORE",localConfig:this.props.localConfig})}if(this.props.layers!==prevProps.layers||force){this.store.dispatch({type:"SYNC_LAYERS_FROM_PARENT_STORE",layers:this.props.layers})}if(this.props.map!==prevProps.map||force){this.store.dispatch({type:"SYNC_MAP_FROM_PARENT_STORE",map:this.props.map})}}},{key:"render",value:function render(){var _this$props$theme$cur2;var button=(_this$props$theme$cur2=this.props.theme.current)!==null&&_this$props$theme$cur2!==void 0&&_this$props$theme$cur2.map3d?/*#__PURE__*/React.createElement(View3DSwitcher,{key:"View3DButton",position:this.props.buttonPosition}):null;return[button,this.render3DWindow()]}}])}(React.Component);_defineProperty(View3D,"propTypes",{addLayerFeatures:PropTypes.func,/** The position slot index of the 3d switch map button, from the bottom (0: bottom slot). */buttonPosition:PropTypes.number,/** The position of the navigation controls. Either `top` or `bottom`. */controlsPosition:PropTypes.string,/** The default scene quality factor (`20`: min, `100`: max). */defaultSceneQuality:PropTypes.number,display:PropTypes.object,/** Default window geometry. */geometry:PropTypes.shape({initialWidth:PropTypes.number,initialHeight:PropTypes.number,initialX:PropTypes.number,initialY:PropTypes.number,initiallyDocked:PropTypes.bool}),layers:PropTypes.object,localConfig:PropTypes.object,map:PropTypes.object,/** Mouse buttons assignment. You can assign `pan`, `rotate`, `zoom` to each button. */mouseButtons:PropTypes.shape({left:PropTypes.string,middle:PropTypes.string,right:PropTypes.string}),panTo:PropTypes.func,/** Options to pass to the 3D plugins, in the form `{"<PluginName>": {<options>}}`.
22
- * Refer to the documentation of the <a href="#plugins3d">3D plugins</a> for settable options. */pluginOptions:PropTypes.object,plugins3d:PropTypes.object,removeLayer:PropTypes.func,searchProviders:PropTypes.object,setView3dMode:PropTypes.func,startupParams:PropTypes.object,startupState:PropTypes.object,theme:PropTypes.object,view3dMode:PropTypes.number,zoomToPoint:PropTypes.func});_defineProperty(View3D,"defaultProps",{buttonPosition:6,controlsPosition:"top",geometry:{initialWidth:600,initialHeight:800,initialX:0,initialY:0,initiallyDocked:true},pluginOptions:{},mouseButtons:{left:"pan",middle:"zoom",right:"rotate"}});export default(function(plugins3d){return connect(function(state){return{plugins3d:plugins3d,display:state.display,map:state.map,layers:state.layers,theme:state.theme,localConfig:state.localConfig,view3dMode:state.display.view3dMode,startupParams:state.localConfig.startupParams,startupState:state.localConfig.startupState}},{addLayerFeatures:addLayerFeatures,removeLayer:removeLayer,panTo:panTo,zoomToPoint:zoomToPoint,setView3dMode:setView3dMode})(View3D)});
54
+ */
55
+ var View3D = /*#__PURE__*/function (_React$Component) {
56
+ function View3D(props) {
57
+ var _this;
58
+ _classCallCheck(this, View3D);
59
+ _this = _callSuper(this, View3D, [props]);
60
+ _defineProperty(_this, "state", {
61
+ componentLoaded: false,
62
+ windowDetached: false,
63
+ viewsLocked: false,
64
+ storedState: null
65
+ });
66
+ _defineProperty(_this, "render3DWindow", function () {
67
+ if (_this.props.view3dMode > View3DMode.DISABLED) {
68
+ var extraControls = [{
69
+ icon: "sync",
70
+ callback: _this.sync2DExtent,
71
+ title: LocaleUtils.tr("map3d.syncview")
72
+ }, {
73
+ icon: "lock",
74
+ callback: _this.setLockViews,
75
+ title: LocaleUtils.tr("map3d.lockview"),
76
+ active: _this.state.viewsLocked
77
+ }];
78
+ if (!_this.state.windowDetached) {
79
+ extraControls.push({
80
+ icon: "maximize",
81
+ callback: function callback() {
82
+ return _this.props.setView3dMode(View3DMode.FULLSCREEN);
83
+ },
84
+ title: LocaleUtils.tr("window.maximize")
85
+ });
86
+ }
87
+ var Map3D = _this.map3dComponent;
88
+ var device = ConfigUtils.isMobile() ? 'mobile' : 'desktop';
89
+ var pluginsConfig = _this.props.view3dMode === View3DMode.FULLSCREEN ? _this.props.localConfig.plugins[device].filter(function (entry) {
90
+ return entry.availableIn3D;
91
+ }) : [];
92
+ return /*#__PURE__*/React.createElement(ResizeableWindow, {
93
+ extraControls: extraControls,
94
+ fullscreen: _this.props.view3dMode === View3DMode.FULLSCREEN,
95
+ icon: "map3d",
96
+ initialHeight: _this.props.geometry.initialHeight,
97
+ initialWidth: _this.props.geometry.initialWidth,
98
+ initialX: _this.props.geometry.initialX,
99
+ initialY: _this.props.geometry.initialY,
100
+ initiallyDocked: _this.props.geometry.initiallyDocked,
101
+ key: "View3DWindow",
102
+ maximizeable: false,
103
+ onClose: _this.onClose,
104
+ onExternalWindowResized: _this.redrawScene,
105
+ onFocusChanged: _this.windowFocusChanged,
106
+ onGeometryChanged: _this.onGeometryChanged,
107
+ splitScreenWhenDocked: true,
108
+ splitTopAndBottomBar: true,
109
+ title: LocaleUtils.tr("map3d.title")
110
+ }, _this.state.componentLoaded ? /*#__PURE__*/React.createElement(Provider, {
111
+ role: "body",
112
+ store: _this.store
113
+ }, /*#__PURE__*/React.createElement(PluginsContainer, {
114
+ pluginsConfig: pluginsConfig
115
+ }, /*#__PURE__*/React.createElement(Map3D, {
116
+ controlsPosition: _this.props.controlsPosition,
117
+ defaultSceneQuality: _this.props.defaultSceneQuality,
118
+ innerRef: _this.setRef,
119
+ mouseButtons: _this.props.mouseButtons,
120
+ onCameraChanged: _this.onCameraChanged,
121
+ onMapInitialized: _this.setupMap,
122
+ pluginOptions: _this.props.pluginOptions,
123
+ plugins3d: _this.props.plugins3d,
124
+ searchProviders: _this.props.searchProviders,
125
+ theme: _this.props.theme
126
+ }), _this.props.view3dMode === View3DMode.DISABLING ? /*#__PURE__*/React.createElement("div", {
127
+ className: "view3d-busy-overlay"
128
+ }, /*#__PURE__*/React.createElement(Spinner, null), /*#__PURE__*/React.createElement("span", null, LocaleUtils.tr("view3d.storingstate"))) : null)) : null);
129
+ }
130
+ return null;
131
+ });
132
+ _defineProperty(_this, "onClose", function () {
133
+ _this.props.setView3dMode(View3DMode.DISABLING);
134
+ });
135
+ _defineProperty(_this, "onGeometryChanged", function (geometry) {
136
+ if (geometry.maximized && _this.props.view3dMode !== View3DMode.FULLSCREEN) {
137
+ _this.props.setView3dMode(View3DMode.FULLSCREEN);
138
+ }
139
+ _this.setState({
140
+ windowDetached: geometry.detached
141
+ });
142
+ });
143
+ _defineProperty(_this, "onCameraChanged", function (center, camera, fov) {
144
+ // Note: If camera pos is NULL, we are in first-person-view
145
+ if (_this.state.viewsLocked && _this.focusedMap === "map3d") {
146
+ var rotation = undefined;
147
+ if (camera) {
148
+ rotation = Math.atan2(center[1] - camera[1], center[0] - camera[0]) - 0.5 * Math.PI;
149
+ var distance = Math.sqrt((camera[0] - center[0]) * (camera[0] - center[0]) + (camera[1] - center[1]) * (camera[1] - center[1]) + (camera[2] - center[2]) * (camera[2] - center[2]));
150
+ var fovrad = fov / 180 * Math.PI;
151
+ var bboxWidth = distance * (2 * Math.tan(fovrad / 2));
152
+ var bbox = [-0.5 * bboxWidth, 0, 0.5 * bboxWidth, 0];
153
+ var zoom = MapUtils.getZoomForExtent(bbox, _this.props.map.resolutions, _this.props.map.size, 0, _this.props.map.scales.length - 1);
154
+ _this.props.zoomToPoint(center.slice(0, 2), zoom, _this.props.theme.mapCrs, rotation);
155
+ if (_this.firstPersonMarker) {
156
+ _this.props.removeLayer("view3d-firstperson-cone");
157
+ _this.firstPersonMarker = false;
158
+ }
159
+ } else {
160
+ _this.props.panTo(center.slice(0, 2), _this.props.theme.mapCrs, rotation);
161
+ var feature = {
162
+ geometry: {
163
+ type: 'Point',
164
+ coordinates: center.slice(0, 2)
165
+ },
166
+ crs: _this.props.theme.mapCrs,
167
+ styleName: 'marker',
168
+ styleOptions: {
169
+ iconSrc: personIcon
170
+ }
171
+ };
172
+ var layer = {
173
+ id: "view3d-firstperson-marker",
174
+ role: LayerRole.MARKER
175
+ };
176
+ _this.props.addLayerFeatures(layer, [feature], true);
177
+ _this.firstPersonMarker = true;
178
+ }
179
+ } else if (_this.firstPersonMarker) {
180
+ _this.props.removeLayer("view3d-firstperson-marker");
181
+ _this.firstPersonMarker = false;
182
+ }
183
+ });
184
+ _defineProperty(_this, "setRef", function (ref) {
185
+ _this.map3dComponentRef = ref;
186
+ });
187
+ _defineProperty(_this, "sync2DExtent", function () {
188
+ if (_this.map3dComponentRef) {
189
+ _this.map3dComponentRef.setViewToExtent(_this.props.map.bbox.bounds, _this.props.map.bbox.rotation);
190
+ }
191
+ });
192
+ _defineProperty(_this, "setLockViews", function () {
193
+ _this.setState(function (state) {
194
+ return {
195
+ viewsLocked: !state.viewsLocked
196
+ };
197
+ });
198
+ if (_this.firstPersonMarker) {
199
+ _this.props.removeLayer("view3d-firstperson-marker");
200
+ _this.firstPersonMarker = false;
201
+ }
202
+ });
203
+ _defineProperty(_this, "setupMap", function () {
204
+ if (_this.map3dComponentRef) {
205
+ if (!isEmpty(_this.state.storedState)) {
206
+ _this.map3dComponentRef.restore3dState(_this.state.storedState);
207
+ } else if (_this.props.theme.current.map3d.initialView) {
208
+ _this.map3dComponentRef.restore3dState(_this.props.theme.current.map3d.initialView);
209
+ } else {
210
+ _this.sync2DExtent();
211
+ }
212
+ }
213
+ });
214
+ _defineProperty(_this, "redrawScene", function (ev) {
215
+ if (_this.map3dComponentRef) {
216
+ _this.map3dComponentRef.redrawScene(ev);
217
+ }
218
+ });
219
+ _defineProperty(_this, "trackFocus", function (ev) {
220
+ var _mapEl$contains, _map3dEl$contains;
221
+ var mapEl = document.getElementById("map");
222
+ var map3dEl = document.getElementById("map3d");
223
+ if (mapEl !== null && mapEl !== void 0 && (_mapEl$contains = mapEl.contains) !== null && _mapEl$contains !== void 0 && _mapEl$contains.call(mapEl, document.activeElement)) {
224
+ _this.focusedMap = "map";
225
+ } else if (map3dEl !== null && map3dEl !== void 0 && (_map3dEl$contains = map3dEl.contains) !== null && _map3dEl$contains !== void 0 && _map3dEl$contains.call(map3dEl, document.activeElement)) {
226
+ _this.focusedMap = "map3d";
227
+ } else {
228
+ _this.focusedMap = null;
229
+ }
230
+ });
231
+ _this.map3dComponent = null;
232
+ _this.map3dComponentRef = null;
233
+ _this.focusedMap = null;
234
+ _this.firstPersonMarker = true;
235
+ // Subset of 2d reducers
236
+ var _ReducerIndex$reducer = ReducerIndex.reducers,
237
+ processNotifications = _ReducerIndex$reducer.processNotifications,
238
+ task = _ReducerIndex$reducer.task,
239
+ windows = _ReducerIndex$reducer.windows;
240
+
241
+ // Reducer for syncronization with parent store
242
+ var forwardReducer = function forwardReducer(key, forwardActions, syncAction) {
243
+ return function () {
244
+ var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
245
+ var action = arguments.length > 1 ? arguments[1] : undefined;
246
+ if (forwardActions.includes(action.type)) {
247
+ // Forward to parent store
248
+ StandardApp.store.dispatch(action);
249
+ return state;
250
+ } else {
251
+ return action.type === syncAction ? action[key] : state;
252
+ }
253
+ };
254
+ };
255
+ var displayActions = Object.values(displayExports).filter(function (x) {
256
+ return typeof x === 'string';
257
+ });
258
+ var layersActions = Object.values(layersExports).filter(function (x) {
259
+ return typeof x === 'string';
260
+ });
261
+ var mapActions = Object.values(mapExports).filter(function (x) {
262
+ return typeof x === 'string';
263
+ });
264
+ var themeActions = Object.values(themeExports).filter(function (x) {
265
+ return typeof x === 'string';
266
+ });
267
+ var display = forwardReducer("display", displayActions, "SYNC_DISPLAY_FROM_PARENT_STORE");
268
+ var layers = forwardReducer("layers", layersActions, "SYNC_LAYERS_FROM_PARENT_STORE");
269
+ var map = forwardReducer("map", mapActions, "SYNC_MAP_FROM_PARENT_STORE");
270
+ var localConfig = forwardReducer("localConfig", [], "SYNC_LOCAL_CONFIG_FROM_PARENT_STORE");
271
+ var theme = forwardReducer("theme", themeActions, "SYNC_THEME_FROM_PARENT_STORE");
272
+ _this.store = createStore({
273
+ display: display,
274
+ layers: layers,
275
+ localConfig: localConfig,
276
+ map: map,
277
+ processNotifications: processNotifications,
278
+ theme: theme,
279
+ task: task,
280
+ windows: windows
281
+ });
282
+
283
+ // Set stored state
284
+ var storedState = _objectSpread({}, props.startupState.map3d);
285
+ if (props.startupParams.v3d) {
286
+ var values = props.startupParams.v3d.split(",").map(parseFloat).filter(function (x) {
287
+ return !isNaN(x);
288
+ });
289
+ if (values.length >= 6) {
290
+ var _values$;
291
+ storedState.camera = [values[0], values[1], values[2]];
292
+ storedState.target = [values[3], values[4], values[5]];
293
+ storedState.personHeight = (_values$ = values[6]) !== null && _values$ !== void 0 ? _values$ : 0;
294
+ }
295
+ }
296
+ if (props.startupParams.bl3d !== undefined) {
297
+ storedState.baseLayer = props.startupParams.bl3d;
298
+ }
299
+ _this.state.storedState = storedState;
300
+ return _this;
301
+ }
302
+ _inherits(View3D, _React$Component);
303
+ return _createClass(View3D, [{
304
+ key: "componentDidMount",
305
+ value: function componentDidMount() {
306
+ if (this.props.startupParams.v === "3d") {
307
+ this.props.setView3dMode(View3DMode.FULLSCREEN);
308
+ } else if (this.props.startupParams.v === "3d2d") {
309
+ this.props.setView3dMode(View3DMode.SPLITSCREEN);
310
+ }
311
+ window.addEventListener('focus', this.trackFocus, true);
312
+ this.syncParentStore({});
313
+ }
314
+ }, {
315
+ key: "componentWillUnmount",
316
+ value: function componentWillUnmount() {
317
+ window.removeEventListener('focus', this.trackFocus);
318
+ }
319
+ }, {
320
+ key: "componentDidUpdate",
321
+ value: function componentDidUpdate(prevProps, prevState) {
322
+ var _this2 = this,
323
+ _this$props$theme$cur;
324
+ if (this.props.view3dMode !== View3DMode.DISABLED && prevProps.view3dMode === View3DMode.DISABLED) {
325
+ import('../components/map3d/Map3D').then(function (component) {
326
+ _this2.map3dComponent = component["default"];
327
+ _this2.map3dComponentRef = null;
328
+ _this2.setState({
329
+ componentLoaded: true
330
+ });
331
+ });
332
+ this.syncParentStore(this.props, true);
333
+ } else if (this.props.view3dMode === View3DMode.DISABLING && prevProps.view3dMode !== View3DMode.DISABLING) {
334
+ if (this.map3dComponentRef) {
335
+ this.map3dComponentRef.store3dState().then(function (storedState) {
336
+ _this2.setState({
337
+ storedState: storedState
338
+ });
339
+ UrlParams.updateParams({
340
+ v3d: undefined,
341
+ bl3d: undefined
342
+ });
343
+ _this2.props.setView3dMode(View3DMode.DISABLED);
344
+ });
345
+ } else {
346
+ UrlParams.updateParams({
347
+ v3d: undefined,
348
+ bl3d: undefined
349
+ });
350
+ this.props.setView3dMode(View3DMode.DISABLED);
351
+ }
352
+ } else if (this.props.view3dMode === View3DMode.DISABLED && prevProps.view3dMode !== View3DMode.DISABLED) {
353
+ this.map3dComponent = null;
354
+ this.map3dComponentRef = null;
355
+ this.setState({
356
+ componentLoaded: false
357
+ });
358
+ if (this.firstPersonMarker) {
359
+ this.props.removeLayer("view3d-firstperson-marker");
360
+ this.firstPersonMarker = false;
361
+ }
362
+ }
363
+ // Sync parts of parent store
364
+ this.syncParentStore(prevProps);
365
+ // Handle view mode change
366
+ if (this.props.view3dMode !== prevProps.view3dMode) {
367
+ if (this.props.view3dMode === View3DMode.FULLSCREEN) {
368
+ UrlParams.updateParams({
369
+ v: "3d"
370
+ });
371
+ this.setState({
372
+ viewsLocked: false
373
+ });
374
+ } else if (this.props.view3dMode === View3DMode.SPLITSCREEN) {
375
+ UrlParams.updateParams({
376
+ v: "3d2d"
377
+ });
378
+ } else {
379
+ UrlParams.updateParams({
380
+ v: "2d"
381
+ });
382
+ }
383
+ }
384
+ // Switch to 2D mode if new theme has no 3D configuration
385
+ if (this.props.theme.current !== prevProps.theme.current && !((_this$props$theme$cur = this.props.theme.current) !== null && _this$props$theme$cur !== void 0 && _this$props$theme$cur.map3d) && this.props.view3dMode !== View3DMode.DISABLED) {
386
+ this.props.setView3dMode(View3D.DISABLED);
387
+ }
388
+ // Lock views
389
+ if (this.state.viewsLocked && this.props.map.bbox !== prevProps.map.bbox && this.focusedMap === "map") {
390
+ this.sync2DExtent();
391
+ }
392
+ // Clear stored state when switching away from a theme
393
+ if (prevProps.theme.current && this.props.theme.current !== prevProps.theme.current) {
394
+ this.setState({
395
+ storedState: null
396
+ });
397
+ }
398
+ }
399
+ }, {
400
+ key: "syncParentStore",
401
+ value: function syncParentStore(prevProps) {
402
+ var force = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
403
+ if (this.props.view3dMode === View3DMode.DISABLED) {
404
+ return;
405
+ }
406
+ if (this.props.display !== prevProps.display || force) {
407
+ this.store.dispatch({
408
+ type: "SYNC_DISPLAY_FROM_PARENT_STORE",
409
+ display: this.props.display
410
+ });
411
+ }
412
+ if (this.props.theme !== prevProps.theme || force) {
413
+ this.store.dispatch({
414
+ type: "SYNC_THEME_FROM_PARENT_STORE",
415
+ theme: this.props.theme
416
+ });
417
+ }
418
+ if (this.props.localConfig !== prevProps.localConfig || force) {
419
+ this.store.dispatch({
420
+ type: "SYNC_LOCAL_CONFIG_FROM_PARENT_STORE",
421
+ localConfig: this.props.localConfig
422
+ });
423
+ }
424
+ if (this.props.layers !== prevProps.layers || force) {
425
+ this.store.dispatch({
426
+ type: "SYNC_LAYERS_FROM_PARENT_STORE",
427
+ layers: this.props.layers
428
+ });
429
+ }
430
+ if (this.props.map !== prevProps.map || force) {
431
+ this.store.dispatch({
432
+ type: "SYNC_MAP_FROM_PARENT_STORE",
433
+ map: this.props.map
434
+ });
435
+ }
436
+ }
437
+ }, {
438
+ key: "render",
439
+ value: function render() {
440
+ var _this$props$theme$cur2;
441
+ var button = (_this$props$theme$cur2 = this.props.theme.current) !== null && _this$props$theme$cur2 !== void 0 && _this$props$theme$cur2.map3d ? /*#__PURE__*/React.createElement(View3DSwitcher, {
442
+ key: "View3DButton",
443
+ position: this.props.buttonPosition
444
+ }) : null;
445
+ return [button, this.render3DWindow()];
446
+ }
447
+ }]);
448
+ }(React.Component);
449
+ _defineProperty(View3D, "propTypes", {
450
+ addLayerFeatures: PropTypes.func,
451
+ /** The position slot index of the 3d switch map button, from the bottom (0: bottom slot). */
452
+ buttonPosition: PropTypes.number,
453
+ /** The position of the navigation controls. Either `top` or `bottom`. */
454
+ controlsPosition: PropTypes.string,
455
+ /** The default scene quality factor (`20`: min, `100`: max). */
456
+ defaultSceneQuality: PropTypes.number,
457
+ display: PropTypes.object,
458
+ /** Default window geometry. */
459
+ geometry: PropTypes.shape({
460
+ initialWidth: PropTypes.number,
461
+ initialHeight: PropTypes.number,
462
+ initialX: PropTypes.number,
463
+ initialY: PropTypes.number,
464
+ initiallyDocked: PropTypes.bool
465
+ }),
466
+ layers: PropTypes.object,
467
+ localConfig: PropTypes.object,
468
+ map: PropTypes.object,
469
+ /** Mouse buttons assignment. You can assign `pan`, `rotate`, `zoom` to each button. */
470
+ mouseButtons: PropTypes.shape({
471
+ left: PropTypes.string,
472
+ middle: PropTypes.string,
473
+ right: PropTypes.string
474
+ }),
475
+ panTo: PropTypes.func,
476
+ /** Options to pass to the 3D plugins, in the form `{"<PluginName>": {<options>}}`.
477
+ * Refer to the documentation of the <a href="#plugins3d">3D plugins</a> for settable options. */
478
+ pluginOptions: PropTypes.object,
479
+ plugins3d: PropTypes.object,
480
+ removeLayer: PropTypes.func,
481
+ searchProviders: PropTypes.object,
482
+ setView3dMode: PropTypes.func,
483
+ startupParams: PropTypes.object,
484
+ startupState: PropTypes.object,
485
+ theme: PropTypes.object,
486
+ view3dMode: PropTypes.number,
487
+ zoomToPoint: PropTypes.func
488
+ });
489
+ _defineProperty(View3D, "defaultProps", {
490
+ buttonPosition: 6,
491
+ controlsPosition: 'top',
492
+ defaultSceneQuality: 100,
493
+ geometry: {
494
+ initialWidth: 600,
495
+ initialHeight: 800,
496
+ initialX: 0,
497
+ initialY: 0,
498
+ initiallyDocked: true
499
+ },
500
+ pluginOptions: {},
501
+ mouseButtons: {
502
+ left: 'pan',
503
+ middle: 'zoom',
504
+ right: 'rotate'
505
+ }
506
+ });
507
+ export default (function (plugins3d) {
508
+ return connect(function (state) {
509
+ return {
510
+ plugins3d: plugins3d,
511
+ display: state.display,
512
+ map: state.map,
513
+ layers: state.layers,
514
+ theme: state.theme,
515
+ localConfig: state.localConfig,
516
+ view3dMode: state.display.view3dMode,
517
+ startupParams: state.localConfig.startupParams,
518
+ startupState: state.localConfig.startupState
519
+ };
520
+ }, {
521
+ addLayerFeatures: addLayerFeatures,
522
+ removeLayer: removeLayer,
523
+ panTo: panTo,
524
+ zoomToPoint: zoomToPoint,
525
+ setView3dMode: setView3dMode
526
+ })(View3D);
527
+ });