qwc2 2025.9.24 → 2025.10.2
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/components/AttributeForm.js +3 -3
- package/components/AttributeTableWidget.js +1 -1
- package/components/EditUploadField.js +1 -1
- package/components/IdentifyViewer.js +5 -5
- package/components/PickFeature.js +1 -1
- package/components/QtDesignerForm.js +2 -2
- package/components/ResizeableWindow.js +2 -2
- package/components/SearchBox.js +2 -2
- package/components/map3d/ImportObjects3D.js +1 -1
- package/components/widgets/EditableSelect.js +1 -1
- package/components/widgets/SearchWidget.js +1 -1
- package/components/widgets/SuggestionInput.js +1 -1
- package/package.json +2 -1
- package/plugins/AttributeTable.js +1 -1
- package/plugins/Editing.js +2 -2
- package/plugins/FeatureSearch.js +2 -2
- package/plugins/GeometryDigitizer.js +1 -1
- package/plugins/HeightProfile.js +2 -2
- package/plugins/LayerTree.js +1 -1
- package/plugins/Map.js +1 -1
- package/plugins/MapFilter.js +3 -3
- package/plugins/MapTip.js +2 -2
- package/plugins/OverviewMap.js +2 -2
- package/plugins/ScratchDrawing.js +2 -2
- package/plugins/TimeManager.js +2 -2
- package/plugins/ValueTool.js +2 -2
- package/plugins/map/SnappingSupport.js +2 -2
- package/scripts/themesConfig.js +1 -1
- package/utils/CoordinatesUtils.js +2 -2
- package/utils/IdentifyUtils.js +2 -2
- package/utils/LayerUtils.js +1 -1
- package/utils/RoutingInterface.js +2 -2
- package/utils/VectorLayerUtils.js +3 -3
|
@@ -4,7 +4,7 @@ function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof
|
|
|
4
4
|
*
|
|
5
5
|
* This source code is licensed under the BSD-style license found in the
|
|
6
6
|
* LICENSE file in the root directory of this source tree.
|
|
7
|
-
*/import React from"react";import{connect}from"react-redux";import clone from"clone";import isEmpty from"lodash.isempty";import PropTypes from"prop-types";import{
|
|
7
|
+
*/import React from"react";import{connect}from"react-redux";import clone from"clone";import isEmpty from"lodash.isempty";import PropTypes from"prop-types";import{v4 as uuidv4}from"uuid";import{setEditContext,clearEditContext}from"../actions/editing";import{LayerRole,refreshLayer}from"../actions/layers";import{setCurrentTaskBlocked}from"../actions/task";import ConfigUtils from"../utils/ConfigUtils";import CoordinatesUtils from"../utils/CoordinatesUtils";import{getFeatureTemplate,parseExpressionsAsync}from"../utils/EditingUtils";import LocaleUtils from"../utils/LocaleUtils";import AutoEditForm from"./AutoEditForm";import LinkFeatureForm from"./LinkFeatureForm";import QtDesignerForm from"./QtDesignerForm";import ButtonBar from"./widgets/ButtonBar";import ReCaptchaWidget from"./widgets/ReCaptchaWidget";import"./style/AttributeForm.css";var AttributeForm=/*#__PURE__*/function(_React$Component){function AttributeForm(props){var _this;_classCallCheck(this,AttributeForm);_this=_callSuper(this,AttributeForm,[props]);_defineProperty(_this,"state",{busy:false,deleteClicked:false,childEdit:null,relationTables:{},formValid:true,captchaResponse:null});_defineProperty(_this,"editLayerId",function(layerId){return _this.props.editConfig||layerId});_defineProperty(_this,"render",function(){var captchaRequired=ConfigUtils.getConfigProp("editServiceCaptchaSiteKey")&&!ConfigUtils.getConfigProp("username");var captchaPending=captchaRequired&&!_this.state.captchaResponse;var commitBar=null;if(_this.props.editContext.changed){var commitButtons=[{key:"Commit",icon:_this.state.formValid?"ok":"warning",label:_this.state.formValid?LocaleUtils.tr("editing.commit"):LocaleUtils.tr("editing.invalidform"),extraClasses:_this.state.formValid?"button-accept":"button-warning",type:"submit",disabled:!_this.state.formValid||captchaPending},{key:"Discard",icon:"remove",label:LocaleUtils.tr("editing.discard"),extraClasses:"button-reject"}];commitBar=/*#__PURE__*/React.createElement(ButtonBar,{buttons:commitButtons,onClick:_this.onDiscard});/* submit is handled via onSubmit in the form */}var curConfig=_this.props.editConfig;var editPermissions=curConfig.permissions||{};var readOnly=_this.props.readOnly||editPermissions.updatable===false&&_this.props.editContext.action==="Pick";var deleteBar=null;if(!_this.props.hideDelete&&_this.props.editContext.action==="Pick"&&_this.props.editContext.feature&&!_this.props.editContext.changed&&editPermissions.deletable!==false&&!_this.props.readOnly){// Delete button bar will appear by default if no permissions are defined in editConfig or when deletable permission is set
|
|
8
8
|
if(!_this.state.deleteClicked){var _this$props$deleteLab;var deleteButtons=[{key:"Delete",icon:"trash",label:(_this$props$deleteLab=_this.props.deleteLabel)!==null&&_this$props$deleteLab!==void 0?_this$props$deleteLab:LocaleUtils.tr("editing.delete")}];deleteBar=/*#__PURE__*/React.createElement(ButtonBar,{buttons:deleteButtons,onClick:_this.deleteClicked})}else{var _deleteButtons=[{key:"Yes",icon:"ok",label:LocaleUtils.tr("editing.reallydelete"),extraClasses:"button-accept",disabled:captchaPending},{key:"No",icon:"remove",label:LocaleUtils.tr("editing.canceldelete"),extraClasses:"button-reject"}];deleteBar=/*#__PURE__*/React.createElement(ButtonBar,{buttons:_deleteButtons,onClick:_this.deleteFeature})}}var busyDiv=null;if(_this.state.busy){busyDiv=/*#__PURE__*/React.createElement("div",{className:"attrib-form-busy"})}var childAttributeForm=null;if(_this.state.childEdit){childAttributeForm=/*#__PURE__*/React.createElement("div",{className:"link-feature-form-container"},/*#__PURE__*/React.createElement(LinkFeatureForm,_extends({},_this.state.childEdit,{finished:_this.state.childEdit.finishCallback,iface:_this.props.iface,pickFilter:_this.props.childPickFilter,readOnly:_this.props.readOnly})))}var captchaButton=null;if(captchaRequired&&(_this.props.editContext.changed||_this.state.deleteClicked)){captchaButton=/*#__PURE__*/React.createElement(ReCaptchaWidget,{onChange:function onChange(value){return _this.setState({captchaResponse:value})},sitekey:ConfigUtils.getConfigProp("editServiceCaptchaSiteKey")})}var readOnlyMsg=null;if(!readOnly&&_this.props.editContext.geomReadOnly){readOnlyMsg=LocaleUtils.tr("editing.geomreadonly")}else if(!readOnly&&_this.props.editContext.geomNonZeroZ){readOnlyMsg=LocaleUtils.tr("editing.geomnonzeroz")}return/*#__PURE__*/React.createElement("div",{className:"AttributeForm"},readOnlyMsg?/*#__PURE__*/React.createElement("div",{className:"attrib-form-geom-readonly"},readOnlyMsg):null,/*#__PURE__*/React.createElement("form",{action:"",onChange:function onChange(ev){return _this.formChanged(ev)},onSubmit:_this.onSubmit,ref:_this.setupChangedObserver},_this.props.editConfig.form?/*#__PURE__*/React.createElement(QtDesignerForm,{addRelationRecord:_this.addRelationRecord,editConfig:_this.props.editConfig,editConfigs:_this.props.theme.editConfig,editRelationRecord:_this.editRelationRecord,feature:_this.props.editContext.feature,iface:_this.props.iface,mapCrs:_this.props.map.projection,mapPrefix:_this.editMapPrefix(),readOnly:readOnly,removeRelationRecord:_this.removeRelationRecord,reorderRelationRecord:_this.reorderRelationRecord,report:_this.props.report,setFormBusy:_this.setFormBusy,setRelationTables:_this.setRelationTables,switchEditContext:_this.startChildEdit,translations:_this.props.theme.translations,updateField:_this.updateField,updateRelationField:_this.updateRelationField}):/*#__PURE__*/React.createElement(AutoEditForm,{editLayerId:_this.props.editConfig.editDataset,fields:_this.props.editConfig.fields,iface:_this.props.iface,readOnly:readOnly,touchFriendly:_this.props.touchFriendly,updateField:_this.updateField,values:_this.props.editContext.feature.properties}),captchaButton,commitBar),deleteBar,busyDiv,childAttributeForm)});_defineProperty(_this,"setFormBusy",function(busy){_this.setState({busy:busy})});_defineProperty(_this,"updateField",function(key,value){var newProperties=_objectSpread(_objectSpread({},_this.props.editContext.feature.properties),{},_defineProperty({},key,value));var newFeature=_objectSpread(_objectSpread({},_this.props.editContext.feature),{},{properties:newProperties});_this.props.setEditContext(_this.props.editContext.id,{feature:newFeature,changed:true});_this.validateFieldConstraints(newFeature)});_defineProperty(_this,"editMapPrefix",function(){return(_this.props.editConfig.editDataset.match(/^[^.]+\./)||[""])[0]});_defineProperty(_this,"setRelationTables",function(relationTables){_this.setState({relationTables:relationTables})});_defineProperty(_this,"loadRelationValues",function(feature,callback){if(!isEmpty(_this.state.relationTables)){if(feature.id){var relTables=Object.entries(_this.state.relationTables).map(function(_ref){var _ref2=_slicedToArray(_ref,2),name=_ref2[0],entry=_ref2[1];if(entry.sortcol){return name+":"+entry.fk+":"+entry.sortcol}else{return name+":"+entry.fk}}).join(",");_this.props.iface.getRelations(_this.props.editConfig,feature.id,_this.props.map.projection,relTables,_this.props.theme.editConfig,function(relationValues){var newFeature=_objectSpread(_objectSpread({},feature),{},{relationValues:relationValues});callback(newFeature)})}else{var relationValues=_objectSpread(_objectSpread({},Object.entries(_this.state.relationTables).reduce(function(res,_ref3){var _ref4=_slicedToArray(_ref3,2),name=_ref4[0],entry=_ref4[1];return _objectSpread(_objectSpread({},res),{},_defineProperty({},name,{fk:entry.fk,features:[]}))},{})),feature.relationValues);var newFeature=_objectSpread(_objectSpread({},feature),{},{relationValues:relationValues});callback(newFeature)}}});_defineProperty(_this,"addRelationRecord",function(table){var newRelationValues=_objectSpread({},_this.props.editContext.feature.relationValues);var editConfig=_this.props.theme.editConfig[table.split(".").slice(-1)];var mapPrefix=(editConfig.editDataset.match(/^[^.]+\./)||[""])[0];getFeatureTemplate(editConfig,{type:"Feature",properties:{}},_this.props.iface,mapPrefix,_this.props.map.projection,function(newRelFeature){newRelFeature.__status__="empty";if(editConfig.geomType===null){newRelFeature.geometry=null}// If feature id is known, i.e. not when drawing new feature, set foreign key
|
|
9
9
|
if(_this.props.editContext.action!=="Draw"){newRelFeature.properties[_this.state.relationTables[table].fk]=_this.props.editContext.feature.id}newRelationValues[table]=_objectSpread({},newRelationValues[table]);newRelationValues[table].features=newRelationValues[table].features.concat([newRelFeature]);var newFeature=_objectSpread(_objectSpread({},_this.props.editContext.feature),{},{relationValues:newRelationValues});_this.props.setEditContext(_this.props.editContext.id,{feature:newFeature,changed:true})})});_defineProperty(_this,"reorderRelationRecord",function(table,idx,dir){var nFeatures=_this.props.editContext.feature.relationValues[table].features.length;if(dir<0&&idx===0||dir>0&&idx>=nFeatures-1){return}var newRelationValues=_objectSpread({},_this.props.editContext.feature.relationValues);newRelationValues[table]=_objectSpread({},newRelationValues[table]);var newFeatures=newRelationValues[table].features.slice(0);var offset=dir<0?0:1;newFeatures.splice(idx-1+offset,2,newFeatures[idx+offset],newFeatures[idx-1+offset]);newFeatures[idx-1+offset].properties=_objectSpread({},newFeatures[idx-1+offset].properties);newFeatures[idx+offset].properties=_objectSpread({},newFeatures[idx+offset].properties);newFeatures[idx-1+offset].__status__=["new","empty"].includes(newFeatures[idx-1+offset].__status__)?"new":"changed";newFeatures[idx+offset].__status__=["new","empty"].includes(newFeatures[idx+offset].__status__)?"new":"changed";newRelationValues[table].features=newFeatures;var newFeature=_objectSpread(_objectSpread({},_this.props.editContext.feature),{},{relationValues:newRelationValues});_this.props.setEditContext(_this.props.editContext.id,{feature:newFeature,changed:true})});_defineProperty(_this,"removeRelationRecord",function(table,idx){var newRelationValues=_objectSpread({},_this.props.editContext.feature.relationValues);newRelationValues[table]=_objectSpread({},newRelationValues[table]);newRelationValues[table].features=newRelationValues[table].features.slice(0);var fieldStatus=newRelationValues[table].features[idx].__status__||"";// If field was new, delete it directly, else mark it as deleted
|
|
10
10
|
if(["new","empty"].includes(fieldStatus)){newRelationValues[table].features.splice(idx,1)}else{newRelationValues[table].features[idx]=_objectSpread(_objectSpread({},newRelationValues[table].features[idx]),{},{__status__:fieldStatus.startsWith("deleted")?fieldStatus.substr(8):"deleted:"+fieldStatus})}var newFeature=_objectSpread(_objectSpread({},_this.props.editContext.feature),{},{relationValues:newRelationValues});_this.props.setEditContext(_this.props.editContext.id,{feature:newFeature,changed:true})});_defineProperty(_this,"updateRelationField",function(table,idx,key,value){var newRelationValues=_objectSpread({},_this.props.editContext.feature.relationValues);newRelationValues[table]=_objectSpread({},newRelationValues[table]);newRelationValues[table].features=newRelationValues[table].features.slice(0);newRelationValues[table].features[idx]=_objectSpread(_objectSpread({},newRelationValues[table].features[idx]),{},{properties:_objectSpread(_objectSpread({},newRelationValues[table].features[idx].properties),{},_defineProperty({},key,value)),__status__:["new","empty"].includes(newRelationValues[table].features[idx].__status__)?"new":"changed"});var newFeature=_objectSpread(_objectSpread({},_this.props.editContext.feature),{},{relationValues:newRelationValues});_this.props.setEditContext(_this.props.editContext.id,{feature:newFeature,changed:true})});_defineProperty(_this,"editRelationRecord",function(action,layer,dataset,idx,displayField){var editConfig=(_this.props.theme.editConfig||{})[layer];var feature=_this.props.editContext.feature.relationValues[dataset].features[idx];_this.setState({childEdit:{action:action,editConfig:editConfig,editContextId:":"+layer,dataset:dataset,idx:idx,feature:feature,finishCallback:_this.finishEditRelationRecord,displayField:displayField,hideDelete:true}})});_defineProperty(_this,"finishEditRelationRecord",function(feature){_this.props.clearEditContext(_this.state.childEdit.editContextId,_this.props.editContext.id);if(feature){var table=_this.state.childEdit.dataset;var idx=_this.state.childEdit.idx;var newRelationValues=_objectSpread({},_this.props.editContext.feature.relationValues);newRelationValues[table]=_objectSpread({},newRelationValues[table]);newRelationValues[table].features=newRelationValues[table].features.slice(0);newRelationValues[table].features[idx]=_objectSpread(_objectSpread({},feature),{},{properties:_objectSpread({},feature.properties)});// If feature id is known, i.e. not when drawing new feature, set foreign key
|
|
@@ -21,10 +21,10 @@ var tablename=parts[0];var datasetname=mapPrefix+tablename;var field=parts.slice
|
|
|
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=
|
|
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=uuidv4()+"."+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
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
|
-
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=
|
|
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=uuidv4()+"."+_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
|
|
29
29
|
var relationValueErrors=Object.values(result.relationValues||[]).find(function(entry){return(entry.features||[]).find(function(f){return f.error})})!==undefined;if(relationValueErrors){// Relation values commit failed, switch to pick to avoid adding feature again on next attempt
|
|
30
30
|
_this.commitFinished(false,LocaleUtils.tr("editing.relationcommitfailed"));_this.props.setEditContext(_this.props.editContext.id,{action:"Pick",feature:result,changed:true})}else{_this.commitFinished(true,result)}});_defineProperty(_this,"deleteClicked",function(){_this.setState({deleteClicked:true});_this.props.setCurrentTaskBlocked(true,LocaleUtils.tr("editing.unsavedchanged"))});_defineProperty(_this,"deleteFeature",function(action){if(action==="Yes"){_this.setState({busy:true});var recaptchaResponse=null;if(_this.state.captchaResponse){recaptchaResponse=_this.state.captchaResponse}_this.props.iface.deleteFeature(_this.props.editConfig,_this.props.editContext.feature.id,_this.deleteFinished,recaptchaResponse)}else{_this.setState({deleteClicked:false});_this.props.setCurrentTaskBlocked(false)}});_defineProperty(_this,"commitFinished",function(success,result){_this.setState({busy:false});if(success){_this.props.refreshLayer(function(layer){return layer.role===LayerRole.THEME});_this.props.setCurrentTaskBlocked(false);if(!_this.props.onCommit||!_this.props.onCommit(result)){if(!isEmpty(_this.state.relationTables)){// Re-load relation values
|
|
@@ -15,4 +15,4 @@ alert(result)}else{_this.changedFiles={};_this.setState(function(state){var newF
|
|
|
15
15
|
alert(LocaleUtils.tr("attribtable.nogeomnoform"));return}var feature=_this.state.filteredSortedFeatures.find(function(f){return _this.state.selectedFeatures[f.id]===true});_this.props.setCurrentTask("Editing",null,null,{layer:_this.state.loadedLayer,feature:feature})});_defineProperty(_this,"updateFilter",function(field,val){var resetPage=arguments.length>2&&arguments[2]!==undefined?arguments[2]:false;_this.setState(function(state){return _defineProperty(_defineProperty(_defineProperty({},field,val),"currentPage",resetPage?0:state.currentPage),"filteredSortedFeatures",_this.filteredSortedFeatures(state.features,_objectSpread(_objectSpread({},state),{},_defineProperty({},field,val))))})});_defineProperty(_this,"filteredSortedFeatures",function(features,state){var filteredFeatures=[];if(!state.filterVal){filteredFeatures=features.map(function(feature,idx){return _objectSpread(_objectSpread({},feature),{},{originalIndex:idx})})}else{var filterVal=state.filterVal.toLowerCase();var test=null;if(state.filterOp==="~"){test=function test(x){return String(x).toLowerCase().includes(filterVal)}}else if(state.filterOp==="="){test=function test(x){return String(x).toLowerCase()===filterVal}}else if(state.filterOp===">"){test=function test(x){return Number(x)>Number(filterVal)}}else if(state.filterOp===">="){test=function test(x){return Number(x)>=Number(filterVal)}}else if(state.filterOp==="<="){test=function test(x){return Number(x)<=Number(filterVal)}}else if(state.filterOp==="<"){test=function test(x){return Number(x)<Number(filterVal)}}// Build value relation lookup
|
|
16
16
|
var editConfig=_this.props.theme.editConfig||{};var currentEditConfig=editConfig[_this.state.loadedLayer];var valueLookup=currentEditConfig.fields.reduce(function(res,field){if(field.constraints&&field.constraints.values){res[field.id]=field.constraints.values.reduce(function(res2,constraint){res2[constraint.value]=constraint.label;return res2},{})}else if(field.constraints&&field.constraints.keyvalrel){res[field.id]=KeyValCache.getSync(_this.props.iface,field.constraints.keyvalrel).reduce(function(res2,entry){res2[entry.value]=entry.label;return res2},{})}return res},{});var filterFieldValue=state.filterField==="id"?function(feature){return feature.id}:function(feature){var value=feature.properties[state.filterField];return valueLookup[state.filterField]?valueLookup[state.filterField][value]:value};filteredFeatures=features.reduce(function(res,feature,idx){if(test(filterFieldValue(feature))){res.push(_objectSpread(_objectSpread({},feature),{},{originalIndex:idx}))}return res},[])}if(state.sortField){var sortFieldValue=state.sortField.field==="id"?function(feature){return feature.id}:function(feature){return feature.properties[state.sortField.field]};return filteredFeatures.sort(function(f1,f2){var v1=String(sortFieldValue(f1));var v2=String(sortFieldValue(f2));return v1.localeCompare(v2,undefined,{numeric:true,sensitivity:"base"})*state.sortField.dir})}else{return filteredFeatures}});_defineProperty(_this,"resizeTable",function(ev,index,resizeCol){if(_this.table){var element=_this.table.getElementsByTagName(resizeCol?"th":"tr")[index];var initial=0;if(resizeCol){initial=parseFloat(element.style.minWidth.replace(/px$/,""))||element.clientWidth}else{initial=parseFloat(element.style.height.replace(/px$/,""))||element.clientHeight}var resize={anchor:resizeCol?ev.clientX:ev.clientY,element:element,initial:initial};var resizeDo=resizeCol?function(event){var delta=event.clientX-resize.anchor;resize.element.style.minWidth=Math.max(resize.initial+delta,16)+"px";resize.element.style.width=Math.max(resize.initial+delta,16)+"px"}:function(event){var delta=event.clientY-resize.anchor;resize.element.style.height=Math.max(resize.initial+delta,16)+"px"};var eventShield=ev.view.document.createElement("div");eventShield.className="__event_shield";ev.view.document.body.appendChild(eventShield);ev.view.document.body.classList.add(resizeCol?"ewresizing":"nsresizing");ev.view.addEventListener("pointermove",resizeDo);ev.view.addEventListener("pointerup",function(event){event.view.document.body.removeChild(eventShield);event.view.removeEventListener("pointermove",resizeDo);event.view.document.body.classList.remove(resizeCol?"ewresizing":"nsresizing")},{once:true})}});_defineProperty(_this,"csvExport",function(){var editConfig=_this.props.theme.editConfig||{};var currentEditConfig=editConfig[_this.state.loadedLayer];if(!currentEditConfig){return}var fields=currentEditConfig.fields.filter(function(field){return field.id!=="id"});var data="";data+="id,"+fields.map(function(field){return"\"".concat(field.name.replaceAll("\"","\"\""),"\"")}).join(",")+"\n";_this.state.features.forEach(function(feature){data+=feature.id+","+fields.map(function(field){var value=feature.properties[field.id];if(value===null||value===undefined){return"null"}else{return"\"".concat(String(feature.properties[field.id]).replaceAll("\"","\"\""),"\"")}}).join(",")+"\n"});FileSaver.saveAs(new Blob([data],{type:"text/plain;charset=utf-8"}),_this.state.loadedLayer+".csv")});_defineProperty(_this,"translateFieldName",function(fieldName,layerName){var _this$props$theme$tra,_this$props$theme$tra2;return(_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.layers)===null||_this$props$theme$tra2===void 0||(_this$props$theme$tra2=_this$props$theme$tra2[layerName])===null||_this$props$theme$tra2===void 0||(_this$props$theme$tra2=_this$props$theme$tra2.fields)===null||_this$props$theme$tra2===void 0?void 0:_this$props$theme$tra2[fieldName])!==null&&_this$props$theme$tra!==void 0?_this$props$theme$tra:fieldName});_this.changedFiles={};_this.state=AttributeTableWidget.defaultState;_this.table=null;_this.attribTableContents=null;return _this}_inherits(AttributeTableWidget,_React$Component);return _createClass(AttributeTableWidget,[{key:"componentDidMount",value:function componentDidMount(){if(this.props.initialLayer){this.reload(this.props.initialLayer)}}},{key:"componentDidUpdate",value:function componentDidUpdate(prevProps,prevState){if(this.state.newFeature&&!prevState.newFeature){if(this.attribTableContents){this.attribTableContents.scrollTop=this.attribTableContents.scrollHeight}}// Reload conditions when limited to extent
|
|
17
17
|
if(this.state.limitToExtent&&this.state.selectedLayer&&(!prevState.limitToExtent||this.props.mapBbox!==prevProps.mapBbox)){this.reload()}else if(!this.state.limitToExtent&&prevState.limitToExtent){this.reload()}// Highlight feature
|
|
18
|
-
if(this.state.highlightedFeature!==prevState.highlightedFeature||this.state.filteredSortedFeatures!==prevState.filteredSortedFeatures){this.highlightFeatures()}}},{key:"componentWillUnmount",value:function componentWillUnmount(){this.props.removeLayer("__attributetablehighlight")}},{key:"render",value:function render(){var _this2=this;var captchaRequired=ConfigUtils.getConfigProp("editServiceCaptchaSiteKey")&&!ConfigUtils.getConfigProp("username");var captchaPending=captchaRequired&&!this.state.captchaResponse;var editConfig=this.props.theme.editConfig||{};var currentEditConfig=editConfig[this.state.loadedLayer];var editPermissions=(editConfig[this.state.loadedLayer]||{}).permissions||{};var readOnly=editPermissions.updatable===false;var loadOverlay=null;if(this.state.selectedLayer&&this.state.selectedLayer!==this.state.loadedLayer){if(this.state.loading){loadOverlay=/*#__PURE__*/React.createElement("div",{className:"attribtable-overlay"},/*#__PURE__*/React.createElement(Spinner,null),/*#__PURE__*/React.createElement("span",null,LocaleUtils.tr("attribtable.loading")))}else{loadOverlay=/*#__PURE__*/React.createElement("div",{className:"attribtable-overlay"},/*#__PURE__*/React.createElement("span",null,LocaleUtils.tr("attribtable.pleasereload")))}}else if(this.state.selectedLayer&&this.state.deleteTask){loadOverlay=/*#__PURE__*/React.createElement("div",{className:"attribtable-overlay"},/*#__PURE__*/React.createElement(Spinner,null),/*#__PURE__*/React.createElement("span",null,LocaleUtils.tr("attribtable.deleting")))}var table=null;var footbar=null;if(currentEditConfig&&this.state.features){var fields=currentEditConfig.fields.reduce(function(res,field){if(field.id!=="id"){res.push(field)}return res},[]);var indexOffset=this.state.currentPage*this.state.pageSize;var features=this.state.filteredSortedFeatures.slice(indexOffset,indexOffset+this.state.pageSize);table=/*#__PURE__*/React.createElement("table",{className:"attribtable-table",ref:function ref(el){_this2.table=el}},/*#__PURE__*/React.createElement("thead",null,/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("th",null),/*#__PURE__*/React.createElement("th",{onClick:function onClick(){return _this2.sortBy("id")},title:this.translateFieldName("id",this.state.loadedLayer)},/*#__PURE__*/React.createElement("span",null,/*#__PURE__*/React.createElement("span",{className:"attribtable-table-headername"},this.translateFieldName("id",this.state.loadedLayer)),this.renderSortIndicator("id"),this.renderColumnResizeHandle(1,"r"))),fields.map(function(field,idx){return/*#__PURE__*/React.createElement("th",{key:field.id,onClick:function onClick(){return _this2.sortBy(field.id)},title:_this2.translateFieldName(field.name,_this2.state.loadedLayer)},/*#__PURE__*/React.createElement("span",null,_this2.renderColumnResizeHandle(idx+1,"l"),/*#__PURE__*/React.createElement("span",{className:"attribtable-table-headername"},_this2.translateFieldName(field.name,_this2.state.loadedLayer)),_this2.renderSortIndicator(field.id),idx<fields.length-1?_this2.renderColumnResizeHandle(idx+2,"r"):null))}))),/*#__PURE__*/React.createElement("tbody",null,features.map(function(feature,filteredIndex){var featureidx=feature.originalIndex;var disabled=readOnly||_this2.state.changedFeatureIdx!==null&&_this2.state.changedFeatureIdx!==featureidx;var key=_this2.state.changedFeatureIdx===featureidx&&_this2.state.newFeature?"newfeature":feature.id;return/*#__PURE__*/React.createElement("tr",{className:disabled?"row-disabled":"",key:key,onMouseEnter:function onMouseEnter(){return _this2.setState({highlightedFeature:feature})},onMouseLeave:function onMouseLeave(){return _this2.setState(function(state){return{highlightedFeature:state.highlightedFeature===feature?null:state.highlightedFeature}})}},/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement("span",null,filteredIndex>0?_this2.renderRowResizeHandle(filteredIndex,"t"):null,/*#__PURE__*/React.createElement("input",{checked:_this2.state.selectedFeatures[feature.id]===true,onChange:function onChange(ev){return _this2.setState(function(state){return{selectedFeatures:_objectSpread(_objectSpread({},state.selectedFeatures),{},_defineProperty({},feature.id,ev.target.checked))}})},type:"checkbox"}),_this2.renderRowResizeHandle(filteredIndex+1,"b"))),/*#__PURE__*/React.createElement("td",null,feature.id),fields.map(function(field){return/*#__PURE__*/React.createElement("td",{key:field.id},_this2.renderField(currentEditConfig,field,featureidx,indexOffset+filteredIndex,disabled||!!_this2.state.filterVal&&field.id===_this2.state.filterField))}))})));var npages=Math.ceil(this.state.filteredSortedFeatures.length/this.state.pageSize);var pages=[this.state.currentPage];var extraright=Math.max(0,2-this.state.currentPage);var extraleft=Math.max(0,this.state.currentPage-(npages-3));for(var i=0;i<3+extraleft;++i){if(this.state.currentPage-i>0){pages.unshift(this.state.currentPage-i)}}for(var _i=0;_i<3+extraright;++_i){if(this.state.currentPage+_i<npages-1){pages.push(this.state.currentPage-_i+1)}}footbar=/*#__PURE__*/React.createElement("div",{className:"attribtable-footbar"},/*#__PURE__*/React.createElement(NavBar,{currentPage:this.state.currentPage,disabled:this.state.changedFeatureIdx!==null,nPages:npages,pageChanged:function pageChanged(currentPage){return _this2.setState({currentPage:currentPage})},pageSize:this.state.pageSize,pageSizeChanged:function pageSizeChanged(pageSize){return _this2.setState({pageSize:pageSize})}}),/*#__PURE__*/React.createElement("div",{className:"attribtable-filter controlgroup"},/*#__PURE__*/React.createElement(Icon,{icon:"filter"}),/*#__PURE__*/React.createElement("select",{disabled:this.state.changedFeatureIdx!==null,onChange:function onChange(ev){return _this2.updateFilter("filterField",ev.target.value)},value:this.state.filterField},/*#__PURE__*/React.createElement("option",{value:"id"},this.translateFieldName("id",this.state.loadedLayer)),fields.map(function(field){return/*#__PURE__*/React.createElement("option",{key:field.id,value:field.id},_this2.translateFieldName(field.name,_this2.state.loadedLayer))})),/*#__PURE__*/React.createElement("select",{disabled:this.state.changedFeatureIdx!==null,onChange:function onChange(ev){return _this2.updateFilter("filterOp",ev.target.value)},value:this.state.filterOp},/*#__PURE__*/React.createElement("option",{value:"~"},"~"),/*#__PURE__*/React.createElement("option",{value:"="},"="),/*#__PURE__*/React.createElement("option",{value:">"},">"),/*#__PURE__*/React.createElement("option",{value:">="},">="),/*#__PURE__*/React.createElement("option",{value:"<="},"<="),/*#__PURE__*/React.createElement("option",{value:"<"},"<")),/*#__PURE__*/React.createElement(TextInput,{disabled:this.state.changedFeatureIdx!==null,onChange:function onChange(value){return _this2.updateFilter("filterVal",value,true)},value:this.state.filterVal})),this.props.showLimitToExtent?/*#__PURE__*/React.createElement("div",null,/*#__PURE__*/React.createElement("label",null,/*#__PURE__*/React.createElement("input",{checked:this.state.limitToExtent,onChange:function onChange(ev){return _this2.setState({limitToExtent:ev.target.checked})},type:"checkbox"})," ",LocaleUtils.tr("attribtable.limittoextent"))):null)}var nolayer=!this.state.selectedLayer;var loading=this.state.loading;var editing=this.state.changedFeatureIdx!==null;var layerChanged=this.state.selectedLayer!==this.state.loadedLayer;var hasGeometry=(currentEditConfig||{}).geomType!==null;var showAddButton=editPermissions.creatable!==false&&(this.props.allowAddForGeometryLayers||!hasGeometry);var showDelButton=editPermissions.deletable!==false;var showEditButton=ConfigUtils.havePlugin("Editing")&&this.props.showEditFormButton;var deleteButton=showDelButton?/*#__PURE__*/React.createElement("button",{className:"button",disabled:layerChanged||editing||!Object.values(this.state.selectedFeatures).find(function(entry){return entry===true}),onClick:function onClick(){return _this2.setState({confirmDelete:true})},title:LocaleUtils.tr("attribtable.deletefeatures")},/*#__PURE__*/React.createElement(Icon,{icon:"trash"})):null;var captchaBar=null;if(captchaRequired&&(this.state.changedFeatureIdx!==null||this.state.confirmDelete)){captchaBar=/*#__PURE__*/React.createElement("div",null,/*#__PURE__*/React.createElement(ReCaptchaWidget,{onChange:function onChange(value){return _this2.setState({captchaResponse:value})},sitekey:ConfigUtils.getConfigProp("editServiceCaptchaSiteKey")}))}return/*#__PURE__*/React.createElement("div",{className:"AttributeTable"},loadOverlay,/*#__PURE__*/React.createElement("div",{className:"attribtable-toolbar"},this.props.showLayerSelection?/*#__PURE__*/React.createElement("select",{disabled:loading||editing,onChange:function onChange(ev){return _this2.changeSelectedLayer(ev.target.value)},value:this.state.selectedLayer||""},/*#__PURE__*/React.createElement("option",{disabled:true,value:""},LocaleUtils.tr("attribtable.selectlayer")),Object.keys(editConfig).map(function(layerId){var _this2$props$theme$tr,_this2$props$theme$tr2,_LayerUtils$searchLay,_LayerUtils$searchLay2;var layerName=editConfig[layerId].layerName;var layerTitle=editConfig[layerId].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[layerId].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;return/*#__PURE__*/React.createElement("option",{key:layerId,value:layerId},layerTitle)})):null,/*#__PURE__*/React.createElement("button",{className:"button",disabled:editing||nolayer||this.state.loading,onClick:function onClick(){return _this2.reload()},title:LocaleUtils.tr("attribtable.reload")},/*#__PURE__*/React.createElement(Icon,{icon:"refresh"})),showAddButton?/*#__PURE__*/React.createElement("button",{className:"button",disabled:nolayer||editing||loading||layerChanged,onClick:this.addFeature,title:LocaleUtils.tr("attribtable.addfeature")},/*#__PURE__*/React.createElement(Icon,{icon:"plus"})):null,/*#__PURE__*/React.createElement("button",{className:"button",disabled:layerChanged||!Object.values(this.state.selectedFeatures).find(function(entry){return entry===true}),onClick:this.zoomToSelection,title:LocaleUtils.tr("attribtable.zoomtoselection")},/*#__PURE__*/React.createElement(Icon,{icon:"search"})),showEditButton?/*#__PURE__*/React.createElement("button",{className:"button",disabled:layerChanged||editing||Object.values(this.state.selectedFeatures).filter(function(entry){return entry===true}).length!==1,onClick:this.switchToFormEditMode,title:LocaleUtils.tr("attribtable.formeditmode")},/*#__PURE__*/React.createElement(Icon,{icon:"editing"})):null,this.state.confirmDelete?/*#__PURE__*/React.createElement("button",{className:"button button-accept",disabled:captchaPending,onClick:this.deleteSelectedFeatured},/*#__PURE__*/React.createElement(Icon,{icon:"ok"}),/*#__PURE__*/React.createElement("span",null,LocaleUtils.tr("attribtable.delete"))):deleteButton,this.state.confirmDelete?/*#__PURE__*/React.createElement("button",{className:"button button-reject",onClick:function onClick(){return _this2.setState({confirmDelete:false,captchaResponse:null})}},/*#__PURE__*/React.createElement(Icon,{icon:"remove"}),/*#__PURE__*/React.createElement("span",null,LocaleUtils.tr("attribtable.nodelete"))):null,this.state.changedFeatureIdx!==null?/*#__PURE__*/React.createElement("button",{className:"button button-accept",disabled:captchaPending,onClick:this.commit},/*#__PURE__*/React.createElement(Icon,{icon:"ok"}),/*#__PURE__*/React.createElement("span",null,LocaleUtils.tr("attribtable.commit"))):null,this.state.changedFeatureIdx!==null?/*#__PURE__*/React.createElement("button",{className:"button button-reject",onClick:this.discard},/*#__PURE__*/React.createElement(Icon,{icon:"remove"}),/*#__PURE__*/React.createElement("span",null,LocaleUtils.tr("attribtable.discard"))):null,/*#__PURE__*/React.createElement("button",{className:"button",disabled:isEmpty(this.state.features),onClick:function onClick(){return _this2.csvExport()},title:LocaleUtils.tr("attribtable.csvexport")},/*#__PURE__*/React.createElement(Icon,{icon:"export"}))),captchaBar,/*#__PURE__*/React.createElement("div",{className:"attribtable-contents",ref:function ref(el){_this2.attribTableContents=el}},table),footbar)}}])}(React.Component);_defineProperty(AttributeTableWidget,"propTypes",{addLayerFeatures:PropTypes.func,/** Whether to allow adding records for datasets which have a geometry column. */allowAddForGeometryLayers:PropTypes.bool,filter:PropTypes.object,iface:PropTypes.object,initialLayer:PropTypes.string,layers:PropTypes.array,mapBbox:PropTypes.object,mapCrs:PropTypes.string,mapScales:PropTypes.array,removeLayer:PropTypes.func,setCurrentTask:PropTypes.func,setCurrentTaskBlocked:PropTypes.func,/** Whether to show a button to open the edit form for selected layer. Requires the Editing plugin to be enabled. */showEditFormButton:PropTypes.bool,/** Whether to show the layer selection menu. */showLayerSelection:PropTypes.bool,/** Whether to show the "Limit to extent" checkbox */showLimitToExtent:PropTypes.bool,theme:PropTypes.object,/** The zoom level for zooming to point features. */zoomLevel:PropTypes.number,zoomToExtent:PropTypes.func,zoomToPoint:PropTypes.func});_defineProperty(AttributeTableWidget,"defaultProps",{zoomLevel:1000,showEditFormButton:true,showLayerSelection:true});_defineProperty(AttributeTableWidget,"defaultState",{loading:false,selectedLayer:"",loadedLayer:"",features:[],filteredSortedFeatures:[],selectedFeatures:{},highlightedFeature:null,changedFeatureIdx:null,originalFeatureProps:null,pageSize:50,currentPage:0,filterField:"id",filterOp:"~",filterVal:"",sortField:null,deleteTask:null,newFeature:false,confirmDelete:false,limitToExtent:false,captchaResponse:""});export default connect(function(state){return{layers:state.layers.flat,filter:state.layers.filter,mapBbox:state.map.bbox,mapCrs:state.map.projection,mapScales:state.map.scales,theme:state.theme.current}},{addLayerFeatures:addLayerFeatures,removeLayer:removeLayer,setCurrentTask:setCurrentTask,setCurrentTaskBlocked:setCurrentTaskBlocked,zoomToExtent:zoomToExtent,zoomToPoint:zoomToPoint})(AttributeTableWidget);
|
|
18
|
+
if(this.state.highlightedFeature!==prevState.highlightedFeature||this.state.filteredSortedFeatures!==prevState.filteredSortedFeatures){this.highlightFeatures()}}},{key:"componentWillUnmount",value:function componentWillUnmount(){this.props.removeLayer("__attributetablehighlight")}},{key:"render",value:function render(){var _this2=this;var captchaRequired=ConfigUtils.getConfigProp("editServiceCaptchaSiteKey")&&!ConfigUtils.getConfigProp("username");var captchaPending=captchaRequired&&!this.state.captchaResponse;var editConfig=this.props.theme.editConfig||{};var currentEditConfig=editConfig[this.state.loadedLayer];var editPermissions=(editConfig[this.state.loadedLayer]||{}).permissions||{};var readOnly=editPermissions.updatable===false;var loadOverlay=null;if(this.state.selectedLayer&&this.state.selectedLayer!==this.state.loadedLayer){if(this.state.loading){loadOverlay=/*#__PURE__*/React.createElement("div",{className:"attribtable-overlay"},/*#__PURE__*/React.createElement(Spinner,null),/*#__PURE__*/React.createElement("span",null,LocaleUtils.tr("attribtable.loading")))}else{loadOverlay=/*#__PURE__*/React.createElement("div",{className:"attribtable-overlay"},/*#__PURE__*/React.createElement("span",null,LocaleUtils.tr("attribtable.pleasereload")))}}else if(this.state.selectedLayer&&this.state.deleteTask){loadOverlay=/*#__PURE__*/React.createElement("div",{className:"attribtable-overlay"},/*#__PURE__*/React.createElement(Spinner,null),/*#__PURE__*/React.createElement("span",null,LocaleUtils.tr("attribtable.deleting")))}var table=null;var footbar=null;if(currentEditConfig&&this.state.features){var fields=currentEditConfig.fields.filter(function(field){return field.id!=="id"}).filter(function(field){var _field$constraints;return _this2.props.showHiddenFields||((_field$constraints=field.constraints)===null||_field$constraints===void 0?void 0:_field$constraints.hidden)!==true});var indexOffset=this.state.currentPage*this.state.pageSize;var features=this.state.filteredSortedFeatures.slice(indexOffset,indexOffset+this.state.pageSize);table=/*#__PURE__*/React.createElement("table",{className:"attribtable-table",ref:function ref(el){_this2.table=el}},/*#__PURE__*/React.createElement("thead",null,/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("th",null),/*#__PURE__*/React.createElement("th",{onClick:function onClick(){return _this2.sortBy("id")},title:this.translateFieldName("id",this.state.loadedLayer)},/*#__PURE__*/React.createElement("span",null,/*#__PURE__*/React.createElement("span",{className:"attribtable-table-headername"},this.translateFieldName("id",this.state.loadedLayer)),this.renderSortIndicator("id"),this.renderColumnResizeHandle(1,"r"))),fields.map(function(field,idx){return/*#__PURE__*/React.createElement("th",{key:field.id,onClick:function onClick(){return _this2.sortBy(field.id)},title:_this2.translateFieldName(field.name,_this2.state.loadedLayer)},/*#__PURE__*/React.createElement("span",null,_this2.renderColumnResizeHandle(idx+1,"l"),/*#__PURE__*/React.createElement("span",{className:"attribtable-table-headername"},_this2.translateFieldName(field.name,_this2.state.loadedLayer)),_this2.renderSortIndicator(field.id),idx<fields.length-1?_this2.renderColumnResizeHandle(idx+2,"r"):null))}))),/*#__PURE__*/React.createElement("tbody",null,features.map(function(feature,filteredIndex){var featureidx=feature.originalIndex;var disabled=readOnly||_this2.state.changedFeatureIdx!==null&&_this2.state.changedFeatureIdx!==featureidx;var key=_this2.state.changedFeatureIdx===featureidx&&_this2.state.newFeature?"newfeature":feature.id;return/*#__PURE__*/React.createElement("tr",{className:disabled?"row-disabled":"",key:key,onMouseEnter:function onMouseEnter(){return _this2.setState({highlightedFeature:feature})},onMouseLeave:function onMouseLeave(){return _this2.setState(function(state){return{highlightedFeature:state.highlightedFeature===feature?null:state.highlightedFeature}})}},/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement("span",null,filteredIndex>0?_this2.renderRowResizeHandle(filteredIndex,"t"):null,/*#__PURE__*/React.createElement("input",{checked:_this2.state.selectedFeatures[feature.id]===true,onChange:function onChange(ev){return _this2.setState(function(state){return{selectedFeatures:_objectSpread(_objectSpread({},state.selectedFeatures),{},_defineProperty({},feature.id,ev.target.checked))}})},type:"checkbox"}),_this2.renderRowResizeHandle(filteredIndex+1,"b"))),/*#__PURE__*/React.createElement("td",null,feature.id),fields.map(function(field){return/*#__PURE__*/React.createElement("td",{key:field.id},_this2.renderField(currentEditConfig,field,featureidx,indexOffset+filteredIndex,disabled||!!_this2.state.filterVal&&field.id===_this2.state.filterField))}))})));var npages=Math.ceil(this.state.filteredSortedFeatures.length/this.state.pageSize);var pages=[this.state.currentPage];var extraright=Math.max(0,2-this.state.currentPage);var extraleft=Math.max(0,this.state.currentPage-(npages-3));for(var i=0;i<3+extraleft;++i){if(this.state.currentPage-i>0){pages.unshift(this.state.currentPage-i)}}for(var _i=0;_i<3+extraright;++_i){if(this.state.currentPage+_i<npages-1){pages.push(this.state.currentPage-_i+1)}}footbar=/*#__PURE__*/React.createElement("div",{className:"attribtable-footbar"},/*#__PURE__*/React.createElement(NavBar,{currentPage:this.state.currentPage,disabled:this.state.changedFeatureIdx!==null,nPages:npages,pageChanged:function pageChanged(currentPage){return _this2.setState({currentPage:currentPage})},pageSize:this.state.pageSize,pageSizeChanged:function pageSizeChanged(pageSize){return _this2.setState({pageSize:pageSize})}}),/*#__PURE__*/React.createElement("div",{className:"attribtable-filter controlgroup"},/*#__PURE__*/React.createElement(Icon,{icon:"filter"}),/*#__PURE__*/React.createElement("select",{disabled:this.state.changedFeatureIdx!==null,onChange:function onChange(ev){return _this2.updateFilter("filterField",ev.target.value)},value:this.state.filterField},/*#__PURE__*/React.createElement("option",{value:"id"},this.translateFieldName("id",this.state.loadedLayer)),fields.map(function(field){return/*#__PURE__*/React.createElement("option",{key:field.id,value:field.id},_this2.translateFieldName(field.name,_this2.state.loadedLayer))})),/*#__PURE__*/React.createElement("select",{disabled:this.state.changedFeatureIdx!==null,onChange:function onChange(ev){return _this2.updateFilter("filterOp",ev.target.value)},value:this.state.filterOp},/*#__PURE__*/React.createElement("option",{value:"~"},"~"),/*#__PURE__*/React.createElement("option",{value:"="},"="),/*#__PURE__*/React.createElement("option",{value:">"},">"),/*#__PURE__*/React.createElement("option",{value:">="},">="),/*#__PURE__*/React.createElement("option",{value:"<="},"<="),/*#__PURE__*/React.createElement("option",{value:"<"},"<")),/*#__PURE__*/React.createElement(TextInput,{disabled:this.state.changedFeatureIdx!==null,onChange:function onChange(value){return _this2.updateFilter("filterVal",value,true)},value:this.state.filterVal})),this.props.showLimitToExtent?/*#__PURE__*/React.createElement("div",null,/*#__PURE__*/React.createElement("label",null,/*#__PURE__*/React.createElement("input",{checked:this.state.limitToExtent,onChange:function onChange(ev){return _this2.setState({limitToExtent:ev.target.checked})},type:"checkbox"})," ",LocaleUtils.tr("attribtable.limittoextent"))):null)}var nolayer=!this.state.selectedLayer;var loading=this.state.loading;var editing=this.state.changedFeatureIdx!==null;var layerChanged=this.state.selectedLayer!==this.state.loadedLayer;var hasGeometry=(currentEditConfig||{}).geomType!==null;var showAddButton=editPermissions.creatable!==false&&(this.props.allowAddForGeometryLayers||!hasGeometry);var showDelButton=editPermissions.deletable!==false;var showEditButton=ConfigUtils.havePlugin("Editing")&&this.props.showEditFormButton;var deleteButton=showDelButton?/*#__PURE__*/React.createElement("button",{className:"button",disabled:layerChanged||editing||!Object.values(this.state.selectedFeatures).find(function(entry){return entry===true}),onClick:function onClick(){return _this2.setState({confirmDelete:true})},title:LocaleUtils.tr("attribtable.deletefeatures")},/*#__PURE__*/React.createElement(Icon,{icon:"trash"})):null;var captchaBar=null;if(captchaRequired&&(this.state.changedFeatureIdx!==null||this.state.confirmDelete)){captchaBar=/*#__PURE__*/React.createElement("div",null,/*#__PURE__*/React.createElement(ReCaptchaWidget,{onChange:function onChange(value){return _this2.setState({captchaResponse:value})},sitekey:ConfigUtils.getConfigProp("editServiceCaptchaSiteKey")}))}return/*#__PURE__*/React.createElement("div",{className:"AttributeTable"},loadOverlay,/*#__PURE__*/React.createElement("div",{className:"attribtable-toolbar"},this.props.showLayerSelection?/*#__PURE__*/React.createElement("select",{disabled:loading||editing,onChange:function onChange(ev){return _this2.changeSelectedLayer(ev.target.value)},value:this.state.selectedLayer||""},/*#__PURE__*/React.createElement("option",{disabled:true,value:""},LocaleUtils.tr("attribtable.selectlayer")),Object.keys(editConfig).map(function(layerId){var _this2$props$theme$tr,_this2$props$theme$tr2,_LayerUtils$searchLay,_LayerUtils$searchLay2;var layerName=editConfig[layerId].layerName;var layerTitle=editConfig[layerId].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[layerId].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;return/*#__PURE__*/React.createElement("option",{key:layerId,value:layerId},layerTitle)})):null,/*#__PURE__*/React.createElement("button",{className:"button",disabled:editing||nolayer||this.state.loading,onClick:function onClick(){return _this2.reload()},title:LocaleUtils.tr("attribtable.reload")},/*#__PURE__*/React.createElement(Icon,{icon:"refresh"})),showAddButton?/*#__PURE__*/React.createElement("button",{className:"button",disabled:nolayer||editing||loading||layerChanged,onClick:this.addFeature,title:LocaleUtils.tr("attribtable.addfeature")},/*#__PURE__*/React.createElement(Icon,{icon:"plus"})):null,/*#__PURE__*/React.createElement("button",{className:"button",disabled:layerChanged||!Object.values(this.state.selectedFeatures).find(function(entry){return entry===true}),onClick:this.zoomToSelection,title:LocaleUtils.tr("attribtable.zoomtoselection")},/*#__PURE__*/React.createElement(Icon,{icon:"search"})),showEditButton?/*#__PURE__*/React.createElement("button",{className:"button",disabled:layerChanged||editing||Object.values(this.state.selectedFeatures).filter(function(entry){return entry===true}).length!==1,onClick:this.switchToFormEditMode,title:LocaleUtils.tr("attribtable.formeditmode")},/*#__PURE__*/React.createElement(Icon,{icon:"editing"})):null,this.state.confirmDelete?/*#__PURE__*/React.createElement("button",{className:"button button-accept",disabled:captchaPending,onClick:this.deleteSelectedFeatured},/*#__PURE__*/React.createElement(Icon,{icon:"ok"}),/*#__PURE__*/React.createElement("span",null,LocaleUtils.tr("attribtable.delete"))):deleteButton,this.state.confirmDelete?/*#__PURE__*/React.createElement("button",{className:"button button-reject",onClick:function onClick(){return _this2.setState({confirmDelete:false,captchaResponse:null})}},/*#__PURE__*/React.createElement(Icon,{icon:"remove"}),/*#__PURE__*/React.createElement("span",null,LocaleUtils.tr("attribtable.nodelete"))):null,this.state.changedFeatureIdx!==null?/*#__PURE__*/React.createElement("button",{className:"button button-accept",disabled:captchaPending,onClick:this.commit},/*#__PURE__*/React.createElement(Icon,{icon:"ok"}),/*#__PURE__*/React.createElement("span",null,LocaleUtils.tr("attribtable.commit"))):null,this.state.changedFeatureIdx!==null?/*#__PURE__*/React.createElement("button",{className:"button button-reject",onClick:this.discard},/*#__PURE__*/React.createElement(Icon,{icon:"remove"}),/*#__PURE__*/React.createElement("span",null,LocaleUtils.tr("attribtable.discard"))):null,/*#__PURE__*/React.createElement("button",{className:"button",disabled:isEmpty(this.state.features),onClick:function onClick(){return _this2.csvExport()},title:LocaleUtils.tr("attribtable.csvexport")},/*#__PURE__*/React.createElement(Icon,{icon:"export"}))),captchaBar,/*#__PURE__*/React.createElement("div",{className:"attribtable-contents",ref:function ref(el){_this2.attribTableContents=el}},table),footbar)}}])}(React.Component);_defineProperty(AttributeTableWidget,"propTypes",{addLayerFeatures:PropTypes.func,/** Whether to allow adding records for datasets which have a geometry column. */allowAddForGeometryLayers:PropTypes.bool,filter:PropTypes.object,iface:PropTypes.object,initialLayer:PropTypes.string,layers:PropTypes.array,mapBbox:PropTypes.object,mapCrs:PropTypes.string,mapScales:PropTypes.array,removeLayer:PropTypes.func,setCurrentTask:PropTypes.func,setCurrentTaskBlocked:PropTypes.func,/** Whether to show a button to open the edit form for selected layer. Requires the Editing plugin to be enabled. */showEditFormButton:PropTypes.bool,/** Whether to show hidden Fields. */showHiddenFields:PropTypes.bool,/** Whether to show the layer selection menu. */showLayerSelection:PropTypes.bool,/** Whether to show the "Limit to extent" checkbox */showLimitToExtent:PropTypes.bool,theme:PropTypes.object,/** The zoom level for zooming to point features. */zoomLevel:PropTypes.number,zoomToExtent:PropTypes.func,zoomToPoint:PropTypes.func});_defineProperty(AttributeTableWidget,"defaultProps",{zoomLevel:1000,showEditFormButton:true,showHiddenFields:true,showLayerSelection:true});_defineProperty(AttributeTableWidget,"defaultState",{loading:false,selectedLayer:"",loadedLayer:"",features:[],filteredSortedFeatures:[],selectedFeatures:{},highlightedFeature:null,changedFeatureIdx:null,originalFeatureProps:null,pageSize:50,currentPage:0,filterField:"id",filterOp:"~",filterVal:"",sortField:null,deleteTask:null,newFeature:false,confirmDelete:false,limitToExtent:false,captchaResponse:""});export default connect(function(state){return{layers:state.layers.flat,filter:state.layers.filter,mapBbox:state.map.bbox,mapCrs:state.map.projection,mapScales:state.map.scales,theme:state.theme.current}},{addLayerFeatures:addLayerFeatures,removeLayer:removeLayer,setCurrentTask:setCurrentTask,setCurrentTaskBlocked:setCurrentTaskBlocked,zoomToExtent:zoomToExtent,zoomToPoint:zoomToPoint})(AttributeTableWidget);
|
|
@@ -4,5 +4,5 @@ function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof
|
|
|
4
4
|
*
|
|
5
5
|
* This source code is licensed under the BSD-style license found in the
|
|
6
6
|
* LICENSE file in the root directory of this source tree.
|
|
7
|
-
*/import React from"react";import mime from"mime-to-extensions";import PropTypes from"prop-types";import{
|
|
7
|
+
*/import React from"react";import mime from"mime-to-extensions";import PropTypes from"prop-types";import{v4 as uuidv4}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:uuidv4()+".jpg"});_this.props.updateField(_this.props.fieldId,"");_this.props.updateFile(_this.props.fieldId,new File([_this.dataUriToBlob(imageData)],uuidv4()+".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)],uuidv4()+".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
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};
|
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(o){return typeof o}:function(o){return o&&"function"==typeof Symbol&&o.constructor===Symbol&&o!==Symbol.prototype?"symbol":typeof o},_typeof(o)}function _createForOfIteratorHelper(r,e){var t="undefined"!=typeof Symbol&&r[Symbol.iterator]||r["@@iterator"];if(!t){if(Array.isArray(r)||(t=_unsupportedIterableToArray(r))||e&&r&&"number"==typeof r.length){t&&(r=t);var _n=0,F=function F(){};return{s:F,n:function n(){return _n>=r.length?{done:!0}:{done:!1,value:r[_n++]}},e:function e(r){throw r},f:F}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,a=!0,u=!1;return{s:function s(){t=t.call(r)},n:function n(){var r=t.next();return a=r.done,r},e:function e(r){u=!0,o=r},f:function f(){try{a||null==t["return"]||t["return"]()}finally{if(u)throw o}}}}function _toConsumableArray(r){return _arrayWithoutHoles(r)||_iterableToArray(r)||_unsupportedIterableToArray(r)||_nonIterableSpread()}function _nonIterableSpread(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _iterableToArray(r){if("undefined"!=typeof Symbol&&null!=r[Symbol.iterator]||null!=r["@@iterator"])return Array.from(r)}function _arrayWithoutHoles(r){if(Array.isArray(r))return _arrayLikeToArray(r)}function
|
|
1
|
+
function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(o){return typeof o}:function(o){return o&&"function"==typeof Symbol&&o.constructor===Symbol&&o!==Symbol.prototype?"symbol":typeof o},_typeof(o)}function _createForOfIteratorHelper(r,e){var t="undefined"!=typeof Symbol&&r[Symbol.iterator]||r["@@iterator"];if(!t){if(Array.isArray(r)||(t=_unsupportedIterableToArray(r))||e&&r&&"number"==typeof r.length){t&&(r=t);var _n=0,F=function F(){};return{s:F,n:function n(){return _n>=r.length?{done:!0}:{done:!1,value:r[_n++]}},e:function e(r){throw r},f:F}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,a=!0,u=!1;return{s:function s(){t=t.call(r)},n:function n(){var r=t.next();return a=r.done,r},e:function e(r){u=!0,o=r},f:function f(){try{a||null==t["return"]||t["return"]()}finally{if(u)throw o}}}}function _toConsumableArray(r){return _arrayWithoutHoles(r)||_iterableToArray(r)||_unsupportedIterableToArray(r)||_nonIterableSpread()}function _nonIterableSpread(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _iterableToArray(r){if("undefined"!=typeof Symbol&&null!=r[Symbol.iterator]||null!=r["@@iterator"])return Array.from(r)}function _arrayWithoutHoles(r){if(Array.isArray(r))return _arrayLikeToArray(r)}function _classCallCheck(a,n){if(!(a instanceof n))throw new TypeError("Cannot call a class as a function")}function _defineProperties(e,r){for(var t=0;t<r.length;t++){var o=r[t];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(e,_toPropertyKey(o.key),o)}}function _createClass(e,r,t){return r&&_defineProperties(e.prototype,r),t&&_defineProperties(e,t),Object.defineProperty(e,"prototype",{writable:!1}),e}function _callSuper(t,o,e){return o=_getPrototypeOf(o),_possibleConstructorReturn(t,_isNativeReflectConstruct()?Reflect.construct(o,e||[],_getPrototypeOf(t).constructor):o.apply(t,e))}function _possibleConstructorReturn(t,e){if(e&&("object"==_typeof(e)||"function"==typeof e))return e;if(void 0!==e)throw new TypeError("Derived constructors may only return object or undefined");return _assertThisInitialized(t)}function _assertThisInitialized(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function _isNativeReflectConstruct(){try{var t=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch(t){}return(_isNativeReflectConstruct=function _isNativeReflectConstruct(){return!!t})()}function _getPrototypeOf(t){return _getPrototypeOf=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(t){return t.__proto__||Object.getPrototypeOf(t)},_getPrototypeOf(t)}function _inherits(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),Object.defineProperty(t,"prototype",{writable:!1}),e&&_setPrototypeOf(t,e)}function _setPrototypeOf(t,e){return _setPrototypeOf=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,e){return t.__proto__=e,t},_setPrototypeOf(t,e)}function ownKeys(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);r&&(o=o.filter(function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable})),t.push.apply(t,o)}return t}function _objectSpread(e){for(var r=1;r<arguments.length;r++){var t=null!=arguments[r]?arguments[r]:{};r%2?ownKeys(Object(t),!0).forEach(function(r){_defineProperty(e,r,t[r])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):ownKeys(Object(t)).forEach(function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(t,r))})}return e}function _defineProperty(e,r,t){return(r=_toPropertyKey(r))in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}function _toPropertyKey(t){var i=_toPrimitive(t,"string");return"symbol"==_typeof(i)?i:i+""}function _toPrimitive(t,r){if("object"!=_typeof(t)||!t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var i=e.call(t,r||"default");if("object"!=_typeof(i))return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===r?String:Number)(t)}function _slicedToArray(r,e){return _arrayWithHoles(r)||_iterableToArrayLimit(r,e)||_unsupportedIterableToArray(r,e)||_nonIterableRest()}function _nonIterableRest(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _unsupportedIterableToArray(r,a){if(r){if("string"==typeof r)return _arrayLikeToArray(r,a);var t={}.toString.call(r).slice(8,-1);return"Object"===t&&r.constructor&&(t=r.constructor.name),"Map"===t||"Set"===t?Array.from(r):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?_arrayLikeToArray(r,a):void 0}}function _arrayLikeToArray(r,a){(null==a||a>r.length)&&(a=r.length);for(var e=0,n=Array(a);e<a;e++)n[e]=r[e];return n}function _iterableToArrayLimit(r,l){var t=null==r?null:"undefined"!=typeof Symbol&&r[Symbol.iterator]||r["@@iterator"];if(null!=t){var e,n,i,u,a=[],f=!0,o=!1;try{if(i=(t=t.call(r)).next,0===l){if(Object(t)!==t)return;f=!1}else for(;!(f=(e=i.call(t)).done)&&(a.push(e.value),a.length!==l);f=!0);}catch(r){o=!0,n=r}finally{try{if(!f&&null!=t["return"]&&(u=t["return"](),Object(u)!==u))return}finally{if(o)throw n}}return a}}function _arrayWithHoles(r){if(Array.isArray(r))return r}/**
|
|
2
2
|
* Copyright 2016-2024 Sourcepole AG
|
|
3
3
|
* All rights reserved.
|
|
4
4
|
*
|
|
5
5
|
* This source code is licensed under the BSD-style license found in the
|
|
6
6
|
* LICENSE file in the root directory of this source tree.
|
|
7
|
-
*/import React from"react";import{connect}from"react-redux";import axios from"axios";import clone from"clone";import FileSaver from"file-saver";import htmlReactParser,{domToReact}from"html-react-parser";import JSZip from"jszip";import isEmpty from"lodash.isempty";import omit from"lodash.omit";import PropTypes from"prop-types";import{setActiveLayerInfo}from"../actions/layerinfo";import{LayerRole,addLayerFeatures,removeLayer,changeLayerProperty}from"../actions/layers";import{zoomToPoint}from"../actions/map";import{openExternalUrl}from"../actions/windows";import ConfigUtils from"../utils/ConfigUtils";import CoordinatesUtils from"../utils/CoordinatesUtils";import LayerUtils from"../utils/LayerUtils";import LocaleUtils from"../utils/LocaleUtils";import MapUtils from"../utils/MapUtils";import MiscUtils from"../utils/MiscUtils";import VectorLayerUtils from"../utils/VectorLayerUtils";import Icon from"./Icon";import Spinner from"./widgets/Spinner";import"./style/IdentifyViewer.css";var BuiltinExporters=[{id:"json",title:"json",allowClipboard:true,"export":function _export(json,callback){var data=JSON.stringify(json,null," ");callback({data:data,type:"text/plain;charset=utf-8",filename:"results.json"})}},{id:"geojson",title:"geojson",allowClipboard:true,"export":function _export(json,callback){var featureCollection={type:"FeatureCollection",features:Object.values(json).flat().map(function(entry){var feature=omit(entry,
|
|
7
|
+
*/import React from"react";import{connect}from"react-redux";import axios from"axios";import clone from"clone";import FileSaver from"file-saver";import htmlReactParser,{domToReact}from"html-react-parser";import JSZip from"jszip";import isEmpty from"lodash.isempty";import omit from"lodash.omit";import PropTypes from"prop-types";import{setActiveLayerInfo}from"../actions/layerinfo";import{LayerRole,addLayerFeatures,removeLayer,changeLayerProperty}from"../actions/layers";import{zoomToPoint}from"../actions/map";import{openExternalUrl}from"../actions/windows";import ConfigUtils from"../utils/ConfigUtils";import CoordinatesUtils from"../utils/CoordinatesUtils";import LayerUtils from"../utils/LayerUtils";import LocaleUtils from"../utils/LocaleUtils";import MapUtils from"../utils/MapUtils";import MiscUtils from"../utils/MiscUtils";import VectorLayerUtils from"../utils/VectorLayerUtils";import Icon from"./Icon";import Spinner from"./widgets/Spinner";import"./style/IdentifyViewer.css";var EXCLUDE_PROPS=["featurereport","displayfield","layername","layertitle","layerinfo","attribnames","clickPos","displayname","bbox"];var BuiltinExporters=[{id:"json",title:"json",allowClipboard:true,"export":function _export(json,callback){var data=JSON.stringify(json,null," ");callback({data:data,type:"text/plain;charset=utf-8",filename:"results.json"})}},{id:"geojson",title:"geojson",allowClipboard:true,"export":function _export(json,callback){var featureCollection={type:"FeatureCollection",features:Object.values(json).flat().map(function(entry){var feature=omit(entry,EXCLUDE_PROPS);if(feature.geometry){feature.crs={type:"name",properties:{name:CoordinatesUtils.toOgcUrnCrs(entry.crs)}}}return feature})};var data=JSON.stringify(featureCollection,null," ");callback({data:data,type:"application/geo+json;charset=utf-8",filename:"results.json"})}},{id:"csv",title:"CSV",allowClipboard:true,"export":function _export(json,callback){var data="";Object.entries(json).forEach(function(_ref){var _ref2=_slicedToArray(_ref,2),layerName=_ref2[0],features=_ref2[1];features.forEach(function(feature){data+=layerName+": "+feature.displayname+"\n";Object.entries(feature.properties||{}).forEach(function(_ref3){var _ref4=_slicedToArray(_ref3,2),attrib=_ref4[0],value=_ref4[1];if(attrib!=="htmlContent"&&attrib!=="htmlContentInline"){data+="\t\""+attrib+"\"\t\""+String(value).replace("\"","\"\"")+"\"\n"}});if(feature.geometry){data+="\t\"geometry\"\t\""+VectorLayerUtils.geoJSONGeomToWkt(feature.geometry)+"\"\n"}});data+="\n"});callback({data:data,type:"text/plain;charset=utf-8",filename:"results.csv"})}},{id:"csvzip",title:"CSV+ZIP",allowClipboard:false,"export":function _export(json,callback){var first=true;var data=[];var filenames=[];Object.entries(json).forEach(function(_ref5){var _ref6=_slicedToArray(_ref5,2),layerName=_ref6[0],features=_ref6[1];var csv="";if(first){Object.entries(features[0].properties||{}).forEach(function(_ref7){var _ref8=_slicedToArray(_ref7,1),attrib=_ref8[0];if(attrib!=="htmlContent"&&attrib!=="htmlContentInline"){csv+=attrib+";"}});if(features[0].geometry){csv+="geometry"}else if(csv!==""){csv=csv.slice(0,-1);// Remove trailling semi column ;
|
|
8
8
|
}first=false;csv+="\n"}features.forEach(function(feature){Object.entries(feature.properties||{}).forEach(function(_ref9){var _ref10=_slicedToArray(_ref9,2),attrib=_ref10[0],value=_ref10[1];if(attrib!=="htmlContent"&&attrib!=="htmlContentInline"){csv+=String(value).replace("\"","\"\"")+";"}});if(feature.geometry){csv+=VectorLayerUtils.geoJSONGeomToWkt(feature.geometry)}else if(csv!==""){csv=csv.slice(0,-1);// Remove trailling semi column ;
|
|
9
|
-
}csv+="\n"});first=true;data.push(csv);filenames.push(layerName)});if(data.length>1){var zip=new JSZip;for(var i=0;i<data.length;i++){var blob=new Blob([data[i]],{type:"text/csv;charset=utf-8"});zip.file(filenames[i]+".csv",blob)}zip.generateAsync({type:"arraybuffer"}).then(function(result){callback({data:result,type:"application/zip",filename:"results.zip"})})}else{callback({data:data[0],type:"text/csv;charset=utf-8",filename:filenames[0]+".csv"})}}}];var IdentifyViewer=/*#__PURE__*/function(_React$Component){function IdentifyViewer(props){var _this;_classCallCheck(this,IdentifyViewer);_this=_callSuper(this,IdentifyViewer,[props]);_defineProperty(_this,"state",{expanded:{},expandedResults:{},resultTree:{},reports:{},currentResult:null,currentLayer:null,exportFormat:"geojson",selectedAggregatedReport:"",generatingReport:false,selectedLayer:""});_defineProperty(_this,"updateResultTree",function(){var layers=Object.keys(_this.props.identifyResults);var currentResult=null;var currentLayer=null;if(layers.length===1&&_this.props.identifyResults[layers[0]].length===1){currentLayer=layers[0];currentResult=_this.props.identifyResults[layers[0]][0]}_this.setState({resultTree:clone(_this.props.identifyResults),currentResult:currentResult,currentLayer:currentLayer,reports:LayerUtils.collectFeatureReports(_this.props.layers)})});_defineProperty(_this,"setHighlightedResults",function(results,resultTree){if(!results&&_this.props.highlightAllResults){var selectedLayer=_this.state.selectedLayer||"";results=Object.keys(resultTree).reduce(function(res,layer){var layerData=resultTree[selectedLayer||layer];return res.concat(layerData.map(function(result){return _objectSpread(_objectSpread({},result),{},{id:"".concat(selectedLayer||layer,".").concat(result.id)})}))},[])}results=(results||[]).filter(function(result){return result.type.toLowerCase()==="feature"}).map(function(feature){var newFeature=_objectSpread(_objectSpread({},feature),{},{properties:{}});// Ensure selection style is used
|
|
10
|
-
delete newFeature.styleName;delete newFeature.styleOptions;return newFeature});if(!isEmpty(results)){var layer={id:"__identifyviewerhighlight",role:LayerRole.SELECTION};_this.props.addLayerFeatures(layer,results,true)}else{_this.props.removeLayer("__identifyviewerhighlight")}});_defineProperty(_this,"getExpandedClass",function(path,deflt){var expanded=_this.state.expanded[path]!==undefined?_this.state.expanded[path]:deflt;return expanded?"identify-layer-expandable identify-layer-expanded":"identify-layer-expandable"});_defineProperty(_this,"toggleExpanded",function(path,deflt){var newstate=_this.state.expanded[path]!==undefined?!_this.state.expanded[path]:!deflt;var diff={};diff[path]=newstate;if(_this.state.currentLayer===path&&!newstate){_this.setState(function(state){return _objectSpread(_objectSpread({},state),{},{expanded:_objectSpread(_objectSpread({},state.expanded),diff),currentResult:null,currentLayer:null})})}else{_this.setState(function(state){return _objectSpread(_objectSpread({},state),{},{expanded:_objectSpread(_objectSpread({},state.expanded),diff)})})}});_defineProperty(_this,"setCurrentResult",function(layer,result){if(_this.state.currentResult===result){_this.setState({currentResult:null,currentLayer:null})}else{_this.setState({currentResult:result,currentLayer:layer});_this.scrollIntoView=true}});_defineProperty(_this,"removeResultLayer",function(layer){_this.setState(function(state){var newResultTree=_objectSpread({},state.resultTree);delete newResultTree[layer];_this.setState({resultTree:newResultTree,currentResult:state.currentLayer===layer?null:state.currentResult,currentLayer:state.currentLayer===layer?null:state.currentLayer})})});_defineProperty(_this,"removeResult",function(layer,result){_this.setState(function(state){var newResultTree=_objectSpread({},state.resultTree);newResultTree[layer]=state.resultTree[layer].filter(function(item){return item!==result});if(isEmpty(newResultTree[layer])){delete newResultTree[layer]}var selectedLayer=isEmpty(newResultTree[layer])?"":state.selectedLayer;return{resultTree:newResultTree,currentResult:state.currentResult===result?null:state.currentResult,selectedLayer:selectedLayer}})});_defineProperty(_this,"exportResults",function(){var clipboard=arguments.length>0&&arguments[0]!==undefined?arguments[0]:false;var filteredResults={};Object.keys(_this.state.selectedLayer!==""?_defineProperty({},_this.state.selectedLayer,_this.state.resultTree[_this.state.selectedLayer]):_this.state.resultTree).map(function(key){if(!isEmpty(_this.state.resultTree[key])){filteredResults[key]=_this.state.resultTree[key]}});_this["export"](filteredResults,clipboard)});_defineProperty(_this,"exportResultLayer",function(layer){_this["export"](_defineProperty({},layer,_this.state.resultTree[layer]))});_defineProperty(_this,"exportResult",function(layer,result){_this["export"](_defineProperty({},layer,[result]))});_defineProperty(_this,"export",function(json){var clipboard=arguments.length>1&&arguments[1]!==undefined?arguments[1]:false;var exporter=_this.getExporters().find(function(entry){return entry.id===_this.state.exportFormat});if(exporter){if(!_this.props.exportGeometry){json=Object.entries(json).reduce(function(res,_ref12){var _ref13=_slicedToArray(_ref12,2),layerId=_ref13[0],features=_ref13[1];return _objectSpread(_objectSpread({},res),{},_defineProperty({},layerId,features.map(function(feature){return omit(feature,["geometry"])})))},{})}exporter["export"](json,function(result){if(clipboard&&exporter.allowClipboard){navigator.clipboard.writeText(result.data)}else{FileSaver.saveAs(new Blob([result.data],{type:result.type}),result.filename)}})}});_defineProperty(_this,"renderLayer",function(layer){var results=_this.state.resultTree[layer];if(results.length===0){return null}return/*#__PURE__*/React.createElement("div",{className:_this.getExpandedClass(layer,true),key:layer},/*#__PURE__*/React.createElement("div",{className:"identify-result-entry",onMouseEnter:function onMouseEnter(){return _this.setHighlightedResults(results,_this.state.resultTree)},onMouseLeave:function onMouseLeave(){return _this.setHighlightedResults(_this.state.currentResult===null?null:[_this.state.currentResult],_this.state.resultTree)}},/*#__PURE__*/React.createElement("span",{className:"clickable",onClick:function onClick(){return _this.toggleExpanded(layer,true)}},/*#__PURE__*/React.createElement("b",null,results[0].layertitle)),/*#__PURE__*/React.createElement(Icon,{className:"identify-remove-result",icon:"minus-sign",onClick:function onClick(){return _this.removeResultLayer(layer)}}),_this.props.enableExport===true||!isEmpty(_this.props.enableExport)?/*#__PURE__*/React.createElement(Icon,{className:"identify-export-result",icon:"export",onClick:function onClick(){return _this.exportResultLayer(layer)}}):null),/*#__PURE__*/React.createElement("div",{className:"identify-layer-entries"},results.map(function(result){return _this.renderResult(layer,result)})))});_defineProperty(_this,"renderResult",function(layer,result){var ref=_this.state.currentResult===result&&_this.scrollIntoView?function(el){_this.currentResultElRef=el}:null;return/*#__PURE__*/React.createElement("div",{className:"identify-result-entry",key:result.id,onMouseEnter:function onMouseEnter(){return _this.setHighlightedResults([result],_this.state.resultTree)},onMouseLeave:function onMouseLeave(){return _this.setHighlightedResults(_this.state.currentResult===null?null:[_this.state.currentResult],_this.state.resultTree)}},/*#__PURE__*/React.createElement("span",{className:_this.state.currentResult===result?"active clickable":"clickable",onClick:function onClick(){return _this.setCurrentResult(layer,result)},ref:ref},result.displayname),/*#__PURE__*/React.createElement(Icon,{className:"identify-remove-result",icon:"minus-sign",onClick:function onClick(){return _this.removeResult(layer,result)}}),_this.props.enableExport===true||!isEmpty(_this.props.enableExport)?/*#__PURE__*/React.createElement(Icon,{className:"identify-export-result",icon:"export",onClick:function onClick(){return _this.exportResult(layer,result)}}):null)});_defineProperty(_this,"renderResultAttributes",function(layer,result,resultClass){if(!result){return null}var resultbox=null;var extraattribs=null;var inlineExtaAttribs=false;var featureReports=_this.state.reports[layer]||[];if(result.featureReport){featureReports.push({title:result.layertitle,template:result.featureReport})}if(result.type==="text"){resultbox=/*#__PURE__*/React.createElement("pre",{className:"identify-result-box"},result.text)}else if(result.type==="html"){resultbox=/*#__PURE__*/React.createElement("iframe",{className:"identify-result-box",onLoad:function onLoad(ev){return _this.setIframeContent(ev.target,result.text)},ref:function ref(el){return _this.pollIframe(el,result.text)}})}else if(result.properties.htmlContent){if(result.properties.htmlContentInline){resultbox=/*#__PURE__*/React.createElement("div",{className:"identify-result-box"},_this.parsedContent(result.properties.htmlContent))}else{resultbox=/*#__PURE__*/React.createElement("iframe",{className:"identify-result-box",onLoad:function onLoad(ev){return _this.setIframeContent(ev.target,result.properties.htmlContent)},ref:function ref(el){return _this.pollIframe(el,result.properties.htmlContent)}})}}else{var _rows;inlineExtaAttribs=true;var properties=Object.keys(result.properties)||[];var rows=[];if(properties.length===1&&result.properties.maptip){rows=properties.map(function(attrib){return/*#__PURE__*/React.createElement("tr",{key:attrib},/*#__PURE__*/React.createElement("td",{className:"identify-attr-value"},_this.attribValue(result.properties[attrib],attrib,layer,result)))})}else{rows=properties.map(function(attrib){if(_this.props.theme.skipEmptyFeatureAttributes&&(result.properties[attrib]===""||result.properties[attrib]===null||result.properties[attrib]==="NULL")){return null}return/*#__PURE__*/React.createElement("tr",{key:attrib},/*#__PURE__*/React.createElement("td",{className:"identify-attr-title "+_this.props.longAttributesDisplay},/*#__PURE__*/React.createElement("i",null,attrib)),/*#__PURE__*/React.createElement("td",{className:"identify-attr-value "+_this.props.longAttributesDisplay},_this.attribValue(result.properties[attrib],attrib,layer,result)))})}(_rows=rows).push.apply(_rows,_toConsumableArray(_this.computeExtraAttributes(layer,result)));featureReports.forEach(function(report,idx){rows.push(/*#__PURE__*/React.createElement("tr",{key:"__featurereport"+idx},/*#__PURE__*/React.createElement("td",{className:"identify-attr-title "+_this.props.longAttributesDisplay},/*#__PURE__*/React.createElement("i",null,LocaleUtils.tr("identify.featureReport")+": "+report.title)),/*#__PURE__*/React.createElement("td",{className:"identify-attr-value "+_this.props.longAttributesDisplay},/*#__PURE__*/React.createElement("a",{href:_this.getFeatureReportUrl(report,result)},LocaleUtils.tr("identify.link")))))});if(isEmpty(rows)){rows=/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",{className:"identify-attr-value"},/*#__PURE__*/React.createElement("i",null,LocaleUtils.tr("identify.noattributes"))))}resultbox=/*#__PURE__*/React.createElement("div",{className:"identify-result-box"},/*#__PURE__*/React.createElement("table",{className:"attribute-list"},/*#__PURE__*/React.createElement("tbody",null,rows)))}if(!inlineExtaAttribs&&(_this.props.attributeCalculator||!isEmpty(_this.state.reports[layer]))){extraattribs=/*#__PURE__*/React.createElement("div",{className:"identify-result-box"},/*#__PURE__*/React.createElement("table",{className:"attribute-list"},/*#__PURE__*/React.createElement("tbody",null,_this.computeExtraAttributes(layer,result),featureReports.map(function(report,idx){return/*#__PURE__*/React.createElement("tr",{key:"report"+idx},/*#__PURE__*/React.createElement("td",{className:"identify-attr-title "+_this.props.longAttributesDisplay},/*#__PURE__*/React.createElement("i",null,LocaleUtils.tr("identify.featureReport")+": "+report.title)),/*#__PURE__*/React.createElement("td",{className:"identify-attr-value "+_this.props.longAttributesDisplay},/*#__PURE__*/React.createElement("a",{href:_this.getFeatureReportUrl(report,result),rel:"noreferrer",target:"_blank"},LocaleUtils.tr("identify.link"))))}))))}var zoomToFeatureButton=null;if(result.bbox&&result.crs){zoomToFeatureButton=/*#__PURE__*/React.createElement(Icon,{icon:"zoom",onClick:function onClick(){return _this.zoomToResult(result)}})}var key=result+":"+result.id;var expanded=_this.state.expandedResults[key];return/*#__PURE__*/React.createElement("div",{className:resultClass,key:"results-attributes"},/*#__PURE__*/React.createElement("div",{className:"identify-result-title"},_this.props.collapsible?/*#__PURE__*/React.createElement(Icon,{icon:expanded?"tree_minus":"tree_plus",onClick:function onClick(){return _this.setState(function(state){return{expandedResults:_objectSpread(_objectSpread({},state.expandedResults),{},_defineProperty({},key,!expanded))}})}}):/*#__PURE__*/React.createElement(Icon,{icon:"minus",onClick:function onClick(){return _this.removeResult(layer,result)}}),/*#__PURE__*/React.createElement("span",null,(_this.props.showLayerTitles?result.layertitle+": ":"")+result.displayname),zoomToFeatureButton,/*#__PURE__*/React.createElement(Icon,{icon:"info-sign",onClick:function onClick(){return _this.showLayerInfo(layer)}})),_this.props.collapsible&&!expanded?null:/*#__PURE__*/React.createElement("div",{className:"identify-result-container"},resultbox,extraattribs))});_defineProperty(_this,"computeExtraAttributes",function(layer,result){var _window$qwc;var rows=[];Object.values(((_window$qwc=window.qwc2)===null||_window$qwc===void 0?void 0:_window$qwc.__attributeCalculators)||{}).forEach(function(calc,idx){var row=calc(layer,result);if(row.length===2){rows.push(/*#__PURE__*/React.createElement("tr",{key:"custom-attr-"+idx},/*#__PURE__*/React.createElement("td",{className:"identify-attr-title"},/*#__PURE__*/React.createElement("i",null,row[0])),/*#__PURE__*/React.createElement("td",{className:"identify-attr-value"},row[1])))}else if(row.length===1){rows.push(/*#__PURE__*/React.createElement("tr",{key:"custom-attr-"+idx},/*#__PURE__*/React.createElement("td",{colSpan:"2"},row[0])))}});if(_this.props.attributeCalculator){rows.push.apply(rows,_toConsumableArray(_this.props.attributeCalculator(layer,result)))}return rows});_defineProperty(_this,"getExporters",function(){var _window$qwc2;return[].concat(BuiltinExporters,_toConsumableArray(_this.props.customExporters),_toConsumableArray(Object.values(((_window$qwc2=window.qwc2)===null||_window$qwc2===void 0?void 0:_window$qwc2.__identifyExportes)||[])))});_defineProperty(_this,"setIframeContent",function(iframe,html){if(iframe.getAttribute("identify-content-set")){return}iframe.setAttribute("identify-content-set",true);iframe.contentWindow.document.open();iframe.contentWindow.document.write(html);iframe.contentWindow.document.close()});_defineProperty(_this,"pollIframe",function(iframe,html){if(iframe&&!iframe.getAttribute("identify-content-set")){var interval=setInterval(function(){if(iframe.getAttribute("identify-content-set")){return clearInterval(interval)}if(iframe.contentWindow&&iframe.contentWindow.document){iframe.setAttribute("identify-content-set",true);iframe.contentWindow.document.open();iframe.contentWindow.document.write(html);iframe.contentWindow.document.close();clearInterval(interval)}return true},500)}});_defineProperty(_this,"collectFeatureReportTemplates",function(entry){var reports={};if(entry.sublayers){var _iterator=_createForOfIteratorHelper(entry.sublayers),_step;try{for(_iterator.s();!(_step=_iterator.n()).done;){var sublayer=_step.value;reports=_objectSpread(_objectSpread({},reports),_this.collectFeatureReportTemplates(sublayer))}}catch(err){_iterator.e(err)}finally{_iterator.f()}}else if(entry.featureReport){reports[entry.name]=entry.featureReport}return reports});_defineProperty(_this,"findFeatureReportTemplate",function(layer){var reports={};_this.props.layers.filter(function(l){return l.role===LayerRole.THEME}).forEach(function(themeLayer){reports=_objectSpread(_objectSpread({},reports),_this.collectFeatureReportTemplates(themeLayer))});return reports[layer]||null});_defineProperty(_this,"getFeatureReportUrl",function(report,result){var serviceUrl=ConfigUtils.getConfigProp("documentServiceUrl").replace(/\/$/,"");var params={feature:result.id,x:result.clickPos[0],y:result.clickPos[1],crs:_this.props.map.projection,single_report:report.single_report||false};var path="/"+report.template+"."+(report.format||"pdf");var query=Object.keys(params).map(function(key){return encodeURIComponent(key)+"="+encodeURIComponent(params[key])}).join("&");return serviceUrl+path+"?"+query});_defineProperty(_this,"downloadAggregatedReport",function(){var _this$state$selectedA=_this.state.selectedAggregatedReport.split("::"),_this$state$selectedA2=_slicedToArray(_this$state$selectedA,2),layername=_this$state$selectedA2[0],idx=_this$state$selectedA2[1];var report=_this.state.reports[layername][idx];var results=_this.state.resultTree[layername];var serviceUrl=ConfigUtils.getConfigProp("documentServiceUrl").replace(/\/$/,"");var params={feature:results.map(function(result){return result.id}).join(","),x:results[0].clickPos[0],y:results[0].clickPos[1],crs:_this.props.map.projection,single_report:report.single_report||false};_this.setState({generatingReport:true});var url=serviceUrl+"/"+report.template;axios.get(url,{params:params,responseType:"arraybuffer"}).then(function(response){var filename=(report.filename||report.title.replace(" ","_"))+"."+(report.format||"pdf");FileSaver.saveAs(new Blob([response.data],{type:"application/pdf"}),filename);_this.setState({generatingReport:false})})["catch"](function(){/* eslint-disable-next-line */alert(LocaleUtils.tr("identify.reportfail"));_this.setState({generatingReport:false})})});_defineProperty(_this,"showLayerInfo",function(layer){var _layer$split=layer.split("#"),_layer$split2=_slicedToArray(_layer$split,2),layerUrl=_layer$split2[0],layerName=_layer$split2[1];var match=LayerUtils.searchLayer(_this.props.layers,layerUrl,layerName);if(match){_this.props.setActiveLayerInfo(match.layer,match.sublayer)}});_defineProperty(_this,"attribValue",function(text,attrName,layer,result){if(_typeof(text)==="object"){text=JSON.stringify(text)}if(_this.props.replaceImageUrls&&/^https?:\/\/.*\.(jpg|jpeg|png|bmp)$/i.exec(text)){return/*#__PURE__*/React.createElement("a",{href:text,rel:"noreferrer",target:"_blank"},/*#__PURE__*/React.createElement("img",{src:text}))}text=""+text;// Ensure text is a string
|
|
9
|
+
}csv+="\n"});first=true;data.push(csv);filenames.push(layerName)});if(data.length>1){var zip=new JSZip;for(var i=0;i<data.length;i++){var blob=new Blob([data[i]],{type:"text/csv;charset=utf-8"});zip.file(filenames[i]+".csv",blob)}zip.generateAsync({type:"arraybuffer"}).then(function(result){callback({data:result,type:"application/zip",filename:"results.zip"})})}else{callback({data:data[0],type:"text/csv;charset=utf-8",filename:filenames[0]+".csv"})}}},{id:"shapefile",title:"Shapefile",allowClipboard:false,"export":function _export(json,callback){import("@mapbox/shp-write").then(function(shpwriteMod){var shpwrite=shpwriteMod["default"];var layers=Object.entries(json);var options={outputType:"arraybuffer",types:{point:"points",polygon:"polygons",polyline:"lines"}};var promises=layers.map(function(_ref11){var _features$;var _ref12=_slicedToArray(_ref11,2),layerName=_ref12[0],features=_ref12[1];var geojson={type:"FeatureCollection",features:features.map(function(entry){return omit(entry,EXCLUDE_PROPS)})};var layerOptions=_objectSpread(_objectSpread({},options),{},{folder:layerName});var crs=(_features$=features[0])===null||_features$===void 0?void 0:_features$.crs;if(crs){var wkt=CoordinatesUtils.getEsriWktFromCrs(crs);if(wkt){layerOptions.prj=wkt}}return shpwrite.zip(geojson,layerOptions).then(function(shpData){return{layerName:layerName,shpData:shpData}})});Promise.all(promises).then(function(results){if(results.length===1){callback({data:results[0].shpData,type:"application/zip",filename:results[0].layerName+".zip"})}else{var zip=new JSZip;results.forEach(function(_ref13){var layerName=_ref13.layerName,shpData=_ref13.shpData;zip.file(layerName+".zip",shpData)});zip.generateAsync({type:"arraybuffer"}).then(function(result){callback({data:result,type:"application/zip",filename:"shapefiles.zip"})})}})})}}];var IdentifyViewer=/*#__PURE__*/function(_React$Component){function IdentifyViewer(props){var _this;_classCallCheck(this,IdentifyViewer);_this=_callSuper(this,IdentifyViewer,[props]);_defineProperty(_this,"state",{expanded:{},expandedResults:{},resultTree:{},reports:{},currentResult:null,currentLayer:null,exportFormat:"geojson",selectedAggregatedReport:"",generatingReport:false,selectedLayer:""});_defineProperty(_this,"updateResultTree",function(){var layers=Object.keys(_this.props.identifyResults);var currentResult=null;var currentLayer=null;if(layers.length===1&&_this.props.identifyResults[layers[0]].length===1){currentLayer=layers[0];currentResult=_this.props.identifyResults[layers[0]][0]}_this.setState({resultTree:clone(_this.props.identifyResults),currentResult:currentResult,currentLayer:currentLayer,reports:LayerUtils.collectFeatureReports(_this.props.layers)})});_defineProperty(_this,"setHighlightedResults",function(results,resultTree){if(!results&&_this.props.highlightAllResults){var selectedLayer=_this.state.selectedLayer||"";results=Object.keys(resultTree).reduce(function(res,layer){var layerData=resultTree[selectedLayer||layer];return res.concat(layerData.map(function(result){return _objectSpread(_objectSpread({},result),{},{id:"".concat(selectedLayer||layer,".").concat(result.id)})}))},[])}results=(results||[]).filter(function(result){return result.type.toLowerCase()==="feature"}).map(function(feature){var newFeature=_objectSpread(_objectSpread({},feature),{},{properties:{}});// Ensure selection style is used
|
|
10
|
+
delete newFeature.styleName;delete newFeature.styleOptions;return newFeature});if(!isEmpty(results)){var layer={id:"__identifyviewerhighlight",role:LayerRole.SELECTION};_this.props.addLayerFeatures(layer,results,true)}else{_this.props.removeLayer("__identifyviewerhighlight")}});_defineProperty(_this,"getExpandedClass",function(path,deflt){var expanded=_this.state.expanded[path]!==undefined?_this.state.expanded[path]:deflt;return expanded?"identify-layer-expandable identify-layer-expanded":"identify-layer-expandable"});_defineProperty(_this,"toggleExpanded",function(path,deflt){var newstate=_this.state.expanded[path]!==undefined?!_this.state.expanded[path]:!deflt;var diff={};diff[path]=newstate;if(_this.state.currentLayer===path&&!newstate){_this.setState(function(state){return _objectSpread(_objectSpread({},state),{},{expanded:_objectSpread(_objectSpread({},state.expanded),diff),currentResult:null,currentLayer:null})})}else{_this.setState(function(state){return _objectSpread(_objectSpread({},state),{},{expanded:_objectSpread(_objectSpread({},state.expanded),diff)})})}});_defineProperty(_this,"setCurrentResult",function(layer,result){if(_this.state.currentResult===result){_this.setState({currentResult:null,currentLayer:null})}else{_this.setState({currentResult:result,currentLayer:layer});_this.scrollIntoView=true}});_defineProperty(_this,"removeResultLayer",function(layer){_this.setState(function(state){var newResultTree=_objectSpread({},state.resultTree);delete newResultTree[layer];_this.setState({resultTree:newResultTree,currentResult:state.currentLayer===layer?null:state.currentResult,currentLayer:state.currentLayer===layer?null:state.currentLayer})})});_defineProperty(_this,"removeResult",function(layer,result){_this.setState(function(state){var newResultTree=_objectSpread({},state.resultTree);newResultTree[layer]=state.resultTree[layer].filter(function(item){return item!==result});if(isEmpty(newResultTree[layer])){delete newResultTree[layer]}var selectedLayer=isEmpty(newResultTree[layer])?"":state.selectedLayer;return{resultTree:newResultTree,currentResult:state.currentResult===result?null:state.currentResult,selectedLayer:selectedLayer}})});_defineProperty(_this,"exportResults",function(){var clipboard=arguments.length>0&&arguments[0]!==undefined?arguments[0]:false;var filteredResults={};Object.keys(_this.state.selectedLayer!==""?_defineProperty({},_this.state.selectedLayer,_this.state.resultTree[_this.state.selectedLayer]):_this.state.resultTree).map(function(key){if(!isEmpty(_this.state.resultTree[key])){filteredResults[key]=_this.state.resultTree[key]}});_this["export"](filteredResults,clipboard)});_defineProperty(_this,"exportResultLayer",function(layer){_this["export"](_defineProperty({},layer,_this.state.resultTree[layer]))});_defineProperty(_this,"exportResult",function(layer,result){_this["export"](_defineProperty({},layer,[result]))});_defineProperty(_this,"export",function(json){var clipboard=arguments.length>1&&arguments[1]!==undefined?arguments[1]:false;var exporter=_this.getExporters().find(function(entry){return entry.id===_this.state.exportFormat});if(exporter){if(!_this.props.exportGeometry){json=Object.entries(json).reduce(function(res,_ref15){var _ref16=_slicedToArray(_ref15,2),layerId=_ref16[0],features=_ref16[1];return _objectSpread(_objectSpread({},res),{},_defineProperty({},layerId,features.map(function(feature){return omit(feature,["geometry"])})))},{})}exporter["export"](json,function(result){if(clipboard&&exporter.allowClipboard){navigator.clipboard.writeText(result.data)}else{FileSaver.saveAs(new Blob([result.data],{type:result.type}),result.filename)}})}});_defineProperty(_this,"renderLayer",function(layer){var results=_this.state.resultTree[layer];if(results.length===0){return null}return/*#__PURE__*/React.createElement("div",{className:_this.getExpandedClass(layer,true),key:layer},/*#__PURE__*/React.createElement("div",{className:"identify-result-entry",onMouseEnter:function onMouseEnter(){return _this.setHighlightedResults(results,_this.state.resultTree)},onMouseLeave:function onMouseLeave(){return _this.setHighlightedResults(_this.state.currentResult===null?null:[_this.state.currentResult],_this.state.resultTree)}},/*#__PURE__*/React.createElement("span",{className:"clickable",onClick:function onClick(){return _this.toggleExpanded(layer,true)}},/*#__PURE__*/React.createElement("b",null,results[0].layertitle)),/*#__PURE__*/React.createElement(Icon,{className:"identify-remove-result",icon:"minus-sign",onClick:function onClick(){return _this.removeResultLayer(layer)}}),_this.props.enableExport===true||!isEmpty(_this.props.enableExport)?/*#__PURE__*/React.createElement(Icon,{className:"identify-export-result",icon:"export",onClick:function onClick(){return _this.exportResultLayer(layer)}}):null),/*#__PURE__*/React.createElement("div",{className:"identify-layer-entries"},results.map(function(result){return _this.renderResult(layer,result)})))});_defineProperty(_this,"renderResult",function(layer,result){var ref=_this.state.currentResult===result&&_this.scrollIntoView?function(el){_this.currentResultElRef=el}:null;return/*#__PURE__*/React.createElement("div",{className:"identify-result-entry",key:result.id,onMouseEnter:function onMouseEnter(){return _this.setHighlightedResults([result],_this.state.resultTree)},onMouseLeave:function onMouseLeave(){return _this.setHighlightedResults(_this.state.currentResult===null?null:[_this.state.currentResult],_this.state.resultTree)}},/*#__PURE__*/React.createElement("span",{className:_this.state.currentResult===result?"active clickable":"clickable",onClick:function onClick(){return _this.setCurrentResult(layer,result)},ref:ref},result.displayname),/*#__PURE__*/React.createElement(Icon,{className:"identify-remove-result",icon:"minus-sign",onClick:function onClick(){return _this.removeResult(layer,result)}}),_this.props.enableExport===true||!isEmpty(_this.props.enableExport)?/*#__PURE__*/React.createElement(Icon,{className:"identify-export-result",icon:"export",onClick:function onClick(){return _this.exportResult(layer,result)}}):null)});_defineProperty(_this,"renderResultAttributes",function(layer,result,resultClass){if(!result){return null}var resultbox=null;var extraattribs=null;var inlineExtaAttribs=false;var featureReports=_this.state.reports[layer]||[];if(result.featureReport){featureReports.push({title:result.layertitle,template:result.featureReport})}if(result.type==="text"){resultbox=/*#__PURE__*/React.createElement("pre",{className:"identify-result-box"},result.text)}else if(result.type==="html"){resultbox=/*#__PURE__*/React.createElement("iframe",{className:"identify-result-box",onLoad:function onLoad(ev){return _this.setIframeContent(ev.target,result.text)},ref:function ref(el){return _this.pollIframe(el,result.text)}})}else if(result.properties.htmlContent){if(result.properties.htmlContentInline){resultbox=/*#__PURE__*/React.createElement("div",{className:"identify-result-box"},_this.parsedContent(result.properties.htmlContent))}else{resultbox=/*#__PURE__*/React.createElement("iframe",{className:"identify-result-box",onLoad:function onLoad(ev){return _this.setIframeContent(ev.target,result.properties.htmlContent)},ref:function ref(el){return _this.pollIframe(el,result.properties.htmlContent)}})}}else{var _rows;inlineExtaAttribs=true;var properties=Object.keys(result.properties)||[];var rows=[];if(properties.length===1&&result.properties.maptip){rows=properties.map(function(attrib){return/*#__PURE__*/React.createElement("tr",{key:attrib},/*#__PURE__*/React.createElement("td",{className:"identify-attr-value"},_this.attribValue(result.properties[attrib],attrib,layer,result)))})}else{rows=properties.map(function(attrib){if(_this.props.theme.skipEmptyFeatureAttributes&&(result.properties[attrib]===""||result.properties[attrib]===null||result.properties[attrib]==="NULL")){return null}return/*#__PURE__*/React.createElement("tr",{key:attrib},/*#__PURE__*/React.createElement("td",{className:"identify-attr-title "+_this.props.longAttributesDisplay},/*#__PURE__*/React.createElement("i",null,attrib)),/*#__PURE__*/React.createElement("td",{className:"identify-attr-value "+_this.props.longAttributesDisplay},_this.attribValue(result.properties[attrib],attrib,layer,result)))})}(_rows=rows).push.apply(_rows,_toConsumableArray(_this.computeExtraAttributes(layer,result)));featureReports.forEach(function(report,idx){rows.push(/*#__PURE__*/React.createElement("tr",{key:"__featurereport"+idx},/*#__PURE__*/React.createElement("td",{className:"identify-attr-title "+_this.props.longAttributesDisplay},/*#__PURE__*/React.createElement("i",null,LocaleUtils.tr("identify.featureReport")+": "+report.title)),/*#__PURE__*/React.createElement("td",{className:"identify-attr-value "+_this.props.longAttributesDisplay},/*#__PURE__*/React.createElement("a",{href:_this.getFeatureReportUrl(report,result)},LocaleUtils.tr("identify.link")))))});if(isEmpty(rows)){rows=/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",{className:"identify-attr-value"},/*#__PURE__*/React.createElement("i",null,LocaleUtils.tr("identify.noattributes"))))}resultbox=/*#__PURE__*/React.createElement("div",{className:"identify-result-box"},/*#__PURE__*/React.createElement("table",{className:"attribute-list"},/*#__PURE__*/React.createElement("tbody",null,rows)))}if(!inlineExtaAttribs&&(_this.props.attributeCalculator||!isEmpty(_this.state.reports[layer]))){extraattribs=/*#__PURE__*/React.createElement("div",{className:"identify-result-box"},/*#__PURE__*/React.createElement("table",{className:"attribute-list"},/*#__PURE__*/React.createElement("tbody",null,_this.computeExtraAttributes(layer,result),featureReports.map(function(report,idx){return/*#__PURE__*/React.createElement("tr",{key:"report"+idx},/*#__PURE__*/React.createElement("td",{className:"identify-attr-title "+_this.props.longAttributesDisplay},/*#__PURE__*/React.createElement("i",null,LocaleUtils.tr("identify.featureReport")+": "+report.title)),/*#__PURE__*/React.createElement("td",{className:"identify-attr-value "+_this.props.longAttributesDisplay},/*#__PURE__*/React.createElement("a",{href:_this.getFeatureReportUrl(report,result),rel:"noreferrer",target:"_blank"},LocaleUtils.tr("identify.link"))))}))))}var zoomToFeatureButton=null;if(result.bbox&&result.crs){zoomToFeatureButton=/*#__PURE__*/React.createElement(Icon,{icon:"zoom",onClick:function onClick(){return _this.zoomToResult(result)}})}var key=result+":"+result.id;var expanded=_this.state.expandedResults[key];return/*#__PURE__*/React.createElement("div",{className:resultClass,key:"results-attributes"},/*#__PURE__*/React.createElement("div",{className:"identify-result-title"},_this.props.collapsible?/*#__PURE__*/React.createElement(Icon,{icon:expanded?"tree_minus":"tree_plus",onClick:function onClick(){return _this.setState(function(state){return{expandedResults:_objectSpread(_objectSpread({},state.expandedResults),{},_defineProperty({},key,!expanded))}})}}):/*#__PURE__*/React.createElement(Icon,{icon:"minus",onClick:function onClick(){return _this.removeResult(layer,result)}}),/*#__PURE__*/React.createElement("span",null,(_this.props.showLayerTitles?result.layertitle+": ":"")+result.displayname),zoomToFeatureButton,/*#__PURE__*/React.createElement(Icon,{icon:"info-sign",onClick:function onClick(){return _this.showLayerInfo(layer)}})),_this.props.collapsible&&!expanded?null:/*#__PURE__*/React.createElement("div",{className:"identify-result-container"},resultbox,extraattribs))});_defineProperty(_this,"computeExtraAttributes",function(layer,result){var _window$qwc;var rows=[];Object.values(((_window$qwc=window.qwc2)===null||_window$qwc===void 0?void 0:_window$qwc.__attributeCalculators)||{}).forEach(function(calc,idx){var row=calc(layer,result);if(row.length===2){rows.push(/*#__PURE__*/React.createElement("tr",{key:"custom-attr-"+idx},/*#__PURE__*/React.createElement("td",{className:"identify-attr-title"},/*#__PURE__*/React.createElement("i",null,row[0])),/*#__PURE__*/React.createElement("td",{className:"identify-attr-value"},row[1])))}else if(row.length===1){rows.push(/*#__PURE__*/React.createElement("tr",{key:"custom-attr-"+idx},/*#__PURE__*/React.createElement("td",{colSpan:"2"},row[0])))}});if(_this.props.attributeCalculator){rows.push.apply(rows,_toConsumableArray(_this.props.attributeCalculator(layer,result)))}return rows});_defineProperty(_this,"getExporters",function(){var _window$qwc2;return[].concat(BuiltinExporters,_toConsumableArray(_this.props.customExporters),_toConsumableArray(Object.values(((_window$qwc2=window.qwc2)===null||_window$qwc2===void 0?void 0:_window$qwc2.__identifyExportes)||[])))});_defineProperty(_this,"setIframeContent",function(iframe,html){if(iframe.getAttribute("identify-content-set")){return}iframe.setAttribute("identify-content-set",true);iframe.contentWindow.document.open();iframe.contentWindow.document.write(html);iframe.contentWindow.document.close()});_defineProperty(_this,"pollIframe",function(iframe,html){if(iframe&&!iframe.getAttribute("identify-content-set")){var interval=setInterval(function(){if(iframe.getAttribute("identify-content-set")){return clearInterval(interval)}if(iframe.contentWindow&&iframe.contentWindow.document){iframe.setAttribute("identify-content-set",true);iframe.contentWindow.document.open();iframe.contentWindow.document.write(html);iframe.contentWindow.document.close();clearInterval(interval)}return true},500)}});_defineProperty(_this,"collectFeatureReportTemplates",function(entry){var reports={};if(entry.sublayers){var _iterator=_createForOfIteratorHelper(entry.sublayers),_step;try{for(_iterator.s();!(_step=_iterator.n()).done;){var sublayer=_step.value;reports=_objectSpread(_objectSpread({},reports),_this.collectFeatureReportTemplates(sublayer))}}catch(err){_iterator.e(err)}finally{_iterator.f()}}else if(entry.featureReport){reports[entry.name]=entry.featureReport}return reports});_defineProperty(_this,"findFeatureReportTemplate",function(layer){var reports={};_this.props.layers.filter(function(l){return l.role===LayerRole.THEME}).forEach(function(themeLayer){reports=_objectSpread(_objectSpread({},reports),_this.collectFeatureReportTemplates(themeLayer))});return reports[layer]||null});_defineProperty(_this,"getFeatureReportUrl",function(report,result){var serviceUrl=ConfigUtils.getConfigProp("documentServiceUrl").replace(/\/$/,"");var params={feature:result.id,x:result.clickPos[0],y:result.clickPos[1],crs:_this.props.map.projection,single_report:report.single_report||false};var path="/"+report.template+"."+(report.format||"pdf");var query=Object.keys(params).map(function(key){return encodeURIComponent(key)+"="+encodeURIComponent(params[key])}).join("&");return serviceUrl+path+"?"+query});_defineProperty(_this,"downloadAggregatedReport",function(){var _this$state$selectedA=_this.state.selectedAggregatedReport.split("::"),_this$state$selectedA2=_slicedToArray(_this$state$selectedA,2),layername=_this$state$selectedA2[0],idx=_this$state$selectedA2[1];var report=_this.state.reports[layername][idx];var results=_this.state.resultTree[layername];var serviceUrl=ConfigUtils.getConfigProp("documentServiceUrl").replace(/\/$/,"");var params={feature:results.map(function(result){return result.id}).join(","),x:results[0].clickPos[0],y:results[0].clickPos[1],crs:_this.props.map.projection,single_report:report.single_report||false};_this.setState({generatingReport:true});var url=serviceUrl+"/"+report.template;axios.get(url,{params:params,responseType:"arraybuffer"}).then(function(response){var filename=(report.filename||report.title.replace(" ","_"))+"."+(report.format||"pdf");FileSaver.saveAs(new Blob([response.data],{type:"application/pdf"}),filename);_this.setState({generatingReport:false})})["catch"](function(){/* eslint-disable-next-line */alert(LocaleUtils.tr("identify.reportfail"));_this.setState({generatingReport:false})})});_defineProperty(_this,"showLayerInfo",function(layer){var _layer$split=layer.split("#"),_layer$split2=_slicedToArray(_layer$split,2),layerUrl=_layer$split2[0],layerName=_layer$split2[1];var match=LayerUtils.searchLayer(_this.props.layers,layerUrl,layerName);if(match){_this.props.setActiveLayerInfo(match.layer,match.sublayer)}});_defineProperty(_this,"attribValue",function(text,attrName,layer,result){if(_typeof(text)==="object"){text=JSON.stringify(text)}if(_this.props.replaceImageUrls&&/^https?:\/\/.*\.(jpg|jpeg|png|bmp)$/i.exec(text)){return/*#__PURE__*/React.createElement("a",{href:text,rel:"noreferrer",target:"_blank"},/*#__PURE__*/React.createElement("img",{src:text}))}text=""+text;// Ensure text is a string
|
|
11
11
|
text=_this.props.attributeTransform(attrName,text,layer,result);text=MiscUtils.addLinkAnchors(text);return _this.parsedContent(text)});_defineProperty(_this,"parsedContent",function(text){text=text.replace(" ","<br />");var options={replace:function replace(node){if(node.name==="a"){return/*#__PURE__*/React.createElement("a",{href:node.attribs.href,onClick:node.attribs.onclick?function(ev){return _this.evalOnClick(ev,node.attribs.onclick)}:_this.attributeLinkClicked,target:node.attribs.target||"_blank"},domToReact(node.children,options))}return undefined}};return htmlReactParser(text,options)});_defineProperty(_this,"evalOnClick",function(ev,onclick){// eslint-disable-next-line
|
|
12
12
|
eval(onclick);ev.preventDefault()});_defineProperty(_this,"attributeLinkClicked",function(ev){_this.props.openExternalUrl(ev.target.href,ev.target.target,{docked:_this.props.iframeDialogsInitiallyDocked});ev.preventDefault()});_defineProperty(_this,"zoomToResult",function(result){var zoom=0;var maxZoom=MapUtils.computeZoom(_this.props.map.scales,_this.props.theme.minSearchScaleDenom||1000);if(result.bbox[0]!==result.bbox[2]&&result.bbox[1]!==result.bbox[3]){zoom=Math.max(0,MapUtils.getZoomForExtent(result.bbox,_this.props.map.resolutions,_this.props.map.size,0,maxZoom+1)-1)}else{zoom=maxZoom}var x=0.5*(result.bbox[0]+result.bbox[2]);var y=0.5*(result.bbox[1]+result.bbox[3]);_this.props.zoomToPoint([x,y],zoom,_this.props.map.projection);var path=[];var sublayer=null;var layer=_this.props.layers.find(function(l){return l.role===LayerRole.THEME&&(sublayer=LayerUtils.searchSubLayer(l,"name",result.layername,path))});if(layer&&sublayer){_this.props.changeLayerProperty(layer.id,"visibility",true,path)}});_this.currentResultElRef=null;_this.scrollIntoView=false;_this.state.exportFormat=!Array.isArray(props.enableExport)||props.enableExport.includes("geojson")?"geojson":props.enableExport[0];return _this}_inherits(IdentifyViewer,_React$Component);return _createClass(IdentifyViewer,[{key:"componentDidMount",value:function componentDidMount(){this.updateResultTree()}},{key:"componentDidUpdate",value:function componentDidUpdate(prevProps,prevState){if(this.props.identifyResults!==prevProps.identifyResults){this.updateResultTree()}if(prevState.currentResult!==this.state.currentResult||prevState.resultTree!==this.state.resultTree){this.setHighlightedResults(this.state.currentResult===null?null:[this.state.currentResult],this.state.resultTree)}// Scroll to selected result
|
|
13
13
|
if(this.state.currentResult&&this.state.currentResult!==prevState.currentResult&&this.currentResultElRef&&this.scrollIntoView){this.currentResultElRef.parentNode.scrollTop=this.currentResultElRef.offsetTop-this.currentResultElRef.parentNode.offsetTop;this.scrollIntoView=false;this.currentResultElRef=null}}},{key:"componentWillUnmount",value:function componentWillUnmount(){this.props.removeLayer("__identifyviewerhighlight")}},{key:"render",value:function render(){var _this2=this,_exporters$find;var tree=this.props.displayResultTree;var body=null;if(tree){var contents=Object.keys(this.state.resultTree).map(function(layer){return _this2.renderLayer(layer)});var attributes=this.renderResultAttributes(this.state.currentLayer,this.state.currentResult,"identify-result-tree-frame");var resultsContainerStyle={maxHeight:attributes?"10em":"initial"};body=[/*#__PURE__*/React.createElement("div",{className:"identify-results-container",key:"results-container",style:resultsContainerStyle},contents),attributes]}else{body=/*#__PURE__*/React.createElement("div",{className:"identify-flat-results-list"},this.props.showLayerSelector?/*#__PURE__*/React.createElement("div",{className:"identify-selectbox"},/*#__PURE__*/React.createElement("select",{className:"identify-layer-select",onChange:function onChange(e){var selectedLayer=e.target.value;_this2.setState({selectedLayer:selectedLayer})}},/*#__PURE__*/React.createElement("option",{value:""},LocaleUtils.tr("identify.layerall")),Object.keys(this.state.resultTree).filter(function(key){return _this2.state.resultTree[key].length}).map(function(layer){return/*#__PURE__*/React.createElement("option",{key:layer,value:layer},_this2.state.resultTree[layer][0].layertitle)})),/*#__PURE__*/React.createElement("span",{className:"identify-buttonbox-spacer"}),/*#__PURE__*/React.createElement("span",null,LocaleUtils.tr("identify.featurecount"),": ",Object.values(this.state.selectedLayer!==""?this.state.resultTree[this.state.selectedLayer]:this.state.resultTree).flat().length)):null,Object.keys(this.state.selectedLayer!==""?_defineProperty({},this.state.selectedLayer,this.state.resultTree[this.state.selectedLayer]):this.state.resultTree).map(function(layer){var layerResults=_this2.state.resultTree[layer];return layerResults.map(function(result){var resultClass=_this2.state.currentResult===result?"identify-result-frame-highlighted":"identify-result-frame-normal";return/*#__PURE__*/React.createElement("div",{key:result.id,onMouseEnter:function onMouseEnter(){return _this2.setState({currentResult:result,currentLayer:layer})},onMouseLeave:function onMouseLeave(){return _this2.setState({currentResult:null,currentLayer:null})}},_this2.renderResultAttributes(layer,result,resultClass))})}))}// "el.style.background='inherit'": HACK to trigger an additional repaint, since Safari/Chrome on iOS render the element cut off the first time
|
|
14
|
-
var exporters=this.getExporters();var clipboardExportDisabled=((_exporters$find=exporters.find(function(entry){return entry.id===_this2.state.exportFormat}))===null||_exporters$find===void 0?void 0:_exporters$find.allowClipboard)!==true;return/*#__PURE__*/React.createElement("div",{className:"identify-body",ref:function ref(el){if(el)el.style.background="inherit"}},body,this.props.enableExport===true||!isEmpty(this.props.enableExport)?/*#__PURE__*/React.createElement("div",{className:"identify-buttonbox"},/*#__PURE__*/React.createElement("span",{className:"identify-buttonbox-spacer"}),/*#__PURE__*/React.createElement("span",null,LocaleUtils.tr("identify.export"),":\xA0"),/*#__PURE__*/React.createElement("div",{className:"controlgroup"},/*#__PURE__*/React.createElement("select",{className:"combo identify-export-format",onChange:function onChange(ev){return _this2.setState({exportFormat:ev.target.value})},value:this.state.exportFormat},exporters.filter(function(entry){return!Array.isArray(_this2.props.enableExport)||_this2.props.enableExport.includes(entry.id)}).map(function(entry){var _entry$title;return/*#__PURE__*/React.createElement("option",{key:entry.id,value:entry.id},(_entry$title=entry.title)!==null&&_entry$title!==void 0?_entry$title:LocaleUtils.tr(entry.titleMsgId))})),/*#__PURE__*/React.createElement("button",{className:"button",onClick:function onClick(){return _this2.exportResults()},title:LocaleUtils.tr("identify.download")},/*#__PURE__*/React.createElement(Icon,{icon:"export"})),/*#__PURE__*/React.createElement("button",{className:"button",disabled:clipboardExportDisabled,onClick:function onClick(){return _this2.exportResults(true)},title:LocaleUtils.tr("identify.clipboard")},/*#__PURE__*/React.createElement(Icon,{icon:"copy"})))):null,this.props.enableAggregatedReports&&Object.keys(this.state.reports).length>0?/*#__PURE__*/React.createElement("div",{className:"identify-buttonbox"},/*#__PURE__*/React.createElement("span",{className:"identify-buttonbox-spacer"}),/*#__PURE__*/React.createElement("span",null,LocaleUtils.tr("identify.aggregatedreport"),":\xA0"),/*#__PURE__*/React.createElement("div",{className:"controlgroup"},/*#__PURE__*/React.createElement("select",{className:"combo identify-export-format",onChange:function onChange(ev){return _this2.setState({selectedAggregatedReport:ev.target.value})},value:this.state.selectedAggregatedReport},/*#__PURE__*/React.createElement("option",{disabled:true,value:""},LocaleUtils.tr("identify.selectreport")),Object.entries(this.state.reports).map(function(
|
|
14
|
+
var exporters=this.getExporters();var clipboardExportDisabled=((_exporters$find=exporters.find(function(entry){return entry.id===_this2.state.exportFormat}))===null||_exporters$find===void 0?void 0:_exporters$find.allowClipboard)!==true;return/*#__PURE__*/React.createElement("div",{className:"identify-body",ref:function ref(el){if(el)el.style.background="inherit"}},body,this.props.enableExport===true||!isEmpty(this.props.enableExport)?/*#__PURE__*/React.createElement("div",{className:"identify-buttonbox"},/*#__PURE__*/React.createElement("span",{className:"identify-buttonbox-spacer"}),/*#__PURE__*/React.createElement("span",null,LocaleUtils.tr("identify.export"),":\xA0"),/*#__PURE__*/React.createElement("div",{className:"controlgroup"},/*#__PURE__*/React.createElement("select",{className:"combo identify-export-format",onChange:function onChange(ev){return _this2.setState({exportFormat:ev.target.value})},value:this.state.exportFormat},exporters.filter(function(entry){return!Array.isArray(_this2.props.enableExport)||_this2.props.enableExport.includes(entry.id)}).map(function(entry){var _entry$title;return/*#__PURE__*/React.createElement("option",{key:entry.id,value:entry.id},(_entry$title=entry.title)!==null&&_entry$title!==void 0?_entry$title:LocaleUtils.tr(entry.titleMsgId))})),/*#__PURE__*/React.createElement("button",{className:"button",onClick:function onClick(){return _this2.exportResults()},title:LocaleUtils.tr("identify.download")},/*#__PURE__*/React.createElement(Icon,{icon:"export"})),/*#__PURE__*/React.createElement("button",{className:"button",disabled:clipboardExportDisabled,onClick:function onClick(){return _this2.exportResults(true)},title:LocaleUtils.tr("identify.clipboard")},/*#__PURE__*/React.createElement(Icon,{icon:"copy"})))):null,this.props.enableAggregatedReports&&Object.keys(this.state.reports).length>0?/*#__PURE__*/React.createElement("div",{className:"identify-buttonbox"},/*#__PURE__*/React.createElement("span",{className:"identify-buttonbox-spacer"}),/*#__PURE__*/React.createElement("span",null,LocaleUtils.tr("identify.aggregatedreport"),":\xA0"),/*#__PURE__*/React.createElement("div",{className:"controlgroup"},/*#__PURE__*/React.createElement("select",{className:"combo identify-export-format",onChange:function onChange(ev){return _this2.setState({selectedAggregatedReport:ev.target.value})},value:this.state.selectedAggregatedReport},/*#__PURE__*/React.createElement("option",{disabled:true,value:""},LocaleUtils.tr("identify.selectreport")),Object.entries(this.state.reports).map(function(_ref18){var _ref19=_slicedToArray(_ref18,2),layername=_ref19[0],reports=_ref19[1];return reports.map(function(report,idx){return/*#__PURE__*/React.createElement("option",{key:layername+"::"+idx,value:layername+"::"+idx},report.title)})})),/*#__PURE__*/React.createElement("button",{className:"button",disabled:!this.state.selectedAggregatedReport||this.state.generatingReport,onClick:this.downloadAggregatedReport},this.state.generatingReport?/*#__PURE__*/React.createElement(Spinner,null):/*#__PURE__*/React.createElement(Icon,{icon:"report"})))):null)}}])}(React.Component);_defineProperty(IdentifyViewer,"propTypes",{addLayerFeatures:PropTypes.func,attributeCalculator:PropTypes.func,attributeTransform:PropTypes.func,changeLayerProperty:PropTypes.func,collapsible:PropTypes.bool,customExporters:PropTypes.array,displayResultTree:PropTypes.bool,enableAggregatedReports:PropTypes.bool,enableExport:PropTypes.oneOfType([PropTypes.bool,PropTypes.array]),exportGeometry:PropTypes.bool,highlightAllResults:PropTypes.bool,identifyResults:PropTypes.object,iframeDialogsInitiallyDocked:PropTypes.bool,layers:PropTypes.array,longAttributesDisplay:PropTypes.oneOf(["ellipsis","wrap"]),map:PropTypes.object,openExternalUrl:PropTypes.func,removeLayer:PropTypes.func,replaceImageUrls:PropTypes.bool,setActiveLayerInfo:PropTypes.func,showLayerSelector:PropTypes.bool,showLayerTitles:PropTypes.bool,theme:PropTypes.object,zoomToPoint:PropTypes.func});_defineProperty(IdentifyViewer,"defaultProps",{longAttributesDisplay:"ellipsis",customExporters:[],displayResultTree:true,attributeCalculator:function attributeCalculator(/* layer, feature */){return[]},attributeTransform:function attributeTransform(name,value/* , layer, feature */){return value},enableAggregatedReports:true,showLayerTitles:true,showLayerSelector:true,highlightAllResults:true});var selector=function selector(state){return{theme:state.theme.current,layers:state.layers.flat,map:state.map}};export default connect(selector,{addLayerFeatures:addLayerFeatures,changeLayerProperty:changeLayerProperty,removeLayer:removeLayer,setActiveLayerInfo:setActiveLayerInfo,openExternalUrl:openExternalUrl,zoomToPoint:zoomToPoint})(IdentifyViewer);
|
|
@@ -4,4 +4,4 @@ function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof
|
|
|
4
4
|
*
|
|
5
5
|
* This source code is licensed under the BSD-style license found in the
|
|
6
6
|
* LICENSE file in the root directory of this source tree.
|
|
7
|
-
*/import React from"react";import{connect}from"react-redux";import isEmpty from"lodash.isempty";import PropTypes from"prop-types";import{
|
|
7
|
+
*/import React from"react";import{connect}from"react-redux";import isEmpty from"lodash.isempty";import PropTypes from"prop-types";import{v4 as uuidv4}from"uuid";import{LayerRole,addLayerFeatures,clearLayer}from"../actions/layers";import IdentifyUtils from"../utils/IdentifyUtils";import LocaleUtils from"../utils/LocaleUtils";import MapUtils from"../utils/MapUtils";import VectorLayerUtils from"../utils/VectorLayerUtils";import MapSelection from"./MapSelection";import PopupMenu from"./widgets/PopupMenu";import Spinner from"./widgets/Spinner";import"./style/PickFeature.css";var PickFeature=/*#__PURE__*/function(_React$Component){function PickFeature(props){var _this;_classCallCheck(this,PickFeature);_this=_callSuper(this,PickFeature,[props]);_defineProperty(_this,"handleIdentifyResponse",function(response,reqId,layer,infoFormat){if(_this.state.reqId!==reqId){return}var result=IdentifyUtils.parseResponse(response,layer,infoFormat,_this.state.clickPos,_this.props.map.projection,false);if(_this.props.featureFilter){Object.entries(result).forEach(function(_ref){var _ref2=_slicedToArray(_ref,2),layername=_ref2[0],features=_ref2[1];result[layername]=features.filter(_this.props.featureFilter)})}else{Object.entries(result).forEach(function(_ref3){var _ref4=_slicedToArray(_ref3,2),layername=_ref4[0],features=_ref4[1];result[layername]=features.filter(function(feature){return!!feature.geometry})})}_this.setState(function(state){var newState={pickResults:_objectSpread(_objectSpread({},state.pickResults),result),pendingQueries:state.pendingQueries-1};if(newState.pendingQueries===0){var entries=Object.entries(newState.pickResults);if(entries.length===1&&entries[0][1].length===1){_this.props.featurePicked(entries[0][0],entries[0][1][0]);newState.pickResults=null;newState.pickGeom=null}else if(entries.reduce(function(sum,entry){return sum+entry[1].length},0)===0){newState.pickResults=null;newState.pickGeom=null}}return newState})});_defineProperty(_this,"highlightFeature",function(key,feature){var layer={id:"pick-feature-selection",role:LayerRole.SELECTION};_this.props.addLayerFeatures(layer,[feature],true);_this.setState({highlightedFeature:key+":"+feature.id})});_defineProperty(_this,"clearHighlight",function(key,feature){if(_this.state.highlightedFeature===key+":"+feature.id){_this.setState({highlightFeature:null});_this.props.clearLayer("pick-feature-selection")}});_defineProperty(_this,"onClose",function(){_this.setState(PickFeature.defaultState);_this.props.clearLayer("pick-feature-selection")});_this.state=PickFeature.defaultState;return _this}_inherits(PickFeature,_React$Component);return _createClass(PickFeature,[{key:"componentDidUpdate",value:function componentDidUpdate(prevProps,prevState){var _this2=this;if(this.state.pickGeom&&this.state.pickGeom!==prevState.pickGeom){var queryLayers=[];if(this.props.layerFilter){queryLayers=[this.props.layers.find(function(l){return l.url===_this2.props.layerFilter.url})].filter(Boolean)}else{queryLayers=IdentifyUtils.getQueryLayers(this.props.layers,this.props.map)}if(!isEmpty(queryLayers)){this.setState(function(state){var getPixelFromCoordinate=MapUtils.getHook(MapUtils.GET_PIXEL_FROM_COORDINATES_HOOK);var coordinates=_this2.props.pickGeomType==="Point"?[[state.pickGeom.coordinates]]:state.pickGeom.coordinates;var maxX=coordinates[0][0][0];var maxY=coordinates[0][0][1];for(var i=1;i<coordinates[0].length;++i){if(coordinates[0][i][0]>maxX){maxX=coordinates[0][i][0];maxY=coordinates[0][i][1]}}var clickPos=getPixelFromCoordinate([maxX,maxY],false);var reqId=uuidv4();queryLayers.forEach(function(layer){var request=null;if(_this2.props.pickGeomType==="Point"){var _this2$props$layerFil;request=IdentifyUtils.buildRequest(layer,((_this2$props$layerFil=_this2.props.layerFilter)===null||_this2$props$layerFil===void 0?void 0:_this2$props$layerFil.name)||layer.queryLayers.join(","),state.pickGeom.coordinates,_this2.props.map)}else if(_this2.props.pickGeomType==="Polygon"){var _this2$props$layerFil2;var filter=VectorLayerUtils.geoJSONGeomToWkt(_this2.state.pickGeom);request=IdentifyUtils.buildFilterRequest(layer,((_this2$props$layerFil2=_this2.props.layerFilter)===null||_this2$props$layerFil2===void 0?void 0:_this2$props$layerFil2.name)||layer.queryLayers.join(","),filter,_this2.props.map)}else{return}IdentifyUtils.sendRequest(request,function(response){return _this2.handleIdentifyResponse(response,reqId,layer,request.params.info_format)})});return{pickResults:{},clickPos:clickPos,pendingQueries:queryLayers.length,reqId:reqId}})}}}},{key:"render",value:function render(){var _this3=this;var resultsMenu=null;if(this.state.pickResults){resultsMenu=/*#__PURE__*/React.createElement(PopupMenu,{className:"PickFeatureMenu",key:"PickResultMenu",onClose:this.onClose,x:this.state.clickPos[0],y:this.state.clickPos[1]},this.state.pendingQueries===0?Object.entries(this.state.pickResults).map(function(_ref5){var _ref6=_slicedToArray(_ref5,2),layername=_ref6[0],features=_ref6[1];return features.map(function(feature){return/*#__PURE__*/React.createElement("div",{key:layername+":"+feature.id,onClickCapture:function onClickCapture(){return _this3.props.featurePicked(layername,feature)},onMouseOut:function onMouseOut(){return _this3.clearHighlight(layername,feature)},onMouseOver:function onMouseOver(){return _this3.highlightFeature(layername,feature)}},layername+": "+feature.displayname)})}):/*#__PURE__*/React.createElement("div",{className:"pick-feature-menu-querying"},/*#__PURE__*/React.createElement(Spinner,null),LocaleUtils.tr("pickfeature.querying")))}return[resultsMenu,/*#__PURE__*/React.createElement(MapSelection,{active:true,geomType:this.props.pickGeomType,geometry:this.state.pickGeom,geometryChanged:function geometryChanged(geom){return _this3.setState({pickGeom:geom})},key:"MapSelection",styleOptions:this.props.highlightStyle})]}}])}(React.Component);_defineProperty(PickFeature,"propTypes",{addLayerFeatures:PropTypes.func,clearLayer:PropTypes.func,/** Optional: Function which accepts a GeoJSON feature and returns whether it should be accepted (true) or discarded (false) */featureFilter:PropTypes.func,featurePicked:PropTypes.func,/** The style used for highlighting filter geometries. */highlightStyle:PropTypes.shape({/* Stroke color rgba array, i.e. [255, 0, 0, 0.5] */strokeColor:PropTypes.array,/* Stroke width */strokeWidth:PropTypes.number,/* Stroke dash/gap pattern array. Empty for solid line. */strokeDash:PropTypes.array,/* Fill color rgba array, i.e. [255, 0, 0, 0.33] */fillColor:PropTypes.array}),/** Optional: Restrict pick to specified layer name */layerFilter:PropTypes.shape({url:PropTypes.string,name:PropTypes.string}),layers:PropTypes.array,map:PropTypes.object,/** Pick geometry type: Point, Polygon, ... (default: Point) */pickGeomType:PropTypes.string});_defineProperty(PickFeature,"defaultProps",{pickGeomType:"Point",highlightStyle:{strokeColor:[0,0,0],fillColor:[255,255,0,0.25]}});_defineProperty(PickFeature,"defaultState",{pickGeom:null,pickResults:null,clickPos:null,highlightedFeature:null,pendingQueries:0,reqId:null});export default connect(function(state){return{layers:state.layers.flat,map:state.map}},{addLayerFeatures:addLayerFeatures,clearLayer:clearLayer})(PickFeature);
|
|
@@ -4,7 +4,7 @@ function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof
|
|
|
4
4
|
*
|
|
5
5
|
* This source code is licensed under the BSD-style license found in the
|
|
6
6
|
* LICENSE file in the root directory of this source tree.
|
|
7
|
-
*/import React from"react";import{connect}from"react-redux";import axios from"axios";import{XMLParser}from"fast-xml-parser";import isEmpty from"lodash.isempty";import PropTypes from"prop-types";import{
|
|
7
|
+
*/import React from"react";import{connect}from"react-redux";import axios from"axios";import{XMLParser}from"fast-xml-parser";import isEmpty from"lodash.isempty";import PropTypes from"prop-types";import{v4 as uuidv4}from"uuid";import ConfigUtils from"../utils/ConfigUtils";import{parseExpression,FeatureCache,KeyValCache}from"../utils/EditingUtils";import LocaleUtils from"../utils/LocaleUtils";import MiscUtils from"../utils/MiscUtils";import EditComboField from"./EditComboField";import EditUploadField from"./EditUploadField";import Icon from"./Icon";import ButtonBar from"./widgets/ButtonBar";import DateTimeInput from"./widgets/DateTimeInput";import NumberInput from"./widgets/NumberInput";import Spinner from"./widgets/Spinner";import TextInput from"./widgets/TextInput";import"./style/QtDesignerForm.css";var FormPreprocessors={};/* editDataset: <mapname>.<layername>
|
|
8
8
|
preprocessor: function(formData, feature, callback)
|
|
9
9
|
formData: {
|
|
10
10
|
fields: { dict of fields },
|
|
@@ -24,7 +24,7 @@ if(_parts.length===3||_parts.length===4){var _feature$properties4;var layer=_par
|
|
|
24
24
|
var reldataset=_this.props.mapPrefix+reltable;var displayField=attrname.split("__")[1];if(feature.__status__!=="empty"){var featurebuttons=[{key:"Edit",icon:"editing",label:String(value!==null&&value!==void 0?value:"")}];return/*#__PURE__*/React.createElement("div",{className:"qt-designer-form-featurelink-buttons"},/*#__PURE__*/React.createElement(ButtonBar,{buttons:featurebuttons,forceLabel:true,onClick:function onClick(){return _this.props.editRelationRecord("Edit",reltable,reldataset,index,displayField)}}))}else{var _featurebuttons=[];if(feature.geometry!==null){_featurebuttons.push({key:"Pick",icon:"pick",label:LocaleUtils.tr("editing.pick")})}_featurebuttons.push({key:"Create",icon:"editdraw",label:LocaleUtils.tr("editing.create")});return/*#__PURE__*/React.createElement(ButtonBar,{buttons:_featurebuttons,forceLabel:true,onClick:function onClick(action){return _this.props.editRelationRecord(action,reltable,reldataset,index,displayField)}})}}else{if(value!==null){var _featurebuttons2=[{key:"Edit",icon:"editing",label:String(value!==null&&value!==void 0?value:"")}];return/*#__PURE__*/React.createElement("div",{className:"qt-designer-form-featurelink-buttons"},/*#__PURE__*/React.createElement(ButtonBar,{buttons:_featurebuttons2,onClick:function onClick(){return _this.props.switchEditContext("Edit",layer,value,function(v){return updateField(attrname,v)},attrname)}}),/*#__PURE__*/React.createElement("button",{className:"button",onClick:function onClick(){return updateField(attrname,null)},type:"button"},/*#__PURE__*/React.createElement(Icon,{icon:"clear"})))}else{var _featurebuttons3=[{key:"Pick",icon:"pick",label:LocaleUtils.tr("editing.pick")},{key:"Create",icon:"editdraw",label:LocaleUtils.tr("editing.create")}];return/*#__PURE__*/React.createElement(ButtonBar,{buttons:_featurebuttons3,onClick:function onClick(action){return _this.props.switchEditContext(action,layer,null,function(v){return updateField(attrname,v)},attrname)}})}}}}}else if(widget["class"]==="QStackedWidget"){return _this.renderLayout(widget.widget[parseInt(widget.property.currentIndex,10)].layout,feature,editConfig,updateField,nametransform)}return null});_defineProperty(_this,"renderNRelation",function(widget){var _widget$property2,_editConfig$fields,_this$props$feature$r;var parts=widget.name.split("__");if(parts.length<3){return null}var disabled=String((_widget$property2=widget.property)===null||_widget$property2===void 0?void 0:_widget$property2.enabled)==="false";var tablename=parts[1];var sortcol=parts[3]||null;var noreorder=parts[4]||false;var headerItems=widget.layout.item.filter(function(item){return item.widget&&item.widget.name.startsWith("header__")}).sort(function(a,b){return a.column-b.column});var widgetItems=widget.layout.item.filter(function(item){return!item.widget||!item.widget.name.startsWith("header__")}).sort(function(a,b){return a.column-b.column});var tableFitWidgets=["QLabel","QCheckBox","QRadioButton","QDateTimeEdit","QDateEdit","QTimeEdit"];var columnStyles=widgetItems.map(function(item){return item.widget&&tableFitWidgets.includes(item.widget["class"])?{width:"1px"}:{}});var editConfig=_this.props.editConfigs[tablename];if(!editConfig){// Relation dataset not permitted / no edit config available
|
|
25
25
|
return null}var relDataset=editConfig.editDataset;var fields=((_editConfig$fields=editConfig.fields)!==null&&_editConfig$fields!==void 0?_editConfig$fields:[]).reduce(function(res,field){return _objectSpread(_objectSpread({},res),{},_defineProperty({},field.id,field))},{});return/*#__PURE__*/React.createElement("div",{className:"qt-designer-widget-relation"},/*#__PURE__*/React.createElement("div",{className:"qt-designer-widget-relation-table-container"},!_this.props.feature.relationValues?/*#__PURE__*/React.createElement("div",{className:"qt-designer-widget-relation-table-loading"},/*#__PURE__*/React.createElement(Spinner,null)):null,/*#__PURE__*/React.createElement("table",null,/*#__PURE__*/React.createElement("tbody",null,!isEmpty(headerItems)?/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("th",null),headerItems.map(function(item){return/*#__PURE__*/React.createElement("th",{key:item.widget.name},item.widget.property.text)}),/*#__PURE__*/React.createElement("th",null)):null,(((_this$props$feature$r=_this.props.feature.relationValues)===null||_this$props$feature$r===void 0||(_this$props$feature$r=_this$props$feature$r[relDataset])===null||_this$props$feature$r===void 0?void 0:_this$props$feature$r.features)||[]).map(function(feature,idx){var updateField=function updateField(name,value){var fieldname=name.slice(tablename.length+2);// Strip <tablename>__ prefix
|
|
26
26
|
_this.props.updateRelationField(relDataset,idx,fieldname,value)};var nametransform=function nametransform(name){return name+"__"+idx};var status=feature.__status__||"";var relFeature=_objectSpread(_objectSpread({},feature),{},{properties:Object.entries(feature.properties).reduce(function(res,_ref2){var _ref3=_slicedToArray(_ref2,2),key=_ref3[0],value=_ref3[1];return _objectSpread(_objectSpread({},res),{},_defineProperty({},tablename+"__"+key,value))},{})});var statusIcon=null;if(status==="empty"){// Pass
|
|
27
|
-
}else if(status==="new"){statusIcon="new"}else if(status){statusIcon="edited"}var statusText="";if(feature.error){statusIcon="warning";statusText=_this.buildErrMsg(feature)}var extraClass=status.startsWith("deleted")?"qt-designer-widget-relation-record-deleted":"";return/*#__PURE__*/React.createElement("tr",{className:"qt-designer-widget-relation-record "+extraClass,key:relDataset+idx},/*#__PURE__*/React.createElement("td",{className:"qt-designer-widget-relation-record-icon"},statusIcon?/*#__PURE__*/React.createElement(Icon,{icon:statusIcon,title:statusText}):null),widgetItems.map(function(item,widx){if(item.widget){return/*#__PURE__*/React.createElement("td",{className:"qt-designer-widget-relation-row-widget",key:item.widget.name,style:columnStyles[widx]},_this.renderWidget(item.widget,relFeature,editConfig,fields,updateField,nametransform,true,disabled))}else if(item.spacer){return/*#__PURE__*/React.createElement("td",{key:"spacer_"+widx})}else{return null}}),!_this.props.readOnly&&!disabled&&sortcol&&!noreorder?/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement(Icon,{icon:"chevron-up",onClick:function onClick(){return _this.props.reorderRelationRecord(relDataset,idx,-1)}}),/*#__PURE__*/React.createElement("br",null),/*#__PURE__*/React.createElement(Icon,{icon:"chevron-down",onClick:function onClick(){return _this.props.reorderRelationRecord(relDataset,idx,1)}})):null,!_this.props.readOnly&&!disabled?/*#__PURE__*/React.createElement("td",{className:"qt-designer-widget-relation-record-icon"},/*#__PURE__*/React.createElement(Icon,{icon:"trash",onClick:function onClick(){return _this.props.removeRelationRecord(relDataset,idx)}})):null)})))),!_this.props.readOnly?/*#__PURE__*/React.createElement("div",{className:"qt-designer-widget-relation-buttons"},/*#__PURE__*/React.createElement("button",{className:"button qt-designer-widget-relation-add",disabled:!_this.props.feature.relationValues,onClick:function onClick(ev){return _this.addRelationRecord(ev,relDataset)},type:"button"},LocaleUtils.tr("editing.add"))):null,/*#__PURE__*/React.createElement("div",{className:"qt-designer-widget-relation-resize-handle",onPointerDown:_this.startRelationTableResize}))});_defineProperty(_this,"addRelationRecord",function(ev,datasetname){_this.setState({relationAddPressed:ev.target});_this.props.addRelationRecord(datasetname)});_defineProperty(_this,"startRelationTableResize",function(ev){var container=ev.target.parentElement.parentElement;if(!container){return}var startHeight=container.offsetHeight;var startMouseY=ev.clientY;var resizeInput=function resizeInput(event){container.style.height=Math.max(30,startHeight+(event.clientY-startMouseY))+"px"};ev.view.document.body.style.userSelect="none";ev.view.addEventListener("pointermove",resizeInput);ev.view.addEventListener("pointerup",function(){ev.view.document.body.style.userSelect="";ev.view.removeEventListener("pointermove",resizeInput)},{once:true})});_defineProperty(_this,"groupOrName",function(widget){return widget.attribute&&widget.attribute.buttonGroup?widget.attribute.buttonGroup._:widget.name});_defineProperty(_this,"dateConstraint",function(constr){return constr.year+"-"+("0"+constr.month).slice(-2)+"-"+("0"+constr.day).slice(-2)});_defineProperty(_this,"parseForm",function(data){var loadingReqId=
|
|
27
|
+
}else if(status==="new"){statusIcon="new"}else if(status){statusIcon="edited"}var statusText="";if(feature.error){statusIcon="warning";statusText=_this.buildErrMsg(feature)}var extraClass=status.startsWith("deleted")?"qt-designer-widget-relation-record-deleted":"";return/*#__PURE__*/React.createElement("tr",{className:"qt-designer-widget-relation-record "+extraClass,key:relDataset+idx},/*#__PURE__*/React.createElement("td",{className:"qt-designer-widget-relation-record-icon"},statusIcon?/*#__PURE__*/React.createElement(Icon,{icon:statusIcon,title:statusText}):null),widgetItems.map(function(item,widx){if(item.widget){return/*#__PURE__*/React.createElement("td",{className:"qt-designer-widget-relation-row-widget",key:item.widget.name,style:columnStyles[widx]},_this.renderWidget(item.widget,relFeature,editConfig,fields,updateField,nametransform,true,disabled))}else if(item.spacer){return/*#__PURE__*/React.createElement("td",{key:"spacer_"+widx})}else{return null}}),!_this.props.readOnly&&!disabled&&sortcol&&!noreorder?/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement(Icon,{icon:"chevron-up",onClick:function onClick(){return _this.props.reorderRelationRecord(relDataset,idx,-1)}}),/*#__PURE__*/React.createElement("br",null),/*#__PURE__*/React.createElement(Icon,{icon:"chevron-down",onClick:function onClick(){return _this.props.reorderRelationRecord(relDataset,idx,1)}})):null,!_this.props.readOnly&&!disabled?/*#__PURE__*/React.createElement("td",{className:"qt-designer-widget-relation-record-icon"},/*#__PURE__*/React.createElement(Icon,{icon:"trash",onClick:function onClick(){return _this.props.removeRelationRecord(relDataset,idx)}})):null)})))),!_this.props.readOnly?/*#__PURE__*/React.createElement("div",{className:"qt-designer-widget-relation-buttons"},/*#__PURE__*/React.createElement("button",{className:"button qt-designer-widget-relation-add",disabled:!_this.props.feature.relationValues,onClick:function onClick(ev){return _this.addRelationRecord(ev,relDataset)},type:"button"},LocaleUtils.tr("editing.add"))):null,/*#__PURE__*/React.createElement("div",{className:"qt-designer-widget-relation-resize-handle",onPointerDown:_this.startRelationTableResize}))});_defineProperty(_this,"addRelationRecord",function(ev,datasetname){_this.setState({relationAddPressed:ev.target});_this.props.addRelationRecord(datasetname)});_defineProperty(_this,"startRelationTableResize",function(ev){var container=ev.target.parentElement.parentElement;if(!container){return}var startHeight=container.offsetHeight;var startMouseY=ev.clientY;var resizeInput=function resizeInput(event){container.style.height=Math.max(30,startHeight+(event.clientY-startMouseY))+"px"};ev.view.document.body.style.userSelect="none";ev.view.addEventListener("pointermove",resizeInput);ev.view.addEventListener("pointerup",function(){ev.view.document.body.style.userSelect="";ev.view.removeEventListener("pointermove",resizeInput)},{once:true})});_defineProperty(_this,"groupOrName",function(widget){return widget.attribute&&widget.attribute.buttonGroup?widget.attribute.buttonGroup._:widget.name});_defineProperty(_this,"dateConstraint",function(constr){return constr.year+"-"+("0"+constr.month).slice(-2)+"-"+("0"+constr.day).slice(-2)});_defineProperty(_this,"parseForm",function(data){var loadingReqId=uuidv4();_this.setState({loading:true,loadingReqId:loadingReqId},function(){var parserOpts={isArray:function isArray(){return false},ignoreAttributes:false,attributeNamePrefix:""};var json=new XMLParser(parserOpts).parse(data);var relationTables={};var externalFields={};var widgets={};var fields={};var buttons={};var nrels={};var counters={widget:0,layout:0};_this.reformatWidget(json.ui.widget,relationTables,fields,buttons,nrels,externalFields,widgets,counters);// console.log(json);
|
|
28
28
|
json.externalFields=externalFields;json.widgets=widgets;json.fields=fields;json.buttons=buttons;json.nrels=nrels;if(FormPreprocessors[_this.props.editConfig.editDataset]){FormPreprocessors[_this.props.editConfig.editDataset](json,_this.props.feature,function(formData){if(_this.state.loadingReqId===loadingReqId){_this.setState({formData:formData,loading:false,loadingReqId:null})}})}else{_this.setState({formData:json,loading:false,loadingReqId:null})}_this.props.setRelationTables(relationTables)})});_defineProperty(_this,"reformatWidget",function(widget,relationTables,fields,buttons,nrels,externalFields,widgets,counters){if(widget.property){widget.property=MiscUtils.ensureArray(widget.property).reduce(function(res,prop){return _objectSpread(_objectSpread({},res),{},_defineProperty({},prop.name,prop[Object.keys(prop).find(function(key){return key!=="name"})]))},{})}else{widget.property={}}if(widget.attribute){widget.attribute=MiscUtils.ensureArray(widget.attribute).reduce(function(res,prop){return _objectSpread(_objectSpread({},res),{},_defineProperty({},prop.name,prop[Object.keys(prop).find(function(key){return key!=="name"})]))},{})}else{widget.attribute={}}var verticalFill=false;if(widget.item){MiscUtils.ensureArray(widget.item).forEach(function(item){verticalFill|=_this.reformatWidget(item,relationTables,fields,buttons,nrels,externalFields,widgets,counters)})}widget.name=widget.name||":widget_"+counters.widget++;var fieldNames=_this.props.editConfig.fields.map(function(field){return field.id});if(fieldNames.includes(widget.name)){fields[widget.name]=widget}else if(widget.name.startsWith("kvrel__")||widget.name.startsWith("img__")){var _parts2=widget.name.split("__");if(fieldNames.includes(_parts2[1])){fields[_parts2[1]]=widget}}else if(widget.name.startsWith("btn__")){buttons[widget.name.split("__")[1]]=widget}else if(widget.name.startsWith("nrel__")){nrels[widget.name.split("__")[1]]=widget}if(widget.name.startsWith("ext__")){externalFields[widget.name.slice(5)]=""}widgets[widget.name]=widget;if(widget.layout){verticalFill|=_this.reformatLayout(widget.layout,relationTables,fields,buttons,nrels,externalFields,widgets,counters)}if(widget.widget){widget.widget=Array.isArray(widget.widget)?widget.widget:[widget.widget];widget.widget.forEach(function(child){child.name=":widget_"+counters.widget++;verticalFill|=_this.reformatWidget(child,relationTables,fields,buttons,nrels,externalFields,widgets,counters)})}if(widget.name.startsWith("nrel__")||!widget.layout&&!vFitWidgets.includes(widget["class"])){verticalFill=true}var parts=widget.name.split("__");if(parts.length>=3&&parts[0]==="nrel"){relationTables[_this.props.mapPrefix+parts[1]]={fk:parts[2],sortcol:parts[3]||null,noreorder:parts[4]||false}}return verticalFill});_defineProperty(_this,"reformatLayout",function(layout,relationTables,fields,buttons,nrels,externalFields,widgets,counters){layout.item=MiscUtils.ensureArray(layout.item);layout.name=layout.name||":layout_"+counters.layout++;var verticalFill=false;layout.item.forEach(function(item){if(!item){return}else if(item.widget){verticalFill|=_this.reformatWidget(item.widget,relationTables,fields,buttons,nrels,externalFields,widgets,counters)}else if(item.spacer){item.spacer.property=MiscUtils.ensureArray(item.spacer.property).reduce(function(res,prop){return _objectSpread(_objectSpread({},res),{},_defineProperty({},prop.name,prop[Object.keys(prop).find(function(key){return key!=="name"})]))},{});if(item.spacer.property.orientation==="Qt::Vertical"){verticalFill=true}}else if(item.layout){verticalFill|=_this.reformatLayout(item.layout,relationTables,fields,buttons,nrels,externalFields,widgets,counters)}});layout.verticalFill=verticalFill;return verticalFill});_defineProperty(_this,"buildErrMsg",function(record){var message=record.error;var errorDetails=record.error_details||{};if(!isEmpty(errorDetails.geometry_errors)){message+=":\n";message+=errorDetails.geometry_errors.map(function(entry){return" - "+entry.reason+" at "+entry.location})}if(!isEmpty(errorDetails.data_errors)){message+=":\n - "+errorDetails.data_errors.join("\n - ")}if(!isEmpty(errorDetails.validation_errors)){message+=":\n - "+errorDetails.validation_errors.join("\n - ")}return message});_defineProperty(_this,"translateFormString",function(label,layerName){var _this$props$translati,_this$props$translati2;return(_this$props$translati=(_this$props$translati2=_this.props.translations)===null||_this$props$translati2===void 0||(_this$props$translati2=_this$props$translati2.layers)===null||_this$props$translati2===void 0||(_this$props$translati2=_this$props$translati2[layerName])===null||_this$props$translati2===void 0||(_this$props$translati2=_this$props$translati2.form)===null||_this$props$translati2===void 0?void 0:_this$props$translati2[label])!==null&&_this$props$translati!==void 0?_this$props$translati:label});_defineProperty(_this,"translateFieldName",function(fieldName,layerName){var _this$props$translati3,_this$props$translati4;return(_this$props$translati3=(_this$props$translati4=_this.props.translations)===null||_this$props$translati4===void 0||(_this$props$translati4=_this$props$translati4.layers)===null||_this$props$translati4===void 0||(_this$props$translati4=_this$props$translati4[layerName])===null||_this$props$translati4===void 0||(_this$props$translati4=_this$props$translati4.fields)===null||_this$props$translati4===void 0?void 0:_this$props$translati4[fieldName])!==null&&_this$props$translati3!==void 0?_this$props$translati3:fieldName});_this.state=QtDesignerForm.defaultState;return _this}_inherits(QtDesignerForm,_React$Component);return _createClass(QtDesignerForm,[{key:"componentDidMount",value:function componentDidMount(){this.componentDidUpdate({})}},{key:"componentDidUpdate",value:function componentDidUpdate(prevProps){var _prevProps$editConfig,_prevProps$feature,_this2=this;// Query form
|
|
29
29
|
if(this.props.editConfig.form!==((_prevProps$editConfig=prevProps.editConfig)===null||_prevProps$editConfig===void 0?void 0:_prevProps$editConfig.form)||this.props.feature.__version__!==((_prevProps$feature=prevProps.feature)===null||_prevProps$feature===void 0?void 0:_prevProps$feature.__version__)){this.setState(function(state){var _prevProps$editConfig2;return _objectSpread(_objectSpread({},QtDesignerForm.defaultState),{},{activetabs:_this2.props.editConfig.form===((_prevProps$editConfig2=prevProps.editConfig)===null||_prevProps$editConfig2===void 0?void 0:_prevProps$editConfig2.form)?state.activetabs:{}})});var url=MiscUtils.resolveAssetsPath(this.props.editConfig.form);url+=(url.includes("?")?"&":"?")+"lang="+this.props.locale;axios.get(url).then(function(response){_this2.parseForm(response.data)})["catch"](function(e){// eslint-disable-next-line
|
|
30
30
|
console.log(e)})}// As soon as relation value is added, scroll to bottom of list
|