qwc2 2025.9.3 → 2025.9.15
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.
- package/actions/layers.js +1 -1
- package/actions/theme.js +2 -2
- package/components/AttributeTableWidget.js +2 -2
- package/components/ImportLayer.js +6 -6
- package/components/MapSelection.js +3 -3
- package/components/QtDesignerForm.js +2 -2
- package/components/StandardApp.js +2 -2
- package/components/map/OlLayer.js +3 -3
- package/components/map3d/EditDataset3D.js +2 -2
- package/components/map3d/ImportObjects3D.js +1 -1
- package/components/map3d/Map3D.js +6 -6
- package/components/map3d/MapControls3D.js +3 -3
- package/components/map3d/utils/FirstPersonControls3D.js +5 -7
- package/components/map3d/utils/MiscUtils3D.js +4 -3
- package/components/map3d/utils/OrbitControls3D.js +2 -2
- package/components/style/AttributeTableWidget.css +1 -0
- package/components/style/EditComboField.css +6 -1
- package/icons/move.svg +83 -0
- package/package.json +3 -3
- package/plugins/Editing.js +3 -3
- package/plugins/FeatureForm.js +1 -1
- package/plugins/Print.js +1 -1
- package/plugins/View3D.js +4 -4
- package/plugins/map3d/Identify3D.js +2 -2
- package/plugins/map3d/LayerTree3D.js +1 -1
- package/plugins/map3d/Measure3D.js +1 -1
- package/reducers/layers.js +1 -1
- package/static/translations/bg-BG.json +4 -0
- package/static/translations/ca-ES.json +4 -0
- package/static/translations/cs-CZ.json +4 -0
- package/static/translations/de-CH.json +4 -0
- package/static/translations/de-DE.json +4 -0
- package/static/translations/en-US.json +4 -0
- package/static/translations/es-ES.json +4 -0
- package/static/translations/fi-FI.json +4 -0
- package/static/translations/fr-FR.json +4 -0
- package/static/translations/hu-HU.json +4 -0
- package/static/translations/it-IT.json +4 -0
- package/static/translations/ja-JP.json +4 -0
- package/static/translations/nl-NL.json +4 -0
- package/static/translations/no-NO.json +4 -0
- package/static/translations/pl-PL.json +4 -0
- package/static/translations/pt-BR.json +4 -0
- package/static/translations/pt-PT.json +4 -0
- package/static/translations/ro-RO.json +4 -0
- package/static/translations/ru-RU.json +4 -0
- package/static/translations/sv-SE.json +4 -0
- package/static/translations/tr-TR.json +4 -0
- package/static/translations/tsconfig.json +2 -0
- package/static/translations/uk-UA.json +4 -0
- package/utils/EditingInterface.js +1 -1
- package/utils/EditingUtils.js +1 -1
- package/utils/LayerUtils.js +1 -1
- package/utils/ThemeUtils.js +3 -3
package/plugins/Editing.js
CHANGED
|
@@ -11,10 +11,10 @@ function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof
|
|
|
11
11
|
*
|
|
12
12
|
* This plugin queries the dataset via the editing service specified by
|
|
13
13
|
* `editServiceUrl` in `config.json` (by default the `qwc-data-service`).
|
|
14
|
-
*/var Editing=/*#__PURE__*/function(_React$Component){function Editing(){var _this;_classCallCheck(this,Editing);for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++){args[_key]=arguments[_key]}_this=_callSuper(this,Editing,[].concat(args));_defineProperty(_this,"state",{selectedLayer:null,selectedLayerVisibility:null,pickedFeatures:null,busy:false,minimized:false,drawPick:false});_defineProperty(_this,"onShow",function(){if(_this.props.taskData){_this.changeSelectedLayer(_this.props.taskData.layer,_this.props.taskData.feature)}else{_this.changeSelectedLayer(_this.state.selectedLayer)}_this.props.setSnappingConfig(_this.props.snapping,_this.props.snappingActive)});_defineProperty(_this,"onHide",function(){_this.props.clearEditContext("Editing");_this.setLayerVisibility(_this.state.selectedLayer,_this.state.selectedLayerVisibility);_this.setState({minimized:false,drawPick:false})});_defineProperty(_this,"renderBody",function(){if(!_this.props.theme||isEmpty(_this.props.theme.editConfig)){return/*#__PURE__*/React.createElement("div",{role:"body",style:{padding:"1em"}},LocaleUtils.tr("editing.noeditablelayers"))}var editConfig=_this.props.theme.editConfig;var curConfig=editConfig[_this.state.selectedLayer];if(!curConfig){return/*#__PURE__*/React.createElement("div",{role:"body",style:{padding:"1em"}},LocaleUtils.tr("editing.noeditablelayers"))}var editPermissions=curConfig.permissions||{};var actionButtons=[];actionButtons.push({key:"Pick",icon:"pick",label:LocaleUtils.tr("editing.pick"),data:{action:"Pick",feature:null}});if(editPermissions.creatable!==false&&!_this.props.editContext.geomReadOnly){actionButtons.push({key:"Draw",icon:"editdraw",label:LocaleUtils.tr("editing.draw"),data:{action:"Draw"}})}if(ConfigUtils.havePlugin("AttributeTable")){actionButtons.push({key:"AttribTable",icon:"editing",label:LocaleUtils.tr("editing.attrtable"),data:{action:"AttrTable"}})}var featureSelection=null;if(_this.state.pickedFeatures&&_this.state.pickedFeatures.length>1){var featureText=LocaleUtils.tr("editing.feature");featureSelection=/*#__PURE__*/React.createElement("div",{className:"editing-feature-selection"},/*#__PURE__*/React.createElement("select",{className:"combo editing-feature-select",disabled:_this.props.editContext.changed===true||_this.props.editContext.id!==_this.props.currentEditContext,onChange:function onChange(ev){return _this.setEditFeature(ev.target.value)},value:(_this.props.editContext.feature||{}).id||""},_this.state.pickedFeatures.map(function(feature){return/*#__PURE__*/React.createElement("option",{key:feature.id,value:feature.id},curConfig.displayField?feature.properties[curConfig.displayField]:featureText+" "+feature.id)})))}var pickBar=null;if(_this.props.allowCloneGeometry&&(_this.props.editContext.action==="Draw"||_this.state.drawPick)&&!(_this.props.editContext.feature||{}).geometry){var pickButtons=[{key:"DrawPick",icon:"pick",label:LocaleUtils.tr("editing.pickdrawfeature")}];pickBar=/*#__PURE__*/React.createElement(ButtonBar,{active:_this.state.drawPick?"DrawPick":null,buttons:pickButtons,onClick:_this.toggleDrawPick})}var attributeForm=null;if(_this.props.editContext.feature&&(_this.props.editContext.action==="Pick"||_this.props.editContext.feature.geometry)){attributeForm=/*#__PURE__*/React.createElement(AttributeForm,{editConfig:curConfig,editContext:_this.props.editContext,iface:_this.props.iface,onCommit:_this.updatePickedFeatures})}var themeSublayers=_this.props.layers.reduce(function(accum,layer){return layer.role===LayerRole.THEME?accum.concat(LayerUtils.getSublayerNames(layer)):accum},[]);return/*#__PURE__*/React.createElement("div",{className:"editing-body"},/*#__PURE__*/React.createElement("div",{className:"editing-layer-selection"},/*#__PURE__*/React.createElement("select",{className:"combo editing-layer-select",disabled:_this.props.editContext.changed===true||_this.props.editContext.id!==_this.props.currentEditContext,onChange:function onChange(ev){return _this.changeSelectedLayer(ev.target.value)},value:_this.state.selectedLayer||""},Object.keys(editConfig).filter(function(layerId){return themeSublayers.includes(layerId)}).map(function(layerId){var
|
|
14
|
+
*/var Editing=/*#__PURE__*/function(_React$Component){function Editing(){var _this;_classCallCheck(this,Editing);for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++){args[_key]=arguments[_key]}_this=_callSuper(this,Editing,[].concat(args));_defineProperty(_this,"state",{selectedLayer:null,selectedLayerVisibility:null,pickedFeatures:null,busy:false,minimized:false,drawPick:false});_defineProperty(_this,"onShow",function(){if(_this.props.taskData){_this.changeSelectedLayer(_this.props.taskData.layer,_this.props.taskData.feature)}else{_this.changeSelectedLayer(_this.state.selectedLayer)}_this.props.setSnappingConfig(_this.props.snapping,_this.props.snappingActive)});_defineProperty(_this,"onHide",function(){_this.props.clearEditContext("Editing");_this.setLayerVisibility(_this.state.selectedLayer,_this.state.selectedLayerVisibility);_this.setState({minimized:false,drawPick:false})});_defineProperty(_this,"renderBody",function(){if(!_this.props.theme||isEmpty(_this.props.theme.editConfig)){return/*#__PURE__*/React.createElement("div",{role:"body",style:{padding:"1em"}},LocaleUtils.tr("editing.noeditablelayers"))}var editConfig=_this.props.theme.editConfig;var curConfig=editConfig[_this.state.selectedLayer];if(!curConfig){return/*#__PURE__*/React.createElement("div",{role:"body",style:{padding:"1em"}},LocaleUtils.tr("editing.noeditablelayers"))}var editPermissions=curConfig.permissions||{};var actionButtons=[];actionButtons.push({key:"Pick",icon:"pick",label:LocaleUtils.tr("editing.pick"),data:{action:"Pick",feature:null}});if(editPermissions.creatable!==false&&!_this.props.editContext.geomReadOnly){actionButtons.push({key:"Draw",icon:"editdraw",label:LocaleUtils.tr("editing.draw"),data:{action:"Draw"}})}if(ConfigUtils.havePlugin("AttributeTable")&&_this.props.showAttributeTableButton){actionButtons.push({key:"AttribTable",icon:"editing",label:LocaleUtils.tr("editing.attrtable"),data:{action:"AttrTable"}})}var featureSelection=null;if(_this.state.pickedFeatures&&_this.state.pickedFeatures.length>1){var featureText=LocaleUtils.tr("editing.feature");featureSelection=/*#__PURE__*/React.createElement("div",{className:"editing-feature-selection"},/*#__PURE__*/React.createElement("select",{className:"combo editing-feature-select",disabled:_this.props.editContext.changed===true||_this.props.editContext.id!==_this.props.currentEditContext,onChange:function onChange(ev){return _this.setEditFeature(ev.target.value)},value:(_this.props.editContext.feature||{}).id||""},_this.state.pickedFeatures.map(function(feature){return/*#__PURE__*/React.createElement("option",{key:feature.id,value:feature.id},curConfig.displayField?feature.properties[curConfig.displayField]:featureText+" "+feature.id)})))}var pickBar=null;if(_this.props.allowCloneGeometry&&(_this.props.editContext.action==="Draw"||_this.state.drawPick)&&!(_this.props.editContext.feature||{}).geometry){var pickButtons=[{key:"DrawPick",icon:"pick",label:LocaleUtils.tr("editing.pickdrawfeature")}];pickBar=/*#__PURE__*/React.createElement(ButtonBar,{active:_this.state.drawPick?"DrawPick":null,buttons:pickButtons,onClick:_this.toggleDrawPick})}var attributeForm=null;if(_this.props.editContext.feature&&(_this.props.editContext.action==="Pick"||_this.props.editContext.feature.geometry)){attributeForm=/*#__PURE__*/React.createElement(AttributeForm,{editConfig:curConfig,editContext:_this.props.editContext,iface:_this.props.iface,onCommit:_this.updatePickedFeatures})}var themeSublayers=_this.props.layers.reduce(function(accum,layer){return layer.role===LayerRole.THEME?accum.concat(LayerUtils.getSublayerNames(layer)):accum},[]);return/*#__PURE__*/React.createElement("div",{className:"editing-body"},/*#__PURE__*/React.createElement("div",{className:"editing-layer-selection"},/*#__PURE__*/React.createElement("select",{className:"combo editing-layer-select",disabled:_this.props.editContext.changed===true||_this.props.editContext.id!==_this.props.currentEditContext,onChange:function onChange(ev){return _this.changeSelectedLayer(ev.target.value)},value:_this.state.selectedLayer||""},Object.keys(editConfig).filter(function(layerId){return themeSublayers.includes(layerId)}).map(function(layerId){var _this$props$theme$tra,_this$props$theme$tra2,_LayerUtils$searchLay,_LayerUtils$searchLay2;var layerName=editConfig[layerId].layerName;var layerTitle=editConfig[layerId].layerTitle?(_this$props$theme$tra=(_this$props$theme$tra2=_this.props.theme.translations)===null||_this$props$theme$tra2===void 0||(_this$props$theme$tra2=_this$props$theme$tra2.layertree)===null||_this$props$theme$tra2===void 0?void 0:_this$props$theme$tra2[layerName])!==null&&_this$props$theme$tra!==void 0?_this$props$theme$tra:editConfig[layerId].layerTitle:(_LayerUtils$searchLay=(_LayerUtils$searchLay2=LayerUtils.searchLayer(_this.props.layers,_this.props.theme.url,layerName))===null||_LayerUtils$searchLay2===void 0||(_LayerUtils$searchLay2=_LayerUtils$searchLay2.sublayer)===null||_LayerUtils$searchLay2===void 0?void 0:_LayerUtils$searchLay2.title)!==null&&_LayerUtils$searchLay!==void 0?_LayerUtils$searchLay:layerName;return/*#__PURE__*/React.createElement("option",{key:layerId,value:layerId},layerTitle)}))),/*#__PURE__*/React.createElement(ButtonBar,{active:_this.state.drawPick?"Draw":_this.props.editContext.action,buttons:actionButtons,disabled:_this.props.editContext.changed||_this.props.editContext.id!==_this.props.currentEditContext,onClick:_this.actionClicked}),featureSelection,pickBar,attributeForm)});_defineProperty(_this,"actionClicked",function(action,data){_this.setState({drawPick:false,pickedFeatures:null});if(action==="AttribTable"){_this.props.setCurrentTask("AttributeTable",null,null,{layer:_this.state.selectedLayer})}else if(action==="Draw"){var editConfig=_this.props.theme.editConfig;var curConfig=editConfig[_this.state.selectedLayer];var featureSkel={type:"Feature",properties:{}};var mapPrefix=(curConfig.editDataset.match(/^[^.]+\./)||[""])[0];getFeatureTemplate(curConfig,featureSkel,_this.props.iface,mapPrefix,_this.props.map.projection,function(feature){_this.props.setEditContext("Editing",_objectSpread(_objectSpread({},data),{},{feature:feature,geomReadOnly:false}))})}else{_this.props.setEditContext("Editing",_objectSpread({},data))}});_defineProperty(_this,"pickFilter",function(feature){var _this$props$theme$edi;var geomType=(_this$props$theme$edi=_this.props.theme.editConfig[_this.state.selectedLayer])===null||_this$props$theme$edi===void 0?void 0:_this$props$theme$edi.geomType;return feature.geometry&&(feature.geometry.type===geomType||"Multi"+feature.geometry.type===geomType||feature.geometry.type.replace(/^Multi/,"")===geomType&&feature.geometry.coordinates.length===1)});_defineProperty(_this,"geomPicked",function(layer,feature){var _this$props$theme$edi2;var geomType=(_this$props$theme$edi2=_this.props.theme.editConfig[_this.state.selectedLayer])===null||_this$props$theme$edi2===void 0?void 0:_this$props$theme$edi2.geomType;var geometry=feature.geometry;if(geometry.type!==geomType){if("Multi"+feature.geometry.type===geomType){// Convert picked geometry to multi-type
|
|
15
15
|
geometry={type:"Multi"+geometry.type,coordinates:[geometry.coordinates]}}else if(geometry.type.replace(/^Multi/,"")===geomType&&geometry.coordinates.length===1){// Convert picked geometry to single type
|
|
16
16
|
geometry={type:geometry.type.replace(/^Multi/,""),coordinates:geometry.coordinates[0]}}else{// Should not happen, mismatching geometries should already have been filtered from the list of choices
|
|
17
17
|
return}}var editFeature={type:"Feature",geometry:geometry,id:uuidv1()};_this.props.setEditContext("Editing",{action:"Draw",feature:editFeature,changed:true});_this.setState({drawPick:false})});_defineProperty(_this,"setLayerVisibility",function(selectedLayer,visibility){if(selectedLayer!==null){var path=[];var sublayer=null;var layer=_this.props.layers.find(function(l){return l.role===LayerRole.THEME&&(sublayer=LayerUtils.searchSubLayer(l,"name",selectedLayer,path))});if(layer&&sublayer){var oldvisibility=sublayer.visibility;if(oldvisibility!==visibility&&visibility!==null){var recurseDirection=!oldvisibility?"both":"children";_this.props.changeLayerProperty(layer.id,"visibility",visibility,path,recurseDirection)}return oldvisibility}}return null});_defineProperty(_this,"changeSelectedLayer",function(selectedLayer){var feature=arguments.length>1&&arguments[1]!==undefined?arguments[1]:null;var curConfig=_this.props.theme&&_this.props.theme.editConfig&&selectedLayer?_this.props.theme.editConfig[selectedLayer]:null;_this.props.setEditContext("Editing",{action:"Pick",feature:feature,geomType:(curConfig===null||curConfig===void 0?void 0:curConfig.geomType)||null,permissions:(curConfig===null||curConfig===void 0?void 0:curConfig.permissions)||{}});var prevLayerVisibility=null;if(_this.state.selectedLayer!==null){_this.setLayerVisibility(_this.state.selectedLayer,_this.state.selectedLayerVisibility);prevLayerVisibility=_this.setLayerVisibility(selectedLayer,true)}_this.setState({selectedLayer:selectedLayer,selectedLayerVisibility:prevLayerVisibility,drawPick:false})});_defineProperty(_this,"setEditFeature",function(featureId){var feature=_this.state.pickedFeatures.find(function(f){return f.id.toString()===featureId});_this.props.setEditContext("Editing",{feature:feature,changed:false})});_defineProperty(_this,"toggleDrawPick",function(){_this.setState(function(state){var pickActive=!state.drawPick;_this.props.setEditContext("Editing",{action:pickActive?null:"Draw"});return{drawPick:pickActive}})});_defineProperty(_this,"updatePickedFeatures",function(newfeature){if(_this.state.pickedFeatures){_this.setState(function(state){return{pickedFeatures:state.pickedFeatures.map(function(feature){return feature.id===newfeature.id?newfeature:feature})}})}});return _this}_inherits(Editing,_React$Component);return _createClass(Editing,[{key:"componentDidUpdate",value:function componentDidUpdate(prevProps,prevState){var _this2=this;var themeSublayers=this.props.layers.reduce(function(accum,layer){return layer.role===LayerRole.THEME?accum.concat(LayerUtils.getSublayerNames(layer)):accum},[]);// Update selected layer on layers change
|
|
18
18
|
if(this.props.enabled&&(this.props.layers!==prevProps.layers||!prevProps.enabled)){var layerIds=Object.keys(this.props.theme&&this.props.theme.editConfig||{}).filter(function(layerId){return themeSublayers.includes(layerId)});if(!isEmpty(layerIds)){if(!layerIds.includes(this.state.selectedLayer)){this.changeSelectedLayer(layerIds[0])}}else if(this.state.selectedLayer){this.changeSelectedLayer(null)}}// If click point changed and in pick mode with a selected layer, trigger a pick
|
|
19
|
-
var isCurrentContext=this.props.editContext.id===this.props.currentEditContext;if(this.props.enabled&&isCurrentContext&&this.props.editContext.action==="Pick"&&this.state.selectedLayer&&!this.props.editContext.changed){var newPoint=this.props.map.click||{};var oldPoint=prevProps.map.click||{};if(newPoint.coordinate&&!isEqual(newPoint.coordinate,oldPoint.coordinate)){var _this$props$filter$fi;var scale=Math.round(MapUtils.computeForZoom(this.props.map.scales,this.props.map.zoom));var editConfig=this.props.theme.editConfig[this.state.selectedLayer];this.props.iface.getFeature(editConfig,newPoint.coordinate,this.props.map.projection,scale,96,function(featureCollection){var features=featureCollection?featureCollection.features:null;_this2.setState({pickedFeatures:features});var feature=features?features[0]:null;_this2.props.setEditContext("Editing",{feature:feature,changed:false})},(_this$props$filter$fi=this.props.filter.filterParams)===null||_this$props$filter$fi===void 0?void 0:_this$props$filter$fi[this.state.selectedLayer],this.props.filter.filterGeom)}}if(prevProps.editContext.changed!==this.props.editContext.changed){this.props.setCurrentTaskBlocked(this.props.editContext.changed===true,LocaleUtils.tr("editing.unsavedchanged"))}if(!this.props.editContext.feature&&prevState.pickedFeatures){this.setState({pickedFeatures:null})}}},{key:"render",value:function render(){var _this3=this;var minMaxTooltip=this.state.minimized?LocaleUtils.tr("editing.maximize"):LocaleUtils.tr("editing.minimize");var extraTitlebarContent=/*#__PURE__*/React.createElement(Icon,{className:"editing-minimize-maximize",icon:this.state.minimized?"chevron-down":"chevron-up",onClick:function onClick(){return _this3.setState(function(state){return{minimized:!state.minimized}})},title:minMaxTooltip});var attribFormVisible=!!(this.props.editContext.feature&&(this.props.editContext.action==="Pick"||this.props.editContext.feature.geometry));return[/*#__PURE__*/React.createElement(SideBar,{extraTitlebarContent:extraTitlebarContent,heightResizeable:!this.state.minimized&&attribFormVisible,icon:"editing",id:"Editing",key:"EditingSidebar",onHide:this.onHide,onShow:this.onShow,side:this.props.side,title:LocaleUtils.tr("appmenu.items.Editing"),width:this.props.width},function(){return{body:_this3.state.minimized?null:_this3.renderBody()}}),this.state.drawPick?/*#__PURE__*/React.createElement(PickFeature,{featureFilter:this.pickFilter,featurePicked:this.geomPicked,key:"FeaturePicker"}):null]}}])}(React.Component);_defineProperty(Editing,"propTypes",{addLayerFeatures:PropTypes.func,/** Whether to enable the "Clone existing geometry" functionality. */allowCloneGeometry:PropTypes.bool,changeLayerProperty:PropTypes.func,clearEditContext:PropTypes.func,currentEditContext:PropTypes.string,editContext:PropTypes.object,enabled:PropTypes.bool,filter:PropTypes.object,iface:PropTypes.object,layers:PropTypes.array,map:PropTypes.object,refreshLayer:PropTypes.func,removeLayer:PropTypes.func,setCurrentTask:PropTypes.func,setCurrentTaskBlocked:PropTypes.func,setEditContext:PropTypes.func,setSnappingConfig:PropTypes.func,/** The side of the application on which to display the sidebar. */side:PropTypes.string,/** Whether snapping is available when editing. */snapping:PropTypes.bool,/** Whether snapping is enabled by default when editing.
|
|
20
|
-
* Either `false`, `edge`, `vertex` or `true` (i.e. both vertex and edge). */snappingActive:PropTypes.oneOfType([PropTypes.bool,PropTypes.string]),taskData:PropTypes.object,theme:PropTypes.object,/** The default width of the editing sidebar, as a CSS width string. */width:PropTypes.string});_defineProperty(Editing,"defaultProps",{width:"30em",side:"right",snapping:true,snappingActive:true,allowCloneGeometry:true});export default(function(){var iface=arguments.length>0&&arguments[0]!==undefined?arguments[0]:EditingInterface;return connect(function(state){return{enabled:state.task.id==="Editing",theme:state.theme.current,layers:state.layers.flat,filter:state.layers.filter,map:state.map,iface:iface,editContext:state.editing.contexts.Editing||{},currentEditContext:state.editing.currentContext,taskData:state.task.id==="Editing"?state.task.data:null}},{addLayerFeatures:addLayerFeatures,removeLayer:removeLayer,clearEditContext:clearEditContext,setEditContext:setEditContext,setSnappingConfig:setSnappingConfig,setCurrentTask:setCurrentTask,setCurrentTaskBlocked:setCurrentTaskBlocked,refreshLayer:refreshLayer,changeLayerProperty:changeLayerProperty})(Editing)});
|
|
19
|
+
var isCurrentContext=this.props.editContext.id===this.props.currentEditContext;if(this.props.enabled&&isCurrentContext&&this.props.editContext.action==="Pick"&&this.state.selectedLayer&&!this.props.editContext.changed){var newPoint=this.props.map.click||{};var oldPoint=prevProps.map.click||{};if(newPoint.coordinate&&!isEqual(newPoint.coordinate,oldPoint.coordinate)){var _this$props$filter$fi;var scale=Math.round(MapUtils.computeForZoom(this.props.map.scales,this.props.map.zoom));var editConfig=this.props.theme.editConfig[this.state.selectedLayer];this.props.iface.getFeature(editConfig,newPoint.coordinate,this.props.map.projection,scale,96,function(featureCollection){var features=featureCollection?featureCollection.features:null;_this2.setState({pickedFeatures:features});var feature=features?features[0]:null;_this2.props.setEditContext("Editing",{feature:feature,changed:false})},(_this$props$filter$fi=this.props.filter.filterParams)===null||_this$props$filter$fi===void 0?void 0:_this$props$filter$fi[this.state.selectedLayer],this.props.filter.filterGeom)}}if(prevProps.editContext.changed!==this.props.editContext.changed){this.props.setCurrentTaskBlocked(this.props.editContext.changed===true,LocaleUtils.tr("editing.unsavedchanged"))}if(!this.props.editContext.feature&&prevState.pickedFeatures){this.setState({pickedFeatures:null})}}},{key:"render",value:function render(){var _this3=this;var minMaxTooltip=this.state.minimized?LocaleUtils.tr("editing.maximize"):LocaleUtils.tr("editing.minimize");var extraTitlebarContent=/*#__PURE__*/React.createElement(Icon,{className:"editing-minimize-maximize",icon:this.state.minimized?"chevron-down":"chevron-up",onClick:function onClick(){return _this3.setState(function(state){return{minimized:!state.minimized}})},title:minMaxTooltip});var attribFormVisible=!!(this.props.editContext.feature&&(this.props.editContext.action==="Pick"||this.props.editContext.feature.geometry));return[/*#__PURE__*/React.createElement(SideBar,{extraTitlebarContent:extraTitlebarContent,heightResizeable:!this.state.minimized&&attribFormVisible,icon:"editing",id:"Editing",key:"EditingSidebar",onHide:this.onHide,onShow:this.onShow,side:this.props.side,title:LocaleUtils.tr("appmenu.items.Editing"),width:this.props.width},function(){return{body:_this3.state.minimized?null:_this3.renderBody()}}),this.state.drawPick?/*#__PURE__*/React.createElement(PickFeature,{featureFilter:this.pickFilter,featurePicked:this.geomPicked,key:"FeaturePicker"}):null]}}])}(React.Component);_defineProperty(Editing,"propTypes",{addLayerFeatures:PropTypes.func,/** Whether to enable the "Clone existing geometry" functionality. */allowCloneGeometry:PropTypes.bool,changeLayerProperty:PropTypes.func,clearEditContext:PropTypes.func,currentEditContext:PropTypes.string,editContext:PropTypes.object,enabled:PropTypes.bool,filter:PropTypes.object,iface:PropTypes.object,layers:PropTypes.array,map:PropTypes.object,refreshLayer:PropTypes.func,removeLayer:PropTypes.func,setCurrentTask:PropTypes.func,setCurrentTaskBlocked:PropTypes.func,setEditContext:PropTypes.func,setSnappingConfig:PropTypes.func,/** Whether to show a button to open the AttributeTable (if the plugin is available). */showAttributeTableButton:PropTypes.bool,/** The side of the application on which to display the sidebar. */side:PropTypes.string,/** Whether snapping is available when editing. */snapping:PropTypes.bool,/** Whether snapping is enabled by default when editing.
|
|
20
|
+
* Either `false`, `edge`, `vertex` or `true` (i.e. both vertex and edge). */snappingActive:PropTypes.oneOfType([PropTypes.bool,PropTypes.string]),taskData:PropTypes.object,theme:PropTypes.object,/** The default width of the editing sidebar, as a CSS width string. */width:PropTypes.string});_defineProperty(Editing,"defaultProps",{width:"30em",side:"right",snapping:true,snappingActive:true,allowCloneGeometry:true,showAttributeTableButton:true});export default(function(){var iface=arguments.length>0&&arguments[0]!==undefined?arguments[0]:EditingInterface;return connect(function(state){return{enabled:state.task.id==="Editing",theme:state.theme.current,layers:state.layers.flat,filter:state.layers.filter,map:state.map,iface:iface,editContext:state.editing.contexts.Editing||{},currentEditContext:state.editing.currentContext,taskData:state.task.id==="Editing"?state.task.data:null}},{addLayerFeatures:addLayerFeatures,removeLayer:removeLayer,clearEditContext:clearEditContext,setEditContext:setEditContext,setSnappingConfig:setSnappingConfig,setCurrentTask:setCurrentTask,setCurrentTaskBlocked:setCurrentTaskBlocked,refreshLayer:refreshLayer,changeLayerProperty:changeLayerProperty})(Editing)});
|
package/plugins/FeatureForm.js
CHANGED
|
@@ -18,4 +18,4 @@ function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof
|
|
|
18
18
|
*
|
|
19
19
|
* Can be used as default identify tool by setting `"identifyTool": "FeatureForm"` in `config.json`.
|
|
20
20
|
*/var FeatureForm=/*#__PURE__*/function(_React$Component){function FeatureForm(props){var _this;_classCallCheck(this,FeatureForm);_this=_callSuper(this,FeatureForm,[props]);_defineProperty(_this,"queryPoint",function(prevProps){if(_this.props.click.button!==0||_this.props.click===prevProps.click||(_this.props.click.features||[]).find(function(feature){return feature.id==="startupposmarker"})){return null}var searchMarker=(_this.props.click.features||[]).find(function(feature){return feature.id==="searchmarker"});if(searchMarker&&searchMarker.geometry.type==="Point"){return searchMarker.geometry.coordinates}return _this.props.click.coordinate});_defineProperty(_this,"queryFeatures",function(pos){var pendingRequests=0;Object.entries(_this.props.theme.editConfig||{}).forEach(function(_ref){var _this$props$filter$fi;var _ref2=_slicedToArray(_ref,2),layerId=_ref2[0],editConfig=_ref2[1];if(!editConfig.geomType){// Skip geometryless datasets
|
|
21
|
-
return}var path=[];var sublayer=null;var mapScale=MapUtils.computeForZoom(_this.props.map.scales,_this.props.map.zoom);var layer=_this.props.layers.find(function(l){return l.role===LayerRole.THEME&&(sublayer=LayerUtils.searchSubLayer(l,"name",layerId,path))});if(!layer||!sublayer||!LayerUtils.sublayerVisible(layer,path)||!LayerUtils.layerScaleInRange(sublayer,mapScale)){return}var layerOrder=layer.params.LAYERS.split(",");++pendingRequests;var scale=Math.round(MapUtils.computeForZoom(_this.props.map.scales,_this.props.map.zoom));_this.props.iface.getFeature(editConfig,pos,_this.props.map.projection,scale,96,function(featureCollection){if(featureCollection&&!isEmpty(featureCollection.features)){_this.setState(function(state){var newPickedFeatures=Object.fromEntries(Object.entries(_objectSpread(_objectSpread({},state.pickedFeatures),featureCollection.features.reduce(function(res,feature){return _objectSpread(_objectSpread({},res),{},_defineProperty({},layerId+"::"+feature.id,feature))},{}))).sort(function(a,b){var partsA=a[0].split("::");var partsB=b[0].split("::");var diff=layerOrder.indexOf(partsB[0])-layerOrder.indexOf(partsA[0]);return diff===0?partsA[1].localeCompare(partsB[1]):diff}));var selectedFeature=state.pendingRequests<=1&&!state.selectedFeature?Object.keys(newPickedFeatures)[0]:"";return{pickedFeatures:newPickedFeatures,pendingRequests:state.pendingRequests-1,selectedFeature:selectedFeature}})}else{_this.setState(function(state){var _Object$keys$;var selectedFeature=state.pendingRequests<=1&&!state.selectedFeature?(_Object$keys$=Object.keys(state.pickedFeatures)[0])!==null&&_Object$keys$!==void 0?_Object$keys$:"":"";return{pendingRequests:state.pendingRequests-1,selectedFeature:selectedFeature}})}},(_this$props$filter$fi=_this.props.filter.filterParams)===null||_this$props$filter$fi===void 0?void 0:_this$props$filter$fi[sublayer.name],_this.props.filter.filterGeom)});_this.setState({pendingRequests:pendingRequests,pickedFeatures:{},selectedFeature:""})});_defineProperty(_this,"setSelectedFeature",function(ev){_this.setState({selectedFeature:ev.target.value})});_defineProperty(_this,"onWindowClose",function(){_this.clearResults();if(_this.props.exitTaskOnResultsClose){_this.props.setCurrentTask(null)}});_defineProperty(_this,"clearResults",function(){if(!_this.props.editContext.changed){_this.setState(FeatureForm.defaultState)}});_defineProperty(_this,"updatePickedFeatures",function(newfeature){_this.setState(function(state){return{pickedFeatures:Object.entries(state.pickedFeatures).reduce(function(res,_ref3){var _ref4=_slicedToArray(_ref3,2),key=_ref4[0],feature=_ref4[1];res[key]=feature.id===newfeature.id?newfeature:feature;return res},{})}})});_this.state=FeatureForm.defaultState;return _this}_inherits(FeatureForm,_React$Component);return _createClass(FeatureForm,[{key:"componentDidMount",value:function componentDidMount(){if(this.props.enabled){this.props.setEditContext("FeatureForm",{action:"Pick"})}}},{key:"componentDidUpdate",value:function componentDidUpdate(prevProps,prevState){if(this.props.enabled&&this.props.theme&&!prevProps.theme){var startupParams=this.props.startupParams;var haveIc=["1","true"].includes((startupParams.ic||"").toLowerCase());var c=(startupParams.c||"").split(/[;,]/g).map(function(x){return parseFloat(x)||0});if(haveIc&&c.length===2){var mapCrs=this.props.theme.mapCrs;this.queryFeatures(CoordinatesUtils.reproject(c,startupParams.crs||mapCrs,mapCrs))}}else if(this.props.theme!==prevProps.theme){this.clearResults()}else if(!this.props.enabled&&prevProps.enabled){if(this.props.clearResultsOnClose){this.clearResults()}}if(this.props.enabled&&!prevProps.enabled){this.props.setEditContext("FeatureForm",{action:"Pick"})}var isCurrentContext=this.props.editContext.id===this.props.currentEditContext;if(this.props.enabled&&isCurrentContext&&!this.props.editContext.changed&&this.state.pendingRequests===0){var clickPoint=this.queryPoint(prevProps);if(clickPoint){this.queryFeatures(clickPoint)}}if(this.props.enabled&&this.state.selectedFeature!==prevState.selectedFeature){var feature=this.state.pickedFeatures?this.state.pickedFeatures[this.state.selectedFeature]:null;var curLayerId=this.state.selectedFeature.split("::")[0];var curConfig=this.props.theme.editConfig[curLayerId]||{};var canEditGeometry=["Point","LineString","Polygon"].includes((curConfig.geomType||"").replace(/^Multi/,"").replace(/Z$/,""));var editPermissions=curConfig.permissions||{};this.props.setEditContext("FeatureForm",{action:"Pick",feature:feature,changed:false,geomType:curConfig.geomType||null,geomReadOnly:editPermissions.updatable===false||!canEditGeometry,permissions:(curConfig===null||curConfig===void 0?void 0:curConfig.permissions)||{}})}if(!this.props.enabled&&prevProps.enabled){this.props.clearEditContext("FeatureForm");this.setState(FeatureForm.defaultState)}}},{key:"render",value:function render(){var _this2=this;var resultWindow=null;if(this.state.pickedFeatures!==null){var body=null;if(this.state.pendingRequests>0){body=/*#__PURE__*/React.createElement("div",{className:"feature-query-body",role:"body"},/*#__PURE__*/React.createElement("span",{className:"identify-body-message"},LocaleUtils.tr("featureform.querying")))}else if(isEmpty(this.state.pickedFeatures)){body=/*#__PURE__*/React.createElement("div",{className:"feature-query-body",role:"body"},/*#__PURE__*/React.createElement("span",{className:"identify-body-message"},LocaleUtils.tr("featureform.noresults")))}else{var featureText=LocaleUtils.tr("featureform.feature");var curLayerId=this.state.selectedFeature.split("::")[0];var curConfig=this.props.theme.editConfig[curLayerId];body=/*#__PURE__*/React.createElement("div",{className:"feature-query-body",role:"body"},Object.keys(this.state.pickedFeatures).length>1?/*#__PURE__*/React.createElement("div",{className:"feature-query-selection"},/*#__PURE__*/React.createElement("select",{onChange:this.setSelectedFeature,value:this.state.selectedFeature},Object.entries(this.state.pickedFeatures).map(function(_ref5){var _match$sublayer$title,_match$sublayer;var _ref6=_slicedToArray(_ref5,2),id=_ref6[0],feature=_ref6[1];var _id$split=id.split("::"),_id$split2=_slicedToArray(_id$split,2),layerId=_id$split2[0],featureId=_id$split2[1];var editConfig=_this2.props.theme.editConfig[layerId];var match=LayerUtils.searchLayer(_this2.props.layers,_this2.props.theme.url,editConfig.layerName);var layerName=(_match$sublayer$title=match===null||match===void 0||(_match$sublayer=match.sublayer)===null||_match$sublayer===void 0?void 0:_match$sublayer.title)!==null&&_match$sublayer$title!==void 0?_match$sublayer$title:editConfig.layerName;var featureName=editConfig.displayField?feature.properties[editConfig.displayField]:featureText+" "+featureId;return/*#__PURE__*/React.createElement("option",{key:id,value:id},layerName+": "+featureName)}))):null,this.props.editContext.feature?/*#__PURE__*/React.createElement(AttributeForm,{editConfig:curConfig,editContext:this.props.editContext,iface:this.props.iface,onCommit:this.updatePickedFeatures}):null)}resultWindow=/*#__PURE__*/React.createElement(ResizeableWindow,{dockable:this.props.geometry.side,icon:"featureform",initialHeight:this.props.geometry.initialHeight,initialWidth:this.props.geometry.initialWidth,initialX:this.props.geometry.initialX,initialY:this.props.geometry.initialY,initiallyDocked:this.props.geometry.initiallyDocked,key:"FeatureForm",onClose:this.onWindowClose,title:LocaleUtils.tr("featureform.title")},body)}return[resultWindow,/*#__PURE__*/React.createElement(TaskBar,{key:"FeatureFormTaskBar",task:"FeatureForm"},function(){return{body:LocaleUtils.tr("infotool.clickhelpPoint")}})]}}])}(React.Component);_defineProperty(FeatureForm,"propTypes",{clearEditContext:PropTypes.func,/** Whether to clear the identify results when exiting the identify tool. */clearResultsOnClose:PropTypes.bool,click:PropTypes.object,currentEditContext:PropTypes.string,editContext:PropTypes.object,enabled:PropTypes.bool,/** Whether to clear the task when the results window is closed. */exitTaskOnResultsClose:PropTypes.bool,filter:PropTypes.object,/** Default window geometry with size, position and docking status. Positive position values (including '0') are related to top (InitialY) and left (InitialX), negative values (including '-0') to bottom (InitialY) and right (InitialX). */geometry:PropTypes.shape({initialWidth:PropTypes.number,initialHeight:PropTypes.number,initialX:PropTypes.number,initialY:PropTypes.number,initiallyDocked:PropTypes.bool,side:PropTypes.string}),iface:PropTypes.object,layers:PropTypes.array,map:PropTypes.object,setCurrentTask:PropTypes.func,setEditContext:PropTypes.func,startupParams:PropTypes.object,theme:PropTypes.object});_defineProperty(FeatureForm,"defaultProps",{clearResultsOnClose:true,geometry:{initialWidth:320,initialHeight:480,initialX:0,initialY:0,initiallyDocked:false,side:"left"}});_defineProperty(FeatureForm,"defaultState",{pendingRequests:0,pickedFeatures:null,selectedFeature:""});export default(function(){var iface=arguments.length>0&&arguments[0]!==undefined?arguments[0]:EditingInterface;return connect(function(state){var enabled=state.task.id==="FeatureForm"||state.task.identifyEnabled&&ConfigUtils.getConfigProp("identifyTool",state.theme.current,"Identify")==="FeatureForm";return{click:state.map.click||{modifiers:{}},enabled:enabled,editContext:state.editing.contexts.FeatureForm||{},currentEditContext:state.editing.currentContext,iface:iface,layers:state.layers.flat,filter:state.layers.filter,map:state.map,theme:state.theme.current,startupParams:state.localConfig.startupParams}},{setCurrentTask:setCurrentTask,clearEditContext:clearEditContext,setEditContext:setEditContext})(FeatureForm)});
|
|
21
|
+
return}var path=[];var sublayer=null;var mapScale=MapUtils.computeForZoom(_this.props.map.scales,_this.props.map.zoom);var layer=_this.props.layers.find(function(l){return l.role===LayerRole.THEME&&(sublayer=LayerUtils.searchSubLayer(l,"name",layerId,path))});if(!layer||!sublayer||!LayerUtils.sublayerVisible(layer,path)||!LayerUtils.layerScaleInRange(sublayer,mapScale)){return}var layerOrder=layer.params.LAYERS.split(",");++pendingRequests;var scale=Math.round(MapUtils.computeForZoom(_this.props.map.scales,_this.props.map.zoom));_this.props.iface.getFeature(editConfig,pos,_this.props.map.projection,scale,96,function(featureCollection){if(featureCollection&&!isEmpty(featureCollection.features)){_this.setState(function(state){var newPickedFeatures=Object.fromEntries(Object.entries(_objectSpread(_objectSpread({},state.pickedFeatures),featureCollection.features.reduce(function(res,feature){return _objectSpread(_objectSpread({},res),{},_defineProperty({},layerId+"::"+feature.id,feature))},{}))).sort(function(a,b){var partsA=a[0].split("::");var partsB=b[0].split("::");var diff=layerOrder.indexOf(partsB[0])-layerOrder.indexOf(partsA[0]);return diff===0?partsA[1].localeCompare(partsB[1]):diff}));var selectedFeature=state.pendingRequests<=1&&!state.selectedFeature?Object.keys(newPickedFeatures)[0]:"";return{pickedFeatures:newPickedFeatures,pendingRequests:state.pendingRequests-1,selectedFeature:selectedFeature}})}else{_this.setState(function(state){var _Object$keys$;var selectedFeature=state.pendingRequests<=1&&!state.selectedFeature?(_Object$keys$=Object.keys(state.pickedFeatures)[0])!==null&&_Object$keys$!==void 0?_Object$keys$:"":"";return{pendingRequests:state.pendingRequests-1,selectedFeature:selectedFeature}})}},(_this$props$filter$fi=_this.props.filter.filterParams)===null||_this$props$filter$fi===void 0?void 0:_this$props$filter$fi[sublayer.name],_this.props.filter.filterGeom)});_this.setState({pendingRequests:pendingRequests,pickedFeatures:{},selectedFeature:""})});_defineProperty(_this,"setSelectedFeature",function(ev){_this.setState({selectedFeature:ev.target.value})});_defineProperty(_this,"onWindowClose",function(){_this.clearResults();if(_this.props.exitTaskOnResultsClose){_this.props.setCurrentTask(null)}});_defineProperty(_this,"clearResults",function(){if(!_this.props.editContext.changed){_this.setState(FeatureForm.defaultState)}});_defineProperty(_this,"updatePickedFeatures",function(newfeature){_this.setState(function(state){return{pickedFeatures:Object.entries(state.pickedFeatures).reduce(function(res,_ref3){var _ref4=_slicedToArray(_ref3,2),key=_ref4[0],feature=_ref4[1];res[key]=feature.id===newfeature.id?newfeature:feature;return res},{})}})});_this.state=FeatureForm.defaultState;return _this}_inherits(FeatureForm,_React$Component);return _createClass(FeatureForm,[{key:"componentDidMount",value:function componentDidMount(){if(this.props.enabled){this.props.setEditContext("FeatureForm",{action:"Pick"})}}},{key:"componentDidUpdate",value:function componentDidUpdate(prevProps,prevState){if(this.props.enabled&&this.props.theme&&!prevProps.theme){var startupParams=this.props.startupParams;var haveIc=["1","true"].includes((startupParams.ic||"").toLowerCase());var c=(startupParams.c||"").split(/[;,]/g).map(function(x){return parseFloat(x)||0});if(haveIc&&c.length===2){var mapCrs=this.props.theme.mapCrs;this.queryFeatures(CoordinatesUtils.reproject(c,startupParams.crs||mapCrs,mapCrs))}}else if(this.props.theme!==prevProps.theme){this.clearResults()}else if(!this.props.enabled&&prevProps.enabled){if(this.props.clearResultsOnClose){this.clearResults()}}if(this.props.enabled&&!prevProps.enabled){this.props.setEditContext("FeatureForm",{action:"Pick"})}var isCurrentContext=this.props.editContext.id===this.props.currentEditContext;if(this.props.enabled&&isCurrentContext&&!this.props.editContext.changed&&this.state.pendingRequests===0){var clickPoint=this.queryPoint(prevProps);if(clickPoint){this.queryFeatures(clickPoint)}}if(this.props.enabled&&this.state.selectedFeature!==prevState.selectedFeature){var feature=this.state.pickedFeatures?this.state.pickedFeatures[this.state.selectedFeature]:null;var curLayerId=this.state.selectedFeature.split("::")[0];var curConfig=this.props.theme.editConfig[curLayerId]||{};var canEditGeometry=["Point","LineString","Polygon"].includes((curConfig.geomType||"").replace(/^Multi/,"").replace(/Z$/,""));var editPermissions=curConfig.permissions||{};this.props.setEditContext("FeatureForm",{action:"Pick",feature:feature,changed:false,geomType:curConfig.geomType||null,geomReadOnly:editPermissions.updatable===false||!canEditGeometry,permissions:(curConfig===null||curConfig===void 0?void 0:curConfig.permissions)||{}})}if(!this.props.enabled&&prevProps.enabled){this.props.clearEditContext("FeatureForm");this.setState(FeatureForm.defaultState)}}},{key:"render",value:function render(){var _this2=this;var resultWindow=null;if(this.state.pickedFeatures!==null){var body=null;if(this.state.pendingRequests>0){body=/*#__PURE__*/React.createElement("div",{className:"feature-query-body",role:"body"},/*#__PURE__*/React.createElement("span",{className:"identify-body-message"},LocaleUtils.tr("featureform.querying")))}else if(isEmpty(this.state.pickedFeatures)){body=/*#__PURE__*/React.createElement("div",{className:"feature-query-body",role:"body"},/*#__PURE__*/React.createElement("span",{className:"identify-body-message"},LocaleUtils.tr("featureform.noresults")))}else{var featureText=LocaleUtils.tr("featureform.feature");var curLayerId=this.state.selectedFeature.split("::")[0];var curConfig=this.props.theme.editConfig[curLayerId];body=/*#__PURE__*/React.createElement("div",{className:"feature-query-body",role:"body"},Object.keys(this.state.pickedFeatures).length>1?/*#__PURE__*/React.createElement("div",{className:"feature-query-selection"},/*#__PURE__*/React.createElement("select",{onChange:this.setSelectedFeature,value:this.state.selectedFeature},Object.entries(this.state.pickedFeatures).map(function(_ref5){var _this2$props$theme$tr,_this2$props$theme$tr2,_LayerUtils$searchLay,_LayerUtils$searchLay2;var _ref6=_slicedToArray(_ref5,2),id=_ref6[0],feature=_ref6[1];var _id$split=id.split("::"),_id$split2=_slicedToArray(_id$split,2),layerId=_id$split2[0],featureId=_id$split2[1];var editConfig=_this2.props.theme.editConfig[layerId];var layerName=editConfig.layerName;var layerTitle=editConfig.layerTitle?(_this2$props$theme$tr=(_this2$props$theme$tr2=_this2.props.theme.translations)===null||_this2$props$theme$tr2===void 0||(_this2$props$theme$tr2=_this2$props$theme$tr2.layertree)===null||_this2$props$theme$tr2===void 0?void 0:_this2$props$theme$tr2[layerName])!==null&&_this2$props$theme$tr!==void 0?_this2$props$theme$tr:editConfig.layerTitle:(_LayerUtils$searchLay=(_LayerUtils$searchLay2=LayerUtils.searchLayer(_this2.props.layers,_this2.props.theme.url,layerName))===null||_LayerUtils$searchLay2===void 0||(_LayerUtils$searchLay2=_LayerUtils$searchLay2.sublayer)===null||_LayerUtils$searchLay2===void 0?void 0:_LayerUtils$searchLay2.title)!==null&&_LayerUtils$searchLay!==void 0?_LayerUtils$searchLay:layerName;var featureName=editConfig.displayField?feature.properties[editConfig.displayField]:featureText+" "+featureId;return/*#__PURE__*/React.createElement("option",{key:id,value:id},layerTitle+": "+featureName)}))):null,this.props.editContext.feature?/*#__PURE__*/React.createElement(AttributeForm,{editConfig:curConfig,editContext:this.props.editContext,iface:this.props.iface,onCommit:this.updatePickedFeatures}):null)}resultWindow=/*#__PURE__*/React.createElement(ResizeableWindow,{dockable:this.props.geometry.side,icon:"featureform",initialHeight:this.props.geometry.initialHeight,initialWidth:this.props.geometry.initialWidth,initialX:this.props.geometry.initialX,initialY:this.props.geometry.initialY,initiallyDocked:this.props.geometry.initiallyDocked,key:"FeatureForm",onClose:this.onWindowClose,title:LocaleUtils.tr("featureform.title")},body)}return[resultWindow,/*#__PURE__*/React.createElement(TaskBar,{key:"FeatureFormTaskBar",task:"FeatureForm"},function(){return{body:LocaleUtils.tr("infotool.clickhelpPoint")}})]}}])}(React.Component);_defineProperty(FeatureForm,"propTypes",{clearEditContext:PropTypes.func,/** Whether to clear the identify results when exiting the identify tool. */clearResultsOnClose:PropTypes.bool,click:PropTypes.object,currentEditContext:PropTypes.string,editContext:PropTypes.object,enabled:PropTypes.bool,/** Whether to clear the task when the results window is closed. */exitTaskOnResultsClose:PropTypes.bool,filter:PropTypes.object,/** Default window geometry with size, position and docking status. Positive position values (including '0') are related to top (InitialY) and left (InitialX), negative values (including '-0') to bottom (InitialY) and right (InitialX). */geometry:PropTypes.shape({initialWidth:PropTypes.number,initialHeight:PropTypes.number,initialX:PropTypes.number,initialY:PropTypes.number,initiallyDocked:PropTypes.bool,side:PropTypes.string}),iface:PropTypes.object,layers:PropTypes.array,map:PropTypes.object,setCurrentTask:PropTypes.func,setEditContext:PropTypes.func,startupParams:PropTypes.object,theme:PropTypes.object});_defineProperty(FeatureForm,"defaultProps",{clearResultsOnClose:true,geometry:{initialWidth:320,initialHeight:480,initialX:0,initialY:0,initiallyDocked:false,side:"left"}});_defineProperty(FeatureForm,"defaultState",{pendingRequests:0,pickedFeatures:null,selectedFeature:""});export default(function(){var iface=arguments.length>0&&arguments[0]!==undefined?arguments[0]:EditingInterface;return connect(function(state){var enabled=state.task.id==="FeatureForm"||state.task.identifyEnabled&&ConfigUtils.getConfigProp("identifyTool",state.theme.current,"Identify")==="FeatureForm";return{click:state.map.click||{modifiers:{}},enabled:enabled,editContext:state.editing.contexts.FeatureForm||{},currentEditContext:state.editing.currentContext,iface:iface,layers:state.layers.flat,filter:state.layers.filter,map:state.map,theme:state.theme.current,startupParams:state.localConfig.startupParams}},{setCurrentTask:setCurrentTask,clearEditContext:clearEditContext,setEditContext:setEditContext})(FeatureForm)});
|
package/plugins/Print.js
CHANGED
|
@@ -9,7 +9,7 @@ function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof
|
|
|
9
9
|
*
|
|
10
10
|
* Uses the print layouts defined in the QGIS project.
|
|
11
11
|
*/var Print=/*#__PURE__*/function(_React$Component){function Print(props){var _this;_classCallCheck(this,Print);_this=_callSuper(this,Print,[props]);_defineProperty(_this,"state",{center:null,extents:[],layout:null,layouts:[],rotation:0,scale:0,dpi:300,grid:false,legend:false,minimized:false,printOutputVisible:false,outputLoaded:false,printing:false,atlasFeatures:[],geoPdf:false,selectedFormat:"",printOutputData:undefined,pdfData:null,pdfDataUrl:null,downloadMode:"onepdf",printSeriesEnabled:false,printSeriesOverlap:0,printSeriesSelected:[]});_defineProperty(_this,"onShow",function(){// setup initial extent
|
|
12
|
-
var scale=Math.round(MapUtils.computeForZoom(_this.props.map.scales,_this.props.map.zoom)*_this.props.defaultScaleFactor);if(_this.props.theme.printScales&&_this.props.theme.printScales.length>0){var closestVal=Math.abs(scale-_this.props.theme.printScales[0]);var closestIdx=0;for(var i=1;i<_this.props.theme.printScales.length;++i){var currVal=Math.abs(scale-_this.props.theme.printScales[i]);if(currVal<closestVal){closestVal=currVal;closestIdx=i}}scale=_this.props.theme.printScales[closestIdx]}var bounds=_this.props.map.bbox.bounds;var center=_this.state.center||[0,0];var resetCenter=center[0]<bounds[0]||center[0]>bounds[2]||center[1]<bounds[1]||center[1]>bounds[3];var resetScale=_this.state.scale/scale<0.01||_this.state.scale/scale>10;if(resetCenter||resetScale){_this.setState({center:null,rotation:0,scale:scale})}_this.props.setSnappingConfig(false,false)});_defineProperty(_this,"onHide",function(){_this.setState({minimized:false,printSeriesEnabled:false,atlasFeatures:[]})});_defineProperty(_this,"renderBody",function(){var _this$state$extents$a,_this$state$layout$la,_this$state$layout;if(!_this.state.layout){return/*#__PURE__*/React.createElement("div",{className:"print-body",role:"body"},LocaleUtils.tr("print.nolayouts"))}var haveThemeLayers=_this.props.layers.find(function(layer){return layer.role===LayerRole.THEME})!==undefined;if(!_this.props.theme||!_this.props.printExternalLayers&&!haveThemeLayers){return/*#__PURE__*/React.createElement("div",{className:"print-body",role:"body"},LocaleUtils.tr("print.notheme"))}var mapName=_this.state.layout.map.name;var printLegend=_this.state.layout.legendLayout;var formattedExtent=!isEmpty(_this.state.atlasFeatures)?"":_this.formatExtent((_this$state$extents$a=_this.state.extents.at(0))!==null&&_this$state$extents$a!==void 0?_this$state$extents$a:[0,0,0,0]);var resolutionChooser=null;var resolutionInput=null;if(!isEmpty(_this.props.theme.printResolutions)){if(_this.props.theme.printResolutions.length>1){resolutionChooser=/*#__PURE__*/React.createElement("select",{name:"DPI",onChange:function onChange(ev){return _this.changeResolution(ev.target.value)},value:_this.state.dpi||""},_this.props.theme.printResolutions.map(function(res){return/*#__PURE__*/React.createElement("option",{key:res,value:res},res," dpi")}))}else{resolutionInput=/*#__PURE__*/React.createElement("input",{name:"DPI",readOnly:true,type:"hidden",value:_this.props.theme.printResolutions[0]})}}else{resolutionChooser=/*#__PURE__*/React.createElement(NumberInput,{max:1200,min:50,mobile:true,name:"DPI",onChange:_this.changeResolution,suffix:" dpi",value:_this.state.dpi||""})}var formatMap={"application/pdf":"PDF","image/jpeg":"JPEG","image/png":"PNG","image/svg":"SVG"};var allowGeoPdfExport=_this.state.selectedFormat==="application/pdf"&&_this.props.allowGeoPdfExport;return/*#__PURE__*/React.createElement("div",{className:"print-body"},/*#__PURE__*/React.createElement("form",{action:_this.props.theme.printUrl,method:"POST",onSubmit:_this.print,ref:function ref(el){_this.printForm=el}},/*#__PURE__*/React.createElement("input",{name:"TEMPLATE",type:"hidden",value:printLegend&&_this.state.legend?printLegend:_this.state.layout.name}),/*#__PURE__*/React.createElement("table",{className:"options-table"},/*#__PURE__*/React.createElement("tbody",null,/*#__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.changeLayout,value:_this.state.layout.name},_this.state.layouts.map(function(item){return/*#__PURE__*/React.createElement("option",{key:item.name,value:item.name},_this.translateLayoutName(item.name
|
|
12
|
+
var scale=Math.round(MapUtils.computeForZoom(_this.props.map.scales,_this.props.map.zoom)*_this.props.defaultScaleFactor);if(_this.props.theme.printScales&&_this.props.theme.printScales.length>0){var closestVal=Math.abs(scale-_this.props.theme.printScales[0]);var closestIdx=0;for(var i=1;i<_this.props.theme.printScales.length;++i){var currVal=Math.abs(scale-_this.props.theme.printScales[i]);if(currVal<closestVal){closestVal=currVal;closestIdx=i}}scale=_this.props.theme.printScales[closestIdx]}var bounds=_this.props.map.bbox.bounds;var center=_this.state.center||[0,0];var resetCenter=center[0]<bounds[0]||center[0]>bounds[2]||center[1]<bounds[1]||center[1]>bounds[3];var resetScale=_this.state.scale/scale<0.01||_this.state.scale/scale>10;if(resetCenter||resetScale){_this.setState({center:null,rotation:0,scale:scale})}_this.props.setSnappingConfig(false,false)});_defineProperty(_this,"onHide",function(){_this.setState({minimized:false,printSeriesEnabled:false,atlasFeatures:[]})});_defineProperty(_this,"renderBody",function(){var _this$state$extents$a,_this$state$layout$la,_this$state$layout;if(!_this.state.layout){return/*#__PURE__*/React.createElement("div",{className:"print-body",role:"body"},LocaleUtils.tr("print.nolayouts"))}var haveThemeLayers=_this.props.layers.find(function(layer){return layer.role===LayerRole.THEME})!==undefined;if(!_this.props.theme||!_this.props.printExternalLayers&&!haveThemeLayers){return/*#__PURE__*/React.createElement("div",{className:"print-body",role:"body"},LocaleUtils.tr("print.notheme"))}var mapName=_this.state.layout.map.name;var printLegend=_this.state.layout.legendLayout;var formattedExtent=!isEmpty(_this.state.atlasFeatures)?"":_this.formatExtent((_this$state$extents$a=_this.state.extents.at(0))!==null&&_this$state$extents$a!==void 0?_this$state$extents$a:[0,0,0,0]);var resolutionChooser=null;var resolutionInput=null;if(!isEmpty(_this.props.theme.printResolutions)){if(_this.props.theme.printResolutions.length>1){resolutionChooser=/*#__PURE__*/React.createElement("select",{name:"DPI",onChange:function onChange(ev){return _this.changeResolution(ev.target.value)},value:_this.state.dpi||""},_this.props.theme.printResolutions.map(function(res){return/*#__PURE__*/React.createElement("option",{key:res,value:res},res," dpi")}))}else{resolutionInput=/*#__PURE__*/React.createElement("input",{name:"DPI",readOnly:true,type:"hidden",value:_this.props.theme.printResolutions[0]})}}else{resolutionChooser=/*#__PURE__*/React.createElement(NumberInput,{max:1200,min:50,mobile:true,name:"DPI",onChange:_this.changeResolution,suffix:" dpi",value:_this.state.dpi||""})}var formatMap={"application/pdf":"PDF","image/jpeg":"JPEG","image/png":"PNG","image/svg":"SVG"};var allowGeoPdfExport=_this.state.selectedFormat==="application/pdf"&&_this.props.allowGeoPdfExport;return/*#__PURE__*/React.createElement("div",{className:"print-body"},/*#__PURE__*/React.createElement("form",{action:_this.props.theme.printUrl,method:"POST",onSubmit:_this.print,ref:function ref(el){_this.printForm=el}},/*#__PURE__*/React.createElement("input",{name:"TEMPLATE",type:"hidden",value:printLegend&&_this.state.legend?printLegend:_this.state.layout.name}),/*#__PURE__*/React.createElement("table",{className:"options-table"},/*#__PURE__*/React.createElement("tbody",null,/*#__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.changeLayout,value:_this.state.layout.name},_this.state.layouts.map(function(item){return/*#__PURE__*/React.createElement("option",{key:item.name,value:item.name},_this.translateLayoutName(item.name))})))),_this.props.formats.length>1?/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",null,LocaleUtils.tr("print.format")),/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement("select",{disabled:_this.state.printSeriesEnabled,name:"FORMAT",onChange:_this.formatChanged,value:_this.state.selectedFormat},_this.props.formats.map(function(format){return/*#__PURE__*/React.createElement("option",{key:format,value:format},formatMap[format]||format)})))):null,_this.state.layout.atlasCoverageLayer&&!_this.state.printSeriesEnabled?/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",null,LocaleUtils.tr("print.atlasfeature")),/*#__PURE__*/React.createElement("td",null,!isEmpty(_this.state.atlasFeatures)?/*#__PURE__*/React.createElement("div",{className:"print-atlas-features"},_this.state.atlasFeatures.map(function(feature){return/*#__PURE__*/React.createElement("span",{key:feature.id},/*#__PURE__*/React.createElement("span",null,feature.properties[feature.displayfield]),/*#__PURE__*/React.createElement(Icon,{icon:"remove",onClick:function onClick(){return _this.deselectAtlasFeature(feature)}}))}),/*#__PURE__*/React.createElement("input",{name:"ATLAS_PK",type:"hidden",value:_this.state.atlasFeatures.map(function(feature){var _feature$properties$_;return(_feature$properties$_=feature.properties[_this.state.layout.atlas_pk])!==null&&_feature$properties$_!==void 0?_feature$properties$_:feature.id}).join(",")})):/*#__PURE__*/React.createElement("input",{disabled:true,placeholder:LocaleUtils.tr("print.pickatlasfeature",_this.state.layout.atlasCoverageLayer),type:"text"}))):null,isEmpty(_this.state.atlasFeatures)?/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",null,LocaleUtils.tr("print.scale")),/*#__PURE__*/React.createElement("td",null,!isEmpty(_this.props.theme.printScales)?/*#__PURE__*/React.createElement(InputContainer,null,/*#__PURE__*/React.createElement("span",{role:"prefix"},"1\xA0:\xA0"),/*#__PURE__*/React.createElement(EditableSelect,{name:mapName+":scale",onChange:_this.changeScale,options:_this.props.theme.printScales,role:"input",value:_this.state.scale||""})):/*#__PURE__*/React.createElement(NumberInput,{min:1,mobile:true,name:mapName+":scale",onChange:_this.changeScale,prefix:"1 : ",value:_this.state.scale||null}))):null,resolutionChooser?/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",null,LocaleUtils.tr("print.resolution")),/*#__PURE__*/React.createElement("td",null,resolutionChooser)):null,_this.props.displayRotation?/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",null,LocaleUtils.tr("print.rotation")),/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement(InputContainer,null,/*#__PURE__*/React.createElement(NumberInput,{decimals:1,mobile:true,name:mapName+":rotation",onChange:_this.changeRotation,role:"input",value:_this.state.rotation}),/*#__PURE__*/React.createElement("span",{role:"suffix",style:{transform:"rotate(-"+_this.state.rotation+"deg)"}},/*#__PURE__*/React.createElement(Icon,{icon:"arrow-up",onClick:function onClick(){return _this.setState({rotation:0})},title:LocaleUtils.tr("map.resetrotation")}))))):null,!isEmpty(_this.props.theme.printGrid)?/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",null,LocaleUtils.tr("print.grid")),/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement(ToggleSwitch,{active:_this.state.grid,onChange:function onChange(newstate){return _this.setState({grid:newstate})}}))):null,printLegend?/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",null,LocaleUtils.tr("print.legend")),/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement(ToggleSwitch,{active:_this.state.legend,onChange:function onChange(newstate){return _this.setState({legend:newstate})}}))):null,_this.props.displayPrintSeries?/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",null,LocaleUtils.tr("print.series")),/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement(ToggleSwitch,{active:_this.state.printSeriesEnabled,onChange:function onChange(newstate){return _this.setState({printSeriesEnabled:newstate,atlasFeatures:[]})}}))):null,_this.state.printSeriesEnabled?/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",null,LocaleUtils.tr("print.overlap")),/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement(InputContainer,null,/*#__PURE__*/React.createElement("input",{max:"20",min:"0",onChange:_this.changeSeriesOverlap,role:"input",type:"range",value:_this.state.printSeriesOverlap}),/*#__PURE__*/React.createElement("span",{role:"suffix"},_this.state.printSeriesOverlap,"\xA0%")))):null,!_this.props.inlinePrintOutput&&_this.state.printSeriesEnabled?/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",null,LocaleUtils.tr("print.download")),/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement("select",{onChange:_this.changeDownloadMode,role:"input",value:_this.state.downloadMode||""},/*#__PURE__*/React.createElement("option",{key:"onepdf",value:"onepdf"},LocaleUtils.tr("print.download_as_onepdf")),/*#__PURE__*/React.createElement("option",{key:"onezip",value:"onezip"},LocaleUtils.tr("print.download_as_onezip")),/*#__PURE__*/React.createElement("option",{key:"single",value:"single"},LocaleUtils.tr("print.download_as_single"))))):null,((_this$state$layout$la=(_this$state$layout=_this.state.layout)===null||_this$state$layout===void 0?void 0:_this$state$layout.labels)!==null&&_this$state$layout$la!==void 0?_this$state$layout$la:[]).map(function(label){var _this$props$theme$pri;// Omit labels which start with __
|
|
13
13
|
if(label.startsWith("__")){return null}var opts=_objectSpread({rows:1,name:label.toUpperCase()},(_this$props$theme$pri=_this.props.theme.printLabelConfig)===null||_this$props$theme$pri===void 0?void 0:_this$props$theme$pri[label]);return _this.renderPrintLabelField(label,opts)}),allowGeoPdfExport?/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",null,"GeoPDF"),/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement(ToggleSwitch,{active:_this.state.geoPdf,onChange:function onChange(newstate){return _this.setState({geoPdf:newstate})}}))):null)),/*#__PURE__*/React.createElement("div",null,/*#__PURE__*/React.createElement("input",{name:"csrf_token",type:"hidden",value:MiscUtils.getCsrfToken()}),/*#__PURE__*/React.createElement("input",{name:mapName+":extent",readOnly:true,type:"hidden",value:formattedExtent}),/*#__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:"FORMAT",readOnly:true,type:"hidden",value:_this.state.selectedFormat}),/*#__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.map.projection}),/*#__PURE__*/React.createElement("input",{name:"CONTENT_DISPOSITION",readOnly:true,type:"hidden",value:_this.props.inlinePrintOutput?"inline":"attachment"}),allowGeoPdfExport?/*#__PURE__*/React.createElement("input",{name:"FORMAT_OPTIONS",readOnly:true,type:"hidden",value:_this.state.geoPdf?"WRITE_GEO_PDF:true":"WRITE_GEO_PDF:false"}):null,resolutionInput),/*#__PURE__*/React.createElement("div",{className:"button-bar"},/*#__PURE__*/React.createElement("button",{className:"button",disabled:_this.state.printing,type:"submit"},_this.state.printing?/*#__PURE__*/React.createElement("span",{className:"print-wait"},/*#__PURE__*/React.createElement(Spinner,null)," ",LocaleUtils.tr("print.wait")):LocaleUtils.tr("print.submit")))))});_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(){var _feature$properties;var searchsellayer=_this.props.layers.find(function(layer){return layer.id==="searchselection"});var feature=((searchsellayer===null||searchsellayer===void 0?void 0:searchsellayer.features)||[]).find(function(f){return f.id==="searchmarker"});return(feature===null||feature===void 0||(_feature$properties=feature.properties)===null||_feature$properties===void 0?void 0:_feature$properties.label)||""});_defineProperty(_this,"getAttributionLabel",function(){var copyrights=_this.props.layers.reduce(function(res,layer){return _objectSpread(_objectSpread({},res),LayerUtils.getAttribution(layer,_this.props.map))},{});var el=document.createElement("span");return Object.entries(copyrights).map(function(_ref){var _ref2=_slicedToArray(_ref,2),key=_ref2[0],value=_ref2[1];if(value.title){el.innerHTML=value.title;return el.innerText}else{el.innerHTML=key;return el.innerText}}).join(" | ")});_defineProperty(_this,"renderPrintSelection",function(){var printSelection=null;if(_this.state.layout&&isEmpty(_this.state.atlasFeatures)){var frame={width:_this.state.layout.map.width,height:_this.state.layout.map.height};printSelection=/*#__PURE__*/React.createElement(PrintSelection,{allowRotation:_this.props.displayRotation&&!_this.state.printSeriesEnabled,allowScaling:!_this.state.printSeriesEnabled,allowTranslation:!_this.state.printSeriesEnabled,center:_this.state.center||_this.props.map.center,fixedFrame:frame,geometryChanged:_this.geometryChanged,key:"PrintSelection",printSeriesChanged:_this.printSeriesChanged,printSeriesEnabled:_this.props.displayPrintSeries&&_this.state.printSeriesEnabled,printSeriesOverlap:_this.state.printSeriesOverlap/100,printSeriesSelected:_this.state.printSeriesSelected,rotation:_this.state.rotation,scale:_this.state.scale})}return printSelection});_defineProperty(_this,"formatExtent",function(extent){var mapCrs=_this.props.map.projection;var version=_this.props.theme.version;if(CoordinatesUtils.getAxisOrder(mapCrs).substring(0,2)==="ne"&&version==="1.3.0"){return extent[1]+","+extent[0]+","+extent[3]+","+extent[2]}return extent.join(",")});_defineProperty(_this,"geometryChanged",function(center,extents,rotation,scale){_this.setState({center:center,extents:extents,rotation:rotation,scale:scale})});_defineProperty(_this,"printSeriesChanged",function(selected){_this.setState({printSeriesSelected:selected})});_defineProperty(_this,"renderPrintOutputWindow",function(){var extraControls=[{icon:"save",title:LocaleUtils.tr("print.save"),callback:_this.savePrintOutput}];return/*#__PURE__*/React.createElement(ResizeableWindow,{extraControls:extraControls,icon:"print",initialHeight:0.75*window.innerHeight,initialWidth:0.5*window.innerWidth,key:"PrintOutputWindow",onClose:function onClose(){return _this.setState({printOutputVisible:false,outputLoaded:false,pdfData:null,pdfDataUrl:null})},title:LocaleUtils.tr("print.output"),visible:_this.state.printOutputVisible},/*#__PURE__*/React.createElement("div",{className:"print-output-window-body",role:"body"},!_this.state.outputLoaded?/*#__PURE__*/React.createElement("span",{className:"print-output-window-wait"},/*#__PURE__*/React.createElement(Spinner,null)," ",LocaleUtils.tr("print.wait")):null,/*#__PURE__*/React.createElement("iframe",{name:"print-output-window",src:_this.state.pdfDataUrl})))});_defineProperty(_this,"savePrintOutput",function(){FileSaver.saveAs(_this.state.pdfData.content,_this.state.pdfData.fileName)});_defineProperty(_this,"selectAtlasFeature",function(layer,feature){if(!feature){return}_this.setState(function(state){var index=state.atlasFeatures.findIndex(function(f){return f.id===feature.id});if(index>=0){var newAtlasFeatures=state.atlasFeatures.slice(0);newAtlasFeatures.splice(index,1);return{atlasFeatures:newAtlasFeatures}}else{return{atlasFeatures:[].concat(_toConsumableArray(state.atlasFeatures),[feature])}}})});_defineProperty(_this,"deselectAtlasFeature",function(feature){_this.setState(function(state){var index=state.atlasFeatures.find(function(f){return f.id===feature.id});var newAtlasFeatures=state.atlasFeatures.slice(0);newAtlasFeatures.splice(index,1);return{atlasFeatures:newAtlasFeatures}})});_defineProperty(_this,"changeLayout",function(ev){var layout=_this.props.theme.print.find(function(item){return item.name===ev.target.value});_this.setState({layout:layout,atlasFeature:null})});_defineProperty(_this,"changeScale",function(value){_this.setState({scale:Math.max(1,parseInt(value,10)||0)})});_defineProperty(_this,"changeResolution",function(value){_this.setState({dpi:value||300})});_defineProperty(_this,"changeRotation",function(value){var angle=value||0;_this.setState({rotation:(angle%360+360)%360})});_defineProperty(_this,"changeSeriesOverlap",function(ev){_this.setState({printSeriesOverlap:parseInt(ev.target.value,10)||0})});_defineProperty(_this,"changeDownloadMode",function(ev){_this.setState({downloadMode:ev.target.value})});_defineProperty(_this,"formatChanged",function(ev){_this.setState({selectedFormat:ev.target.value})});_defineProperty(_this,"print",function(ev){ev.preventDefault();_this.setState({printing:true});if(_this.props.inlinePrintOutput){_this.setState({printOutputVisible:true,outputLoaded:false,pdfDataUrl:null,pdfData:null})}var formData=formDataEntries(new FormData(_this.printForm));var mapCrs=_this.props.map.projection;var mapName=_this.state.layout.map.name;// Add base print params
|
|
14
14
|
var printParams=LayerUtils.collectPrintParams(_this.props.layers,_this.props.theme,_this.state.scale,mapCrs,_this.props.printExternalLayers);Object.entries(printParams).forEach(function(_ref3){var _ref4=_slicedToArray(_ref3,2),key=_ref4[0],value=_ref4[1];formData[key]=value});formData[mapName+":LAYERS"]=printParams.LAYERS;formData[mapName+":STYLES"]=printParams.STYLES;formData[mapName+":FILTER"]=printParams.FILTER;formData[mapName+":FILTER_GEOM"]=printParams.FILTER_GEOM;// Add highlight params
|
|
15
15
|
var printDpi=parseInt(_this.state.dpi,10)||0;if(_this.props.printMapHighlights){var highlightParams=VectorLayerUtils.createPrintHighlighParams(_this.props.layers,mapCrs,_this.state.scale,printDpi,_this.props.scaleFactor);formData[mapName+":HIGHLIGHT_GEOM"]=highlightParams.geoms.join(";");formData[mapName+":HIGHLIGHT_SYMBOL"]=highlightParams.styles.join(";");formData[mapName+":HIGHLIGHT_LABELSTRING"]=highlightParams.labels.join(";");formData[mapName+":HIGHLIGHT_LABELCOLOR"]=highlightParams.labelFillColors.join(";");formData[mapName+":HIGHLIGHT_LABELBUFFERCOLOR"]=highlightParams.labelOutlineColors.join(";");formData[mapName+":HIGHLIGHT_LABELBUFFERSIZE"]=highlightParams.labelOutlineSizes.join(";");formData[mapName+":HIGHLIGHT_LABELSIZE"]=highlightParams.labelSizes.join(";");formData[mapName+":HIGHLIGHT_LABEL_DISTANCE"]=highlightParams.labelDist.join(";");formData[mapName+":HIGHLIGHT_LABEL_ROTATION"]=highlightParams.labelRotations.join(";")}// Add grid params
|
package/plugins/View3D.js
CHANGED
|
@@ -8,15 +8,15 @@ function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof
|
|
|
8
8
|
* Displays a 3D map view.
|
|
9
9
|
*
|
|
10
10
|
* See [3D View](../../topics/View3D).
|
|
11
|
-
*/var View3D=/*#__PURE__*/function(_React$Component){function View3D(props){var _this;_classCallCheck(this,View3D);_this=_callSuper(this,View3D,[props]);_defineProperty(_this,"state",{componentLoaded:false,windowDetached:false,viewsLocked:false,storedState:null});_defineProperty(_this,"render3DWindow",function(){if(_this.props.view3dMode>View3DMode.DISABLED){var extraControls=[{icon:"sync",callback:_this.sync2DExtent,title:LocaleUtils.tr("map3d.syncview")},{icon:"lock",callback:_this.setLockViews,title:LocaleUtils.tr("map3d.lockview"),active:_this.state.viewsLocked}];if(!_this.state.windowDetached){extraControls.push({icon:"maximize",callback:function callback(){return _this.props.setView3dMode(View3DMode.FULLSCREEN)},title:LocaleUtils.tr("window.maximize")})}var Map3D=_this.map3dComponent;var device=ConfigUtils.isMobile()?"mobile":"desktop";var pluginsConfig=_this.props.view3dMode===View3DMode.FULLSCREEN?_this.props.localConfig.plugins[device].filter(function(entry){return entry.availableIn3D}):[];return/*#__PURE__*/React.createElement(ResizeableWindow,{extraControls:extraControls,fullscreen:_this.props.view3dMode===View3DMode.FULLSCREEN,icon:"map3d",initialHeight:_this.props.geometry.initialHeight,initialWidth:_this.props.geometry.initialWidth,initialX:_this.props.geometry.initialX,initialY:_this.props.geometry.initialY,initiallyDocked:_this.props.geometry.initiallyDocked,key:"View3DWindow",maximizeable:false,onClose:_this.onClose,onExternalWindowResized:_this.redrawScene,onFocusChanged:_this.windowFocusChanged,onGeometryChanged:_this.onGeometryChanged,splitScreenWhenDocked:true,splitTopAndBottomBar:true,title:LocaleUtils.tr("map3d.title")},_this.state.componentLoaded?/*#__PURE__*/React.createElement(Provider,{role:"body",store:_this.store},/*#__PURE__*/React.createElement(PluginsContainer,{pluginsConfig:pluginsConfig},/*#__PURE__*/React.createElement(Map3D,{controlsPosition:_this.props.controlsPosition,defaultSceneQuality:_this.props.defaultSceneQuality,innerRef:_this.setRef,onCameraChanged:_this.onCameraChanged,onMapInitialized:_this.setupMap,pluginOptions:_this.props.pluginOptions,plugins3d:_this.props.plugins3d,searchProviders:_this.props.searchProviders,theme:_this.props.theme}),_this.props.view3dMode===View3DMode.DISABLING?/*#__PURE__*/React.createElement("div",{className:"view3d-busy-overlay"},/*#__PURE__*/React.createElement(Spinner,null),/*#__PURE__*/React.createElement("span",null,LocaleUtils.tr("view3d.storingstate"))):null)):null)}return null});_defineProperty(_this,"onClose",function(){_this.props.setView3dMode(View3DMode.DISABLING)});_defineProperty(_this,"onGeometryChanged",function(geometry){if(geometry.maximized&&_this.props.view3dMode!==View3DMode.FULLSCREEN){_this.props.setView3dMode(View3DMode.FULLSCREEN)}_this.setState({windowDetached:geometry.detached})});_defineProperty(_this,"onCameraChanged",function(center,camera,fov){// Note: If camera pos is NULL, we are in first-person-view
|
|
11
|
+
*/var View3D=/*#__PURE__*/function(_React$Component){function View3D(props){var _this;_classCallCheck(this,View3D);_this=_callSuper(this,View3D,[props]);_defineProperty(_this,"state",{componentLoaded:false,windowDetached:false,viewsLocked:false,storedState:null});_defineProperty(_this,"render3DWindow",function(){if(_this.props.view3dMode>View3DMode.DISABLED){var extraControls=[{icon:"sync",callback:_this.sync2DExtent,title:LocaleUtils.tr("map3d.syncview")},{icon:"lock",callback:_this.setLockViews,title:LocaleUtils.tr("map3d.lockview"),active:_this.state.viewsLocked}];if(!_this.state.windowDetached){extraControls.push({icon:"maximize",callback:function callback(){return _this.props.setView3dMode(View3DMode.FULLSCREEN)},title:LocaleUtils.tr("window.maximize")})}var Map3D=_this.map3dComponent;var device=ConfigUtils.isMobile()?"mobile":"desktop";var pluginsConfig=_this.props.view3dMode===View3DMode.FULLSCREEN?_this.props.localConfig.plugins[device].filter(function(entry){return entry.availableIn3D}):[];return/*#__PURE__*/React.createElement(ResizeableWindow,{extraControls:extraControls,fullscreen:_this.props.view3dMode===View3DMode.FULLSCREEN,icon:"map3d",initialHeight:_this.props.geometry.initialHeight,initialWidth:_this.props.geometry.initialWidth,initialX:_this.props.geometry.initialX,initialY:_this.props.geometry.initialY,initiallyDocked:_this.props.geometry.initiallyDocked,key:"View3DWindow",maximizeable:false,onClose:_this.onClose,onExternalWindowResized:_this.redrawScene,onFocusChanged:_this.windowFocusChanged,onGeometryChanged:_this.onGeometryChanged,splitScreenWhenDocked:true,splitTopAndBottomBar:true,title:LocaleUtils.tr("map3d.title")},_this.state.componentLoaded?/*#__PURE__*/React.createElement(Provider,{role:"body",store:_this.store},/*#__PURE__*/React.createElement(PluginsContainer,{pluginsConfig:pluginsConfig},/*#__PURE__*/React.createElement(Map3D,{controlsPosition:_this.props.controlsPosition,defaultSceneQuality:_this.props.defaultSceneQuality,innerRef:_this.setRef,mouseButtons:_this.props.mouseButtons,onCameraChanged:_this.onCameraChanged,onMapInitialized:_this.setupMap,pluginOptions:_this.props.pluginOptions,plugins3d:_this.props.plugins3d,searchProviders:_this.props.searchProviders,theme:_this.props.theme}),_this.props.view3dMode===View3DMode.DISABLING?/*#__PURE__*/React.createElement("div",{className:"view3d-busy-overlay"},/*#__PURE__*/React.createElement(Spinner,null),/*#__PURE__*/React.createElement("span",null,LocaleUtils.tr("view3d.storingstate"))):null)):null)}return null});_defineProperty(_this,"onClose",function(){_this.props.setView3dMode(View3DMode.DISABLING)});_defineProperty(_this,"onGeometryChanged",function(geometry){if(geometry.maximized&&_this.props.view3dMode!==View3DMode.FULLSCREEN){_this.props.setView3dMode(View3DMode.FULLSCREEN)}_this.setState({windowDetached:geometry.detached})});_defineProperty(_this,"onCameraChanged",function(center,camera,fov){// Note: If camera pos is NULL, we are in first-person-view
|
|
12
12
|
if(_this.state.viewsLocked&&_this.focusedMap==="map3d"){var rotation=undefined;if(camera){rotation=Math.atan2(center[1]-camera[1],center[0]-camera[0])-0.5*Math.PI;var distance=Math.sqrt((camera[0]-center[0])*(camera[0]-center[0])+(camera[1]-center[1])*(camera[1]-center[1])+(camera[2]-center[2])*(camera[2]-center[2]));var fovrad=fov/180*Math.PI;var bboxWidth=distance*(2*Math.tan(fovrad/2));var bbox=[-0.5*bboxWidth,0,0.5*bboxWidth,0];var zoom=MapUtils.getZoomForExtent(bbox,_this.props.map.resolutions,_this.props.map.size,0,_this.props.map.scales.length-1);_this.props.zoomToPoint(center.slice(0,2),zoom,_this.props.theme.mapCrs,rotation);if(_this.firstPersonMarker){_this.props.removeLayer("view3d-firstperson-cone");_this.firstPersonMarker=false}}else{_this.props.panTo(center.slice(0,2),_this.props.theme.mapCrs,rotation);var feature={geometry:{type:"Point",coordinates:center.slice(0,2)},crs:_this.props.theme.mapCrs,styleName:"marker",styleOptions:{iconSrc:personIcon}};var layer={id:"view3d-firstperson-marker",role:LayerRole.MARKER};_this.props.addLayerFeatures(layer,[feature],true);_this.firstPersonMarker=true}}else if(_this.firstPersonMarker){_this.props.removeLayer("view3d-firstperson-marker");_this.firstPersonMarker=false}});_defineProperty(_this,"setRef",function(ref){_this.map3dComponentRef=ref});_defineProperty(_this,"sync2DExtent",function(){if(_this.map3dComponentRef){_this.map3dComponentRef.setViewToExtent(_this.props.map.bbox.bounds,_this.props.map.bbox.rotation)}});_defineProperty(_this,"setLockViews",function(){_this.setState(function(state){return{viewsLocked:!state.viewsLocked}});if(_this.firstPersonMarker){_this.props.removeLayer("view3d-firstperson-marker");_this.firstPersonMarker=false}});_defineProperty(_this,"setupMap",function(){if(_this.map3dComponentRef){if(!isEmpty(_this.state.storedState)){_this.map3dComponentRef.restore3dState(_this.state.storedState)}else if(_this.props.theme.current.map3d.initialView){_this.map3dComponentRef.restore3dState(_this.props.theme.current.map3d.initialView)}else{_this.sync2DExtent()}}});_defineProperty(_this,"redrawScene",function(ev){if(_this.map3dComponentRef){_this.map3dComponentRef.redrawScene(ev)}});_defineProperty(_this,"trackFocus",function(ev){var _mapEl$contains,_map3dEl$contains;var mapEl=document.getElementById("map");var map3dEl=document.getElementById("map3d");if(mapEl!==null&&mapEl!==void 0&&(_mapEl$contains=mapEl.contains)!==null&&_mapEl$contains!==void 0&&_mapEl$contains.call(mapEl,document.activeElement)){_this.focusedMap="map"}else if(map3dEl!==null&&map3dEl!==void 0&&(_map3dEl$contains=map3dEl.contains)!==null&&_map3dEl$contains!==void 0&&_map3dEl$contains.call(map3dEl,document.activeElement)){_this.focusedMap="map3d"}else{_this.focusedMap=null}});_this.map3dComponent=null;_this.map3dComponentRef=null;_this.focusedMap=null;_this.firstPersonMarker=true;// Subset of 2d reducers
|
|
13
13
|
var _ReducerIndex$reducer=ReducerIndex.reducers,processNotifications=_ReducerIndex$reducer.processNotifications,task=_ReducerIndex$reducer.task,windows=_ReducerIndex$reducer.windows;// Reducer for syncronization with parent store
|
|
14
14
|
var forwardReducer=function forwardReducer(key,forwardActions,syncAction){return function(){var state=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};var action=arguments.length>1?arguments[1]:undefined;if(forwardActions.includes(action.type)){// Forward to parent store
|
|
15
15
|
StandardApp.store.dispatch(action);return state}else{return action.type===syncAction?action[key]:state}}};var displayActions=Object.values(displayExports).filter(function(x){return typeof x==="string"});var layersActions=Object.values(layersExports).filter(function(x){return typeof x==="string"});var mapActions=Object.values(mapExports).filter(function(x){return typeof x==="string"});var themeActions=Object.values(themeExports).filter(function(x){return typeof x==="string"});var display=forwardReducer("display",displayActions,"SYNC_DISPLAY_FROM_PARENT_STORE");var layers=forwardReducer("layers",layersActions,"SYNC_LAYERS_FROM_PARENT_STORE");var map=forwardReducer("map",mapActions,"SYNC_MAP_FROM_PARENT_STORE");var localConfig=forwardReducer("localConfig",[],"SYNC_LOCAL_CONFIG_FROM_PARENT_STORE");var theme=forwardReducer("theme",themeActions,"SYNC_THEME_FROM_PARENT_STORE");_this.store=createStore({display:display,layers:layers,localConfig:localConfig,map:map,processNotifications:processNotifications,theme:theme,task:task,windows:windows});// Set stored state
|
|
16
16
|
var storedState=_objectSpread({},props.startupState.map3d);if(props.startupParams.v3d){var values=props.startupParams.v3d.split(",").map(parseFloat).filter(function(x){return!isNaN(x)});if(values.length>=6){var _values$;storedState.camera=[values[0],values[1],values[2]];storedState.target=[values[3],values[4],values[5]];storedState.personHeight=(_values$=values[6])!==null&&_values$!==void 0?_values$:0}}if(props.startupParams.bl3d!==undefined){storedState.baseLayer=props.startupParams.bl3d}_this.state.storedState=storedState;return _this}_inherits(View3D,_React$Component);return _createClass(View3D,[{key:"componentDidMount",value:function componentDidMount(){if(this.props.startupParams.v==="3d"){this.props.setView3dMode(View3DMode.FULLSCREEN)}else if(this.props.startupParams.v==="3d2d"){this.props.setView3dMode(View3DMode.SPLITSCREEN)}window.addEventListener("focus",this.trackFocus,true);this.syncParentStore({})}},{key:"componentWillUnmount",value:function componentWillUnmount(){window.removeEventListener("focus",this.trackFocus)}},{key:"componentDidUpdate",value:function componentDidUpdate(prevProps,prevState){var _this2=this,_this$props$theme$cur;if(this.props.view3dMode!==View3DMode.DISABLED&&prevProps.view3dMode===View3DMode.DISABLED){import("../components/map3d/Map3D").then(function(component){_this2.map3dComponent=component["default"];_this2.map3dComponentRef=null;_this2.setState({componentLoaded:true})})}else if(this.props.view3dMode===View3DMode.DISABLING&&prevProps.view3dMode!==View3DMode.DISABLING){if(this.map3dComponentRef){this.map3dComponentRef.store3dState().then(function(storedState){_this2.setState({storedState:storedState});UrlParams.updateParams({v3d:undefined,bl3d:undefined});_this2.props.setView3dMode(View3DMode.DISABLED)})}else{UrlParams.updateParams({v3d:undefined,bl3d:undefined});this.props.setView3dMode(View3DMode.DISABLED)}}else if(this.props.view3dMode===View3DMode.DISABLED&&prevProps.view3dMode!==View3DMode.DISABLED){this.map3dComponent=null;this.map3dComponentRef=null;this.setState({componentLoaded:false});if(this.firstPersonMarker){this.props.removeLayer("view3d-firstperson-marker");this.firstPersonMarker=false}}// Sync parts of parent store
|
|
17
17
|
this.syncParentStore(prevProps);// Handle view mode change
|
|
18
|
-
if(this.props.view3dMode!==prevProps.view3dMode){if(this.props.view3dMode===View3DMode.FULLSCREEN){UrlParams.updateParams({v:"3d"});this.setState({viewsLocked:false})}else if(this.props.view3dMode===View3DMode.SPLITSCREEN){UrlParams.updateParams({v:"3d2d"})}else{UrlParams.updateParams({v:
|
|
18
|
+
if(this.props.view3dMode!==prevProps.view3dMode){if(this.props.view3dMode===View3DMode.FULLSCREEN){UrlParams.updateParams({v:"3d"});this.setState({viewsLocked:false})}else if(this.props.view3dMode===View3DMode.SPLITSCREEN){UrlParams.updateParams({v:"3d2d"})}else{UrlParams.updateParams({v:"2d"})}}// Switch to 2D mode if new theme has no 3D configuration
|
|
19
19
|
if(this.props.theme.current!==prevProps.theme.current&&!((_this$props$theme$cur=this.props.theme.current)!==null&&_this$props$theme$cur!==void 0&&_this$props$theme$cur.map3d)&&this.props.view3dMode!==View3DMode.DISABLED){this.props.setView3dMode(View3D.DISABLED)}// Lock views
|
|
20
20
|
if(this.state.viewsLocked&&this.props.map.bbox!==prevProps.map.bbox&&this.focusedMap==="map"){this.sync2DExtent()}// Clear stored state when switching away from a theme
|
|
21
|
-
if(prevProps.theme.current&&this.props.theme.current!==prevProps.theme.current){this.setState({storedState:null})}}},{key:"syncParentStore",value:function syncParentStore(prevProps){if(this.props.display!==prevProps.display){this.store.dispatch({type:"SYNC_DISPLAY_FROM_PARENT_STORE",display:this.props.display})}if(this.props.theme!==prevProps.theme){this.store.dispatch({type:"SYNC_THEME_FROM_PARENT_STORE",theme:this.props.theme})}if(this.props.localConfig!==prevProps.localConfig){this.store.dispatch({type:"SYNC_LOCAL_CONFIG_FROM_PARENT_STORE",localConfig:this.props.localConfig})}if(this.props.layers!==prevProps.layers){this.store.dispatch({type:"SYNC_LAYERS_FROM_PARENT_STORE",layers:this.props.layers})}if(this.props.map!==prevProps.map){this.store.dispatch({type:"SYNC_MAP_FROM_PARENT_STORE",map:this.props.map})}}},{key:"render",value:function render(){var _this$props$theme$cur2;var button=(_this$props$theme$cur2=this.props.theme.current)!==null&&_this$props$theme$cur2!==void 0&&_this$props$theme$cur2.map3d?/*#__PURE__*/React.createElement(View3DSwitcher,{key:"View3DButton",position:this.props.buttonPosition}):null;return[button,this.render3DWindow()]}}])}(React.Component);_defineProperty(View3D,"propTypes",{addLayerFeatures:PropTypes.func,/** The position slot index of the 3d switch map button, from the bottom (0: bottom slot). */buttonPosition:PropTypes.number,/** The position of the navigation controls. Either `top` or `bottom`. */controlsPosition:PropTypes.string,/** The default scene quality factor (`20`: min, `100`: max). */defaultSceneQuality:PropTypes.number,display:PropTypes.object,/** Default window geometry. */geometry:PropTypes.shape({initialWidth:PropTypes.number,initialHeight:PropTypes.number,initialX:PropTypes.number,initialY:PropTypes.number,initiallyDocked:PropTypes.bool}),layers:PropTypes.object,localConfig:PropTypes.object,map:PropTypes.object,panTo:PropTypes.func,/** Options to pass to the 3D plugins, in the form `{"<PluginName>": {<options>}}`.
|
|
22
|
-
* Refer to the documentation of the <a href="#plugins3d">3D plugins</a> for settable options. */pluginOptions:PropTypes.object,plugins3d:PropTypes.object,removeLayer:PropTypes.func,searchProviders:PropTypes.object,setView3dMode:PropTypes.func,startupParams:PropTypes.object,startupState:PropTypes.object,theme:PropTypes.object,view3dMode:PropTypes.number,zoomToPoint:PropTypes.func});_defineProperty(View3D,"defaultProps",{buttonPosition:6,controlsPosition:"top",geometry:{initialWidth:600,initialHeight:800,initialX:0,initialY:0,initiallyDocked:true},pluginOptions:{}});export default(function(plugins3d){return connect(function(state){return{plugins3d:plugins3d,display:state.display,map:state.map,layers:state.layers,theme:state.theme,localConfig:state.localConfig,view3dMode:state.display.view3dMode,startupParams:state.localConfig.startupParams,startupState:state.localConfig.startupState}},{addLayerFeatures:addLayerFeatures,removeLayer:removeLayer,panTo:panTo,zoomToPoint:zoomToPoint,setView3dMode:setView3dMode})(View3D)});
|
|
21
|
+
if(prevProps.theme.current&&this.props.theme.current!==prevProps.theme.current){this.setState({storedState:null})}}},{key:"syncParentStore",value:function syncParentStore(prevProps){if(this.props.display!==prevProps.display){this.store.dispatch({type:"SYNC_DISPLAY_FROM_PARENT_STORE",display:this.props.display})}if(this.props.theme!==prevProps.theme){this.store.dispatch({type:"SYNC_THEME_FROM_PARENT_STORE",theme:this.props.theme})}if(this.props.localConfig!==prevProps.localConfig){this.store.dispatch({type:"SYNC_LOCAL_CONFIG_FROM_PARENT_STORE",localConfig:this.props.localConfig})}if(this.props.layers!==prevProps.layers){this.store.dispatch({type:"SYNC_LAYERS_FROM_PARENT_STORE",layers:this.props.layers})}if(this.props.map!==prevProps.map){this.store.dispatch({type:"SYNC_MAP_FROM_PARENT_STORE",map:this.props.map})}}},{key:"render",value:function render(){var _this$props$theme$cur2;var button=(_this$props$theme$cur2=this.props.theme.current)!==null&&_this$props$theme$cur2!==void 0&&_this$props$theme$cur2.map3d?/*#__PURE__*/React.createElement(View3DSwitcher,{key:"View3DButton",position:this.props.buttonPosition}):null;return[button,this.render3DWindow()]}}])}(React.Component);_defineProperty(View3D,"propTypes",{addLayerFeatures:PropTypes.func,/** The position slot index of the 3d switch map button, from the bottom (0: bottom slot). */buttonPosition:PropTypes.number,/** The position of the navigation controls. Either `top` or `bottom`. */controlsPosition:PropTypes.string,/** The default scene quality factor (`20`: min, `100`: max). */defaultSceneQuality:PropTypes.number,display:PropTypes.object,/** Default window geometry. */geometry:PropTypes.shape({initialWidth:PropTypes.number,initialHeight:PropTypes.number,initialX:PropTypes.number,initialY:PropTypes.number,initiallyDocked:PropTypes.bool}),layers:PropTypes.object,localConfig:PropTypes.object,map:PropTypes.object,/** Mouse buttons assignment. You can assign `pan`, `rotate`, `zoom` to each button. */mouseButtons:PropTypes.shape({left:PropTypes.string,middle:PropTypes.string,right:PropTypes.string}),panTo:PropTypes.func,/** Options to pass to the 3D plugins, in the form `{"<PluginName>": {<options>}}`.
|
|
22
|
+
* Refer to the documentation of the <a href="#plugins3d">3D plugins</a> for settable options. */pluginOptions:PropTypes.object,plugins3d:PropTypes.object,removeLayer:PropTypes.func,searchProviders:PropTypes.object,setView3dMode:PropTypes.func,startupParams:PropTypes.object,startupState:PropTypes.object,theme:PropTypes.object,view3dMode:PropTypes.number,zoomToPoint:PropTypes.func});_defineProperty(View3D,"defaultProps",{buttonPosition:6,controlsPosition:"top",geometry:{initialWidth:600,initialHeight:800,initialX:0,initialY:0,initiallyDocked:true},pluginOptions:{},mouseButtons:{left:"pan",middle:"zoom",right:"rotate"}});export default(function(plugins3d){return connect(function(state){return{plugins3d:plugins3d,display:state.display,map:state.map,layers:state.layers,theme:state.theme,localConfig:state.localConfig,view3dMode:state.display.view3dMode,startupParams:state.localConfig.startupParams,startupState:state.localConfig.startupState}},{addLayerFeatures:addLayerFeatures,removeLayer:removeLayer,panTo:panTo,zoomToPoint:zoomToPoint,setView3dMode:setView3dMode})(View3D)});
|
|
@@ -12,7 +12,7 @@ var pickPosition=[];var pickNormal=[];helper.forEachFeatureTriangle(pickFeatureI
|
|
|
12
12
|
_this.addHiglightGeometry(pick.object.matrixWorld,pickPosition,pickNormal);// Gather extra attributes
|
|
13
13
|
if(_this.props.tileInfoServiceUrl){var _helper$getTileUserDa=helper.getTileUserData(),tilesetName=_helper$getTileUserDa.tilesetName,featureIdAttr=_helper$getTileUserDa.featureIdAttr;var url=_this.props.tileInfoServiceUrl.replace("{tileset}",tilesetName).replace("{objectid}",featureAttrs[featureIdAttr]);axios.get(url).then(function(response){response.data.forEach(function(attr){if(attr.name in featureAttrs&&featureAttrs[attr.name]===attr.value){// Use attribute alias
|
|
14
14
|
delete featureAttrs[attr.name]}featureAttrs[attr.alias]=attr.value});_this.setState({pickAttrs:featureAttrs})})["catch"](function(){_this.setState({pickAttrs:featureAttrs})})}else{_this.setState({pickAttrs:featureAttrs})}});_defineProperty(_this,"identifyObjectPick",function(pick){var posAttr=pick.object.geometry.getAttribute("position");var norAttr=pick.object.geometry.getAttribute("normal");var index=pick.object.geometry.getIndex();// Add selection object
|
|
15
|
-
_this.addHiglightGeometry(pick.object.matrixWorld,posAttr.array,norAttr.array,index);// Set pick attrs
|
|
16
|
-
_this.setState({pickAttrs:pick.object.userData})});_defineProperty(_this,"addHiglightGeometry",function(matrixWorld,position,normal){var index=arguments.length>3&&arguments[3]!==undefined?arguments[3]:null;var material=new MeshStandardMaterial({color:16711680});var geometry=new BufferGeometry;geometry.setAttribute("position",new Float32BufferAttribute(position,3));geometry.setAttribute("normal",new Float32BufferAttribute(normal,3))
|
|
15
|
+
_this.addHiglightGeometry(pick.object.matrixWorld,posAttr.array,norAttr===null||norAttr===void 0?void 0:norAttr.array,index);// Set pick attrs
|
|
16
|
+
_this.setState({pickAttrs:pick.object.userData})});_defineProperty(_this,"addHiglightGeometry",function(matrixWorld,position,normal){var index=arguments.length>3&&arguments[3]!==undefined?arguments[3]:null;var material=new MeshStandardMaterial({color:16711680});var geometry=new BufferGeometry;geometry.setAttribute("position",new Float32BufferAttribute(position,3));if(normal){geometry.setAttribute("normal",new Float32BufferAttribute(normal,3))}geometry.setIndex(index);var mesh=new Mesh(geometry,material);mesh.applyMatrix4(matrixWorld);mesh.updateMatrixWorld();mesh.receiveShadow=true;_this.props.sceneContext.addSceneObject("__identify3d_highlight",mesh)});return _this}_inherits(Identify3D,_React$Component);return _createClass(Identify3D,[{key:"componentDidMount",value:function componentDidMount(){this.props.sceneContext.scene.viewport.addEventListener("pointerdown",this.identifyOnRelease)}},{key:"componentDidUpdate",value:function componentDidUpdate(prevProps){if(!this.props.identifyEnabled&&prevProps.identifyEnabled){this.clear()}}},{key:"render",value:function render(){if(this.state.pickAttrs===null){return null}return/*#__PURE__*/React.createElement(ResizeableWindow,{dockable:this.props.geometry.side,icon:"info-sign",initialHeight:this.props.geometry.initialHeight,initialWidth:this.props.geometry.initialWidth,initialX:this.props.geometry.initialX,initialY:this.props.geometry.initialY,initiallyDocked:this.props.geometry.initiallyDocked,onClose:this.clear,title:LocaleUtils.tr("identify.title")},/*#__PURE__*/React.createElement("div",{className:"identify-body",role:"body"},isEmpty(this.state.pickAttrs)?/*#__PURE__*/React.createElement("span",null,/*#__PURE__*/React.createElement("i",null,LocaleUtils.tr("identify.noattributes"))):/*#__PURE__*/React.createElement("div",{className:"identify-result-box"},/*#__PURE__*/React.createElement("table",{className:"attribute-list"},/*#__PURE__*/React.createElement("tbody",null,Object.entries(this.state.pickAttrs).map(function(_ref3){var _ref4=_slicedToArray(_ref3,2),key=_ref4[0],value=_ref4[1];return/*#__PURE__*/React.createElement("tr",{key:key},/*#__PURE__*/React.createElement("td",{className:"identify-attr-title"},/*#__PURE__*/React.createElement("i",null,key)),/*#__PURE__*/React.createElement("td",{className:"identify-attr-value"},value.toString()))}))))))}}])}(React.Component);_defineProperty(Identify3D,"propTypes",{/** Default window geometry with size, position and docking status. Positive position values (including '0') are related to top (InitialY) and left (InitialX), negative values (including '-0') to bottom (InitialY) and right (InitialX). */geometry:PropTypes.shape({initialWidth:PropTypes.number,initialHeight:PropTypes.number,initialX:PropTypes.number,initialY:PropTypes.number,initiallyDocked:PropTypes.bool,side:PropTypes.string}),identifyEnabled:PropTypes.bool,sceneContext:PropTypes.object,/** URL to service for querying additional tile information.
|
|
17
17
|
* Can contain the `{tileset}` and `{objectid}` placeholders.
|
|
18
18
|
* Expected to return a JSON dict with attributes.*/tileInfoServiceUrl:PropTypes.string});_defineProperty(Identify3D,"defaultProps",{geometry:{initialWidth:240,initialHeight:320,initialX:0,initialY:0,initiallyDocked:false,side:"left"}});export default connect(function(state){return{identifyEnabled:state.task.identifyEnabled}},{})(Identify3D);
|
|
@@ -6,4 +6,4 @@ function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof
|
|
|
6
6
|
* LICENSE file in the root directory of this source tree.
|
|
7
7
|
*/import React from"react";import{connect}from"react-redux";import classNames from"classnames";import isEmpty from"lodash.isempty";import PropTypes from"prop-types";import{setCurrentTask}from"../../actions/task";import Icon from"../../components/Icon";import SideBar from"../../components/SideBar";import ImportObjects3D from"../../components/map3d/ImportObjects3D";import NumberInput from"../../components/widgets/NumberInput";import LocaleUtils from"../../utils/LocaleUtils";import"./style/LayerTree3D.css";/**
|
|
8
8
|
* Layer and object tree for the 3D map
|
|
9
|
-
*/var LayerTree3D=/*#__PURE__*/function(_React$Component){function LayerTree3D(){var _this;_classCallCheck(this,LayerTree3D);for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++){args[_key]=arguments[_key]}_this=_callSuper(this,LayerTree3D,[].concat(args));_defineProperty(_this,"state",{activestylemenu:null,activemenu:null,importvisible:false});_defineProperty(_this,"renderBody",function(){var sceneContext=_this.props.sceneContext;return/*#__PURE__*/React.createElement("div",null,/*#__PURE__*/React.createElement("div",{className:"layertree3d-layers"},/*#__PURE__*/React.createElement("div",{className:"layertree3d-section"},LocaleUtils.tr("layertree3d.objects")),Object.entries(sceneContext.sceneObjects).map(function(_ref){var _ref2=_slicedToArray(_ref,2),objectId=_ref2[0],entry=_ref2[1];return _this.renderLayerEntry(objectId,entry,sceneContext.updateSceneObject,true)}),/*#__PURE__*/React.createElement("div",{className:"layertree3d-section"},LocaleUtils.tr("layertree3d.layers")),Object.entries(sceneContext.colorLayers).map(function(_ref3){var _ref4=_slicedToArray(_ref3,2),layerId=_ref4[0],entry=_ref4[1];return _this.renderLayerEntry(layerId,entry,sceneContext.updateColorLayer,false)}),/*#__PURE__*/React.createElement("div",{className:"layertree3d-option",onClick:function onClick(){return _this.setState(function(state){return{importvisible:!state.importvisible}})}},/*#__PURE__*/React.createElement(Icon,{icon:_this.state.importvisible?"collapse":"expand"})," ",LocaleUtils.tr("layertree3d.importobjects"))),_this.state.importvisible?/*#__PURE__*/React.createElement(ImportObjects3D,{importedTilesBaseUrl:_this.props.importedTilesBaseUrl,sceneContext:_this.props.sceneContext}):null)});_defineProperty(_this,"renderLayerEntry",function(entryId,entry,updateCallback,isObject){var _entry$title,_entry$title2;if(entry.layertree===false){return null}var classes=classNames({"layertree3d-item":true,"layertree3d-item-disabled":!entry.visibility});var styleMenuClasses=classNames({"layertree3d-item-menubutton":true,"layertree3d-item-menubutton-active":_this.state.activestylemenu===entryId});var optMenuClasses=classNames({"layertree3d-item-menubutton":true,"layertree3d-item-menubutton-active":_this.state.activemenu===entryId});return/*#__PURE__*/React.createElement("div",{className:"layertree3d-item-container",key:entryId},/*#__PURE__*/React.createElement("div",{className:classes},/*#__PURE__*/React.createElement(Icon,{className:"layertree3d-item-checkbox",icon:entry.visibility?"checked":"unchecked",onClick:function onClick(){return updateCallback(entryId,{visibility:!entry.visibility})}}),/*#__PURE__*/React.createElement("span",{className:"layertree3d-item-title",title:(_entry$title=entry.title)!==null&&_entry$title!==void 0?_entry$title:entryId},(_entry$title2=entry.title)!==null&&_entry$title2!==void 0?_entry$title2:entryId),Object.keys(entry.styles||{}).length>1?/*#__PURE__*/React.createElement(Icon,{className:styleMenuClasses,icon:"paint",onClick:function onClick(){return _this.layerStyleMenuToggled(entryId)}}):null,entry.drawGroup||entry.imported?/*#__PURE__*/React.createElement(Icon,{className:"layertree3d-item-remove",icon:"trash",onClick:function onClick(){return _this.props.sceneContext.removeSceneObject(entryId)}}):null,/*#__PURE__*/React.createElement(Icon,{className:optMenuClasses,icon:"cog",onClick:function onClick(){return _this.layerMenuToggled(entryId)}})),_this.state.activemenu===entryId?/*#__PURE__*/React.createElement("div",{className:"layertree3d-item-optionsmenu"},/*#__PURE__*/React.createElement("div",{className:"layertree3d-item-optionsmenu-row"},isObject?/*#__PURE__*/React.createElement(Icon,{icon:"zoom",onClick:function onClick(){return _this.props.sceneContext.zoomToObject(entryId)},title:LocaleUtils.tr("layertree3d.zoomtoobject")}):null,entry.imported?/*#__PURE__*/React.createElement(Icon,{icon:"draw",onClick:function onClick(){return _this.editObject(entryId)}}):null,/*#__PURE__*/React.createElement(Icon,{icon:"transparency"}),/*#__PURE__*/React.createElement("input",{className:"layertree3d-item-transparency-slider",max:"255",min:"0",onChange:function onChange(ev){return updateCallback(entryId,{opacity:parseInt(ev.target.value,10)})},step:"1",type:"range",value:entry.opacity})),entry.extrusionHeight!==undefined?/*#__PURE__*/React.createElement("div",{className:"layertree3d-item-optionsmenu-row"},/*#__PURE__*/React.createElement("span",null,"Extrude:"),/*#__PURE__*/React.createElement(React.Fragment,null,"\xA0"),/*#__PURE__*/React.createElement("select",{onChange:function onChange(ev){return updateCallback(entryId,{extrusionHeight:ev.target.value==="__value"?0:ev.target.value})},value:typeof entry.extrusionHeight==="string"?entry.extrusionHeight:"__value"},/*#__PURE__*/React.createElement("option",{value:"__value"},LocaleUtils.tr("layertree3d.customheight")),(entry.fields||[]).map(function(field){return/*#__PURE__*/React.createElement("option",{key:field,value:field},field)})),typeof entry.extrusionHeight!=="string"?/*#__PURE__*/React.createElement(NumberInput,{max:500,min:0,onChange:function onChange(h){return updateCallback(entryId,{extrusionHeight:h})},value:entry.extrusionHeight}):null):null):null,_this.state.activestylemenu===entryId?/*#__PURE__*/React.createElement("div",{className:"layertree3d-item-stylemenu"},Object.keys(entry.styles).map(function(name){return/*#__PURE__*/React.createElement("div",{key:name,onClick:function onClick(){return updateCallback(entryId,{style:name})}},/*#__PURE__*/React.createElement(Icon,{icon:entry.style===name?"radio_checked":"radio_unchecked"}),/*#__PURE__*/React.createElement("div",null,name))})):null,!isEmpty(entry.sublayers)?/*#__PURE__*/React.createElement("div",{className:"layertree3d-item-sublayers"},entry.sublayers.map(function(sublayer,idx){return _this.renderSublayer(sublayer,entryId,updateCallback,[idx],entry.visibility)})):null)});_defineProperty(_this,"renderSublayer",function(sublayer,entryId,updateCallback,path,parentVisible){var key=entryId+":"+path.join(":");var classes=classNames({"layertree3d-item":true,"layertree3d-item-disabled":!parentVisible||!sublayer.visibility});var optMenuClasses=classNames({"layertree3d-item-menubutton":true,"layertree3d-item-menubutton-active":_this.state.activemenu===key});return/*#__PURE__*/React.createElement("div",{className:"layertree3d-item-container",key:key},/*#__PURE__*/React.createElement("div",{className:classes},/*#__PURE__*/React.createElement(Icon,{className:"layertree3d-item-checkbox",icon:sublayer.visibility?"checked":"unchecked",onClick:function onClick(){return updateCallback(entryId,{visibility:!sublayer.visibility},path)},sublayer:"layertree3d-item-checkbox"}),/*#__PURE__*/React.createElement("span",{className:"layertree3d-item-title",title:sublayer.title},sublayer.title),/*#__PURE__*/React.createElement(Icon,{className:optMenuClasses,icon:"cog",onClick:function onClick(){return _this.layerMenuToggled(key)}})),_this.state.activemenu===key?/*#__PURE__*/React.createElement("div",{className:"layertree3d-item-optionsmenu"},/*#__PURE__*/React.createElement("div",{className:"layertree3d-item-optionsmenu-row"},/*#__PURE__*/React.createElement(Icon,{icon:"transparency"}),/*#__PURE__*/React.createElement("input",{className:"layertree3d-item-transparency-slider",max:"255",min:"0",onChange:function onChange(ev){return updateCallback(entryId,{opacity:parseInt(ev.target.value,10)},path)},step:"1",type:"range",value:sublayer.opacity}))):null,!isEmpty(sublayer.sublayers)?/*#__PURE__*/React.createElement("div",{className:"layertree3d-item-sublayers"},sublayer.sublayers.map(function(child,idx){return _this.renderSublayer(child,entryId,updateCallback,[].concat(_toConsumableArray(path),[idx]),parentVisible&&sublayer.visibility)})):null)});_defineProperty(_this,"layerStyleMenuToggled",function(entryId){_this.setState(function(state){return{activestylemenu:state.activestylemenu===entryId?null:entryId}})});_defineProperty(_this,"layerMenuToggled",function(entryId){_this.setState(function(state){return{activemenu:state.activemenu===entryId?null:entryId}})});_defineProperty(_this,"editObject",function(objectId){_this.props.
|
|
9
|
+
*/var LayerTree3D=/*#__PURE__*/function(_React$Component){function LayerTree3D(){var _this;_classCallCheck(this,LayerTree3D);for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++){args[_key]=arguments[_key]}_this=_callSuper(this,LayerTree3D,[].concat(args));_defineProperty(_this,"state",{activestylemenu:null,activemenu:null,importvisible:false});_defineProperty(_this,"renderBody",function(){var sceneContext=_this.props.sceneContext;return/*#__PURE__*/React.createElement("div",null,/*#__PURE__*/React.createElement("div",{className:"layertree3d-layers"},/*#__PURE__*/React.createElement("div",{className:"layertree3d-section"},LocaleUtils.tr("layertree3d.objects")),Object.entries(sceneContext.sceneObjects).map(function(_ref){var _ref2=_slicedToArray(_ref,2),objectId=_ref2[0],entry=_ref2[1];return _this.renderLayerEntry(objectId,entry,sceneContext.updateSceneObject,true)}),/*#__PURE__*/React.createElement("div",{className:"layertree3d-section"},LocaleUtils.tr("layertree3d.layers")),Object.entries(sceneContext.colorLayers).map(function(_ref3){var _ref4=_slicedToArray(_ref3,2),layerId=_ref4[0],entry=_ref4[1];return _this.renderLayerEntry(layerId,entry,sceneContext.updateColorLayer,false)}),/*#__PURE__*/React.createElement("div",{className:"layertree3d-option",onClick:function onClick(){return _this.setState(function(state){return{importvisible:!state.importvisible}})}},/*#__PURE__*/React.createElement(Icon,{icon:_this.state.importvisible?"collapse":"expand"})," ",LocaleUtils.tr("layertree3d.importobjects"))),_this.state.importvisible?/*#__PURE__*/React.createElement(ImportObjects3D,{importedTilesBaseUrl:_this.props.importedTilesBaseUrl,sceneContext:_this.props.sceneContext}):null)});_defineProperty(_this,"renderLayerEntry",function(entryId,entry,updateCallback,isObject){var _entry$title,_entry$title2;if(entry.layertree===false){return null}var classes=classNames({"layertree3d-item":true,"layertree3d-item-disabled":!entry.visibility});var styleMenuClasses=classNames({"layertree3d-item-menubutton":true,"layertree3d-item-menubutton-active":_this.state.activestylemenu===entryId});var optMenuClasses=classNames({"layertree3d-item-menubutton":true,"layertree3d-item-menubutton-active":_this.state.activemenu===entryId});return/*#__PURE__*/React.createElement("div",{className:"layertree3d-item-container",key:entryId},/*#__PURE__*/React.createElement("div",{className:classes},/*#__PURE__*/React.createElement(Icon,{className:"layertree3d-item-checkbox",icon:entry.visibility?"checked":"unchecked",onClick:function onClick(){return updateCallback(entryId,{visibility:!entry.visibility})}}),/*#__PURE__*/React.createElement("span",{className:"layertree3d-item-title",title:(_entry$title=entry.title)!==null&&_entry$title!==void 0?_entry$title:entryId},(_entry$title2=entry.title)!==null&&_entry$title2!==void 0?_entry$title2:entryId),Object.keys(entry.styles||{}).length>1?/*#__PURE__*/React.createElement(Icon,{className:styleMenuClasses,icon:"paint",onClick:function onClick(){return _this.layerStyleMenuToggled(entryId)}}):null,entry.drawGroup||entry.imported?/*#__PURE__*/React.createElement(Icon,{className:"layertree3d-item-remove",icon:"trash",onClick:function onClick(){return _this.props.sceneContext.removeSceneObject(entryId)}}):null,/*#__PURE__*/React.createElement(Icon,{className:optMenuClasses,icon:"cog",onClick:function onClick(){return _this.layerMenuToggled(entryId)}})),_this.state.activemenu===entryId?/*#__PURE__*/React.createElement("div",{className:"layertree3d-item-optionsmenu"},/*#__PURE__*/React.createElement("div",{className:"layertree3d-item-optionsmenu-row"},isObject?/*#__PURE__*/React.createElement(Icon,{icon:"zoom",onClick:function onClick(){return _this.props.sceneContext.zoomToObject(entryId)},title:LocaleUtils.tr("layertree3d.zoomtoobject")}):null,entry.imported?/*#__PURE__*/React.createElement(Icon,{icon:"draw",onClick:function onClick(){return _this.editObject(entryId)}}):null,/*#__PURE__*/React.createElement(Icon,{icon:"transparency"}),/*#__PURE__*/React.createElement("input",{className:"layertree3d-item-transparency-slider",max:"255",min:"0",onChange:function onChange(ev){return updateCallback(entryId,{opacity:parseInt(ev.target.value,10)})},step:"1",type:"range",value:entry.opacity})),entry.extrusionHeight!==undefined?/*#__PURE__*/React.createElement("div",{className:"layertree3d-item-optionsmenu-row"},/*#__PURE__*/React.createElement("span",null,"Extrude:"),/*#__PURE__*/React.createElement(React.Fragment,null,"\xA0"),/*#__PURE__*/React.createElement("select",{onChange:function onChange(ev){return updateCallback(entryId,{extrusionHeight:ev.target.value==="__value"?0:ev.target.value})},value:typeof entry.extrusionHeight==="string"?entry.extrusionHeight:"__value"},/*#__PURE__*/React.createElement("option",{value:"__value"},LocaleUtils.tr("layertree3d.customheight")),(entry.fields||[]).map(function(field){return/*#__PURE__*/React.createElement("option",{key:field,value:field},field)})),typeof entry.extrusionHeight!=="string"?/*#__PURE__*/React.createElement(NumberInput,{max:500,min:0,onChange:function onChange(h){return updateCallback(entryId,{extrusionHeight:h})},value:entry.extrusionHeight}):null):null):null,_this.state.activestylemenu===entryId?/*#__PURE__*/React.createElement("div",{className:"layertree3d-item-stylemenu"},Object.keys(entry.styles).map(function(name){return/*#__PURE__*/React.createElement("div",{key:name,onClick:function onClick(){return updateCallback(entryId,{style:name})}},/*#__PURE__*/React.createElement(Icon,{icon:entry.style===name?"radio_checked":"radio_unchecked"}),/*#__PURE__*/React.createElement("div",null,name))})):null,!isEmpty(entry.sublayers)?/*#__PURE__*/React.createElement("div",{className:"layertree3d-item-sublayers"},entry.sublayers.map(function(sublayer,idx){return _this.renderSublayer(sublayer,entryId,updateCallback,[idx],entry.visibility)})):null)});_defineProperty(_this,"renderSublayer",function(sublayer,entryId,updateCallback,path,parentVisible){var key=entryId+":"+path.join(":");var classes=classNames({"layertree3d-item":true,"layertree3d-item-disabled":!parentVisible||!sublayer.visibility});var optMenuClasses=classNames({"layertree3d-item-menubutton":true,"layertree3d-item-menubutton-active":_this.state.activemenu===key});return/*#__PURE__*/React.createElement("div",{className:"layertree3d-item-container",key:key},/*#__PURE__*/React.createElement("div",{className:classes},/*#__PURE__*/React.createElement(Icon,{className:"layertree3d-item-checkbox",icon:sublayer.visibility?"checked":"unchecked",onClick:function onClick(){return updateCallback(entryId,{visibility:!sublayer.visibility},path)},sublayer:"layertree3d-item-checkbox"}),/*#__PURE__*/React.createElement("span",{className:"layertree3d-item-title",title:sublayer.title},sublayer.title),/*#__PURE__*/React.createElement(Icon,{className:optMenuClasses,icon:"cog",onClick:function onClick(){return _this.layerMenuToggled(key)}})),_this.state.activemenu===key?/*#__PURE__*/React.createElement("div",{className:"layertree3d-item-optionsmenu"},/*#__PURE__*/React.createElement("div",{className:"layertree3d-item-optionsmenu-row"},/*#__PURE__*/React.createElement(Icon,{icon:"transparency"}),/*#__PURE__*/React.createElement("input",{className:"layertree3d-item-transparency-slider",max:"255",min:"0",onChange:function onChange(ev){return updateCallback(entryId,{opacity:parseInt(ev.target.value,10)},path)},step:"1",type:"range",value:sublayer.opacity}))):null,!isEmpty(sublayer.sublayers)?/*#__PURE__*/React.createElement("div",{className:"layertree3d-item-sublayers"},sublayer.sublayers.map(function(child,idx){return _this.renderSublayer(child,entryId,updateCallback,[].concat(_toConsumableArray(path),[idx]),parentVisible&&sublayer.visibility)})):null)});_defineProperty(_this,"layerStyleMenuToggled",function(entryId){_this.setState(function(state){return{activestylemenu:state.activestylemenu===entryId?null:entryId}})});_defineProperty(_this,"layerMenuToggled",function(entryId){_this.setState(function(state){return{activemenu:state.activemenu===entryId?null:entryId}})});_defineProperty(_this,"editObject",function(objectId){_this.props.setCurrentTask("EditDataset3D",null,null,{objectId:objectId})});return _this}_inherits(LayerTree3D,_React$Component);return _createClass(LayerTree3D,[{key:"render",value:function render(){var _this2=this;return/*#__PURE__*/React.createElement(SideBar,{icon:"layers",id:"LayerTree3D",title:LocaleUtils.tr("appmenu.items.LayerTree3D"),width:"20em"},function(){return{body:_this2.renderBody()}})}}])}(React.Component);_defineProperty(LayerTree3D,"propTypes",{/** Base URL of imported tile sets. */importedTilesBaseUrl:PropTypes.string,sceneContext:PropTypes.object,setCurrentTask:PropTypes.func});_defineProperty(LayerTree3D,"defaultProps",{importedTilesBaseUrl:":/"});export default connect(function(state){return{}},{setCurrentTask:setCurrentTask})(LayerTree3D);
|
|
@@ -22,5 +22,5 @@ var p=[bbox[0]+iX*deltaX,bbox[1]+iY*deltaY];var c=[p[0]+0.5*deltaX,p[1]+0.5*delt
|
|
|
22
22
|
var z1=(_elevationCache=elevationCache[iY*numX+iX])!==null&&_elevationCache!==void 0?_elevationCache:elevationCache[iY*numX+iX]=_this.getElevation(p);var z2=(_elevationCache2=elevationCache[iY*numX+iX+1])!==null&&_elevationCache2!==void 0?_elevationCache2:elevationCache[iY*numX+iX+1]=_this.getElevation([p[0]+deltaX,p[1]]);var z3=(_elevationCache3=elevationCache[(iY+1)*numX+iX+1])!==null&&_elevationCache3!==void 0?_elevationCache3:elevationCache[(iY+1)*numX+iX+1]=_this.getElevation([p[0]+deltaX,p[1]+deltaY]);var z4=(_elevationCache4=elevationCache[(iY+1)*numX+iX])!==null&&_elevationCache4!==void 0?_elevationCache4:elevationCache[(iY+1)*numX+iX]=_this.getElevation([p[0],p[1]+deltaY]);// Divide quad along diagonal with smaller elevation difference
|
|
23
23
|
var dz1=Math.abs(z3-z1);var dz2=Math.abs(z4-z2);if(dz1<dz2){var area1=_this.triangleArea([-deltaX,0,z1-z2],[0,deltaY,z3-z2]);var area2=_this.triangleArea([0,-deltaY,z1-z4],[deltaX,0,z3-z4]);area+=area1+area2}else{var _area=_this.triangleArea([deltaX,0,z2-z1],[0,deltaY,z4-z1]);var _area2=_this.triangleArea([-deltaX,0,z4-z3],[0,-deltaY,z1-z3]);area+=_area+_area2}}}_this.setState({result:area});// Setup for next measurement
|
|
24
24
|
_this.restart()});_defineProperty(_this,"measureHeight",function(lineString){if(lineString===null){_this.restart();return}_this.clearResult();_this.measurementObjects.push(lineString);// Setup for next measurement
|
|
25
|
-
_this.restart()});_defineProperty(_this,"getElevation",function(point){
|
|
25
|
+
_this.restart()});_defineProperty(_this,"getElevation",function(point){var _this$props$sceneCont;return(_this$props$sceneCont=_this.props.sceneContext.getTerrainHeightFromMap(point))!==null&&_this$props$sceneCont!==void 0?_this$props$sceneCont:0});_defineProperty(_this,"triangleArea",function(u,v){var cross=[u[1]*v[2]-u[2]*v[1],u[0]*v[2]-u[2]*v[0],u[0]*v[1]-u[1]*v[0]];return 0.5*Math.sqrt(cross[0]*cross[0]+cross[1]*cross[1]+cross[2]*cross[2])});_this.measureTool=null;_this.drawLayer=null;_this.measurementObjects=[];return _this}_inherits(Measure3D,_React$Component);return _createClass(Measure3D,[{key:"componentDidUpdate",value:function componentDidUpdate(prevProps,prevState){if(this.state.mode&&this.state.mode!==prevState.mode){this.clearResult();this.restart()}if(this.state.elevUnit!==prevState.elevUnit){// Re-render height label
|
|
26
26
|
this.measurementObjects[0].rebuildLabels();this.props.sceneContext.scene.notifyChange()}}},{key:"render",value:function render(){var _this2=this,_this$state$result;return[/*#__PURE__*/React.createElement(TaskBar,{key:"TaskBar",onHide:this.onHide,onShow:this.onShow,task:"Measure3D"},function(){return{body:/*#__PURE__*/React.createElement("div",{className:"measure-body"},_this2.renderModeSwitcher(),_this2.renderResult())}}),(_this$state$result=this.state.result)!==null&&_this$state$result!==void 0&&_this$state$result.profile?/*#__PURE__*/React.createElement(HeightProfile3D,{data:this.state.result.profile,key:"HeightProfile",sceneContext:this.props.sceneContext}):null]}}])}(React.Component);_defineProperty(Measure3D,"propTypes",{maxSampleCount:PropTypes.number,minMeasureLength:PropTypes.number,sceneContext:PropTypes.object});_defineProperty(Measure3D,"defaultProps",{maxSampleCount:500,minMeasureLength:1});export{Measure3D as default};
|
package/reducers/layers.js
CHANGED
|
@@ -10,6 +10,6 @@ return state}var newLayers=(state.flat||[]).map(function(layer){if(layer.id===ac
|
|
|
10
10
|
if(mutexVisibilityChanged){var newParent=newlayer;parentPath.forEach(function(index){newParent=newParent.sublayers[index]});var targetIdx=action.sublayerpath[action.sublayerpath.length-1];newParent.sublayers=newParent.sublayers.map(function(l,idx){return _objectSpread(_objectSpread({},l),{},{visibility:idx===targetIdx})})}if(["children","both"].includes(recurseDirection)){// recurse to children (except visibility to children in mutex case)
|
|
11
11
|
LayerUtils.propagateLayerProperty(newsublayer,action.property,action.newvalue)}if(["parents","both"].includes(recurseDirection)){// recurse to parents
|
|
12
12
|
LayerUtils.propagateLayerProperty(newlayer,action.property,action.newvalue,action.sublayerpath)}if(newlayer.type==="wms"){Object.assign(newlayer,LayerUtils.buildWMSLayerParams(newlayer,state.filter))}if(newlayer.role===LayerRole.BACKGROUND){UrlParams.updateParams({bl:newlayer.visibility?newlayer.name:""})}return newlayer}else if(layer.role===LayerRole.BACKGROUND&&backgroundVisibilityChanged){return _objectSpread(_objectSpread({},layer),{},{visibility:false})}return layer});UrlParams.updateParams({l:LayerUtils.buildWMSLayerUrlParam(newLayers)});return _objectSpread(_objectSpread({},state),{},{flat:newLayers})}case SET_LAYER_DIMENSIONS:{var _state$flat$find;// Set dimensions for all layers with the same URL (i.e. if a WMS is split)
|
|
13
|
-
var layerUrl=(_state$flat$find=state.flat.find(function(layer){return layer.id===action.layerId}))===null||_state$flat$find===void 0?void 0:_state$flat$find.url;if(!layerUrl){return""}var _newLayers=(state.flat||[]).map(function(layer){if(layer.url===layerUrl){var newLayer=_objectSpread(_objectSpread({},layer),{},{dimensionValues:action.dimensions});Object.assign(newLayer,LayerUtils.buildWMSLayerParams(newLayer,state.filter));return newLayer}return layer});return _objectSpread(_objectSpread({},state),{},{flat:_newLayers})}case ADD_LAYER:{var _action$layer$visibil,_action$layer$opacity,_action$options,_action$options2;var _newLayers2=(state.flat||[]).concat();var layerId=action.layer.id||uuidv4();var newLayer=_objectSpread(_objectSpread({},action.layer),{},{id:layerId,name:action.layer.name||layerId,role:action.layer.role||LayerRole.USERLAYER,queryable:action.layer.queryable||false,visibility:(_action$layer$visibil=action.layer.visibility)!==null&&_action$layer$visibil!==void 0?_action$layer$visibil:true,opacity:(_action$layer$opacity=action.layer.opacity)!==null&&_action$layer$opacity!==void 0?_action$layer$opacity:255,layertreehidden:action.layer.layertreehidden||action.layer.role>LayerRole.USERLAYER});if(
|
|
13
|
+
var layerUrl=(_state$flat$find=state.flat.find(function(layer){return layer.id===action.layerId}))===null||_state$flat$find===void 0?void 0:_state$flat$find.url;if(!layerUrl){return""}var _newLayers=(state.flat||[]).map(function(layer){if(layer.url===layerUrl){var newLayer=_objectSpread(_objectSpread({},layer),{},{dimensionValues:action.dimensions});Object.assign(newLayer,LayerUtils.buildWMSLayerParams(newLayer,state.filter));return newLayer}return layer});return _objectSpread(_objectSpread({},state),{},{flat:_newLayers})}case ADD_LAYER:{var _action$layer$visibil,_action$layer$opacity,_action$options,_action$options2;var _newLayers2=(state.flat||[]).concat();var layerId=action.layer.id||uuidv4();var newLayer=_objectSpread(_objectSpread({},action.layer),{},{id:layerId,name:action.layer.name||layerId,role:action.layer.role||LayerRole.USERLAYER,queryable:action.layer.queryable||false,visibility:(_action$layer$visibil=action.layer.visibility)!==null&&_action$layer$visibil!==void 0?_action$layer$visibil:true,opacity:(_action$layer$opacity=action.layer.opacity)!==null&&_action$layer$opacity!==void 0?_action$layer$opacity:255,layertreehidden:action.layer.layertreehidden||action.layer.role>LayerRole.USERLAYER});if((_action$options=action.options)!==null&&_action$options!==void 0&&_action$options.beforeLayerName||(_action$options2=action.options)!==null&&_action$options2!==void 0&&_action$options2.afterLayerName){_newLayers2=LayerUtils.insertLayer(_newLayers2,newLayer,"name",action.options.beforeLayerName||action.options.afterLayerName,action.options.afterLayerName?true:false)}else{var inspos=0;if(action.pos===null){for(;inspos<_newLayers2.length&&newLayer.role<_newLayers2[inspos].role;++inspos);}else{inspos=action.pos}_newLayers2.splice(inspos,0,newLayer);// Compress layers if possible
|
|
14
14
|
_newLayers2=LayerUtils.implodeLayers(LayerUtils.explodeLayers(_newLayers2))}var _iterator=_createForOfIteratorHelper(_newLayers2),_step;try{for(_iterator.s();!(_step=_iterator.n()).done;){var lyr=_step.value;if(lyr.type==="wms"){Object.assign(lyr,LayerUtils.buildWMSLayerParams(lyr,state.filter))}}}catch(err){_iterator.e(err)}finally{_iterator.f()}UrlParams.updateParams({l:LayerUtils.buildWMSLayerUrlParam(_newLayers2)});if(newLayer.role===LayerRole.BACKGROUND&&newLayer.visibility){UrlParams.updateParams({bl:newLayer.name})}return _objectSpread(_objectSpread({},state),{},{flat:_newLayers2})}case ADD_LAYER_SEPARATOR:{var _newLayers3=LayerUtils.insertSeparator(state.flat,action.title,action.afterLayerId,action.afterSublayerPath);var _iterator2=_createForOfIteratorHelper(_newLayers3),_step2;try{for(_iterator2.s();!(_step2=_iterator2.n()).done;){var layer=_step2.value;if(layer.type==="wms"){Object.assign(layer,LayerUtils.buildWMSLayerParams(layer,state.filter))}}}catch(err){_iterator2.e(err)}finally{_iterator2.f()}UrlParams.updateParams({l:LayerUtils.buildWMSLayerUrlParam(_newLayers3)});return _objectSpread(_objectSpread({},state),{},{flat:_newLayers3})}case REMOVE_LAYER:{var _layer=state.flat.find(function(l){return l.id===action.layerId});if(!_layer){return state}var _newLayers4=state.flat;if(_layer.role===LayerRole.BACKGROUND||isEmpty(action.sublayerpath)){var position=state.flat.findIndex(function(l){return l.id===action.layerId});_newLayers4=_toConsumableArray(_newLayers4);_newLayers4.splice(position,1);if(position>0&&position<_newLayers4.length&&_newLayers4[position-1].id===_newLayers4[position].id){// Compress layers
|
|
15
15
|
_newLayers4=LayerUtils.implodeLayers(LayerUtils.explodeLayers(_newLayers4))}}else{_newLayers4=LayerUtils.removeLayer(state.flat,_layer,action.sublayerpath).map(function(l){if(l.type==="wms"){return _objectSpread(_objectSpread({},l),LayerUtils.buildWMSLayerParams(l,state.filter))}else{return l}})}UrlParams.updateParams({l:LayerUtils.buildWMSLayerUrlParam(_newLayers4)});return _objectSpread(_objectSpread({},state),{},{flat:_newLayers4})}case ADD_LAYER_FEATURES:{var _layerId=action.layer.id||uuidv4();var _newLayers5=(state.flat||[]).concat();var idx=_newLayers5.findIndex(function(layer){return layer.id===_layerId});if(idx===-1){var newFeatures=action.features.map(function(f){return _objectSpread(_objectSpread({},f),{},{id:f.id||(f.properties||{}).id||uuidv4()})});var _newLayer=_objectSpread(_objectSpread({},action.layer),{},{id:_layerId,type:"vector",name:action.layer.name||_layerId,features:newFeatures,role:action.layer.role||LayerRole.USERLAYER,queryable:action.layer.queryable||false,visibility:action.layer.visibility||true,opacity:action.layer.opacity||255,layertreehidden:action.layer.layertreehidden||action.layer.role>LayerRole.USERLAYER,bbox:VectorLayerUtils.computeFeaturesBBox(action.features)});var _inspos=0;for(;_inspos<_newLayers5.length&&_newLayer.role<_newLayers5[_inspos].role;++_inspos);_newLayers5.splice(_inspos,0,_newLayer)}else{var addFeatures=action.features.map(function(f){return _objectSpread(_objectSpread({},f),{},{id:f.id||(f.properties||{}).id||uuidv4()})});var _newFeatures=action.clear?addFeatures:[].concat(_toConsumableArray((_newLayers5[idx].features||[]).filter(function(f){return!addFeatures.find(function(g){return g.id===f.id})})),_toConsumableArray(addFeatures));_newLayers5[idx]=_objectSpread(_objectSpread({},_newLayers5[idx]),{},{features:_newFeatures,bbox:VectorLayerUtils.computeFeaturesBBox(_newFeatures),rev:action.layer.rev})}return _objectSpread(_objectSpread({},state),{},{flat:_newLayers5})}case REMOVE_LAYER_FEATURES:{var changed=false;var _newLayers6=(state.flat||[]).reduce(function(result,layer){if(layer.id===action.layerId){var _newFeatures2=(layer.features||[]).filter(function(f){return action.featureIds.includes(f.id)===false});if(!isEmpty(_newFeatures2)||action.keepEmptyLayer){result.push(_objectSpread(_objectSpread({},layer),{},{features:_newFeatures2,bbox:VectorLayerUtils.computeFeaturesBBox(_newFeatures2)}))}changed=true}else{result.push(layer)}return result},[]);if(changed){return _objectSpread(_objectSpread({},state),{},{flat:_newLayers6})}else{return state}}case CLEAR_LAYER:{var _newLayers7=(state.flat||[]).map(function(layer){if(layer.id===action.layerId){return _objectSpread(_objectSpread({},layer),{},{features:[],bbox:null})}else{return layer}});return _objectSpread(_objectSpread({},state),{},{flat:_newLayers7})}case ADD_THEME_SUBLAYER:{var themeLayerIdx=state.flat.findIndex(function(layer){return layer.role===LayerRole.THEME});if(themeLayerIdx>=0){var _newLayers8=state.flat.slice(0);_newLayers8[themeLayerIdx]=LayerUtils.mergeSubLayers(state.flat[themeLayerIdx],action.layer);_newLayers8[themeLayerIdx].visibility=true;Object.assign(_newLayers8[themeLayerIdx],LayerUtils.buildWMSLayerParams(_newLayers8[themeLayerIdx],state.filter));UrlParams.updateParams({l:LayerUtils.buildWMSLayerUrlParam(_newLayers8)});return _objectSpread(_objectSpread({},state),{},{flat:_newLayers8})}return state}case REFRESH_LAYER:{var _newLayers9=(state.flat||[]).map(function(layer){if(action.filter(layer)){return _objectSpread(_objectSpread({},layer),{},{rev:+new Date})}return layer});return _objectSpread(_objectSpread({},state),{},{flat:_newLayers9})}case REMOVE_ALL_LAYERS:{return defaultState}case REORDER_LAYER:{var _newLayers10=LayerUtils.reorderLayer(state.flat,action.layer,action.sublayerpath,action.direction,action.preventSplittingGroups).map(function(layer){if(layer.type==="wms"){return _objectSpread(_objectSpread({},layer),LayerUtils.buildWMSLayerParams(layer,state.filter))}else{return layer}});UrlParams.updateParams({l:LayerUtils.buildWMSLayerUrlParam(_newLayers10)});return _objectSpread(_objectSpread({},state),{},{flat:_newLayers10})}case REPLACE_PLACEHOLDER_LAYER:{var _newLayers11=LayerUtils.replacePlaceholderLayer(state.flat,action.id,action.layer,state.filter);UrlParams.updateParams({l:LayerUtils.buildWMSLayerUrlParam(_newLayers11)});return _objectSpread(_objectSpread({},state),{},{flat:_newLayers11})}case SET_SWIPE:{return _objectSpread(_objectSpread({},state),{},{swipe:action.swipe})}case SET_FILTER:{var filter={filterParams:action.filter,filterGeom:action.filterGeom,timeRange:action.timeRange};var _newLayers12=state.flat.map(function(layer){if(layer.type==="wms"){return _objectSpread(_objectSpread({},layer),LayerUtils.buildWMSLayerParams(layer,filter))}return layer});return _objectSpread(_objectSpread({},state),{},{flat:_newLayers12,filter:filter})}case SET_THEME_LAYERS_VISIBILITY_PRESET:{var _newLayers13=state.flat.map(function(layer){if(layer.role===LayerRole.THEME){var _newLayer2=LayerUtils.applyVisibilityPreset(layer,action.preset);return _objectSpread(_objectSpread({},_newLayer2),LayerUtils.buildWMSLayerParams(_newLayer2,state.filter))}else{return layer}});UrlParams.updateParams({l:LayerUtils.buildWMSLayerUrlParam(_newLayers13)});return _objectSpread(_objectSpread({},state),{},{flat:_newLayers13})}default:return state}}
|