qwc2 2025.7.23 → 2025.8.6

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 (66) hide show
  1. package/actions/theme.js +7 -7
  2. package/components/EditComboField.js +1 -1
  3. package/components/ExportSelection.js +7 -0
  4. package/components/QtDesignerForm.js +2 -1
  5. package/components/StandardApp.js +2 -2
  6. package/components/map3d/Map3D.js +7 -6
  7. package/components/map3d/MapExport3D.js +4 -5
  8. package/components/map3d/Settings3D.js +7 -0
  9. package/components/map3d/TopBar3D.js +1 -1
  10. package/components/map3d/View3DSwitcher.js +1 -1
  11. package/components/map3d/layers/GeoTIFFLayer3D.js +7 -0
  12. package/components/map3d/layers/index.js +1 -1
  13. package/components/map3d/style/Map3D.css +1 -0
  14. package/components/map3d/style/Settings3D.css +11 -0
  15. package/components/map3d/style/View3DSwitcher.css +4 -0
  16. package/components/style/ExportSelection.css +103 -0
  17. package/components/widgets/DateTimeInput.js +2 -2
  18. package/components/widgets/Input.js +1 -1
  19. package/components/widgets/TextInput.js +1 -1
  20. package/components/widgets/style/DateTimeInput.css +7 -0
  21. package/components/widgets/style/NumberInput.css +5 -0
  22. package/icons/view.svg +90 -0
  23. package/package.json +1 -1
  24. package/plugins/Editing.js +3 -3
  25. package/plugins/FeatureForm.js +1 -1
  26. package/plugins/LayerTree.js +1 -1
  27. package/plugins/MapExport.js +7 -6
  28. package/plugins/MapInfoTooltip.js +1 -1
  29. package/plugins/TopBar.js +2 -2
  30. package/plugins/View3D.js +1 -1
  31. package/plugins/map/EditingSupport.js +1 -1
  32. package/reducers/editing.js +1 -1
  33. package/reducers/layers.js +1 -2
  34. package/scripts/themesConfig.js +3 -3
  35. package/scripts/themesConfig.py +2 -0
  36. package/static/translations/bg-BG.json +4 -0
  37. package/static/translations/ca-ES.json +4 -0
  38. package/static/translations/cs-CZ.json +4 -0
  39. package/static/translations/de-CH.json +4 -0
  40. package/static/translations/de-DE.json +4 -0
  41. package/static/translations/en-US.json +4 -0
  42. package/static/translations/es-ES.json +4 -0
  43. package/static/translations/fi-FI.json +4 -0
  44. package/static/translations/fr-FR.json +4 -0
  45. package/static/translations/hu-HU.json +4 -0
  46. package/static/translations/it-IT.json +4 -0
  47. package/static/translations/ja-JP.json +4 -0
  48. package/static/translations/nl-NL.json +4 -0
  49. package/static/translations/no-NO.json +4 -0
  50. package/static/translations/pl-PL.json +4 -0
  51. package/static/translations/pt-BR.json +4 -0
  52. package/static/translations/pt-PT.json +4 -0
  53. package/static/translations/ro-RO.json +4 -0
  54. package/static/translations/ru-RU.json +4 -0
  55. package/static/translations/sv-SE.json +4 -0
  56. package/static/translations/tr-TR.json +4 -0
  57. package/static/translations/tsconfig.json +2 -0
  58. package/utils/EditingUtils.js +1 -1
  59. package/utils/ElevationInterface.js +1 -1
  60. package/utils/IdentifyUtils.js +1 -1
  61. package/utils/LayerUtils.js +5 -4
  62. package/utils/ServiceLayerUtils.js +1 -1
  63. package/utils/ThemeUtils.js +3 -3
  64. package/utils/expr_grammar/grammar.js +1 -1
  65. package/utils/expr_grammar/grammar.ne +34 -8
  66. package/components/map3d/style/MapExport3D.css +0 -25
package/actions/theme.js CHANGED
@@ -4,21 +4,21 @@ function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof
4
4
  *
5
5
  * This source code is licensed under the BSD-style license found in the
6
6
  * LICENSE file in the root directory of this source tree.
7
- */import ReducerIndex from"../reducers/index";import themeReducer from"../reducers/theme";ReducerIndex.register("theme",themeReducer);import isEmpty from"lodash.isempty";import{setCurrentTask}from"../actions/task";import ConfigUtils from"../utils/ConfigUtils";import CoordinatesUtils from"../utils/CoordinatesUtils";import LayerUtils from"../utils/LayerUtils";import LocaleUtils from"../utils/LocaleUtils";import MapUtils from"../utils/MapUtils";import{UrlParams}from"../utils/PermaLinkUtils";import ServiceLayerUtils from"../utils/ServiceLayerUtils";import ThemeUtils from"../utils/ThemeUtils";import{View3DMode}from"./display";import{LayerRole,addLayer,removeLayer,removeAllLayers,replacePlaceholderLayer,setSwipe}from"./layers";import{configureMap}from"./map";import{showNotification,NotificationType}from"./windows";export var THEMES_LOADED="THEMES_LOADED";export var SET_THEME_LAYERS_LIST="SET_THEME_LAYERS_LIST";export var SET_CURRENT_THEME="SET_CURRENT_THEME";export var SWITCHING_THEME="SWITCHING_THEME";export function themesLoaded(themes){return{type:THEMES_LOADED,themes:themes}}export function setThemeLayersList(theme){return{type:SET_THEME_LAYERS_LIST,themelist:theme}}export function finishThemeSetup(dispatch,theme,themes,layerConfigs,insertPos,permalinkLayers,externalLayerRestorer,visibleBgLayer,initialTheme){var _theme$config;// Create layer
7
+ */import ReducerIndex from"../reducers/index";import themeReducer from"../reducers/theme";ReducerIndex.register("theme",themeReducer);import isEmpty from"lodash.isempty";import{setView3dMode,View3DMode}from"../actions/display";import{setCurrentTask}from"../actions/task";import ConfigUtils from"../utils/ConfigUtils";import CoordinatesUtils from"../utils/CoordinatesUtils";import LayerUtils from"../utils/LayerUtils";import LocaleUtils from"../utils/LocaleUtils";import MapUtils from"../utils/MapUtils";import{UrlParams}from"../utils/PermaLinkUtils";import ServiceLayerUtils from"../utils/ServiceLayerUtils";import ThemeUtils from"../utils/ThemeUtils";import{LayerRole,addLayer,removeLayer,removeAllLayers,replacePlaceholderLayer,setSwipe}from"./layers";import{configureMap}from"./map";import{showNotification,NotificationType}from"./windows";export var THEMES_LOADED="THEMES_LOADED";export var SET_THEME_LAYERS_LIST="SET_THEME_LAYERS_LIST";export var SET_CURRENT_THEME="SET_CURRENT_THEME";export var SWITCHING_THEME="SWITCHING_THEME";export function themesLoaded(themes){return{type:THEMES_LOADED,themes:themes}}export function setThemeLayersList(theme){return{type:SET_THEME_LAYERS_LIST,themelist:theme}}export function finishThemeSetup(dispatch,theme,themes,layerConfigs,insertPos,permalinkLayers,externalLayerRestorer,visibleBgLayer,initialTheme){var _theme$config;var initialView=arguments.length>9&&arguments[9]!==undefined?arguments[9]:null;// Create layer
8
8
  var themeLayer=ThemeUtils.createThemeLayer(theme,themes);var layers=[themeLayer];// Restore theme layer configuration, create placeholders for missing layers
9
9
  var externalLayers={};if(!isEmpty(permalinkLayers)&&ConfigUtils.getConfigProp("storeAllLayersInPermalink")){layers=permalinkLayers}else{if(layerConfigs){if(ConfigUtils.getConfigProp("allowReorderingLayers",theme)!==true){layers=LayerUtils.restoreLayerParams(themeLayer,layerConfigs,permalinkLayers,externalLayers)}else{layers=LayerUtils.restoreOrderedLayerParams(themeLayer,layerConfigs,permalinkLayers,externalLayers)}}if(isEmpty(layers)){layers=[_objectSpread(_objectSpread({},themeLayer),{},{sublayers:[]})]}}// Add background layers for theme
10
- var haveVisibleBg=false;var _iterator=_createForOfIteratorHelper(ThemeUtils.createThemeBackgroundLayers(theme,themes,visibleBgLayer,externalLayers,dispatch,initialTheme)),_step;try{for(_iterator.s();!(_step=_iterator.n()).done;){var bgLayer=_step.value;haveVisibleBg|=bgLayer.visibility;dispatch(addLayer(bgLayer))}}catch(err){_iterator.e(err)}finally{_iterator.f()}if(!haveVisibleBg){UrlParams.updateParams({bl:""})}var _iterator2=_createForOfIteratorHelper(layers.reverse()),_step2;try{for(_iterator2.s();!(_step2=_iterator2.n()).done;){var layer=_step2.value;dispatch(addLayer(layer,insertPos))}// Restore external layers
10
+ var haveVisibleBg=false;var bgLayers=ThemeUtils.createThemeBackgroundLayers(theme.backgroundLayers||[],themes,visibleBgLayer,externalLayers);if(initialTheme&&visibleBgLayer){var _bgLayers$find;var visibleLayer=(_bgLayers$find=bgLayers.find(function(entry){return entry.visibility}))===null||_bgLayers$find===void 0?void 0:_bgLayers$find.name;if(visibleLayer!==visibleBgLayer){dispatch(showNotification("missingbglayer",LocaleUtils.tr("app.missingbg",visibleBgLayer),NotificationType.WARN,true))}}var _iterator=_createForOfIteratorHelper(bgLayers),_step;try{for(_iterator.s();!(_step=_iterator.n()).done;){var bgLayer=_step.value;haveVisibleBg|=bgLayer.visibility;dispatch(addLayer(bgLayer))}}catch(err){_iterator.e(err)}finally{_iterator.f()}if(!haveVisibleBg){UrlParams.updateParams({bl:""})}var _iterator2=_createForOfIteratorHelper(layers.reverse()),_step2;try{for(_iterator2.s();!(_step2=_iterator2.n()).done;){var layer=_step2.value;dispatch(addLayer(layer,insertPos))}// Restore external layers
11
11
  }catch(err){_iterator2.e(err)}finally{_iterator2.f()}if(externalLayerRestorer){externalLayerRestorer(externalLayers,themes,function(source,layer){dispatch(replacePlaceholderLayer(source,layer))})}else{for(var _i=0,_Object$keys=Object.keys(externalLayers);_i<_Object$keys.length;_i++){var key=_Object$keys[_i];var idx=key.indexOf(":");var service=key.slice(0,idx);var serviceUrl=key.slice(idx+1);ServiceLayerUtils.findLayers(service,serviceUrl,externalLayers[key],theme.mapCrs,function(id,layer){// Don't expose sublayers
12
- if(layer){layer.sublayers=null}dispatch(replacePlaceholderLayer(id,layer))})}}dispatch({type:SET_CURRENT_THEME,theme:theme,layer:themeLayer.id});dispatch({type:SWITCHING_THEME,switching:false});var task=(_theme$config=theme.config)===null||_theme$config===void 0?void 0:_theme$config.startupTask;if(task){var mapClickAction=ConfigUtils.getPluginConfig(task.key).mapClickAction;dispatch(setCurrentTask(task.key,task.mode,mapClickAction))}}export function setCurrentTheme(theme,themes){var preserve=arguments.length>2&&arguments[2]!==undefined?arguments[2]:true;var initialView=arguments.length>3&&arguments[3]!==undefined?arguments[3]:null;var layerParams=arguments.length>4&&arguments[4]!==undefined?arguments[4]:null;var visibleBgLayer=arguments.length>5&&arguments[5]!==undefined?arguments[5]:null;var permalinkLayers=arguments.length>6&&arguments[6]!==undefined?arguments[6]:null;var themeLayerRestorer=arguments.length>7&&arguments[7]!==undefined?arguments[7]:null;var externalLayerRestorer=arguments.length>8&&arguments[8]!==undefined?arguments[8]:null;return function(dispatch,getState){var _getState$layers;var curLayers=((_getState$layers=getState().layers)===null||_getState$layers===void 0?void 0:_getState$layers.flat)||[];var mapCrs=theme.mapCrs||themes.defaultMapCrs||"EPSG:3857";if(!(mapCrs in CoordinatesUtils.getAvailableCRS())){dispatch(showNotification("missingprojection",LocaleUtils.tr("app.missingprojection",theme.title,mapCrs),NotificationType.WARN,true));return}var initialTheme=!getState().theme.current;dispatch({type:SWITCHING_THEME,switching:true});// Get current background layer if it needs to be preserved
12
+ if(layer){layer.sublayers=null}dispatch(replacePlaceholderLayer(id,layer))})}}dispatch({type:SET_CURRENT_THEME,theme:theme,layer:themeLayer.id});if(initialView===null){if(theme.startupView==="2d"){dispatch(setView3dMode(View3DMode.DISABLED))}else if(theme.startupView==="3d2d"){dispatch(setView3dMode(View3DMode.SPLITSCREEN))}else if(theme.startupView==="3d"){dispatch(setView3dMode(View3DMode.FULLSCREEN))}}dispatch({type:SWITCHING_THEME,switching:false});var task=(_theme$config=theme.config)===null||_theme$config===void 0?void 0:_theme$config.startupTask;if(task){var mapClickAction=ConfigUtils.getPluginConfig(task.key).mapClickAction;dispatch(setCurrentTask(task.key,task.mode,mapClickAction))}}export function setCurrentTheme(theme,themes){var preserve=arguments.length>2&&arguments[2]!==undefined?arguments[2]:true;var initialExtent=arguments.length>3&&arguments[3]!==undefined?arguments[3]:null;var layerParams=arguments.length>4&&arguments[4]!==undefined?arguments[4]:null;var visibleBgLayer=arguments.length>5&&arguments[5]!==undefined?arguments[5]:null;var permalinkLayers=arguments.length>6&&arguments[6]!==undefined?arguments[6]:null;var themeLayerRestorer=arguments.length>7&&arguments[7]!==undefined?arguments[7]:null;var externalLayerRestorer=arguments.length>8&&arguments[8]!==undefined?arguments[8]:null;var initialView=arguments.length>9&&arguments[9]!==undefined?arguments[9]:null;return function(dispatch,getState){var _getState$layers;var curLayers=((_getState$layers=getState().layers)===null||_getState$layers===void 0?void 0:_getState$layers.flat)||[];var mapCrs=theme.mapCrs||themes.defaultMapCrs||"EPSG:3857";if(!(mapCrs in CoordinatesUtils.getAvailableCRS())){dispatch(showNotification("missingprojection",LocaleUtils.tr("app.missingprojection",theme.title,mapCrs),NotificationType.WARN,true));return}var initialTheme=!getState().theme.current;dispatch({type:SWITCHING_THEME,switching:true});// Get current background layer if it needs to be preserved
13
13
  if(preserve&&visibleBgLayer===null&&ConfigUtils.getConfigProp("preserveBackgroundOnThemeSwitch",theme)===true){var curBgLayer=curLayers.find(function(layer){return layer.role===LayerRole.BACKGROUND&&layer.visibility===true});visibleBgLayer=curBgLayer?curBgLayer.name:null}// Remove old layers
14
14
  var insertPos=0;if(preserve&&ConfigUtils.getConfigProp("preserveNonThemeLayersOnThemeSwitch",theme)===true){// Compute insertion position of new theme layers by counting how many non-theme layers remain
15
15
  insertPos=curLayers.filter(function(layer){return layer.role===LayerRole.USERLAYER}).length;var removeLayers=curLayers.filter(function(layer){return layer.role!==LayerRole.USERLAYER}).map(function(layer){return layer.id});var _iterator3=_createForOfIteratorHelper(removeLayers),_step3;try{for(_iterator3.s();!(_step3=_iterator3.n()).done;){var layerId=_step3.value;dispatch(removeLayer(layerId))}}catch(err){_iterator3.e(err)}finally{_iterator3.f()}}else{dispatch(removeAllLayers())}dispatch(setSwipe(null));if(!theme){dispatch({type:SWITCHING_THEME,switching:false});return}// Inherit defaults if necessary
16
16
  theme=_objectSpread(_objectSpread({},theme),{},{mapCrs:mapCrs,version:theme.version||themes.defaultWMSVersion||"1.3.0",scales:theme.scales||themes.defaultScales||MapUtils.getGoogleMercatorScales(0,21),printScales:theme.printScales||themes.defaultPrintScales||undefined,printResolutions:theme.printResolutions||themes.defaultPrintResolutions||undefined,printGrid:theme.printGrid||themes.defaultPrintGrid||undefined,searchProviders:theme.searchProviders||themes.defaultSearchProviders||undefined,backgroundLayers:theme.backgroundLayers||themes.defaultBackgroundLayers||[],defaultDisplayCrs:theme.defaultDisplayCrs||themes.defaultDisplayCrs||undefined});// Preserve extent if desired and possible
17
- if(getState().display.view3dMode!==View3DMode.FULLSCREEN){var curCrs=getState().map.projection;if(preserve&&!initialView&&curCrs===theme.mapCrs){var curBounds=getState().map.bbox.bounds;if(ConfigUtils.getConfigProp("preserveExtentOnThemeSwitch",theme)===true){// If theme bbox (b1) includes current bbox (b2), keep current extent
17
+ if(getState().display.view3dMode!==View3DMode.FULLSCREEN){var curCrs=getState().map.projection;if(preserve&&!initialExtent&&curCrs===theme.mapCrs){var curBounds=getState().map.bbox.bounds;if(ConfigUtils.getConfigProp("preserveExtentOnThemeSwitch",theme)===true){// If theme bbox (b1) includes current bbox (b2), keep current extent
18
18
  var b1=CoordinatesUtils.reprojectBbox(theme.bbox.bounds,theme.bbox.crs,curCrs);var b2=curBounds;if(b2[0]>=b1[0]&&b2[1]>=b1[1]&&b2[2]<=b1[2]&&b2[3]<=b1[3]){// theme bbox (b1) includes current bbox (b2)
19
- initialView={bounds:curBounds,crs:curCrs}}}else if(ConfigUtils.getConfigProp("preserveExtentOnThemeSwitch",theme)==="force"){initialView={bounds:curBounds,crs:curCrs}}}}// Reconfigure map
20
- dispatch(configureMap(theme.mapCrs,theme.scales,initialView||theme.initialBbox,theme.defaultDisplayCrs));var layerConfigs=layerParams?layerParams.map(function(param){return LayerUtils.splitLayerUrlParam(param)}):null;if(layerConfigs){layerConfigs=LayerUtils.replaceLayerGroups(layerConfigs,theme)}// Restore missing theme layers
19
+ initialExtent={bounds:curBounds,crs:curCrs}}}else if(ConfigUtils.getConfigProp("preserveExtentOnThemeSwitch",theme)==="force"){initialExtent={bounds:curBounds,crs:curCrs}}}}// Reconfigure map
20
+ dispatch(configureMap(theme.mapCrs,theme.scales,initialExtent||theme.initialBbox,theme.defaultDisplayCrs));var layerConfigs=layerParams?layerParams.map(function(param){return LayerUtils.splitLayerUrlParam(param)}):null;if(layerConfigs){layerConfigs=LayerUtils.replaceLayerGroups(layerConfigs,theme)}// Restore missing theme layers
21
21
  var missingThemeLayers=null;if(layerConfigs){var layerNames=LayerUtils.getSublayerNames(theme);missingThemeLayers=layerConfigs.reduce(function(missing,layerConfig){if(layerConfig.type==="theme"&&!layerNames.includes(layerConfig.name)){return _objectSpread(_objectSpread({},missing),{},_defineProperty({},layerConfig.name,layerConfig))}else{return missing}},{})}if(themeLayerRestorer&&!isEmpty(missingThemeLayers)){themeLayerRestorer(Object.keys(missingThemeLayers),theme,function(newLayers,newLayerNames){var newTheme=LayerUtils.mergeSubLayers(theme,{sublayers:newLayers});if(newLayerNames){layerConfigs=layerConfigs.reduce(function(res,layerConfig){if(layerConfig.name in newLayerNames){// If layerConfig exactly matches a restored theme layer, return unchanged config
22
22
  if(newLayerNames[layerConfig.name].length===1&&newLayerNames[layerConfig.name][0]===layerConfig.name){return[].concat(_toConsumableArray(res),[layerConfig])}// Else, in case multiple theme layers were returned (i.e. layerConfig.name specifies a group)
23
23
  // generate layerConfigs based on the group layerConfig, preserving the opacity/visibility/etc of the sublayer
24
- return[].concat(_toConsumableArray(res),_toConsumableArray(newLayerNames[layerConfig.name].map(function(sublayername){var _sublayer$opacity,_sublayer$visibility;var sublayer=LayerUtils.searchSubLayer({sublayers:newLayers},"name",sublayername);return _objectSpread(_objectSpread({},layerConfig),{},{name:sublayername,opacity:(_sublayer$opacity=sublayer.opacity)!==null&&_sublayer$opacity!==void 0?_sublayer$opacity:255,visibility:(_sublayer$visibility=sublayer.visibility)!==null&&_sublayer$visibility!==void 0?_sublayer$visibility:true,tristate:sublayer.tristate||false,style:sublayer.style})})))}else{return[].concat(_toConsumableArray(res),[layerConfig])}},[]);var diff=Object.keys(missingThemeLayers).filter(function(entry){return isEmpty(newLayerNames[entry])});if(!isEmpty(diff)){dispatch(showNotification("missinglayers",LocaleUtils.tr("app.missinglayers",diff.join(", ")),NotificationType.WARN,true))}}finishThemeSetup(dispatch,newTheme,themes,layerConfigs,insertPos,permalinkLayers,externalLayerRestorer,visibleBgLayer,initialTheme)})}else{if(!isEmpty(missingThemeLayers)){dispatch(showNotification("missinglayers",LocaleUtils.tr("app.missinglayers",Object.keys(missingThemeLayers).join(", ")),NotificationType.WARN,true))}finishThemeSetup(dispatch,theme,themes,layerConfigs,insertPos,permalinkLayers,externalLayerRestorer,visibleBgLayer,initialTheme)}}}
24
+ return[].concat(_toConsumableArray(res),_toConsumableArray(newLayerNames[layerConfig.name].map(function(sublayername){var _sublayer$opacity,_sublayer$visibility;var sublayer=LayerUtils.searchSubLayer({sublayers:newLayers},"name",sublayername);return _objectSpread(_objectSpread({},layerConfig),{},{name:sublayername,opacity:(_sublayer$opacity=sublayer.opacity)!==null&&_sublayer$opacity!==void 0?_sublayer$opacity:255,visibility:(_sublayer$visibility=sublayer.visibility)!==null&&_sublayer$visibility!==void 0?_sublayer$visibility:true,tristate:sublayer.tristate||false,style:sublayer.style})})))}else{return[].concat(_toConsumableArray(res),[layerConfig])}},[]);var diff=Object.keys(missingThemeLayers).filter(function(entry){return isEmpty(newLayerNames[entry])});if(!isEmpty(diff)){dispatch(showNotification("missinglayers",LocaleUtils.tr("app.missinglayers",diff.join(", ")),NotificationType.WARN,true))}}finishThemeSetup(dispatch,newTheme,themes,layerConfigs,insertPos,permalinkLayers,externalLayerRestorer,visibleBgLayer,initialTheme,initialView)})}else{if(!isEmpty(missingThemeLayers)){dispatch(showNotification("missinglayers",LocaleUtils.tr("app.missinglayers",Object.keys(missingThemeLayers).join(", ")),NotificationType.WARN,true))}finishThemeSetup(dispatch,theme,themes,layerConfigs,insertPos,permalinkLayers,externalLayerRestorer,visibleBgLayer,initialTheme,initialView)}}}
@@ -5,7 +5,7 @@ function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof
5
5
  * This source code is licensed under the BSD-style license found in the
6
6
  * LICENSE file in the root directory of this source tree.
7
7
  */import React from"react";import PropTypes from"prop-types";import{KeyValCache}from"../utils/EditingUtils";import LocaleUtils from"../utils/LocaleUtils";import"./style/EditComboField.css";var EditComboField=/*#__PURE__*/function(_React$Component){function EditComboField(){var _this;_classCallCheck(this,EditComboField);for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++){args[_key]=arguments[_key]}_this=_callSuper(this,EditComboField,[].concat(args));_defineProperty(_this,"state",{showPlaceholder:true,values:[]});_defineProperty(_this,"hasEmptyValue",function(values){for(var i=0;i<values.length;++i){if(typeof values[i]==="string"){if(values[i]===""){return true}}else if(values[i].value===""){return true}}return false});_defineProperty(_this,"renderMultiSelect",function(){var items=new Set;try{items=new Set(JSON.parse("["+_this.props.value.slice(1,-1)+"]"))}catch(e){// pass
8
- }var serializeValue=function serializeValue(value,enabled){if(enabled){return"{"+JSON.stringify(_toConsumableArray(items).concat([value])).slice(1,-1)+"}"}else{return"{"+JSON.stringify(_toConsumableArray(items).filter(function(x){return x!==value})).slice(1,-1)+"}"}};return/*#__PURE__*/React.createElement("div",{className:"edit-multi-select"},_this.state.values.map(function(item,index){var _this$itemValueLabel=_this.itemValueLabel(item),value=_this$itemValueLabel.value,label=_this$itemValueLabel.label;return/*#__PURE__*/React.createElement("div",{key:_this.props.fieldId+index},/*#__PURE__*/React.createElement("label",null,/*#__PURE__*/React.createElement("input",{checked:items.has(value),onChange:function onChange(ev){return _this.props.updateField(_this.props.fieldId,serializeValue(value,ev.target.checked))},type:"checkbox"}),label))}))});_defineProperty(_this,"renderComboSelect",function(){var _this$props$placehold;return/*#__PURE__*/React.createElement("select",{disabled:_this.props.readOnly,name:_this.props.name,onChange:function onChange(ev){return _this.props.updateField(_this.props.fieldId,ev.target.selectedIndex===0&&_this.state.showPlaceholder?null:ev.target.value)},required:_this.props.required,style:_this.props.style,value:String(_this.props.value)},_this.state.showPlaceholder?/*#__PURE__*/React.createElement("option",{disabled:_this.props.required,value:""},(_this$props$placehold=_this.props.placeholder)!==null&&_this$props$placehold!==void 0?_this$props$placehold:LocaleUtils.tr("editing.select")):null,_this.state.values.map(function(item,index){var _this$itemValueLabel2=_this.itemValueLabel(item),value=_this$itemValueLabel2.value,label=_this$itemValueLabel2.label;return/*#__PURE__*/React.createElement("option",{key:_this.props.fieldId+index,value:String(value)},label)}))});_defineProperty(_this,"itemValueLabel",function(item){var value="";var label="";if(typeof item==="string"){value=label=item}else{value=item.value;label=item.label}return{value:value,label:label}});return _this}_inherits(EditComboField,_React$Component);return _createClass(EditComboField,[{key:"componentDidMount",value:function componentDidMount(){var _this2=this;if(this.props.values){// eslint-disable-next-line
8
+ }var serializeValue=function serializeValue(value,enabled){if(enabled){return"{"+JSON.stringify(_toConsumableArray(items).concat([value])).slice(1,-1)+"}"}else{return"{"+JSON.stringify(_toConsumableArray(items).filter(function(x){return x!==value})).slice(1,-1)+"}"}};return/*#__PURE__*/React.createElement("div",{className:"edit-multi-select"},_this.state.values.map(function(item,index){var _this$itemValueLabel=_this.itemValueLabel(item),value=_this$itemValueLabel.value,label=_this$itemValueLabel.label;return/*#__PURE__*/React.createElement("div",{key:_this.props.fieldId+index},/*#__PURE__*/React.createElement("label",null,/*#__PURE__*/React.createElement("input",{checked:items.has(value),disabled:_this.props.readOnly,onChange:function onChange(ev){return _this.props.updateField(_this.props.fieldId,serializeValue(value,ev.target.checked))},type:"checkbox"}),label))}))});_defineProperty(_this,"renderComboSelect",function(){var _this$props$placehold;return/*#__PURE__*/React.createElement("select",{disabled:_this.props.readOnly,name:_this.props.name,onChange:function onChange(ev){return _this.props.updateField(_this.props.fieldId,ev.target.selectedIndex===0&&_this.state.showPlaceholder?null:ev.target.value)},required:_this.props.required,style:_this.props.style,value:String(_this.props.value)},_this.state.showPlaceholder?/*#__PURE__*/React.createElement("option",{disabled:_this.props.required,value:""},(_this$props$placehold=_this.props.placeholder)!==null&&_this$props$placehold!==void 0?_this$props$placehold:LocaleUtils.tr("editing.select")):null,_this.state.values.map(function(item,index){var _this$itemValueLabel2=_this.itemValueLabel(item),value=_this$itemValueLabel2.value,label=_this$itemValueLabel2.label;return/*#__PURE__*/React.createElement("option",{key:_this.props.fieldId+index,value:String(value)},label)}))});_defineProperty(_this,"itemValueLabel",function(item){var value="";var label="";if(typeof item==="string"){value=label=item}else{value=item.value;label=item.label}return{value:value,label:label}});return _this}_inherits(EditComboField,_React$Component);return _createClass(EditComboField,[{key:"componentDidMount",value:function componentDidMount(){var _this2=this;if(this.props.values){// eslint-disable-next-line
9
9
  this.setState({values:this.props.values,showPlaceholder:!this.hasEmptyValue(this.props.values)})}else if(this.props.keyvalrel){var _this$props$filterExp;KeyValCache.get(this.props.editIface,this.props.keyvalrel,(_this$props$filterExp=this.props.filterExpr)!==null&&_this$props$filterExp!==void 0?_this$props$filterExp:null).then(function(values){// eslint-disable-next-line
10
10
  _this2.setState({values:values,showPlaceholder:!_this2.hasEmptyValue(values)})})}}},{key:"componentDidUpdate",value:function componentDidUpdate(prevProps){var _this3=this;if(this.props.keyvalrel&&this.props.filterExpr!==prevProps.filterExpr){var _this$props$filterExp2;KeyValCache.get(this.props.editIface,this.props.keyvalrel,(_this$props$filterExp2=this.props.filterExpr)!==null&&_this$props$filterExp2!==void 0?_this$props$filterExp2:null).then(function(values){// eslint-disable-next-line
11
11
  _this3.setState({values:values,showPlaceholder:!_this3.hasEmptyValue(values)})})}}},{key:"render",value:function render(){if(this.props.multiSelect){return this.renderMultiSelect()}else{return this.renderComboSelect()}}}])}(React.Component);_defineProperty(EditComboField,"propTypes",{editIface:PropTypes.object,fieldId:PropTypes.string,filterExpr:PropTypes.array,keyvalrel:PropTypes.string,multiSelect:PropTypes.bool,name:PropTypes.string,placeholder:PropTypes.string,readOnly:PropTypes.bool,required:PropTypes.bool,style:PropTypes.object,updateField:PropTypes.func,value:PropTypes.oneOfType([PropTypes.string,PropTypes.number]),values:PropTypes.array});export{EditComboField as default};
@@ -0,0 +1,7 @@
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)}/**
2
+ * Copyright 2025 Sourcepole AG
3
+ * All rights reserved.
4
+ *
5
+ * This source code is licensed under the BSD-style license found in the
6
+ * LICENSE file in the root directory of this source tree.
7
+ */import React from"react";import PropTypes from"prop-types";import MiscUtils from"../utils/MiscUtils";import"./style/ExportSelection.css";var ExportSelection=/*#__PURE__*/function(_React$Component){function ExportSelection(){var _this;_classCallCheck(this,ExportSelection);for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++){args[_key]=arguments[_key]}_this=_callSuper(this,ExportSelection,[].concat(args));_defineProperty(_this,"state",{x:0,y:0,width:0,height:0,frameRatio:null});_defineProperty(_this,"startMoveSelection",function(ev){if(ev.ctrlKey){return}var startStateX=_this.state.x;var startStateY=_this.state.y;var onMouseMove=function onMouseMove(event){_this.setState({x:startStateX+event.clientX-ev.clientX,y:startStateY+event.clientY-ev.clientY})};ev.view.addEventListener("pointermove",onMouseMove);ev.view.addEventListener("pointerup",function(){ev.view.removeEventListener("pointermove",onMouseMove);_this.props.onFrameChanged(_this.state)},{once:true});MiscUtils.killEvent(ev)});_defineProperty(_this,"startResizeSelection",function(ev,sx,sy){if(ev.ctrlKey){return}var _this$state=_this.state,x=_this$state.x,y=_this$state.y,width=_this$state.width,height=_this$state.height,frameRatio=_this$state.frameRatio;var onMouseMove=function onMouseMove(event){var dx=event.clientX-ev.clientX;var dy=event.clientY-ev.clientY;var newwidth=width+dx*sx;var newheight=height+dy*sy;if(frameRatio){if(sx!==0){newheight=Math.round(newwidth*frameRatio)}else{newwidth=Math.round(newheight/frameRatio)}}var newx=sx<0?x+(width-newwidth):x;var newy=sy<0?y+(height-newheight):y;if(sx===0){newx+=0.5*(width-newwidth)}if(sy===0){newy+=0.5*(height-newheight)}_this.setState({x:newx,y:newy,width:newwidth,height:newheight})};ev.view.addEventListener("pointermove",onMouseMove);ev.view.addEventListener("pointerup",function(){ev.view.removeEventListener("pointermove",onMouseMove);_this.props.onFrameChanged(_this.state)},{once:true});MiscUtils.killEvent(ev)});return _this}_inherits(ExportSelection,_React$Component);return _createClass(ExportSelection,[{key:"componentDidUpdate",value:function componentDidUpdate(prevProps){var _this2=this;if(this.props.frame!==prevProps.frame){this.setState(_objectSpread({},this.props.frame))}if(this.props.frameRatio!==prevProps.frameRatio){this.setState(function(state){var newheight=_this2.props.frameRatio?Math.round(state.width*_this2.props.frameRatio):state.height;return{frameRatio:_this2.props.frameRatio,y:state.y+0.5*(state.height-newheight),height:newheight}},function(){_this2.props.onFrameChanged(_this2.state)})}}},{key:"render",value:function render(){var _this3=this;var boxStyle={left:this.state.x+"px",top:this.state.y+"px",width:this.state.width+"px",height:this.state.height+"px"};return/*#__PURE__*/React.createElement("div",{className:"export-selection-container"},/*#__PURE__*/React.createElement("div",{className:"export-selection",onContextMenu:MiscUtils.killEvent,onPointerDown:this.startMoveSelection,style:boxStyle},/*#__PURE__*/React.createElement("span",{className:"export-selection-label"},this.state.width+" x "+this.state.height),/*#__PURE__*/React.createElement("div",{className:"export-selection-resize-top",onPointerDown:function onPointerDown(ev){return _this3.startResizeSelection(ev,0,-1)}}),/*#__PURE__*/React.createElement("div",{className:"export-selection-resize-bottom",onPointerDown:function onPointerDown(ev){return _this3.startResizeSelection(ev,0,1)}}),/*#__PURE__*/React.createElement("div",{className:"export-selection-resize-left",onPointerDown:function onPointerDown(ev){return _this3.startResizeSelection(ev,-1,0)}}),/*#__PURE__*/React.createElement("div",{className:"export-selection-resize-right",onPointerDown:function onPointerDown(ev){return _this3.startResizeSelection(ev,1,0)}}),/*#__PURE__*/React.createElement("div",{className:"export-selection-resize-topleft",onPointerDown:function onPointerDown(ev){return _this3.startResizeSelection(ev,-1,-1)}}),/*#__PURE__*/React.createElement("div",{className:"export-selection-resize-topright",onPointerDown:function onPointerDown(ev){return _this3.startResizeSelection(ev,1,-1)}}),/*#__PURE__*/React.createElement("div",{className:"export-selection-resize-bottomleft",onPointerDown:function onPointerDown(ev){return _this3.startResizeSelection(ev,-1,1)}}),/*#__PURE__*/React.createElement("div",{className:"export-selection-resize-bottomright",onPointerDown:function onPointerDown(ev){return _this3.startResizeSelection(ev,1,1)}})))}}])}(React.Component);_defineProperty(ExportSelection,"propTypes",{frame:PropTypes.shape({x:PropTypes.number,y:PropTypes.number,width:PropTypes.number,height:PropTypes.number}),frameRatio:PropTypes.number,mapElement:PropTypes.object,onFrameChanged:PropTypes.func});export{ExportSelection as default};
@@ -21,7 +21,8 @@ preprocessor: function(formData, feature, callback)
21
21
  var count=parts.length;var _fieldId=parts.slice(1,count-3).join("__");value=(_fieldId2=(feature.properties||[])[_fieldId])!==null&&_fieldId2!==void 0?_fieldId2:"";var keyvalrel=_this.props.mapPrefix+parts[count-3]+":"+parts[count-2]+":"+parts[count-1];var filterExpr=null;if(field!==null&&field!==void 0&&field.filterExpression){filterExpr=parseExpression(field.filterExpression,feature,editConfig,_this.props.iface,_this.props.mapPrefix,_this.props.mapCrs,function(){return _this.setState({reevaluate:+new Date})},true)}return/*#__PURE__*/React.createElement(EditComboField,{editIface:_this.props.iface,fieldId:_fieldId,filterExpr:filterExpr,key:_fieldId,keyvalrel:keyvalrel,multiSelect:widget.allowMulti==="true",name:nametransform(_fieldId),placeholder:inputConstraints.placeholder,readOnly:inputConstraints.readOnly||fieldConstraints.readOnly,required:inputConstraints.required||fieldConstraints.required,style:fontStyle,updateField:updateField,value:value})}else{var values=MiscUtils.ensureArray(widget.item||[]).map(function(item){var _item$property$value;return{label:item.property.text,value:(_item$property$value=item.property.value)!==null&&_item$property$value!==void 0?_item$property$value:item.property.text}});return/*#__PURE__*/React.createElement(EditComboField,{editIface:_this.props.iface,fieldId:widget.name,key:widget.name,name:elname,placeholder:inputConstraints.placeholder,readOnly:inputConstraints.readOnly||inputConstraints.readOnly,required:inputConstraints.required||inputConstraints.required,style:fontStyle,updateField:updateField,value:value,values:values})}}else if(widget["class"]==="QSpinBox"||widget["class"]==="QDoubleSpinBox"||widget["class"]==="QSlider"){var _prop$minimum,_prop$maximum,_ref,_prop$singleStep,_prop$decimals;var floatConstraint=function floatConstraint(x){var f=parseFloat(x);return isNaN(f)?undefined:f};var min=floatConstraint((_prop$minimum=prop.minimum)!==null&&_prop$minimum!==void 0?_prop$minimum:fieldConstraints.min);var max=floatConstraint((_prop$maximum=prop.maximum)!==null&&_prop$maximum!==void 0?_prop$maximum:fieldConstraints.max);var step=(_ref=(_prop$singleStep=prop.singleStep)!==null&&_prop$singleStep!==void 0?_prop$singleStep:fieldConstraints.step)!==null&&_ref!==void 0?_ref:1;var precision=(_prop$decimals=prop.decimals)!==null&&_prop$decimals!==void 0?_prop$decimals:0;if(widget["class"]==="QSlider"){return/*#__PURE__*/React.createElement("input",_extends({max:max,min:min,name:elname,onChange:function onChange(ev){return updateField(widget.name,ev.target.value)}},inputConstraints,{size:5,step:step,style:fontStyle,type:"range",value:value}))}else{return/*#__PURE__*/React.createElement(NumberInput,_extends({decimals:precision,max:max,min:min,name:elname,onChange:function onChange(val){return updateField(widget.name,val)}},inputConstraints,{step:step,style:fontStyle,value:value}))}}else if(widget["class"]==="QDateEdit"){var _min=prop.minimumDate?_this.dateConstraint(prop.minimumDate):"1600-01-01";var _max=prop.maximumDate?_this.dateConstraint(prop.maximumDate):"9999-12-31";return/*#__PURE__*/React.createElement("input",_extends({max:_max,min:_min,name:elname,onChange:function onChange(ev){return updateField(widget.name,ev.target.value)}},inputConstraints,{style:fontStyle,type:"date",value:value}))}else if(widget["class"]==="QTimeEdit"){return/*#__PURE__*/React.createElement("input",_extends({name:elname,onChange:function onChange(ev){return updateField(widget.name,ev.target.value)}},inputConstraints,{style:fontStyle,type:"time",value:value}))}else if(widget["class"]==="QDateTimeEdit"){var _min2=prop.minimumDate?_this.dateConstraint(prop.minimumDate):"1600-01-01";var _max2=prop.maximumDate?_this.dateConstraint(prop.maximumDate):"9999-12-31";return/*#__PURE__*/React.createElement(DateTimeInput,{maxDate:_max2,minDate:_min2,name:elname,onChange:function onChange(val){return updateField(widget.name,val)},readOnly:inputConstraints.readOnly,required:inputConstraints.required,style:fontStyle,value:value})}else if(widget["class"]==="QWidget"){if(widget.name.startsWith("nrel__")){return _this.renderNRelation(widget)}else if(widget.name.startsWith("ext__")){return value}else{return _this.renderLayout(widget.layout,feature,editConfig,updateField,nametransform)}}else if(widget["class"]==="QPushButton"){if(widget.name.startsWith("btn__")&&widget.onClick){return/*#__PURE__*/React.createElement("button",{className:"button",disabled:inputConstraints.readOnly,onClick:function onClick(){return widget.onClick(_this.props.setFormBusy)},type:"button"},widget.property.text)}else if(widget.name.startsWith("featurelink__")){var _parts=widget.name.split("__");// featurelink__layer__attrname
22
22
  // featurelink__layer__reltable__attrname
23
23
  if(_parts.length===3||_parts.length===4){var _feature$properties4;var layer=_parts[1];var reltable=_parts.length===4?_parts[2]:"";var attrname=_parts.slice(2).join("__");value=(_feature$properties4=feature.properties)===null||_feature$properties4===void 0?void 0:_feature$properties4[attrname];if(layer===reltable){var index=parseInt(nametransform("").split("__")[1],10);// Ugh..
24
- var reldataset=_this.props.mapPrefix+reltable;var displayField=attrname.split("__")[1];if(feature.__status__!=="empty"){var featurebuttons=[{key:"Edit",icon:"editing",label:String(value!==null&&value!==void 0?value:"")}];return/*#__PURE__*/React.createElement("div",{className:"qt-designer-form-featurelink-buttons"},/*#__PURE__*/React.createElement(ButtonBar,{buttons:featurebuttons,forceLabel:true,onClick:function onClick(){return _this.props.editRelationRecord("Edit",reltable,reldataset,index,displayField)}}))}else{var _featurebuttons=[];if(feature.geometry!==null){_featurebuttons.push({key:"Pick",icon:"pick",label:LocaleUtils.tr("editing.pick")})}_featurebuttons.push({key:"Create",icon:"editdraw",label:LocaleUtils.tr("editing.create")});return/*#__PURE__*/React.createElement(ButtonBar,{buttons:_featurebuttons,forceLabel:true,onClick:function onClick(action){return _this.props.editRelationRecord(action,reltable,reldataset,index,displayField)}})}}else{if(value!==null){var _featurebuttons2=[{key:"Edit",icon:"editing",label:String(value!==null&&value!==void 0?value:"")}];return/*#__PURE__*/React.createElement("div",{className:"qt-designer-form-featurelink-buttons"},/*#__PURE__*/React.createElement(ButtonBar,{buttons:_featurebuttons2,onClick:function onClick(){return _this.props.switchEditContext("Edit",layer,value,function(v){return updateField(attrname,v)},attrname)}}),/*#__PURE__*/React.createElement("button",{className:"button",onClick:function onClick(){return updateField(attrname,null)},type:"button"},/*#__PURE__*/React.createElement(Icon,{icon:"clear"})))}else{var _featurebuttons3=[{key:"Pick",icon:"pick",label:LocaleUtils.tr("editing.pick")},{key:"Create",icon:"editdraw",label:LocaleUtils.tr("editing.create")}];return/*#__PURE__*/React.createElement(ButtonBar,{buttons:_featurebuttons3,onClick:function onClick(action){return _this.props.switchEditContext(action,layer,null,function(v){return updateField(attrname,v)},attrname)}})}}}}}else if(widget["class"]==="QStackedWidget"){return _this.renderLayout(widget.widget[parseInt(widget.property.currentIndex,10)].layout,feature,editConfig,updateField,nametransform)}return null});_defineProperty(_this,"renderNRelation",function(widget){var _widget$property2,_editConfig$fields,_this$props$feature$r;var parts=widget.name.split("__");if(parts.length<3){return null}var disabled=String((_widget$property2=widget.property)===null||_widget$property2===void 0?void 0:_widget$property2.enabled)==="false";var tablename=parts[1];var sortcol=parts[3]||null;var noreorder=parts[4]||false;var headerItems=widget.layout.item.filter(function(item){return item.widget&&item.widget.name.startsWith("header__")}).sort(function(a,b){return a.column-b.column});var widgetItems=widget.layout.item.filter(function(item){return!item.widget||!item.widget.name.startsWith("header__")}).sort(function(a,b){return a.column-b.column});var tableFitWidgets=["QLabel","QCheckBox","QRadioButton","QDateTimeEdit","QDateEdit","QTimeEdit"];var columnStyles=widgetItems.map(function(item){return item.widget&&tableFitWidgets.includes(item.widget["class"])?{width:"1px"}:{}});var editConfig=_this.props.editConfigs[tablename]||{};var relDataset=editConfig.editDataset;var fields=((_editConfig$fields=editConfig.fields)!==null&&_editConfig$fields!==void 0?_editConfig$fields:[]).reduce(function(res,field){return _objectSpread(_objectSpread({},res),{},_defineProperty({},field.id,field))},{});return/*#__PURE__*/React.createElement("div",{className:"qt-designer-widget-relation"},/*#__PURE__*/React.createElement("div",{className:"qt-designer-widget-relation-table-container"},!_this.props.feature.relationValues?/*#__PURE__*/React.createElement("div",{className:"qt-designer-widget-relation-table-loading"},/*#__PURE__*/React.createElement(Spinner,null)):null,/*#__PURE__*/React.createElement("table",null,/*#__PURE__*/React.createElement("tbody",null,!isEmpty(headerItems)?/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("th",null),headerItems.map(function(item){return/*#__PURE__*/React.createElement("th",{key:item.widget.name},item.widget.property.text)}),/*#__PURE__*/React.createElement("th",null)):null,(((_this$props$feature$r=_this.props.feature.relationValues)===null||_this$props$feature$r===void 0||(_this$props$feature$r=_this$props$feature$r[relDataset])===null||_this$props$feature$r===void 0?void 0:_this$props$feature$r.features)||[]).map(function(feature,idx){var updateField=function updateField(name,value){var fieldname=name.slice(tablename.length+2);// Strip <tablename>__ prefix
24
+ var reldataset=_this.props.mapPrefix+reltable;var displayField=attrname.split("__")[1];if(feature.__status__!=="empty"){var featurebuttons=[{key:"Edit",icon:"editing",label:String(value!==null&&value!==void 0?value:"")}];return/*#__PURE__*/React.createElement("div",{className:"qt-designer-form-featurelink-buttons"},/*#__PURE__*/React.createElement(ButtonBar,{buttons:featurebuttons,forceLabel:true,onClick:function onClick(){return _this.props.editRelationRecord("Edit",reltable,reldataset,index,displayField)}}))}else{var _featurebuttons=[];if(feature.geometry!==null){_featurebuttons.push({key:"Pick",icon:"pick",label:LocaleUtils.tr("editing.pick")})}_featurebuttons.push({key:"Create",icon:"editdraw",label:LocaleUtils.tr("editing.create")});return/*#__PURE__*/React.createElement(ButtonBar,{buttons:_featurebuttons,forceLabel:true,onClick:function onClick(action){return _this.props.editRelationRecord(action,reltable,reldataset,index,displayField)}})}}else{if(value!==null){var _featurebuttons2=[{key:"Edit",icon:"editing",label:String(value!==null&&value!==void 0?value:"")}];return/*#__PURE__*/React.createElement("div",{className:"qt-designer-form-featurelink-buttons"},/*#__PURE__*/React.createElement(ButtonBar,{buttons:_featurebuttons2,onClick:function onClick(){return _this.props.switchEditContext("Edit",layer,value,function(v){return updateField(attrname,v)},attrname)}}),/*#__PURE__*/React.createElement("button",{className:"button",onClick:function onClick(){return updateField(attrname,null)},type:"button"},/*#__PURE__*/React.createElement(Icon,{icon:"clear"})))}else{var _featurebuttons3=[{key:"Pick",icon:"pick",label:LocaleUtils.tr("editing.pick")},{key:"Create",icon:"editdraw",label:LocaleUtils.tr("editing.create")}];return/*#__PURE__*/React.createElement(ButtonBar,{buttons:_featurebuttons3,onClick:function onClick(action){return _this.props.switchEditContext(action,layer,null,function(v){return updateField(attrname,v)},attrname)}})}}}}}else if(widget["class"]==="QStackedWidget"){return _this.renderLayout(widget.widget[parseInt(widget.property.currentIndex,10)].layout,feature,editConfig,updateField,nametransform)}return null});_defineProperty(_this,"renderNRelation",function(widget){var _widget$property2,_editConfig$fields,_this$props$feature$r;var parts=widget.name.split("__");if(parts.length<3){return null}var disabled=String((_widget$property2=widget.property)===null||_widget$property2===void 0?void 0:_widget$property2.enabled)==="false";var tablename=parts[1];var sortcol=parts[3]||null;var noreorder=parts[4]||false;var headerItems=widget.layout.item.filter(function(item){return item.widget&&item.widget.name.startsWith("header__")}).sort(function(a,b){return a.column-b.column});var widgetItems=widget.layout.item.filter(function(item){return!item.widget||!item.widget.name.startsWith("header__")}).sort(function(a,b){return a.column-b.column});var tableFitWidgets=["QLabel","QCheckBox","QRadioButton","QDateTimeEdit","QDateEdit","QTimeEdit"];var columnStyles=widgetItems.map(function(item){return item.widget&&tableFitWidgets.includes(item.widget["class"])?{width:"1px"}:{}});var editConfig=_this.props.editConfigs[tablename];if(!editConfig){// Relation dataset not permitted / no edit config available
25
+ return null}var relDataset=editConfig.editDataset;var fields=((_editConfig$fields=editConfig.fields)!==null&&_editConfig$fields!==void 0?_editConfig$fields:[]).reduce(function(res,field){return _objectSpread(_objectSpread({},res),{},_defineProperty({},field.id,field))},{});return/*#__PURE__*/React.createElement("div",{className:"qt-designer-widget-relation"},/*#__PURE__*/React.createElement("div",{className:"qt-designer-widget-relation-table-container"},!_this.props.feature.relationValues?/*#__PURE__*/React.createElement("div",{className:"qt-designer-widget-relation-table-loading"},/*#__PURE__*/React.createElement(Spinner,null)):null,/*#__PURE__*/React.createElement("table",null,/*#__PURE__*/React.createElement("tbody",null,!isEmpty(headerItems)?/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("th",null),headerItems.map(function(item){return/*#__PURE__*/React.createElement("th",{key:item.widget.name},item.widget.property.text)}),/*#__PURE__*/React.createElement("th",null)):null,(((_this$props$feature$r=_this.props.feature.relationValues)===null||_this$props$feature$r===void 0||(_this$props$feature$r=_this$props$feature$r[relDataset])===null||_this$props$feature$r===void 0?void 0:_this$props$feature$r.features)||[]).map(function(feature,idx){var updateField=function updateField(name,value){var fieldname=name.slice(tablename.length+2);// Strip <tablename>__ prefix
25
26
  _this.props.updateRelationField(relDataset,idx,fieldname,value)};var nametransform=function nametransform(name){return name+"__"+idx};var status=feature.__status__||"";var relFeature=_objectSpread(_objectSpread({},feature),{},{properties:Object.entries(feature.properties).reduce(function(res,_ref2){var _ref3=_slicedToArray(_ref2,2),key=_ref3[0],value=_ref3[1];return _objectSpread(_objectSpread({},res),{},_defineProperty({},tablename+"__"+key,value))},{})});var statusIcon=null;if(status==="empty"){// Pass
26
27
  }else if(status==="new"){statusIcon="new"}else if(status){statusIcon="edited"}var statusText="";if(feature.error){statusIcon="warning";statusText=_this.buildErrMsg(feature)}var extraClass=status.startsWith("deleted")?"qt-designer-widget-relation-record-deleted":"";return/*#__PURE__*/React.createElement("tr",{className:"qt-designer-widget-relation-record "+extraClass,key:relDataset+idx},/*#__PURE__*/React.createElement("td",{className:"qt-designer-widget-relation-record-icon"},statusIcon?/*#__PURE__*/React.createElement(Icon,{icon:statusIcon,title:statusText}):null),widgetItems.map(function(item,widx){if(item.widget){return/*#__PURE__*/React.createElement("td",{className:"qt-designer-widget-relation-row-widget",key:item.widget.name,style:columnStyles[widx]},_this.renderWidget(item.widget,relFeature,editConfig,fields,updateField,nametransform,true,disabled))}else if(item.spacer){return/*#__PURE__*/React.createElement("td",{key:"spacer_"+widx})}else{return null}}),!_this.props.readOnly&&!disabled&&sortcol&&!noreorder?/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement(Icon,{icon:"chevron-up",onClick:function onClick(){return _this.props.reorderRelationRecord(relDataset,idx,-1)}}),/*#__PURE__*/React.createElement("br",null),/*#__PURE__*/React.createElement(Icon,{icon:"chevron-down",onClick:function onClick(){return _this.props.reorderRelationRecord(relDataset,idx,1)}})):null,!_this.props.readOnly&&!disabled?/*#__PURE__*/React.createElement("td",{className:"qt-designer-widget-relation-record-icon"},/*#__PURE__*/React.createElement(Icon,{icon:"trash",onClick:function onClick(){return _this.props.removeRelationRecord(relDataset,idx)}})):null)})))),!_this.props.readOnly?/*#__PURE__*/React.createElement("div",{className:"qt-designer-widget-relation-buttons"},/*#__PURE__*/React.createElement("button",{className:"button qt-designer-widget-relation-add",disabled:!_this.props.feature.relationValues,onClick:function onClick(ev){return _this.addRelationRecord(ev,relDataset)},type:"button"},LocaleUtils.tr("editing.add"))):null,/*#__PURE__*/React.createElement("div",{className:"qt-designer-widget-relation-resize-handle",onPointerDown:_this.startRelationTableResize}))});_defineProperty(_this,"addRelationRecord",function(ev,datasetname){_this.setState({relationAddPressed:ev.target});_this.props.addRelationRecord(datasetname)});_defineProperty(_this,"startRelationTableResize",function(ev){var container=ev.target.parentElement.parentElement;if(!container){return}var startHeight=container.offsetHeight;var startMouseY=ev.clientY;var resizeInput=function resizeInput(event){container.style.height=Math.max(30,startHeight+(event.clientY-startMouseY))+"px"};ev.view.document.body.style.userSelect="none";ev.view.addEventListener("pointermove",resizeInput);ev.view.addEventListener("pointerup",function(){ev.view.document.body.style.userSelect="";ev.view.removeEventListener("pointermove",resizeInput)},{once:true})});_defineProperty(_this,"groupOrName",function(widget){return widget.attribute&&widget.attribute.buttonGroup?widget.attribute.buttonGroup._:widget.name});_defineProperty(_this,"dateConstraint",function(constr){return constr.year+"-"+("0"+constr.month).slice(-2)+"-"+("0"+constr.day).slice(-2)});_defineProperty(_this,"parseForm",function(data){var loadingReqId=uuidv1();_this.setState({loading:true,loadingReqId:loadingReqId});var parserOpts={isArray:function isArray(){return false},ignoreAttributes:false,attributeNamePrefix:""};var json=new XMLParser(parserOpts).parse(data);var relationTables={};var externalFields={};var widgets={};var fields={};var buttons={};var nrels={};var counters={widget:0,layout:0};_this.reformatWidget(json.ui.widget,relationTables,fields,buttons,nrels,externalFields,widgets,counters);// console.log(json);
27
28
  json.externalFields=externalFields;json.widgets=widgets;json.fields=fields;json.buttons=buttons;json.nrels=nrels;if(FormPreprocessors[_this.props.editConfig.editDataset]){FormPreprocessors[_this.props.editConfig.editDataset](json,_this.props.feature,function(formData){if(_this.state.loadingReqId===loadingReqId){_this.setState({formData:formData,loading:false,loadingReqId:null})}})}else{_this.setState({formData:json,loading:false,loadingReqId:null})}_this.props.setRelationTables(relationTables)});_defineProperty(_this,"reformatWidget",function(widget,relationTables,fields,buttons,nrels,externalFields,widgets,counters){if(widget.property){widget.property=MiscUtils.ensureArray(widget.property).reduce(function(res,prop){return _objectSpread(_objectSpread({},res),{},_defineProperty({},prop.name,prop[Object.keys(prop).find(function(key){return key!=="name"})]))},{})}else{widget.property={}}if(widget.attribute){widget.attribute=MiscUtils.ensureArray(widget.attribute).reduce(function(res,prop){return _objectSpread(_objectSpread({},res),{},_defineProperty({},prop.name,prop[Object.keys(prop).find(function(key){return key!=="name"})]))},{})}else{widget.attribute={}}var verticalFill=false;if(widget.item){MiscUtils.ensureArray(widget.item).forEach(function(item){verticalFill|=_this.reformatWidget(item,relationTables,fields,buttons,nrels,externalFields,widgets,counters)})}widget.name=widget.name||":widget_"+counters.widget++;var fieldNames=_this.props.editConfig.fields.map(function(field){return field.id});if(fieldNames.includes(widget.name)){fields[widget.name]=widget}else if(widget.name.startsWith("kvrel__")||widget.name.startsWith("img__")){var _parts2=widget.name.split("__");if(fieldNames.includes(_parts2[1])){fields[_parts2[1]]=widget}}else if(widget.name.startsWith("btn__")){buttons[widget.name.split("__")[1]]=widget}else if(widget.name.startsWith("nrel__")){nrels[widget.name.split("__")[1]]=widget}if(widget.name.startsWith("ext__")){externalFields[widget.name.slice(5)]=""}widgets[widget.name]=widget;if(widget.layout){verticalFill|=_this.reformatLayout(widget.layout,relationTables,fields,buttons,nrels,externalFields,widgets,counters)}if(widget.widget){widget.widget=Array.isArray(widget.widget)?widget.widget:[widget.widget];widget.widget.forEach(function(child){child.name=":widget_"+counters.widget++;verticalFill|=_this.reformatWidget(child,relationTables,fields,buttons,nrels,externalFields,widgets,counters)})}if(widget.name.startsWith("nrel__")||!widget.layout&&!vFitWidgets.includes(widget["class"])){verticalFill=true}var parts=widget.name.split("__");if(parts.length>=3&&parts[0]==="nrel"){relationTables[_this.props.mapPrefix+parts[1]]={fk:parts[2],sortcol:parts[3]||null,noreorder:parts[4]||false}}return verticalFill});_defineProperty(_this,"reformatLayout",function(layout,relationTables,fields,buttons,nrels,externalFields,widgets,counters){layout.item=MiscUtils.ensureArray(layout.item);layout.name=layout.name||":layout_"+counters.layout++;var verticalFill=false;layout.item.forEach(function(item){if(!item){return}else if(item.widget){verticalFill|=_this.reformatWidget(item.widget,relationTables,fields,buttons,nrels,externalFields,widgets,counters)}else if(item.spacer){item.spacer.property=MiscUtils.ensureArray(item.spacer.property).reduce(function(res,prop){return _objectSpread(_objectSpread({},res),{},_defineProperty({},prop.name,prop[Object.keys(prop).find(function(key){return key!=="name"})]))},{});if(item.spacer.property.orientation==="Qt::Vertical"){verticalFill=true}}else if(item.layout){verticalFill|=_this.reformatLayout(item.layout,relationTables,fields,buttons,nrels,externalFields,widgets,counters)}});layout.verticalFill=verticalFill;return verticalFill});_defineProperty(_this,"buildErrMsg",function(record){var message=record.error;var errorDetails=record.error_details||{};if(!isEmpty(errorDetails.geometry_errors)){message+=":\n";message+=errorDetails.geometry_errors.map(function(entry){return" - "+entry.reason+" at "+entry.location})}if(!isEmpty(errorDetails.data_errors)){message+=":\n - "+errorDetails.data_errors.join("\n - ")}if(!isEmpty(errorDetails.validation_errors)){message+=":\n - "+errorDetails.validation_errors.join("\n - ")}return message});_this.state=QtDesignerForm.defaultState;return _this}_inherits(QtDesignerForm,_React$Component);return _createClass(QtDesignerForm,[{key:"componentDidMount",value:function componentDidMount(){this.componentDidUpdate({})}},{key:"componentDidUpdate",value:function componentDidUpdate(prevProps){var _prevProps$editConfig,_prevProps$feature,_this2=this;// Query form
@@ -9,8 +9,8 @@ function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof
9
9
  // Warn if permalink key is invalid
10
10
  if(permalinkInvalid){_this.props.showNotification("missingtheme",LocaleUtils.tr("app.missingpermalink"),NotificationType.WARN,true)}// Load themes.json
11
11
  axios.get("themes.json").then(function(response){var _this$props$appConfig,_this$props$appConfig2,_theme;var themes=response.data.themes||{};(_this$props$appConfig=(_this$props$appConfig2=_this.props.appConfig).themePreprocessor)===null||_this$props$appConfig===void 0||_this$props$appConfig.call(_this$props$appConfig2,themes);_this.props.themesLoaded(themes);var theme=ThemeUtils.getThemeById(themes,params.t);if((!theme||theme.restricted)&&!ConfigUtils.getConfigProp("dontLoadDefaultTheme")){if(params.t){_this.props.showNotification("missingtheme",LocaleUtils.tr("app.missingtheme",params.t),NotificationType.WARN,true);params.l=undefined}var defaultTheme=Object.fromEntries(_this.props.defaultUrlParams.split("&").map(function(x){return x.split("=")})).t||themes.defaultTheme;theme=ThemeUtils.getThemeById(themes,defaultTheme);params.t=defaultTheme}if(theme){var _params$bl;// Compute initial view
12
- var initialView=null;if(params.c&&params.s!==undefined){var coords=params.c.split(/[;,]/g).map(function(x){return parseFloat(x)||0});var scales=theme.scales||themes.defaultScales;var zoom=MapUtils.computeZoom(scales,params.s);if(coords.length===2){var p=CoordinatesUtils.reproject(coords,params.crs||theme.mapCrs,theme.bbox.crs);var bounds=theme.bbox.bounds;// Only accept c if it is within the theme bounds
13
- if(bounds[0]<=p[0]&&p[0]<=bounds[2]&&bounds[1]<=p[1]&&p[1]<=bounds[3]){initialView={center:coords,zoom:zoom,crs:params.crs||theme.mapCrs}}else{initialView={center:[0.5*(bounds[0]+bounds[2]),0.5*(bounds[1]+bounds[3])],zoom:zoom,crs:theme.bbox.crs}}}}else if(params.e){var _bounds=params.e.split(/[;,]/g).map(function(x){return parseFloat(x)||0});if(CoordinatesUtils.isValidExtent(_bounds)){initialView={bounds:_bounds,crs:params.crs||theme.mapCrs}}}var layerParams=params.l!==undefined?params.l.split(",").filter(function(entry){return entry}):null;if(layerParams&&ConfigUtils.getConfigProp("urlReverseLayerOrder")){layerParams.reverse()}_this.props.setCurrentTheme(theme,themes,false,initialView,layerParams,(_params$bl=params.bl)!==null&&_params$bl!==void 0?_params$bl:null,state.layers,_this.props.appConfig.themeLayerRestorer,_this.props.appConfig.externalLayerRestorer)}var task=ConfigUtils.getConfigProp("startupTask");if(task&&!((_theme=theme)!==null&&_theme!==void 0&&(_theme=_theme.config)!==null&&_theme!==void 0&&_theme.startupTask)){var mapClickAction=ConfigUtils.getPluginConfig(task.key).mapClickAction;_this.props.setCurrentTask(task.key,task.mode,mapClickAction)}})});_this.themesLoaded=false;// Set initial bottom/topbar height to zero in case not topbar/bottombar is enabled
12
+ var initialView=params.v;var initialExtent=null;if(params.c&&params.s!==undefined){var coords=params.c.split(/[;,]/g).map(function(x){return parseFloat(x)||0});var scales=theme.scales||themes.defaultScales;var zoom=MapUtils.computeZoom(scales,params.s);if(coords.length===2){var p=CoordinatesUtils.reproject(coords,params.crs||theme.mapCrs,theme.bbox.crs);var bounds=theme.bbox.bounds;// Only accept c if it is within the theme bounds
13
+ if(bounds[0]<=p[0]&&p[0]<=bounds[2]&&bounds[1]<=p[1]&&p[1]<=bounds[3]){initialExtent={center:coords,zoom:zoom,crs:params.crs||theme.mapCrs}}else{initialExtent={center:[0.5*(bounds[0]+bounds[2]),0.5*(bounds[1]+bounds[3])],zoom:zoom,crs:theme.bbox.crs}}}}else if(params.e){var _bounds=params.e.split(/[;,]/g).map(function(x){return parseFloat(x)||0});if(CoordinatesUtils.isValidExtent(_bounds)){initialExtent={bounds:_bounds,crs:params.crs||theme.mapCrs}}}var layerParams=params.l!==undefined?params.l.split(",").filter(function(entry){return entry}):null;if(layerParams&&ConfigUtils.getConfigProp("urlReverseLayerOrder")){layerParams.reverse()}_this.props.setCurrentTheme(theme,themes,false,initialExtent,layerParams,(_params$bl=params.bl)!==null&&_params$bl!==void 0?_params$bl:null,state.layers,_this.props.appConfig.themeLayerRestorer,_this.props.appConfig.externalLayerRestorer,initialView)}var task=ConfigUtils.getConfigProp("startupTask");if(task&&!((_theme=theme)!==null&&_theme!==void 0&&(_theme=_theme.config)!==null&&_theme!==void 0&&_theme.startupTask)){var mapClickAction=ConfigUtils.getPluginConfig(task.key).mapClickAction;_this.props.setCurrentTask(task.key,task.mode,mapClickAction)}})});_this.themesLoaded=false;// Set initial bottom/topbar height to zero in case not topbar/bottombar is enabled
14
14
  // The components will set the proper height if and when initialized
15
15
  props.setTopbarHeight(0);props.setBottombarHeight(0);return _this}_inherits(AppContainerComponent,_React$Component);return _createClass(AppContainerComponent,[{key:"componentDidMount",value:function componentDidMount(){var _this2=this;window.addEventListener("QWC2ApiReady",function(){var _window$qwc;// Warn about non-existing plugins
16
16
  var plugins=_objectSpread(_objectSpread({},_this2.props.appConfig.pluginsDef.plugins),(_window$qwc=window.qwc2)===null||_window$qwc===void 0?void 0:_window$qwc.__customPlugins);var mode=ConfigUtils.isMobile()?"mobile":"desktop";_this2.props.localConfig.plugins[mode].filter(function(entry){return!plugins[entry.name+"Plugin"]}).forEach(function(entry){// eslint-disable-next-line
@@ -4,8 +4,8 @@ function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof
4
4
  *
5
5
  * This source code is licensed under the BSD-style license found in the
6
6
  * LICENSE file in the root directory of this source tree.
7
- */import React from"react";import ReactDOM from"react-dom";import{connect}from"react-redux";import Instance from"@giro3d/giro3d/core/Instance.js";import Coordinates from"@giro3d/giro3d/core/geographic/Coordinates";import Extent from"@giro3d/giro3d/core/geographic/Extent.js";import ElevationLayer from"@giro3d/giro3d/core/layer/ElevationLayer.js";import FeatureCollection from"@giro3d/giro3d/entities/FeatureCollection.js";import Map from"@giro3d/giro3d/entities/Map.js";import Tiles3D from"@giro3d/giro3d/entities/Tiles3D.js";import Inspector from"@giro3d/giro3d/gui/Inspector.js";import GeoTIFFSource from"@giro3d/giro3d/sources/GeoTIFFSource.js";import axios from"axios";import{fromUrl}from"geotiff";import isEmpty from"lodash.isempty";import PropTypes from"prop-types";import{Vector2,CubeTextureLoader,Group,Raycaster,Mesh,Box3,Vector3,Matrix4}from"three";import{GLTFExporter}from"three/addons/exporters/GLTFExporter.js";import{GLTFLoader}from"three/addons/loaders/GLTFLoader";import{v4 as uuidv4}from"uuid";import{LayerRole}from"../../actions/layers";import{setCurrentTask}from"../../actions/task";import{BackgroundSwitcher}from"../../plugins/BackgroundSwitcher";import ConfigUtils from"../../utils/ConfigUtils";import CoordinatesUtils from"../../utils/CoordinatesUtils";import LayerUtils from"../../utils/LayerUtils";import MiscUtils from"../../utils/MiscUtils";import{registerPermalinkDataStoreHook,unregisterPermalinkDataStoreHook,UrlParams}from"../../utils/PermaLinkUtils";import{MapContainerPortalContext}from"../PluginsContainer";import BottomBar3D from"./BottomBar3D";import Compare3D from"./Compare3D";import Draw3D from"./Draw3D";import EditDataset3D from"./EditDataset3D";import ExportObjects3D from"./ExportObjects3D";import HideObjects3D from"./HideObjects3D";import Identify3D from"./Identify3D";import LayerTree3D from"./LayerTree3D";import Map3DLight from"./Map3DLight";import MapControls3D from"./MapControls3D";import MapExport3D from"./MapExport3D";import Measure3D from"./Measure3D";import OverviewMap3D from"./OverviewMap3D";import TopBar3D from"./TopBar3D";import View3DSwitcher from"./View3DSwitcher";import LayerRegistry from"./layers/index";import{importGltf,updateObjectLabel}from"./utils/MiscUtils3D";import Tiles3DStyle from"./utils/Tiles3DStyle";import"./style/Map3D.css";// Ensures unUnload is called *after* all other children have unmounted
8
- var UnloadWrapper=/*#__PURE__*/function(_React$Component){function UnloadWrapper(){var _this;_classCallCheck(this,UnloadWrapper);for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++){args[_key]=arguments[_key]}_this=_callSuper(this,UnloadWrapper,[].concat(args));_defineProperty(_this,"onUnload",function(el){if(!el){_this.props.onUnload(_this.props.sceneId)}});return _this}_inherits(UnloadWrapper,_React$Component);return _createClass(UnloadWrapper,[{key:"render",value:function render(){return/*#__PURE__*/React.createElement("div",null,this.props.children,/*#__PURE__*/React.createElement("span",{ref:this.onUnload}))}}])}(React.Component);_defineProperty(UnloadWrapper,"propTypes",{children:PropTypes.oneOfType([PropTypes.node,PropTypes.func]),onUnload:PropTypes.func,sceneId:PropTypes.string});var Map3D=/*#__PURE__*/function(_React$Component2){function Map3D(props){var _this2;_classCallCheck(this,Map3D);_this2=_callSuper(this,Map3D,[props]);_defineProperty(_this2,"state",{sceneContext:_objectSpread(_objectSpread({},Map3D.defaultSceneState),{},{addLayer:function addLayer(layer){},getLayer:function getLayer(layerId){},removeLayer:function removeLayer(layerId){},updateColorLayer:function updateColorLayer(layerId,options,path){},add3dTiles:function add3dTiles(url,options){},addSceneObject:function addSceneObject(objectId,object){var options=arguments.length>2&&arguments[2]!==undefined?arguments[2]:{}},getSceneObject:function getSceneObject(objectId){},removeSceneObject:function removeSceneObject(objectId){},updateSceneObject:function updateSceneObject(objectId,options){},zoomToObject:function zoomToObject(objectId){},getMap:function getMap(){},setViewToExtent:function setViewToExtent(bounds,angle){},getTerrainHeightFromDTM:function getTerrainHeightFromDTM(scenePos){},getTerrainHeightFromMap:function getTerrainHeightFromMap(scenePos){},getSceneIntersection:function getSceneIntersection(x,y,objects){}}),sceneId:null});_defineProperty(_this2,"applyBaseLayer",function(){var baseLayer=_this2.state.sceneContext.baseLayers.find(function(e){return e.visibility===true});_this2.removeLayer("__baselayer");if(!baseLayer){return}var layerCreator=LayerRegistry[baseLayer.type];if(layerCreator!==null&&layerCreator!==void 0&&layerCreator.create3d){var layer3d=layerCreator.create3d(baseLayer,_this2.state.sceneContext.mapCrs);_this2.addLayer("__baselayer",layer3d);_this2.map.insertLayerAfter(layer3d,null)}});_defineProperty(_this2,"setBaseLayer",function(layer,visibility){var _this2$state$sceneCon;var currentBaseLayer=((_this2$state$sceneCon=_this2.state.sceneContext.baseLayers.find(function(l){return l.visibility===true}))===null||_this2$state$sceneCon===void 0?void 0:_this2$state$sceneCon.name)||"";if(visibility&&(layer===null||layer===void 0?void 0:layer.name)===currentBaseLayer){// Nothing changed
7
+ */import React from"react";import ReactDOM from"react-dom";import{connect}from"react-redux";import Instance from"@giro3d/giro3d/core/Instance.js";import Coordinates from"@giro3d/giro3d/core/geographic/Coordinates";import Extent from"@giro3d/giro3d/core/geographic/Extent.js";import ElevationLayer from"@giro3d/giro3d/core/layer/ElevationLayer.js";import FeatureCollection from"@giro3d/giro3d/entities/FeatureCollection.js";import Map from"@giro3d/giro3d/entities/Map.js";import Tiles3D from"@giro3d/giro3d/entities/Tiles3D.js";import Inspector from"@giro3d/giro3d/gui/Inspector.js";import GeoTIFFSource from"@giro3d/giro3d/sources/GeoTIFFSource.js";import axios from"axios";import{fromUrl}from"geotiff";import isEmpty from"lodash.isempty";import PropTypes from"prop-types";import{Vector2,CubeTextureLoader,Group,Raycaster,Mesh,Box3,Vector3,Matrix4}from"three";import{GLTFExporter}from"three/addons/exporters/GLTFExporter.js";import{GLTFLoader}from"three/addons/loaders/GLTFLoader";import{v4 as uuidv4}from"uuid";import{LayerRole}from"../../actions/layers";import{setCurrentTask}from"../../actions/task";import{BackgroundSwitcher}from"../../plugins/BackgroundSwitcher";import ConfigUtils from"../../utils/ConfigUtils";import CoordinatesUtils from"../../utils/CoordinatesUtils";import LayerUtils from"../../utils/LayerUtils";import MiscUtils from"../../utils/MiscUtils";import{registerPermalinkDataStoreHook,unregisterPermalinkDataStoreHook,UrlParams}from"../../utils/PermaLinkUtils";import{MapContainerPortalContext}from"../PluginsContainer";import BottomBar3D from"./BottomBar3D";import Compare3D from"./Compare3D";import Draw3D from"./Draw3D";import EditDataset3D from"./EditDataset3D";import ExportObjects3D from"./ExportObjects3D";import HideObjects3D from"./HideObjects3D";import Identify3D from"./Identify3D";import LayerTree3D from"./LayerTree3D";import Map3DLight from"./Map3DLight";import MapControls3D from"./MapControls3D";import MapExport3D from"./MapExport3D";import Measure3D from"./Measure3D";import OverviewMap3D from"./OverviewMap3D";import Settings3D from"./Settings3D";import TopBar3D from"./TopBar3D";import View3DSwitcher from"./View3DSwitcher";import LayerRegistry from"./layers/index";import{importGltf,updateObjectLabel}from"./utils/MiscUtils3D";import Tiles3DStyle from"./utils/Tiles3DStyle";import"./style/Map3D.css";// Ensures unUnload is called *after* all other children have unmounted
8
+ var UnloadWrapper=/*#__PURE__*/function(_React$Component){function UnloadWrapper(){var _this;_classCallCheck(this,UnloadWrapper);for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++){args[_key]=arguments[_key]}_this=_callSuper(this,UnloadWrapper,[].concat(args));_defineProperty(_this,"onUnload",function(el){if(!el){_this.props.onUnload(_this.props.sceneId)}});return _this}_inherits(UnloadWrapper,_React$Component);return _createClass(UnloadWrapper,[{key:"render",value:function render(){return/*#__PURE__*/React.createElement("div",null,this.props.children,/*#__PURE__*/React.createElement("span",{ref:this.onUnload}))}}])}(React.Component);_defineProperty(UnloadWrapper,"propTypes",{children:PropTypes.oneOfType([PropTypes.node,PropTypes.func]),onUnload:PropTypes.func,sceneId:PropTypes.string});var Map3D=/*#__PURE__*/function(_React$Component2){function Map3D(props){var _this2;_classCallCheck(this,Map3D);_this2=_callSuper(this,Map3D,[props]);_defineProperty(_this2,"state",{sceneContext:_objectSpread(_objectSpread({},Map3D.defaultSceneState),{},{addLayer:function addLayer(layer){},getLayer:function getLayer(layerId){},removeLayer:function removeLayer(layerId){},updateColorLayer:function updateColorLayer(layerId,options,path){},add3dTiles:function add3dTiles(url,options){},addSceneObject:function addSceneObject(objectId,object){var options=arguments.length>2&&arguments[2]!==undefined?arguments[2]:{}},getSceneObject:function getSceneObject(objectId){},removeSceneObject:function removeSceneObject(objectId){},updateSceneObject:function updateSceneObject(objectId,options){},zoomToObject:function zoomToObject(objectId){},getMap:function getMap(){},setViewToExtent:function setViewToExtent(bounds,angle){},getTerrainHeightFromDTM:function getTerrainHeightFromDTM(scenePos){},getTerrainHeightFromMap:function getTerrainHeightFromMap(scenePos){},getSceneIntersection:function getSceneIntersection(x,y,objects){},getSetting:function getSetting(key){},setSetting:function setSetting(key,value){}}),sceneId:null});_defineProperty(_this2,"applyBaseLayer",function(){var baseLayer=_this2.state.sceneContext.baseLayers.find(function(e){return e.visibility===true});_this2.removeLayer("__baselayer");if(!baseLayer){return}var layerCreator=LayerRegistry[baseLayer.type];if(layerCreator!==null&&layerCreator!==void 0&&layerCreator.create3d){var layer3d=layerCreator.create3d(baseLayer,_this2.state.sceneContext.mapCrs);_this2.addLayer("__baselayer",layer3d);_this2.map.insertLayerAfter(layer3d,null)}});_defineProperty(_this2,"setBaseLayer",function(layer,visibility){var _this2$state$sceneCon;var currentBaseLayer=((_this2$state$sceneCon=_this2.state.sceneContext.baseLayers.find(function(l){return l.visibility===true}))===null||_this2$state$sceneCon===void 0?void 0:_this2$state$sceneCon.name)||"";if(visibility&&(layer===null||layer===void 0?void 0:layer.name)===currentBaseLayer){// Nothing changed
9
9
  return}_this2.setState(function(state){return{sceneContext:_objectSpread(_objectSpread({},state.sceneContext),{},{baseLayers:state.sceneContext.baseLayers.map(function(entry){return _objectSpread(_objectSpread({},entry),{},{visibility:entry.name===layer.name?visibility:false})})})}});UrlParams.updateParams({bl3d:visibility?layer.name:""})});_defineProperty(_this2,"collectColorLayers",function(prevColorLayers){return _this2.props.layers.reduce(function(colorLayers,layer){var _prevOptions$visibili,_prevOptions$opacity,_prevOptions$extrusio,_prevOptions$fields;if(layer.role!==LayerRole.THEME&&layer.role!==LayerRole.USERLAYER){return colorLayers}var layerCreator=LayerRegistry[layer.type];if(!layerCreator||!layerCreator.create3d){return colorLayers}var prevOptions=prevColorLayers[layer.id];var _preserveSublayerOptions=function preserveSublayerOptions(entry,prevEntry){var _entry$sublayers,_entry$sublayers$map;return(_entry$sublayers=entry.sublayers)===null||_entry$sublayers===void 0||(_entry$sublayers$map=_entry$sublayers.map)===null||_entry$sublayers$map===void 0?void 0:_entry$sublayers$map.call(_entry$sublayers,function(child){var _prevEntry$sublayers,_prevEntry$sublayers$;var prevChild=prevEntry===null||prevEntry===void 0||(_prevEntry$sublayers=prevEntry.sublayers)===null||_prevEntry$sublayers===void 0||(_prevEntry$sublayers$=_prevEntry$sublayers.find)===null||_prevEntry$sublayers$===void 0?void 0:_prevEntry$sublayers$.call(_prevEntry$sublayers,function(x){return x.name===child.name});if((prevChild===null||prevChild===void 0?void 0:prevChild.name)===child.name){return _objectSpread(_objectSpread({},child),{},{visibility:prevChild.visibility,opacity:prevChild.opacity,sublayers:_preserveSublayerOptions(child,prevChild)})}else{return child}})};colorLayers[layer.id]=_objectSpread(_objectSpread({},layer),{},{visibility:(_prevOptions$visibili=prevOptions===null||prevOptions===void 0?void 0:prevOptions.visibility)!==null&&_prevOptions$visibili!==void 0?_prevOptions$visibili:false,opacity:(_prevOptions$opacity=prevOptions===null||prevOptions===void 0?void 0:prevOptions.opacity)!==null&&_prevOptions$opacity!==void 0?_prevOptions$opacity:255,extrusionHeight:(_prevOptions$extrusio=prevOptions===null||prevOptions===void 0?void 0:prevOptions.extrusionHeight)!==null&&_prevOptions$extrusio!==void 0?_prevOptions$extrusio:["vector","wfs"].includes(layer.type)?0:undefined,fields:(_prevOptions$fields=prevOptions===null||prevOptions===void 0?void 0:prevOptions.fields)!==null&&_prevOptions$fields!==void 0?_prevOptions$fields:undefined,sublayers:_preserveSublayerOptions(layer,prevOptions)});Object.assign(colorLayers[layer.id],LayerUtils.buildWMSLayerParams(colorLayers[layer.id]));if(colorLayers[layer.id].fields===undefined&&layerCreator.getFields){layerCreator.getFields(layer).then(function(fields){_this2.updateColorLayer(layer.id,{fields:fields})})}return colorLayers},{})});_defineProperty(_this2,"applyColorLayerUpdates",function(colorLayers,prevColorLayers){// Add-update new layers
10
10
  var layerBelow=_this2.getLayer("__baselayer");Object.entries(colorLayers).reverse().forEach(function(_ref){var _ref2=_slicedToArray(_ref,2),layerId=_ref2[0],options=_ref2[1];var prevOptions=prevColorLayers[layerId];var layerCreator=LayerRegistry[options.type];var mapLayer=_this2.getLayer(layerId);if(mapLayer){layerCreator.update3d(mapLayer.source,options,prevOptions,_this2.state.sceneContext.mapCrs)}else{mapLayer=layerCreator.create3d(options,_this2.state.sceneContext.mapCrs);_this2.addLayer(layerId,mapLayer)}_this2.map.insertLayerAfter(mapLayer,layerBelow);mapLayer.visible=options.visibility;mapLayer.opacity=options.opacity/255;layerBelow=mapLayer;if(options.extrusionHeight!==0){_this2.createUpdateExtrudedLayer(mapLayer,options,options.features!==(prevOptions===null||prevOptions===void 0?void 0:prevOptions.features))}else if((prevOptions===null||prevOptions===void 0?void 0:prevOptions.extrusionHeight)!==0){_this2.removeExtrudedLayer(options.id)}});// Remove old layers
11
11
  Object.entries(prevColorLayers).forEach(function(_ref3){var _ref4=_slicedToArray(_ref3,2),layerId=_ref4[0],options=_ref4[1];if(!(layerId in colorLayers)){if(options.extrusionHeight!==0){_this2.removeExtrudedLayer(options.id)}_this2.removeLayer(layerId)}});_this2.instance.notifyChange(_this2.map)});_defineProperty(_this2,"createUpdateExtrudedLayer",function(mapLayer,options){var _options$features,_options$features$red;var forceCreate=arguments.length>2&&arguments[2]!==undefined?arguments[2]:false;var bounds=options.bbox.bounds;var extent=new Extent(options.bbox.crs,bounds[0],bounds[2],bounds[1],bounds[3]);var objId=options.id+":extruded";var makeColor=function makeColor(c){if(Array.isArray(c)){return c[0]<<16|c[1]<<8|c[2]}else if(typeof c==="string"){return parseInt(c.replace("#",""),16)}else{return c}};var obj=_this2.objectMap[objId];if(!obj||forceCreate){var _options$color;if(obj){_this2.instance.remove(obj)}var layercolor=makeColor((_options$color=options.color)!==null&&_options$color!==void 0?_options$color:"#FF0000");obj=new FeatureCollection({source:mapLayer.source.source,extent:extent,minLevel:1,maxLevel:1,ignoreZ:true,elevation:function elevation(feature){var _this2$getTerrainHeig;var coordinates=feature.getGeometry().getCoordinates();while(Array.isArray(coordinates[0])){coordinates=coordinates[0]}return(_this2$getTerrainHeig=_this2.getTerrainHeightFromMap(coordinates))!==null&&_this2$getTerrainHeig!==void 0?_this2$getTerrainHeig:0},extrusionOffset:function extrusionOffset(feature){if(typeof obj.userData.extrusionHeight==="string"){return parseFloat(feature.getProperties()[obj.userData.extrusionHeight])||0}else{return obj.userData.extrusionHeight}},style:function style(feature){var _obj$userData$feature,_obj$userData$feature2;return(_obj$userData$feature=(_obj$userData$feature2=obj.userData.featureStyles)===null||_obj$userData$feature2===void 0?void 0:_obj$userData$feature2[feature.getId()])!==null&&_obj$userData$feature!==void 0?_obj$userData$feature:{fill:{color:layercolor,shading:true}}}});obj.castShadow=true;obj.receiveShadow=true;_this2.instance.add(obj);_this2.objectMap[objId]=obj}obj.userData.extrusionHeight=options.extrusionHeight;obj.userData.featureStyles=(_options$features=options.features)===null||_options$features===void 0||(_options$features$red=_options$features.reduce)===null||_options$features$red===void 0?void 0:_options$features$red.call(_options$features,function(res,feature){return _objectSpread(_objectSpread({},res),{},_defineProperty({},feature.id,{fill:{color:makeColor(feature.styleOptions.fillColor),shading:true}}))},{});obj.opacity=mapLayer.opacity;obj.visible=mapLayer.visible;obj.updateStyles()});_defineProperty(_this2,"removeExtrudedLayer",function(layerId){var objId=layerId+":extruded";if(_this2.objectMap[objId]){_this2.instance.remove(_this2.objectMap[objId]);delete _this2.objectMap[objId]}_this2.instance.notifyChange()});_defineProperty(_this2,"applySceneObjectUpdates",function(sceneObjects,prevSceneObjects){Object.entries(sceneObjects).forEach(function(_ref5){var _ref6=_slicedToArray(_ref5,2),objectId=_ref6[0],options=_ref6[1];var prevOptions=prevSceneObjects===null||prevSceneObjects===void 0?void 0:prevSceneObjects[objectId];var object=_this2.objectMap[objectId];if(options.opacity!==(prevOptions===null||prevOptions===void 0?void 0:prevOptions.opacity)||options.visibility!==(prevOptions===null||prevOptions===void 0?void 0:prevOptions.visibility)){object.visible=options.visibility&&options.opacity>0;if(object.opacity!==undefined){object.opacity=options.opacity/255}else{object.traverse(function(child){if(child instanceof Mesh){child.material.transparent=options.opacity<255;child.material.opacity=options.opacity/255;child.material.needsUpdate=true}})}_this2.instance.notifyChange(object)}if(options.style!==(prevOptions===null||prevOptions===void 0?void 0:prevOptions.style)){_this2.loadTilesetStyle(objectId,options)}if(options.tilesetStyle!==(prevOptions===null||prevOptions===void 0?void 0:prevOptions.tilesetStyle)){object.tiles.group.children.forEach(function(group){Tiles3DStyle.applyTileStyle(group,options,_this2.state.sceneContext)});_this2.instance.notifyChange(object)}})});_defineProperty(_this2,"addLayer",function(layerId,layer){layer.userData.layerId=layerId;_this2.map.addLayer(layer)});_defineProperty(_this2,"getLayer",function(layerId){var _this2$map$getLayers$;return(_this2$map$getLayers$=_this2.map.getLayers(function(l){return l.userData.layerId===layerId})[0])!==null&&_this2$map$getLayers$!==void 0?_this2$map$getLayers$:null});_defineProperty(_this2,"removeLayer",function(layerId){_this2.map.getLayers(function(l){return l.userData.layerId===layerId}).forEach(function(layer){_this2.map.removeLayer(layer,{dispose:true})})});_defineProperty(_this2,"updateColorLayer",function(layerId,options){var path=arguments.length>2&&arguments[2]!==undefined?arguments[2]:[];_this2.setState(function(state){var entry=_objectSpread({},state.sceneContext.colorLayers[layerId]);var subentry=entry;path.forEach(function(idx){subentry.sublayers=_toConsumableArray(subentry.sublayers);subentry.sublayers[idx]=_objectSpread({},subentry.sublayers[idx]);subentry=subentry.sublayers[idx]});Object.assign(subentry,options);Object.assign(entry,LayerUtils.buildWMSLayerParams(entry));return{sceneContext:_objectSpread(_objectSpread({},state.sceneContext),{},{colorLayers:_objectSpread(_objectSpread({},state.sceneContext.colorLayers),{},_defineProperty({},layerId,entry))})}})});_defineProperty(_this2,"add3dTiles",function(url,name){var options=arguments.length>2&&arguments[2]!==undefined?arguments[2]:{};var showEditTool=arguments.length>3&&arguments[3]!==undefined?arguments[3]:false;var matrix=arguments.length>4&&arguments[4]!==undefined?arguments[4]:null;var label=arguments.length>5&&arguments[5]!==undefined?arguments[5]:null;var tiles=new Tiles3D({url:MiscUtils.resolveAssetsPath(url)});// Recenter tile group
@@ -24,9 +24,10 @@ var colorLayers=_this2.collectColorLayers([]);var sceneObjects={};_this2.objectM
24
24
  tiles.tiles.addEventListener("load-model",function(_ref10){var _entry$idAttr;var scene=_ref10.scene;scene.userData.tilesetName=entry.name;scene.userData.batchIdAttr=(_entry$idAttr=entry.idAttr)!==null&&_entry$idAttr!==void 0?_entry$idAttr:"id";Tiles3DStyle.applyTileStyle(scene,_this2.state.sceneContext.sceneObjects[entry.name],_this2.state.sceneContext);_this2.instance.notifyChange(tiles)});// Show/hide labels when tile visibility changes
25
25
  tiles.tiles.addEventListener("tile-visibility-change",function(_ref11){var scene=_ref11.scene,visible=_ref11.visible;Object.values(scene.userData.tileLabels||{}).forEach(function(label){label.labelObject.visible=visible;label.labelObject.element.style.display=visible?"initial":"none"})});tiles.castShadow=true;tiles.receiveShadow=true;tiles.userData.layertree=true;_this2.instance.add(tiles);_this2.objectMap[entry.name]=tiles;sceneObjects[entry.name]={visibility:true,opacity:255,layertree:true,title:(_entry$title=entry.title)!==null&&_entry$title!==void 0?_entry$title:entry.name,baseColor:entry.baseColor,styles:entry.styles,style:entry.style||Object.keys(entry.styles||{})[0]||null,tilesetStyle:null,idAttr:entry.idAttr,colorAttr:entry.colorAttr,alphaAttr:entry.alphaAttr,labelAttr:entry.labelAttr}});// Add other objects
26
26
  (((_this2$props$theme$ma8=_this2.props.theme.map3d)===null||_this2$props$theme$ma8===void 0?void 0:_this2$props$theme$ma8.objects3d)||[]).forEach(function(entry){importGltf(MiscUtils.resolveAssetsPath(entry.url),entry.name,_this2.state.sceneContext)});_this2.setState(function(state){return{sceneContext:_objectSpread(_objectSpread({},state.sceneContext),{},{scene:_this2.instance,map:_this2.map,mapCrs:projection,dtmUrl:demUrl,dtmCrs:demCrs,baseLayers:baseLayers,colorLayers:colorLayers,sceneObjects:sceneObjects}),sceneId:uuidv4()}});// Inspector
27
- if(["1","true"].includes((UrlParams.getParam("inspector")||"").toLowerCase())){var inspectorContainer=document.createElement("div");inspectorContainer.className="map3d-inspector";_this2.container.appendChild(inspectorContainer);_this2.inspector=new Inspector(inspectorContainer,_this2.instance)}});_defineProperty(_this2,"loadTilesetStyle",function(objectId,options){var _options$styles;var url=(_options$styles=options.styles)===null||_options$styles===void 0?void 0:_options$styles[options.style];if(_this2.tilesetStyles[url]){_this2.updateSceneObject(objectId,{tilesetStyle:_this2.tilesetStyles[url]})}else if(url){var fullUrl=MiscUtils.resolveAssetsPath(url);axios.get(fullUrl).then(function(response){_this2.tilesetStyles[url]=response.data;_this2.updateSceneObject(objectId,{tilesetStyle:_this2.tilesetStyles[url]})})["catch"](function(){_this2.tilesetStyles[url]={};_this2.updateSceneObject(objectId,{tilesetStyle:_this2.tilesetStyles[url]})})}else{_this2.tilesetStyles[url]=null;_this2.updateSceneObject(objectId,{tilesetStyle:_this2.tilesetStyles[url]})}});_defineProperty(_this2,"disposeInstance",function(){if(_this2.inspector){_this2.inspector.detach()}_this2.map.dispose({disposeLayers:true});Object.values(_this2.objectMap).forEach(function(object){_this2.instance.remove(object)});_this2.instance.dispose();_this2.inspector=null;_this2.map=null;_this2.objectMap={};_this2.sceneObjectGroup=null;_this2.instance=null;_this2.setState(function(state){return{sceneContext:_objectSpread(_objectSpread({},state.sceneContext),Map3D.defaultSceneState)}});_this2.props.setCurrentTask(null)});_defineProperty(_this2,"onUnload",function(key){// Ensure scene has not already been disposed
27
+ if(["1","true"].includes((UrlParams.getParam("inspector")||"").toLowerCase())){var inspectorContainer=document.createElement("div");inspectorContainer.className="map3d-inspector";_this2.container.appendChild(inspectorContainer);_this2.inspector=new Inspector(inspectorContainer,_this2.instance)}_this2.instance.addEventListener("update-start",function(){var camera=_this2.instance.view.camera;var quality=_this2.state.sceneContext.settings.sceneQuality;var isFirstPerson=_this2.state.sceneContext.scene.view.controls.isFirstPerson;var maxDistance=isFirstPerson?200+20*quality:500+quality*quality;// Hide scene objects according to scene quality
28
+ Object.entries(_this2.state.sceneContext.sceneObjects).forEach(function(_ref12){var _ref13=_slicedToArray(_ref12,2),objId=_ref13[0],options=_ref13[1];var object=_this2.objectMap[objId];if(options.layertree&&object.isObject3D){object.children.forEach(function(child){var distance=camera.position.distanceTo(child.getWorldPosition(new Vector3));child.userData.__wasVisible=child.visible;if(distance>maxDistance){child.visible=false}})}})});_this2.instance.addEventListener("update-end",function(){Object.entries(_this2.state.sceneContext.sceneObjects).forEach(function(_ref14){var _ref15=_slicedToArray(_ref14,2),objId=_ref15[0],options=_ref15[1];var object=_this2.objectMap[objId];if(options.layertree&&object.isObject3D){object.children.forEach(function(child){child.visible=child.userData.__wasVisible;delete child.userData.__wasVisible})}})});_this2.instance.addEventListener("before-entity-update",function(_ref16){var entity=_ref16.entity;if(entity!==_this2.map){_this2.instance.view.camera.userData.__previousFar=_this2.instance.view.camera.far;var quality=_this2.state.sceneContext.settings.sceneQuality;var isFirstPerson=_this2.state.sceneContext.scene.view.controls.isFirstPerson;_this2.instance.view.camera.far=isFirstPerson?200+20*quality:500+quality*quality;_this2.instance.view.camera.updateProjectionMatrix()}});_this2.instance.addEventListener("after-entity-update",function(_ref17){var entity=_ref17.entity;if(entity!==_this2.map){_this2.instance.view.camera.far=_this2.instance.view.camera.userData.__previousFar;delete _this2.instance.view.camera.userData.__previousFar;_this2.instance.view.camera.updateProjectionMatrix()}})});_defineProperty(_this2,"loadTilesetStyle",function(objectId,options){var _options$styles;var url=(_options$styles=options.styles)===null||_options$styles===void 0?void 0:_options$styles[options.style];if(_this2.tilesetStyles[url]){_this2.updateSceneObject(objectId,{tilesetStyle:_this2.tilesetStyles[url]})}else if(url){var fullUrl=MiscUtils.resolveAssetsPath(url);axios.get(fullUrl).then(function(response){_this2.tilesetStyles[url]=response.data;_this2.updateSceneObject(objectId,{tilesetStyle:_this2.tilesetStyles[url]})})["catch"](function(){_this2.tilesetStyles[url]={};_this2.updateSceneObject(objectId,{tilesetStyle:_this2.tilesetStyles[url]})})}else{_this2.tilesetStyles[url]=null;_this2.updateSceneObject(objectId,{tilesetStyle:_this2.tilesetStyles[url]})}});_defineProperty(_this2,"disposeInstance",function(){if(_this2.inspector){_this2.inspector.detach()}_this2.map.dispose({disposeLayers:true});Object.values(_this2.objectMap).forEach(function(object){_this2.instance.remove(object)});_this2.instance.dispose();_this2.inspector=null;_this2.map=null;_this2.objectMap={};_this2.sceneObjectGroup=null;_this2.instance=null;_this2.setState(function(state){return{sceneContext:_objectSpread(_objectSpread({},state.sceneContext),Map3D.defaultSceneState)}});_this2.props.setCurrentTask(null)});_defineProperty(_this2,"onUnload",function(key){// Ensure scene has not already been disposed
28
29
  if(_this2.state.sceneId===key){_this2.disposeInstance()}});_defineProperty(_this2,"setupControls",function(instance){_this2.setState(function(state){return{sceneContext:_objectSpread(_objectSpread({},state.sceneContext),{},{setViewToExtent:instance===null||instance===void 0?void 0:instance.setViewToExtent,restoreView:instance===null||instance===void 0?void 0:instance.restoreView})}},_this2.props.onMapInitialized)});_defineProperty(_this2,"getTerrainHeightFromDTM",function(scenePos){var returnArray=true;if(!Array.isArray(scenePos[0])){returnArray=false;scenePos=[scenePos]}var dtmPos=scenePos.map(function(p){return CoordinatesUtils.reproject(p,_this2.state.sceneContext.mapCrs,_this2.state.sceneContext.dtmCrs)});var dtmExt=[Infinity,Infinity,-Infinity,-Infinity];dtmPos.forEach(function(p){dtmExt[0]=Math.min(dtmExt[0],p[0]);dtmExt[1]=Math.min(dtmExt[1],p[1]);dtmExt[2]=Math.max(dtmExt[2],p[0]);dtmExt[3]=Math.max(dtmExt[3],p[1])});return new Promise(function(resolve){if(!_this2.state.sceneContext.dtmUrl){resolve(returnArray?scenePos.map(function(x){return 0}):0);return}fromUrl(_this2.state.sceneContext.dtmUrl).then(function(tiff){tiff.getImage().then(function(image){var _image$fileDirectory=image.fileDirectory,ModelTiepoint=_image$fileDirectory.ModelTiepoint,ModelPixelScale=_image$fileDirectory.ModelPixelScale;// Extract scale and tiepoint values
29
- var _ref12=[ModelPixelScale[0],ModelPixelScale[1]],scaleX=_ref12[0],scaleY=_ref12[1];var _ref13=[ModelTiepoint[3],ModelTiepoint[4]],tiepointX=_ref13[0],tiepointY=_ref13[1];// Tiepoint world coordinates
30
+ var _ref18=[ModelPixelScale[0],ModelPixelScale[1]],scaleX=_ref18[0],scaleY=_ref18[1];var _ref19=[ModelTiepoint[3],ModelTiepoint[4]],tiepointX=_ref19[0],tiepointY=_ref19[1];// Tiepoint world coordinates
30
31
  // Calculate pixel indices (rounded to nearest integers)
31
32
  var minPixelX=Math.round((dtmExt[0]-tiepointX)/scaleX);var minPixelY=Math.round((tiepointY-dtmExt[3])/scaleY);// Inverted Y-axis in image
32
33
  var maxPixelY=Math.round((tiepointY-dtmExt[1])/scaleY)+1;// Inverted Y-axis in image
@@ -35,7 +36,7 @@ var maxPixelX=Math.round((dtmExt[2]-tiepointX)/scaleX)+1;var width=maxPixelX-min
35
36
  elevationResult.samples.sort(function(a,b){return a.resolution-b.resolution});return(_elevationResult$samp=elevationResult.samples[0])===null||_elevationResult$samp===void 0?void 0:_elevationResult$samp.elevation});_defineProperty(_this2,"getSceneIntersection",function(x,y){var objects=arguments.length>2&&arguments[2]!==undefined?arguments[2]:true;var raycaster=new Raycaster;var camera=_this2.instance.view.camera;raycaster.setFromCamera(new Vector2(x,y),camera);// Query object intersection
36
37
  var objInter=objects?raycaster.intersectObjects(_this2.state.sceneContext.collisionObjects,true)[0]:undefined;// Query highest resolution terrain tile (i.e. tile with no children)
37
38
  var terrInter=raycaster.intersectObjects([_this2.map.object3d]).filter(function(result){return result.object.children.length===0})[0];// Return closest result
38
- if(objInter&&terrInter){return objInter.distance<terrInter.distance?objInter:terrInter}return objInter!==null&&objInter!==void 0?objInter:terrInter});_defineProperty(_this2,"redrawScene",function(ev){var width=ev.target.innerWidth;var height=ev.target.innerHeight;_this2.instance.renderer.setSize(width,height);_this2.instance.view.camera.aspect=width/height;_this2.instance.view.camera.updateProjectionMatrix();_this2.instance.renderer.render(_this2.instance.scene,_this2.instance.view.camera)});_defineProperty(_this2,"setViewToExtent",function(bounds,rotation){_this2.state.sceneContext.setViewToExtent(bounds,rotation)});_defineProperty(_this2,"store3dState",function(){var promises=Object.entries(_this2.state.sceneContext.sceneObjects).map(function(_ref14){var _ref15=_slicedToArray(_ref14,2),objectId=_ref15[0],entry=_ref15[1];if(!entry.layertree){return null}return new Promise(function(resolve){var object=_this2.state.sceneContext.getSceneObject(objectId);if(entry.drawGroup){var exporter=new GLTFExporter;exporter.parse(object,function(result){resolve({id:objectId,options:entry,data:result})})}else if(entry.imported&&object.tiles){var container=object.tiles.group.parent;var tileset={matrix:container.matrix.elements,label:container.userData.label,url:object.tiles.rootURL};resolve({id:objectId,options:entry,tileset:tileset})}else{resolve({id:objectId,options:entry})}})}).filter(Boolean);return new Promise(function(resolve){Promise.all(promises).then(function(objects){var _this2$state$sceneCon2,_this2$state$sceneCon3;var camera=_this2.state.sceneContext.scene.view.camera.position;var target=_this2.state.sceneContext.scene.view.controls.target;var layers=Object.entries(_this2.state.sceneContext.colorLayers).map(function(_ref16){var _ref17=_slicedToArray(_ref16,2),layerId=_ref17[0],options=_ref17[1];return{id:layerId,options:{visibility:options.visibility,opacity:options.opacity,extrusionHeight:options.extrusionHeight}}});resolve({objects:objects,colorLayers:layers,baseLayer:((_this2$state$sceneCon2=_this2.state.sceneContext.baseLayers.find(function(layer){return layer.visibility===true}))===null||_this2$state$sceneCon2===void 0?void 0:_this2$state$sceneCon2.name)||"",personHeight:(_this2$state$sceneCon3=_this2.state.sceneContext.scene.view.controls.personHeight)!==null&&_this2$state$sceneCon3!==void 0?_this2$state$sceneCon3:0,camera:[camera.x,camera.y,camera.z],target:[target.x,target.y,target.z]})})})});_defineProperty(_this2,"restore3dState",function(data){if(isEmpty(data)){return}(data.objects||[]).forEach(function(item){if(item.data){var loader=new GLTFLoader;loader.parse(item.data,ConfigUtils.getAssetsPath(),function(gltf){gltf.scene.traverse(function(c){if(c.isMesh){c.castShadow=true;c.receiveShadow=true}updateObjectLabel(c,_this2.state.sceneContext)});_this2.state.sceneContext.addSceneObject(item.id,gltf.scene,item.options)})}else if(item.tileset){_this2.add3dTiles(item.tileset.url,item.id,item.options,false,new Matrix4().fromArray(item.tileset.matrix),item.tileset.label)}else if(item.id in _this2.state.sceneContext.sceneObjects){_this2.state.sceneContext.updateSceneObject(item.id,item.options)}});(data.colorLayers||[]).forEach(function(item){if(item.id in _this2.state.sceneContext.colorLayers){_this2.state.sceneContext.updateColorLayer(item.id,item.options)}});_this2.state.sceneContext.restoreView(data);if(data.baseLayer!==undefined){_this2.setState(function(state){return{sceneContext:_objectSpread(_objectSpread({},state.sceneContext),{},{baseLayers:state.sceneContext.baseLayers.map(function(l){return _objectSpread(_objectSpread({},l),{},{visibility:l.name===data.baseLayer})})})}});UrlParams.updateParams({bl3d:data.baseLayer})}_this2.state.sceneContext.scene.notifyChange()});_this2.container=null;_this2.inspector=null;_this2.instance=null;_this2.map=null;_this2.sceneObjectGroup=null;_this2.objectMap={};_this2.tilesetStyles={};_this2.state.sceneContext.options=_this2.props.options;_this2.state.sceneContext.addLayer=_this2.addLayer;_this2.state.sceneContext.getLayer=_this2.getLayer;_this2.state.sceneContext.removeLayer=_this2.removeLayer;_this2.state.sceneContext.updateColorLayer=_this2.updateColorLayer;_this2.state.sceneContext.add3dTiles=_this2.add3dTiles;_this2.state.sceneContext.addSceneObject=_this2.addSceneObject;_this2.state.sceneContext.getSceneObject=_this2.getSceneObject;_this2.state.sceneContext.removeSceneObject=_this2.removeSceneObject;_this2.state.sceneContext.updateSceneObject=_this2.updateSceneObject;_this2.state.sceneContext.zoomToObject=_this2.zoomToObject;_this2.state.sceneContext.getMap=_this2.getMap;_this2.state.sceneContext.getTerrainHeightFromDTM=_this2.getTerrainHeightFromDTM;_this2.state.sceneContext.getTerrainHeightFromMap=_this2.getTerrainHeightFromMap;_this2.state.sceneContext.getSceneIntersection=_this2.getSceneIntersection;registerPermalinkDataStoreHook("map3d",_this2.store3dState);return _this2}_inherits(Map3D,_React$Component2);return _createClass(Map3D,[{key:"componentDidMount",value:function componentDidMount(){this.props.innerRef(this)}},{key:"componentWillUnmount",value:function componentWillUnmount(){unregisterPermalinkDataStoreHook("map3d")}},{key:"componentDidUpdate",value:function componentDidUpdate(prevProps,prevState){var _this3=this;if(this.props.theme!==prevProps.theme){this.setupInstance()}else if(this.props.layers!==prevProps.layers){this.setState(function(state){return{sceneContext:_objectSpread(_objectSpread({},state.sceneContext),{},{colorLayers:_this3.collectColorLayers(state.sceneContext.colorLayers)})}})}// Update map layers
39
+ if(objInter&&terrInter){return objInter.distance<terrInter.distance?objInter:terrInter}return objInter!==null&&objInter!==void 0?objInter:terrInter});_defineProperty(_this2,"getSetting",function(key){return _this2.state.sceneContext.settings[key]});_defineProperty(_this2,"setSetting",function(key,value){_this2.setState(function(state){return{sceneContext:_objectSpread(_objectSpread({},state.sceneContext),{},{settings:_objectSpread(_objectSpread({},state.sceneContext.settings),{},_defineProperty({},key,value))})}})});_defineProperty(_this2,"redrawScene",function(ev){var width=ev.target.innerWidth;var height=ev.target.innerHeight;_this2.instance.renderer.setSize(width,height);_this2.instance.view.camera.aspect=width/height;_this2.instance.view.camera.updateProjectionMatrix();_this2.instance.renderer.render(_this2.instance.scene,_this2.instance.view.camera)});_defineProperty(_this2,"setViewToExtent",function(bounds,rotation){_this2.state.sceneContext.setViewToExtent(bounds,rotation)});_defineProperty(_this2,"store3dState",function(){var promises=Object.entries(_this2.state.sceneContext.sceneObjects).map(function(_ref20){var _ref21=_slicedToArray(_ref20,2),objectId=_ref21[0],entry=_ref21[1];if(!entry.layertree){return null}return new Promise(function(resolve){var object=_this2.state.sceneContext.getSceneObject(objectId);if(entry.drawGroup){var exporter=new GLTFExporter;exporter.parse(object,function(result){resolve({id:objectId,options:entry,data:result})})}else if(entry.imported&&object.tiles){var container=object.tiles.group.parent;var tileset={matrix:container.matrix.elements,label:container.userData.label,url:object.tiles.rootURL};resolve({id:objectId,options:entry,tileset:tileset})}else{resolve({id:objectId,options:entry})}})}).filter(Boolean);return new Promise(function(resolve){Promise.all(promises).then(function(objects){var _this2$state$sceneCon2,_this2$state$sceneCon3;var camera=_this2.state.sceneContext.scene.view.camera.position;var target=_this2.state.sceneContext.scene.view.controls.target;var layers=Object.entries(_this2.state.sceneContext.colorLayers).map(function(_ref22){var _ref23=_slicedToArray(_ref22,2),layerId=_ref23[0],options=_ref23[1];return{id:layerId,options:{visibility:options.visibility,opacity:options.opacity,extrusionHeight:options.extrusionHeight}}});resolve({objects:objects,colorLayers:layers,baseLayer:((_this2$state$sceneCon2=_this2.state.sceneContext.baseLayers.find(function(layer){return layer.visibility===true}))===null||_this2$state$sceneCon2===void 0?void 0:_this2$state$sceneCon2.name)||"",personHeight:(_this2$state$sceneCon3=_this2.state.sceneContext.scene.view.controls.personHeight)!==null&&_this2$state$sceneCon3!==void 0?_this2$state$sceneCon3:0,camera:[camera.x,camera.y,camera.z],target:[target.x,target.y,target.z]})})})});_defineProperty(_this2,"restore3dState",function(data){if(isEmpty(data)){return}(data.objects||[]).forEach(function(item){if(item.data){var loader=new GLTFLoader;loader.parse(item.data,ConfigUtils.getAssetsPath(),function(gltf){gltf.scene.traverse(function(c){if(c.isMesh){c.castShadow=true;c.receiveShadow=true}updateObjectLabel(c,_this2.state.sceneContext)});_this2.state.sceneContext.addSceneObject(item.id,gltf.scene,item.options)})}else if(item.tileset){_this2.add3dTiles(item.tileset.url,item.id,item.options,false,new Matrix4().fromArray(item.tileset.matrix),item.tileset.label)}else if(item.id in _this2.state.sceneContext.sceneObjects){_this2.state.sceneContext.updateSceneObject(item.id,item.options)}});(data.colorLayers||[]).forEach(function(item){if(item.id in _this2.state.sceneContext.colorLayers){_this2.state.sceneContext.updateColorLayer(item.id,item.options)}});_this2.state.sceneContext.restoreView(data);if(data.baseLayer!==undefined){_this2.setState(function(state){return{sceneContext:_objectSpread(_objectSpread({},state.sceneContext),{},{baseLayers:state.sceneContext.baseLayers.map(function(l){return _objectSpread(_objectSpread({},l),{},{visibility:l.name===data.baseLayer})})})}});UrlParams.updateParams({bl3d:data.baseLayer})}_this2.state.sceneContext.scene.notifyChange()});_this2.container=null;_this2.inspector=null;_this2.instance=null;_this2.map=null;_this2.sceneObjectGroup=null;_this2.objectMap={};_this2.tilesetStyles={};_this2.sceneSettings={};_this2.state.sceneContext.options=_this2.props.options;_this2.state.sceneContext.addLayer=_this2.addLayer;_this2.state.sceneContext.getLayer=_this2.getLayer;_this2.state.sceneContext.removeLayer=_this2.removeLayer;_this2.state.sceneContext.updateColorLayer=_this2.updateColorLayer;_this2.state.sceneContext.add3dTiles=_this2.add3dTiles;_this2.state.sceneContext.addSceneObject=_this2.addSceneObject;_this2.state.sceneContext.getSceneObject=_this2.getSceneObject;_this2.state.sceneContext.removeSceneObject=_this2.removeSceneObject;_this2.state.sceneContext.updateSceneObject=_this2.updateSceneObject;_this2.state.sceneContext.zoomToObject=_this2.zoomToObject;_this2.state.sceneContext.getMap=_this2.getMap;_this2.state.sceneContext.getTerrainHeightFromDTM=_this2.getTerrainHeightFromDTM;_this2.state.sceneContext.getTerrainHeightFromMap=_this2.getTerrainHeightFromMap;_this2.state.sceneContext.getSceneIntersection=_this2.getSceneIntersection;_this2.state.sceneContext.getSetting=_this2.getSetting;_this2.state.sceneContext.setSetting=_this2.setSetting;registerPermalinkDataStoreHook("map3d",_this2.store3dState);return _this2}_inherits(Map3D,_React$Component2);return _createClass(Map3D,[{key:"componentDidMount",value:function componentDidMount(){this.props.innerRef(this)}},{key:"componentWillUnmount",value:function componentWillUnmount(){unregisterPermalinkDataStoreHook("map3d")}},{key:"componentDidUpdate",value:function componentDidUpdate(prevProps,prevState){var _this3=this;if(this.props.theme!==prevProps.theme){this.setupInstance()}else if(this.props.layers!==prevProps.layers){this.setState(function(state){return{sceneContext:_objectSpread(_objectSpread({},state.sceneContext),{},{colorLayers:_this3.collectColorLayers(state.sceneContext.colorLayers)})}})}// Update map layers
39
40
  if(this.state.sceneContext.baseLayers!==prevState.sceneContext.baseLayers){this.applyBaseLayer()}if(this.state.sceneContext.colorLayers!==prevState.sceneContext.colorLayers){this.applyColorLayerUpdates(this.state.sceneContext.colorLayers,prevState.sceneContext.colorLayers)}// Update scene objects
40
41
  if(this.state.sceneContext.sceneObjects!==prevState.sceneContext.sceneObjects){this.applySceneObjectUpdates(this.state.sceneContext.sceneObjects,prevState.sceneContext.sceneObjects);// Update collision objects
41
- this.setState(function(state){return{sceneContext:_objectSpread(_objectSpread({},state.sceneContext),{},{collisionObjects:Object.entries(state.sceneContext.sceneObjects).map(function(_ref18){var _ref19=_slicedToArray(_ref18,2),objId=_ref19[0],options=_ref19[1];if(options.layertree&&options.visibility){var _obj$tiles$group,_obj$tiles;var obj=_this3.objectMap[objId];return(_obj$tiles$group=(_obj$tiles=obj.tiles)===null||_obj$tiles===void 0?void 0:_obj$tiles.group)!==null&&_obj$tiles$group!==void 0?_obj$tiles$group:obj}return null}).filter(Boolean)})}})}}},{key:"render",value:function render(){var _this$state$sceneCont;var baseLayer=this.state.sceneContext.baseLayers.find(function(l){return l.visibility===true});var overviewLayer=(_this$state$sceneCont=this.state.sceneContext.baseLayers.find(function(l){return l.overview===true}))!==null&&_this$state$sceneCont!==void 0?_this$state$sceneCont:baseLayer;return[/*#__PURE__*/ReactDOM.createPortal(/*#__PURE__*/React.createElement("div",{className:"map3d-map",id:"map3d",key:"Map3D",ref:this.setupContainer}),this.context),this.state.sceneContext.scene?/*#__PURE__*/React.createElement(UnloadWrapper,{key:this.state.sceneId,onUnload:this.onUnload,sceneId:this.state.sceneId},/*#__PURE__*/React.createElement(MapControls3D,{onCameraChanged:this.props.onCameraChanged,onControlsSet:this.setupControls,sceneContext:this.state.sceneContext},/*#__PURE__*/React.createElement(BackgroundSwitcher,{changeLayerVisibility:this.setBaseLayer,layers:this.state.sceneContext.baseLayers}),/*#__PURE__*/React.createElement(BottomBar3D,{sceneContext:this.state.sceneContext}),/*#__PURE__*/React.createElement(Compare3D,{sceneContext:this.state.sceneContext}),/*#__PURE__*/React.createElement(Draw3D,{sceneContext:this.state.sceneContext}),/*#__PURE__*/React.createElement(EditDataset3D,{sceneContext:this.state.sceneContext}),/*#__PURE__*/React.createElement(ExportObjects3D,{sceneContext:this.state.sceneContext}),/*#__PURE__*/React.createElement(HideObjects3D,{sceneContext:this.state.sceneContext}),/*#__PURE__*/React.createElement(Identify3D,{sceneContext:this.state.sceneContext}),/*#__PURE__*/React.createElement(LayerTree3D,{sceneContext:this.state.sceneContext}),/*#__PURE__*/React.createElement(Map3DLight,{sceneContext:this.state.sceneContext}),/*#__PURE__*/React.createElement(MapExport3D,{sceneContext:this.state.sceneContext}),/*#__PURE__*/React.createElement(Measure3D,{sceneContext:this.state.sceneContext}),/*#__PURE__*/React.createElement(OverviewMap3D,{baseLayer:overviewLayer,sceneContext:this.state.sceneContext}),/*#__PURE__*/React.createElement(TopBar3D,{sceneContext:this.state.sceneContext,searchProviders:this.props.searchProviders}),/*#__PURE__*/React.createElement(View3DSwitcher,{position:2}))):null]}}])}(React.Component);_defineProperty(Map3D,"contextType",MapContainerPortalContext);_defineProperty(Map3D,"propTypes",{innerRef:PropTypes.func,layers:PropTypes.array,onCameraChanged:PropTypes.func,onMapInitialized:PropTypes.func,options:PropTypes.object,searchProviders:PropTypes.object,setCurrentTask:PropTypes.func,theme:PropTypes.object});_defineProperty(Map3D,"defaultProps",{geometry:{initialWidth:600,initialHeight:800,initialX:0,initialY:0,initiallyDocked:true}});_defineProperty(Map3D,"defaultSceneState",{scene:null,map:null,mapCrs:null,dtmUrl:null,dtmCrs:null,baseLayers:[],colorLayers:{},sceneObjects:{},collisionObjects:[]});export default connect(function(state){return{theme:state.theme.current,layers:state.layers.flat}},{setCurrentTask:setCurrentTask})(Map3D);
42
+ this.setState(function(state){return{sceneContext:_objectSpread(_objectSpread({},state.sceneContext),{},{collisionObjects:Object.entries(state.sceneContext.sceneObjects).map(function(_ref24){var _ref25=_slicedToArray(_ref24,2),objId=_ref25[0],options=_ref25[1];if(options.layertree&&options.visibility){var _obj$tiles$group,_obj$tiles;var obj=_this3.objectMap[objId];return(_obj$tiles$group=(_obj$tiles=obj.tiles)===null||_obj$tiles===void 0?void 0:_obj$tiles.group)!==null&&_obj$tiles$group!==void 0?_obj$tiles$group:obj}return null}).filter(Boolean)})}})}if(this.state.sceneContext.settings.sceneQuality!==prevState.sceneContext.settings.sceneQuality){var quality=Math.max(20,this.state.sceneContext.settings.sceneQuality);this.map.segments=Math.pow(2,Math.floor(quality/20));this.instance.notifyChange(this.instance.view.camera)}}},{key:"render",value:function render(){var _this$state$sceneCont;var baseLayer=this.state.sceneContext.baseLayers.find(function(l){return l.visibility===true});var overviewLayer=(_this$state$sceneCont=this.state.sceneContext.baseLayers.find(function(l){return l.overview===true}))!==null&&_this$state$sceneCont!==void 0?_this$state$sceneCont:baseLayer;return[/*#__PURE__*/ReactDOM.createPortal(/*#__PURE__*/React.createElement("div",{className:"map3d-map",id:"map3d",key:"Map3D",ref:this.setupContainer}),this.context),this.state.sceneContext.scene?/*#__PURE__*/React.createElement(UnloadWrapper,{key:this.state.sceneId,onUnload:this.onUnload,sceneId:this.state.sceneId},/*#__PURE__*/React.createElement(MapControls3D,{onCameraChanged:this.props.onCameraChanged,onControlsSet:this.setupControls,sceneContext:this.state.sceneContext},/*#__PURE__*/React.createElement(BackgroundSwitcher,{changeLayerVisibility:this.setBaseLayer,layers:this.state.sceneContext.baseLayers}),/*#__PURE__*/React.createElement(BottomBar3D,{sceneContext:this.state.sceneContext}),/*#__PURE__*/React.createElement(Compare3D,{sceneContext:this.state.sceneContext}),/*#__PURE__*/React.createElement(Draw3D,{sceneContext:this.state.sceneContext}),/*#__PURE__*/React.createElement(EditDataset3D,{sceneContext:this.state.sceneContext}),/*#__PURE__*/React.createElement(ExportObjects3D,{sceneContext:this.state.sceneContext}),/*#__PURE__*/React.createElement(HideObjects3D,{sceneContext:this.state.sceneContext}),/*#__PURE__*/React.createElement(Identify3D,{sceneContext:this.state.sceneContext}),/*#__PURE__*/React.createElement(LayerTree3D,{sceneContext:this.state.sceneContext}),/*#__PURE__*/React.createElement(Map3DLight,{sceneContext:this.state.sceneContext}),/*#__PURE__*/React.createElement(MapExport3D,{sceneContext:this.state.sceneContext}),/*#__PURE__*/React.createElement(Measure3D,{sceneContext:this.state.sceneContext}),/*#__PURE__*/React.createElement(OverviewMap3D,{baseLayer:overviewLayer,sceneContext:this.state.sceneContext}),/*#__PURE__*/React.createElement(Settings3D,{sceneContext:this.state.sceneContext}),/*#__PURE__*/React.createElement(TopBar3D,{sceneContext:this.state.sceneContext,searchProviders:this.props.searchProviders}),/*#__PURE__*/React.createElement(View3DSwitcher,{position:2}))):null]}}])}(React.Component);_defineProperty(Map3D,"contextType",MapContainerPortalContext);_defineProperty(Map3D,"propTypes",{innerRef:PropTypes.func,layers:PropTypes.array,onCameraChanged:PropTypes.func,onMapInitialized:PropTypes.func,options:PropTypes.object,searchProviders:PropTypes.object,setCurrentTask:PropTypes.func,theme:PropTypes.object});_defineProperty(Map3D,"defaultProps",{geometry:{initialWidth:600,initialHeight:800,initialX:0,initialY:0,initiallyDocked:true}});_defineProperty(Map3D,"defaultSceneState",{scene:null,map:null,mapCrs:null,dtmUrl:null,dtmCrs:null,baseLayers:[],colorLayers:{},sceneObjects:{},collisionObjects:[],settings:{sceneQuality:100}});export default connect(function(state){return{theme:state.theme.current,layers:state.layers.flat}},{setCurrentTask:setCurrentTask})(Map3D);
@@ -4,12 +4,11 @@ function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof
4
4
  *
5
5
  * This source code is licensed under the BSD-style license found in the
6
6
  * LICENSE file in the root directory of this source tree.
7
- */import React from"react";import{connect}from"react-redux";import axios from"axios";import FileSaver from"file-saver";import formDataEntries from"formdata-json";import isEmpty from"lodash.isempty";import PropTypes from"prop-types";import{SRGBColorSpace,Vector2,WebGLRenderTarget}from"three";import utif from"utif";import{setCurrentTask}from"../../actions/task";import LocaleUtils from"../../utils/LocaleUtils";import MiscUtils from"../../utils/MiscUtils";import Icon from"../Icon";import SideBar from"../SideBar";import NumberInput from"../widgets/NumberInput";import Spinner from"../widgets/Spinner";import"./../../plugins/style/MapExport.css";import"./style/MapExport3D.css";var MapExport3D=/*#__PURE__*/function(_React$Component){function MapExport3D(){var _this;_classCallCheck(this,MapExport3D);for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++){args[_key]=arguments[_key]}_this=_callSuper(this,MapExport3D,[].concat(args));_defineProperty(_this,"state",MapExport3D.defaultState);_defineProperty(_this,"onShow",function(){var _this$props$theme;if(!isEmpty((_this$props$theme=_this.props.theme)===null||_this$props$theme===void 0?void 0:_this$props$theme.print)){var _ref,_this$props$theme$pri,_this$props$theme$pri2,_this$props$theme$pri3;var layouts=_this.props.theme.print.filter(function(l){return l.map}).sort(function(a,b){return a.name.split("/").pop().localeCompare(b.name.split("/").pop(),undefined,{numeric:true})});var exportDpi=(_ref=(_this$props$theme$pri=(_this$props$theme$pri2=_this.props.theme.printResolutions)===null||_this$props$theme$pri2===void 0?void 0:_this$props$theme$pri2.find(function(x){return x===300}))!==null&&_this$props$theme$pri!==void 0?_this$props$theme$pri:(_this$props$theme$pri3=_this.props.theme.printResolutions)===null||_this$props$theme$pri3===void 0?void 0:_this$props$theme$pri3[0])!==null&&_ref!==void 0?_ref:300;_this.setState({layouts:layouts,exportDpi:exportDpi})}else{_this.setState({layouts:[]})}});_defineProperty(_this,"onHide",function(){_this.setState(MapExport3D.defaultState)});_defineProperty(_this,"formatChanged",function(ev){var layout="";var frameRatio=null;if(ev.target.value==="application/pdf"){layout=_this.state.layouts.find(function(l){return l["default"]})||_this.state.layouts[0];frameRatio=layout.map.height/layout.map.width}_this.setState(function(state){return{selectedFormat:ev.target.value,layout:layout,frameRatio:frameRatio,height:frameRatio?Math.round(state.width*frameRatio):state.height}})});_defineProperty(_this,"layoutChanged",function(ev){var layout=_this.props.theme.print.find(function(item){return item.name===ev.target.value});var frameRatio=layout.map.height/layout.map.width;_this.setState(function(state){return{layout:layout,frameRatio:frameRatio,height:Math.round(state.width*frameRatio)}})});_defineProperty(_this,"renderBody",function(){var _this$state$layout,_this$state$layout2,_this$state$layout3;var formatMap={"image/jpeg":"JPEG","image/png":"PNG","image/tiff":"TIFF","application/pdf":"PDF"};var exportDisabled=_this.state.exporting||_this.state.width===0||_this.state.selectedFormat==="application/pdf"&&!_this.state.layout;var mapName=((_this$state$layout=_this.state.layout)===null||_this$state$layout===void 0||(_this$state$layout=_this$state$layout.map)===null||_this$state$layout===void 0?void 0:_this$state$layout.name)||"";var resolutionChooser=null;if(_this.state.selectedFormat==="application/pdf"){if(!isEmpty(_this.props.theme.printResolutions)){resolutionChooser=/*#__PURE__*/React.createElement("select",{onChange:function onChange(ev){return _this.setState({exportDpi:ev.target.value})},value:_this.state.exportDpi},_this.props.theme.printResolutions.map(function(res){return/*#__PURE__*/React.createElement("option",{disabled:isEmpty(_this.state.layouts),key:res,value:res},res," dpi")}))}else{resolutionChooser=/*#__PURE__*/React.createElement(NumberInput,{decimals:0,max:500,min:50,onChange:function onChange(val){return _this.setState({exportDpi:val})},suffix:" dpi",value:_this.state.exportDpi})}}else{resolutionChooser=/*#__PURE__*/React.createElement("select",{onChange:function onChange(ev){return _this.setState({exportScaleFactor:ev.target.value})},value:_this.state.exportScaleFactor},[100,150,200,250,300,350,400,450,500].map(function(res){return/*#__PURE__*/React.createElement("option",{key:res,value:res},res,"%")}))}return/*#__PURE__*/React.createElement("div",{className:"mapexport-body"},/*#__PURE__*/React.createElement("form",{onSubmit:_this["export"]},/*#__PURE__*/React.createElement("table",{className:"options-table"},/*#__PURE__*/React.createElement("tbody",null,/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",null,LocaleUtils.tr("mapexport.format")),/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement("select",{name:"FORMAT",onChange:_this.formatChanged,value:_this.state.selectedFormat},Object.entries(formatMap).map(function(_ref2){var _ref3=_slicedToArray(_ref2,2),format=_ref3[0],label=_ref3[1];return/*#__PURE__*/React.createElement("option",{key:format,value:format},label)})))),_this.state.selectedFormat==="application/pdf"?/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",null,LocaleUtils.tr("print.layout")),/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement("select",{onChange:_this.layoutChanged,value:_this.state.layout.name},_this.state.layouts.map(function(item){return/*#__PURE__*/React.createElement("option",{key:item.name,value:item.name},item.name.split("/").pop())})))):null,/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",null,LocaleUtils.tr("mapexport.resolution")),/*#__PURE__*/React.createElement("td",null,resolutionChooser)),_this.state.selectedFormat==="application/pdf"?(((_this$state$layout2=_this.state.layout)===null||_this$state$layout2===void 0?void 0:_this$state$layout2.labels)||[]).map(function(label){var _this$props$theme$pri4;// Omit labels which start with __
8
- if(label.startsWith("__")){return null}var opts=_objectSpread({rows:1,name:label.toUpperCase()},(_this$props$theme$pri4=_this.props.theme.printLabelConfig)===null||_this$props$theme$pri4===void 0?void 0:_this$props$theme$pri4[label]);return _this.renderPrintLabelField(label,opts)}):null)),_this.state.selectedFormat==="application/pdf"?/*#__PURE__*/React.createElement("div",null,/*#__PURE__*/React.createElement("input",{name:"TEMPLATE",type:"hidden",value:((_this$state$layout3=_this.state.layout)===null||_this$state$layout3===void 0?void 0:_this$state$layout3.name)||""}),/*#__PURE__*/React.createElement("input",{name:"csrf_token",type:"hidden",value:MiscUtils.getCsrfToken()}),/*#__PURE__*/React.createElement("input",{name:mapName+":extent",readOnly:true,type:"hidden",value:"0,0,0,0"}),/*#__PURE__*/React.createElement("input",{name:"SERVICE",readOnly:true,type:"hidden",value:"WMS"}),/*#__PURE__*/React.createElement("input",{name:"VERSION",readOnly:true,type:"hidden",value:_this.props.theme.version}),/*#__PURE__*/React.createElement("input",{name:"REQUEST",readOnly:true,type:"hidden",value:"GetPrint"}),/*#__PURE__*/React.createElement("input",{name:"TRANSPARENT",readOnly:true,type:"hidden",value:"true"}),/*#__PURE__*/React.createElement("input",{name:"SRS",readOnly:true,type:"hidden",value:_this.props.theme.mapCrs}),/*#__PURE__*/React.createElement("input",{name:"LAYERS",readOnly:true,type:"hidden",value:""}),/*#__PURE__*/React.createElement("input",{name:mapName+":LAYERS",readOnly:true,type:"hidden",value:""})):null,/*#__PURE__*/React.createElement("div",{className:"button-bar"},/*#__PURE__*/React.createElement("button",{className:"button",disabled:exportDisabled,type:"submit"},_this.state.exporting?/*#__PURE__*/React.createElement("span",{className:"mapexport-wait"},/*#__PURE__*/React.createElement(Spinner,null)," ",LocaleUtils.tr("mapexport.wait")):LocaleUtils.tr("mapexport.submit")))))});_defineProperty(_this,"renderExportFrame",function(){var boxStyle={left:_this.state.x+"px",top:_this.state.y+"px",width:_this.state.width+"px",height:_this.state.height+"px"};return/*#__PURE__*/React.createElement("div",{className:"mapexport3d-event-container",onPointerDown:_this.startSelection},/*#__PURE__*/React.createElement("div",{className:"mapexport3d-frame",style:boxStyle},/*#__PURE__*/React.createElement("span",{className:"mapexport3d-frame-label"},_this.state.width+" x "+_this.state.height)))});_defineProperty(_this,"startSelection",function(ev){if(ev.shiftKey){var target=ev.currentTarget;var view=ev.view;view.addEventListener("pointerup",function(){target.style.pointerEvents="";view.document.body.style.userSelect=""},{once:true});// Move behind
9
- target.style.pointerEvents="none";view.document.body.style.userSelect="none";_this.props.sceneContext.scene.domElement.dispatchEvent(new PointerEvent("pointerdown",ev));return}else if(ev.button===0){var rect=ev.currentTarget.getBoundingClientRect();_this.setState({x:Math.round(ev.clientX-rect.left),y:Math.round(ev.clientY-rect.top),width:0,height:0});var onMouseMove=function onMouseMove(event){_this.setState(function(state){var ratio=_this.state.frameRatio;var width=Math.round(Math.max(0,Math.round(event.clientX-rect.left)-state.x));var height=ratio?Math.round(width*ratio):Math.round(Math.max(0,Math.round(event.clientY-rect.top)-state.y));return{width:width,height:height}})};ev.view.addEventListener("pointermove",onMouseMove);ev.view.addEventListener("pointerup",function(){ev.view.removeEventListener("pointermove",onMouseMove)},{once:true})}});_defineProperty(_this,"takeScreenshot",function(scale,window){var renderer=_this.props.sceneContext.scene.renderer;var scene=_this.props.sceneContext.scene.scene;var camera=_this.props.sceneContext.scene.view.camera;var originalSize=renderer.getSize(new Vector2);var originalRenderTarget=renderer.getRenderTarget();var renderWidth=Math.round(originalSize.x*scale);var renderHeight=Math.round(originalSize.y*scale);var winX=Math.round(window.x*scale);var winY=Math.round(window.y*scale);var winWidth=Math.round(window.width*scale);var winHeight=Math.round(window.height*scale);// Render to high-resolution offscreen target
7
+ */import React from"react";import{connect}from"react-redux";import axios from"axios";import FileSaver from"file-saver";import formDataEntries from"formdata-json";import isEmpty from"lodash.isempty";import PropTypes from"prop-types";import{SRGBColorSpace,Vector2,WebGLRenderTarget}from"three";import utif from"utif";import{setCurrentTask}from"../../actions/task";import LocaleUtils from"../../utils/LocaleUtils";import MiscUtils from"../../utils/MiscUtils";import ExportSelection from"../ExportSelection";import Icon from"../Icon";import SideBar from"../SideBar";import NumberInput from"../widgets/NumberInput";import Spinner from"../widgets/Spinner";import"./../../plugins/style/MapExport.css";var MapExport3D=/*#__PURE__*/function(_React$Component){function MapExport3D(){var _this;_classCallCheck(this,MapExport3D);for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++){args[_key]=arguments[_key]}_this=_callSuper(this,MapExport3D,[].concat(args));_defineProperty(_this,"state",MapExport3D.defaultState);_defineProperty(_this,"onShow",function(){var _this$props$theme;var rect=_this.props.sceneContext.scene.domElement.getBoundingClientRect();var frame={x:0.125*rect.width,y:0.125*rect.height,width:0.75*rect.width,height:0.75*rect.height};if(!isEmpty((_this$props$theme=_this.props.theme)===null||_this$props$theme===void 0?void 0:_this$props$theme.print)){var _ref,_this$props$theme$pri,_this$props$theme$pri2,_this$props$theme$pri3;var layouts=_this.props.theme.print.filter(function(l){return l.map}).sort(function(a,b){return a.name.split("/").pop().localeCompare(b.name.split("/").pop(),undefined,{numeric:true})});var exportDpi=(_ref=(_this$props$theme$pri=(_this$props$theme$pri2=_this.props.theme.printResolutions)===null||_this$props$theme$pri2===void 0?void 0:_this$props$theme$pri2.find(function(x){return x===300}))!==null&&_this$props$theme$pri!==void 0?_this$props$theme$pri:(_this$props$theme$pri3=_this.props.theme.printResolutions)===null||_this$props$theme$pri3===void 0?void 0:_this$props$theme$pri3[0])!==null&&_ref!==void 0?_ref:300;_this.setState({layouts:layouts,exportDpi:exportDpi,frame:frame})}else{_this.setState({layouts:[],frame:frame})}});_defineProperty(_this,"onHide",function(){_this.setState(MapExport3D.defaultState)});_defineProperty(_this,"formatChanged",function(ev){var layout="";var frameRatio=null;if(ev.target.value==="application/pdf"){layout=_this.state.layouts.find(function(l){return l["default"]})||_this.state.layouts[0];frameRatio=layout.map.height/layout.map.width}_this.setState(function(state){return{selectedFormat:ev.target.value,layout:layout,frameRatio:frameRatio}})});_defineProperty(_this,"layoutChanged",function(ev){var layout=_this.props.theme.print.find(function(item){return item.name===ev.target.value});var frameRatio=layout.map.height/layout.map.width;_this.setState(function(state){return{layout:layout,frameRatio:frameRatio,height:Math.round(state.width*frameRatio)}})});_defineProperty(_this,"renderBody",function(){var _this$state$layout,_this$state$layout2,_this$state$layout3;var formatMap={"image/jpeg":"JPEG","image/png":"PNG","image/tiff":"TIFF","application/pdf":"PDF"};var exportDisabled=_this.state.exporting||_this.state.width===0||_this.state.selectedFormat==="application/pdf"&&!_this.state.layout;var mapName=((_this$state$layout=_this.state.layout)===null||_this$state$layout===void 0||(_this$state$layout=_this$state$layout.map)===null||_this$state$layout===void 0?void 0:_this$state$layout.name)||"";var resolutionChooser=null;if(_this.state.selectedFormat==="application/pdf"){if(!isEmpty(_this.props.theme.printResolutions)){resolutionChooser=/*#__PURE__*/React.createElement("select",{onChange:function onChange(ev){return _this.setState({exportDpi:ev.target.value})},value:_this.state.exportDpi},_this.props.theme.printResolutions.map(function(res){return/*#__PURE__*/React.createElement("option",{disabled:isEmpty(_this.state.layouts),key:res,value:res},res," dpi")}))}else{resolutionChooser=/*#__PURE__*/React.createElement(NumberInput,{decimals:0,max:500,min:50,onChange:function onChange(val){return _this.setState({exportDpi:val})},suffix:" dpi",value:_this.state.exportDpi})}}else{resolutionChooser=/*#__PURE__*/React.createElement("select",{onChange:function onChange(ev){return _this.setState({exportScaleFactor:ev.target.value})},value:_this.state.exportScaleFactor},[100,150,200,250,300,350,400,450,500].map(function(res){return/*#__PURE__*/React.createElement("option",{key:res,value:res},res,"%")}))}return/*#__PURE__*/React.createElement("div",{className:"mapexport-body"},/*#__PURE__*/React.createElement("form",{onSubmit:_this["export"]},/*#__PURE__*/React.createElement("table",{className:"options-table"},/*#__PURE__*/React.createElement("tbody",null,/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",null,LocaleUtils.tr("mapexport.format")),/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement("select",{name:"FORMAT",onChange:_this.formatChanged,value:_this.state.selectedFormat},Object.entries(formatMap).map(function(_ref2){var _ref3=_slicedToArray(_ref2,2),format=_ref3[0],label=_ref3[1];return/*#__PURE__*/React.createElement("option",{key:format,value:format},label)})))),_this.state.selectedFormat==="application/pdf"?/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",null,LocaleUtils.tr("print.layout")),/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement("select",{onChange:_this.layoutChanged,value:_this.state.layout.name},_this.state.layouts.map(function(item){return/*#__PURE__*/React.createElement("option",{key:item.name,value:item.name},item.name.split("/").pop())})))):null,/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",null,LocaleUtils.tr("mapexport.resolution")),/*#__PURE__*/React.createElement("td",null,resolutionChooser)),_this.state.selectedFormat==="application/pdf"?(((_this$state$layout2=_this.state.layout)===null||_this$state$layout2===void 0?void 0:_this$state$layout2.labels)||[]).map(function(label){var _this$props$theme$pri4;// Omit labels which start with __
8
+ if(label.startsWith("__")){return null}var opts=_objectSpread({rows:1,name:label.toUpperCase()},(_this$props$theme$pri4=_this.props.theme.printLabelConfig)===null||_this$props$theme$pri4===void 0?void 0:_this$props$theme$pri4[label]);return _this.renderPrintLabelField(label,opts)}):null)),_this.state.selectedFormat==="application/pdf"?/*#__PURE__*/React.createElement("div",null,/*#__PURE__*/React.createElement("input",{name:"TEMPLATE",type:"hidden",value:((_this$state$layout3=_this.state.layout)===null||_this$state$layout3===void 0?void 0:_this$state$layout3.name)||""}),/*#__PURE__*/React.createElement("input",{name:"csrf_token",type:"hidden",value:MiscUtils.getCsrfToken()}),/*#__PURE__*/React.createElement("input",{name:mapName+":extent",readOnly:true,type:"hidden",value:"0,0,0,0"}),/*#__PURE__*/React.createElement("input",{name:"SERVICE",readOnly:true,type:"hidden",value:"WMS"}),/*#__PURE__*/React.createElement("input",{name:"VERSION",readOnly:true,type:"hidden",value:_this.props.theme.version}),/*#__PURE__*/React.createElement("input",{name:"REQUEST",readOnly:true,type:"hidden",value:"GetPrint"}),/*#__PURE__*/React.createElement("input",{name:"TRANSPARENT",readOnly:true,type:"hidden",value:"true"}),/*#__PURE__*/React.createElement("input",{name:"SRS",readOnly:true,type:"hidden",value:_this.props.theme.mapCrs}),/*#__PURE__*/React.createElement("input",{name:"LAYERS",readOnly:true,type:"hidden",value:""}),/*#__PURE__*/React.createElement("input",{name:mapName+":LAYERS",readOnly:true,type:"hidden",value:""})):null,/*#__PURE__*/React.createElement("div",{className:"button-bar"},/*#__PURE__*/React.createElement("button",{className:"button",disabled:exportDisabled,type:"submit"},_this.state.exporting?/*#__PURE__*/React.createElement("span",{className:"mapexport-wait"},/*#__PURE__*/React.createElement(Spinner,null)," ",LocaleUtils.tr("mapexport.wait")):LocaleUtils.tr("mapexport.submit")))))});_defineProperty(_this,"onFrameChanged",function(frame){var x=frame.x,y=frame.y,width=frame.width,height=frame.height;_this.setState({frame:{x:x,y:y,width:width,height:height}})});_defineProperty(_this,"takeScreenshot",function(scale,window){var renderer=_this.props.sceneContext.scene.renderer;var scene=_this.props.sceneContext.scene.scene;var camera=_this.props.sceneContext.scene.view.camera;var originalSize=renderer.getSize(new Vector2);var originalRenderTarget=renderer.getRenderTarget();var renderWidth=Math.round(originalSize.x*scale);var renderHeight=Math.round(originalSize.y*scale);var winX=Math.round(window.x*scale);var winY=Math.round(window.y*scale);var winWidth=Math.round(window.width*scale);var winHeight=Math.round(window.height*scale);// Render to high-resolution offscreen target
10
9
  var renderTarget=new WebGLRenderTarget(renderWidth,renderHeight,{colorSpace:SRGBColorSpace});renderer.setSize(renderWidth,renderHeight);renderer.setPixelRatio(1);// important! avoid devicePixelRatio scaling
11
10
  renderer.setRenderTarget(renderTarget);renderer.render(scene,camera);renderer.setRenderTarget(null);// Read the pixels from the render target and write to offscreen canvas
12
11
  var readBuffer=new Uint8Array(renderWidth*renderHeight*4);renderer.readRenderTargetPixels(renderTarget,0,0,renderWidth,renderHeight,readBuffer);var canvas=document.createElement("canvas");canvas.width=winWidth;canvas.height=winHeight;var context=canvas.getContext("2d");var imageData=context.createImageData(winWidth,winHeight);for(var y=0;y<winHeight;y++){var srcRow=(winX+(renderHeight-1-winY-y)*renderWidth)*4;var destRow=y*winWidth*4;imageData.data.set(readBuffer.subarray(srcRow,srcRow+winWidth*4),destRow)}context.putImageData(imageData,0,0);// Restore original renderer target
13
- renderer.setSize(originalSize.x,originalSize.y);renderer.setPixelRatio(window.devicePixelRatio);renderer.setRenderTarget(originalRenderTarget);renderer.render(scene,camera);return{canvas:canvas,imageData:imageData}});_defineProperty(_this,"export",function(ev){ev.preventDefault();if(_this.state.width<=0||_this.state.height<=0){return}var form=ev.target;var exportScale=_this.state.exportScaleFactor/100;if(_this.state.selectedFormat==="application/pdf"){var mapWidthMM=_this.state.layout.map.width;var exportWidthPx=_this.state.width;exportScale=Math.min(5,_this.state.exportDpi/(exportWidthPx*25.4/mapWidthMM))}_this.setState({exporting:true});var _this$takeScreenshot=_this.takeScreenshot(exportScale,_this.state),canvas=_this$takeScreenshot.canvas,context=_this$takeScreenshot.context;if(_this.state.selectedFormat==="application/pdf"){canvas.toBlob(function(blob){blob.arrayBuffer().then(function(imgBuffer){return _this.exportToPdf(form,imgBuffer)})},"image/png")}else if(_this.state.selectedFormat==="image/tiff"){var imageData=context.getImageData(0,0,canvas.width,canvas.height);var blob=new Blob([utif.encodeImage(imageData.data,canvas.width,canvas.height)],{type:"image/tiff"});FileSaver.saveAs(blob,"export."+_this.state.selectedFormat.replace(/.*\//,""));_this.setState({exporting:false})}else{canvas.toBlob(function(blob){FileSaver.saveAs(blob,"export."+_this.state.selectedFormat.replace(/.*\//,""));_this.setState({exporting:false})},_this.state.selectedFormat)}});_defineProperty(_this,"renderPrintLabelField",function(label,opts){var defaultValue=opts.defaultValue||"";var autopopulated=false;if(label===_this.props.theme.printLabelForSearchResult){defaultValue=_this.getSearchMarkerLabel();autopopulated=true}else if(label===_this.props.theme.printLabelForAttribution){defaultValue=_this.getAttributionLabel();autopopulated=true}if(autopopulated&&_this.props.hideAutopopulatedFields){return/*#__PURE__*/React.createElement("tr",{key:"label."+label},/*#__PURE__*/React.createElement("td",{colSpan:"2"},/*#__PURE__*/React.createElement("input",{defaultValue:defaultValue,name:opts.name,type:"hidden"})))}else{if(opts.options){return/*#__PURE__*/React.createElement("tr",{key:"label."+label},/*#__PURE__*/React.createElement("td",null,MiscUtils.capitalizeFirst(label)),/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement("select",{defaultValue:defaultValue,name:opts.name},opts.options.map(function(value){return/*#__PURE__*/React.createElement("option",{key:value,value:value},value)}))))}else{var style={};if(opts.rows||opts.cols){style.resize="none"}if(opts.cols){style.width="initial"}return/*#__PURE__*/React.createElement("tr",{key:"label."+label},/*#__PURE__*/React.createElement("td",null,MiscUtils.capitalizeFirst(label)),/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement("textarea",_extends({},opts,{defaultValue:defaultValue,readOnly:autopopulated,style:style}))))}}});_defineProperty(_this,"getSearchMarkerLabel",function(){// TODO
12
+ renderer.setSize(originalSize.x,originalSize.y);renderer.setPixelRatio(window.devicePixelRatio);renderer.setRenderTarget(originalRenderTarget);renderer.render(scene,camera);return{canvas:canvas,imageData:imageData}});_defineProperty(_this,"export",function(ev){ev.preventDefault();if(!_this.state.frame||_this.state.frame.width<=0||_this.state.frame.height<=0){return}var form=ev.target;var exportScale=_this.state.exportScaleFactor/100;if(_this.state.selectedFormat==="application/pdf"){var mapWidthMM=_this.state.layout.map.width;var exportWidthPx=_this.state.width;exportScale=Math.min(5,_this.state.exportDpi/(exportWidthPx*25.4/mapWidthMM))}_this.setState({exporting:true});var _this$takeScreenshot=_this.takeScreenshot(exportScale,_this.state.frame),canvas=_this$takeScreenshot.canvas,context=_this$takeScreenshot.context;if(_this.state.selectedFormat==="application/pdf"){canvas.toBlob(function(blob){blob.arrayBuffer().then(function(imgBuffer){return _this.exportToPdf(form,imgBuffer)})},"image/png")}else if(_this.state.selectedFormat==="image/tiff"){var imageData=context.getImageData(0,0,canvas.width,canvas.height);var blob=new Blob([utif.encodeImage(imageData.data,canvas.width,canvas.height)],{type:"image/tiff"});FileSaver.saveAs(blob,"export."+_this.state.selectedFormat.replace(/.*\//,""));_this.setState({exporting:false})}else{canvas.toBlob(function(blob){FileSaver.saveAs(blob,"export."+_this.state.selectedFormat.replace(/.*\//,""));_this.setState({exporting:false})},_this.state.selectedFormat)}});_defineProperty(_this,"renderPrintLabelField",function(label,opts){var defaultValue=opts.defaultValue||"";var autopopulated=false;if(label===_this.props.theme.printLabelForSearchResult){defaultValue=_this.getSearchMarkerLabel();autopopulated=true}else if(label===_this.props.theme.printLabelForAttribution){defaultValue=_this.getAttributionLabel();autopopulated=true}if(autopopulated&&_this.props.hideAutopopulatedFields){return/*#__PURE__*/React.createElement("tr",{key:"label."+label},/*#__PURE__*/React.createElement("td",{colSpan:"2"},/*#__PURE__*/React.createElement("input",{defaultValue:defaultValue,name:opts.name,type:"hidden"})))}else{if(opts.options){return/*#__PURE__*/React.createElement("tr",{key:"label."+label},/*#__PURE__*/React.createElement("td",null,MiscUtils.capitalizeFirst(label)),/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement("select",{defaultValue:defaultValue,name:opts.name},opts.options.map(function(value){return/*#__PURE__*/React.createElement("option",{key:value,value:value},value)}))))}else{var style={};if(opts.rows||opts.cols){style.resize="none"}if(opts.cols){style.width="initial"}return/*#__PURE__*/React.createElement("tr",{key:"label."+label},/*#__PURE__*/React.createElement("td",null,MiscUtils.capitalizeFirst(label)),/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement("textarea",_extends({},opts,{defaultValue:defaultValue,readOnly:autopopulated,style:style}))))}}});_defineProperty(_this,"getSearchMarkerLabel",function(){// TODO
14
13
  return""});_defineProperty(_this,"getAttributionLabel",function(){// TODO
15
- return""});return _this}_inherits(MapExport3D,_React$Component);return _createClass(MapExport3D,[{key:"render",value:function render(){var _this2=this;var minMaxTooltip=this.state.minimized?LocaleUtils.tr("print.maximize"):LocaleUtils.tr("print.minimize");var minMaxIcon=this.state.minimized?"chevron-down":"chevron-up";var extraTitlebarContent=/*#__PURE__*/React.createElement(Icon,{className:"mapexport-minimize-maximize",icon:minMaxIcon,onClick:function onClick(){return _this2.setState(function(state){return{minimized:!state.minimized}})},title:minMaxTooltip});return/*#__PURE__*/React.createElement(SideBar,{extraClasses:"MapExport",extraTitlebarContent:extraTitlebarContent,icon:"rasterexport",id:"MapExport3D",onShow:this.onShow,title:LocaleUtils.tr("appmenu.items.MapExport3D"),width:"20em"},function(){return{body:_this2.renderBody(),extra:_this2.renderExportFrame()}})}},{key:"exportToPdf",value:function(){var _exportToPdf=_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee(form,imgBuffer){var formData,data,config,response,_yield$import,PDFDocument,doc,page,pngImage,x,y,width,height,pdfData,blob;return _regeneratorRuntime().wrap(function _callee$(_context){while(1)switch(_context.prev=_context.next){case 0:formData=_objectSpread(_objectSpread({},formDataEntries(new FormData(form))),Object.fromEntries((this.props.theme.extraPrintParameters||"").split("&").filter(Boolean).map(function(entry){return entry.split("=")})));data=Object.entries(formData).map(function(pair){return pair.map(function(entry){return encodeURIComponent(entry).replace(/%20/g,"+")}).join("=")}).join("&");config={headers:{"Content-Type":"application/x-www-form-urlencoded"},responseType:"arraybuffer"};_context.next=5;return axios.post(this.props.theme.printUrl,data,config);case 5:response=_context.sent;if(!response){_context.next=31;break}_context.next=9;return import("pdf-lib");case 9:_yield$import=_context.sent;PDFDocument=_yield$import.PDFDocument;_context.next=13;return PDFDocument.load(response.data);case 13:doc=_context.sent;page=doc.getPages()[0];_context.next=17;return doc.embedPng(imgBuffer);case 17:pngImage=_context.sent;x=this.state.layout.map.x*2.8346;y=this.state.layout.map.y*2.8346;width=this.state.layout.map.width*2.8346;height=this.state.layout.map.height*2.8346;page.drawImage(pngImage,{x:x,y:y,width:width,height:height});_context.next=25;return doc.save();case 25:pdfData=_context.sent;blob=new Blob([pdfData],{type:"application/pdf"});FileSaver.saveAs(blob,this.state.layout.name+".pdf");this.setState({exporting:false});_context.next=33;break;case 31:/* eslint-disable-next-line */alert("Print failed");this.setState({exporting:false});case 33:case"end":return _context.stop()}},_callee,this)}));function exportToPdf(_x,_x2){return _exportToPdf.apply(this,arguments)}return exportToPdf}()}])}(React.Component);_defineProperty(MapExport3D,"propTypes",{hideAutopopulatedFields:PropTypes.bool,sceneContext:PropTypes.object,setCurrentTask:PropTypes.func,theme:PropTypes.object});_defineProperty(MapExport3D,"defaultState",{minimized:false,layouts:[],selectedFormat:"image/jpeg",layout:"",x:0,y:0,width:0,height:0,frameRatio:null,exporting:false,exportScaleFactor:100,exportDpi:300});export default connect(function(state){return{theme:state.theme.current}},{setCurrentTask:setCurrentTask})(MapExport3D);
14
+ return""});return _this}_inherits(MapExport3D,_React$Component);return _createClass(MapExport3D,[{key:"render",value:function render(){var _this2=this;var minMaxTooltip=this.state.minimized?LocaleUtils.tr("print.maximize"):LocaleUtils.tr("print.minimize");var minMaxIcon=this.state.minimized?"chevron-down":"chevron-up";var extraTitlebarContent=/*#__PURE__*/React.createElement(Icon,{className:"mapexport-minimize-maximize",icon:minMaxIcon,onClick:function onClick(){return _this2.setState(function(state){return{minimized:!state.minimized}})},title:minMaxTooltip});return/*#__PURE__*/React.createElement(SideBar,{extraClasses:"MapExport",extraTitlebarContent:extraTitlebarContent,icon:"rasterexport",id:"MapExport3D",onShow:this.onShow,title:LocaleUtils.tr("appmenu.items.MapExport3D"),width:"20em"},function(){return{body:_this2.renderBody(),extra:/*#__PURE__*/React.createElement(ExportSelection,{frame:_this2.state.frame,frameRatio:_this2.state.frameRatio,mapElement:_this2.props.sceneContext.scene.domElement,onFrameChanged:_this2.onFrameChanged})}})}},{key:"exportToPdf",value:function(){var _exportToPdf=_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee(form,imgBuffer){var formData,data,config,response,_yield$import,PDFDocument,doc,page,pngImage,x,y,width,height,pdfData,blob;return _regeneratorRuntime().wrap(function _callee$(_context){while(1)switch(_context.prev=_context.next){case 0:formData=_objectSpread(_objectSpread({},formDataEntries(new FormData(form))),Object.fromEntries((this.props.theme.extraPrintParameters||"").split("&").filter(Boolean).map(function(entry){return entry.split("=")})));data=Object.entries(formData).map(function(pair){return pair.map(function(entry){return encodeURIComponent(entry).replace(/%20/g,"+")}).join("=")}).join("&");config={headers:{"Content-Type":"application/x-www-form-urlencoded"},responseType:"arraybuffer"};_context.next=5;return axios.post(this.props.theme.printUrl,data,config);case 5:response=_context.sent;if(!response){_context.next=31;break}_context.next=9;return import("pdf-lib");case 9:_yield$import=_context.sent;PDFDocument=_yield$import.PDFDocument;_context.next=13;return PDFDocument.load(response.data);case 13:doc=_context.sent;page=doc.getPages()[0];_context.next=17;return doc.embedPng(imgBuffer);case 17:pngImage=_context.sent;x=this.state.layout.map.x*2.8346;y=this.state.layout.map.y*2.8346;width=this.state.layout.map.width*2.8346;height=this.state.layout.map.height*2.8346;page.drawImage(pngImage,{x:x,y:y,width:width,height:height});_context.next=25;return doc.save();case 25:pdfData=_context.sent;blob=new Blob([pdfData],{type:"application/pdf"});FileSaver.saveAs(blob,this.state.layout.name+".pdf");this.setState({exporting:false});_context.next=33;break;case 31:/* eslint-disable-next-line */alert("Print failed");this.setState({exporting:false});case 33:case"end":return _context.stop()}},_callee,this)}));function exportToPdf(_x,_x2){return _exportToPdf.apply(this,arguments)}return exportToPdf}()}])}(React.Component);_defineProperty(MapExport3D,"propTypes",{hideAutopopulatedFields:PropTypes.bool,sceneContext:PropTypes.object,setCurrentTask:PropTypes.func,theme:PropTypes.object});_defineProperty(MapExport3D,"defaultState",{minimized:false,layouts:[],selectedFormat:"image/jpeg",layout:"",frame:null,frameRatio:null,exporting:false,exportScaleFactor:100,exportDpi:300});export default connect(function(state){return{theme:state.theme.current}},{setCurrentTask:setCurrentTask})(MapExport3D);
@@ -0,0 +1,7 @@
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)}/**
2
+ * Copyright 2025 Sourcepole AG
3
+ * All rights reserved.
4
+ *
5
+ * This source code is licensed under the BSD-style license found in the
6
+ * LICENSE file in the root directory of this source tree.
7
+ */import React from"react";import PropTypes from"prop-types";import LocaleUtils from"../../utils/LocaleUtils";import SideBar from"../SideBar";import Input from"../widgets/Input";import"./style/Settings3D.css";var Settings3D=/*#__PURE__*/function(_React$Component){function Settings3D(){var _this;_classCallCheck(this,Settings3D);for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++){args[_key]=arguments[_key]}_this=_callSuper(this,Settings3D,[].concat(args));_defineProperty(_this,"renderBody",function(){return/*#__PURE__*/React.createElement("div",{className:"settings3d-body"},/*#__PURE__*/React.createElement("table",null,/*#__PURE__*/React.createElement("tbody",null,/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",null,LocaleUtils.tr("settings3d.quality")),/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement(Input,{max:100,min:20,onChange:_this.qualityChanged,step:20,type:"range",value:_this.props.sceneContext.settings.sceneQuality}))))))});_defineProperty(_this,"qualityChanged",function(value){_this.props.sceneContext.setSetting("sceneQuality",parseInt(value,10))});return _this}_inherits(Settings3D,_React$Component);return _createClass(Settings3D,[{key:"render",value:function render(){var _this2=this;return/*#__PURE__*/React.createElement(SideBar,{icon:"cog",id:"Settings3D",title:LocaleUtils.tr("appmenu.items.Settings3D"),width:"20em"},function(){return{body:_this2.renderBody()}})}}])}(React.Component);_defineProperty(Settings3D,"propTypes",{sceneContext:PropTypes.object});export{Settings3D as default};
@@ -4,4 +4,4 @@ function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof
4
4
  *
5
5
  * This source code is licensed under the BSD-style license found in the
6
6
  * LICENSE file in the root directory of this source tree.
7
- */import React from"react";import{connect}from"react-redux";import classNames from"classnames";import PropTypes from"prop-types";import{toggleFullscreen,View3DMode}from"../../actions/display";import{openExternalUrl,setTopbarHeight}from"../../actions/windows";import ConfigUtils from"../../utils/ConfigUtils";import LocaleUtils from"../../utils/LocaleUtils";import AppMenu from"../AppMenu";import FullscreenSwitcher from"../FullscreenSwitcher";import{Swipeable}from"../Swipeable";import SearchField3D from"./SearchField3D";var TopBar3D=/*#__PURE__*/function(_React$Component){function TopBar3D(){var _this;_classCallCheck(this,TopBar3D);for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++){args[_key]=arguments[_key]}_this=_callSuper(this,TopBar3D,[].concat(args));_defineProperty(_this,"state",{});_defineProperty(_this,"storeHeight",function(el){if(el){_this.props.setTopbarHeight(el.clientHeight)}});_defineProperty(_this,"openUrl",function(url,target,title,icon){if(target==="iframe"){target=":iframedialog:externallinkiframe"}_this.props.openExternalUrl(url,target,{title:title,icon:icon})});_defineProperty(_this,"addGenericMenuItems",function(menuItems,inputConfig){inputConfig.forEach(function(entry){if(entry.subitems){var group=[];_this.addGenericMenuItems(group,entry.subitems);if(group.length>0){menuItems.push(_objectSpread(_objectSpread({},entry),{},{subitems:group}))}}else{var pluginConfig=ConfigUtils.getPluginConfig(entry.key);if(entry.url||pluginConfig.availableIn3D){menuItems.push(entry)}}})});return _this}_inherits(TopBar3D,_React$Component);return _createClass(TopBar3D,[{key:"render",value:function render(){var _this2=this;var config=ConfigUtils.getPluginConfig("TopBar").cfg;var menuItems=[{key:"LayerTree3D",icon:"layers"},{key:"Draw3D",icon:"draw"},{key:"Measure3D",icon:"measure"},{key:"Compare3D",icon:"compare"},{key:"HideObjects3D",icon:"eye"},{key:"MapLight3D",icon:"light"},{key:"MapExport3D",icon:"rasterexport"},{key:"ExportObjects3D",icon:"export"}];if(this.props.view3dMode===View3DMode.FULLSCREEN){this.addGenericMenuItems(menuItems,config.menuItems)}var logo;var assetsPath=ConfigUtils.getAssetsPath();var isMobile=ConfigUtils.isMobile();if(isMobile){logo=assetsPath+"/img/logo-mobile."+(config.logoFormat||"svg")}else{logo=assetsPath+"/img/logo."+(config.logoFormat||"svg")}var logoEl=/*#__PURE__*/React.createElement("img",{className:"topbar-logo",src:config.logoSrc||logo});if(config.logoUrl){logoEl=/*#__PURE__*/React.createElement("a",{href:config.logoUrl,rel:"noreferrer",target:"_blank"},logoEl)}var menuCompact=!isMobile?config.appMenuCompact:false;var classes=classNames({TopBar:true,mobile:isMobile,fullscreen:this.props.fullscreen});return/*#__PURE__*/React.createElement(Swipeable,{onSwipedDown:function onSwipedDown(){return _this2.props.toggleFullscreen(false)},onSwipedUp:function onSwipedUp(){return _this2.props.toggleFullscreen(true)}},/*#__PURE__*/React.createElement("div",{className:classes,ref:this.storeHeight},logoEl,/*#__PURE__*/React.createElement("div",{className:"topbar-center-span"},/*#__PURE__*/React.createElement("div",{className:"topbar-search-container"},/*#__PURE__*/React.createElement(SearchField3D,{sceneContext:this.props.sceneContext,searchProviders:this.props.searchProviders}))),/*#__PURE__*/React.createElement(AppMenu,{appMenuClearsTask:config.appMenuClearsTask,appMenuShortcut:config.appMenuShortcut,buttonLabel:LocaleUtils.tr("appmenu.menulabel"),keepMenuOpen:menuCompact,menuCompact:menuCompact,menuItems:menuItems,openExternalUrl:this.openUrl,showFilterField:config.appMenuFilterField}),this.props.view3dMode===View3DMode.FULLSCREEN?/*#__PURE__*/React.createElement(FullscreenSwitcher,null):null))}}])}(React.Component);_defineProperty(TopBar3D,"propTypes",{fullscreen:PropTypes.bool,openExternalUrl:PropTypes.func,sceneContext:PropTypes.object,searchProviders:PropTypes.object,setTopbarHeight:PropTypes.func,toggleFullscreen:PropTypes.func,view3dMode:PropTypes.number});export default connect(function(state){return{fullscreen:state.display.fullscreen,view3dMode:state.display.view3dMode}},{setTopbarHeight:setTopbarHeight,toggleFullscreen:toggleFullscreen,openExternalUrl:openExternalUrl})(TopBar3D);
7
+ */import React from"react";import{connect}from"react-redux";import classNames from"classnames";import PropTypes from"prop-types";import{toggleFullscreen,View3DMode}from"../../actions/display";import{openExternalUrl,setTopbarHeight}from"../../actions/windows";import ConfigUtils from"../../utils/ConfigUtils";import LocaleUtils from"../../utils/LocaleUtils";import AppMenu from"../AppMenu";import FullscreenSwitcher from"../FullscreenSwitcher";import{Swipeable}from"../Swipeable";import SearchField3D from"./SearchField3D";var TopBar3D=/*#__PURE__*/function(_React$Component){function TopBar3D(){var _this;_classCallCheck(this,TopBar3D);for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++){args[_key]=arguments[_key]}_this=_callSuper(this,TopBar3D,[].concat(args));_defineProperty(_this,"state",{});_defineProperty(_this,"storeHeight",function(el){if(el){_this.props.setTopbarHeight(el.clientHeight)}});_defineProperty(_this,"openUrl",function(url,target,title,icon){if(target==="iframe"){target=":iframedialog:externallinkiframe"}_this.props.openExternalUrl(url,target,{title:title,icon:icon})});_defineProperty(_this,"addGenericMenuItems",function(menuItems,inputConfig){inputConfig.forEach(function(entry){if(entry.subitems){var group=[];_this.addGenericMenuItems(group,entry.subitems);if(group.length>0){menuItems.push(_objectSpread(_objectSpread({},entry),{},{subitems:group}))}}else{var pluginConfig=ConfigUtils.getPluginConfig(entry.key);if(entry.url||pluginConfig.availableIn3D){menuItems.push(entry)}}})});return _this}_inherits(TopBar3D,_React$Component);return _createClass(TopBar3D,[{key:"render",value:function render(){var _this2=this;var config=ConfigUtils.getPluginConfig("TopBar").cfg;var menuItems=[{key:"LayerTree3D",icon:"layers"},{key:"Draw3D",icon:"draw"},{key:"Measure3D",icon:"measure"},{key:"Compare3D",icon:"compare"},{key:"HideObjects3D",icon:"eye"},{key:"MapLight3D",icon:"light"},{key:"MapExport3D",icon:"rasterexport"},{key:"ExportObjects3D",icon:"export"},{key:"Settings3D",icon:"cog"}];if(this.props.view3dMode===View3DMode.FULLSCREEN){this.addGenericMenuItems(menuItems,config.menuItems)}var logo;var assetsPath=ConfigUtils.getAssetsPath();var isMobile=ConfigUtils.isMobile();if(isMobile){logo=assetsPath+"/img/logo-mobile."+(config.logoFormat||"svg")}else{logo=assetsPath+"/img/logo."+(config.logoFormat||"svg")}var logoEl=/*#__PURE__*/React.createElement("img",{className:"topbar-logo",src:config.logoSrc||logo});if(config.logoUrl){logoEl=/*#__PURE__*/React.createElement("a",{href:config.logoUrl,rel:"noreferrer",target:"_blank"},logoEl)}var menuCompact=!isMobile?config.appMenuCompact:false;var classes=classNames({TopBar:true,mobile:isMobile,fullscreen:this.props.fullscreen});return/*#__PURE__*/React.createElement(Swipeable,{onSwipedDown:function onSwipedDown(){return _this2.props.toggleFullscreen(false)},onSwipedUp:function onSwipedUp(){return _this2.props.toggleFullscreen(true)}},/*#__PURE__*/React.createElement("div",{className:classes,ref:this.storeHeight},logoEl,/*#__PURE__*/React.createElement("div",{className:"topbar-center-span"},/*#__PURE__*/React.createElement("div",{className:"topbar-search-container"},/*#__PURE__*/React.createElement(SearchField3D,{sceneContext:this.props.sceneContext,searchProviders:this.props.searchProviders}))),/*#__PURE__*/React.createElement(AppMenu,{appMenuClearsTask:config.appMenuClearsTask,appMenuShortcut:config.appMenuShortcut,buttonLabel:LocaleUtils.tr("appmenu.menulabel"),keepMenuOpen:menuCompact,menuCompact:menuCompact,menuItems:menuItems,openExternalUrl:this.openUrl,showFilterField:config.appMenuFilterField}),this.props.view3dMode===View3DMode.FULLSCREEN?/*#__PURE__*/React.createElement(FullscreenSwitcher,null):null))}}])}(React.Component);_defineProperty(TopBar3D,"propTypes",{fullscreen:PropTypes.bool,openExternalUrl:PropTypes.func,sceneContext:PropTypes.object,searchProviders:PropTypes.object,setTopbarHeight:PropTypes.func,toggleFullscreen:PropTypes.func,view3dMode:PropTypes.number});export default connect(function(state){return{fullscreen:state.display.fullscreen,view3dMode:state.display.view3dMode}},{setTopbarHeight:setTopbarHeight,toggleFullscreen:toggleFullscreen,openExternalUrl:openExternalUrl})(TopBar3D);
@@ -4,4 +4,4 @@ function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof
4
4
  *
5
5
  * This source code is licensed under the BSD-style license found in the
6
6
  * 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{setView3dMode,View3DMode}from"../../actions/display";import Icon from"../Icon";import MapButton from"../MapButton";import"./style/View3DSwitcher.css";var View3DSwitcher=/*#__PURE__*/function(_React$Component){function View3DSwitcher(){var _this;_classCallCheck(this,View3DSwitcher);for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++){args[_key]=arguments[_key]}_this=_callSuper(this,View3DSwitcher,[].concat(args));_defineProperty(_this,"state",{expanded:false});_defineProperty(_this,"render",function(){var _activeButton$icon;var buttons=[{mode:View3DMode.DISABLED,icon:"2d"},{mode:View3DMode.FULLSCREEN,icon:"3d"},{mode:View3DMode.SPLITSCREEN,icon:"3d2d"}];var activeButton=buttons.splice(_this.props.view3dMode,1)[0];return/*#__PURE__*/React.createElement(MapButton,{active:_this.state.expanded,busy:_this.props.view3dMode===View3DMode.DISABLING,icon:(_activeButton$icon=activeButton===null||activeButton===void 0?void 0:activeButton.icon)!==null&&_activeButton$icon!==void 0?_activeButton$icon:"",iconSize:"xlarge",onClick:function onClick(){return _this.setState(function(state){return{expanded:!state.expanded}})},position:_this.props.position},/*#__PURE__*/React.createElement("div",{className:"view3d-switcher-buttons"+(_this.state.expanded?" view3d-switcher-buttons-expanded":"")},buttons.map(function(button){return/*#__PURE__*/React.createElement("button",{className:"map-button",key:button.icon,onClick:function onClick(){return _this.switchMode(button.mode)}},/*#__PURE__*/React.createElement(Icon,{icon:button.icon,size:"xlarge"}))})))});_defineProperty(_this,"switchMode",function(mode){_this.props.setView3dMode(mode===View3DMode.DISABLED?View3DMode.DISABLING:mode);_this.setState({expanded:false})});return _this}_inherits(View3DSwitcher,_React$Component);return _createClass(View3DSwitcher)}(React.Component);_defineProperty(View3DSwitcher,"propTypes",{position:PropTypes.number,setView3dMode:PropTypes.func,switchTo:PropTypes.string,view3dMode:PropTypes.number});export default connect(function(state){return{view3dMode:state.display.view3dMode}},{setView3dMode:setView3dMode})(View3DSwitcher);
7
+ */import React from"react";import{connect}from"react-redux";import PropTypes from"prop-types";import{setView3dMode,View3DMode}from"../../actions/display";import Icon from"../Icon";import MapButton from"../MapButton";import"./style/View3DSwitcher.css";var View3DSwitcher=/*#__PURE__*/function(_React$Component){function View3DSwitcher(){var _this;_classCallCheck(this,View3DSwitcher);for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++){args[_key]=arguments[_key]}_this=_callSuper(this,View3DSwitcher,[].concat(args));_defineProperty(_this,"state",{expanded:false});_defineProperty(_this,"render",function(){var buttons=[{mode:View3DMode.DISABLED,icon:"2d"},{mode:View3DMode.FULLSCREEN,icon:"3d"},{mode:View3DMode.SPLITSCREEN,icon:"3d2d"}];return/*#__PURE__*/React.createElement(MapButton,{active:_this.state.expanded,busy:_this.props.view3dMode===View3DMode.DISABLING,icon:"view",iconSize:"xlarge",onClick:function onClick(){return _this.setState(function(state){return{expanded:!state.expanded}})},position:_this.props.position},/*#__PURE__*/React.createElement("div",{className:"view3d-switcher-buttons"+(_this.state.expanded?" view3d-switcher-buttons-expanded":"")},buttons.map(function(button){return/*#__PURE__*/React.createElement("button",{className:"map-button"+(button.mode===_this.props.view3dMode?" map-button-active":""),key:button.icon,onClick:function onClick(){return _this.switchMode(button.mode)}},/*#__PURE__*/React.createElement(Icon,{icon:button.icon,size:"xlarge"}))})))});_defineProperty(_this,"switchMode",function(mode){_this.props.setView3dMode(mode===View3DMode.DISABLED?View3DMode.DISABLING:mode);_this.setState({expanded:false})});return _this}_inherits(View3DSwitcher,_React$Component);return _createClass(View3DSwitcher)}(React.Component);_defineProperty(View3DSwitcher,"propTypes",{position:PropTypes.number,setView3dMode:PropTypes.func,switchTo:PropTypes.string,view3dMode:PropTypes.number});export default connect(function(state){return{view3dMode:state.display.view3dMode}},{setView3dMode:setView3dMode})(View3DSwitcher);
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Copyright 2025 Sourcepole AG
3
+ * All rights reserved.
4
+ *
5
+ * This source code is licensed under the BSD-style license found in the
6
+ * LICENSE file in the root directory of this source tree.
7
+ */import ColorLayer from"@giro3d/giro3d/core/layer/ColorLayer";import GeoTIFFSource from"@giro3d/giro3d/sources/GeoTIFFSource.js";export default{create3d:function create3d(options,projection){return new ColorLayer({name:options.name,source:new GeoTIFFSource({url:options.url,crs:projection})})}};
@@ -5,4 +5,4 @@
5
5
  *
6
6
  * This source code is licensed under the BSD-style license found in the
7
7
  * LICENSE file in the root directory of this source tree.
8
- */import vectorLayer from"./VectorLayer3D";import wfsLayer from"./WFSLayer3D";import wmsLayer from"./WMSLayer3D";import wmtsLayer from"./WMTSLayer3D";export default{vector:vectorLayer,wfs:wfsLayer,wms:wmsLayer,wmts:wmtsLayer};
8
+ */import geotiffLayer from"./GeoTIFFLayer3D";import vectorLayer from"./VectorLayer3D";import wfsLayer from"./WFSLayer3D";import wmsLayer from"./WMSLayer3D";import wmtsLayer from"./WMTSLayer3D";export default{geotiff:geotiffLayer,vector:vectorLayer,wfs:wfsLayer,wms:wmsLayer,wmts:wmtsLayer};
@@ -17,6 +17,7 @@ div.map3d-titlebar > span.icon-remove {
17
17
  }
18
18
 
19
19
  div.map3d-map {
20
+ user-select: none;
20
21
  position: absolute;
21
22
  left: 0;
22
23
  right: 0;
@@ -0,0 +1,11 @@
1
+ div.settings3d-body table {
2
+ width: 100%;
3
+ }
4
+
5
+ div.settings3d-body table td {
6
+ padding: 0 0.25em;
7
+ }
8
+
9
+ div.settings3d-body table td > input {
10
+ width: 100%;
11
+ }
@@ -13,3 +13,7 @@ div.view3d-switcher-buttons-expanded > button:nth-child(1) {
13
13
  div.view3d-switcher-buttons-expanded > button:nth-child(2) {
14
14
  right: 7em;
15
15
  }
16
+
17
+ div.view3d-switcher-buttons-expanded > button:nth-child(3) {
18
+ right: 10.5em;
19
+ }