qwc2 2025.8.6 → 2025.8.7

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.
@@ -17,12 +17,12 @@ if(_this.props.editContext.geomReadOnly){delete feature.geometry}var curConfig=_
17
17
  var relationValues=clone(feature.relationValues||{});delete feature.relationValues;var relationUploads={};var featureUploads={};// Collect all values from form fields
18
18
  var fieldnames=Array.from(_this.form.elements).map(function(element){return element.name}).filter(function(x){return x&&x!=="g-recaptcha-response"});fieldnames.forEach(function(name){var element=_this.form.elements.namedItem(name);if(element){var parts=name.split("__");var value=element.type==="radio"||element.type==="checkbox"?element.checked:element.value;var nullElements=["date","number","radio"];var nullFieldTypes=["date","number"];if(parts.length>=3){var _this$props$theme$edi,_this$props$theme$edi2,_this$props$theme$edi3;// Relation value
19
19
  // Usually <table>__<field>__<index>, but <field> might also contain __ (i.e. upload__user)
20
- var tablename=parts[0];var datasetname=mapPrefix+tablename;var field=parts.slice(1,parts.length-1).join("__");var index=parseInt(parts[parts.length-1],10);var nrelFieldConfig=(_this$props$theme$edi=(_this$props$theme$edi2=_this.props.theme.editConfig[tablename].fields)===null||_this$props$theme$edi2===void 0||(_this$props$theme$edi3=_this$props$theme$edi2.find)===null||_this$props$theme$edi3===void 0?void 0:_this$props$theme$edi3.call(_this$props$theme$edi2,function(f){return f.id===field}))!==null&&_this$props$theme$edi!==void 0?_this$props$theme$edi:{};var nrelFieldDataType=nrelFieldConfig.data_type;if(nrelFieldConfig.expression){// Skip virtual fields
20
+ var tablename=parts[0];var datasetname=mapPrefix+tablename;var field=parts.slice(1,parts.length-1).join("__");var index=parseInt(parts[parts.length-1],10);var nrelFieldConfig=(_this$props$theme$edi=(_this$props$theme$edi2=_this.props.theme.editConfig[tablename].fields)===null||_this$props$theme$edi2===void 0||(_this$props$theme$edi3=_this$props$theme$edi2.find)===null||_this$props$theme$edi3===void 0?void 0:_this$props$theme$edi3.call(_this$props$theme$edi2,function(f){return f.id===field}))!==null&&_this$props$theme$edi!==void 0?_this$props$theme$edi:{};var nrelFieldDataType=nrelFieldConfig.type;if(nrelFieldConfig.expression){// Skip virtual fields
21
21
  delete relationValues[datasetname].features[index][field];return}if((element instanceof RadioNodeList||nullElements.includes(element.type)||nullFieldTypes.includes(nrelFieldDataType))&&element.value===""){// Set empty value to null instead of empty string
22
22
  value=null}if(nrelFieldDataType==="text"&&textNullValue!==undefined&&element.value===textNullValue){// Convert text NULL to null
23
23
  value=null}// relationValues for table must exist as rows are either pre-existing or were added
24
- if(!(field in relationValues[datasetname].features[index].properties)){relationValues[datasetname].features[index].defaultedProperties=[].concat(_toConsumableArray(relationValues[datasetname].features[index].defaultedProperties||[]),[field])}relationValues[datasetname].features[index].properties[field]=value;if(relationValues[datasetname].features[index].__status__==="empty"){relationValues[datasetname].features[index].__status__="new"}if(element.type==="file"&&element.files.length>0){relationUploads[name]=element.files[0];relationValues[datasetname].features[index].properties[field]=""}else if(element.type==="hidden"&&element.value.startsWith("data:")){var filename=element.dataset.filename;var type=element.value.match(/image\/\w+/)[0];if(!filename){var ext=type.split("/")[1];filename=uuidv1()+"."+ext}relationUploads[name]=new File([_this.dataUriToBlob(element.value)],filename,{type:type});relationValues[datasetname].features[index].properties[field]=""}}else{var _fieldConfig$data_typ;var fieldConfig=(curConfig.fields||[]).find(function(field){return field.id===name})||{};if(fieldConfig.expression){// Skip virtual fields
25
- delete feature.properties[name];return}var dataType=(_fieldConfig$data_typ=fieldConfig.data_type)!==null&&_fieldConfig$data_typ!==void 0?_fieldConfig$data_typ:fieldConfig.type;if((element instanceof RadioNodeList||nullElements.includes(element.type)||nullFieldTypes.includes(dataType))&&element.value===""){// Set empty value to null instead of empty string
24
+ if(!(field in relationValues[datasetname].features[index].properties)){relationValues[datasetname].features[index].defaultedProperties=[].concat(_toConsumableArray(relationValues[datasetname].features[index].defaultedProperties||[]),[field])}relationValues[datasetname].features[index].properties[field]=value;if(relationValues[datasetname].features[index].__status__==="empty"){relationValues[datasetname].features[index].__status__="new"}if(element.type==="file"&&element.files.length>0){relationUploads[name]=element.files[0];relationValues[datasetname].features[index].properties[field]=""}else if(element.type==="hidden"&&element.value.startsWith("data:")){var filename=element.dataset.filename;var type=element.value.match(/image\/\w+/)[0];if(!filename){var ext=type.split("/")[1];filename=uuidv1()+"."+ext}relationUploads[name]=new File([_this.dataUriToBlob(element.value)],filename,{type:type});relationValues[datasetname].features[index].properties[field]=""}}else{var fieldConfig=(curConfig.fields||[]).find(function(field){return field.id===name})||{};if(fieldConfig.expression){// Skip virtual fields
25
+ delete feature.properties[name];return}var dataType=fieldConfig.type;if((element instanceof RadioNodeList||nullElements.includes(element.type)||nullFieldTypes.includes(dataType))&&element.value===""){// Set empty value to null instead of empty string
26
26
  value=null}if(dataType==="text"&&textNullValue!==undefined&&element.value===textNullValue){// Convert text NULL to null
27
27
  value=null}if(!(name in feature.properties)){feature.defaultedProperties=[].concat(_toConsumableArray(feature.defaultedProperties||[]),[name])}feature.properties[name]=value;if(element.type==="file"&&element.files.length>0){featureUploads[name]=element.files[0];feature.properties[name]=""}else if(element.type==="hidden"&&element.value.startsWith("data:")){var _filename=element.dataset.filename;var _type=element.value.match(/image\/\w+/)[0];if(!_filename){var _ext=_type.split("/")[1];_filename=uuidv1()+"."+_ext}featureUploads[name]=new File([_this.dataUriToBlob(element.value)],_filename,{type:_type});feature.properties[name]=""}}}});// Set relation values CRS and sort index if necessary
28
28
  Object.keys(relationValues).forEach(function(relTable){relationValues[relTable].features=relationValues[relTable].features.filter(function(relFeature){return relFeature.__status__!=="empty"}).map(function(relFeature,idx){var newRelFeature=_objectSpread(_objectSpread({},relFeature),{},{crs:{type:"name",properties:{name:CoordinatesUtils.toOgcUrnCrs(_this.props.map.projection)}}});var sortcol=_this.state.relationTables[relTable].sortcol;var noreorder=_this.state.relationTables[relTable].noreorder;if(sortcol&&!noreorder){newRelFeature.__status__=feature.__status__||(newRelFeature.properties[sortcol]!==idx?"changed":"");newRelFeature.properties[sortcol]=idx}return newRelFeature})});feature.relationValues=relationValues;var featureData=new FormData;featureData.set("feature",JSON.stringify(feature));Object.entries(featureUploads).forEach(function(_ref7){var _ref8=_slicedToArray(_ref7,2),key=_ref8[0],value=_ref8[1];return featureData.set("file:"+key,value)});Object.entries(relationUploads).forEach(function(_ref9){var _ref10=_slicedToArray(_ref9,2),key=_ref10[0],value=_ref10[1];return featureData.set("relfile:"+mapPrefix+key,value)});if(_this.state.captchaResponse){featureData.set("g-recaptcha-response",_this.state.captchaResponse)}if(_this.props.editContext.action==="Draw"){if(_this.props.iface.addFeatureMultipart){_this.props.iface.addFeatureMultipart(_this.props.editConfig,_this.props.map.projection,featureData,function(success,result){return _this.featureCommited(success,result)})}else{_this.props.iface.addFeature(_this.props.editConfig.editDataset,feature,_this.props.map.projection,function(success,result){return _this.featureCommited(success,result)})}}else if(_this.props.editContext.action==="Pick"){if(_this.props.iface.editFeatureMultipart){_this.props.iface.editFeatureMultipart(_this.props.editConfig,_this.props.map.projection,feature.id,featureData,function(success,result){return _this.featureCommited(success,result)})}else{_this.props.iface.editFeature(_this.props.editConfig.editDataset,feature,_this.props.map.projection,function(success,result){return _this.featureCommited(success,result)})}}});_defineProperty(_this,"featureCommited",function(success,result){if(!success){_this.commitFinished(false,result);return}// Check for relation records which failed to commit
@@ -5,4 +5,4 @@ function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof
5
5
  * This source code is licensed under the BSD-style license found in the
6
6
  * LICENSE file in the root directory of this source tree.
7
7
  */import React from"react";import mime from"mime-to-extensions";import PropTypes from"prop-types";import{v1 as uuidv1}from"uuid";import{showImageEditor}from"../utils/ImageEditor";import LocaleUtils from"../utils/LocaleUtils";import Icon from"./Icon";import ButtonBar from"./widgets/ButtonBar";import ModalDialog from"./widgets/ModalDialog";import"./style/EditUploadField.css";var EditUploadField=/*#__PURE__*/function(_React$Component){function EditUploadField(props){var _this;_classCallCheck(this,EditUploadField);_this=_callSuper(this,EditUploadField,[props]);_defineProperty(_this,"state",{camera:false,imageData:null,imageFilename:null});_defineProperty(_this,"fileSelected",function(ev){if(ev.target.files[0].type.startsWith("image/")){var reader=new FileReader;reader.readAsDataURL(ev.target.files[0]);reader.onload=function(){_this.setState({imageData:reader.result,imageFilename:ev.target.files[0].name});_this.props.updateFile(_this.props.fieldId,new File([_this.dataUriToBlob(reader.result)],ev.target.files[0].name,{type:ev.target.files[0].type}));_this.props.updateField(_this.props.fieldId,"")}}else{_this.props.updateField(_this.props.fieldId,"");_this.props.updateFile(_this.props.fieldId,ev.target.files[0])}});_defineProperty(_this,"enableCamera",function(){_this.setState({camera:true})});_defineProperty(_this,"disableCamera",function(){_this.disableMediaStream();_this.setState({camera:false})});_defineProperty(_this,"renderCaptureFrame",function(){return/*#__PURE__*/React.createElement(ModalDialog,{icon:"camera",onClose:_this.disableCamera,title:LocaleUtils.tr("editing.takepicture")},/*#__PURE__*/React.createElement("video",{className:"edit-capture-frame",ref:_this.activateMediaStream}),/*#__PURE__*/React.createElement("div",{className:"edit-capture-controls"},/*#__PURE__*/React.createElement(Icon,{icon:"camera",onClick:_this.capturePicture})))});_defineProperty(_this,"capturePicture",function(){if(_this.cameraStream){var width=_this.videoElement.videoWidth;var height=_this.videoElement.videoHeight;var canvas=document.createElement("canvas");canvas.width=width;canvas.height=height;var context=canvas.getContext("2d");context.drawImage(_this.videoElement,0,0,width,height);var imageData=canvas.toDataURL("image/jpeg");_this.setState({imageData:imageData,imageFilename:uuidv1()+".jpg"});_this.props.updateField(_this.props.fieldId,"");_this.props.updateFile(_this.props.fieldId,new File([_this.dataUriToBlob(imageData)],uuidv1()+".jpg",{type:"image/jpeg"}))}_this.disableCamera()});_defineProperty(_this,"imageButtonClicked",function(action){if(action==="Draw"){var fileValue=_this.props.value.startsWith("attachment:")?_this.props.value.replace(/attachment:\/\//,""):"";var fileType=mime.lookup(fileValue);var fileUrl=_this.props.iface.resolveAttachmentUrl(_this.props.dataset,fileValue);var imageData=fileType&&fileType.startsWith("image/")?fileUrl:_this.state.imageData;showImageEditor(imageData,function(newImageData){_this.setState({imageData:newImageData,imageFilename:fileValue.replace(/.*\//,"")});_this.props.updateField(_this.props.fieldId,"");_this.props.updateFile(_this.props.fieldId,new File([_this.dataUriToBlob(newImageData)],uuidv1()+".jpg",{type:"image/jpeg"}))})}else if(action==="Clear"){_this.clearImage()}});_defineProperty(_this,"clearImage",function(){_this.setState({imageData:null,imageFilename:null});_this.props.updateField(_this.props.fieldId,"");_this.props.updateFile(_this.props.fieldId,null)});_defineProperty(_this,"activateMediaStream",function(el){if(_this.state.camera&&!_this.cameraStream){var constraints={video:{width:{ideal:4096},height:{ideal:2160}}};navigator.mediaDevices.getUserMedia(constraints).then(function(mediaStream){_this.cameraStream=mediaStream;el.srcObject=mediaStream;el.play();_this.videoElement=el})["catch"](function(err){// eslint-disable-next-line
8
- console.warn("Unable to access camera: "+err)})}});_defineProperty(_this,"disableMediaStream",function(){if(_this.cameraStream){_this.cameraStream.getTracks()[0].stop();_this.cameraStream=null;_this.videoElement=null}});_defineProperty(_this,"download",function(href,filename){var a=document.createElement("a");a.href=href;a.target="_blank";a.setAttribute("download",filename);a.click()});_defineProperty(_this,"dataUriToBlob",function(dataUri){var parts=dataUri.split(",");var byteString=parts[0].indexOf("base64")>=0?atob(parts[1]):decodeURI(parts[1]);var mimeString=parts[0].split(":")[1].split(";")[0];var ia=new Uint8Array(byteString.length);for(var i=0;i<byteString.length;i++){ia[i]=byteString.charCodeAt(i)}return new Blob([ia],{type:mimeString})});_this.cameraStream=null;_this.videoElement=null;_this.portal=document.createElement("div");document.body.appendChild(_this.portal);return _this}_inherits(EditUploadField,_React$Component);return _createClass(EditUploadField,[{key:"componentWillUnmount",value:function componentWillUnmount(){this.disableMediaStream()}},{key:"render",value:function render(){var _this2=this;var fileValue=this.props.value.startsWith("attachment:")?this.props.value.replace(/attachment:\/\//,""):"";var fileType=mime.lookup(fileValue);var fileUrl=this.props.iface.resolveAttachmentUrl(this.props.dataset,fileValue);var constraints=_objectSpread(_objectSpread({},this.props.constraints),{},{accept:(this.props.constraints.accept||"").split(",").map(function(ext){return mime.lookup(ext)}).join(",")});var mediaSupport="mediaDevices"in navigator&&constraints.accept.split(",").includes("image/jpeg");var imageData=fileType&&fileType.startsWith("image/")?fileUrl:this.state.imageData;if(imageData){if(this.props.showThumbnails){var extension=fileValue?fileValue.replace(/^.*\./,""):"jpg";var imagebuttons=[{key:"Draw",icon:"paint",tooltip:LocaleUtils.tr("editing.paint"),disabled:this.props.disabled},{key:"Clear",icon:"clear",tooltip:LocaleUtils.tr("editing.clearpicture"),disabled:this.props.disabled}];return/*#__PURE__*/React.createElement("span",{className:"edit-upload-field-image"},/*#__PURE__*/React.createElement("img",{onClick:function onClick(){return _this2.download(imageData,_this2.props.fieldId+"."+extension)},src:imageData}),this.state.imageData?/*#__PURE__*/React.createElement("input",{"data-filename":this.state.imageFilename,name:this.props.name,type:"hidden",value:this.state.imageData}):null,!this.props.report?/*#__PURE__*/React.createElement(ButtonBar,{buttons:imagebuttons,onClick:this.imageButtonClicked,tooltipPos:"top"}):null)}else{var _extension=fileValue?fileValue.replace(/^.*\./,""):"jpg";return/*#__PURE__*/React.createElement("span",{className:"edit-upload-field edit-upload-field-imagelink"+(this.props.disabled?" edit-upload-field-disabled":"")},fileValue?/*#__PURE__*/React.createElement("a",{href:fileUrl,rel:"noreferrer",target:"_blank"},fileValue.replace(/.*\//,"")):/*#__PURE__*/React.createElement("a",{href:"#",onClick:function onClick(ev){_this2.download(imageData,_this2.state.imageFilename);ev.preventDefault()},rel:"noreferrer",target:"_blank"},this.state.imageFilename),/*#__PURE__*/React.createElement("img",{onClick:function onClick(){return _this2.download(imageData,_this2.props.fieldId+"."+_extension)},src:imageData}),this.props.report?null:/*#__PURE__*/React.createElement(Icon,{icon:"clear",onClick:this.props.disabled?null:this.clearImage}))}}else if(fileValue){return/*#__PURE__*/React.createElement("span",{className:"edit-upload-field edit-upload-field-imagelink"+(this.props.disabled?" edit-upload-field-disabled":"")},/*#__PURE__*/React.createElement("a",{href:fileUrl,rel:"noreferrer",target:"_blank"},fileValue.replace(/.*\//,"")),this.props.report?null:/*#__PURE__*/React.createElement(Icon,{icon:"clear",onClick:this.props.disabled?null:this.clearImage}))}else if(!this.props.report){return/*#__PURE__*/React.createElement("span",{className:"edit-upload-field-input"+(this.props.disabled?" edit-upload-field-input-disabled":"")},/*#__PURE__*/React.createElement("input",_extends({disabled:this.props.disabled,name:this.props.name,type:"file"},constraints,{onChange:this.fileSelected})),mediaSupport?/*#__PURE__*/React.createElement(Icon,{icon:"camera",onClick:this.props.disabled?null:this.enableCamera}):null,this.state.camera?this.renderCaptureFrame():null)}else{return null}}}])}(React.Component);_defineProperty(EditUploadField,"propTypes",{constraints:PropTypes.object,dataset:PropTypes.string,disabled:PropTypes.bool,fieldId:PropTypes.string,iface:PropTypes.object,name:PropTypes.string,report:PropTypes.bool,showThumbnails:PropTypes.bool,updateField:PropTypes.func,updateFile:PropTypes.func,value:PropTypes.string});_defineProperty(EditUploadField,"defaultProps",{showThumbnails:true,updateFile:function updateFile(){}});export{EditUploadField as default};
8
+ console.warn("Unable to access camera: "+err)})}});_defineProperty(_this,"disableMediaStream",function(){if(_this.cameraStream){_this.cameraStream.getTracks()[0].stop();_this.cameraStream=null;_this.videoElement=null}});_defineProperty(_this,"download",function(href,filename){var a=document.createElement("a");a.href=href;a.target="_blank";a.setAttribute("download",filename);a.click()});_defineProperty(_this,"dataUriToBlob",function(dataUri){var parts=dataUri.split(",");var byteString=parts[0].indexOf("base64")>=0?atob(parts[1]):decodeURI(parts[1]);var mimeString=parts[0].split(":")[1].split(";")[0];var ia=new Uint8Array(byteString.length);for(var i=0;i<byteString.length;i++){ia[i]=byteString.charCodeAt(i)}return new Blob([ia],{type:mimeString})});_this.cameraStream=null;_this.videoElement=null;_this.portal=document.createElement("div");document.body.appendChild(_this.portal);return _this}_inherits(EditUploadField,_React$Component);return _createClass(EditUploadField,[{key:"componentWillUnmount",value:function componentWillUnmount(){this.disableMediaStream()}},{key:"render",value:function render(){var _this2=this;var isAttachment=this.props.value.startsWith("attachment:");var fileValue=isAttachment?this.props.value.replace(/attachment:\/\//,""):this.props.value;var fileType=mime.lookup(fileValue);var fileUrl=isAttachment?this.props.iface.resolveAttachmentUrl(this.props.dataset,fileValue):fileValue;var constraints=_objectSpread(_objectSpread({},this.props.constraints),{},{accept:(this.props.constraints.accept||"").split(",").map(function(ext){return mime.lookup(ext)}).join(",")});var mediaSupport="mediaDevices"in navigator&&constraints.accept.split(",").includes("image/jpeg");var imageData=fileType&&fileType.startsWith("image/")?fileUrl:this.state.imageData;if(imageData){if(this.props.showThumbnails){var extension=fileValue?fileValue.replace(/^.*\./,""):"jpg";var imagebuttons=[{key:"Draw",icon:"paint",tooltip:LocaleUtils.tr("editing.paint"),disabled:this.props.disabled},{key:"Clear",icon:"clear",tooltip:LocaleUtils.tr("editing.clearpicture"),disabled:this.props.disabled}];return/*#__PURE__*/React.createElement("span",{className:"edit-upload-field-image"},/*#__PURE__*/React.createElement("img",{onClick:function onClick(){return _this2.download(imageData,_this2.props.fieldId+"."+extension)},src:imageData}),this.state.imageData?/*#__PURE__*/React.createElement("input",{"data-filename":this.state.imageFilename,name:this.props.name,type:"hidden",value:this.state.imageData}):null,!this.props.report&&!this.props.disabled?/*#__PURE__*/React.createElement(ButtonBar,{buttons:imagebuttons,onClick:this.imageButtonClicked,tooltipPos:"top"}):null)}else{var _extension=fileValue?fileValue.replace(/^.*\./,""):"jpg";return/*#__PURE__*/React.createElement("span",{className:"edit-upload-field edit-upload-field-imagelink"+(this.props.disabled?" edit-upload-field-disabled":"")},fileValue?/*#__PURE__*/React.createElement("a",{href:fileUrl,rel:"noreferrer",target:"_blank"},fileValue.replace(/.*\//,"")):/*#__PURE__*/React.createElement("a",{href:"#",onClick:function onClick(ev){_this2.download(imageData,_this2.state.imageFilename);ev.preventDefault()},rel:"noreferrer",target:"_blank"},this.state.imageFilename),/*#__PURE__*/React.createElement("img",{onClick:function onClick(){return _this2.download(imageData,_this2.props.fieldId+"."+_extension)},src:imageData}),this.props.report?null:/*#__PURE__*/React.createElement(Icon,{icon:"clear",onClick:this.props.disabled?null:this.clearImage}))}}else if(fileValue){return/*#__PURE__*/React.createElement("span",{className:"edit-upload-field edit-upload-field-imagelink"+(this.props.disabled?" edit-upload-field-disabled":"")},/*#__PURE__*/React.createElement("a",{href:fileUrl,rel:"noreferrer",target:"_blank"},fileValue.replace(/.*\//,"")),this.props.report?null:/*#__PURE__*/React.createElement(Icon,{icon:"clear",onClick:this.props.disabled?null:this.clearImage}))}else if(!this.props.report){return/*#__PURE__*/React.createElement("span",{className:"edit-upload-field-input"+(this.props.disabled?" edit-upload-field-input-disabled":"")},/*#__PURE__*/React.createElement("input",_extends({disabled:this.props.disabled,name:this.props.name,type:"file"},constraints,{onChange:this.fileSelected})),mediaSupport?/*#__PURE__*/React.createElement(Icon,{icon:"camera",onClick:this.props.disabled?null:this.enableCamera}):null,this.state.camera?this.renderCaptureFrame():null)}else{return null}}}])}(React.Component);_defineProperty(EditUploadField,"propTypes",{constraints:PropTypes.object,dataset:PropTypes.string,disabled:PropTypes.bool,fieldId:PropTypes.string,iface:PropTypes.object,name:PropTypes.string,report:PropTypes.bool,showThumbnails:PropTypes.bool,updateField:PropTypes.func,updateFile:PropTypes.func,value:PropTypes.string});_defineProperty(EditUploadField,"defaultProps",{showThumbnails:true,updateFile:function updateFile(){}});export{EditUploadField as default};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "qwc2",
3
- "version": "2025.08.06",
3
+ "version": "2025.08.07",
4
4
  "description": "QGIS Web Client",
5
5
  "author": "Sourcepole AG",
6
6
  "license": "BSD-2-Clause",
@@ -9,5 +9,5 @@ function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof
9
9
  *
10
10
  * Invokes the the authentication service specified by `authServiceUrl` in `config.json`.
11
11
  */var Authentication=/*#__PURE__*/function(_React$Component){function Authentication(props){var _this;_classCallCheck(this,Authentication);_this=_callSuper(this,Authentication,[props]);_defineProperty(_this,"showLogin",function(){var urlObj=url.parse(window.location.href,true);if(_this.props.clearLayerParam){delete urlObj.query.l}urlObj.search=undefined;window.location.href=ConfigUtils.getConfigProp("authServiceUrl")+"login?url="+encodeURIComponent(url.format(urlObj))});_defineProperty(_this,"resetIdleTimer",function(){if(_this.idleTimer){clearTimeout(_this.idleTimer);_this.idleTimer=setTimeout(_this.idleAutologout,_this.props.idleTimeout*1000)}});_defineProperty(_this,"idleAutologout",function(){var urlObj=url.parse(window.location.href,true);urlObj.search=undefined;var loginUrl=ConfigUtils.getConfigProp("authServiceUrl")+"login?url="+encodeURIComponent(url.format(urlObj));window.location.href=ConfigUtils.getConfigProp("authServiceUrl")+"logout?url="+encodeURIComponent(loginUrl)});_this.idleTimer=null;return _this}_inherits(Authentication,_React$Component);return _createClass(Authentication,[{key:"componentDidMount",value:function componentDidMount(){var username=ConfigUtils.getConfigProp("username");if(this.props.requireLogin&&!username){this.showLogin()}if(this.props.idleTimeout&&username){this.idleTimer=setTimeout(this.idleAutologout,this.props.idleTimeout*1000);window.addEventListener("keydown",this.resetIdleTimer,{passive:true});window.addEventListener("mousedown",this.resetIdleTimer,{passive:true});window.addEventListener("wheel",this.resetIdleTimer,{passive:true})}}},{key:"componentDidUpdate",value:function componentDidUpdate(prevProps){var task=this.props.task;if(task!==prevProps.task){// "Login" and "Logout" task ids are legacy
12
- if(task.id==="Login"||task.id==="Authentication"&&task.mode==="Login"){this.showLogin()}else if(task==="Logout"||task.id==="Authentication"&&task.mode==="Logout"){// logout and redirect to custom logoutTargetUrl or current location if not set
12
+ if(task.id==="Login"||task.id==="Authentication"&&task.mode==="Login"){this.showLogin()}else if(task.id==="Logout"||task.id==="Authentication"&&task.mode==="Logout"){// logout and redirect to custom logoutTargetUrl or current location if not set
13
13
  window.location.href=ConfigUtils.getConfigProp("authServiceUrl")+"logout?url="+encodeURIComponent(this.props.logoutTargetUrl||window.location.href)}}}},{key:"render",value:function render(){if(!this.props.showLoginUser){return null}var username=ConfigUtils.getConfigProp("username");if(!username){return null}return/*#__PURE__*/ReactDOM.createPortal(/*#__PURE__*/React.createElement("div",{className:"login-user"},/*#__PURE__*/React.createElement(Icon,{icon:"login"}),/*#__PURE__*/React.createElement("span",null,username)),this.context)}}])}(React.Component);_defineProperty(Authentication,"contextType",MapContainerPortalContext);_defineProperty(Authentication,"availableIn3D",true);_defineProperty(Authentication,"propTypes",{/** Whether to clear the layer parameter from the URL on login. */clearLayerParam:PropTypes.bool,/** An idle timeout in seconds after which the user is automatically logged of. */idleTimeout:PropTypes.number,/** An URL to redirect to on logout, instead of the viewer URL. */logoutTargetUrl:PropTypes.string,/** Whether authentication is required, i.e. the viewer automatically redirects to the login page if no user is authenticated. */requireLogin:PropTypes.bool,/** Whether to display the currently logged in user below the application menu button. */showLoginUser:PropTypes.bool,task:PropTypes.object});export default connect(function(state){return{task:state.task}},{})(Authentication);
@@ -31,4 +31,4 @@ function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof
31
31
  * render() { return ...; }
32
32
  * };
33
33
  * ```
34
- */var MapInfoTooltip=/*#__PURE__*/function(_React$Component){function MapInfoTooltip(){var _this;_classCallCheck(this,MapInfoTooltip);for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++){args[_key]=arguments[_key]}_this=_callSuper(this,MapInfoTooltip,[].concat(args));_defineProperty(_this,"state",{point:null,elevation:null,extraInfo:null});_defineProperty(_this,"clear",function(){_this.setState({point:null,elevation:null,extraInfo:null})});return _this}_inherits(MapInfoTooltip,_React$Component);return _createClass(MapInfoTooltip,[{key:"componentDidUpdate",value:function componentDidUpdate(prevProps){var _this2=this;if(!this.props.enabled&&this.state.point){this.clear();return}var newPoint=this.props.map.click;if(!newPoint||newPoint.button!==2){if(this.state.point){this.clear()}}else{var oldPoint=prevProps.map.click;if(!oldPoint||oldPoint.pixel[0]!==newPoint.pixel[0]||oldPoint.pixel[1]!==newPoint.pixel[1]){this.setState({point:newPoint,elevation:null,extraInfo:null});var pos=newPoint.coordinate;var crs=this.props.map.projection;getElevationInterface().getElevation(pos,crs).then(function(elevation){_this2.setState({elevation:elevation})})["catch"](function(){});var mapInfoService=ConfigUtils.getConfigProp("mapInfoService");if(mapInfoService){axios.get(mapInfoService,{params:{pos:pos.join(","),crs:crs}}).then(function(response){_this2.setState({extraInfo:response.data.results})})["catch"](function(){})}}}}},{key:"render",value:function render(){var _this3=this;if(!this.state.point){return null}var info=[];var projections=[this.props.map.displayCrs];if(!projections.includes(this.props.map.projection)){projections.push(this.props.map.projection)}if(this.props.includeWGS84&&!projections.includes("EPSG:4326")){projections.push("EPSG:4326")}projections.map(function(crs){var coo=CoordinatesUtils.reproject(_this3.state.point.coordinate,_this3.props.map.projection,crs);var decimals=CoordinatesUtils.getPrecision(crs);info.push([(CoordinatesUtils.getAvailableCRS()[crs]||{label:crs}).label,coo.map(function(x){return LocaleUtils.toLocaleFixed(x,decimals)}).join(", ")])});if(this.state.elevation!==undefined&&this.state.elevation!==null){var elevs=this.state.elevation.list;if(!elevs){elevs=[{elevation:this.state.elevation,dataset:null}]}var _iterator=_createForOfIteratorHelper(elevs),_step;try{for(_iterator.s();!(_step=_iterator.n()).done;){var data=_step.value;info.push([LocaleUtils.tr("mapinfotooltip.elevation")+(data.dataset?" ("+data.dataset+")":""),data.elevation.toFixed(this.props.elevationPrecision)+" m"])}}catch(err){_iterator.e(err)}finally{_iterator.f()}}if(this.state.extraInfo){info.push.apply(info,_toConsumableArray(this.state.extraInfo))}var title=LocaleUtils.tr("mapinfotooltip.title");var pixel=MapUtils.getHook(MapUtils.GET_PIXEL_FROM_COORDINATES_HOOK)(this.state.point.coordinate);var style={left:pixel[0]+"px",top:pixel[1]+"px"};var text=info.map(function(entry){return entry.join(": ")}).join("\n");var routingButtons=null;if(ConfigUtils.havePlugin("Routing")){var prec=CoordinatesUtils.getPrecision(this.props.map.displayCrs);var pos=CoordinatesUtils.reproject(this.state.point.coordinate,this.props.map.projection,this.props.map.displayCrs);var point={text:pos.map(function(x){return x.toFixed(prec)}).join(", ")+" ("+this.props.map.displayCrs+")",pos:_toConsumableArray(pos),crs:this.props.map.displayCrs};routingButtons=/*#__PURE__*/React.createElement("table",{className:"mapinfotooltip-body-routing"},/*#__PURE__*/React.createElement("tbody",null,/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement("b",null,LocaleUtils.tr("routing.route"),":")),/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement("div",{className:"controlgroup"},/*#__PURE__*/React.createElement("button",{className:"button",onClick:function onClick(){return _this3.props.setCurrentTask("Routing",null,null,{from:point})}},LocaleUtils.tr("routing.fromhere")),/*#__PURE__*/React.createElement("button",{className:"button",onClick:function onClick(){return _this3.props.setCurrentTask("Routing",null,null,{to:point})}},LocaleUtils.tr("routing.tohere")),/*#__PURE__*/React.createElement("button",{className:"button",onClick:function onClick(){return _this3.props.setCurrentTask("Routing",null,null,{via:point})}},LocaleUtils.tr("routing.addviapoint"))))),/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement("b",null,LocaleUtils.tr("routing.reachability"),":")),/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement("div",{className:"controlgroup"},/*#__PURE__*/React.createElement("button",{className:"button",onClick:function onClick(){return _this3.props.setCurrentTask("Routing",null,null,{isocenter:point})}},LocaleUtils.tr("routing.isocenter")),/*#__PURE__*/React.createElement("button",{className:"button",onClick:function onClick(){return _this3.props.setCurrentTask("Routing",null,null,{isoextracenter:point})}},LocaleUtils.tr("routing.isoextracenter")))))))}return/*#__PURE__*/ReactDOM.createPortal(/*#__PURE__*/React.createElement("div",{className:"mapinfotooltip",style:style},/*#__PURE__*/React.createElement("div",{className:"mapinfotooltip-window"},/*#__PURE__*/React.createElement("div",{className:"mapinfotooltip-titlebar"},/*#__PURE__*/React.createElement("span",{className:"mapinfotooltip-title"},title),/*#__PURE__*/React.createElement(CopyButton,{buttonClass:"mapinfotooltip-button",text:text}),/*#__PURE__*/React.createElement(Icon,{className:"mapinfotooltip-button",icon:"remove",onClick:this.clear})),/*#__PURE__*/React.createElement("div",{className:"mapinfotooltip-body"},/*#__PURE__*/React.createElement("table",null,/*#__PURE__*/React.createElement("tbody",null,info.map(function(entry,index){return/*#__PURE__*/React.createElement("tr",{key:"row"+index},/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement("b",null,entry[0],":")),/*#__PURE__*/React.createElement("td",null,entry[1]))}))),routingButtons,this.props.plugins.map(function(Plugin,idx){return/*#__PURE__*/React.createElement(Plugin,{closePopup:_this3.clear,key:idx,point:_this3.state.point,projection:_this3.props.map.projection})})))),this.context)}}])}(React.Component);_defineProperty(MapInfoTooltip,"contextType",MapContainerPortalContext);_defineProperty(MapInfoTooltip,"propTypes",{/** The number of decimal places to display for elevation values. */elevationPrecision:PropTypes.number,enabled:PropTypes.bool,includeWGS84:PropTypes.bool,map:PropTypes.object,/** Additional plugin components for the map info tooltip. */plugins:PropTypes.array,setCurrentTask:PropTypes.func});_defineProperty(MapInfoTooltip,"defaultProps",{elevationPrecision:0,includeWGS84:true,plugins:[]});export default(function(plugins){return connect(function(state){return{enabled:state.task.identifyEnabled,map:state.map,plugins:plugins}},{setCurrentTask:setCurrentTask})(MapInfoTooltip)});
34
+ */var MapInfoTooltip=/*#__PURE__*/function(_React$Component){function MapInfoTooltip(){var _this;_classCallCheck(this,MapInfoTooltip);for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++){args[_key]=arguments[_key]}_this=_callSuper(this,MapInfoTooltip,[].concat(args));_defineProperty(_this,"state",{point:null,elevation:null,extraInfo:null});_defineProperty(_this,"clear",function(){_this.setState({point:null,elevation:null,extraInfo:null})});return _this}_inherits(MapInfoTooltip,_React$Component);return _createClass(MapInfoTooltip,[{key:"componentDidUpdate",value:function componentDidUpdate(prevProps){var _this2=this;if(!this.props.enabled&&this.state.point){this.clear();return}var newPoint=this.props.map.click;if(!newPoint||newPoint.button!==2){if(this.state.point){this.clear()}}else{var oldPoint=prevProps.map.click;if(!oldPoint||oldPoint.pixel[0]!==newPoint.pixel[0]||oldPoint.pixel[1]!==newPoint.pixel[1]){this.setState({point:newPoint,elevation:null,extraInfo:null});var pos=newPoint.coordinate;var crs=this.props.map.projection;getElevationInterface().getElevation(pos,crs).then(function(elevation){_this2.setState({elevation:elevation})})["catch"](function(){});var mapInfoService=ConfigUtils.getConfigProp("mapInfoService");if(mapInfoService){axios.get(mapInfoService,{params:{pos:pos.join(","),crs:crs}}).then(function(response){_this2.setState({extraInfo:response.data.results})})["catch"](function(){})}}}}},{key:"render",value:function render(){var _this3=this;if(!this.state.point){return null}var info=[];var projections=[this.props.map.displayCrs];if(!projections.includes(this.props.map.projection)){projections.push(this.props.map.projection)}if(this.props.includeWGS84&&!projections.includes("EPSG:4326")){projections.push("EPSG:4326")}projections.map(function(crs){var coo=CoordinatesUtils.getFormattedCoordinate(_this3.state.point.coordinate,_this3.props.map.projection,crs);info.push([(CoordinatesUtils.getAvailableCRS()[crs]||{label:crs}).label,coo])});if(this.state.elevation!==undefined&&this.state.elevation!==null){var elevs=this.state.elevation.list;if(!elevs){elevs=[{elevation:this.state.elevation,dataset:null}]}var _iterator=_createForOfIteratorHelper(elevs),_step;try{for(_iterator.s();!(_step=_iterator.n()).done;){var data=_step.value;info.push([LocaleUtils.tr("mapinfotooltip.elevation")+(data.dataset?" ("+data.dataset+")":""),data.elevation.toFixed(this.props.elevationPrecision)+" m"])}}catch(err){_iterator.e(err)}finally{_iterator.f()}}if(this.state.extraInfo){info.push.apply(info,_toConsumableArray(this.state.extraInfo))}var title=LocaleUtils.tr("mapinfotooltip.title");var pixel=MapUtils.getHook(MapUtils.GET_PIXEL_FROM_COORDINATES_HOOK)(this.state.point.coordinate);var style={left:pixel[0]+"px",top:pixel[1]+"px"};var text=info.map(function(entry){return entry.join(": ")}).join("\n");var routingButtons=null;if(ConfigUtils.havePlugin("Routing")){var prec=CoordinatesUtils.getPrecision(this.props.map.displayCrs);var pos=CoordinatesUtils.reproject(this.state.point.coordinate,this.props.map.projection,this.props.map.displayCrs);var point={text:pos.map(function(x){return x.toFixed(prec)}).join(", ")+" ("+this.props.map.displayCrs+")",pos:_toConsumableArray(pos),crs:this.props.map.displayCrs};routingButtons=/*#__PURE__*/React.createElement("table",{className:"mapinfotooltip-body-routing"},/*#__PURE__*/React.createElement("tbody",null,/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement("b",null,LocaleUtils.tr("routing.route"),":")),/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement("div",{className:"controlgroup"},/*#__PURE__*/React.createElement("button",{className:"button",onClick:function onClick(){return _this3.props.setCurrentTask("Routing",null,null,{from:point})}},LocaleUtils.tr("routing.fromhere")),/*#__PURE__*/React.createElement("button",{className:"button",onClick:function onClick(){return _this3.props.setCurrentTask("Routing",null,null,{to:point})}},LocaleUtils.tr("routing.tohere")),/*#__PURE__*/React.createElement("button",{className:"button",onClick:function onClick(){return _this3.props.setCurrentTask("Routing",null,null,{via:point})}},LocaleUtils.tr("routing.addviapoint"))))),/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement("b",null,LocaleUtils.tr("routing.reachability"),":")),/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement("div",{className:"controlgroup"},/*#__PURE__*/React.createElement("button",{className:"button",onClick:function onClick(){return _this3.props.setCurrentTask("Routing",null,null,{isocenter:point})}},LocaleUtils.tr("routing.isocenter")),/*#__PURE__*/React.createElement("button",{className:"button",onClick:function onClick(){return _this3.props.setCurrentTask("Routing",null,null,{isoextracenter:point})}},LocaleUtils.tr("routing.isoextracenter")))))))}return/*#__PURE__*/ReactDOM.createPortal(/*#__PURE__*/React.createElement("div",{className:"mapinfotooltip",style:style},/*#__PURE__*/React.createElement("div",{className:"mapinfotooltip-window"},/*#__PURE__*/React.createElement("div",{className:"mapinfotooltip-titlebar"},/*#__PURE__*/React.createElement("span",{className:"mapinfotooltip-title"},title),/*#__PURE__*/React.createElement(CopyButton,{buttonClass:"mapinfotooltip-button",text:text}),/*#__PURE__*/React.createElement(Icon,{className:"mapinfotooltip-button",icon:"remove",onClick:this.clear})),/*#__PURE__*/React.createElement("div",{className:"mapinfotooltip-body"},/*#__PURE__*/React.createElement("table",null,/*#__PURE__*/React.createElement("tbody",null,info.map(function(entry,index){return/*#__PURE__*/React.createElement("tr",{key:"row"+index},/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement("b",null,entry[0],":")),/*#__PURE__*/React.createElement("td",null,entry[1]))}))),routingButtons,this.props.plugins.map(function(Plugin,idx){return/*#__PURE__*/React.createElement(Plugin,{closePopup:_this3.clear,key:idx,point:_this3.state.point,projection:_this3.props.map.projection})})))),this.context)}}])}(React.Component);_defineProperty(MapInfoTooltip,"contextType",MapContainerPortalContext);_defineProperty(MapInfoTooltip,"propTypes",{/** The number of decimal places to display for elevation values. */elevationPrecision:PropTypes.number,enabled:PropTypes.bool,includeWGS84:PropTypes.bool,map:PropTypes.object,/** Additional plugin components for the map info tooltip. */plugins:PropTypes.array,setCurrentTask:PropTypes.func});_defineProperty(MapInfoTooltip,"defaultProps",{elevationPrecision:0,includeWGS84:true,plugins:[]});export default(function(plugins){return connect(function(state){return{enabled:state.task.identifyEnabled,map:state.map,plugins:plugins}},{setCurrentTask:setCurrentTask})(MapInfoTooltip)});
@@ -11,5 +11,5 @@ function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof
11
11
  _this.measureLayer=new ol.layer.Vector({source:new ol.source.Vector,zIndex:1000000});_this.props.map.addLayer(_this.measureLayer);var geometryType=newProps.measurement.geomType;if(geometryType==="Bearing"){geometryType="LineString"}// create an interaction to draw with
12
12
  _this.drawInteraction=new ol.interaction.Draw({stopClick:true,source:_this.measureLayer.getSource(),condition:function condition(event){return event.originalEvent.buttons===1},type:geometryType,style:function style(){return _this.modifyInteraction?[]:FeatureStyles.sketchInteraction()}});_this.drawInteraction.on("drawstart",function(ev){_this.leaveTemporaryPickMode();_this.measureLayer.getSource().clear();_this.sketchFeature=ev.feature;_this.sketchFeature.setStyle(_this.featureStyleFunction);_this.sketchFeature.on("change",function(evt){return _this.updateMeasurementResults(evt.target)})});_this.drawInteraction.on("drawend",function(){_this.updateMeasurementResults(_this.sketchFeature,false);_this.enterTemporaryPickMode()});_this.props.map.addInteraction(_this.drawInteraction)});_defineProperty(_this,"reset",function(){if(_this.drawInteraction!==null){_this.props.map.removeInteraction(_this.drawInteraction);_this.drawInteraction=null;_this.leaveTemporaryPickMode();_this.props.map.removeLayer(_this.measureLayer);_this.measureLayer=null;_this.sketchFeature=null}});_defineProperty(_this,"enterTemporaryPickMode",function(){_this.modifyInteraction=new ol.interaction.Modify({features:new ol.Collection([_this.sketchFeature]),condition:function condition(event){return event.originalEvent.buttons===1},insertVertexCondition:function insertVertexCondition(){return _this.props.measurement.geomType==="Bearing"?false:true},deleteCondition:function deleteCondition(event){return ol.events.condition.shiftKeyOnly(event)&&ol.events.condition.singleClick(event)},style:function style(feature){// Hack to get cursor position over geometry...
13
13
  if(_this.props.measurement.pickPositionCallback){clearTimeout(_this.pickPositionCallbackTimeout);_this.props.measurement.pickPositionCallback(feature.getGeometry().getCoordinates())}return FeatureStyles.sketchInteraction()}});_this.props.map.on("pointermove",_this.clearPickPosition);_this.modifyInteraction.on("modifyend",function(){_this.updateMeasurementResults(_this.sketchFeature,false)});_this.props.map.addInteraction(_this.modifyInteraction)});_defineProperty(_this,"leaveTemporaryPickMode",function(){if(_this.modifyInteraction){_this.props.map.un("pointermove",_this.clearPickPosition);_this.props.map.removeInteraction(_this.modifyInteraction);_this.modifyInteraction=null}});_defineProperty(_this,"clearPickPosition",function(){if(_this.props.measurement.pickPositionCallback){clearTimeout(_this.pickPositionCallbackTimeout);// Works because style function clears timeout if marker is rendered, i.e. if mouse is over measure geometry
14
- _this.pickPositionCallbackTimeout=setTimeout(function(){if(_this.props.measurement.pickPositionCallback){_this.props.measurement.pickPositionCallback(null)}},50)}});_defineProperty(_this,"updateMeasurementResults",function(feature){var drawing=arguments.length>1&&arguments[1]!==undefined?arguments[1]:true;var geomType=_this.props.measurement.geomType;var settings={lenUnit:_this.props.measurement.lenUnit,areaUnit:_this.props.measurement.areaUnit,displayCrs:_this.props.map.displayCrs};MeasureUtils.updateFeatureMeasurements(feature,geomType,_this.props.projection,settings);// Only one segment for bearing measurement
15
- if(geomType==="Bearing"&&feature.getGeometry().getCoordinates().length>2){_this.drawInteraction.finishDrawing()}_this.measureLayer.getSource().changed();_this.props.changeMeasurementState(_objectSpread({geomType:_this.props.measurement.geomType,drawing:drawing,coordinates:feature.getGeometry().getCoordinates()},feature.get("measurements")))});_defineProperty(_this,"featureStyleFunction",function(feature){var geometryFunction=function geometryFunction(f){if(f.getGeometry().getType()==="Point"){return new ol.geom.MultiPoint([f.getGeometry().getCoordinates()])}else if(f.getGeometry().getType()==="LineString"){return new ol.geom.MultiPoint(f.getGeometry().getCoordinates())}return new ol.geom.MultiPoint(f.getGeometry().getCoordinates()[0])};return[].concat(_toConsumableArray(FeatureStyles.measureInteraction(feature)),[FeatureStyles.measureInteractionVertex({geometryFunction:geometryFunction})])});_this.pickPositionCallbackTimeout=null;_this.measureLayer=null;return _this}_inherits(MeasurementSupport,_React$Component);return _createClass(MeasurementSupport,[{key:"componentDidUpdate",value:function componentDidUpdate(prevProps){if(this.props.measurement.geomType&&this.props.measurement.geomType!==prevProps.measurement.geomType){this.addDrawInteraction(this.props)}else if(!this.props.measurement.geomType){this.reset()}else if(this.sketchFeature&&(this.props.measurement.lenUnit!==prevProps.measurement.lenUnit||this.props.measurement.areaUnit!==prevProps.measurement.areaUnit||this.props.displayCrs!==prevProps.displayCrs)){this.updateMeasurementResults(this.sketchFeature,this.props.measurement.drawing)}}},{key:"render",value:function render(){return null}}])}(React.Component);_defineProperty(MeasurementSupport,"propTypes",{changeMeasurementState:PropTypes.func,displayCrs:PropTypes.string,map:PropTypes.object,measurement:PropTypes.object,projection:PropTypes.string});export default connect(function(state){return{displayCrs:state.map.displayCrs,measurement:state.measurement}},{changeMeasurementState:changeMeasurementState})(MeasurementSupport);
14
+ _this.pickPositionCallbackTimeout=setTimeout(function(){if(_this.props.measurement.pickPositionCallback){_this.props.measurement.pickPositionCallback(null)}},50)}});_defineProperty(_this,"updateMeasurementResults",function(feature){var drawing=arguments.length>1&&arguments[1]!==undefined?arguments[1]:true;var geomType=_this.props.measurement.geomType;var settings={lenUnit:_this.props.measurement.lenUnit,areaUnit:_this.props.measurement.areaUnit,displayCrs:_this.props.displayCrs};MeasureUtils.updateFeatureMeasurements(feature,geomType,_this.props.projection,settings);// Only one segment for bearing measurement
15
+ if(geomType==="Bearing"&&feature.getGeometry().getCoordinates().length>2){_this.drawInteraction.finishDrawing()}_this.measureLayer.getSource().changed();_this.props.changeMeasurementState(_objectSpread({geomType:_this.props.measurement.geomType,drawing:drawing,coordinates:feature.getGeometry().getCoordinates()},structuredClone(feature.get("measurements"))))});_defineProperty(_this,"featureStyleFunction",function(feature){var geometryFunction=function geometryFunction(f){if(f.getGeometry().getType()==="Point"){return new ol.geom.MultiPoint([f.getGeometry().getCoordinates()])}else if(f.getGeometry().getType()==="LineString"){return new ol.geom.MultiPoint(f.getGeometry().getCoordinates())}return new ol.geom.MultiPoint(f.getGeometry().getCoordinates()[0])};return[].concat(_toConsumableArray(FeatureStyles.measureInteraction(feature)),[FeatureStyles.measureInteractionVertex({geometryFunction:geometryFunction})])});_this.pickPositionCallbackTimeout=null;_this.measureLayer=null;return _this}_inherits(MeasurementSupport,_React$Component);return _createClass(MeasurementSupport,[{key:"componentDidUpdate",value:function componentDidUpdate(prevProps){if(this.props.measurement.geomType&&this.props.measurement.geomType!==prevProps.measurement.geomType){this.addDrawInteraction(this.props)}else if(!this.props.measurement.geomType){this.reset()}else if(this.sketchFeature&&(this.props.measurement.lenUnit!==prevProps.measurement.lenUnit||this.props.measurement.areaUnit!==prevProps.measurement.areaUnit||this.props.displayCrs!==prevProps.displayCrs)){this.updateMeasurementResults(this.sketchFeature,this.props.measurement.drawing)}}},{key:"render",value:function render(){return null}}])}(React.Component);_defineProperty(MeasurementSupport,"propTypes",{changeMeasurementState:PropTypes.func,displayCrs:PropTypes.string,map:PropTypes.object,measurement:PropTypes.object,projection:PropTypes.string});export default connect(function(state){return{displayCrs:state.map.displayCrs,measurement:state.measurement}},{changeMeasurementState:changeMeasurementState})(MeasurementSupport);
@@ -39,7 +39,7 @@
39
39
  }
40
40
 
41
41
  #BottomBar input.bottombar-mousepos {
42
- width: 20ch;
42
+ width: 25ch;
43
43
  text-align: center;
44
44
  }
45
45
 
@@ -5,7 +5,7 @@ function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof
5
5
  *
6
6
  * This source code is licensed under the BSD-style license found in the
7
7
  * LICENSE file in the root directory of this source tree.
8
- */import ol from"openlayers";import Proj4js from"proj4";import ConfigUtils from"./ConfigUtils";import LocaleUtils from"./LocaleUtils";var crsLabels={"EPSG:4326":"WGS 84","EPSG:3857":"WGS 84 / Pseudo Mercator"};var CoordinatesUtils={setCrsLabels:function setCrsLabels(labels){Object.assign(crsLabels,labels)},getAvailableCRS:function getAvailableCRS(){var crsList={};for(var a in Proj4js.defs){if(Object.prototype.hasOwnProperty.call(Proj4js.defs,a)){crsList[a]={label:crsLabels[a]||a}}}return crsList},getUnits:function getUnits(projection){var proj=ol.proj.get(projection);return proj.getUnits()||"degrees"},getPrecision:function getPrecision(projection){var _precisions$projectio;var precisions=ConfigUtils.getConfigProp("projections").reduce(function(res,entry){var _entry$precision;return _objectSpread(_objectSpread({},res),{},_defineProperty({},entry.code,(_entry$precision=entry.precision)!==null&&_entry$precision!==void 0?_entry$precision:0))},{});return(_precisions$projectio=precisions[projection])!==null&&_precisions$projectio!==void 0?_precisions$projectio:CoordinatesUtils.getUnits(projection)==="degrees"?4:0},getAxisOrder:function getAxisOrder(projection){var axis=ol.proj.get(projection).getAxisOrientation();return axis||"enu"},reproject:function reproject(point,source,dest){if(source===dest){return _toConsumableArray(point)}if(source&&dest){var transformed=null;try{transformed=ol.proj.transform(point,source,dest)}catch(e){transformed=[0,0]}return transformed}return null},/**
8
+ */import ol from"openlayers";import Proj4js from"proj4";import ConfigUtils from"./ConfigUtils";import LocaleUtils from"./LocaleUtils";var crsLabels={"EPSG:4326":"WGS 84","EPSG:3857":"WGS 84 / Pseudo Mercator"};var CoordinatesUtils={setCrsLabels:function setCrsLabels(labels){Object.assign(crsLabels,labels)},getAvailableCRS:function getAvailableCRS(){var crsList={};for(var a in Proj4js.defs){if(Object.prototype.hasOwnProperty.call(Proj4js.defs,a)){crsList[a]={label:crsLabels[a]||a}}}return crsList},getUnits:function getUnits(projection){var proj=ol.proj.get(projection);return proj.getUnits()||"degrees"},getPrecision:function getPrecision(projection){var _precisions$projectio;var precisions=ConfigUtils.getConfigProp("projections").reduce(function(res,entry){var _entry$precision;return _objectSpread(_objectSpread({},res),{},_defineProperty({},entry.code,(_entry$precision=entry.precision)!==null&&_entry$precision!==void 0?_entry$precision:0))},{});return(_precisions$projectio=precisions[projection])!==null&&_precisions$projectio!==void 0?_precisions$projectio:CoordinatesUtils.getUnits(projection)==="degrees"?4:0},getProjectionConfig:function getProjectionConfig(projection){var _config$projection;var config=ConfigUtils.getConfigProp("projections").reduce(function(res,entry){var _entry$format,_entry$addDirection,_entry$swapLonLat;res[entry.code]={format:(_entry$format=entry.format)!==null&&_entry$format!==void 0?_entry$format:"decimal",addDirection:(_entry$addDirection=entry.addDirection)!==null&&_entry$addDirection!==void 0?_entry$addDirection:"none",swapLonLat:(_entry$swapLonLat=entry.swapLonLat)!==null&&_entry$swapLonLat!==void 0?_entry$swapLonLat:false};return res},{});return(_config$projection=config[projection])!==null&&_config$projection!==void 0?_config$projection:{format:"decimal",addDirection:"none",swapLonLat:false}},getAxisOrder:function getAxisOrder(projection){var axis=ol.proj.get(projection).getAxisOrientation();return axis||"enu"},reproject:function reproject(point,source,dest){if(source===dest){return _toConsumableArray(point)}if(source&&dest){var transformed=null;try{transformed=ol.proj.transform(point,source,dest)}catch(e){transformed=[0,0]}return transformed}return null},/**
9
9
  * Reprojects a bounding box.
10
10
  *
11
11
  * @param bbox {array} [minx, miny, maxx, maxy]
@@ -26,4 +26,4 @@ function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof
26
26
  * @param extent {array} [minx, miny, maxx, maxy]
27
27
  *
28
28
  * @return {bool}
29
- */isValidExtent:function isValidExtent(extent){return extent.length===4&&!(extent.indexOf(Infinity)!==-1||extent.indexOf(-Infinity)!==-1||extent.indexOf(NaN)!==-1||extent[0]>=extent[2]||extent[1]>=extent[3])},fromOgcUrnCrs:function fromOgcUrnCrs(crsStr){if(crsStr.endsWith(":CRS84")){return"EPSG:4326"}var parts=crsStr.split(":");return"EPSG:"+parts.slice(-1)},toOgcUrnCrs:function toOgcUrnCrs(crsStr){var parts=crsStr.split(":");return"urn:ogc:def:crs:"+parts[0]+"::"+parts[1]},getFormattedCoordinate:function getFormattedCoordinate(coo,srcCrs){var dstCrs=arguments.length>2&&arguments[2]!==undefined?arguments[2]:null;var decimals=arguments.length>3&&arguments[3]!==undefined?arguments[3]:-1;if(srcCrs&&dstCrs&&srcCrs!==dstCrs){coo=CoordinatesUtils.reproject(coo,srcCrs,dstCrs)}if(decimals<0){decimals=CoordinatesUtils.getPrecision(dstCrs!==null&&dstCrs!==void 0?dstCrs:srcCrs)}return coo.map(function(ord){return LocaleUtils.toLocaleFixed(ord,decimals)}).join(", ")}};export default CoordinatesUtils;
29
+ */isValidExtent:function isValidExtent(extent){return extent.length===4&&!(extent.indexOf(Infinity)!==-1||extent.indexOf(-Infinity)!==-1||extent.indexOf(NaN)!==-1||extent[0]>=extent[2]||extent[1]>=extent[3])},fromOgcUrnCrs:function fromOgcUrnCrs(crsStr){if(crsStr.endsWith(":CRS84")){return"EPSG:4326"}var parts=crsStr.split(":");return"EPSG:"+parts.slice(-1)},toOgcUrnCrs:function toOgcUrnCrs(crsStr){var parts=crsStr.split(":");return"urn:ogc:def:crs:"+parts[0]+"::"+parts[1]},getFormattedCoordinate:function getFormattedCoordinate(coo,srcCrs){var _options$decimals;var dstCrs=arguments.length>2&&arguments[2]!==undefined?arguments[2]:null;var options=arguments.length>3&&arguments[3]!==undefined?arguments[3]:{};var units=CoordinatesUtils.getUnits(dstCrs!==null&&dstCrs!==void 0?dstCrs:srcCrs);var decimals=(_options$decimals=options.decimals)!==null&&_options$decimals!==void 0?_options$decimals:CoordinatesUtils.getPrecision(dstCrs!==null&&dstCrs!==void 0?dstCrs:srcCrs);var _ref=function(){var config=CoordinatesUtils.getProjectionConfig(dstCrs!==null&&dstCrs!==void 0?dstCrs:srcCrs);return{format:units!=="degrees"?"decimal":config.format,addDirection:config.addDirection,swapLonLat:config.swapLonLat}}(),format=_ref.format,addDirection=_ref.addDirection,swapLonLat=_ref.swapLonLat;if(srcCrs&&dstCrs&&srcCrs!==dstCrs){coo=CoordinatesUtils.reproject(coo,srcCrs,dstCrs)}if(swapLonLat){coo=[coo[1],coo[0]]}var toDMS=function toDMS(coord){var deg=Math.floor(Math.abs(coord));var minFull=(Math.abs(coord)-deg)*60;var min=Math.floor(minFull);var sec=((minFull-min)*60).toFixed(decimals);return"".concat(deg,"\xB0 ").concat(min,"' ").concat(sec,"\"")};var toDM=function toDM(coord){var deg=Math.floor(Math.abs(coord));var min=((Math.abs(coord)-deg)*60).toFixed(decimals);return"".concat(deg,"\xB0 ").concat(min,"'")};var formatCoordinate=function formatCoordinate(value,isLat){var direction="";if(addDirection!=="none"){if(isLat){direction=value>=0?"N":"S"}else{direction=value>=0?"E":"W"}}var formatted;switch(format){case"dms":formatted=toDMS(value,decimals);break;case"dm":formatted=toDM(value,decimals);break;default:formatted=LocaleUtils.toLocaleFixed(Math.abs(value),decimals)}if(addDirection==="prefix"){return"".concat(direction).concat(formatted)}else if(addDirection==="suffix"){return"".concat(formatted).concat(direction)}return formatted};return coo.map(function(coord,idx){return formatCoordinate(coord,swapLonLat?idx===0:idx===1)}).join(", ")}};export default CoordinatesUtils;
@@ -12,6 +12,6 @@ Promise.all(promises).then(function(){parseExpressionsAsync(fieldExpressions,new
12
12
  var defaultFieldExpressions=editConfig.fields.reduce(function(res,field){if(field.defaultValue){return[].concat(_toConsumableArray(res),[{field:field.id,expression:field.defaultValue.replace(/^expr:/,"")}])}return res},[]);FeatureCache.clear();parseExpressionsAsync(defaultFieldExpressions,feature,editConfig,editIface,mapPrefix,mapCrs).then(function(result){// Adjust values based on field type
13
13
  editConfig.fields.forEach(function(field){if(field.id in result&&field.type==="date"){result[field.id]=result[field.id].split("T")[0]}});callback(_objectSpread(_objectSpread({},feature),{},{properties:_objectSpread(_objectSpread({},feature.properties),result)}))})}export function computeExpressionFields(editConfig,feature,editIface,mapCrs,callback){// Collect field expressions and dependencies
14
14
  var dependencies={};var fieldExpressions=editConfig.fields.reduce(function(res,field){if(field.expression){var matches=_toConsumableArray(field.expression.matchAll(/"([^"]+)"/g)).map(function(m){return m[1]});dependencies[field.id]=_toConsumableArray(new Set(matches));return _objectSpread(_objectSpread({},res),{},_defineProperty({},field.id,field.expression))}return res},{});// Topologically sort expressions so that fields depending on other fields are evaluated later
15
- var edges=[];Object.entries(dependencies).forEach(function(_ref2){var _ref3=_slicedToArray(_ref2,2),parent=_ref3[0],children=_ref3[1];children.forEach(function(child){return edges.push([child,parent])})});try{var sortededges=toposort(edges);fieldExpressions=sortededges.reduce(function(res,field){if(field in fieldExpressions){return[].concat(_toConsumableArray(res),[{field:field,expression:fieldExpressions[field]}])}else{return res}},[])}catch(e){/* eslint-disable-next-line */console.warn("Failed to sort expressions, they probably contain cyclic dependencies");fieldExpressions=Object.entries(fieldExpressions).map(function(res,_ref4){var _ref5=_slicedToArray(_ref4,2),field=_ref5[0],expression=_ref5[1];return[].concat(_toConsumableArray(res),[{field:field,expression:expression}])},{})}// Evaluate expressions
15
+ var edges=[];var roots=[];Object.entries(dependencies).forEach(function(_ref2){var _ref3=_slicedToArray(_ref2,2),parent=_ref3[0],children=_ref3[1];if(children.length>0){children.forEach(function(child){return edges.push([child,parent])})}else{roots.push(parent)}});try{var sortededges=toposort(edges);fieldExpressions=roots.concat(sortededges).reduce(function(res,field){if(field in fieldExpressions){return[].concat(_toConsumableArray(res),[{field:field,expression:fieldExpressions[field]}])}else{return res}},[])}catch(e){/* eslint-disable-next-line */console.warn("Failed to sort expressions, they probably contain cyclic dependencies");fieldExpressions=Object.entries(fieldExpressions).map(function(res,_ref4){var _ref5=_slicedToArray(_ref4,2),field=_ref5[0],expression=_ref5[1];return[].concat(_toConsumableArray(res),[{field:field,expression:expression}])},{})}// Evaluate expressions
16
16
  FeatureCache.clear();var mapPrefix=(editConfig.editDataset.match(/^[^.]+\./)||[""])[0];parseExpressionsAsync(fieldExpressions,feature,editConfig,editIface,mapPrefix,mapCrs).then(function(result){// Adjust values based on field type
17
17
  editConfig.fields.forEach(function(field){if(field.id in result&&field.type==="date"){result[field.id]=result[field.id].split("T")[0]}});callback(_objectSpread(_objectSpread({},feature),{},{properties:_objectSpread(_objectSpread({},feature.properties),result)}))})}