qwc2 2025.8.6 → 2025.8.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/actions/localConfig.js +1 -1
- package/actions/locale.js +1 -6
- package/components/AttributeForm.js +3 -3
- package/components/EditUploadField.js +1 -1
- package/components/LayerInfoWindow.js +1 -1
- package/components/PluginsContainer.js +2 -2
- package/components/ResizeableWindow.js +2 -2
- package/components/SearchBox.js +1 -1
- package/components/ServiceInfoWindow.js +1 -1
- package/components/SideBar.js +2 -2
- package/components/StandardApp.js +12 -16
- package/components/ThemeList.js +1 -1
- package/components/map3d/Map3D.js +9 -8
- package/components/map3d/SearchField3D.js +1 -1
- package/components/map3d/utils/OrbitControls3D.js +6 -2
- package/components/widgets/TextInput.js +1 -1
- package/package.json +3 -2
- package/plugins/API.js +3 -3
- package/plugins/Authentication.js +1 -1
- package/plugins/BottomBar.js +1 -1
- package/plugins/HeightProfile.js +10 -7
- package/plugins/MapCopyright.js +2 -2
- package/plugins/MapExport.js +1 -1
- package/plugins/MapInfoTooltip.js +1 -1
- package/plugins/Reports.js +1 -1
- package/plugins/Routing.js +1 -1
- package/plugins/TopBar.js +1 -1
- package/plugins/View3D.js +3 -3
- package/plugins/map/MeasurementSupport.js +2 -2
- package/{components/map3d/Settings3D.js → plugins/map3d/BackgroundSwitcher3D.js} +3 -1
- package/{components → plugins}/map3d/BottomBar3D.js +1 -1
- package/plugins/map3d/Compare3D.js +12 -0
- package/{components → plugins}/map3d/Draw3D.js +2 -2
- package/{components → plugins}/map3d/ExportObjects3D.js +2 -2
- package/{components → plugins}/map3d/HideObjects3D.js +2 -2
- package/{components → plugins}/map3d/Identify3D.js +2 -2
- package/plugins/map3d/LayerTree3D.js +7 -0
- package/{components → plugins}/map3d/MapExport3D.js +2 -2
- package/{components → plugins}/map3d/Measure3D.js +2 -2
- package/{components → plugins}/map3d/OverviewMap3D.js +2 -2
- package/plugins/map3d/Settings3D.js +7 -0
- package/plugins/map3d/TopBar3D.js +7 -0
- package/plugins/style/BottomBar.css +1 -1
- package/plugins/style/HeightProfile.css +10 -0
- package/reducers/localConfig.js +1 -1
- package/reducers/windows.js +1 -1
- package/static/translations/bg-BG.json +1 -0
- package/static/translations/ca-ES.json +1 -0
- package/static/translations/cs-CZ.json +1 -0
- package/static/translations/de-CH.json +1 -0
- package/static/translations/de-DE.json +1 -0
- package/static/translations/en-US.json +1 -0
- package/static/translations/es-ES.json +1 -0
- package/static/translations/fi-FI.json +1 -0
- package/static/translations/fr-FR.json +1 -0
- package/static/translations/hu-HU.json +1 -0
- package/static/translations/it-IT.json +1 -0
- package/static/translations/ja-JP.json +1 -0
- package/static/translations/nl-NL.json +1 -0
- package/static/translations/no-NO.json +1 -0
- package/static/translations/pl-PL.json +1 -0
- package/static/translations/pt-BR.json +1 -0
- package/static/translations/pt-PT.json +1 -0
- package/static/translations/ro-RO.json +1 -0
- package/static/translations/ru-RU.json +1 -0
- package/static/translations/sv-SE.json +1 -0
- package/static/translations/tr-TR.json +1 -0
- package/static/translations/tsconfig.json +3 -1
- package/static/translations/uk-UA.json +745 -0
- package/utils/CoordinatesUtils.js +2 -2
- package/utils/EditingUtils.js +1 -1
- package/utils/LayerUtils.js +1 -1
- package/utils/LocaleUtils.js +6 -1
- package/utils/PluginStore.js +1 -0
- package/utils/ThemeUtils.js +2 -2
- package/components/map3d/Compare3D.js +0 -12
- package/components/map3d/LayerTree3D.js +0 -7
- package/components/map3d/TopBar3D.js +0 -7
- package/components/map3d/img/viewcone.svg +0 -124
- package/components/map3d/models/arrow.glb +0 -0
- package/components/map3d/models/pin.glb +0 -0
- package/utils/img/person.png +0 -0
- /package/{components → plugins}/map3d/style/BottomBar3D.css +0 -0
- /package/{components → plugins}/map3d/style/Compare3D.css +0 -0
- /package/{components → plugins}/map3d/style/HideObjects3D.css +0 -0
- /package/{components → plugins}/map3d/style/LayerTree3D.css +0 -0
- /package/{components → plugins}/map3d/style/OverviewMap3D.css +0 -0
- /package/{components → plugins}/map3d/style/Settings3D.css +0 -0
package/actions/localConfig.js
CHANGED
|
@@ -4,4 +4,4 @@
|
|
|
4
4
|
*
|
|
5
5
|
* This source code is licensed under the BSD-style license found in the
|
|
6
6
|
* LICENSE file in the root directory of this source tree.
|
|
7
|
-
*/import ReducerIndex from"../reducers/index";import localConfigReducer from"../reducers/localConfig";ReducerIndex.register("localConfig",localConfigReducer);export var LOCAL_CONFIG_LOADED="LOCAL_CONFIG_LOADED";export var SET_STARTUP_PARAMETERS="SET_STARTUP_PARAMETERS";export var SET_COLOR_SCHEME="SET_COLOR_SCHEME";export var SET_USER_INFO_FIELDS="SET_USER_INFO_FIELDS";export var SET_PERMALINK_PARAMETERS="SET_PERMALINK_PARAMETERS";export var REGISTER_CUSTOM_PLUGIN="REGISTER_CUSTOM_PLUGIN";export var UNREGISTER_CUSTOM_PLUGIN="UNREGISTER_CUSTOM_PLUGIN";export function localConfigLoaded(config){return{type:LOCAL_CONFIG_LOADED,config:config}}export function setStartupParameters(params,state){return{type:SET_STARTUP_PARAMETERS,params:params,state:state}}export function setColorScheme(colorScheme){var storeInLocalStorage=arguments.length>1&&arguments[1]!==undefined?arguments[1]:false;return{type:SET_COLOR_SCHEME,colorScheme:colorScheme,storeInLocalStorage:storeInLocalStorage}}export function setUserInfoFields(fields){return{type:SET_USER_INFO_FIELDS,fields:fields}}export function setPermalinkParameters(params){return{type:SET_PERMALINK_PARAMETERS,params:params}}export function registerCustomPlugin(name){return{type:REGISTER_CUSTOM_PLUGIN,name:name}}export function unregisterCustomPlugin(name){return{type:UNREGISTER_CUSTOM_PLUGIN,name:name}}
|
|
7
|
+
*/import ReducerIndex from"../reducers/index";import localConfigReducer from"../reducers/localConfig";ReducerIndex.register("localConfig",localConfigReducer);export var LOCAL_CONFIG_LOADED="LOCAL_CONFIG_LOADED";export var SET_STARTUP_PARAMETERS="SET_STARTUP_PARAMETERS";export var SET_COLOR_SCHEME="SET_COLOR_SCHEME";export var SET_USER_INFO_FIELDS="SET_USER_INFO_FIELDS";export var SET_PERMALINK_PARAMETERS="SET_PERMALINK_PARAMETERS";export var REGISTER_CUSTOM_PLUGIN="REGISTER_CUSTOM_PLUGIN";export var UNREGISTER_CUSTOM_PLUGIN="UNREGISTER_CUSTOM_PLUGIN";export function localConfigLoaded(config){return{type:LOCAL_CONFIG_LOADED,config:config}}export function setStartupParameters(params,state){return{type:SET_STARTUP_PARAMETERS,params:params,state:state}}export function setColorScheme(colorScheme){var storeInLocalStorage=arguments.length>1&&arguments[1]!==undefined?arguments[1]:false;return{type:SET_COLOR_SCHEME,colorScheme:colorScheme,storeInLocalStorage:storeInLocalStorage}}export function setUserInfoFields(fields){return{type:SET_USER_INFO_FIELDS,fields:fields}}export function setPermalinkParameters(params){return{type:SET_PERMALINK_PARAMETERS,params:params}}export function registerCustomPlugin(name,availableIn2D,availableIn3D){return{type:REGISTER_CUSTOM_PLUGIN,name:name,availableIn2D:availableIn2D,availableIn3D:availableIn3D}}export function unregisterCustomPlugin(name){return{type:UNREGISTER_CUSTOM_PLUGIN,name:name}}
|
package/actions/locale.js
CHANGED
|
@@ -5,9 +5,4 @@
|
|
|
5
5
|
*
|
|
6
6
|
* This source code is licensed under the BSD-style license found in the
|
|
7
7
|
* LICENSE file in the root directory of this source tree.
|
|
8
|
-
*/import ReducerIndex from"../reducers/index";import localeReducer from"../reducers/locale";ReducerIndex.register("locale",localeReducer);
|
|
9
|
-
loadLang=lang}else if(availableLanguages.indexOf(lang.slice(0,2))!==-1){// Exact match: lang
|
|
10
|
-
loadLang=lang.slice(0,2)}else{// Try match lang-<OTHER_REGION>
|
|
11
|
-
loadLang=availableLanguages.find(function(lc){return lc.slice(0,2)===lang.slice(0,2)})}var config={headers:{"Content-Type":"application/json"},data:{}};var translationsPath=ConfigUtils.getTranslationsPath();var dispatchChangeLocale=function dispatchChangeLocale(locale,messages){if(ConfigUtils.getConfigProp("loadTranslationOverrides")){axios.get(translationsPath+"/"+locale+"_overrides.json",config).then(function(response){var overrideMessages=response.data.messages;dispatch({type:CHANGE_LOCALE,locale:locale,messages:deepmerge(messages,overrideMessages),fallbackMessages:defaultLangData.messages})})["catch"](function(){dispatch({type:CHANGE_LOCALE,locale:locale,messages:messages,fallbackMessages:defaultLangData.messages})})}else{dispatch({type:CHANGE_LOCALE,locale:locale,messages:messages,fallbackMessages:defaultLangData.messages})}};if(!loadLang){// eslint-disable-next-line
|
|
12
|
-
console.warn("No suitable translations available for "+lang+", defaulting to "+defaultLangData.locale);dispatchChangeLocale(defaultLangData.locale,defaultLangData.messages)}else{axios.get(translationsPath+"/"+loadLang+".json",config).then(function(response){dispatchChangeLocale(loadLang,response.data.messages)})["catch"](function(){// eslint-disable-next-line
|
|
13
|
-
console.warn("Failed to load translations for "+loadLang+", defaulting to "+defaultLangData.locale);dispatchChangeLocale(defaultLangData.locale,defaultLangData.messages)})}}}export function addTranslations(translations){return{type:ADD_TRANSLATIONS,translations:translations}}
|
|
8
|
+
*/import ReducerIndex from"../reducers/index";import localeReducer from"../reducers/locale";ReducerIndex.register("locale",localeReducer);export var CHANGE_LOCALE="CHANGE_LOCALE";export var ADD_TRANSLATIONS="ADD_TRANSLATIONS";export function changeLocale(localeData,fallbackLocaleData){return{type:CHANGE_LOCALE,locale:localeData.locale,messages:localeData.messages,fallbackMessages:fallbackLocaleData.messages}}export function addTranslations(translations){return{type:ADD_TRANSLATIONS,translations:translations}}
|
|
@@ -17,12 +17,12 @@ if(_this.props.editContext.geomReadOnly){delete feature.geometry}var curConfig=_
|
|
|
17
17
|
var relationValues=clone(feature.relationValues||{});delete feature.relationValues;var relationUploads={};var featureUploads={};// Collect all values from form fields
|
|
18
18
|
var fieldnames=Array.from(_this.form.elements).map(function(element){return element.name}).filter(function(x){return x&&x!=="g-recaptcha-response"});fieldnames.forEach(function(name){var element=_this.form.elements.namedItem(name);if(element){var parts=name.split("__");var value=element.type==="radio"||element.type==="checkbox"?element.checked:element.value;var nullElements=["date","number","radio"];var nullFieldTypes=["date","number"];if(parts.length>=3){var _this$props$theme$edi,_this$props$theme$edi2,_this$props$theme$edi3;// Relation value
|
|
19
19
|
// Usually <table>__<field>__<index>, but <field> might also contain __ (i.e. upload__user)
|
|
20
|
-
var tablename=parts[0];var datasetname=mapPrefix+tablename;var field=parts.slice(1,parts.length-1).join("__");var index=parseInt(parts[parts.length-1],10);var nrelFieldConfig=(_this$props$theme$edi=(_this$props$theme$edi2=_this.props.theme.editConfig[tablename].fields)===null||_this$props$theme$edi2===void 0||(_this$props$theme$edi3=_this$props$theme$edi2.find)===null||_this$props$theme$edi3===void 0?void 0:_this$props$theme$edi3.call(_this$props$theme$edi2,function(f){return f.id===field}))!==null&&_this$props$theme$edi!==void 0?_this$props$theme$edi:{};var nrelFieldDataType=nrelFieldConfig.
|
|
20
|
+
var tablename=parts[0];var datasetname=mapPrefix+tablename;var field=parts.slice(1,parts.length-1).join("__");var index=parseInt(parts[parts.length-1],10);var nrelFieldConfig=(_this$props$theme$edi=(_this$props$theme$edi2=_this.props.theme.editConfig[tablename].fields)===null||_this$props$theme$edi2===void 0||(_this$props$theme$edi3=_this$props$theme$edi2.find)===null||_this$props$theme$edi3===void 0?void 0:_this$props$theme$edi3.call(_this$props$theme$edi2,function(f){return f.id===field}))!==null&&_this$props$theme$edi!==void 0?_this$props$theme$edi:{};var nrelFieldDataType=nrelFieldConfig.type;if(nrelFieldConfig.expression){// Skip virtual fields
|
|
21
21
|
delete relationValues[datasetname].features[index][field];return}if((element instanceof RadioNodeList||nullElements.includes(element.type)||nullFieldTypes.includes(nrelFieldDataType))&&element.value===""){// Set empty value to null instead of empty string
|
|
22
22
|
value=null}if(nrelFieldDataType==="text"&&textNullValue!==undefined&&element.value===textNullValue){// Convert text NULL to null
|
|
23
23
|
value=null}// relationValues for table must exist as rows are either pre-existing or were added
|
|
24
|
-
if(!(field in relationValues[datasetname].features[index].properties)){relationValues[datasetname].features[index].defaultedProperties=[].concat(_toConsumableArray(relationValues[datasetname].features[index].defaultedProperties||[]),[field])}relationValues[datasetname].features[index].properties[field]=value;if(relationValues[datasetname].features[index].__status__==="empty"){relationValues[datasetname].features[index].__status__="new"}if(element.type==="file"&&element.files.length>0){relationUploads[name]=element.files[0];relationValues[datasetname].features[index].properties[field]=""}else if(element.type==="hidden"&&element.value.startsWith("data:")){var filename=element.dataset.filename;var type=element.value.match(/image\/\w+/)[0];if(!filename){var ext=type.split("/")[1];filename=uuidv1()+"."+ext}relationUploads[name]=new File([_this.dataUriToBlob(element.value)],filename,{type:type});relationValues[datasetname].features[index].properties[field]=""}}else{var
|
|
25
|
-
delete feature.properties[name];return}var dataType=
|
|
24
|
+
if(!(field in relationValues[datasetname].features[index].properties)){relationValues[datasetname].features[index].defaultedProperties=[].concat(_toConsumableArray(relationValues[datasetname].features[index].defaultedProperties||[]),[field])}relationValues[datasetname].features[index].properties[field]=value;if(relationValues[datasetname].features[index].__status__==="empty"){relationValues[datasetname].features[index].__status__="new"}if(element.type==="file"&&element.files.length>0){relationUploads[name]=element.files[0];relationValues[datasetname].features[index].properties[field]=""}else if(element.type==="hidden"&&element.value.startsWith("data:")){var filename=element.dataset.filename;var type=element.value.match(/image\/\w+/)[0];if(!filename){var ext=type.split("/")[1];filename=uuidv1()+"."+ext}relationUploads[name]=new File([_this.dataUriToBlob(element.value)],filename,{type:type});relationValues[datasetname].features[index].properties[field]=""}}else{var fieldConfig=(curConfig.fields||[]).find(function(field){return field.id===name})||{};if(fieldConfig.expression){// Skip virtual fields
|
|
25
|
+
delete feature.properties[name];return}var dataType=fieldConfig.type;if((element instanceof RadioNodeList||nullElements.includes(element.type)||nullFieldTypes.includes(dataType))&&element.value===""){// Set empty value to null instead of empty string
|
|
26
26
|
value=null}if(dataType==="text"&&textNullValue!==undefined&&element.value===textNullValue){// Convert text NULL to null
|
|
27
27
|
value=null}if(!(name in feature.properties)){feature.defaultedProperties=[].concat(_toConsumableArray(feature.defaultedProperties||[]),[name])}feature.properties[name]=value;if(element.type==="file"&&element.files.length>0){featureUploads[name]=element.files[0];feature.properties[name]=""}else if(element.type==="hidden"&&element.value.startsWith("data:")){var _filename=element.dataset.filename;var _type=element.value.match(/image\/\w+/)[0];if(!_filename){var _ext=_type.split("/")[1];_filename=uuidv1()+"."+_ext}featureUploads[name]=new File([_this.dataUriToBlob(element.value)],_filename,{type:_type});feature.properties[name]=""}}}});// Set relation values CRS and sort index if necessary
|
|
28
28
|
Object.keys(relationValues).forEach(function(relTable){relationValues[relTable].features=relationValues[relTable].features.filter(function(relFeature){return relFeature.__status__!=="empty"}).map(function(relFeature,idx){var newRelFeature=_objectSpread(_objectSpread({},relFeature),{},{crs:{type:"name",properties:{name:CoordinatesUtils.toOgcUrnCrs(_this.props.map.projection)}}});var sortcol=_this.state.relationTables[relTable].sortcol;var noreorder=_this.state.relationTables[relTable].noreorder;if(sortcol&&!noreorder){newRelFeature.__status__=feature.__status__||(newRelFeature.properties[sortcol]!==idx?"changed":"");newRelFeature.properties[sortcol]=idx}return newRelFeature})});feature.relationValues=relationValues;var featureData=new FormData;featureData.set("feature",JSON.stringify(feature));Object.entries(featureUploads).forEach(function(_ref7){var _ref8=_slicedToArray(_ref7,2),key=_ref8[0],value=_ref8[1];return featureData.set("file:"+key,value)});Object.entries(relationUploads).forEach(function(_ref9){var _ref10=_slicedToArray(_ref9,2),key=_ref10[0],value=_ref10[1];return featureData.set("relfile:"+mapPrefix+key,value)});if(_this.state.captchaResponse){featureData.set("g-recaptcha-response",_this.state.captchaResponse)}if(_this.props.editContext.action==="Draw"){if(_this.props.iface.addFeatureMultipart){_this.props.iface.addFeatureMultipart(_this.props.editConfig,_this.props.map.projection,featureData,function(success,result){return _this.featureCommited(success,result)})}else{_this.props.iface.addFeature(_this.props.editConfig.editDataset,feature,_this.props.map.projection,function(success,result){return _this.featureCommited(success,result)})}}else if(_this.props.editContext.action==="Pick"){if(_this.props.iface.editFeatureMultipart){_this.props.iface.editFeatureMultipart(_this.props.editConfig,_this.props.map.projection,feature.id,featureData,function(success,result){return _this.featureCommited(success,result)})}else{_this.props.iface.editFeature(_this.props.editConfig.editDataset,feature,_this.props.map.projection,function(success,result){return _this.featureCommited(success,result)})}}});_defineProperty(_this,"featureCommited",function(success,result){if(!success){_this.commitFinished(false,result);return}// Check for relation records which failed to commit
|
|
@@ -5,4 +5,4 @@ function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof
|
|
|
5
5
|
* This source code is licensed under the BSD-style license found in the
|
|
6
6
|
* LICENSE file in the root directory of this source tree.
|
|
7
7
|
*/import React from"react";import mime from"mime-to-extensions";import PropTypes from"prop-types";import{v1 as uuidv1}from"uuid";import{showImageEditor}from"../utils/ImageEditor";import LocaleUtils from"../utils/LocaleUtils";import Icon from"./Icon";import ButtonBar from"./widgets/ButtonBar";import ModalDialog from"./widgets/ModalDialog";import"./style/EditUploadField.css";var EditUploadField=/*#__PURE__*/function(_React$Component){function EditUploadField(props){var _this;_classCallCheck(this,EditUploadField);_this=_callSuper(this,EditUploadField,[props]);_defineProperty(_this,"state",{camera:false,imageData:null,imageFilename:null});_defineProperty(_this,"fileSelected",function(ev){if(ev.target.files[0].type.startsWith("image/")){var reader=new FileReader;reader.readAsDataURL(ev.target.files[0]);reader.onload=function(){_this.setState({imageData:reader.result,imageFilename:ev.target.files[0].name});_this.props.updateFile(_this.props.fieldId,new File([_this.dataUriToBlob(reader.result)],ev.target.files[0].name,{type:ev.target.files[0].type}));_this.props.updateField(_this.props.fieldId,"")}}else{_this.props.updateField(_this.props.fieldId,"");_this.props.updateFile(_this.props.fieldId,ev.target.files[0])}});_defineProperty(_this,"enableCamera",function(){_this.setState({camera:true})});_defineProperty(_this,"disableCamera",function(){_this.disableMediaStream();_this.setState({camera:false})});_defineProperty(_this,"renderCaptureFrame",function(){return/*#__PURE__*/React.createElement(ModalDialog,{icon:"camera",onClose:_this.disableCamera,title:LocaleUtils.tr("editing.takepicture")},/*#__PURE__*/React.createElement("video",{className:"edit-capture-frame",ref:_this.activateMediaStream}),/*#__PURE__*/React.createElement("div",{className:"edit-capture-controls"},/*#__PURE__*/React.createElement(Icon,{icon:"camera",onClick:_this.capturePicture})))});_defineProperty(_this,"capturePicture",function(){if(_this.cameraStream){var width=_this.videoElement.videoWidth;var height=_this.videoElement.videoHeight;var canvas=document.createElement("canvas");canvas.width=width;canvas.height=height;var context=canvas.getContext("2d");context.drawImage(_this.videoElement,0,0,width,height);var imageData=canvas.toDataURL("image/jpeg");_this.setState({imageData:imageData,imageFilename:uuidv1()+".jpg"});_this.props.updateField(_this.props.fieldId,"");_this.props.updateFile(_this.props.fieldId,new File([_this.dataUriToBlob(imageData)],uuidv1()+".jpg",{type:"image/jpeg"}))}_this.disableCamera()});_defineProperty(_this,"imageButtonClicked",function(action){if(action==="Draw"){var fileValue=_this.props.value.startsWith("attachment:")?_this.props.value.replace(/attachment:\/\//,""):"";var fileType=mime.lookup(fileValue);var fileUrl=_this.props.iface.resolveAttachmentUrl(_this.props.dataset,fileValue);var imageData=fileType&&fileType.startsWith("image/")?fileUrl:_this.state.imageData;showImageEditor(imageData,function(newImageData){_this.setState({imageData:newImageData,imageFilename:fileValue.replace(/.*\//,"")});_this.props.updateField(_this.props.fieldId,"");_this.props.updateFile(_this.props.fieldId,new File([_this.dataUriToBlob(newImageData)],uuidv1()+".jpg",{type:"image/jpeg"}))})}else if(action==="Clear"){_this.clearImage()}});_defineProperty(_this,"clearImage",function(){_this.setState({imageData:null,imageFilename:null});_this.props.updateField(_this.props.fieldId,"");_this.props.updateFile(_this.props.fieldId,null)});_defineProperty(_this,"activateMediaStream",function(el){if(_this.state.camera&&!_this.cameraStream){var constraints={video:{width:{ideal:4096},height:{ideal:2160}}};navigator.mediaDevices.getUserMedia(constraints).then(function(mediaStream){_this.cameraStream=mediaStream;el.srcObject=mediaStream;el.play();_this.videoElement=el})["catch"](function(err){// eslint-disable-next-line
|
|
8
|
-
console.warn("Unable to access camera: "+err)})}});_defineProperty(_this,"disableMediaStream",function(){if(_this.cameraStream){_this.cameraStream.getTracks()[0].stop();_this.cameraStream=null;_this.videoElement=null}});_defineProperty(_this,"download",function(href,filename){var a=document.createElement("a");a.href=href;a.target="_blank";a.setAttribute("download",filename);a.click()});_defineProperty(_this,"dataUriToBlob",function(dataUri){var parts=dataUri.split(",");var byteString=parts[0].indexOf("base64")>=0?atob(parts[1]):decodeURI(parts[1]);var mimeString=parts[0].split(":")[1].split(";")[0];var ia=new Uint8Array(byteString.length);for(var i=0;i<byteString.length;i++){ia[i]=byteString.charCodeAt(i)}return new Blob([ia],{type:mimeString})});_this.cameraStream=null;_this.videoElement=null;_this.portal=document.createElement("div");document.body.appendChild(_this.portal);return _this}_inherits(EditUploadField,_React$Component);return _createClass(EditUploadField,[{key:"componentWillUnmount",value:function componentWillUnmount(){this.disableMediaStream()}},{key:"render",value:function render(){var _this2=this;var
|
|
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};
|
|
@@ -4,4 +4,4 @@ function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof
|
|
|
4
4
|
*
|
|
5
5
|
* This source code is licensed under the BSD-style license found in the
|
|
6
6
|
* LICENSE file in the root directory of this source tree.
|
|
7
|
-
*/import React from"react";import{connect}from"react-redux";import PropTypes from"prop-types";import{setActiveLayerInfo}from"../actions/layerinfo";import ResizeableWindow from"../components/ResizeableWindow";import LayerUtils from"../utils/LayerUtils";import LocaleUtils from"../utils/LocaleUtils";import MapUtils from"../utils/MapUtils";import MiscUtils from"../utils/MiscUtils";import{Image}from"./widgets/Primitives";import"./style/LayerInfoWindow.css";var LayerInfoWindow=/*#__PURE__*/function(_React$Component){function LayerInfoWindow(){var _this;_classCallCheck(this,LayerInfoWindow);for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++){args[_key]=arguments[_key]}_this=_callSuper(this,LayerInfoWindow,[].concat(args));_defineProperty(_this,"renderRow",function(title,content){var html=arguments.length>2&&arguments[2]!==undefined?arguments[2]:false;if(content){return/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",null,title,":"),html?/*#__PURE__*/React.createElement("td",{dangerouslySetInnerHTML:{__html:MiscUtils.addLinkAnchors(content)}}):/*#__PURE__*/React.createElement("td",null,content))}return null});_defineProperty(_this,"renderMetadata",function(metadata){return metadata.map(function(entry){return _this.renderRow(LocaleUtils.tr(entry.label),entry.content,true)})});_defineProperty(_this,"renderScale",function(scale){if(scale===0){return"0"}else if(scale>=1){return"1:"+Math.round(scale)}else{return Math.round(1/scale)+":1"}});_defineProperty(_this,"onClose",function(){_this.props.setActiveLayerInfo(null,null)});return _this}_inherits(LayerInfoWindow,_React$Component);return _createClass(LayerInfoWindow,[{key:"renderLink",value:function renderLink(text,url){if(url){return/*#__PURE__*/React.createElement("a",{href:url,rel:"noreferrer",target:"_blank"},text)}else if(text){return text}return null}},{key:"render",value:function render(){if(!this.props.layer||!this.props.sublayer){return null}var legend=null;var scale=MapUtils.computeForZoom(this.props.map.scales,this.props.map.zoom);var legendUrl=LayerUtils.getLegendUrl(this.props.layer,this.props.sublayer,scale,this.props.map,this.props.bboxDependentLegend,this.props.scaleDependentLegend);if(legendUrl){legend=/*#__PURE__*/React.createElement(Image,{className:"layer-info-window-legend",src:legendUrl})}else if(this.props.layer.color){legend=/*#__PURE__*/React.createElement("span",{className:"layer-info-window-coloricon",style:{backgroundColor:this.props.layer.color}})}return/*#__PURE__*/React.createElement(ResizeableWindow,{icon:"info-sign",initialHeight:this.props.layerInfoGeometry.initialHeight,initialWidth:this.props.layerInfoGeometry.initialWidth,initialX:this.props.layerInfoGeometry.initialX,initialY:this.props.layerInfoGeometry.initialY,initiallyDocked:this.props.layerInfoGeometry.initiallyDocked,onClose:this.onClose,title:LocaleUtils.tr("layerinfo.title")},/*#__PURE__*/React.createElement("div",{className:"layer-info-window-body",role:"body"},/*#__PURE__*/React.createElement("h4",{className:"layer-info-window-title"},this.props.sublayer.title),/*#__PURE__*/React.createElement("div",{className:"layer-info-window-frame"},/*#__PURE__*/React.createElement("table",{className:"layer-info-window-table"},/*#__PURE__*/React.createElement("tbody",null,this.renderRow(LocaleUtils.tr("layerinfo.abstract"),this.props.sublayer["abstract"],true),this.props.sublayer.attribution?this.renderRow(LocaleUtils.tr("layerinfo.attribution"),this.renderLink(this.props.sublayer.attribution.Title,this.props.sublayer.attribution.OnlineResource)):null,this.renderRow(LocaleUtils.tr("layerinfo.keywords"),this.props.sublayer.keywords),this.renderRow(LocaleUtils.tr("layerinfo.dataUrl"),this.renderLink(this.props.sublayer.dataUrl,this.props.sublayer.dataUrl)),this.renderRow(LocaleUtils.tr("layerinfo.metadataUrl"),this.renderLink(this.props.sublayer.metadataUrl,this.props.sublayer.metadataUrl)),this.props.sublayer.minScale!==undefined?this.renderRow(LocaleUtils.tr("layerinfo.maxscale"),this.renderScale(this.props.sublayer.minScale)):null,this.props.sublayer.maxScale!==undefined?this.renderRow(LocaleUtils.tr("layerinfo.minscale"),this.renderScale(this.props.sublayer.maxScale)):null,this.renderRow(LocaleUtils.tr("layerinfo.legend"),legend),this.props.sublayer.metadata!==undefined?this.renderMetadata(this.props.sublayer.metadata):null)))))}}])}(React.Component);_defineProperty(LayerInfoWindow,"propTypes",{bboxDependentLegend:PropTypes.oneOfType([PropTypes.bool,PropTypes.string]),layer:PropTypes.object,layerInfoGeometry:PropTypes.object,map:PropTypes.object,scaleDependentLegend:PropTypes.oneOfType([PropTypes.bool,PropTypes.string]),setActiveLayerInfo:PropTypes.func,sublayer:PropTypes.object});var selector=function selector(state){return{map:state.map,layer:state.layerinfo.layer,sublayer:state.layerinfo.sublayer}};export default connect(selector,{setActiveLayerInfo:setActiveLayerInfo})(LayerInfoWindow);
|
|
7
|
+
*/import React from"react";import{connect}from"react-redux";import DOMPurify from"dompurify";import PropTypes from"prop-types";import{setActiveLayerInfo}from"../actions/layerinfo";import ResizeableWindow from"../components/ResizeableWindow";import LayerUtils from"../utils/LayerUtils";import LocaleUtils from"../utils/LocaleUtils";import MapUtils from"../utils/MapUtils";import MiscUtils from"../utils/MiscUtils";import{Image}from"./widgets/Primitives";import"./style/LayerInfoWindow.css";var LayerInfoWindow=/*#__PURE__*/function(_React$Component){function LayerInfoWindow(){var _this;_classCallCheck(this,LayerInfoWindow);for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++){args[_key]=arguments[_key]}_this=_callSuper(this,LayerInfoWindow,[].concat(args));_defineProperty(_this,"renderRow",function(title,content){var html=arguments.length>2&&arguments[2]!==undefined?arguments[2]:false;if(content){return/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",null,title,":"),html?/*#__PURE__*/React.createElement("td",{dangerouslySetInnerHTML:{__html:MiscUtils.addLinkAnchors(DOMPurify.sanitize(content))}}):/*#__PURE__*/React.createElement("td",null,content))}return null});_defineProperty(_this,"renderMetadata",function(metadata){return metadata.map(function(entry){return _this.renderRow(LocaleUtils.tr(entry.label),entry.content,true)})});_defineProperty(_this,"renderScale",function(scale){if(scale===0){return"0"}else if(scale>=1){return"1:"+Math.round(scale)}else{return Math.round(1/scale)+":1"}});_defineProperty(_this,"onClose",function(){_this.props.setActiveLayerInfo(null,null)});return _this}_inherits(LayerInfoWindow,_React$Component);return _createClass(LayerInfoWindow,[{key:"renderLink",value:function renderLink(text,url){if(url){return/*#__PURE__*/React.createElement("a",{href:url,rel:"noreferrer",target:"_blank"},text)}else if(text){return text}return null}},{key:"render",value:function render(){if(!this.props.layer||!this.props.sublayer){return null}var legend=null;var scale=MapUtils.computeForZoom(this.props.map.scales,this.props.map.zoom);var legendUrl=LayerUtils.getLegendUrl(this.props.layer,this.props.sublayer,scale,this.props.map,this.props.bboxDependentLegend,this.props.scaleDependentLegend);if(legendUrl){legend=/*#__PURE__*/React.createElement(Image,{className:"layer-info-window-legend",src:legendUrl})}else if(this.props.layer.color){legend=/*#__PURE__*/React.createElement("span",{className:"layer-info-window-coloricon",style:{backgroundColor:this.props.layer.color}})}return/*#__PURE__*/React.createElement(ResizeableWindow,{icon:"info-sign",initialHeight:this.props.layerInfoGeometry.initialHeight,initialWidth:this.props.layerInfoGeometry.initialWidth,initialX:this.props.layerInfoGeometry.initialX,initialY:this.props.layerInfoGeometry.initialY,initiallyDocked:this.props.layerInfoGeometry.initiallyDocked,onClose:this.onClose,title:LocaleUtils.tr("layerinfo.title")},/*#__PURE__*/React.createElement("div",{className:"layer-info-window-body",role:"body"},/*#__PURE__*/React.createElement("h4",{className:"layer-info-window-title"},this.props.sublayer.title),/*#__PURE__*/React.createElement("div",{className:"layer-info-window-frame"},/*#__PURE__*/React.createElement("table",{className:"layer-info-window-table"},/*#__PURE__*/React.createElement("tbody",null,this.renderRow(LocaleUtils.tr("layerinfo.abstract"),this.props.sublayer["abstract"],true),this.props.sublayer.attribution?this.renderRow(LocaleUtils.tr("layerinfo.attribution"),this.renderLink(this.props.sublayer.attribution.Title,this.props.sublayer.attribution.OnlineResource)):null,this.renderRow(LocaleUtils.tr("layerinfo.keywords"),this.props.sublayer.keywords),this.renderRow(LocaleUtils.tr("layerinfo.dataUrl"),this.renderLink(this.props.sublayer.dataUrl,this.props.sublayer.dataUrl)),this.renderRow(LocaleUtils.tr("layerinfo.metadataUrl"),this.renderLink(this.props.sublayer.metadataUrl,this.props.sublayer.metadataUrl)),this.props.sublayer.minScale!==undefined?this.renderRow(LocaleUtils.tr("layerinfo.maxscale"),this.renderScale(this.props.sublayer.minScale)):null,this.props.sublayer.maxScale!==undefined?this.renderRow(LocaleUtils.tr("layerinfo.minscale"),this.renderScale(this.props.sublayer.maxScale)):null,this.renderRow(LocaleUtils.tr("layerinfo.legend"),legend),this.props.sublayer.metadata!==undefined?this.renderMetadata(this.props.sublayer.metadata):null)))))}}])}(React.Component);_defineProperty(LayerInfoWindow,"propTypes",{bboxDependentLegend:PropTypes.oneOfType([PropTypes.bool,PropTypes.string]),layer:PropTypes.object,layerInfoGeometry:PropTypes.object,map:PropTypes.object,scaleDependentLegend:PropTypes.oneOfType([PropTypes.bool,PropTypes.string]),setActiveLayerInfo:PropTypes.func,sublayer:PropTypes.object});var selector=function selector(state){return{map:state.map,layer:state.layerinfo.layer,sublayer:state.layerinfo.sublayer}};export default connect(selector,{setActiveLayerInfo:setActiveLayerInfo})(LayerInfoWindow);
|
|
@@ -5,9 +5,9 @@ function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof
|
|
|
5
5
|
*
|
|
6
6
|
* This source code is licensed under the BSD-style license found in the
|
|
7
7
|
* LICENSE file in the root directory of this source tree.
|
|
8
|
-
*/import React from"react";import{connect}from"react-redux";import PropTypes from"prop-types";import ConfigUtils from"../utils/ConfigUtils";import ProcessNotifications from"./ProcessNotifications";import WindowManager from"./WindowManager";import"./style/PluginsContainer.css";export var MapButtonPortalContext=/*#__PURE__*/React.createContext(null);export var MapContainerPortalContext=/*#__PURE__*/React.createContext(null);var PluginsContainer=/*#__PURE__*/function(_React$Component){function PluginsContainer(){var _this;_classCallCheck(this,PluginsContainer);for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++){args[_key]=arguments[_key]}_this=_callSuper(this,PluginsContainer,[].concat(args));_defineProperty(_this,"state",{mapButtonsContainerRef:null,mapContainerRef:null});_defineProperty(_this,"renderPlugins",function(){var
|
|
8
|
+
*/import React from"react";import{connect}from"react-redux";import PropTypes from"prop-types";import ConfigUtils from"../utils/ConfigUtils";import ProcessNotifications from"./ProcessNotifications";import WindowManager from"./WindowManager";import"./style/PluginsContainer.css";export var MapButtonPortalContext=/*#__PURE__*/React.createContext(null);export var MapContainerPortalContext=/*#__PURE__*/React.createContext(null);var PluginsContainer=/*#__PURE__*/function(_React$Component){function PluginsContainer(){var _this;_classCallCheck(this,PluginsContainer);for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++){args[_key]=arguments[_key]}_this=_callSuper(this,PluginsContainer,[].concat(args));_defineProperty(_this,"state",{mapButtonsContainerRef:null,mapContainerRef:null});_defineProperty(_this,"renderPlugins",function(){var device=ConfigUtils.isMobile()?"mobile":"desktop";return _this.props.pluginsConfig.map(function(pluginConf){var _this$props$theme,_this$props$theme2,_pluginConf$key;var Plugin=_this.props.plugins[pluginConf.name+"Plugin"];if(!Plugin){return null}var themeDevicePluginConfig=((_this$props$theme=_this.props.theme)===null||_this$props$theme===void 0||(_this$props$theme=_this$props$theme.config)===null||_this$props$theme===void 0||(_this$props$theme=_this$props$theme[device])===null||_this$props$theme===void 0||(_this$props$theme=_this$props$theme.plugins)===null||_this$props$theme===void 0?void 0:_this$props$theme[pluginConf.name])||{};var themePluginConfig=((_this$props$theme2=_this.props.theme)===null||_this$props$theme2===void 0||(_this$props$theme2=_this$props$theme2.config)===null||_this$props$theme2===void 0||(_this$props$theme2=_this$props$theme2.plugins)===null||_this$props$theme2===void 0?void 0:_this$props$theme2[pluginConf.name])||{};var cfg=_objectSpread(_objectSpread(_objectSpread({},pluginConf.cfg||{}),themePluginConfig),themeDevicePluginConfig);return/*#__PURE__*/React.createElement(Plugin,_extends({key:(_pluginConf$key=pluginConf.key)!==null&&_pluginConf$key!==void 0?_pluginConf$key:pluginConf.name},cfg))})});_defineProperty(_this,"setupTouchEvents",function(el){if(el){el.addEventListener("touchstart",function(ev){_this.touchY=ev.targetTouches[0].clientY},{passive:false});el.addEventListener("touchmove",_this.preventOverscroll,{passive:false})}});_defineProperty(_this,"preventOverscroll",function(ev){if(ev.touches[0].touchType!=="direct"){// Don't do anything for stylus inputs
|
|
9
9
|
return}var scrollEvent=false;var element=ev.target;var direction=ev.targetTouches[0].clientY-_this.touchY;_this.touchY=ev.targetTouches[0].clientY;while(!scrollEvent&&element){var scrollable=element.scrollHeight>element.clientHeight;// Workaround for resizeable-window having scrollHeight > clientHeight even though it has no scrollbar
|
|
10
10
|
if(element.classList.contains("resizeable-window")){scrollable=false}if(element.type==="range"){// If it is a range element, treat it as a scroll event
|
|
11
11
|
scrollEvent=true}else if(scrollable&&element.scrollTop+element.clientHeight<element.scrollHeight&&direction<0){// User scrolls down and element is not at end of scroll
|
|
12
12
|
scrollEvent=true}else if(scrollable&&element.scrollTop>0&&direction>0){// User scrolls up and element is not at start of scroll
|
|
13
|
-
scrollEvent=true}else{element=element.parentElement}}if(!scrollEvent){ev.preventDefault()}});_defineProperty(_this,"setOverlayContainerRef",function(el){_this.setState({mapContainerRef:el})});_defineProperty(_this,"setButtonContainerRef",function(el){_this.setState({mapButtonsContainerRef:el});if(el){var resizeObserver=new ResizeObserver(function(entries){var contentRectEntry=entries.find(function(entry){return entry.contentRect});if(contentRectEntry){var width=contentRectEntry.contentRect.width;var height=contentRectEntry.contentRect.height;el.style.setProperty("--buttons-container-width","".concat(width,"px"));el.style.setProperty("--buttons-container-height","".concat(height,"px"))}});resizeObserver.observe(el);el.recomputeSpacers=function(){var slots=new Set;Array.from(el.childNodes).forEach(function(child){if(child.dataset.spacer){el.removeChild(child)}else{slots.add(child.dataset.slot)}});var maxSlot=Math.max.apply(Math,_toConsumableArray(slots));for(var i=0;i<maxSlot;++i){if(!slots.has(String(i))){var child=document.createElement("div");child.className="map-buttons-spacer";child.dataset.spacer=1;child.style.order=i;el.appendChild(child)}}}}});return _this}_inherits(PluginsContainer,_React$Component);return _createClass(PluginsContainer,[{key:"render",value:function render(){var left=this.props.mapMargins.left;var top=this.props.mapMargins.top;var right=this.props.mapMargins.right;var bottom=this.props.mapMargins.bottom;var mapContainerStyle={left:"calc("+left+"px)",top:"calc(var(--topbar-height) + "+top+"px)",right:"calc("+right+"px)",bottom:"calc(var(--bottombar-height) + "+bottom+"px)"};var haveRefs=this.state.mapButtonsContainerRef&&this.state.mapContainerRef;return/*#__PURE__*/React.createElement("div",{className:"plugins-container "+this.props.className,ref:this.setupTouchEvents},/*#__PURE__*/React.createElement(MapButtonPortalContext.Provider,{value:this.state.mapButtonsContainerRef},/*#__PURE__*/React.createElement(MapContainerPortalContext.Provider,{value:this.state.mapContainerRef},haveRefs?this.renderPlugins():null,haveRefs?this.props.children:null)),/*#__PURE__*/React.createElement(WindowManager,null),/*#__PURE__*/React.createElement("div",{className:"map-container",ref:this.setOverlayContainerRef,style:mapContainerStyle},/*#__PURE__*/React.createElement(ProcessNotifications,null)),/*#__PURE__*/React.createElement("div",{className:"map-buttons-container",ref:this.setButtonContainerRef,style:mapContainerStyle}))}}])}(React.Component);_defineProperty(PluginsContainer,"propTypes",{children:PropTypes.oneOfType([PropTypes.node,PropTypes.func]),className:PropTypes.string,mapMargins:PropTypes.object,plugins:PropTypes.object,
|
|
13
|
+
scrollEvent=true}else{element=element.parentElement}}if(!scrollEvent){ev.preventDefault()}});_defineProperty(_this,"setOverlayContainerRef",function(el){_this.setState({mapContainerRef:el})});_defineProperty(_this,"setButtonContainerRef",function(el){_this.setState({mapButtonsContainerRef:el});if(el){var resizeObserver=new ResizeObserver(function(entries){var contentRectEntry=entries.find(function(entry){return entry.contentRect});if(contentRectEntry){var width=contentRectEntry.contentRect.width;var height=contentRectEntry.contentRect.height;el.style.setProperty("--buttons-container-width","".concat(width,"px"));el.style.setProperty("--buttons-container-height","".concat(height,"px"))}});resizeObserver.observe(el);el.recomputeSpacers=function(){var slots=new Set;Array.from(el.childNodes).forEach(function(child){if(child.dataset.spacer){el.removeChild(child)}else{slots.add(child.dataset.slot)}});var maxSlot=Math.max.apply(Math,_toConsumableArray(slots));for(var i=0;i<maxSlot;++i){if(!slots.has(String(i))){var child=document.createElement("div");child.className="map-buttons-spacer";child.dataset.spacer=1;child.style.order=i;el.appendChild(child)}}}}});return _this}_inherits(PluginsContainer,_React$Component);return _createClass(PluginsContainer,[{key:"render",value:function render(){var left=this.props.mapMargins.left+this.props.mapMargins.outerLeft;var top=this.props.mapMargins.top;var right=this.props.mapMargins.right+this.props.mapMargins.outerRight;var bottom=this.props.mapMargins.bottom;var mapContainerStyle={left:"calc("+left+"px)",top:"calc(var(--topbar-height) + "+top+"px)",right:"calc("+right+"px)",bottom:"calc(var(--bottombar-height) + "+bottom+"px)"};var haveRefs=this.state.mapButtonsContainerRef&&this.state.mapContainerRef;return/*#__PURE__*/React.createElement("div",{className:"plugins-container "+this.props.className,ref:this.setupTouchEvents},/*#__PURE__*/React.createElement(MapButtonPortalContext.Provider,{value:this.state.mapButtonsContainerRef},/*#__PURE__*/React.createElement(MapContainerPortalContext.Provider,{value:this.state.mapContainerRef},haveRefs?this.renderPlugins():null,haveRefs?this.props.children:null)),/*#__PURE__*/React.createElement(WindowManager,null),/*#__PURE__*/React.createElement("div",{className:"map-container",ref:this.setOverlayContainerRef,style:mapContainerStyle},/*#__PURE__*/React.createElement(ProcessNotifications,null)),/*#__PURE__*/React.createElement("div",{className:"map-buttons-container",ref:this.setButtonContainerRef,style:mapContainerStyle}))}}])}(React.Component);_defineProperty(PluginsContainer,"propTypes",{children:PropTypes.oneOfType([PropTypes.node,PropTypes.func]),className:PropTypes.string,mapMargins:PropTypes.object,plugins:PropTypes.object,pluginsConfig:PropTypes.array,theme:PropTypes.object});export default connect(function(state){return{mapMargins:state.windows.mapMargins,theme:state.theme.current}})(PluginsContainer);
|
|
@@ -4,9 +4,9 @@ function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof
|
|
|
4
4
|
*
|
|
5
5
|
* This source code is licensed under the BSD-style license found in the
|
|
6
6
|
* LICENSE file in the root directory of this source tree.
|
|
7
|
-
*/import React from"react";import ReactDOM from"react-dom";import{connect}from"react-redux";import*as portals from"react-reverse-portal";import{Rnd}from"react-rnd";import classnames from"classnames";import PropTypes from"prop-types";import{v1 as uuidv1}from"uuid";import{raiseWindow,registerWindow,unregisterWindow,setSplitScreen}from"../actions/windows";import ConfigUtils from"../utils/ConfigUtils";import LocaleUtils from"../utils/LocaleUtils";import MiscUtils from"../utils/MiscUtils";import Icon from"./Icon";import Spinner from"./widgets/Spinner";import"./style/ResizeableWindow.css";var WINDOW_GEOMETRIES={};var ResizeableWindow=/*#__PURE__*/function(_React$Component){function ResizeableWindow(props){var _this;_classCallCheck(this,ResizeableWindow);_this=_callSuper(this,ResizeableWindow,[props]);_defineProperty(_this,"state",{geometry:null});_defineProperty(_this,"renderRole",function(role){return React.Children.toArray(_this.props.children).find(function(child){return child.props.role===role})});_defineProperty(_this,"onClose",function(ev){if(_this.state.externalWindow){_this.state.externalWindow.removeEventListener("beforeunload",_this.props.onClose)}_this.props.onClose();ev.stopPropagation()});_defineProperty(_this,"renderTitleBar",function(){if(_this.props.fullscreen){return null}var maximized=_this.state.geometry.maximized?true:false;var minimized=_this.state.geometry.minimized?true:false;var docked=_this.state.geometry.docked;var dockSide=_this.props.dockable===true?"left":_this.props.dockable;var dockable=_this.props.dockable&&!_this.state.externalWindow;if(ConfigUtils.getConfigProp("globallyDisableDockableDialogs")){dockable=false}var maximizeable=_this.props.maximizeable&&!_this.state.externalWindow&&!_this.props.fitHeight;if(ConfigUtils.getConfigProp("globallyDisableMaximizeableDialogs")){maximizeable=false}var minimizeable=_this.props.minimizeable&&!_this.state.externalWindow;var icon=null;if(_this.props.busyIcon){icon=/*#__PURE__*/React.createElement(Spinner,null)}else if(_this.props.icon){icon=/*#__PURE__*/React.createElement(Icon,{className:"resizeable-window-titlebar-icon",icon:_this.props.icon,size:"large"})}var dockIcon=docked?"undock":"dock";dockIcon=dockIcon+"_"+dockSide;var iconClasses=classnames({"resizeable-window-titlebar-control":true,"resizeable-window-nodrag":true});var detachIcons=null;if(!ConfigUtils.isMobile()&&!ConfigUtils.getConfigProp("globallyDisableDetachableDialogs")){detachIcons=_this.state.externalWindow?/*#__PURE__*/React.createElement(Icon,{className:iconClasses,icon:"embed",onClick:_this.moveToInternalWindow,title:LocaleUtils.tr("window.embed")}):/*#__PURE__*/React.createElement(Icon,{className:iconClasses,icon:"detach",onClick:_this.moveToExternalWindow,title:LocaleUtils.tr("window.detach")})}return/*#__PURE__*/React.createElement("div",{className:"resizeable-window-titlebar",onDoubleClick:_this.state.externalWindow?null:_this.toggleMaximize},icon,/*#__PURE__*/React.createElement("span",{className:"resizeable-window-titlebar-title"},_this.props.title),(_this.props.extraControls||[]).map(function(entry){var extraIconClasses=classnames({"resizeable-window-titlebar-extra-control":true,"resizeable-window-titlebar-extra-control-active":entry.active,"resizeable-window-nodrag":true});return/*#__PURE__*/React.createElement(Icon,{className:extraIconClasses,icon:entry.icon,key:entry.icon,onClick:entry.callback,title:entry.title})}),!maximized&&dockable?/*#__PURE__*/React.createElement(Icon,{className:iconClasses,icon:dockIcon,onClick:_this.toggleDock,title:_this.state.geometry.docked?LocaleUtils.tr("window.undock"):LocaleUtils.tr("window.dock")}):null,minimizeable?/*#__PURE__*/React.createElement(Icon,{className:iconClasses,icon:minimized?"unminimize":"minimize",onClick:_this.toggleMinimize,title:minimized?LocaleUtils.tr("window.unminimize"):LocaleUtils.tr("window.minimize")}):null,maximizeable?/*#__PURE__*/React.createElement(Icon,{className:iconClasses,icon:maximized?"unmaximize":"maximize",onClick:_this.toggleMaximize,title:maximized?LocaleUtils.tr("window.unmaximize"):LocaleUtils.tr("window.maximize")}):null,detachIcons,_this.props.onClose?/*#__PURE__*/React.createElement(Icon,{className:iconClasses,icon:"remove",onClick:_this.onClose,title:LocaleUtils.tr("window.close")}):null)});_defineProperty(_this,"renderInternalWindowContainer",function(){var _this$state$geometry$,_this$state$geometry,_this$state$geometry$2,_this$state$geometry2;var docked=(_this$state$geometry$=(_this$state$geometry=_this.state.geometry)===null||_this$state$geometry===void 0?void 0:_this$state$geometry.docked)!==null&&_this$state$geometry$!==void 0?_this$state$geometry$:_this.props.initiallyDocked;var maximized=(_this$state$geometry$2=(_this$state$geometry2=_this.state.geometry)===null||_this$state$geometry2===void 0?void 0:_this$state$geometry2.maximized)!==null&&_this$state$geometry$2!==void 0?_this$state$geometry$2:false;var splitTopAndBottomBar=_this.props.splitTopAndBottomBar&&_this.props.splitScreenWhenDocked&&(docked||maximized);var marginLeft=_this.props.mapMargins.splitTopAndBottomBar&&!splitTopAndBottomBar?_this.props.mapMargins.left:0;var marginRight=_this.props.mapMargins.splitTopAndBottomBar&&!splitTopAndBottomBar?_this.props.mapMargins.right:0;var containerStyle={left:marginLeft+"px",right:marginRight+"px",top:splitTopAndBottomBar?0:_this.props.topbarHeight+"px",bottom:splitTopAndBottomBar?0:_this.props.bottombarHeight+"px",zIndex:splitTopAndBottomBar?110:_this.props.baseZIndex+_this.props.windowStacking.findIndex(function(item){return item===_this.id})};return/*#__PURE__*/React.createElement("div",{className:"resizeable-window-container",key:"InternalWindow",ref:_this.setInitialSize,style:containerStyle},_this.props.visible&&_this.state.geometry?_this.renderInternalWindow():null)});_defineProperty(_this,"renderInternalWindow",function(){var maximized=_this.state.geometry.maximized||_this.props.fullscreen?true:false;var minimized=_this.state.geometry.minimized?true:false;var dockSide=_this.props.dockable===true?"left":_this.props.dockable;var bodyclasses=classnames({"resizeable-window-body":true,"resizeable-window-body-scrollable":_this.props.scrollable,"resizeable-window-body-nonscrollable":!_this.props.scrollable,"resizeable-window-nodrag":true});var windowclasses=classnames({"resizeable-window":true,"resizeable-window-maximized":maximized,"resizeable-window-minimized":minimized,"resizeable-window-fit-height":_this.props.fitHeight,"resizeable-window-docked-left":!_this.props.splitScreenWhenDocked&&_this.state.geometry.docked&&dockSide==="left"&&!maximized,"resizeable-window-docked-right":!_this.props.splitScreenWhenDocked&&_this.state.geometry.docked&&dockSide==="right"&&!maximized,"resizeable-window-split-left":_this.props.splitScreenWhenDocked&&_this.state.geometry.docked&&dockSide==="left"&&!maximized,"resizeable-window-split-right":_this.props.splitScreenWhenDocked&&_this.state.geometry.docked&&dockSide==="right"&&!maximized,"resizeable-window-docked-top":_this.state.geometry.docked&&dockSide==="top"&&!maximized,"resizeable-window-docked-bottom":_this.state.geometry.docked&&dockSide==="bottom"&&!maximized});var resizeMode={left:true,right:true,top:true,bottom:true,bottomLeft:true,bottomRight:true,topLeft:true,topRight:true};if(maximized||minimized){resizeMode=false}else if(_this.state.geometry.docked){resizeMode={left:dockSide==="right",right:dockSide==="left",top:dockSide==="bottom",bottom:dockSide!=="bottom"&&!_this.props.splitScreenWhenDocked||_this.props.splitScreenWhenDocked&&dockSide==="top"}}if(_this.props.fitHeight){resizeMode.top=false;resizeMode.bottom=false;resizeMode.bottomLeft=true;resizeMode.bottomRight=true;resizeMode.topLeft=true;resizeMode.topRight=true}return/*#__PURE__*/React.createElement(Rnd,{bounds:"parent",cancel:".resizeable-window-nodrag",className:windowclasses,"default":_this.state.geometry,disableDragging:maximized||_this.state.geometry.docked,enableResizing:resizeMode,maxHeight:_this.props.maxHeight||"100%",maxWidth:_this.props.maxWidth||"100%",minHeight:_this.props.minHeight,minWidth:_this.props.minWidth,onDragStart:_this.onDragStart,onDragStop:_this.onDragStop,onMouseDown:function onMouseDown(){return _this.props.raiseWindow(_this.id)},onResizeStop:_this.onResizeStop,ref:_this.initRnd},/*#__PURE__*/React.createElement("div",{className:"resizeable-window-contents"},_this.renderTitleBar(),/*#__PURE__*/React.createElement("div",{className:bodyclasses,onMouseDown:function onMouseDown(){return _this.props.raiseWindow(_this.id)}},/*#__PURE__*/React.createElement("div",{className:"resizeable-window-drag-shield",ref:function ref(el){_this.dragShield=el}}),_this.portalNode?/*#__PURE__*/React.createElement("div",{className:"resizeable-window-portal-container"},/*#__PURE__*/React.createElement(portals.OutPortal,{node:_this.portalNode})):_this.renderRole("body"))))});_defineProperty(_this,"setInitialSize",function(container){if(!container){return}var width=Math.min(_this.props.initialWidth,container.offsetWidth);var height=Math.min(_this.props.initialHeight,container.offsetHeight);var geometry=null;if(WINDOW_GEOMETRIES[_this.props.title]){geometry=WINDOW_GEOMETRIES[_this.props.title]}else{geometry={x:_this.props.initialX!==null?_this.computeInitialX(container,_this.props.initialX):Math.max(0,Math.round(0.5*(container.offsetWidth-width))),y:_this.props.initialY!==null?_this.computeInitialY(container,_this.props.initialY):Math.max(0,Math.round(0.5*(container.offsetHeight-height))),width:width,height:height,docked:_this.props.initiallyDocked,detached:false}}if(_this.props.splitScreenWhenDocked&&geometry.docked){var dockSide=_this.props.dockable===true?"left":_this.props.dockable;var dockSize=["left","right"].includes(dockSide)?geometry.width:geometry.height;_this.props.setSplitScreen(_this.id,dockSide,dockSize,_this.props.splitTopAndBottomBar)}_this.setState({geometry:geometry})});_defineProperty(_this,"computeInitialX",function(container,x){return x>0||Object.is(x,0)?x:container.offsetWidth-_this.props.initialWidth-Math.abs(x)});_defineProperty(_this,"computeInitialY",function(container,y){return y>0||Object.is(y,0)?y:container.offsetHeight-_this.props.initialHeight-Math.abs(y)});_defineProperty(_this,"renderExternalWindow",function(){return/*#__PURE__*/ReactDOM.createPortal(/*#__PURE__*/React.createElement("div",{className:"resizeable-window-contents"},_this.renderTitleBar(),/*#__PURE__*/React.createElement("div",{className:"resizeable-window-body"},_this.portalNode?/*#__PURE__*/React.createElement("div",{className:"resizeable-window-portal-container"},/*#__PURE__*/React.createElement(portals.OutPortal,{node:_this.portalNode})):_this.renderRole("body"))),_this.state.externalWindow.document.body)});_defineProperty(_this,"initRnd",function(el){if(el){_this.rnd=el;_this.rnd.updatePosition(_this.state.geometry)}});_defineProperty(_this,"onDragStart",function(){if(_this.dragShield){_this.dragShield.style.display="initial"}});_defineProperty(_this,"onDragStop",function(ev,data){_this.setState(function(state){return{geometry:_objectSpread(_objectSpread({},state.geometry),{},{x:data.x,y:data.y})}});if(_this.dragShield){_this.dragShield.style.display="none"}});_defineProperty(_this,"onResizeStop",function(ev,dir,ref,delta,position){// Delay one event loop cycle else clientWidth / clientHeight may not yet be up-to-date
|
|
7
|
+
*/import React from"react";import ReactDOM from"react-dom";import{connect}from"react-redux";import*as portals from"react-reverse-portal";import{Rnd}from"react-rnd";import classnames from"classnames";import PropTypes from"prop-types";import{v1 as uuidv1}from"uuid";import{raiseWindow,registerWindow,unregisterWindow,setSplitScreen}from"../actions/windows";import ConfigUtils from"../utils/ConfigUtils";import LocaleUtils from"../utils/LocaleUtils";import MiscUtils from"../utils/MiscUtils";import Icon from"./Icon";import Spinner from"./widgets/Spinner";import"./style/ResizeableWindow.css";var WINDOW_GEOMETRIES={};var ResizeableWindow=/*#__PURE__*/function(_React$Component){function ResizeableWindow(props){var _this;_classCallCheck(this,ResizeableWindow);_this=_callSuper(this,ResizeableWindow,[props]);_defineProperty(_this,"state",{geometry:null});_defineProperty(_this,"renderRole",function(role){return React.Children.toArray(_this.props.children).find(function(child){return child.props.role===role})});_defineProperty(_this,"onClose",function(ev){if(_this.state.externalWindow){_this.state.externalWindow.removeEventListener("beforeunload",_this.props.onClose)}_this.props.onClose();ev.stopPropagation()});_defineProperty(_this,"renderTitleBar",function(){if(_this.props.fullscreen){return null}var maximized=_this.state.geometry.maximized?true:false;var minimized=_this.state.geometry.minimized?true:false;var docked=_this.state.geometry.docked;var dockSide=_this.props.dockable===true?"left":_this.props.dockable;var dockable=_this.props.dockable&&!_this.state.externalWindow;if(ConfigUtils.getConfigProp("globallyDisableDockableDialogs")){dockable=false}var maximizeable=_this.props.maximizeable&&!_this.state.externalWindow&&!_this.props.fitHeight;if(ConfigUtils.getConfigProp("globallyDisableMaximizeableDialogs")){maximizeable=false}var minimizeable=_this.props.minimizeable&&!_this.state.externalWindow;var icon=null;if(_this.props.busyIcon){icon=/*#__PURE__*/React.createElement(Spinner,null)}else if(_this.props.icon){icon=/*#__PURE__*/React.createElement(Icon,{className:"resizeable-window-titlebar-icon",icon:_this.props.icon,size:"large"})}var dockIcon=docked?"undock":"dock";dockIcon=dockIcon+"_"+dockSide;var iconClasses=classnames({"resizeable-window-titlebar-control":true,"resizeable-window-nodrag":true});var detachIcons=null;if(!ConfigUtils.isMobile()&&!ConfigUtils.getConfigProp("globallyDisableDetachableDialogs")){detachIcons=_this.state.externalWindow?/*#__PURE__*/React.createElement(Icon,{className:iconClasses,icon:"embed",onClick:_this.moveToInternalWindow,title:LocaleUtils.tr("window.embed")}):/*#__PURE__*/React.createElement(Icon,{className:iconClasses,icon:"detach",onClick:_this.moveToExternalWindow,title:LocaleUtils.tr("window.detach")})}return/*#__PURE__*/React.createElement("div",{className:"resizeable-window-titlebar",onDoubleClick:_this.state.externalWindow?null:_this.toggleMaximize},icon,/*#__PURE__*/React.createElement("span",{className:"resizeable-window-titlebar-title"},_this.props.title),(_this.props.extraControls||[]).map(function(entry){var extraIconClasses=classnames({"resizeable-window-titlebar-extra-control":true,"resizeable-window-titlebar-extra-control-active":entry.active,"resizeable-window-nodrag":true});return/*#__PURE__*/React.createElement(Icon,{className:extraIconClasses,icon:entry.icon,key:entry.icon,onClick:entry.callback,title:entry.title})}),!maximized&&dockable?/*#__PURE__*/React.createElement(Icon,{className:iconClasses,icon:dockIcon,onClick:_this.toggleDock,title:_this.state.geometry.docked?LocaleUtils.tr("window.undock"):LocaleUtils.tr("window.dock")}):null,minimizeable?/*#__PURE__*/React.createElement(Icon,{className:iconClasses,icon:minimized?"unminimize":"minimize",onClick:_this.toggleMinimize,title:minimized?LocaleUtils.tr("window.unminimize"):LocaleUtils.tr("window.minimize")}):null,maximizeable?/*#__PURE__*/React.createElement(Icon,{className:iconClasses,icon:maximized?"unmaximize":"maximize",onClick:_this.toggleMaximize,title:maximized?LocaleUtils.tr("window.unmaximize"):LocaleUtils.tr("window.maximize")}):null,detachIcons,_this.props.onClose?/*#__PURE__*/React.createElement(Icon,{className:iconClasses,icon:"remove",onClick:_this.onClose,title:LocaleUtils.tr("window.close")}):null)});_defineProperty(_this,"renderInternalWindowContainer",function(){var _this$state$geometry$,_this$state$geometry,_this$state$geometry$2,_this$state$geometry2;var docked=(_this$state$geometry$=(_this$state$geometry=_this.state.geometry)===null||_this$state$geometry===void 0?void 0:_this$state$geometry.docked)!==null&&_this$state$geometry$!==void 0?_this$state$geometry$:_this.props.initiallyDocked;var maximized=(_this$state$geometry$2=(_this$state$geometry2=_this.state.geometry)===null||_this$state$geometry2===void 0?void 0:_this$state$geometry2.maximized)!==null&&_this$state$geometry$2!==void 0?_this$state$geometry$2:false;var splitTopAndBottomBar=_this.props.splitTopAndBottomBar&&_this.props.splitScreenWhenDocked&&(docked||maximized);var marginLeft=0;var marginRight=0;if(!splitTopAndBottomBar){marginLeft=_this.props.mapMargins.outerLeft+_this.props.menuMargins.left;marginRight=_this.props.mapMargins.outerRight+_this.props.menuMargins.right}var containerStyle={left:marginLeft+"px",right:marginRight+"px",top:splitTopAndBottomBar?0:_this.props.topbarHeight+"px",bottom:splitTopAndBottomBar?0:_this.props.bottombarHeight+"px",zIndex:splitTopAndBottomBar?110:_this.props.baseZIndex+_this.props.windowStacking.findIndex(function(item){return item===_this.id})};return/*#__PURE__*/React.createElement("div",{className:"resizeable-window-container",key:"InternalWindow",ref:_this.setInitialSize,style:containerStyle},_this.props.visible&&_this.state.geometry?_this.renderInternalWindow():null)});_defineProperty(_this,"renderInternalWindow",function(){var maximized=_this.state.geometry.maximized||_this.props.fullscreen?true:false;var minimized=_this.state.geometry.minimized?true:false;var dockSide=_this.props.dockable===true?"left":_this.props.dockable;var bodyclasses=classnames({"resizeable-window-body":true,"resizeable-window-body-scrollable":_this.props.scrollable,"resizeable-window-body-nonscrollable":!_this.props.scrollable,"resizeable-window-nodrag":true});var windowclasses=classnames({"resizeable-window":true,"resizeable-window-maximized":maximized,"resizeable-window-minimized":minimized,"resizeable-window-fit-height":_this.props.fitHeight,"resizeable-window-docked-left":!_this.props.splitScreenWhenDocked&&_this.state.geometry.docked&&dockSide==="left"&&!maximized,"resizeable-window-docked-right":!_this.props.splitScreenWhenDocked&&_this.state.geometry.docked&&dockSide==="right"&&!maximized,"resizeable-window-split-left":_this.props.splitScreenWhenDocked&&_this.state.geometry.docked&&dockSide==="left"&&!maximized,"resizeable-window-split-right":_this.props.splitScreenWhenDocked&&_this.state.geometry.docked&&dockSide==="right"&&!maximized,"resizeable-window-docked-top":_this.state.geometry.docked&&dockSide==="top"&&!maximized,"resizeable-window-docked-bottom":_this.state.geometry.docked&&dockSide==="bottom"&&!maximized});var resizeMode={left:true,right:true,top:true,bottom:true,bottomLeft:true,bottomRight:true,topLeft:true,topRight:true};if(maximized||minimized){resizeMode=false}else if(_this.state.geometry.docked){resizeMode={left:dockSide==="right",right:dockSide==="left",top:dockSide==="bottom",bottom:dockSide!=="bottom"&&!_this.props.splitScreenWhenDocked||_this.props.splitScreenWhenDocked&&dockSide==="top"}}if(_this.props.fitHeight){resizeMode.top=false;resizeMode.bottom=false;resizeMode.bottomLeft=true;resizeMode.bottomRight=true;resizeMode.topLeft=true;resizeMode.topRight=true}return/*#__PURE__*/React.createElement(Rnd,{bounds:"parent",cancel:".resizeable-window-nodrag",className:windowclasses,"default":_this.state.geometry,disableDragging:maximized||_this.state.geometry.docked,enableResizing:resizeMode,maxHeight:_this.props.maxHeight||"100%",maxWidth:_this.props.maxWidth||"100%",minHeight:_this.props.minHeight,minWidth:_this.props.minWidth,onDragStart:_this.onDragStart,onDragStop:_this.onDragStop,onMouseDown:function onMouseDown(){return _this.props.raiseWindow(_this.id)},onResizeStop:_this.onResizeStop,ref:_this.initRnd},/*#__PURE__*/React.createElement("div",{className:"resizeable-window-contents"},_this.renderTitleBar(),/*#__PURE__*/React.createElement("div",{className:bodyclasses,onMouseDown:function onMouseDown(){return _this.props.raiseWindow(_this.id)}},/*#__PURE__*/React.createElement("div",{className:"resizeable-window-drag-shield",ref:function ref(el){_this.dragShield=el}}),_this.portalNode?/*#__PURE__*/React.createElement("div",{className:"resizeable-window-portal-container"},/*#__PURE__*/React.createElement(portals.OutPortal,{node:_this.portalNode})):_this.renderRole("body"))))});_defineProperty(_this,"setInitialSize",function(container){if(!container){return}var width=Math.min(_this.props.initialWidth,container.offsetWidth);var height=Math.min(_this.props.initialHeight,container.offsetHeight);var geometry=null;if(WINDOW_GEOMETRIES[_this.props.title]){geometry=WINDOW_GEOMETRIES[_this.props.title]}else{geometry={x:_this.props.initialX!==null?_this.computeInitialX(container,_this.props.initialX):Math.max(0,Math.round(0.5*(container.offsetWidth-width))),y:_this.props.initialY!==null?_this.computeInitialY(container,_this.props.initialY):Math.max(0,Math.round(0.5*(container.offsetHeight-height))),width:width,height:height,docked:_this.props.initiallyDocked,detached:false}}if(_this.props.splitScreenWhenDocked&&geometry.docked){var dockSide=_this.props.dockable===true?"left":_this.props.dockable;var dockSize=["left","right"].includes(dockSide)?geometry.width:geometry.height;_this.props.setSplitScreen(_this.id,dockSide,dockSize,_this.props.splitTopAndBottomBar)}_this.setState({geometry:geometry})});_defineProperty(_this,"computeInitialX",function(container,x){return x>0||Object.is(x,0)?x:container.offsetWidth-_this.props.initialWidth-Math.abs(x)});_defineProperty(_this,"computeInitialY",function(container,y){return y>0||Object.is(y,0)?y:container.offsetHeight-_this.props.initialHeight-Math.abs(y)});_defineProperty(_this,"renderExternalWindow",function(){return/*#__PURE__*/ReactDOM.createPortal(/*#__PURE__*/React.createElement("div",{className:"resizeable-window-contents"},_this.renderTitleBar(),/*#__PURE__*/React.createElement("div",{className:"resizeable-window-body"},_this.portalNode?/*#__PURE__*/React.createElement("div",{className:"resizeable-window-portal-container"},/*#__PURE__*/React.createElement(portals.OutPortal,{node:_this.portalNode})):_this.renderRole("body"))),_this.state.externalWindow.document.body)});_defineProperty(_this,"initRnd",function(el){if(el){_this.rnd=el;_this.rnd.updatePosition(_this.state.geometry)}});_defineProperty(_this,"onDragStart",function(){if(_this.dragShield){_this.dragShield.style.display="initial"}});_defineProperty(_this,"onDragStop",function(ev,data){_this.setState(function(state){return{geometry:_objectSpread(_objectSpread({},state.geometry),{},{x:data.x,y:data.y})}});if(_this.dragShield){_this.dragShield.style.display="none"}});_defineProperty(_this,"onResizeStop",function(ev,dir,ref,delta,position){// Delay one event loop cycle else clientWidth / clientHeight may not yet be up-to-date
|
|
8
8
|
setTimeout(function(){_this.setState(function(state){return{geometry:_objectSpread(_objectSpread({},state.geometry),{},{x:position.x,y:position.y,width:ref.clientWidth,height:ref.clientHeight})}})},0)});_defineProperty(_this,"toggleDock",function(){_this.setState(function(state){return{geometry:_objectSpread(_objectSpread({},state.geometry),{},{docked:!state.geometry.docked})}});_this.rnd.updatePosition(_this.state.geometry)});_defineProperty(_this,"toggleMinimize",function(){_this.setState(function(state){return{geometry:_objectSpread(_objectSpread({},state.geometry),{},{minimized:!state.geometry.minimized})}})});_defineProperty(_this,"toggleMaximize",function(){_this.setState(function(state){return{geometry:_objectSpread(_objectSpread({},state.geometry),{},{maximized:!state.geometry.maximized,minimized:false})}})});_defineProperty(_this,"moveToExternalWindow",function(){var title=_this.props.title;var windowOptions=["popup=true","toolbar=no","locationbar=no","location=no","directories=no","status=no","menubar=no","scrollbars=yes","resizable=yes","width="+_this.state.geometry.width,"height="+_this.state.geometry.height].join(", ");var externalWindow=window.open("about:blank","_blank",windowOptions);externalWindow.addEventListener("resize",_this.props.onExternalWindowResized,false);var loadInterval=setInterval(function(){if(externalWindow.document.readyState!=="complete"){return}clearInterval(loadInterval);externalWindow.addEventListener("beforeunload",_this.props.onClose,{capture:false,once:true});var titleEl=externalWindow.document.createElement("title");titleEl.appendChild(externalWindow.document.createTextNode(title));externalWindow.document.head.appendChild(titleEl);var icon=MiscUtils.getFaviconFromIcon(_this.props.icon,48);if(icon){var iconEl=externalWindow.document.createElement("link");iconEl.rel="icon";iconEl.href=icon;iconEl.sizes="48x48";externalWindow.document.head.appendChild(iconEl)}// Inherit styles
|
|
9
9
|
Array.from(document.styleSheets).forEach(function(styleSheet){if(styleSheet.href){// External styles
|
|
10
10
|
var linkElement=externalWindow.document.createElement("link");linkElement.rel="stylesheet";linkElement.href=styleSheet.href;externalWindow.document.head.appendChild(linkElement)}else if(styleSheet.cssRules){// Inline styles
|
|
11
11
|
var styleElement=externalWindow.document.createElement("style");var cssText=Array.from(styleSheet.cssRules).map(function(rule){return rule.cssText}).join("\n");styleElement.appendChild(externalWindow.document.createTextNode(cssText));externalWindow.document.head.appendChild(styleElement)}});externalWindow.document.querySelector(":root").style.setProperty("--topbar-height",document.querySelector(":root").style.getPropertyValue("--topbar-height"));externalWindow.document.querySelector(":root").style.setProperty("--bottombar-height",document.querySelector(":root").style.getPropertyValue("--bottombar-height"));_this.setState(function(state){return{externalWindow:externalWindow,geometry:_objectSpread(_objectSpread({},state.geometry),{},{detached:true})}})},50)});_defineProperty(_this,"moveToInternalWindow",function(){if(_this.state.externalWindow){_this.state.externalWindow.removeEventListener("beforeunload",_this.props.onClose);_this.state.externalWindow.removeEventListener("resize",_this.props.onExternalWindowResized,false);_this.state.externalWindow.close();_this.setState(function(state){var newGeometry=_objectSpread(_objectSpread({},state.geometry),{},{detached:false});WINDOW_GEOMETRIES[_this.props.title]=newGeometry;return{externalWindow:null,geometry:newGeometry}})}});_defineProperty(_this,"closeExternalWindow",function(){if(_this.state.externalWindow){_this.state.externalWindow.close()}});_this.rnd=null;_this.dragShield=null;_this.id=uuidv1();_this.portalNode=props.usePortal?portals.createHtmlPortalNode():null;return _this}_inherits(ResizeableWindow,_React$Component);return _createClass(ResizeableWindow,[{key:"componentDidMount",value:function componentDidMount(){this.props.registerWindow(this.id);window.addEventListener("beforeunload",this.closeExternalWindow,{once:true})}},{key:"componentWillUnmount",value:function componentWillUnmount(){this.props.unregisterWindow(this.id);if(this.props.splitScreenWhenDocked){this.props.setSplitScreen(this.id,null,null,false)}if(this.state.externalWindow){this.state.externalWindow.close()}window.removeEventListener("beforeunload",this.closeExternalWindow)}},{key:"componentDidUpdate",value:function componentDidUpdate(prevProps,prevState){if(!this.state.geometry||!prevState.geometry){return}if(this.rnd&&this.props.visible&&this.props.visible!==prevProps.visible){this.props.onGeometryChanged(this.state.geometry);this.rnd.updatePosition(this.state.geometry)}if(this.state.geometry!==prevState.geometry){this.props.onGeometryChanged(this.state.geometry);WINDOW_GEOMETRIES[this.props.title]=this.state.geometry}if(this.props.splitScreenWhenDocked&&(this.props.visible!==prevProps.visible||this.state.geometry!==prevState.geometry||this.state.externalWindow!==prevState.externalWindow)){if(!this.props.visible&&prevProps.visible||this.state.geometry.docked===false&&prevState.geometry.docked!==false||this.state.geometry.maximized===true&&prevState.geometry.maximized!==true||this.state.externalWindow&&!prevState.externalWindow){this.props.setSplitScreen(this.id,null,null,false)}else if(this.props.visible&&this.state.geometry.docked&&!this.state.externalWindow&&!this.state.geometry.maximized){var dockSide=this.props.dockable===true?"left":this.props.dockable;var dockSize=["left","right"].includes(dockSide)?this.state.geometry.width:this.state.geometry.height;this.props.setSplitScreen(this.id,dockSide,dockSize,this.props.splitTopAndBottomBar)}}if(!this.props.visible&&prevProps.visible&&this.state.externalWindow){// Cannot hide an external window
|
|
12
|
-
this.moveToInternalWindow()}}},{key:"render",value:function render(){return[this.portalNode?/*#__PURE__*/React.createElement(portals.InPortal,{key:"InPortal",node:this.portalNode},this.renderRole("body")):null,this.state.externalWindow?this.renderExternalWindow():this.renderInternalWindowContainer()]}}])}(React.Component);_defineProperty(ResizeableWindow,"propTypes",{baseZIndex:PropTypes.number,bottombarHeight:PropTypes.number,busyIcon:PropTypes.bool,children:PropTypes.oneOfType([PropTypes.node,PropTypes.func]),dockable:PropTypes.oneOfType([PropTypes.bool,PropTypes.string]),extraControls:PropTypes.arrayOf(PropTypes.shape({active:PropTypes.bool,icon:PropTypes.string.isRequired,callback:PropTypes.func.isRequired,title:PropTypes.string})),fitHeight:PropTypes.bool,fullscreen:PropTypes.bool,icon:PropTypes.string,initialHeight:PropTypes.number,initialWidth:PropTypes.number,initialX:PropTypes.number,initialY:PropTypes.number,initiallyDocked:PropTypes.bool,mapMargins:PropTypes.object,maxHeight:PropTypes.number,maxWidth:PropTypes.number,maximizeable:PropTypes.bool,minHeight:PropTypes.number,minWidth:PropTypes.number,minimizeable:PropTypes.bool,onClose:PropTypes.func,onExternalWindowResized:PropTypes.func,onGeometryChanged:PropTypes.func,raiseWindow:PropTypes.func,registerWindow:PropTypes.func,scrollable:PropTypes.bool,setSplitScreen:PropTypes.func,splitScreenWhenDocked:PropTypes.bool,splitTopAndBottomBar:PropTypes.bool,title:PropTypes.string,topbarHeight:PropTypes.number,unregisterWindow:PropTypes.func,usePortal:PropTypes.bool,visible:PropTypes.bool,windowStacking:PropTypes.array});_defineProperty(ResizeableWindow,"defaultProps",{baseZIndex:10,initialX:null,initialY:null,initialWidth:240,initialHeight:320,minWidth:50,minHeight:50,maxWidth:null,maxHeight:null,maximizeable:true,minimizeable:false,visible:true,dockable:true,onExternalWindowResized:function onExternalWindowResized(){},onGeometryChanged:function onGeometryChanged(){},externalWindow:null,usePortal:true});export default connect(function(state){return{windowStacking:state.windows.stacking,topbarHeight:state.windows.topbarHeight,bottombarHeight:state.windows.bottombarHeight,mapMargins:state.windows.mapMargins}},{raiseWindow:raiseWindow,registerWindow:registerWindow,setSplitScreen:setSplitScreen,unregisterWindow:unregisterWindow})(ResizeableWindow);
|
|
12
|
+
this.moveToInternalWindow()}}},{key:"render",value:function render(){return[this.portalNode?/*#__PURE__*/React.createElement(portals.InPortal,{key:"InPortal",node:this.portalNode},this.renderRole("body")):null,this.state.externalWindow?this.renderExternalWindow():this.renderInternalWindowContainer()]}}])}(React.Component);_defineProperty(ResizeableWindow,"propTypes",{baseZIndex:PropTypes.number,bottombarHeight:PropTypes.number,busyIcon:PropTypes.bool,children:PropTypes.oneOfType([PropTypes.node,PropTypes.func]),dockable:PropTypes.oneOfType([PropTypes.bool,PropTypes.string]),extraControls:PropTypes.arrayOf(PropTypes.shape({active:PropTypes.bool,icon:PropTypes.string.isRequired,callback:PropTypes.func.isRequired,title:PropTypes.string})),fitHeight:PropTypes.bool,fullscreen:PropTypes.bool,icon:PropTypes.string,initialHeight:PropTypes.number,initialWidth:PropTypes.number,initialX:PropTypes.number,initialY:PropTypes.number,initiallyDocked:PropTypes.bool,mapMargins:PropTypes.object,maxHeight:PropTypes.number,maxWidth:PropTypes.number,maximizeable:PropTypes.bool,menuMargins:PropTypes.object,minHeight:PropTypes.number,minWidth:PropTypes.number,minimizeable:PropTypes.bool,onClose:PropTypes.func,onExternalWindowResized:PropTypes.func,onGeometryChanged:PropTypes.func,raiseWindow:PropTypes.func,registerWindow:PropTypes.func,scrollable:PropTypes.bool,setSplitScreen:PropTypes.func,splitScreenWhenDocked:PropTypes.bool,splitTopAndBottomBar:PropTypes.bool,title:PropTypes.string,topbarHeight:PropTypes.number,unregisterWindow:PropTypes.func,usePortal:PropTypes.bool,visible:PropTypes.bool,windowStacking:PropTypes.array});_defineProperty(ResizeableWindow,"defaultProps",{baseZIndex:10,initialX:null,initialY:null,initialWidth:240,initialHeight:320,minWidth:50,minHeight:50,maxWidth:null,maxHeight:null,maximizeable:true,minimizeable:false,visible:true,dockable:true,onExternalWindowResized:function onExternalWindowResized(){},onGeometryChanged:function onGeometryChanged(){},externalWindow:null,usePortal:true});export default connect(function(state){return{windowStacking:state.windows.stacking,topbarHeight:state.windows.topbarHeight,bottombarHeight:state.windows.bottombarHeight,mapMargins:state.windows.mapMargins,menuMargins:state.windows.menuMargins}},{raiseWindow:raiseWindow,registerWindow:registerWindow,setSplitScreen:setSplitScreen,unregisterWindow:unregisterWindow})(ResizeableWindow);
|
package/components/SearchBox.js
CHANGED
|
@@ -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 classnames from"classnames";import isEmpty from"lodash.isempty";import pointInPolygon from"point-in-polygon";import polygonIntersectTest from"polygon-intersect-test";import PropTypes from"prop-types";import{createSelector}from"reselect";import{v1 as uuidv1}from"uuid";import{LayerRole,addLayerFeatures,addThemeSublayer,changeLayerProperty,removeLayer,addLayer}from"../actions/layers";import{logAction}from"../actions/logging";import{panTo,zoomToExtent,zoomToPoint}from"../actions/map";import{setCurrentSearchResult}from"../actions/search";import{setCurrentTask}from"../actions/task";import{setCurrentTheme}from"../actions/theme";import{openExternalUrl,showNotification}from"../actions/windows";import searchProvidersSelector from"../selectors/searchproviders";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{UrlParams}from"../utils/PermaLinkUtils";import{FulltextSearch,SearchResultType}from"../utils/SearchProviders";import VectorLayerUtils from"../utils/VectorLayerUtils";import Icon from"./Icon";import MapSelection from"./MapSelection";import ButtonBar from"./widgets/ButtonBar";import ComboBox from"./widgets/ComboBox";import InputContainer from"./widgets/InputContainer";import NumberInput from"./widgets/NumberInput";import Spinner from"./widgets/Spinner";import"./style/SearchBox.css";var SearchBox=/*#__PURE__*/function(_React$Component){function SearchBox(props){var _this;_classCallCheck(this,SearchBox);_this=_callSuper(this,SearchBox,[props]);_defineProperty(_this,"state",{searchText:"",searchSession:null,pendingSearches:[],recentSearches:[],searchResults:{},resultsVisible:false,collapsedSections:{},expandedLayerGroup:null,activeLayerInfo:null,filterOptionsVisible:false,selectedProvider:"",filterRegionName:"",filterGeomType:null,filterGeometry:null});_defineProperty(_this,"renderFilterOptions",function(){var _this$state$filterGeo;if(!_this.state.filterOptionsVisible){return null}var providerSelection=/*#__PURE__*/React.createElement(ComboBox,{onChange:function onChange(value){return _this.setState({selectedProvider:value})},value:_this.state.selectedProvider},/*#__PURE__*/React.createElement("div",{value:""},LocaleUtils.tr("search.all")),Object.entries(_this.props.searchProviders).map(function(_ref){var _prov$params,_prov$label;var _ref2=_slicedToArray(_ref,2),key=_ref2[0],prov=_ref2[1];return/*#__PURE__*/React.createElement("div",{key:key,value:key},(prov===null||prov===void 0||(_prov$params=prov.params)===null||_prov$params===void 0?void 0:_prov$params.title)||((_prov$label=prov.label)!==null&&_prov$label!==void 0?_prov$label:LocaleUtils.tr(prov.labelmsgid)))}));var searchRegionSelection=null;var searchRegions=ConfigUtils.getConfigProp("searchFilterRegions",_this.props.theme);if(!isEmpty(searchRegions)){searchRegionSelection=/*#__PURE__*/React.createElement(ComboBox,{onChange:function onChange(value){return _this.setFilterRegion(value,searchRegions)},value:_this.state.filterRegionName},/*#__PURE__*/React.createElement("div",{value:""},LocaleUtils.tr("search.none")),searchRegions.map(function(group,gidx){return[/*#__PURE__*/React.createElement("div",{"data-group-header":gidx,disabled:true,key:"group"+gidx},group.name)].concat(_toConsumableArray(group.items.map(function(item,idx){return/*#__PURE__*/React.createElement("div",{"data-group":gidx,key:item.name,value:gidx+":"+idx+":"+item.name},item.name)})))}))}var filterButtons=[{key:"Polygon",tooltip:LocaleUtils.tr("redlining.polygon"),icon:"polygon",label:LocaleUtils.tr("redlining.polygon")},{key:"Circle",tooltip:LocaleUtils.tr("redlining.circle"),icon:"circle",label:LocaleUtils.tr("redlining.circle")}];return/*#__PURE__*/React.createElement("div",{className:"searchbox-filter-options"},/*#__PURE__*/React.createElement("table",null,/*#__PURE__*/React.createElement("tbody",null,/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",null,LocaleUtils.tr("search.providerselection"),":"),/*#__PURE__*/React.createElement("td",null,providerSelection)),/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",null,LocaleUtils.tr("search.limittoarea"),":"),/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement("div",{className:"searchbox-filter-options-geometry controlgroup"},/*#__PURE__*/React.createElement(ButtonBar,{active:_this.state.filterGeomType,buttons:filterButtons,onClick:_this.setFilterGeomType}),searchRegionSelection,/*#__PURE__*/React.createElement("button",{className:"button",onClick:_this.clearFilter,title:LocaleUtils.tr("search.clearfilter")},/*#__PURE__*/React.createElement(Icon,{icon:"clear"}))))),_this.state.filterGeomType==="Circle"?/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",null,LocaleUtils.tr("search.circleradius"),":"),/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement(NumberInput,{disabled:!_this.state.filterGeometry,min:1,mobile:true,onChange:_this.setCircleRadius,suffix:" m",value:((_this$state$filterGeo=_this.state.filterGeometry)===null||_this$state$filterGeo===void 0?void 0:_this$state$filterGeo.radius)||0}))):null)))});_defineProperty(_this,"setFilterGeomType",function(geomType){_this.setState({filterGeomType:geomType,filterRegionName:"",filterGeometry:null})});_defineProperty(_this,"setFilterRegion",function(value,searchRegions){if(value){var parts=value.split(":");var item=searchRegions[parts[0]].items[parts[1]];var geometry={type:"Polygon",coordinates:[item.coordinates]};var mapGeometry=VectorLayerUtils.reprojectGeometry(geometry,item.crs,_this.props.map.projection);_this.setState({filterGeomType:null,filterRegionName:value,filterGeometry:mapGeometry})}else{_this.setState({filterGeomType:null,filterRegionName:"",filterGeometry:null})}});_defineProperty(_this,"setCircleRadius",function(value){_this.setState(function(state){return{filterGeometry:_objectSpread(_objectSpread({},state.filterGeometry),{},{radius:value})}})});_defineProperty(_this,"clearFilter",function(){_this.setState({filterGeomType:null,filterRegionName:"",filterGeometry:null})});_defineProperty(_this,"renderResultsMenu",function(){if(!_this.state.resultsVisible){return false}var children=[_this.renderRecentResults(),_this.renderFilters(),_this.renderResults()];children=children.filter(function(child){return!isEmpty(child)});if(isEmpty(children)){if(isEmpty(_this.state.pendingSearches)&&_this.state.searchResults.query_text){children=/*#__PURE__*/React.createElement("div",{className:"searchbox-noresults"},LocaleUtils.tr("search.noresults"))}else{return null}}return/*#__PURE__*/React.createElement("div",{className:"searchbox-results",onMouseDown:_this.setPreventBlur,ref:MiscUtils.setupKillTouchEvents},children)});_defineProperty(_this,"renderRecentResults",function(){var recentSearches=_this.state.recentSearches.filter(function(entry){return entry.toLowerCase().includes(_this.state.searchText.toLowerCase())});if(isEmpty(recentSearches)||recentSearches.length===1&&recentSearches[0].toLowerCase()===_this.state.searchText.toLowerCase()){return null}return/*#__PURE__*/React.createElement("div",{key:"recent"},/*#__PURE__*/React.createElement("div",{className:"searchbox-results-section-title",onClick:function onClick(){return _this.toggleSection("recent")},onMouseDown:MiscUtils.killEvent},/*#__PURE__*/React.createElement(Icon,{icon:_this.isCollapsed("recent")?"expand":"collapse"}),LocaleUtils.tr("search.recent")),!_this.isCollapsed("recent")?/*#__PURE__*/React.createElement("div",{className:"searchbox-results-section-body"},recentSearches.map(function(entry,idx){return/*#__PURE__*/React.createElement("div",{className:"searchbox-result",key:"r"+idx,onClick:function onClick(){return _this.searchTextChanged(entry)},onMouseDown:MiscUtils.killEvent},entry)})):null)});_defineProperty(_this,"renderFilters",function(){return Object.entries(_this.state.searchResults).map(function(_ref3){var _ref4=_slicedToArray(_ref3,2),provider=_ref4[0],results=_ref4[1];if(isEmpty(results.result_counts)||results.result_counts.length<2){return null}var collapsed=_this.isCollapsed("filter",false);var values=results.result_counts.map(function(entry){return entry.filterword+": "+_this.state.searchResults.query_text});values.sort(function(a,b){return a.localeCompare(b)});return/*#__PURE__*/React.createElement("div",{key:"filter"},/*#__PURE__*/React.createElement("div",{className:"searchbox-results-section-title",onClick:function onClick(){return _this.toggleSection("filter")},onMouseDown:MiscUtils.killEvent},/*#__PURE__*/React.createElement(Icon,{icon:collapsed?"expand":"collapse"}),LocaleUtils.tr("search.filter")),!collapsed?/*#__PURE__*/React.createElement("div",{className:"searchbox-results-section-body"},values.map(function(value,idx){return/*#__PURE__*/React.createElement("div",{className:"searchbox-result",key:"f"+idx,onClick:function onClick(){return _this.searchTextChanged(value,true,provider)},onMouseDown:MiscUtils.killEvent},/*#__PURE__*/React.createElement("span",{className:"searchbox-result-label"},value))})):null)}).filter(Boolean)});_defineProperty(_this,"renderResults",function(){var resultRenderers=_defineProperty(_defineProperty(_defineProperty({},SearchResultType.PLACE,_this.renderPlaceResult),SearchResultType.THEMELAYER,_this.renderThemeLayerResult),SearchResultType.THEME,_this.renderThemeResult);var layersBeforePlaces=_this.props.searchOptions.showLayerResultsBeforePlaces;var priorities=_defineProperty(_defineProperty(_defineProperty({},SearchResultType.PLACE,layersBeforePlaces?0:2),SearchResultType.THEMELAYER,layersBeforePlaces?2:1),SearchResultType.THEME,layersBeforePlaces?1:0);var results=Object.keys(_this.props.searchProviders).reduce(function(result,provider){if(!_this.state.searchResults[provider]){return result}return result.concat(_this.state.searchResults[provider].results.map(function(group){var _group$type,_group$type2,_group$title,_group$title2;var sectionId=provider+":"+group.id;var moreLabel=null;if(group.resultCount>0&&group.resultCount>group.items.length){moreLabel=LocaleUtils.tr("search.more",group.resultCount-group.items.length)}else if(group.resultCount===-1){moreLabel=LocaleUtils.tr("search.unknownmore")}if(group.items.length===0){return null}var renderer=resultRenderers[(_group$type=group.type)!==null&&_group$type!==void 0?_group$type:SearchResultType.PLACE];if(!renderer){return null}var priority=priorities[(_group$type2=group.type)!==null&&_group$type2!==void 0?_group$type2:SearchResultType.PLACE];return{priority:priority*1000000+(group.priority||0),title:(_group$title=group.title)!==null&&_group$title!==void 0?_group$title:LocaleUtils.tr(group.titlemsgid),tree:/*#__PURE__*/React.createElement("div",{key:sectionId},/*#__PURE__*/React.createElement("div",{className:"searchbox-results-section-title",onClick:function onClick(){return _this.toggleSection(sectionId)},onMouseDown:MiscUtils.killEvent},/*#__PURE__*/React.createElement(Icon,{icon:_this.isCollapsed(sectionId)?"expand":"collapse"}),/*#__PURE__*/React.createElement("span",null,(_group$title2=group.title)!==null&&_group$title2!==void 0?_group$title2:LocaleUtils.tr(group.titlemsgid))),!_this.isCollapsed(sectionId)?/*#__PURE__*/React.createElement("div",{className:"searchbox-results-section-body"},group.items.map(function(entry){return renderer(provider,group,entry)}),moreLabel?/*#__PURE__*/React.createElement("div",{className:"searchbox-more-results"},moreLabel):null):null)}}))},[]).filter(Boolean);results.sort(function(a,b){if(b.priority!==a.priority){return b.priority-a.priority}else{return b.title.localeCompare(a.title)}});return isEmpty(results)?null:results.map(function(entry){return entry.tree})});_defineProperty(_this,"renderPlaceResult",function(provider,group,result){var _result$label;var key=provider+":"+group.id+":"+result.id;return/*#__PURE__*/React.createElement("div",{className:"searchbox-result",key:key,onClick:function onClick(){_this.selectPlaceResult(provider,group,result);_this.blur()},onMouseDown:MiscUtils.killEvent},result.thumbnail?/*#__PURE__*/React.createElement("img",{className:"searchbox-result-thumbnail",onError:function onError(ev){return _this.loadFallbackResultImage(ev,result)},src:result.thumbnail}):null,/*#__PURE__*/React.createElement("span",{className:"searchbox-result-label",dangerouslySetInnerHTML:{__html:result.text.replace(/<br\s*\/>/ig," ")},title:(_result$label=result.label)!==null&&_result$label!==void 0?_result$label:result.text}),result.externalLink?/*#__PURE__*/React.createElement(Icon,{icon:"info-sign",onClick:function onClick(ev){var _result$label2;MiscUtils.killEvent(ev);_this.openUrl(result.externalLink,result.target,(_result$label2=result.label)!==null&&_result$label2!==void 0?_result$label2:result.text)}}):null)});_defineProperty(_this,"renderThemeLayerResult",function(provider,group,result){var _result$label3,_result$layer;var parent=arguments.length>3&&arguments[3]!==undefined?arguments[3]:null;var key=provider+":"+group.id+":"+result.id;var addThemes=ConfigUtils.getConfigProp("allowAddingOtherThemes",_this.props.theme);var icon=null;if(result.sublayers){var toggleLayerGroup=function toggleLayerGroup(){_this.setState(function(state){return{expandedLayerGroup:state.expandedLayerGroup===key?null:key}})};icon=/*#__PURE__*/React.createElement(Icon,{className:"searchbox-result-thumbnail",icon:_this.state.expandedLayerGroup===key?"minus":"plus",onClick:function onClick(ev){MiscUtils.killEvent(ev);toggleLayerGroup()}})}else if(result.thumbnail){icon=/*#__PURE__*/React.createElement("img",{className:"searchbox-result-thumbnail",onError:function onError(ev){return _this.loadFallbackResultImage(ev,result)},src:result.thumbnail})}var selectResult=result.theme?_this.selectThemeResult:_this.selectThemeLayerResult;return/*#__PURE__*/React.createElement("div",{key:key},/*#__PURE__*/React.createElement("div",{className:"searchbox-result",onClick:function onClick(){selectResult(provider,group,result);_this.blur()},onMouseDown:MiscUtils.killEvent},icon,result.theme?/*#__PURE__*/React.createElement(Icon,{className:"searchbox-result-openicon",icon:"open"}):null,/*#__PURE__*/React.createElement("span",{className:"searchbox-result-label",dangerouslySetInnerHTML:{__html:result.text.replace(/<br\s*\/>/ig," ")},title:(_result$label3=result.label)!==null&&_result$label3!==void 0?_result$label3:result.text}),result.theme&&addThemes?/*#__PURE__*/React.createElement(Icon,{icon:"plus",onClick:function onClick(ev){MiscUtils.killEvent(ev);_this.selectThemeLayerResult(provider,group,result);_this.blur()},title:LocaleUtils.tr("themeswitcher.addtotheme")}):null,result.info?/*#__PURE__*/React.createElement(Icon,{icon:"info-sign",onClick:function onClick(ev){MiscUtils.killEvent(ev);_this.toggleLayerInfo(provider,group,result,key,parent)}}):null),_this.state.activeLayerInfo===key?/*#__PURE__*/React.createElement("div",{className:"searchbox-result-abstract",dangerouslySetInnerHTML:{__html:MiscUtils.addLinkAnchors(((_result$layer=result.layer)===null||_result$layer===void 0?void 0:_result$layer["abstract"])||"")||LocaleUtils.tr("search.nodescription")}}):null,_this.state.expandedLayerGroup===key?/*#__PURE__*/React.createElement("div",{className:"searchbox-result-group"},result.sublayers.map(function(sublayer){return _this.renderThemeLayerResult(provider,group,sublayer,result.id)})):null)});_defineProperty(_this,"renderThemeResult",function(provider,group,result){var _result$label4;var addThemes=ConfigUtils.getConfigProp("allowAddingOtherThemes",_this.props.theme);return/*#__PURE__*/React.createElement("div",{className:"searchbox-result",key:provider+":"+group.id+":"+result.id,onClick:function onClick(){_this.selectThemeResult(provider,group,result);_this.blur()},onMouseDown:MiscUtils.killEvent},result.thumbnail?/*#__PURE__*/React.createElement("img",{className:"searchbox-result-thumbnail",onError:function onError(ev){return _this.loadFallbackResultImage(ev,result)},src:result.thumbnail}):null,/*#__PURE__*/React.createElement(Icon,{className:"searchbox-result-openicon",icon:"open"}),/*#__PURE__*/React.createElement("span",{className:"searchbox-result-label",dangerouslySetInnerHTML:{__html:result.text.replace(/<br\s*\/>/ig," ")},title:(_result$label4=result.label)!==null&&_result$label4!==void 0?_result$label4:result.text}),result.theme&&addThemes?/*#__PURE__*/React.createElement(Icon,{icon:"plus",onClick:function onClick(ev){MiscUtils.killEvent(ev);_this.addThemeLayers(result.layer);_this.blur()},title:LocaleUtils.tr("themeswitcher.addtotheme")}):null)});_defineProperty(_this,"selectPlaceResult",function(provider,group,result){var resultText=result.text.replace(/<\/?\w+\s*\/?>/g,"");if(_this.props.searchOptions.showResultInSearchText!==false){// Show selected result text in search field
|
|
7
|
+
*/import React from"react";import{connect}from"react-redux";import axios from"axios";import classnames from"classnames";import DOMPurify from"dompurify";import isEmpty from"lodash.isempty";import pointInPolygon from"point-in-polygon";import polygonIntersectTest from"polygon-intersect-test";import PropTypes from"prop-types";import{createSelector}from"reselect";import{v1 as uuidv1}from"uuid";import{LayerRole,addLayerFeatures,addThemeSublayer,changeLayerProperty,removeLayer,addLayer}from"../actions/layers";import{logAction}from"../actions/logging";import{panTo,zoomToExtent,zoomToPoint}from"../actions/map";import{setCurrentSearchResult}from"../actions/search";import{setCurrentTask}from"../actions/task";import{setCurrentTheme}from"../actions/theme";import{openExternalUrl,showNotification}from"../actions/windows";import searchProvidersSelector from"../selectors/searchproviders";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{UrlParams}from"../utils/PermaLinkUtils";import{FulltextSearch,SearchResultType}from"../utils/SearchProviders";import VectorLayerUtils from"../utils/VectorLayerUtils";import Icon from"./Icon";import MapSelection from"./MapSelection";import ButtonBar from"./widgets/ButtonBar";import ComboBox from"./widgets/ComboBox";import InputContainer from"./widgets/InputContainer";import NumberInput from"./widgets/NumberInput";import Spinner from"./widgets/Spinner";import"./style/SearchBox.css";var SearchBox=/*#__PURE__*/function(_React$Component){function SearchBox(props){var _this;_classCallCheck(this,SearchBox);_this=_callSuper(this,SearchBox,[props]);_defineProperty(_this,"state",{searchText:"",searchSession:null,pendingSearches:[],recentSearches:[],searchResults:{},resultsVisible:false,collapsedSections:{},expandedLayerGroup:null,activeLayerInfo:null,filterOptionsVisible:false,selectedProvider:"",filterRegionName:"",filterGeomType:null,filterGeometry:null});_defineProperty(_this,"renderFilterOptions",function(){var _this$state$filterGeo;if(!_this.state.filterOptionsVisible){return null}var providerSelection=/*#__PURE__*/React.createElement(ComboBox,{onChange:function onChange(value){return _this.setState({selectedProvider:value})},value:_this.state.selectedProvider},/*#__PURE__*/React.createElement("div",{value:""},LocaleUtils.tr("search.all")),Object.entries(_this.props.searchProviders).map(function(_ref){var _prov$params,_prov$label;var _ref2=_slicedToArray(_ref,2),key=_ref2[0],prov=_ref2[1];return/*#__PURE__*/React.createElement("div",{key:key,value:key},(prov===null||prov===void 0||(_prov$params=prov.params)===null||_prov$params===void 0?void 0:_prov$params.title)||((_prov$label=prov.label)!==null&&_prov$label!==void 0?_prov$label:LocaleUtils.tr(prov.labelmsgid)))}));var searchRegionSelection=null;var searchRegions=ConfigUtils.getConfigProp("searchFilterRegions",_this.props.theme);if(!isEmpty(searchRegions)){searchRegionSelection=/*#__PURE__*/React.createElement(ComboBox,{onChange:function onChange(value){return _this.setFilterRegion(value,searchRegions)},value:_this.state.filterRegionName},/*#__PURE__*/React.createElement("div",{value:""},LocaleUtils.tr("search.none")),searchRegions.map(function(group,gidx){return[/*#__PURE__*/React.createElement("div",{"data-group-header":gidx,disabled:true,key:"group"+gidx},group.name)].concat(_toConsumableArray(group.items.map(function(item,idx){return/*#__PURE__*/React.createElement("div",{"data-group":gidx,key:item.name,value:gidx+":"+idx+":"+item.name},item.name)})))}))}var filterButtons=[{key:"Polygon",tooltip:LocaleUtils.tr("redlining.polygon"),icon:"polygon",label:LocaleUtils.tr("redlining.polygon")},{key:"Circle",tooltip:LocaleUtils.tr("redlining.circle"),icon:"circle",label:LocaleUtils.tr("redlining.circle")}];return/*#__PURE__*/React.createElement("div",{className:"searchbox-filter-options"},/*#__PURE__*/React.createElement("table",null,/*#__PURE__*/React.createElement("tbody",null,/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",null,LocaleUtils.tr("search.providerselection"),":"),/*#__PURE__*/React.createElement("td",null,providerSelection)),/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",null,LocaleUtils.tr("search.limittoarea"),":"),/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement("div",{className:"searchbox-filter-options-geometry controlgroup"},/*#__PURE__*/React.createElement(ButtonBar,{active:_this.state.filterGeomType,buttons:filterButtons,onClick:_this.setFilterGeomType}),searchRegionSelection,/*#__PURE__*/React.createElement("button",{className:"button",onClick:_this.clearFilter,title:LocaleUtils.tr("search.clearfilter")},/*#__PURE__*/React.createElement(Icon,{icon:"clear"}))))),_this.state.filterGeomType==="Circle"?/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",null,LocaleUtils.tr("search.circleradius"),":"),/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement(NumberInput,{disabled:!_this.state.filterGeometry,min:1,mobile:true,onChange:_this.setCircleRadius,suffix:" m",value:((_this$state$filterGeo=_this.state.filterGeometry)===null||_this$state$filterGeo===void 0?void 0:_this$state$filterGeo.radius)||0}))):null)))});_defineProperty(_this,"setFilterGeomType",function(geomType){_this.setState({filterGeomType:geomType,filterRegionName:"",filterGeometry:null})});_defineProperty(_this,"setFilterRegion",function(value,searchRegions){if(value){var parts=value.split(":");var item=searchRegions[parts[0]].items[parts[1]];var geometry={type:"Polygon",coordinates:[item.coordinates]};var mapGeometry=VectorLayerUtils.reprojectGeometry(geometry,item.crs,_this.props.map.projection);_this.setState({filterGeomType:null,filterRegionName:value,filterGeometry:mapGeometry})}else{_this.setState({filterGeomType:null,filterRegionName:"",filterGeometry:null})}});_defineProperty(_this,"setCircleRadius",function(value){_this.setState(function(state){return{filterGeometry:_objectSpread(_objectSpread({},state.filterGeometry),{},{radius:value})}})});_defineProperty(_this,"clearFilter",function(){_this.setState({filterGeomType:null,filterRegionName:"",filterGeometry:null})});_defineProperty(_this,"renderResultsMenu",function(){if(!_this.state.resultsVisible){return false}var children=[_this.renderRecentResults(),_this.renderFilters(),_this.renderResults()];children=children.filter(function(child){return!isEmpty(child)});if(isEmpty(children)){if(isEmpty(_this.state.pendingSearches)&&_this.state.searchResults.query_text){children=/*#__PURE__*/React.createElement("div",{className:"searchbox-noresults"},LocaleUtils.tr("search.noresults"))}else{return null}}return/*#__PURE__*/React.createElement("div",{className:"searchbox-results",onMouseDown:_this.setPreventBlur,ref:MiscUtils.setupKillTouchEvents},children)});_defineProperty(_this,"renderRecentResults",function(){var recentSearches=_this.state.recentSearches.filter(function(entry){return entry.toLowerCase().includes(_this.state.searchText.toLowerCase())});if(isEmpty(recentSearches)||recentSearches.length===1&&recentSearches[0].toLowerCase()===_this.state.searchText.toLowerCase()){return null}return/*#__PURE__*/React.createElement("div",{key:"recent"},/*#__PURE__*/React.createElement("div",{className:"searchbox-results-section-title",onClick:function onClick(){return _this.toggleSection("recent")},onMouseDown:MiscUtils.killEvent},/*#__PURE__*/React.createElement(Icon,{icon:_this.isCollapsed("recent")?"expand":"collapse"}),LocaleUtils.tr("search.recent")),!_this.isCollapsed("recent")?/*#__PURE__*/React.createElement("div",{className:"searchbox-results-section-body"},recentSearches.map(function(entry,idx){return/*#__PURE__*/React.createElement("div",{className:"searchbox-result",key:"r"+idx,onClick:function onClick(){return _this.searchTextChanged(entry)},onMouseDown:MiscUtils.killEvent},entry)})):null)});_defineProperty(_this,"renderFilters",function(){return Object.entries(_this.state.searchResults).map(function(_ref3){var _ref4=_slicedToArray(_ref3,2),provider=_ref4[0],results=_ref4[1];if(isEmpty(results.result_counts)||results.result_counts.length<2){return null}var collapsed=_this.isCollapsed("filter",false);var values=results.result_counts.map(function(entry){return entry.filterword+": "+_this.state.searchResults.query_text});values.sort(function(a,b){return a.localeCompare(b)});return/*#__PURE__*/React.createElement("div",{key:"filter"},/*#__PURE__*/React.createElement("div",{className:"searchbox-results-section-title",onClick:function onClick(){return _this.toggleSection("filter")},onMouseDown:MiscUtils.killEvent},/*#__PURE__*/React.createElement(Icon,{icon:collapsed?"expand":"collapse"}),LocaleUtils.tr("search.filter")),!collapsed?/*#__PURE__*/React.createElement("div",{className:"searchbox-results-section-body"},values.map(function(value,idx){return/*#__PURE__*/React.createElement("div",{className:"searchbox-result",key:"f"+idx,onClick:function onClick(){return _this.searchTextChanged(value,true,provider)},onMouseDown:MiscUtils.killEvent},/*#__PURE__*/React.createElement("span",{className:"searchbox-result-label"},value))})):null)}).filter(Boolean)});_defineProperty(_this,"renderResults",function(){var resultRenderers=_defineProperty(_defineProperty(_defineProperty({},SearchResultType.PLACE,_this.renderPlaceResult),SearchResultType.THEMELAYER,_this.renderThemeLayerResult),SearchResultType.THEME,_this.renderThemeResult);var layersBeforePlaces=_this.props.searchOptions.showLayerResultsBeforePlaces;var priorities=_defineProperty(_defineProperty(_defineProperty({},SearchResultType.PLACE,layersBeforePlaces?0:2),SearchResultType.THEMELAYER,layersBeforePlaces?2:1),SearchResultType.THEME,layersBeforePlaces?1:0);var results=Object.keys(_this.props.searchProviders).reduce(function(result,provider){if(!_this.state.searchResults[provider]){return result}return result.concat(_this.state.searchResults[provider].results.map(function(group){var _group$type,_group$type2,_group$title,_group$title2;var sectionId=provider+":"+group.id;var moreLabel=null;if(group.resultCount>0&&group.resultCount>group.items.length){moreLabel=LocaleUtils.tr("search.more",group.resultCount-group.items.length)}else if(group.resultCount===-1){moreLabel=LocaleUtils.tr("search.unknownmore")}if(group.items.length===0){return null}var renderer=resultRenderers[(_group$type=group.type)!==null&&_group$type!==void 0?_group$type:SearchResultType.PLACE];if(!renderer){return null}var priority=priorities[(_group$type2=group.type)!==null&&_group$type2!==void 0?_group$type2:SearchResultType.PLACE];return{priority:priority*1000000+(group.priority||0),title:(_group$title=group.title)!==null&&_group$title!==void 0?_group$title:LocaleUtils.tr(group.titlemsgid),tree:/*#__PURE__*/React.createElement("div",{key:sectionId},/*#__PURE__*/React.createElement("div",{className:"searchbox-results-section-title",onClick:function onClick(){return _this.toggleSection(sectionId)},onMouseDown:MiscUtils.killEvent},/*#__PURE__*/React.createElement(Icon,{icon:_this.isCollapsed(sectionId)?"expand":"collapse"}),/*#__PURE__*/React.createElement("span",null,(_group$title2=group.title)!==null&&_group$title2!==void 0?_group$title2:LocaleUtils.tr(group.titlemsgid))),!_this.isCollapsed(sectionId)?/*#__PURE__*/React.createElement("div",{className:"searchbox-results-section-body"},group.items.map(function(entry){return renderer(provider,group,entry)}),moreLabel?/*#__PURE__*/React.createElement("div",{className:"searchbox-more-results"},moreLabel):null):null)}}))},[]).filter(Boolean);results.sort(function(a,b){if(b.priority!==a.priority){return b.priority-a.priority}else{return b.title.localeCompare(a.title)}});return isEmpty(results)?null:results.map(function(entry){return entry.tree})});_defineProperty(_this,"renderPlaceResult",function(provider,group,result){var _result$label;var key=provider+":"+group.id+":"+result.id;return/*#__PURE__*/React.createElement("div",{className:"searchbox-result",key:key,onClick:function onClick(){_this.selectPlaceResult(provider,group,result);_this.blur()},onMouseDown:MiscUtils.killEvent},result.thumbnail?/*#__PURE__*/React.createElement("img",{className:"searchbox-result-thumbnail",onError:function onError(ev){return _this.loadFallbackResultImage(ev,result)},src:result.thumbnail}):null,/*#__PURE__*/React.createElement("span",{className:"searchbox-result-label",dangerouslySetInnerHTML:{__html:DOMPurify.sanitize(result.text).replace(/<br\s*\/>/ig," ")},title:(_result$label=result.label)!==null&&_result$label!==void 0?_result$label:result.text}),result.externalLink?/*#__PURE__*/React.createElement(Icon,{icon:"info-sign",onClick:function onClick(ev){var _result$label2;MiscUtils.killEvent(ev);_this.openUrl(result.externalLink,result.target,(_result$label2=result.label)!==null&&_result$label2!==void 0?_result$label2:result.text)}}):null)});_defineProperty(_this,"renderThemeLayerResult",function(provider,group,result){var _result$label3,_result$layer;var parent=arguments.length>3&&arguments[3]!==undefined?arguments[3]:null;var key=provider+":"+group.id+":"+result.id;var addThemes=ConfigUtils.getConfigProp("allowAddingOtherThemes",_this.props.theme);var icon=null;if(result.sublayers){var toggleLayerGroup=function toggleLayerGroup(){_this.setState(function(state){return{expandedLayerGroup:state.expandedLayerGroup===key?null:key}})};icon=/*#__PURE__*/React.createElement(Icon,{className:"searchbox-result-thumbnail",icon:_this.state.expandedLayerGroup===key?"minus":"plus",onClick:function onClick(ev){MiscUtils.killEvent(ev);toggleLayerGroup()}})}else if(result.thumbnail){icon=/*#__PURE__*/React.createElement("img",{className:"searchbox-result-thumbnail",onError:function onError(ev){return _this.loadFallbackResultImage(ev,result)},src:result.thumbnail})}var selectResult=result.theme?_this.selectThemeResult:_this.selectThemeLayerResult;return/*#__PURE__*/React.createElement("div",{key:key},/*#__PURE__*/React.createElement("div",{className:"searchbox-result",onClick:function onClick(){selectResult(provider,group,result);_this.blur()},onMouseDown:MiscUtils.killEvent},icon,result.theme?/*#__PURE__*/React.createElement(Icon,{className:"searchbox-result-openicon",icon:"open"}):null,/*#__PURE__*/React.createElement("span",{className:"searchbox-result-label",dangerouslySetInnerHTML:{__html:DOMPurify.sanitize(result.text).replace(/<br\s*\/>/ig," ")},title:(_result$label3=result.label)!==null&&_result$label3!==void 0?_result$label3:result.text}),result.theme&&addThemes?/*#__PURE__*/React.createElement(Icon,{icon:"plus",onClick:function onClick(ev){MiscUtils.killEvent(ev);_this.selectThemeLayerResult(provider,group,result);_this.blur()},title:LocaleUtils.tr("themeswitcher.addtotheme")}):null,result.info?/*#__PURE__*/React.createElement(Icon,{icon:"info-sign",onClick:function onClick(ev){MiscUtils.killEvent(ev);_this.toggleLayerInfo(provider,group,result,key,parent)}}):null),_this.state.activeLayerInfo===key?/*#__PURE__*/React.createElement("div",{className:"searchbox-result-abstract",dangerouslySetInnerHTML:{__html:MiscUtils.addLinkAnchors(DOMPurify.sanitize(((_result$layer=result.layer)===null||_result$layer===void 0?void 0:_result$layer["abstract"])||""))||LocaleUtils.tr("search.nodescription")}}):null,_this.state.expandedLayerGroup===key?/*#__PURE__*/React.createElement("div",{className:"searchbox-result-group"},result.sublayers.map(function(sublayer){return _this.renderThemeLayerResult(provider,group,sublayer,result.id)})):null)});_defineProperty(_this,"renderThemeResult",function(provider,group,result){var _result$label4;var addThemes=ConfigUtils.getConfigProp("allowAddingOtherThemes",_this.props.theme);return/*#__PURE__*/React.createElement("div",{className:"searchbox-result",key:provider+":"+group.id+":"+result.id,onClick:function onClick(){_this.selectThemeResult(provider,group,result);_this.blur()},onMouseDown:MiscUtils.killEvent},result.thumbnail?/*#__PURE__*/React.createElement("img",{className:"searchbox-result-thumbnail",onError:function onError(ev){return _this.loadFallbackResultImage(ev,result)},src:result.thumbnail}):null,/*#__PURE__*/React.createElement(Icon,{className:"searchbox-result-openicon",icon:"open"}),/*#__PURE__*/React.createElement("span",{className:"searchbox-result-label",dangerouslySetInnerHTML:{__html:DOMPurify.sanitize(result.text).replace(/<br\s*\/>/ig," ")},title:(_result$label4=result.label)!==null&&_result$label4!==void 0?_result$label4:result.text}),result.theme&&addThemes?/*#__PURE__*/React.createElement(Icon,{icon:"plus",onClick:function onClick(ev){MiscUtils.killEvent(ev);_this.addThemeLayers(result.layer);_this.blur()},title:LocaleUtils.tr("themeswitcher.addtotheme")}):null)});_defineProperty(_this,"selectPlaceResult",function(provider,group,result){var resultText=result.text.replace(/<\/?\w+\s*\/?>/g,"");if(_this.props.searchOptions.showResultInSearchText!==false){// Show selected result text in search field
|
|
8
8
|
_this.setState({searchText:resultText,searchResults:_defineProperty({query_text:resultText},provider,{results:[_objectSpread(_objectSpread({},group),{},{items:[result]})],tot_result_count:1})})}_this.updateRecentSearches();if(result.geometry){_this.showResultGeometry(result,{feature:{type:"Feature",geometry:result.geometry},crs:result.crs})}else if(_this.props.searchProviders[provider].getResultGeometry){_this.props.searchProviders[provider].getResultGeometry(result,function(response){_this.showResultGeometry(result,response)},axios)}else{// Display marker
|
|
9
9
|
_this.showResultGeometry(result,{feature:{type:"Feature",geometry:{type:"Point",coordinates:[result.x,result.y]}},crs:result.crs})}if(result.dataproduct_id){var quot=typeof result.id==="string"?"\"":"";var filter="[[\"".concat(result.id_field_name,"\",\"=\", ").concat(quot).concat(result.id).concat(quot,"]]");UrlParams.updateParams({hp:result.dataproduct_id,hf:filter,st:resultText})}else{UrlParams.updateParams({hp:undefined,hf:undefined,st:resultText})}_this.props.logAction("SEARCH_TEXT",{searchText:_this.state.searchText});_this.props.logAction("SEARCH_RESULT_SELECTED",{place:resultText});// Enable layer
|
|
10
10
|
if(result.layername){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,"both")}}});_defineProperty(_this,"selectThemeLayerResult",function(provider,group,result){if(result.layer){if(result.theme){_this.addThemeLayers(result.layer)}else{_this.props.addThemeSublayer(result.layer)}// Show layer tree to notify user that something has happened
|
|
@@ -4,4 +4,4 @@ function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof
|
|
|
4
4
|
*
|
|
5
5
|
* This source code is licensed under the BSD-style license found in the
|
|
6
6
|
* LICENSE file in the root directory of this source tree.
|
|
7
|
-
*/import React from"react";import{connect}from"react-redux";import PropTypes from"prop-types";import{setActiveServiceInfo}from"../actions/serviceinfo";import ResizeableWindow from"../components/ResizeableWindow";import LocaleUtils from"../utils/LocaleUtils";import MiscUtils from"../utils/MiscUtils";import"./style/ServiceInfoWindow.css";var ServiceInfoWindow=/*#__PURE__*/function(_React$Component){function ServiceInfoWindow(){var _this;_classCallCheck(this,ServiceInfoWindow);for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++){args[_key]=arguments[_key]}_this=_callSuper(this,ServiceInfoWindow,[].concat(args));_defineProperty(_this,"renderRow",function(title,content){var html=arguments.length>2&&arguments[2]!==undefined?arguments[2]:false;if(content){return/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",null,title,":"),html?/*#__PURE__*/React.createElement("td",{dangerouslySetInnerHTML:{__html:MiscUtils.addLinkAnchors(content)}}):/*#__PURE__*/React.createElement("td",null,content))}return null});_defineProperty(_this,"onClose",function(){_this.props.setActiveServiceInfo(null)});return _this}_inherits(ServiceInfoWindow,_React$Component);return _createClass(ServiceInfoWindow,[{key:"renderLink",value:function renderLink(text,url){if(url){return/*#__PURE__*/React.createElement("a",{href:url,rel:"noreferrer",target:"_blank"},text)}else if(text){return text}return null}},{key:"render",value:function render(){var _this$props$service$c,_this$props$service$c2,_this$props$service$c3,_this$props$service$c4,_this$props$service$c5;if(!this.props.service){return null}return/*#__PURE__*/React.createElement(ResizeableWindow,{icon:"info-sign",initialHeight:this.props.layerInfoGeometry.initialHeight,initialWidth:this.props.layerInfoGeometry.initialWidth,initialX:this.props.layerInfoGeometry.initialX,initialY:this.props.layerInfoGeometry.initialY,initiallyDocked:this.props.layerInfoGeometry.initiallyDocked,onClose:this.onClose,title:LocaleUtils.tr("serviceinfo.title")},/*#__PURE__*/React.createElement("div",{className:"service-info-window-body",role:"body"},/*#__PURE__*/React.createElement("h4",{className:"service-info-window-title"},this.props.service.title),/*#__PURE__*/React.createElement("div",{className:"service-info-window-frame"},/*#__PURE__*/React.createElement("table",{className:"service-info-window-table"},/*#__PURE__*/React.createElement("tbody",null,this.renderRow(LocaleUtils.tr("serviceinfo.abstract"),this.props.service["abstract"],true),this.renderRow(LocaleUtils.tr("serviceinfo.keywords"),this.props.service.keywords),this.renderRow(LocaleUtils.tr("serviceinfo.onlineResource"),this.renderLink(this.props.service.onlineResource,this.props.service.onlineResource)),this.renderRow(LocaleUtils.tr("serviceinfo.contactPerson"),(_this$props$service$c=this.props.service.contact)===null||_this$props$service$c===void 0?void 0:_this$props$service$c.person),this.renderRow(LocaleUtils.tr("serviceinfo.contactOrganization"),(_this$props$service$c2=this.props.service.contact)===null||_this$props$service$c2===void 0?void 0:_this$props$service$c2.organization),this.renderRow(LocaleUtils.tr("serviceinfo.contactPosition"),(_this$props$service$c3=this.props.service.contact)===null||_this$props$service$c3===void 0?void 0:_this$props$service$c3.position),this.renderRow(LocaleUtils.tr("serviceinfo.contactPhone"),(_this$props$service$c4=this.props.service.contact)===null||_this$props$service$c4===void 0?void 0:_this$props$service$c4.phone),this.renderRow(LocaleUtils.tr("serviceinfo.contactEmail"),(_this$props$service$c5=this.props.service.contact)===null||_this$props$service$c5===void 0?void 0:_this$props$service$c5.email))))))}}])}(React.Component);_defineProperty(ServiceInfoWindow,"propTypes",{layerInfoGeometry:PropTypes.object,service:PropTypes.object,setActiveServiceInfo:PropTypes.func});var selector=function selector(state){return{service:state.serviceinfo.service}};export default connect(selector,{setActiveServiceInfo:setActiveServiceInfo})(ServiceInfoWindow);
|
|
7
|
+
*/import React from"react";import{connect}from"react-redux";import DOMPurify from"dompurify";import PropTypes from"prop-types";import{setActiveServiceInfo}from"../actions/serviceinfo";import ResizeableWindow from"../components/ResizeableWindow";import LocaleUtils from"../utils/LocaleUtils";import MiscUtils from"../utils/MiscUtils";import"./style/ServiceInfoWindow.css";var ServiceInfoWindow=/*#__PURE__*/function(_React$Component){function ServiceInfoWindow(){var _this;_classCallCheck(this,ServiceInfoWindow);for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++){args[_key]=arguments[_key]}_this=_callSuper(this,ServiceInfoWindow,[].concat(args));_defineProperty(_this,"renderRow",function(title,content){var html=arguments.length>2&&arguments[2]!==undefined?arguments[2]:false;if(content){return/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",null,title,":"),html?/*#__PURE__*/React.createElement("td",{dangerouslySetInnerHTML:{__html:MiscUtils.addLinkAnchors(DOMPurify.sanitize(content))}}):/*#__PURE__*/React.createElement("td",null,content))}return null});_defineProperty(_this,"onClose",function(){_this.props.setActiveServiceInfo(null)});return _this}_inherits(ServiceInfoWindow,_React$Component);return _createClass(ServiceInfoWindow,[{key:"renderLink",value:function renderLink(text,url){if(url){return/*#__PURE__*/React.createElement("a",{href:url,rel:"noreferrer",target:"_blank"},text)}else if(text){return text}return null}},{key:"render",value:function render(){var _this$props$service$c,_this$props$service$c2,_this$props$service$c3,_this$props$service$c4,_this$props$service$c5;if(!this.props.service){return null}return/*#__PURE__*/React.createElement(ResizeableWindow,{icon:"info-sign",initialHeight:this.props.layerInfoGeometry.initialHeight,initialWidth:this.props.layerInfoGeometry.initialWidth,initialX:this.props.layerInfoGeometry.initialX,initialY:this.props.layerInfoGeometry.initialY,initiallyDocked:this.props.layerInfoGeometry.initiallyDocked,onClose:this.onClose,title:LocaleUtils.tr("serviceinfo.title")},/*#__PURE__*/React.createElement("div",{className:"service-info-window-body",role:"body"},/*#__PURE__*/React.createElement("h4",{className:"service-info-window-title"},this.props.service.title),/*#__PURE__*/React.createElement("div",{className:"service-info-window-frame"},/*#__PURE__*/React.createElement("table",{className:"service-info-window-table"},/*#__PURE__*/React.createElement("tbody",null,this.renderRow(LocaleUtils.tr("serviceinfo.abstract"),this.props.service["abstract"],true),this.renderRow(LocaleUtils.tr("serviceinfo.keywords"),this.props.service.keywords),this.renderRow(LocaleUtils.tr("serviceinfo.onlineResource"),this.renderLink(this.props.service.onlineResource,this.props.service.onlineResource)),this.renderRow(LocaleUtils.tr("serviceinfo.contactPerson"),(_this$props$service$c=this.props.service.contact)===null||_this$props$service$c===void 0?void 0:_this$props$service$c.person),this.renderRow(LocaleUtils.tr("serviceinfo.contactOrganization"),(_this$props$service$c2=this.props.service.contact)===null||_this$props$service$c2===void 0?void 0:_this$props$service$c2.organization),this.renderRow(LocaleUtils.tr("serviceinfo.contactPosition"),(_this$props$service$c3=this.props.service.contact)===null||_this$props$service$c3===void 0?void 0:_this$props$service$c3.position),this.renderRow(LocaleUtils.tr("serviceinfo.contactPhone"),(_this$props$service$c4=this.props.service.contact)===null||_this$props$service$c4===void 0?void 0:_this$props$service$c4.phone),this.renderRow(LocaleUtils.tr("serviceinfo.contactEmail"),(_this$props$service$c5=this.props.service.contact)===null||_this$props$service$c5===void 0?void 0:_this$props$service$c5.email))))))}}])}(React.Component);_defineProperty(ServiceInfoWindow,"propTypes",{layerInfoGeometry:PropTypes.object,service:PropTypes.object,setActiveServiceInfo:PropTypes.func});var selector=function selector(state){return{service:state.serviceinfo.service}};export default connect(selector,{setActiveServiceInfo:setActiveServiceInfo})(ServiceInfoWindow);
|
package/components/SideBar.js
CHANGED
|
@@ -5,5 +5,5 @@ function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof
|
|
|
5
5
|
* This source code is licensed under the BSD-style license found in the
|
|
6
6
|
* LICENSE file in the root directory of this source tree.
|
|
7
7
|
*/import React from"react";import{connect}from"react-redux";import classnames from"classnames";import PropTypes from"prop-types";import{setCurrentTask}from"../actions/task";import Icon from"./Icon";import{Swipeable}from"./Swipeable";import"./style/SideBar.css";var SideBar=/*#__PURE__*/function(_React$Component){function SideBar(props){var _this;_classCallCheck(this,SideBar);_this=_callSuper(this,SideBar,[props]);_defineProperty(_this,"state",{render:false});_defineProperty(_this,"closeClicked",function(){if(_this.props.currentTask.id===_this.props.id){_this.props.setCurrentTask(null)}});_defineProperty(_this,"renderRole",function(role){var children=typeof _this.props.children==="function"?_this.props.children():React.Children.toArray(_this.props.children).reduce(function(res,child){return _objectSpread(_objectSpread({},res),{},_defineProperty({},child.props.role,child))},{});return children[role]});_defineProperty(_this,"setRef",function(el){_this.sidebar=el});_defineProperty(_this,"startSidebarResize",function(ev){var startWidth=_this.sidebar.offsetWidth;var startMouseX=ev.clientX;var sign=_this.props.side==="left"?-1:1;var resizeSidebar=function resizeSidebar(event){_this.sidebar.style.width=startWidth+sign*(startMouseX-event.clientX)+"px"};ev.view.document.body.style.userSelect="none";ev.view.addEventListener("pointermove",resizeSidebar);ev.view.addEventListener("pointerup",function(){ev.view.document.body.style.userSelect="";ev.view.removeEventListener("pointermove",resizeSidebar)},{once:true})});_defineProperty(_this,"startSidebarBottomResize",function(ev){var startHeight=_this.sidebar.offsetHeight;var startMouseY=ev.clientY;var resizeSidebar=function resizeSidebar(event){_this.sidebar.style.height=Math.max(64,startHeight+(event.clientY-startMouseY))+"px"};ev.view.document.body.style.userSelect="none";ev.view.addEventListener("pointermove",resizeSidebar);ev.view.addEventListener("pointerup",function(){ev.view.document.body.style.userSelect="";ev.view.removeEventListener("pointermove",resizeSidebar)},{once:true})});_this.state.render=props.currentTask&&props.currentTask.id===props.id;_this.sidebar=null;return _this}_inherits(SideBar,_React$Component);return _createClass(SideBar,[{key:"componentDidUpdate",value:function componentDidUpdate(prevProps){var _this2=this;var newVisible=this.props.currentTask&&this.props.currentTask.id===this.props.id;var oldVisible=prevProps.currentTask&&prevProps.currentTask.id===prevProps.id;if(newVisible&&(!oldVisible||this.props.currentTask.mode!==prevProps.currentTask.mode)){this.setState({render:true});this.props.onShow(this.props.currentTask.mode)}else if(!newVisible&&oldVisible){this.props.onHide();// Hide the element after the transition period (see SideBar.css)
|
|
8
|
-
setTimeout(function(){_this2.setState({render:false})},300)}if(!this.props.heightResizeable&&prevProps.heightResizeable){this.sidebar.style.height=""}}},{key:"render",value:function render(){var visible=this.props.currentTask.id===this.props.id;var render=visible||this.state.render;var style={width:this.props.width,minWidth:this.props.minWidth,zIndex:visible?5:4,maxWidth:"calc(100vw - "+
|
|
9
|
-
side:"right"});export default connect(function(state){return{currentTask:state.task,
|
|
8
|
+
setTimeout(function(){_this2.setState({render:false})},300)}if(!this.props.heightResizeable&&prevProps.heightResizeable){this.sidebar.style.height=""}}},{key:"render",value:function render(){var visible=this.props.currentTask.id===this.props.id;var render=visible||this.state.render;var marginLeft=this.props.mapMargins.left+this.props.mapMargins.outerLeft;var marginRight=this.props.mapMargins.right+this.props.mapMargins.outerRight;var style={width:this.props.width,minWidth:this.props.minWidth,zIndex:visible?5:4,maxWidth:"calc(100vw - "+marginLeft+"px - "+marginRight+"px)"};var isLeftSide=this.props.side==="left";if(isLeftSide){style.left=visible?this.props.mapMargins.left+this.props.mapMargins.outerLeft:0}else{style.right=visible?this.props.mapMargins.right+this.props.mapMargins.outerRight:0}var classes=classnames({"sidebar":true,"sidebar-open":visible,"sidebar-left":isLeftSide,"sidebar-right":!isLeftSide});var closeIcon=isLeftSide?"chevron-left":"chevron-right";var body=null;var extra=null;if(render){body=this.renderRole("body");extra=this.renderRole("extra")}return/*#__PURE__*/React.createElement("div",null,/*#__PURE__*/React.createElement(Swipeable,{delta:30,onSwipedRight:this.closeClicked},/*#__PURE__*/React.createElement("div",{className:"".concat(classes," ").concat(this.props.extraClasses),id:this.props.id,ref:this.setRef,style:style},/*#__PURE__*/React.createElement("div",{className:"sidebar-resize-handle sidebar-resize-handle-"+this.props.side,onPointerDown:this.startSidebarResize}),/*#__PURE__*/React.createElement("div",{className:"sidebar-titlebar"},this.state.render?this.props.extraBeforeContent:null,/*#__PURE__*/React.createElement(Icon,{className:"sidebar-titlebar-icon",icon:this.props.icon,size:"large"}),/*#__PURE__*/React.createElement("span",{className:"sidebar-titlebar-title"},this.props.title),this.state.render?this.props.extraTitlebarContent:null,/*#__PURE__*/React.createElement("span",{className:"sidebar-titlebar-spacer"}),/*#__PURE__*/React.createElement(Icon,{className:"sidebar-titlebar-closeicon",icon:closeIcon,onClick:this.closeClicked})),/*#__PURE__*/React.createElement("div",{className:"sidebar-body"},body),this.props.heightResizeable?/*#__PURE__*/React.createElement("div",{className:"sidebar-resize-handle-bottom",onPointerDown:this.startSidebarBottomResize}):null)),extra)}}])}(React.Component);_defineProperty(SideBar,"propTypes",{children:PropTypes.oneOfType([PropTypes.node,PropTypes.func]),currentTask:PropTypes.object,extraBeforeContent:PropTypes.object,extraClasses:PropTypes.string,extraTitlebarContent:PropTypes.object,heightResizeable:PropTypes.bool,icon:PropTypes.string,id:PropTypes.string.isRequired,mapMargins:PropTypes.object,minWidth:PropTypes.string,onHide:PropTypes.func,onShow:PropTypes.func,setCurrentTask:PropTypes.func,side:PropTypes.string,title:PropTypes.string,width:PropTypes.string});_defineProperty(SideBar,"defaultProps",{extraClasses:"",onShow:function onShow(){},onHide:function onHide(){},width:"15em",minWidth:"15em",// allowed values are 'left' and 'right'
|
|
9
|
+
side:"right"});export default connect(function(state){return{currentTask:state.task,mapMargins:state.windows.mapMargins}},{setCurrentTask:setCurrentTask})(SideBar);
|
|
@@ -5,26 +5,22 @@ function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof
|
|
|
5
5
|
*
|
|
6
6
|
* This source code is licensed under the BSD-style license found in the
|
|
7
7
|
* LICENSE file in the root directory of this source tree.
|
|
8
|
-
*/import React from"react";import{Provider,connect}from"react-redux";import axios from"axios";import deepmerge from"deepmerge";import{register as olProj4Register}from"ol/proj/proj4";import Proj4js from"proj4";import PropTypes from"prop-types";import{localConfigLoaded,setStartupParameters,setColorScheme}from"../actions/localConfig";import{
|
|
8
|
+
*/import React from"react";import{Provider,connect}from"react-redux";import axios from"axios";import deepmerge from"deepmerge";import{register as olProj4Register}from"ol/proj/proj4";import Proj4js from"proj4";import PropTypes from"prop-types";import{localConfigLoaded,setStartupParameters,setColorScheme}from"../actions/localConfig";import{changeLocale}from"../actions/locale";import{setCurrentTask}from"../actions/task";import{themesLoaded,setCurrentTheme}from"../actions/theme";import{NotificationType,showNotification,setBottombarHeight,setTopbarHeight}from"../actions/windows";import ReducerIndex from"../reducers/index";import{createStore}from"../stores/StandardStore";import ConfigUtils from"../utils/ConfigUtils";import CoordinatesUtils from"../utils/CoordinatesUtils";import LocaleUtils from"../utils/LocaleUtils";import MapUtils from"../utils/MapUtils";import MiscUtils from"../utils/MiscUtils";import{UrlParams,resolvePermaLink}from"../utils/PermaLinkUtils";import PluginStore from"../utils/PluginStore";import ThemeUtils from"../utils/ThemeUtils";import PluginsContainer from"./PluginsContainer";import"./style/App.css";import"./style/DefaultColorScheme.css";var CSRF_TOKEN=MiscUtils.getCsrfToken();if(CSRF_TOKEN){axios.interceptors.request.use(function(config){if(["POST","PUT","PATCH","DELETE"].includes(config.method.toUpperCase())){config.headers["X-CSRF-TOKEN"]=CSRF_TOKEN}return config},function(error){return Promise.reject(error)})}var AppContainerComponent=/*#__PURE__*/function(_React$Component){function AppContainerComponent(props){var _this;_classCallCheck(this,AppContainerComponent);_this=_callSuper(this,AppContainerComponent,[props]);_defineProperty(_this,"loadThemes",function(){_this.themesLoaded=true;var _this$props$startupCo=_this.props.startupConfig,state=_this$props$startupCo.state,permalinkInvalid=_this$props$startupCo.permalinkInvalid;var params=_objectSpread({},_this.props.startupConfig.params);// Clone as changed below
|
|
9
9
|
// Warn if permalink key is invalid
|
|
10
10
|
if(permalinkInvalid){_this.props.showNotification("missingtheme",LocaleUtils.tr("app.missingpermalink"),NotificationType.WARN,true)}// Load themes.json
|
|
11
11
|
axios.get("themes.json").then(function(response){var _this$props$appConfig,_this$props$appConfig2,_theme;var themes=response.data.themes||{};(_this$props$appConfig=(_this$props$appConfig2=_this.props.appConfig).themePreprocessor)===null||_this$props$appConfig===void 0||_this$props$appConfig.call(_this$props$appConfig2,themes);_this.props.themesLoaded(themes);var theme=ThemeUtils.getThemeById(themes,params.t);if((!theme||theme.restricted)&&!ConfigUtils.getConfigProp("dontLoadDefaultTheme")){if(params.t){_this.props.showNotification("missingtheme",LocaleUtils.tr("app.missingtheme",params.t),NotificationType.WARN,true);params.l=undefined}var defaultTheme=Object.fromEntries(_this.props.defaultUrlParams.split("&").map(function(x){return x.split("=")})).t||themes.defaultTheme;theme=ThemeUtils.getThemeById(themes,defaultTheme);params.t=defaultTheme}if(theme){var _params$bl;// Compute initial view
|
|
12
12
|
var initialView=params.v;var initialExtent=null;if(params.c&¶ms.s!==undefined){var coords=params.c.split(/[;,]/g).map(function(x){return parseFloat(x)||0});var scales=theme.scales||themes.defaultScales;var zoom=MapUtils.computeZoom(scales,params.s);if(coords.length===2){var p=CoordinatesUtils.reproject(coords,params.crs||theme.mapCrs,theme.bbox.crs);var bounds=theme.bbox.bounds;// Only accept c if it is within the theme bounds
|
|
13
13
|
if(bounds[0]<=p[0]&&p[0]<=bounds[2]&&bounds[1]<=p[1]&&p[1]<=bounds[3]){initialExtent={center:coords,zoom:zoom,crs:params.crs||theme.mapCrs}}else{initialExtent={center:[0.5*(bounds[0]+bounds[2]),0.5*(bounds[1]+bounds[3])],zoom:zoom,crs:theme.bbox.crs}}}}else if(params.e){var _bounds=params.e.split(/[;,]/g).map(function(x){return parseFloat(x)||0});if(CoordinatesUtils.isValidExtent(_bounds)){initialExtent={bounds:_bounds,crs:params.crs||theme.mapCrs}}}var layerParams=params.l!==undefined?params.l.split(",").filter(function(entry){return entry}):null;if(layerParams&&ConfigUtils.getConfigProp("urlReverseLayerOrder")){layerParams.reverse()}_this.props.setCurrentTheme(theme,themes,false,initialExtent,layerParams,(_params$bl=params.bl)!==null&&_params$bl!==void 0?_params$bl:null,state.layers,_this.props.appConfig.themeLayerRestorer,_this.props.appConfig.externalLayerRestorer,initialView)}var task=ConfigUtils.getConfigProp("startupTask");if(task&&!((_theme=theme)!==null&&_theme!==void 0&&(_theme=_theme.config)!==null&&_theme!==void 0&&_theme.startupTask)){var mapClickAction=ConfigUtils.getPluginConfig(task.key).mapClickAction;_this.props.setCurrentTask(task.key,task.mode,mapClickAction)}})});_this.themesLoaded=false;// Set initial bottom/topbar height to zero in case not topbar/bottombar is enabled
|
|
14
14
|
// The components will set the proper height if and when initialized
|
|
15
|
-
props.setTopbarHeight(0);props.setBottombarHeight(0);return _this}_inherits(AppContainerComponent,_React$Component);return _createClass(AppContainerComponent,[{key:"componentDidMount",value:function componentDidMount(){
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
var
|
|
24
|
-
var
|
|
25
|
-
var renameTaskButtons=function renameTaskButtons(res,entry){var key=entry.name+(entry.name==="TaskButton"?"#"+(entry.cfg||{}).task:"");return _objectSpread(_objectSpread({},res),{},_defineProperty({},key,entry))};var commonConfig=[].concat(_toConsumableArray(config.plugins.common||[]),_toConsumableArray(((_window$QWC2PluginCon=window.QWC2PluginConfig)===null||_window$QWC2PluginCon===void 0?void 0:_window$QWC2PluginCon.common)||[])).reduce(renameTaskButtons,{});var desktopConfig=[].concat(_toConsumableArray(config.plugins.desktop||[]),_toConsumableArray(((_window$QWC2PluginCon2=window.QWC2PluginConfig)===null||_window$QWC2PluginCon2===void 0?void 0:_window$QWC2PluginCon2.desktop)||[]));var mobileConfig=[].concat(_toConsumableArray(config.plugins.mobile||[]),_toConsumableArray(((_window$QWC2PluginCon3=window.QWC2PluginConfig)===null||_window$QWC2PluginCon3===void 0?void 0:_window$QWC2PluginCon3.mobile)||[]));config.plugins.desktop=Object.values(deepmerge(commonConfig,desktopConfig.reduce(renameTaskButtons,{})));config.plugins.mobile=Object.values(deepmerge(commonConfig,mobileConfig.reduce(renameTaskButtons,{})));delete config.plugins.common;// Store whether to show plugin in 2d/3d mode
|
|
26
|
-
var plugins=_this3.props.appConfig.pluginsDef.plugins;config.plugins.mobile.forEach(function(entry){var plugin=plugins[entry.name+"Plugin"];if(plugin){var _plugin$WrappedCompon2;var component=(_plugin$WrappedCompon2=plugin.WrappedComponent)!==null&&_plugin$WrappedCompon2!==void 0?_plugin$WrappedCompon2:plugin;entry.availableIn3D=component.availableIn3D===true;entry.availableIn2D=component.availableIn2D===true||component.availableIn2D===undefined}});config.plugins.desktop.forEach(function(entry){var plugin=plugins[entry.name+"Plugin"];if(plugin){var _plugin$WrappedCompon3;var component=(_plugin$WrappedCompon3=plugin.WrappedComponent)!==null&&_plugin$WrappedCompon3!==void 0?_plugin$WrappedCompon3:plugin;entry.availableIn3D=component.availableIn3D===true;entry.availableIn2D=component.availableIn2D===true||component.availableIn2D===undefined}});// Add projections from config
|
|
27
|
-
var _iterator=_createForOfIteratorHelper(config.projections||[]),_step;try{for(_iterator.s();!(_step=_iterator.n()).done;){var proj=_step.value;if(Proj4js.defs(proj.code)===undefined){Proj4js.defs(proj.code,proj.proj)}CoordinatesUtils.setCrsLabels(_defineProperty({},proj.code,proj.label))}}catch(err){_iterator.e(err)}finally{_iterator.f()}olProj4Register(Proj4js);StandardApp.store.dispatch(localConfigLoaded(config));// Load locale
|
|
28
|
-
var defaultLocale=_this3.props.appConfig.getDefaultLocale?_this3.props.appConfig.getDefaultLocale():"";StandardApp.store.dispatch(loadLocale(_this3.props.appConfig.defaultLocaleData,defaultLocale));// Set color scheme
|
|
15
|
+
props.setTopbarHeight(0);props.setBottombarHeight(0);return _this}_inherits(AppContainerComponent,_React$Component);return _createClass(AppContainerComponent,[{key:"componentDidMount",value:function componentDidMount(){this.componentDidUpdate({})}},{key:"componentDidUpdate",value:function componentDidUpdate(prevProps){// The map component needs to have finished loading before theme initialization can proceed
|
|
16
|
+
if(this.props.haveMapSize&&!this.themesLoaded){this.loadThemes()}}},{key:"render",value:function render(){// Filter 2D plugins
|
|
17
|
+
var device=ConfigUtils.isMobile()?"mobile":"desktop";var pluginsConf=this.props.localConfig.plugins[device].filter(function(entry){return entry.availableIn2D});return/*#__PURE__*/React.createElement(PluginsContainer,{plugins:PluginStore.getPlugins(),pluginsConfig:pluginsConf})}}])}(React.Component);_defineProperty(AppContainerComponent,"propTypes",{appConfig:PropTypes.object,customPlugins:PropTypes.array,defaultUrlParams:PropTypes.string,haveLocale:PropTypes.bool,haveMapSize:PropTypes.bool,localConfig:PropTypes.object,setBottombarHeight:PropTypes.func,setCurrentTask:PropTypes.func,setCurrentTheme:PropTypes.func,setTopbarHeight:PropTypes.func,showNotification:PropTypes.func,startupConfig:PropTypes.object,themesLoaded:PropTypes.func});var AppContainer=connect(function(state){var _state$localConfig$us;return{haveLocale:state.locale.current!==null,haveMapSize:state.map.size!==null,defaultUrlParams:((_state$localConfig$us=state.localConfig.user_infos)===null||_state$localConfig$us===void 0?void 0:_state$localConfig$us.default_url_params)||"",localConfig:state.localConfig}},{themesLoaded:themesLoaded,setCurrentTask:setCurrentTask,setCurrentTheme:setCurrentTheme,showNotification:showNotification,setTopbarHeight:setTopbarHeight,setBottombarHeight:setBottombarHeight})(AppContainerComponent);var StandardApp=/*#__PURE__*/function(_React$Component2){function StandardApp(props){var _this2;_classCallCheck(this,StandardApp);_this2=_callSuper(this,StandardApp,[props]);_defineProperty(_this2,"state",{startupConfig:null,haveConfig:false,haveLocale:false});_defineProperty(_this2,"computeVh",function(){// https://css-tricks.com/the-trick-to-viewport-units-on-mobile/
|
|
18
|
+
document.documentElement.style.setProperty("--vh",window.innerHeight*0.01+"px")});_defineProperty(_this2,"init",function(){// Save initial params and clear URL
|
|
19
|
+
var initialParams=UrlParams.getParams();UrlParams.clear();// Set builtin plugins
|
|
20
|
+
PluginStore.setBuiltinPlugins(_this2.props.appConfig.pluginsDef.plugins);// Load config.json
|
|
21
|
+
var configParams=Object.entries(initialParams).reduce(function(res,_ref){var _ref2=_slicedToArray(_ref,2),key=_ref2[0],value=_ref2[1];if(key.startsWith("config:")){res[key.slice(7)]=value}return res},{});ConfigUtils.loadConfiguration(configParams).then(function(config){var _window$QWC2PluginCon,_window$QWC2PluginCon2,_window$QWC2PluginCon3,_ref5,_this2$props$appConfi,_this2$props$appConfi2,_this2$props$appConfi3;// Merge common config into mobile/desktop config, merge config from appConfig
|
|
22
|
+
var renameTaskButtons=function renameTaskButtons(res,entry){var _entry$cfg$task,_entry$cfg;var key=entry.name+(entry.name==="TaskButton"?"#"+((_entry$cfg$task=(_entry$cfg=entry.cfg)===null||_entry$cfg===void 0?void 0:_entry$cfg.task)!==null&&_entry$cfg$task!==void 0?_entry$cfg$task:""):"");return _objectSpread(_objectSpread({},res),{},_defineProperty({},key,entry))};var commonConfig=[].concat(_toConsumableArray(config.plugins.common||[]),_toConsumableArray(((_window$QWC2PluginCon=window.QWC2PluginConfig)===null||_window$QWC2PluginCon===void 0?void 0:_window$QWC2PluginCon.common)||[])).reduce(renameTaskButtons,{});var desktopConfig=[].concat(_toConsumableArray(config.plugins.desktop||[]),_toConsumableArray(((_window$QWC2PluginCon2=window.QWC2PluginConfig)===null||_window$QWC2PluginCon2===void 0?void 0:_window$QWC2PluginCon2.desktop)||[])).reduce(renameTaskButtons,{});var mobileConfig=[].concat(_toConsumableArray(config.plugins.mobile||[]),_toConsumableArray(((_window$QWC2PluginCon3=window.QWC2PluginConfig)===null||_window$QWC2PluginCon3===void 0?void 0:_window$QWC2PluginCon3.mobile)||[])).reduce(renameTaskButtons,{});var completePluginConfig=function completePluginConfig(pluginConfig){return Object.entries(pluginConfig).map(function(_ref3){var _plugin$WrappedCompon,_component$availableI,_component$availableI2;var _ref4=_slicedToArray(_ref3,2),key=_ref4[0],entry=_ref4[1];var plugin=_this2.props.appConfig.pluginsDef.plugins[entry.name+"Plugin"];var component=(_plugin$WrappedCompon=plugin===null||plugin===void 0?void 0:plugin.WrappedComponent)!==null&&_plugin$WrappedCompon!==void 0?_plugin$WrappedCompon:plugin;var availableIn2D=(_component$availableI=component===null||component===void 0?void 0:component.availableIn2D)!==null&&_component$availableI!==void 0?_component$availableI:true;var availableIn3D=(_component$availableI2=component===null||component===void 0?void 0:component.availableIn3D)!==null&&_component$availableI2!==void 0?_component$availableI2:false;return _objectSpread(_objectSpread({},entry),{},{key:key,availableIn2D:availableIn2D,availableIn3D:availableIn3D,cfg:_objectSpread(_objectSpread({},entry.cfg),_this2.props.appConfig.pluginsDef.cfg[entry.name+"Plugin"])})})};config.plugins.desktop=completePluginConfig(deepmerge(commonConfig,desktopConfig));config.plugins.mobile=completePluginConfig(deepmerge(commonConfig,mobileConfig));delete config.plugins.common;// Add projections from config
|
|
23
|
+
var _iterator=_createForOfIteratorHelper(config.projections||[]),_step;try{for(_iterator.s();!(_step=_iterator.n()).done;){var proj=_step.value;if(Proj4js.defs(proj.code)===undefined){Proj4js.defs(proj.code,proj.proj)}CoordinatesUtils.setCrsLabels(_defineProperty({},proj.code,proj.label))}}catch(err){_iterator.e(err)}finally{_iterator.f()}olProj4Register(Proj4js);StandardApp.store.dispatch(localConfigLoaded(config));_this2.setState({haveConfig:true});// Load locale
|
|
24
|
+
var lang=(_ref5=(_this2$props$appConfi=(_this2$props$appConfi2=(_this2$props$appConfi3=_this2.props.appConfig).getDefaultLocale)===null||_this2$props$appConfi2===void 0?void 0:_this2$props$appConfi2.call(_this2$props$appConfi3))!==null&&_this2$props$appConfi!==void 0?_this2$props$appConfi:initialParams.lang)!==null&&_ref5!==void 0?_ref5:navigator.language;LocaleUtils.loadLocale(lang,_this2.props.appConfig.defaultLocaleData).then(function(localeData){StandardApp.store.dispatch(changeLocale(localeData,_this2.props.appConfig.defaultLocaleData));_this2.setState({haveLocale:true})});// Set color scheme
|
|
29
25
|
var storedColorScheme=ConfigUtils.havePlugin("Settings")?localStorage.getItem("qwc2-color-scheme"):null;var colorScheme=initialParams.style||storedColorScheme||ConfigUtils.getConfigProp("defaultColorScheme");StandardApp.store.dispatch(setColorScheme(colorScheme));// Resolve permalink and restore settings
|
|
30
|
-
resolvePermaLink(initialParams,function(params,state,success){StandardApp.store.dispatch(setStartupParameters(params,state));
|
|
26
|
+
resolvePermaLink(initialParams,function(params,state,success){StandardApp.store.dispatch(setStartupParameters(params,state));_this2.setState({startupConfig:{params:params,state:state,permalinkInvalid:!success}})})})});var initialState=_this2.props.appConfig.initialState||{};StandardApp.store=createStore(ReducerIndex.reducers,initialState,_this2.props.appConfig.actionLogger);_this2.init();_this2.touchY=null;return _this2}_inherits(StandardApp,_React$Component2);return _createClass(StandardApp,[{key:"componentDidMount",value:function componentDidMount(){window.addEventListener("resize",this.computeVh);this.computeVh()}},{key:"componentWillUnmount",value:function componentWillUnmount(){window.removeEventListener("resize",this.computeVh)}},{key:"render",value:function render(){if(!this.state.startupConfig||!this.state.haveConfig||!this.state.haveLocale){return null}return/*#__PURE__*/React.createElement(Provider,{store:StandardApp.store},/*#__PURE__*/React.createElement(AppContainer,{appConfig:this.props.appConfig,startupConfig:this.state.startupConfig}))}}])}(React.Component);_defineProperty(StandardApp,"store",null);_defineProperty(StandardApp,"propTypes",{appConfig:PropTypes.object});export{StandardApp as default};
|