qwc2 2025.9.2 → 2025.9.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/actions/layers.js CHANGED
@@ -4,5 +4,5 @@ function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof
4
4
  *
5
5
  * This source code is licensed under the BSD-style license found in the
6
6
  * LICENSE file in the root directory of this source tree.
7
- */import ReducerIndex from"../reducers/index";import layersReducer from"../reducers/layers";ReducerIndex.register("layers",layersReducer);import ConfigUtils from"../utils/ConfigUtils";import LocaleUtils from"../utils/LocaleUtils";export var SET_LAYER_LOADING="SET_LAYER_LOADING";export var ADD_LAYER="ADD_LAYER";export var ADD_LAYER_SEPARATOR="ADD_LAYER_SEPARATOR";export var REMOVE_LAYER="REMOVE_LAYER";export var REORDER_LAYER="REORDER_LAYER";export var ADD_LAYER_FEATURES="ADD_LAYER_FEATURES";export var ADD_THEME_SUBLAYER="ADD_THEME_SUBLAYER";export var REMOVE_LAYER_FEATURES="REMOVE_LAYER_FEATURES";export var CLEAR_LAYER="CLEAR_LAYER";export var CHANGE_LAYER_PROPERTY="CHANGE_LAYER_PROPERTY";export var SET_LAYER_DIMENSIONS="SET_LAYER_DIMENSIONS";export var REFRESH_LAYER="REFRESH_LAYER";export var REMOVE_ALL_LAYERS="REMOVE_ALL_LAYERS";export var REPLACE_PLACEHOLDER_LAYER="REPLACE_PLACEHOLDER_LAYER";export var SET_SWIPE="SET_SWIPE";export var SET_FILTER="SET_FILTER";export var SET_THEME_LAYERS_VISIBILITY_PRESET="SET_THEME_LAYERS_VISIBILITY_PRESET";export var LayerRole={BACKGROUND:1,THEME:2,USERLAYER:3,SELECTION:4,MARKER:5};export function addLayer(layer){var pos=arguments.length>1&&arguments[1]!==undefined?arguments[1]:null;var options=arguments.length>2&&arguments[2]!==undefined?arguments[2]:null;if(layer.serverType==="qgis"&&!layer.translations){return function(dispatch){return LocaleUtils.loadThemeTranslations(layer.url).then(function(translations){return dispatch({type:ADD_LAYER,layer:_objectSpread(_objectSpread({},layer),{},{translations:translations}),pos:pos,options:options})})}}else{return{type:ADD_LAYER,layer:layer,pos:pos,options:options}}}export function addLayerSeparator(title,afterLayerId,afterSublayerPath){return{type:ADD_LAYER_SEPARATOR,title:title,afterLayerId:afterLayerId,afterSublayerPath:afterSublayerPath}}export function removeLayer(layerId){var sublayerpath=arguments.length>1&&arguments[1]!==undefined?arguments[1]:[];return{type:REMOVE_LAYER,layerId:layerId,sublayerpath:sublayerpath}}export function reorderLayer(layer,sublayerpath,direction){return function(dispatch,getState){dispatch({type:REORDER_LAYER,layer:layer,sublayerpath:sublayerpath,direction:direction,preventSplittingGroups:ConfigUtils.getConfigProp("preventSplittingGroupsWhenReordering",getState().theme.current)})}}export function addLayerFeatures(layer,features){var clear=arguments.length>2&&arguments[2]!==undefined?arguments[2]:false;return{type:ADD_LAYER_FEATURES,layer:layer,features:features,clear:clear}}export function removeLayerFeatures(layerId,featureIds){var keepEmptyLayer=arguments.length>2&&arguments[2]!==undefined?arguments[2]:false;return{type:REMOVE_LAYER_FEATURES,layerId:layerId,featureIds:featureIds,keepEmptyLayer:keepEmptyLayer}}export function clearLayer(layerId){return{type:CLEAR_LAYER,layerId:layerId}}export function addThemeSublayer(layer){return{type:ADD_THEME_SUBLAYER,layer:layer}}// recurseDirection: null (don't recurse), 'parents', 'children', 'both'
7
+ */import ReducerIndex from"../reducers/index";import layersReducer from"../reducers/layers";ReducerIndex.register("layers",layersReducer);import ConfigUtils from"../utils/ConfigUtils";import LayerUtils from"../utils/LayerUtils";import LocaleUtils from"../utils/LocaleUtils";export var SET_LAYER_LOADING="SET_LAYER_LOADING";export var ADD_LAYER="ADD_LAYER";export var ADD_LAYER_SEPARATOR="ADD_LAYER_SEPARATOR";export var REMOVE_LAYER="REMOVE_LAYER";export var REORDER_LAYER="REORDER_LAYER";export var ADD_LAYER_FEATURES="ADD_LAYER_FEATURES";export var ADD_THEME_SUBLAYER="ADD_THEME_SUBLAYER";export var REMOVE_LAYER_FEATURES="REMOVE_LAYER_FEATURES";export var CLEAR_LAYER="CLEAR_LAYER";export var CHANGE_LAYER_PROPERTY="CHANGE_LAYER_PROPERTY";export var SET_LAYER_DIMENSIONS="SET_LAYER_DIMENSIONS";export var REFRESH_LAYER="REFRESH_LAYER";export var REMOVE_ALL_LAYERS="REMOVE_ALL_LAYERS";export var REPLACE_PLACEHOLDER_LAYER="REPLACE_PLACEHOLDER_LAYER";export var SET_SWIPE="SET_SWIPE";export var SET_FILTER="SET_FILTER";export var SET_THEME_LAYERS_VISIBILITY_PRESET="SET_THEME_LAYERS_VISIBILITY_PRESET";export var LayerRole={BACKGROUND:1,THEME:2,USERLAYER:3,SELECTION:4,MARKER:5};export function addLayer(layer){var pos=arguments.length>1&&arguments[1]!==undefined?arguments[1]:null;var options=arguments.length>2&&arguments[2]!==undefined?arguments[2]:null;if(layer.serverType==="qgis"&&!layer.translations){return function(dispatch){return LocaleUtils.loadThemeTranslations(layer.url).then(function(translations){return dispatch({type:ADD_LAYER,layer:_objectSpread(_objectSpread({},LayerUtils.applyTranslations(layer,translations)),{},{translations:translations}),pos:pos,options:options})})}}else{return{type:ADD_LAYER,layer:layer,pos:pos,options:options}}}export function addLayerSeparator(title,afterLayerId,afterSublayerPath){return{type:ADD_LAYER_SEPARATOR,title:title,afterLayerId:afterLayerId,afterSublayerPath:afterSublayerPath}}export function removeLayer(layerId){var sublayerpath=arguments.length>1&&arguments[1]!==undefined?arguments[1]:[];return{type:REMOVE_LAYER,layerId:layerId,sublayerpath:sublayerpath}}export function reorderLayer(layer,sublayerpath,direction){return function(dispatch,getState){dispatch({type:REORDER_LAYER,layer:layer,sublayerpath:sublayerpath,direction:direction,preventSplittingGroups:ConfigUtils.getConfigProp("preventSplittingGroupsWhenReordering",getState().theme.current)})}}export function addLayerFeatures(layer,features){var clear=arguments.length>2&&arguments[2]!==undefined?arguments[2]:false;return{type:ADD_LAYER_FEATURES,layer:layer,features:features,clear:clear}}export function removeLayerFeatures(layerId,featureIds){var keepEmptyLayer=arguments.length>2&&arguments[2]!==undefined?arguments[2]:false;return{type:REMOVE_LAYER_FEATURES,layerId:layerId,featureIds:featureIds,keepEmptyLayer:keepEmptyLayer}}export function clearLayer(layerId){return{type:CLEAR_LAYER,layerId:layerId}}export function addThemeSublayer(layer){return{type:ADD_THEME_SUBLAYER,layer:layer}}// recurseDirection: null (don't recurse), 'parents', 'children', 'both'
8
8
  export function changeLayerProperty(layerId,property,newvalue){var sublayerpath=arguments.length>3&&arguments[3]!==undefined?arguments[3]:[];var recurseDirection=arguments.length>4&&arguments[4]!==undefined?arguments[4]:null;return{type:CHANGE_LAYER_PROPERTY,layerId:layerId,property:property,newvalue:newvalue,sublayerpath:sublayerpath,recurseDirection:recurseDirection}}export function setLayerDimensions(layerId,dimensions){return{type:SET_LAYER_DIMENSIONS,layerId:layerId,dimensions:dimensions}}export function setLayerLoading(layerId,loading){return{type:SET_LAYER_LOADING,layerId:layerId,loading:loading}}export function addMarker(id,point){var label=arguments.length>2&&arguments[2]!==undefined?arguments[2]:"";var crs=arguments.length>3&&arguments[3]!==undefined?arguments[3]:"EPSG:4326";var zIndex=arguments.length>4&&arguments[4]!==undefined?arguments[4]:null;var layer={id:"markers",role:LayerRole.MARKER,zIndex:zIndex};var feature={id:id,geometry:{type:"Point",coordinates:point},properties:{label:label},crs:crs,styleName:"marker"};return addLayerFeatures(layer,[feature])}export function removeMarker(id){return removeLayerFeatures("markers",[id])}export function refreshLayer(filter){return{type:REFRESH_LAYER,filter:filter}}export function removeAllLayers(){return{type:REMOVE_ALL_LAYERS}}export function replacePlaceholderLayer(id,layer){return{type:REPLACE_PLACEHOLDER_LAYER,id:id,layer:layer}}export function setSwipe(swipe){return{type:SET_SWIPE,swipe:swipe}}export function setFilter(filter,filterGeom,timeRange){return{type:SET_FILTER,filter:filter,filterGeom:filterGeom,timeRange:timeRange}}export function setThemeLayersVisibilityPreset(preset){return{type:SET_THEME_LAYERS_VISIBILITY_PRESET,preset:preset}}
package/actions/theme.js CHANGED
@@ -4,12 +4,12 @@ function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof
4
4
  *
5
5
  * This source code is licensed under the BSD-style license found in the
6
6
  * LICENSE file in the root directory of this source tree.
7
- */import ReducerIndex from"../reducers/index";import themeReducer from"../reducers/theme";ReducerIndex.register("theme",themeReducer);import isEmpty from"lodash.isempty";import{setView3dMode,View3DMode}from"../actions/display";import{setCurrentTask}from"../actions/task";import ConfigUtils from"../utils/ConfigUtils";import CoordinatesUtils from"../utils/CoordinatesUtils";import LayerUtils from"../utils/LayerUtils";import LocaleUtils from"../utils/LocaleUtils";import MapUtils from"../utils/MapUtils";import{UrlParams}from"../utils/PermaLinkUtils";import ServiceLayerUtils from"../utils/ServiceLayerUtils";import ThemeUtils from"../utils/ThemeUtils";import{LayerRole,addLayer,removeLayer,removeAllLayers,replacePlaceholderLayer,setSwipe}from"./layers";import{configureMap}from"./map";import{showNotification,NotificationType}from"./windows";export var THEMES_LOADED="THEMES_LOADED";export var SET_THEME_LAYERS_LIST="SET_THEME_LAYERS_LIST";export var SET_CURRENT_THEME="SET_CURRENT_THEME";export var SWITCHING_THEME="SWITCHING_THEME";export function themesLoaded(themes){return{type:THEMES_LOADED,themes:ThemeUtils.applyTranslations(themes)}}export function setThemeLayersList(theme){return{type:SET_THEME_LAYERS_LIST,themelist:theme}}export function finishThemeSetup(dispatch,theme,themes,layerConfigs,insertPos,permalinkLayers,externalLayerRestorer,visibleBgLayer,initialTheme){var initialView=arguments.length>9&&arguments[9]!==undefined?arguments[9]:null;LocaleUtils.loadThemeTranslations(theme.url).then(function(themeTranslations){var _theme$config;theme.translations=themeTranslations;// Create layer
7
+ */import ReducerIndex from"../reducers/index";import themeReducer from"../reducers/theme";ReducerIndex.register("theme",themeReducer);import isEmpty from"lodash.isempty";import{setView3dMode,View3DMode}from"../actions/display";import{setCurrentTask}from"../actions/task";import ConfigUtils from"../utils/ConfigUtils";import CoordinatesUtils from"../utils/CoordinatesUtils";import LayerUtils from"../utils/LayerUtils";import LocaleUtils from"../utils/LocaleUtils";import MapUtils from"../utils/MapUtils";import{UrlParams}from"../utils/PermaLinkUtils";import ServiceLayerUtils from"../utils/ServiceLayerUtils";import ThemeUtils from"../utils/ThemeUtils";import{LayerRole,addLayer,removeLayer,removeAllLayers,replacePlaceholderLayer,setSwipe}from"./layers";import{configureMap}from"./map";import{showNotification,NotificationType}from"./windows";export var THEMES_LOADED="THEMES_LOADED";export var SET_THEME_LAYERS_LIST="SET_THEME_LAYERS_LIST";export var SET_CURRENT_THEME="SET_CURRENT_THEME";export var SWITCHING_THEME="SWITCHING_THEME";export function themesLoaded(themes){return{type:THEMES_LOADED,themes:themes}}export function setThemeLayersList(theme){return{type:SET_THEME_LAYERS_LIST,themelist:theme}}export function finishThemeSetup(dispatch,theme,themes,layerConfigs,insertPos,permalinkLayers,externalLayerRestorer,visibleBgLayer,initialTheme){var _theme$config;var initialView=arguments.length>9&&arguments[9]!==undefined?arguments[9]:null;// Create layer
8
8
  var themeLayer=ThemeUtils.createThemeLayer(theme,themes);var layers=[themeLayer];// Restore theme layer configuration, create placeholders for missing layers
9
9
  var externalLayers={};if(!isEmpty(permalinkLayers)&&ConfigUtils.getConfigProp("storeAllLayersInPermalink")){layers=permalinkLayers}else{if(layerConfigs){if(ConfigUtils.getConfigProp("allowReorderingLayers",theme)!==true){layers=LayerUtils.restoreLayerParams(themeLayer,layerConfigs,permalinkLayers,externalLayers)}else{layers=LayerUtils.restoreOrderedLayerParams(themeLayer,layerConfigs,permalinkLayers,externalLayers)}}if(isEmpty(layers)){layers=[_objectSpread(_objectSpread({},themeLayer),{},{sublayers:[]})]}}// Add background layers for theme
10
10
  var haveVisibleBg=false;var bgLayers=ThemeUtils.createThemeBackgroundLayers(theme.backgroundLayers||[],themes,visibleBgLayer,externalLayers);if(initialTheme&&visibleBgLayer){var _bgLayers$find;var visibleLayer=(_bgLayers$find=bgLayers.find(function(entry){return entry.visibility}))===null||_bgLayers$find===void 0?void 0:_bgLayers$find.name;if(visibleLayer!==visibleBgLayer){dispatch(showNotification("missingbglayer",LocaleUtils.tr("app.missingbg",visibleBgLayer),NotificationType.WARN,true))}}var _iterator=_createForOfIteratorHelper(bgLayers),_step;try{for(_iterator.s();!(_step=_iterator.n()).done;){var bgLayer=_step.value;haveVisibleBg|=bgLayer.visibility;dispatch(addLayer(bgLayer))}}catch(err){_iterator.e(err)}finally{_iterator.f()}if(!haveVisibleBg){UrlParams.updateParams({bl:""})}var _iterator2=_createForOfIteratorHelper(layers.reverse()),_step2;try{for(_iterator2.s();!(_step2=_iterator2.n()).done;){var layer=_step2.value;dispatch(addLayer(layer,insertPos))}// Restore external layers
11
11
  }catch(err){_iterator2.e(err)}finally{_iterator2.f()}if(externalLayerRestorer){externalLayerRestorer(externalLayers,themes,function(source,layer){dispatch(replacePlaceholderLayer(source,layer))})}else{for(var _i=0,_Object$keys=Object.keys(externalLayers);_i<_Object$keys.length;_i++){var key=_Object$keys[_i];var idx=key.indexOf(":");var service=key.slice(0,idx);var serviceUrl=key.slice(idx+1);ServiceLayerUtils.findLayers(service,serviceUrl,externalLayers[key],theme.mapCrs,function(id,layer){// Don't expose sublayers
12
- if(layer){layer.sublayers=null}dispatch(replacePlaceholderLayer(id,layer))})}}dispatch({type:SET_CURRENT_THEME,theme:theme});if(initialView===null){if(theme.startupView==="2d"){dispatch(setView3dMode(View3DMode.DISABLED))}else if(theme.startupView==="3d2d"){dispatch(setView3dMode(View3DMode.SPLITSCREEN))}else if(theme.startupView==="3d"){dispatch(setView3dMode(View3DMode.FULLSCREEN))}}dispatch({type:SWITCHING_THEME,switching:false});var task=(_theme$config=theme.config)===null||_theme$config===void 0?void 0:_theme$config.startupTask;if(task){var mapClickAction=ConfigUtils.getPluginConfig(task.key).mapClickAction;dispatch(setCurrentTask(task.key,task.mode,mapClickAction))}})}export function setCurrentTheme(theme,themes){var preserve=arguments.length>2&&arguments[2]!==undefined?arguments[2]:true;var initialExtent=arguments.length>3&&arguments[3]!==undefined?arguments[3]:null;var layerParams=arguments.length>4&&arguments[4]!==undefined?arguments[4]:null;var visibleBgLayer=arguments.length>5&&arguments[5]!==undefined?arguments[5]:null;var permalinkLayers=arguments.length>6&&arguments[6]!==undefined?arguments[6]:null;var themeLayerRestorer=arguments.length>7&&arguments[7]!==undefined?arguments[7]:null;var externalLayerRestorer=arguments.length>8&&arguments[8]!==undefined?arguments[8]:null;var initialView=arguments.length>9&&arguments[9]!==undefined?arguments[9]:null;return function(dispatch,getState){var _getState$layers;var curLayers=((_getState$layers=getState().layers)===null||_getState$layers===void 0?void 0:_getState$layers.flat)||[];var mapCrs=theme.mapCrs||themes.defaultMapCrs||"EPSG:3857";if(!(mapCrs in CoordinatesUtils.getAvailableCRS())){dispatch(showNotification("missingprojection",LocaleUtils.tr("app.missingprojection",theme.title,mapCrs),NotificationType.WARN,true));return}var initialTheme=!getState().theme.current;dispatch({type:SWITCHING_THEME,switching:true});// Get current background layer if it needs to be preserved
12
+ if(layer){layer.sublayers=null}dispatch(replacePlaceholderLayer(id,layer))})}}dispatch({type:SET_CURRENT_THEME,theme:theme});if(initialView===null){if(theme.startupView==="2d"){dispatch(setView3dMode(View3DMode.DISABLED))}else if(theme.startupView==="3d2d"){dispatch(setView3dMode(View3DMode.SPLITSCREEN))}else if(theme.startupView==="3d"){dispatch(setView3dMode(View3DMode.FULLSCREEN))}}else{UrlParams.updateParams({v:initialView})}dispatch({type:SWITCHING_THEME,switching:false});var task=(_theme$config=theme.config)===null||_theme$config===void 0?void 0:_theme$config.startupTask;if(task){var mapClickAction=ConfigUtils.getPluginConfig(task.key).mapClickAction;dispatch(setCurrentTask(task.key,task.mode,mapClickAction))}}export function setCurrentTheme(theme,themes){var preserve=arguments.length>2&&arguments[2]!==undefined?arguments[2]:true;var initialExtent=arguments.length>3&&arguments[3]!==undefined?arguments[3]:null;var layerParams=arguments.length>4&&arguments[4]!==undefined?arguments[4]:null;var visibleBgLayer=arguments.length>5&&arguments[5]!==undefined?arguments[5]:null;var permalinkLayers=arguments.length>6&&arguments[6]!==undefined?arguments[6]:null;var themeLayerRestorer=arguments.length>7&&arguments[7]!==undefined?arguments[7]:null;var externalLayerRestorer=arguments.length>8&&arguments[8]!==undefined?arguments[8]:null;var initialView=arguments.length>9&&arguments[9]!==undefined?arguments[9]:null;return function(dispatch,getState){var _getState$layers;var curLayers=((_getState$layers=getState().layers)===null||_getState$layers===void 0?void 0:_getState$layers.flat)||[];var mapCrs=theme.mapCrs||themes.defaultMapCrs||"EPSG:3857";if(!(mapCrs in CoordinatesUtils.getAvailableCRS())){dispatch(showNotification("missingprojection",LocaleUtils.tr("app.missingprojection",theme.title,mapCrs),NotificationType.WARN,true));return}var initialTheme=!getState().theme.current;dispatch({type:SWITCHING_THEME,switching:true});// Get current background layer if it needs to be preserved
13
13
  if(preserve&&visibleBgLayer===null&&ConfigUtils.getConfigProp("preserveBackgroundOnThemeSwitch",theme)===true){var curBgLayer=curLayers.find(function(layer){return layer.role===LayerRole.BACKGROUND&&layer.visibility===true});visibleBgLayer=curBgLayer?curBgLayer.name:null}// Remove old layers
14
14
  var insertPos=0;if(preserve&&ConfigUtils.getConfigProp("preserveNonThemeLayersOnThemeSwitch",theme)===true){// Compute insertion position of new theme layers by counting how many non-theme layers remain
15
15
  insertPos=curLayers.filter(function(layer){return layer.role===LayerRole.USERLAYER}).length;var removeLayers=curLayers.filter(function(layer){return layer.role!==LayerRole.USERLAYER}).map(function(layer){return layer.id});var _iterator3=_createForOfIteratorHelper(removeLayers),_step3;try{for(_iterator3.s();!(_step3=_iterator3.n()).done;){var layerId=_step3.value;dispatch(removeLayer(layerId))}}catch(err){_iterator3.e(err)}finally{_iterator3.f()}}else{dispatch(removeAllLayers())}dispatch(setSwipe(null));if(!theme){dispatch({type:SWITCHING_THEME,switching:false});return}// Inherit defaults if necessary
@@ -15,4 +15,4 @@ alert(result)}else{_this.changedFiles={};_this.setState(function(state){var newF
15
15
  alert(LocaleUtils.tr("attribtable.nogeomnoform"));return}var feature=_this.state.filteredSortedFeatures.find(function(f){return _this.state.selectedFeatures[f.id]===true});_this.props.setCurrentTask("Editing",null,null,{layer:_this.state.loadedLayer,feature:feature})});_defineProperty(_this,"updateFilter",function(field,val){var resetPage=arguments.length>2&&arguments[2]!==undefined?arguments[2]:false;_this.setState(function(state){return _defineProperty(_defineProperty(_defineProperty({},field,val),"currentPage",resetPage?0:state.currentPage),"filteredSortedFeatures",_this.filteredSortedFeatures(state.features,_objectSpread(_objectSpread({},state),{},_defineProperty({},field,val))))})});_defineProperty(_this,"filteredSortedFeatures",function(features,state){var filteredFeatures=[];if(!state.filterVal){filteredFeatures=features.map(function(feature,idx){return _objectSpread(_objectSpread({},feature),{},{originalIndex:idx})})}else{var filterVal=state.filterVal.toLowerCase();var test=null;if(state.filterOp==="~"){test=function test(x){return String(x).toLowerCase().includes(filterVal)}}else if(state.filterOp==="="){test=function test(x){return String(x).toLowerCase()===filterVal}}else if(state.filterOp===">"){test=function test(x){return Number(x)>Number(filterVal)}}else if(state.filterOp===">="){test=function test(x){return Number(x)>=Number(filterVal)}}else if(state.filterOp==="<="){test=function test(x){return Number(x)<=Number(filterVal)}}else if(state.filterOp==="<"){test=function test(x){return Number(x)<Number(filterVal)}}// Build value relation lookup
16
16
  var editConfig=_this.props.theme.editConfig||{};var currentEditConfig=editConfig[_this.state.loadedLayer];var valueLookup=currentEditConfig.fields.reduce(function(res,field){if(field.constraints&&field.constraints.values){res[field.id]=field.constraints.values.reduce(function(res2,constraint){res2[constraint.value]=constraint.label;return res2},{})}else if(field.constraints&&field.constraints.keyvalrel){res[field.id]=KeyValCache.getSync(_this.props.iface,field.constraints.keyvalrel).reduce(function(res2,entry){res2[entry.value]=entry.label;return res2},{})}return res},{});var filterFieldValue=state.filterField==="id"?function(feature){return feature.id}:function(feature){var value=feature.properties[state.filterField];return valueLookup[state.filterField]?valueLookup[state.filterField][value]:value};filteredFeatures=features.reduce(function(res,feature,idx){if(test(filterFieldValue(feature))){res.push(_objectSpread(_objectSpread({},feature),{},{originalIndex:idx}))}return res},[])}if(state.sortField){var sortFieldValue=state.sortField.field==="id"?function(feature){return feature.id}:function(feature){return feature.properties[state.sortField.field]};return filteredFeatures.sort(function(f1,f2){var v1=String(sortFieldValue(f1));var v2=String(sortFieldValue(f2));return v1.localeCompare(v2,undefined,{numeric:true,sensitivity:"base"})*state.sortField.dir})}else{return filteredFeatures}});_defineProperty(_this,"resizeTable",function(ev,index,resizeCol){if(_this.table){var element=_this.table.getElementsByTagName(resizeCol?"th":"tr")[index];var initial=0;if(resizeCol){initial=parseFloat(element.style.minWidth.replace(/px$/,""))||element.clientWidth}else{initial=parseFloat(element.style.height.replace(/px$/,""))||element.clientHeight}var resize={anchor:resizeCol?ev.clientX:ev.clientY,element:element,initial:initial};var resizeDo=resizeCol?function(event){var delta=event.clientX-resize.anchor;resize.element.style.minWidth=Math.max(resize.initial+delta,16)+"px";resize.element.style.width=Math.max(resize.initial+delta,16)+"px"}:function(event){var delta=event.clientY-resize.anchor;resize.element.style.height=Math.max(resize.initial+delta,16)+"px"};var eventShield=ev.view.document.createElement("div");eventShield.className="__event_shield";ev.view.document.body.appendChild(eventShield);ev.view.document.body.classList.add(resizeCol?"ewresizing":"nsresizing");ev.view.addEventListener("pointermove",resizeDo);ev.view.addEventListener("pointerup",function(event){event.view.document.body.removeChild(eventShield);event.view.removeEventListener("pointermove",resizeDo);event.view.document.body.classList.remove(resizeCol?"ewresizing":"nsresizing")},{once:true})}});_defineProperty(_this,"csvExport",function(){var editConfig=_this.props.theme.editConfig||{};var currentEditConfig=editConfig[_this.state.loadedLayer];if(!currentEditConfig){return}var fields=currentEditConfig.fields.filter(function(field){return field.id!=="id"});var data="";data+="id,"+fields.map(function(field){return"\"".concat(field.name.replaceAll("\"","\"\""),"\"")}).join(",")+"\n";_this.state.features.forEach(function(feature){data+=feature.id+","+fields.map(function(field){var value=feature.properties[field.id];if(value===null||value===undefined){return"null"}else{return"\"".concat(String(feature.properties[field.id]).replaceAll("\"","\"\""),"\"")}}).join(",")+"\n"});FileSaver.saveAs(new Blob([data],{type:"text/plain;charset=utf-8"}),_this.state.loadedLayer+".csv")});_defineProperty(_this,"translateFieldName",function(fieldName,layerName){var _this$props$theme$tra,_this$props$theme$tra2;return(_this$props$theme$tra=(_this$props$theme$tra2=_this.props.theme.translations)===null||_this$props$theme$tra2===void 0||(_this$props$theme$tra2=_this$props$theme$tra2.layers)===null||_this$props$theme$tra2===void 0||(_this$props$theme$tra2=_this$props$theme$tra2[layerName])===null||_this$props$theme$tra2===void 0||(_this$props$theme$tra2=_this$props$theme$tra2.fields)===null||_this$props$theme$tra2===void 0?void 0:_this$props$theme$tra2[fieldName])!==null&&_this$props$theme$tra!==void 0?_this$props$theme$tra:fieldName});_this.changedFiles={};_this.state=AttributeTableWidget.defaultState;_this.table=null;_this.attribTableContents=null;return _this}_inherits(AttributeTableWidget,_React$Component);return _createClass(AttributeTableWidget,[{key:"componentDidMount",value:function componentDidMount(){if(this.props.initialLayer){this.reload(this.props.initialLayer)}}},{key:"componentDidUpdate",value:function componentDidUpdate(prevProps,prevState){if(this.state.newFeature&&!prevState.newFeature){if(this.attribTableContents){this.attribTableContents.scrollTop=this.attribTableContents.scrollHeight}}// Reload conditions when limited to extent
17
17
  if(this.state.limitToExtent&&this.state.selectedLayer&&(!prevState.limitToExtent||this.props.mapBbox!==prevProps.mapBbox)){this.reload()}else if(!this.state.limitToExtent&&prevState.limitToExtent){this.reload()}// Highlight feature
18
- if(this.state.highlightedFeature!==prevState.highlightedFeature||this.state.filteredSortedFeatures!==prevState.filteredSortedFeatures){this.highlightFeatures()}}},{key:"componentWillUnmount",value:function componentWillUnmount(){this.props.removeLayer("__attributetablehighlight")}},{key:"render",value:function render(){var _this2=this;var captchaRequired=ConfigUtils.getConfigProp("editServiceCaptchaSiteKey")&&!ConfigUtils.getConfigProp("username");var captchaPending=captchaRequired&&!this.state.captchaResponse;var editConfig=this.props.theme.editConfig||{};var currentEditConfig=editConfig[this.state.loadedLayer];var editPermissions=(editConfig[this.state.loadedLayer]||{}).permissions||{};var readOnly=editPermissions.updatable===false;var loadOverlay=null;if(this.state.selectedLayer&&this.state.selectedLayer!==this.state.loadedLayer){if(this.state.loading){loadOverlay=/*#__PURE__*/React.createElement("div",{className:"attribtable-overlay"},/*#__PURE__*/React.createElement(Spinner,null),/*#__PURE__*/React.createElement("span",null,LocaleUtils.tr("attribtable.loading")))}else{loadOverlay=/*#__PURE__*/React.createElement("div",{className:"attribtable-overlay"},/*#__PURE__*/React.createElement("span",null,LocaleUtils.tr("attribtable.pleasereload")))}}else if(this.state.selectedLayer&&this.state.deleteTask){loadOverlay=/*#__PURE__*/React.createElement("div",{className:"attribtable-overlay"},/*#__PURE__*/React.createElement(Spinner,null),/*#__PURE__*/React.createElement("span",null,LocaleUtils.tr("attribtable.deleting")))}var table=null;var footbar=null;if(currentEditConfig&&this.state.features){var fields=currentEditConfig.fields.reduce(function(res,field){if(field.id!=="id"){res.push(field)}return res},[]);var indexOffset=this.state.currentPage*this.state.pageSize;var features=this.state.filteredSortedFeatures.slice(indexOffset,indexOffset+this.state.pageSize);table=/*#__PURE__*/React.createElement("table",{className:"attribtable-table",ref:function ref(el){_this2.table=el}},/*#__PURE__*/React.createElement("thead",null,/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("th",null),/*#__PURE__*/React.createElement("th",{onClick:function onClick(){return _this2.sortBy("id")}},/*#__PURE__*/React.createElement("span",null,/*#__PURE__*/React.createElement("span",{className:"attribtable-table-headername"},"id"),this.renderSortIndicator("id"),this.renderColumnResizeHandle(1,"r"))),fields.map(function(field,idx){return/*#__PURE__*/React.createElement("th",{key:field.id,onClick:function onClick(){return _this2.sortBy(field.id)},title:_this2.translateFieldName(field.name,currentEditConfig.layerName)},/*#__PURE__*/React.createElement("span",null,_this2.renderColumnResizeHandle(idx+1,"l"),/*#__PURE__*/React.createElement("span",{className:"attribtable-table-headername"},_this2.translateFieldName(field.name,currentEditConfig.layerName)),_this2.renderSortIndicator(field.id),idx<fields.length-1?_this2.renderColumnResizeHandle(idx+2,"r"):null))}))),/*#__PURE__*/React.createElement("tbody",null,features.map(function(feature,filteredIndex){var featureidx=feature.originalIndex;var disabled=readOnly||_this2.state.changedFeatureIdx!==null&&_this2.state.changedFeatureIdx!==featureidx;var key=_this2.state.changedFeatureIdx===featureidx&&_this2.state.newFeature?"newfeature":feature.id;return/*#__PURE__*/React.createElement("tr",{className:disabled?"row-disabled":"",key:key,onMouseEnter:function onMouseEnter(){return _this2.setState({highlightedFeature:feature})},onMouseLeave:function onMouseLeave(){return _this2.setState(function(state){return{highlightedFeature:state.highlightedFeature===feature?null:state.highlightedFeature}})}},/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement("span",null,filteredIndex>0?_this2.renderRowResizeHandle(filteredIndex,"t"):null,/*#__PURE__*/React.createElement("input",{checked:_this2.state.selectedFeatures[feature.id]===true,onChange:function onChange(ev){return _this2.setState(function(state){return{selectedFeatures:_objectSpread(_objectSpread({},state.selectedFeatures),{},_defineProperty({},feature.id,ev.target.checked))}})},type:"checkbox"}),_this2.renderRowResizeHandle(filteredIndex+1,"b"))),/*#__PURE__*/React.createElement("td",null,feature.id),fields.map(function(field){return/*#__PURE__*/React.createElement("td",{key:field.id},_this2.renderField(currentEditConfig,field,featureidx,indexOffset+filteredIndex,disabled||!!_this2.state.filterVal&&field.id===_this2.state.filterField))}))})));var npages=Math.ceil(this.state.filteredSortedFeatures.length/this.state.pageSize);var pages=[this.state.currentPage];var extraright=Math.max(0,2-this.state.currentPage);var extraleft=Math.max(0,this.state.currentPage-(npages-3));for(var i=0;i<3+extraleft;++i){if(this.state.currentPage-i>0){pages.unshift(this.state.currentPage-i)}}for(var _i=0;_i<3+extraright;++_i){if(this.state.currentPage+_i<npages-1){pages.push(this.state.currentPage-_i+1)}}footbar=/*#__PURE__*/React.createElement("div",{className:"attribtable-footbar"},/*#__PURE__*/React.createElement(NavBar,{currentPage:this.state.currentPage,disabled:this.state.changedFeatureIdx!==null,nPages:npages,pageChanged:function pageChanged(currentPage){return _this2.setState({currentPage:currentPage})},pageSize:this.state.pageSize,pageSizeChanged:function pageSizeChanged(pageSize){return _this2.setState({pageSize:pageSize})}}),/*#__PURE__*/React.createElement("div",{className:"attribtable-filter controlgroup"},/*#__PURE__*/React.createElement(Icon,{icon:"filter"}),/*#__PURE__*/React.createElement("select",{disabled:this.state.changedFeatureIdx!==null,onChange:function onChange(ev){return _this2.updateFilter("filterField",ev.target.value)},value:this.state.filterField},/*#__PURE__*/React.createElement("option",{value:"id"},"id"),fields.map(function(field){return/*#__PURE__*/React.createElement("option",{key:field.id,value:field.id},field.name)})),/*#__PURE__*/React.createElement("select",{disabled:this.state.changedFeatureIdx!==null,onChange:function onChange(ev){return _this2.updateFilter("filterOp",ev.target.value)},value:this.state.filterOp},/*#__PURE__*/React.createElement("option",{value:"~"},"~"),/*#__PURE__*/React.createElement("option",{value:"="},"="),/*#__PURE__*/React.createElement("option",{value:">"},">"),/*#__PURE__*/React.createElement("option",{value:">="},">="),/*#__PURE__*/React.createElement("option",{value:"<="},"<="),/*#__PURE__*/React.createElement("option",{value:"<"},"<")),/*#__PURE__*/React.createElement(TextInput,{disabled:this.state.changedFeatureIdx!==null,onChange:function onChange(value){return _this2.updateFilter("filterVal",value,true)},value:this.state.filterVal})),this.props.showLimitToExtent?/*#__PURE__*/React.createElement("div",null,/*#__PURE__*/React.createElement("label",null,/*#__PURE__*/React.createElement("input",{checked:this.state.limitToExtent,onChange:function onChange(ev){return _this2.setState({limitToExtent:ev.target.checked})},type:"checkbox"})," ",LocaleUtils.tr("attribtable.limittoextent"))):null)}var nolayer=!this.state.selectedLayer;var loading=this.state.loading;var editing=this.state.changedFeatureIdx!==null;var layerChanged=this.state.selectedLayer!==this.state.loadedLayer;var hasGeometry=(currentEditConfig||{}).geomType!==null;var showAddButton=editPermissions.creatable!==false&&(this.props.allowAddForGeometryLayers||!hasGeometry);var showDelButton=editPermissions.deletable!==false;var showEditButton=ConfigUtils.havePlugin("Editing")&&this.props.showEditFormButton;var deleteButton=showDelButton?/*#__PURE__*/React.createElement("button",{className:"button",disabled:layerChanged||editing||!Object.values(this.state.selectedFeatures).find(function(entry){return entry===true}),onClick:function onClick(){return _this2.setState({confirmDelete:true})},title:LocaleUtils.tr("attribtable.deletefeatures")},/*#__PURE__*/React.createElement(Icon,{icon:"trash"})):null;var captchaBar=null;if(captchaRequired&&(this.state.changedFeatureIdx!==null||this.state.confirmDelete)){captchaBar=/*#__PURE__*/React.createElement("div",null,/*#__PURE__*/React.createElement(ReCaptchaWidget,{onChange:function onChange(value){return _this2.setState({captchaResponse:value})},sitekey:ConfigUtils.getConfigProp("editServiceCaptchaSiteKey")}))}return/*#__PURE__*/React.createElement("div",{className:"AttributeTable"},loadOverlay,/*#__PURE__*/React.createElement("div",{className:"attribtable-toolbar"},this.props.showLayerSelection?/*#__PURE__*/React.createElement("select",{disabled:loading||editing,onChange:function onChange(ev){return _this2.changeSelectedLayer(ev.target.value)},value:this.state.selectedLayer||""},/*#__PURE__*/React.createElement("option",{disabled:true,value:""},LocaleUtils.tr("attribtable.selectlayer")),Object.keys(editConfig).map(function(layerId){var _match$sublayer$title,_match$sublayer;var layerName=editConfig[layerId].layerName;var match=LayerUtils.searchLayer(_this2.props.layers,_this2.props.theme.url,layerName);return/*#__PURE__*/React.createElement("option",{key:layerId,value:layerId},(_match$sublayer$title=match===null||match===void 0||(_match$sublayer=match.sublayer)===null||_match$sublayer===void 0?void 0:_match$sublayer.title)!==null&&_match$sublayer$title!==void 0?_match$sublayer$title:layerName)})):null,/*#__PURE__*/React.createElement("button",{className:"button",disabled:editing||nolayer||this.state.loading,onClick:function onClick(){return _this2.reload()},title:LocaleUtils.tr("attribtable.reload")},/*#__PURE__*/React.createElement(Icon,{icon:"refresh"})),showAddButton?/*#__PURE__*/React.createElement("button",{className:"button",disabled:nolayer||editing||loading||layerChanged,onClick:this.addFeature,title:LocaleUtils.tr("attribtable.addfeature")},/*#__PURE__*/React.createElement(Icon,{icon:"plus"})):null,/*#__PURE__*/React.createElement("button",{className:"button",disabled:layerChanged||!Object.values(this.state.selectedFeatures).find(function(entry){return entry===true}),onClick:this.zoomToSelection,title:LocaleUtils.tr("attribtable.zoomtoselection")},/*#__PURE__*/React.createElement(Icon,{icon:"search"})),showEditButton?/*#__PURE__*/React.createElement("button",{className:"button",disabled:layerChanged||editing||Object.values(this.state.selectedFeatures).filter(function(entry){return entry===true}).length!==1,onClick:this.switchToFormEditMode,title:LocaleUtils.tr("attribtable.formeditmode")},/*#__PURE__*/React.createElement(Icon,{icon:"editing"})):null,this.state.confirmDelete?/*#__PURE__*/React.createElement("button",{className:"button button-accept",disabled:captchaPending,onClick:this.deleteSelectedFeatured},/*#__PURE__*/React.createElement(Icon,{icon:"ok"}),/*#__PURE__*/React.createElement("span",null,LocaleUtils.tr("attribtable.delete"))):deleteButton,this.state.confirmDelete?/*#__PURE__*/React.createElement("button",{className:"button button-reject",onClick:function onClick(){return _this2.setState({confirmDelete:false,captchaResponse:null})}},/*#__PURE__*/React.createElement(Icon,{icon:"remove"}),/*#__PURE__*/React.createElement("span",null,LocaleUtils.tr("attribtable.nodelete"))):null,this.state.changedFeatureIdx!==null?/*#__PURE__*/React.createElement("button",{className:"button button-accept",disabled:captchaPending,onClick:this.commit},/*#__PURE__*/React.createElement(Icon,{icon:"ok"}),/*#__PURE__*/React.createElement("span",null,LocaleUtils.tr("attribtable.commit"))):null,this.state.changedFeatureIdx!==null?/*#__PURE__*/React.createElement("button",{className:"button button-reject",onClick:this.discard},/*#__PURE__*/React.createElement(Icon,{icon:"remove"}),/*#__PURE__*/React.createElement("span",null,LocaleUtils.tr("attribtable.discard"))):null,/*#__PURE__*/React.createElement("button",{className:"button",disabled:isEmpty(this.state.features),onClick:function onClick(){return _this2.csvExport()},title:LocaleUtils.tr("attribtable.csvexport")},/*#__PURE__*/React.createElement(Icon,{icon:"export"}))),captchaBar,/*#__PURE__*/React.createElement("div",{className:"attribtable-contents",ref:function ref(el){_this2.attribTableContents=el}},table),footbar)}}])}(React.Component);_defineProperty(AttributeTableWidget,"propTypes",{addLayerFeatures:PropTypes.func,/** Whether to allow adding records for datasets which have a geometry column. */allowAddForGeometryLayers:PropTypes.bool,filter:PropTypes.object,iface:PropTypes.object,initialLayer:PropTypes.string,layers:PropTypes.array,mapBbox:PropTypes.object,mapCrs:PropTypes.string,mapScales:PropTypes.array,removeLayer:PropTypes.func,setCurrentTask:PropTypes.func,setCurrentTaskBlocked:PropTypes.func,/** Whether to show a button to open the edit form for selected layer. Requires the Editing plugin to be enabled. */showEditFormButton:PropTypes.bool,/** Whether to show the layer selection menu. */showLayerSelection:PropTypes.bool,/** Whether to show the "Limit to extent" checkbox */showLimitToExtent:PropTypes.bool,theme:PropTypes.object,/** The zoom level for zooming to point features. */zoomLevel:PropTypes.number,zoomToExtent:PropTypes.func,zoomToPoint:PropTypes.func});_defineProperty(AttributeTableWidget,"defaultProps",{zoomLevel:1000,showEditFormButton:true,showLayerSelection:true});_defineProperty(AttributeTableWidget,"defaultState",{loading:false,selectedLayer:"",loadedLayer:"",features:[],filteredSortedFeatures:[],selectedFeatures:{},highlightedFeature:null,changedFeatureIdx:null,originalFeatureProps:null,pageSize:50,currentPage:0,filterField:"id",filterOp:"~",filterVal:"",sortField:null,deleteTask:null,newFeature:false,confirmDelete:false,limitToExtent:false,captchaResponse:""});export default connect(function(state){return{layers:state.layers.flat,filter:state.layers.filter,mapBbox:state.map.bbox,mapCrs:state.map.projection,mapScales:state.map.scales,theme:state.theme.current}},{addLayerFeatures:addLayerFeatures,removeLayer:removeLayer,setCurrentTask:setCurrentTask,setCurrentTaskBlocked:setCurrentTaskBlocked,zoomToExtent:zoomToExtent,zoomToPoint:zoomToPoint})(AttributeTableWidget);
18
+ if(this.state.highlightedFeature!==prevState.highlightedFeature||this.state.filteredSortedFeatures!==prevState.filteredSortedFeatures){this.highlightFeatures()}}},{key:"componentWillUnmount",value:function componentWillUnmount(){this.props.removeLayer("__attributetablehighlight")}},{key:"render",value:function render(){var _this2=this;var captchaRequired=ConfigUtils.getConfigProp("editServiceCaptchaSiteKey")&&!ConfigUtils.getConfigProp("username");var captchaPending=captchaRequired&&!this.state.captchaResponse;var editConfig=this.props.theme.editConfig||{};var currentEditConfig=editConfig[this.state.loadedLayer];var editPermissions=(editConfig[this.state.loadedLayer]||{}).permissions||{};var readOnly=editPermissions.updatable===false;var loadOverlay=null;if(this.state.selectedLayer&&this.state.selectedLayer!==this.state.loadedLayer){if(this.state.loading){loadOverlay=/*#__PURE__*/React.createElement("div",{className:"attribtable-overlay"},/*#__PURE__*/React.createElement(Spinner,null),/*#__PURE__*/React.createElement("span",null,LocaleUtils.tr("attribtable.loading")))}else{loadOverlay=/*#__PURE__*/React.createElement("div",{className:"attribtable-overlay"},/*#__PURE__*/React.createElement("span",null,LocaleUtils.tr("attribtable.pleasereload")))}}else if(this.state.selectedLayer&&this.state.deleteTask){loadOverlay=/*#__PURE__*/React.createElement("div",{className:"attribtable-overlay"},/*#__PURE__*/React.createElement(Spinner,null),/*#__PURE__*/React.createElement("span",null,LocaleUtils.tr("attribtable.deleting")))}var table=null;var footbar=null;if(currentEditConfig&&this.state.features){var fields=currentEditConfig.fields.reduce(function(res,field){if(field.id!=="id"){res.push(field)}return res},[]);var indexOffset=this.state.currentPage*this.state.pageSize;var features=this.state.filteredSortedFeatures.slice(indexOffset,indexOffset+this.state.pageSize);table=/*#__PURE__*/React.createElement("table",{className:"attribtable-table",ref:function ref(el){_this2.table=el}},/*#__PURE__*/React.createElement("thead",null,/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("th",null),/*#__PURE__*/React.createElement("th",{onClick:function onClick(){return _this2.sortBy("id")},title:this.translateFieldName("id",this.state.loadedLayer)},/*#__PURE__*/React.createElement("span",null,/*#__PURE__*/React.createElement("span",{className:"attribtable-table-headername"},this.translateFieldName("id",this.state.loadedLayer)),this.renderSortIndicator("id"),this.renderColumnResizeHandle(1,"r"))),fields.map(function(field,idx){return/*#__PURE__*/React.createElement("th",{key:field.id,onClick:function onClick(){return _this2.sortBy(field.id)},title:_this2.translateFieldName(field.name,_this2.state.loadedLayer)},/*#__PURE__*/React.createElement("span",null,_this2.renderColumnResizeHandle(idx+1,"l"),/*#__PURE__*/React.createElement("span",{className:"attribtable-table-headername"},_this2.translateFieldName(field.name,_this2.state.loadedLayer)),_this2.renderSortIndicator(field.id),idx<fields.length-1?_this2.renderColumnResizeHandle(idx+2,"r"):null))}))),/*#__PURE__*/React.createElement("tbody",null,features.map(function(feature,filteredIndex){var featureidx=feature.originalIndex;var disabled=readOnly||_this2.state.changedFeatureIdx!==null&&_this2.state.changedFeatureIdx!==featureidx;var key=_this2.state.changedFeatureIdx===featureidx&&_this2.state.newFeature?"newfeature":feature.id;return/*#__PURE__*/React.createElement("tr",{className:disabled?"row-disabled":"",key:key,onMouseEnter:function onMouseEnter(){return _this2.setState({highlightedFeature:feature})},onMouseLeave:function onMouseLeave(){return _this2.setState(function(state){return{highlightedFeature:state.highlightedFeature===feature?null:state.highlightedFeature}})}},/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement("span",null,filteredIndex>0?_this2.renderRowResizeHandle(filteredIndex,"t"):null,/*#__PURE__*/React.createElement("input",{checked:_this2.state.selectedFeatures[feature.id]===true,onChange:function onChange(ev){return _this2.setState(function(state){return{selectedFeatures:_objectSpread(_objectSpread({},state.selectedFeatures),{},_defineProperty({},feature.id,ev.target.checked))}})},type:"checkbox"}),_this2.renderRowResizeHandle(filteredIndex+1,"b"))),/*#__PURE__*/React.createElement("td",null,feature.id),fields.map(function(field){return/*#__PURE__*/React.createElement("td",{key:field.id},_this2.renderField(currentEditConfig,field,featureidx,indexOffset+filteredIndex,disabled||!!_this2.state.filterVal&&field.id===_this2.state.filterField))}))})));var npages=Math.ceil(this.state.filteredSortedFeatures.length/this.state.pageSize);var pages=[this.state.currentPage];var extraright=Math.max(0,2-this.state.currentPage);var extraleft=Math.max(0,this.state.currentPage-(npages-3));for(var i=0;i<3+extraleft;++i){if(this.state.currentPage-i>0){pages.unshift(this.state.currentPage-i)}}for(var _i=0;_i<3+extraright;++_i){if(this.state.currentPage+_i<npages-1){pages.push(this.state.currentPage-_i+1)}}footbar=/*#__PURE__*/React.createElement("div",{className:"attribtable-footbar"},/*#__PURE__*/React.createElement(NavBar,{currentPage:this.state.currentPage,disabled:this.state.changedFeatureIdx!==null,nPages:npages,pageChanged:function pageChanged(currentPage){return _this2.setState({currentPage:currentPage})},pageSize:this.state.pageSize,pageSizeChanged:function pageSizeChanged(pageSize){return _this2.setState({pageSize:pageSize})}}),/*#__PURE__*/React.createElement("div",{className:"attribtable-filter controlgroup"},/*#__PURE__*/React.createElement(Icon,{icon:"filter"}),/*#__PURE__*/React.createElement("select",{disabled:this.state.changedFeatureIdx!==null,onChange:function onChange(ev){return _this2.updateFilter("filterField",ev.target.value)},value:this.state.filterField},/*#__PURE__*/React.createElement("option",{value:"id"},this.translateFieldName("id",this.state.loadedLayer)),fields.map(function(field){return/*#__PURE__*/React.createElement("option",{key:field.id,value:field.id},_this2.translateFieldName(field.name,_this2.state.loadedLayer))})),/*#__PURE__*/React.createElement("select",{disabled:this.state.changedFeatureIdx!==null,onChange:function onChange(ev){return _this2.updateFilter("filterOp",ev.target.value)},value:this.state.filterOp},/*#__PURE__*/React.createElement("option",{value:"~"},"~"),/*#__PURE__*/React.createElement("option",{value:"="},"="),/*#__PURE__*/React.createElement("option",{value:">"},">"),/*#__PURE__*/React.createElement("option",{value:">="},">="),/*#__PURE__*/React.createElement("option",{value:"<="},"<="),/*#__PURE__*/React.createElement("option",{value:"<"},"<")),/*#__PURE__*/React.createElement(TextInput,{disabled:this.state.changedFeatureIdx!==null,onChange:function onChange(value){return _this2.updateFilter("filterVal",value,true)},value:this.state.filterVal})),this.props.showLimitToExtent?/*#__PURE__*/React.createElement("div",null,/*#__PURE__*/React.createElement("label",null,/*#__PURE__*/React.createElement("input",{checked:this.state.limitToExtent,onChange:function onChange(ev){return _this2.setState({limitToExtent:ev.target.checked})},type:"checkbox"})," ",LocaleUtils.tr("attribtable.limittoextent"))):null)}var nolayer=!this.state.selectedLayer;var loading=this.state.loading;var editing=this.state.changedFeatureIdx!==null;var layerChanged=this.state.selectedLayer!==this.state.loadedLayer;var hasGeometry=(currentEditConfig||{}).geomType!==null;var showAddButton=editPermissions.creatable!==false&&(this.props.allowAddForGeometryLayers||!hasGeometry);var showDelButton=editPermissions.deletable!==false;var showEditButton=ConfigUtils.havePlugin("Editing")&&this.props.showEditFormButton;var deleteButton=showDelButton?/*#__PURE__*/React.createElement("button",{className:"button",disabled:layerChanged||editing||!Object.values(this.state.selectedFeatures).find(function(entry){return entry===true}),onClick:function onClick(){return _this2.setState({confirmDelete:true})},title:LocaleUtils.tr("attribtable.deletefeatures")},/*#__PURE__*/React.createElement(Icon,{icon:"trash"})):null;var captchaBar=null;if(captchaRequired&&(this.state.changedFeatureIdx!==null||this.state.confirmDelete)){captchaBar=/*#__PURE__*/React.createElement("div",null,/*#__PURE__*/React.createElement(ReCaptchaWidget,{onChange:function onChange(value){return _this2.setState({captchaResponse:value})},sitekey:ConfigUtils.getConfigProp("editServiceCaptchaSiteKey")}))}return/*#__PURE__*/React.createElement("div",{className:"AttributeTable"},loadOverlay,/*#__PURE__*/React.createElement("div",{className:"attribtable-toolbar"},this.props.showLayerSelection?/*#__PURE__*/React.createElement("select",{disabled:loading||editing,onChange:function onChange(ev){return _this2.changeSelectedLayer(ev.target.value)},value:this.state.selectedLayer||""},/*#__PURE__*/React.createElement("option",{disabled:true,value:""},LocaleUtils.tr("attribtable.selectlayer")),Object.keys(editConfig).map(function(layerId){var _this2$props$theme$tr,_this2$props$theme$tr2,_LayerUtils$searchLay,_LayerUtils$searchLay2;var layerName=editConfig[layerId].layerName;var layerTitle=editConfig[layerId].layerTitle?(_this2$props$theme$tr=(_this2$props$theme$tr2=_this2.props.theme.translations)===null||_this2$props$theme$tr2===void 0||(_this2$props$theme$tr2=_this2$props$theme$tr2.layertree)===null||_this2$props$theme$tr2===void 0?void 0:_this2$props$theme$tr2[layerName])!==null&&_this2$props$theme$tr!==void 0?_this2$props$theme$tr:editConfig[layerId].layerTitle:(_LayerUtils$searchLay=(_LayerUtils$searchLay2=LayerUtils.searchLayer(_this2.props.layers,_this2.props.theme.url,layerName))===null||_LayerUtils$searchLay2===void 0||(_LayerUtils$searchLay2=_LayerUtils$searchLay2.sublayer)===null||_LayerUtils$searchLay2===void 0?void 0:_LayerUtils$searchLay2.title)!==null&&_LayerUtils$searchLay!==void 0?_LayerUtils$searchLay:layerName;return/*#__PURE__*/React.createElement("option",{key:layerId,value:layerId},layerTitle)})):null,/*#__PURE__*/React.createElement("button",{className:"button",disabled:editing||nolayer||this.state.loading,onClick:function onClick(){return _this2.reload()},title:LocaleUtils.tr("attribtable.reload")},/*#__PURE__*/React.createElement(Icon,{icon:"refresh"})),showAddButton?/*#__PURE__*/React.createElement("button",{className:"button",disabled:nolayer||editing||loading||layerChanged,onClick:this.addFeature,title:LocaleUtils.tr("attribtable.addfeature")},/*#__PURE__*/React.createElement(Icon,{icon:"plus"})):null,/*#__PURE__*/React.createElement("button",{className:"button",disabled:layerChanged||!Object.values(this.state.selectedFeatures).find(function(entry){return entry===true}),onClick:this.zoomToSelection,title:LocaleUtils.tr("attribtable.zoomtoselection")},/*#__PURE__*/React.createElement(Icon,{icon:"search"})),showEditButton?/*#__PURE__*/React.createElement("button",{className:"button",disabled:layerChanged||editing||Object.values(this.state.selectedFeatures).filter(function(entry){return entry===true}).length!==1,onClick:this.switchToFormEditMode,title:LocaleUtils.tr("attribtable.formeditmode")},/*#__PURE__*/React.createElement(Icon,{icon:"editing"})):null,this.state.confirmDelete?/*#__PURE__*/React.createElement("button",{className:"button button-accept",disabled:captchaPending,onClick:this.deleteSelectedFeatured},/*#__PURE__*/React.createElement(Icon,{icon:"ok"}),/*#__PURE__*/React.createElement("span",null,LocaleUtils.tr("attribtable.delete"))):deleteButton,this.state.confirmDelete?/*#__PURE__*/React.createElement("button",{className:"button button-reject",onClick:function onClick(){return _this2.setState({confirmDelete:false,captchaResponse:null})}},/*#__PURE__*/React.createElement(Icon,{icon:"remove"}),/*#__PURE__*/React.createElement("span",null,LocaleUtils.tr("attribtable.nodelete"))):null,this.state.changedFeatureIdx!==null?/*#__PURE__*/React.createElement("button",{className:"button button-accept",disabled:captchaPending,onClick:this.commit},/*#__PURE__*/React.createElement(Icon,{icon:"ok"}),/*#__PURE__*/React.createElement("span",null,LocaleUtils.tr("attribtable.commit"))):null,this.state.changedFeatureIdx!==null?/*#__PURE__*/React.createElement("button",{className:"button button-reject",onClick:this.discard},/*#__PURE__*/React.createElement(Icon,{icon:"remove"}),/*#__PURE__*/React.createElement("span",null,LocaleUtils.tr("attribtable.discard"))):null,/*#__PURE__*/React.createElement("button",{className:"button",disabled:isEmpty(this.state.features),onClick:function onClick(){return _this2.csvExport()},title:LocaleUtils.tr("attribtable.csvexport")},/*#__PURE__*/React.createElement(Icon,{icon:"export"}))),captchaBar,/*#__PURE__*/React.createElement("div",{className:"attribtable-contents",ref:function ref(el){_this2.attribTableContents=el}},table),footbar)}}])}(React.Component);_defineProperty(AttributeTableWidget,"propTypes",{addLayerFeatures:PropTypes.func,/** Whether to allow adding records for datasets which have a geometry column. */allowAddForGeometryLayers:PropTypes.bool,filter:PropTypes.object,iface:PropTypes.object,initialLayer:PropTypes.string,layers:PropTypes.array,mapBbox:PropTypes.object,mapCrs:PropTypes.string,mapScales:PropTypes.array,removeLayer:PropTypes.func,setCurrentTask:PropTypes.func,setCurrentTaskBlocked:PropTypes.func,/** Whether to show a button to open the edit form for selected layer. Requires the Editing plugin to be enabled. */showEditFormButton:PropTypes.bool,/** Whether to show the layer selection menu. */showLayerSelection:PropTypes.bool,/** Whether to show the "Limit to extent" checkbox */showLimitToExtent:PropTypes.bool,theme:PropTypes.object,/** The zoom level for zooming to point features. */zoomLevel:PropTypes.number,zoomToExtent:PropTypes.func,zoomToPoint:PropTypes.func});_defineProperty(AttributeTableWidget,"defaultProps",{zoomLevel:1000,showEditFormButton:true,showLayerSelection:true});_defineProperty(AttributeTableWidget,"defaultState",{loading:false,selectedLayer:"",loadedLayer:"",features:[],filteredSortedFeatures:[],selectedFeatures:{},highlightedFeature:null,changedFeatureIdx:null,originalFeatureProps:null,pageSize:50,currentPage:0,filterField:"id",filterOp:"~",filterVal:"",sortField:null,deleteTask:null,newFeature:false,confirmDelete:false,limitToExtent:false,captchaResponse:""});export default connect(function(state){return{layers:state.layers.flat,filter:state.layers.filter,mapBbox:state.map.bbox,mapCrs:state.map.projection,mapScales:state.map.scales,theme:state.theme.current}},{addLayerFeatures:addLayerFeatures,removeLayer:removeLayer,setCurrentTask:setCurrentTask,setCurrentTaskBlocked:setCurrentTaskBlocked,zoomToExtent:zoomToExtent,zoomToPoint:zoomToPoint})(AttributeTableWidget);
@@ -5,9 +5,9 @@ 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 ol from"openlayers";import PropTypes from"prop-types";import FeatureStyles from"../utils/FeatureStyles";import MapUtils from"../utils/MapUtils";import MeasureUtils from"../utils/MeasureUtils";var MapSelection=/*#__PURE__*/function(_React$Component){function MapSelection(props){var _this;_classCallCheck(this,MapSelection);_this=_callSuper(this,MapSelection,[props]);_defineProperty(_this,"state",{geometry:null,modifiers:{alt:false,ctrl:false,shift:false}});_defineProperty(_this,"addDrawInteraction",function(){// cleanup old interaction
8
- if(_this.drawInteraction){_this.removeDrawInteraction()}if(_this.props.geomType==="DragBox"){_this.drawInteraction=new ol.interaction.DragBox({className:"selection-drag-box"});_this.drawInteraction.on("boxend",function(){_this.updateSelectionState(_this.drawInteraction.getGeometry())})}else{var typeMap={Point:"Point",LineString:"LineString",Polygon:"Polygon",Circle:"Circle",Box:"Circle"};if(!typeMap[_this.props.geomType]){// Unknown geom type
8
+ if(_this.drawInteraction){_this.removeDrawInteraction()}if(_this.props.geomType==="DragBox"){_this.drawInteraction=new ol.interaction.DragBox({className:"selection-drag-box",condition:_this.props.drawCondition});_this.drawInteraction.on("boxend",function(){_this.updateSelectionState(_this.drawInteraction.getGeometry())})}else{var typeMap={Point:"Point",LineString:"LineString",Polygon:"Polygon",Circle:"Circle",Box:"Circle"};if(!typeMap[_this.props.geomType]){// Unknown geom type
9
9
  return}// create an interaction to draw with
10
- _this.drawInteraction=new ol.interaction.Draw({stopClick:true,source:_this.selectionLayer.getSource(),condition:function condition(event){return event.originalEvent.buttons===1},type:typeMap[_this.props.geomType],style:function style(feature){return FeatureStyles[_this.props.styleName](feature,_objectSpread(_objectSpread({},_this.props.styleOptions),{},{circleRadius:0}))},geometryFunction:_this.props.geomType==="Box"?ol.interaction.createBox():undefined});_this.drawInteraction.on("drawstart",function(evt){// clear previous sketches
10
+ _this.drawInteraction=new ol.interaction.Draw({stopClick:true,source:_this.selectionLayer.getSource(),condition:_this.props.drawCondition,type:typeMap[_this.props.geomType],style:function style(feature){return FeatureStyles[_this.props.styleName](feature,_objectSpread(_objectSpread({},_this.props.styleOptions),{},{circleRadius:0}))},geometryFunction:_this.props.geomType==="Box"?ol.interaction.createBox():undefined});_this.drawInteraction.on("drawstart",function(evt){// clear previous sketches
11
11
  _this.selectionLayer.getSource().clear();evt.feature.on("change",function(){return _this.updateMeasurements(evt.feature)})},_this);_this.drawInteraction.on("drawend",function(evt){_this.updateSelectionState(evt.feature.getGeometry())},_this)}_this.map.addInteraction(_this.drawInteraction);window.addEventListener("keydown",_this.checkModifier);window.addEventListener("keyup",_this.checkModifier);if(_this.props.cursor){_this.map.getViewport().style.cursor=_this.props.cursor}});_defineProperty(_this,"removeDrawInteraction",function(){if(_this.drawInteraction!==null){_this.map.removeInteraction(_this.drawInteraction);_this.drawInteraction=null}window.removeEventListener("keydown",_this.checkModifier);window.removeEventListener("keyup",_this.checkModifier);_this.map.getViewport().style.cursor=""});_defineProperty(_this,"checkModifier",function(ev){var down=ev.type==="keydown";_this.setState(function(state){return{modifiers:{alt:ev.key==="Alt"?down:state.modifiers.alt,ctrl:ev.key==="Control"?down:state.modifiers.ctrl,shift:ev.key==="Shift"?down:state.modifiers.shift}}})});_defineProperty(_this,"updateSelectionState",function(geometry){if(!geometry){return}var coords=_this.props.geomType==="Circle"?null:geometry.getCoordinates();if(_this.props.geomType==="Circle"){// Also store poligonized circle
12
12
  var center=geometry.getCenter();var radius=geometry.getRadius();var deg2rad=Math.PI/180;var polycords=[Array.apply(null,Array(91)).map(function(item,index){return[center[0]+radius*Math.cos(4*index*deg2rad),center[1]+radius*Math.sin(4*index*deg2rad)]})];_this.setState({geometry:{type:"Polygon",coordinates:polycords,center:center,radius:radius}})}else if(_this.props.geomType==="DragBox"||_this.props.geomType==="Box"){var boxcoords=[[Math.min(coords[0][0][0],coords[0][2][0]),Math.min(coords[0][0][1],coords[0][2][1]),Math.max(coords[0][0][0],coords[0][2][0]),Math.max(coords[0][0][1],coords[0][2][1])]];_this.setState({geometry:{type:"Polygon",coordinates:boxcoords}})}else{_this.setState({geometry:{type:_this.props.geomType,coordinates:coords}})}});_defineProperty(_this,"updateMeasurements",function(feature){if(!_this.props.measure){return}var settings={lenUnit:"metric",areaUnit:"metric"};MeasureUtils.updateFeatureMeasurements(feature,_this.props.geomType,_this.props.projection,settings)});_this.drawInteraction=null;_this.map=MapUtils.getHook(MapUtils.GET_MAP);// create a layer to draw on
13
- _this.selectionLayer=new ol.layer.Vector({source:new ol.source.Vector,zIndex:1000000,style:function style(feature){return FeatureStyles[_this.props.styleName](feature,_this.props.styleOptions)}});_this.map.addLayer(_this.selectionLayer);_this.selectionLayer.setVisible(!_this.props.hideGeometry);return _this}_inherits(MapSelection,_React$Component);return _createClass(MapSelection,[{key:"componentDidMount",value:function componentDidMount(){if(this.props.active){this.addDrawInteraction()}}},{key:"componentDidUpdate",value:function componentDidUpdate(prevProps,prevState){if(this.props.hideGeometry!==prevProps.hideGeometry){this.selectionLayer.setVisible(!this.props.hideGeometry)}if(this.props.geomType!==prevProps.geomType){this.selectionLayer.getSource().clear()}if(this.props.active&&!prevProps.active||this.props.active&&this.props.geomType!==prevProps.geomType){this.addDrawInteraction()}else if(!this.props.active&&prevProps.active){this.removeDrawInteraction()}if(this.state.geometry!==prevState.geometry){if(this.state.geometry!==this.props.geometry){this.props.geometryChanged(this.state.geometry,_objectSpread({},this.state.modifiers))}}if(this.props.geometry!==prevProps.geometry&&this.props.geometry!==this.state.geometry){if(!this.props.geometry){this.selectionLayer.getSource().clear()}else{var feature=this.selectionLayer.getSource().getFeatures()[0];if(!feature){feature=new ol.Feature;this.selectionLayer.getSource().addFeature(feature)}if(this.props.geometry.type==="Point"){feature.setGeometry(new ol.geom.Point(this.props.geometry.coordinates))}else if(this.props.geometry.type==="MultiPoint"){feature.setGeometry(new ol.geom.Multi(this.props.geometry.coordinates))}else if(this.props.geometry.type==="LineString"){feature.setGeometry(new ol.geom.LineString(this.props.geometry.coordinates))}else if(this.props.geometry.type==="MultiLineString"){feature.setGeometry(new ol.geom.MultiLineString(this.props.geometry.coordinates))}else if(this.props.geometry.type==="Polygon"){if(this.props.geometry.center&&this.props.geometry.radius){feature.setGeometry(new ol.geom.Circle(this.props.geometry.center,this.props.geometry.radius))}else{feature.setGeometry(new ol.geom.Polygon(this.props.geometry.coordinates))}}else if(this.props.geometry.type==="MultiPolygon"){feature.setGeometry(new ol.geom.MultiPolygon(this.props.geometry.coordinates))}this.setState({geometry:this.props.geometry})}}}},{key:"componentWillUnmount",value:function componentWillUnmount(){this.map.removeLayer(this.selectionLayer);this.removeDrawInteraction()}},{key:"render",value:function render(){return null}}])}(React.Component);_defineProperty(MapSelection,"propTypes",{/** Whether the selection tool is active */active:PropTypes.bool,/** Optional, a css-cursor to use when drawing */cursor:PropTypes.string,/** The selection geometry type (Point, LineString, Polygon, Circle, DragBox, Box) */geomType:PropTypes.string,/** Initial geometry or geometry to update. */geometry:PropTypes.object,/** The callback which is invoked with a drawn geometry. */geometryChanged:PropTypes.func,/** Whether to hide the current selection (except while drawing). */hideGeometry:PropTypes.bool,/** Whether to show measurements while drawing. */measure:PropTypes.bool,projection:PropTypes.string,/** Optional: the selection feature style name. */styleName:PropTypes.string,/** Optional: the selection feature style options. */styleOptions:PropTypes.object});_defineProperty(MapSelection,"defaultProps",{styleName:"default",styleOptions:{}});export default connect(function(state){return{projection:state.map.projection}},{})(MapSelection);
13
+ _this.selectionLayer=new ol.layer.Vector({source:new ol.source.Vector,zIndex:1000000,style:function style(feature){return FeatureStyles[_this.props.styleName](feature,_this.props.styleOptions)}});_this.map.addLayer(_this.selectionLayer);_this.selectionLayer.setVisible(!_this.props.hideGeometry);return _this}_inherits(MapSelection,_React$Component);return _createClass(MapSelection,[{key:"componentDidMount",value:function componentDidMount(){if(this.props.active){this.addDrawInteraction()}}},{key:"componentDidUpdate",value:function componentDidUpdate(prevProps,prevState){if(this.props.hideGeometry!==prevProps.hideGeometry){this.selectionLayer.setVisible(!this.props.hideGeometry)}if(this.props.geomType!==prevProps.geomType){this.selectionLayer.getSource().clear()}if(this.props.active&&!prevProps.active||this.props.active&&this.props.geomType!==prevProps.geomType){this.addDrawInteraction()}else if(!this.props.active&&prevProps.active){this.removeDrawInteraction()}if(this.state.geometry!==prevState.geometry){if(this.state.geometry!==this.props.geometry){this.props.geometryChanged(this.state.geometry,_objectSpread({},this.state.modifiers))}}if(this.props.geometry!==prevProps.geometry&&this.props.geometry!==this.state.geometry){if(!this.props.geometry){this.selectionLayer.getSource().clear()}else{var feature=this.selectionLayer.getSource().getFeatures()[0];if(!feature){feature=new ol.Feature;this.selectionLayer.getSource().addFeature(feature)}if(this.props.geometry.type==="Point"){feature.setGeometry(new ol.geom.Point(this.props.geometry.coordinates))}else if(this.props.geometry.type==="MultiPoint"){feature.setGeometry(new ol.geom.Multi(this.props.geometry.coordinates))}else if(this.props.geometry.type==="LineString"){feature.setGeometry(new ol.geom.LineString(this.props.geometry.coordinates))}else if(this.props.geometry.type==="MultiLineString"){feature.setGeometry(new ol.geom.MultiLineString(this.props.geometry.coordinates))}else if(this.props.geometry.type==="Polygon"){if(this.props.geometry.center&&this.props.geometry.radius){feature.setGeometry(new ol.geom.Circle(this.props.geometry.center,this.props.geometry.radius))}else{feature.setGeometry(new ol.geom.Polygon(this.props.geometry.coordinates))}}else if(this.props.geometry.type==="MultiPolygon"){feature.setGeometry(new ol.geom.MultiPolygon(this.props.geometry.coordinates))}this.setState({geometry:this.props.geometry})}}}},{key:"componentWillUnmount",value:function componentWillUnmount(){this.map.removeLayer(this.selectionLayer);this.removeDrawInteraction()}},{key:"render",value:function render(){return null}}])}(React.Component);_defineProperty(MapSelection,"propTypes",{/** Whether the selection tool is active */active:PropTypes.bool,/** Optional, a css-cursor to use when drawing */cursor:PropTypes.string,/** The draw interaction condition. */drawCondition:PropTypes.func,/** The selection geometry type (Point, LineString, Polygon, Circle, DragBox, Box) */geomType:PropTypes.string,/** Initial geometry or geometry to update. */geometry:PropTypes.object,/** The callback which is invoked with a drawn geometry. */geometryChanged:PropTypes.func,/** Whether to hide the current selection (except while drawing). */hideGeometry:PropTypes.bool,/** Whether to show measurements while drawing. */measure:PropTypes.bool,projection:PropTypes.string,/** Optional: the selection feature style name. */styleName:PropTypes.string,/** Optional: the selection feature style options. */styleOptions:PropTypes.object});_defineProperty(MapSelection,"defaultProps",{drawCondition:function drawCondition(event){return event.originalEvent.buttons===1},styleName:"default",styleOptions:{}});export default connect(function(state){return{projection:state.map.projection}},{})(MapSelection);
@@ -24,8 +24,8 @@ if(_parts.length===3||_parts.length===4){var _feature$properties4;var layer=_par
24
24
  var reldataset=_this.props.mapPrefix+reltable;var displayField=attrname.split("__")[1];if(feature.__status__!=="empty"){var featurebuttons=[{key:"Edit",icon:"editing",label:String(value!==null&&value!==void 0?value:"")}];return/*#__PURE__*/React.createElement("div",{className:"qt-designer-form-featurelink-buttons"},/*#__PURE__*/React.createElement(ButtonBar,{buttons:featurebuttons,forceLabel:true,onClick:function onClick(){return _this.props.editRelationRecord("Edit",reltable,reldataset,index,displayField)}}))}else{var _featurebuttons=[];if(feature.geometry!==null){_featurebuttons.push({key:"Pick",icon:"pick",label:LocaleUtils.tr("editing.pick")})}_featurebuttons.push({key:"Create",icon:"editdraw",label:LocaleUtils.tr("editing.create")});return/*#__PURE__*/React.createElement(ButtonBar,{buttons:_featurebuttons,forceLabel:true,onClick:function onClick(action){return _this.props.editRelationRecord(action,reltable,reldataset,index,displayField)}})}}else{if(value!==null){var _featurebuttons2=[{key:"Edit",icon:"editing",label:String(value!==null&&value!==void 0?value:"")}];return/*#__PURE__*/React.createElement("div",{className:"qt-designer-form-featurelink-buttons"},/*#__PURE__*/React.createElement(ButtonBar,{buttons:_featurebuttons2,onClick:function onClick(){return _this.props.switchEditContext("Edit",layer,value,function(v){return updateField(attrname,v)},attrname)}}),/*#__PURE__*/React.createElement("button",{className:"button",onClick:function onClick(){return updateField(attrname,null)},type:"button"},/*#__PURE__*/React.createElement(Icon,{icon:"clear"})))}else{var _featurebuttons3=[{key:"Pick",icon:"pick",label:LocaleUtils.tr("editing.pick")},{key:"Create",icon:"editdraw",label:LocaleUtils.tr("editing.create")}];return/*#__PURE__*/React.createElement(ButtonBar,{buttons:_featurebuttons3,onClick:function onClick(action){return _this.props.switchEditContext(action,layer,null,function(v){return updateField(attrname,v)},attrname)}})}}}}}else if(widget["class"]==="QStackedWidget"){return _this.renderLayout(widget.widget[parseInt(widget.property.currentIndex,10)].layout,feature,editConfig,updateField,nametransform)}return null});_defineProperty(_this,"renderNRelation",function(widget){var _widget$property2,_editConfig$fields,_this$props$feature$r;var parts=widget.name.split("__");if(parts.length<3){return null}var disabled=String((_widget$property2=widget.property)===null||_widget$property2===void 0?void 0:_widget$property2.enabled)==="false";var tablename=parts[1];var sortcol=parts[3]||null;var noreorder=parts[4]||false;var headerItems=widget.layout.item.filter(function(item){return item.widget&&item.widget.name.startsWith("header__")}).sort(function(a,b){return a.column-b.column});var widgetItems=widget.layout.item.filter(function(item){return!item.widget||!item.widget.name.startsWith("header__")}).sort(function(a,b){return a.column-b.column});var tableFitWidgets=["QLabel","QCheckBox","QRadioButton","QDateTimeEdit","QDateEdit","QTimeEdit"];var columnStyles=widgetItems.map(function(item){return item.widget&&tableFitWidgets.includes(item.widget["class"])?{width:"1px"}:{}});var editConfig=_this.props.editConfigs[tablename];if(!editConfig){// Relation dataset not permitted / no edit config available
25
25
  return null}var relDataset=editConfig.editDataset;var fields=((_editConfig$fields=editConfig.fields)!==null&&_editConfig$fields!==void 0?_editConfig$fields:[]).reduce(function(res,field){return _objectSpread(_objectSpread({},res),{},_defineProperty({},field.id,field))},{});return/*#__PURE__*/React.createElement("div",{className:"qt-designer-widget-relation"},/*#__PURE__*/React.createElement("div",{className:"qt-designer-widget-relation-table-container"},!_this.props.feature.relationValues?/*#__PURE__*/React.createElement("div",{className:"qt-designer-widget-relation-table-loading"},/*#__PURE__*/React.createElement(Spinner,null)):null,/*#__PURE__*/React.createElement("table",null,/*#__PURE__*/React.createElement("tbody",null,!isEmpty(headerItems)?/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("th",null),headerItems.map(function(item){return/*#__PURE__*/React.createElement("th",{key:item.widget.name},item.widget.property.text)}),/*#__PURE__*/React.createElement("th",null)):null,(((_this$props$feature$r=_this.props.feature.relationValues)===null||_this$props$feature$r===void 0||(_this$props$feature$r=_this$props$feature$r[relDataset])===null||_this$props$feature$r===void 0?void 0:_this$props$feature$r.features)||[]).map(function(feature,idx){var updateField=function updateField(name,value){var fieldname=name.slice(tablename.length+2);// Strip <tablename>__ prefix
26
26
  _this.props.updateRelationField(relDataset,idx,fieldname,value)};var nametransform=function nametransform(name){return name+"__"+idx};var status=feature.__status__||"";var relFeature=_objectSpread(_objectSpread({},feature),{},{properties:Object.entries(feature.properties).reduce(function(res,_ref2){var _ref3=_slicedToArray(_ref2,2),key=_ref3[0],value=_ref3[1];return _objectSpread(_objectSpread({},res),{},_defineProperty({},tablename+"__"+key,value))},{})});var statusIcon=null;if(status==="empty"){// Pass
27
- }else if(status==="new"){statusIcon="new"}else if(status){statusIcon="edited"}var statusText="";if(feature.error){statusIcon="warning";statusText=_this.buildErrMsg(feature)}var extraClass=status.startsWith("deleted")?"qt-designer-widget-relation-record-deleted":"";return/*#__PURE__*/React.createElement("tr",{className:"qt-designer-widget-relation-record "+extraClass,key:relDataset+idx},/*#__PURE__*/React.createElement("td",{className:"qt-designer-widget-relation-record-icon"},statusIcon?/*#__PURE__*/React.createElement(Icon,{icon:statusIcon,title:statusText}):null),widgetItems.map(function(item,widx){if(item.widget){return/*#__PURE__*/React.createElement("td",{className:"qt-designer-widget-relation-row-widget",key:item.widget.name,style:columnStyles[widx]},_this.renderWidget(item.widget,relFeature,editConfig,fields,updateField,nametransform,true,disabled))}else if(item.spacer){return/*#__PURE__*/React.createElement("td",{key:"spacer_"+widx})}else{return null}}),!_this.props.readOnly&&!disabled&&sortcol&&!noreorder?/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement(Icon,{icon:"chevron-up",onClick:function onClick(){return _this.props.reorderRelationRecord(relDataset,idx,-1)}}),/*#__PURE__*/React.createElement("br",null),/*#__PURE__*/React.createElement(Icon,{icon:"chevron-down",onClick:function onClick(){return _this.props.reorderRelationRecord(relDataset,idx,1)}})):null,!_this.props.readOnly&&!disabled?/*#__PURE__*/React.createElement("td",{className:"qt-designer-widget-relation-record-icon"},/*#__PURE__*/React.createElement(Icon,{icon:"trash",onClick:function onClick(){return _this.props.removeRelationRecord(relDataset,idx)}})):null)})))),!_this.props.readOnly?/*#__PURE__*/React.createElement("div",{className:"qt-designer-widget-relation-buttons"},/*#__PURE__*/React.createElement("button",{className:"button qt-designer-widget-relation-add",disabled:!_this.props.feature.relationValues,onClick:function onClick(ev){return _this.addRelationRecord(ev,relDataset)},type:"button"},LocaleUtils.tr("editing.add"))):null,/*#__PURE__*/React.createElement("div",{className:"qt-designer-widget-relation-resize-handle",onPointerDown:_this.startRelationTableResize}))});_defineProperty(_this,"addRelationRecord",function(ev,datasetname){_this.setState({relationAddPressed:ev.target});_this.props.addRelationRecord(datasetname)});_defineProperty(_this,"startRelationTableResize",function(ev){var container=ev.target.parentElement.parentElement;if(!container){return}var startHeight=container.offsetHeight;var startMouseY=ev.clientY;var resizeInput=function resizeInput(event){container.style.height=Math.max(30,startHeight+(event.clientY-startMouseY))+"px"};ev.view.document.body.style.userSelect="none";ev.view.addEventListener("pointermove",resizeInput);ev.view.addEventListener("pointerup",function(){ev.view.document.body.style.userSelect="";ev.view.removeEventListener("pointermove",resizeInput)},{once:true})});_defineProperty(_this,"groupOrName",function(widget){return widget.attribute&&widget.attribute.buttonGroup?widget.attribute.buttonGroup._:widget.name});_defineProperty(_this,"dateConstraint",function(constr){return constr.year+"-"+("0"+constr.month).slice(-2)+"-"+("0"+constr.day).slice(-2)});_defineProperty(_this,"parseForm",function(data){var loadingReqId=uuidv1();_this.setState({loading:true,loadingReqId:loadingReqId});var parserOpts={isArray:function isArray(){return false},ignoreAttributes:false,attributeNamePrefix:""};var json=new XMLParser(parserOpts).parse(data);var relationTables={};var externalFields={};var widgets={};var fields={};var buttons={};var nrels={};var counters={widget:0,layout:0};_this.reformatWidget(json.ui.widget,relationTables,fields,buttons,nrels,externalFields,widgets,counters);// console.log(json);
28
- json.externalFields=externalFields;json.widgets=widgets;json.fields=fields;json.buttons=buttons;json.nrels=nrels;if(FormPreprocessors[_this.props.editConfig.editDataset]){FormPreprocessors[_this.props.editConfig.editDataset](json,_this.props.feature,function(formData){if(_this.state.loadingReqId===loadingReqId){_this.setState({formData:formData,loading:false,loadingReqId:null})}})}else{_this.setState({formData:json,loading:false,loadingReqId:null})}_this.props.setRelationTables(relationTables)});_defineProperty(_this,"reformatWidget",function(widget,relationTables,fields,buttons,nrels,externalFields,widgets,counters){if(widget.property){widget.property=MiscUtils.ensureArray(widget.property).reduce(function(res,prop){return _objectSpread(_objectSpread({},res),{},_defineProperty({},prop.name,prop[Object.keys(prop).find(function(key){return key!=="name"})]))},{})}else{widget.property={}}if(widget.attribute){widget.attribute=MiscUtils.ensureArray(widget.attribute).reduce(function(res,prop){return _objectSpread(_objectSpread({},res),{},_defineProperty({},prop.name,prop[Object.keys(prop).find(function(key){return key!=="name"})]))},{})}else{widget.attribute={}}var verticalFill=false;if(widget.item){MiscUtils.ensureArray(widget.item).forEach(function(item){verticalFill|=_this.reformatWidget(item,relationTables,fields,buttons,nrels,externalFields,widgets,counters)})}widget.name=widget.name||":widget_"+counters.widget++;var fieldNames=_this.props.editConfig.fields.map(function(field){return field.id});if(fieldNames.includes(widget.name)){fields[widget.name]=widget}else if(widget.name.startsWith("kvrel__")||widget.name.startsWith("img__")){var _parts2=widget.name.split("__");if(fieldNames.includes(_parts2[1])){fields[_parts2[1]]=widget}}else if(widget.name.startsWith("btn__")){buttons[widget.name.split("__")[1]]=widget}else if(widget.name.startsWith("nrel__")){nrels[widget.name.split("__")[1]]=widget}if(widget.name.startsWith("ext__")){externalFields[widget.name.slice(5)]=""}widgets[widget.name]=widget;if(widget.layout){verticalFill|=_this.reformatLayout(widget.layout,relationTables,fields,buttons,nrels,externalFields,widgets,counters)}if(widget.widget){widget.widget=Array.isArray(widget.widget)?widget.widget:[widget.widget];widget.widget.forEach(function(child){child.name=":widget_"+counters.widget++;verticalFill|=_this.reformatWidget(child,relationTables,fields,buttons,nrels,externalFields,widgets,counters)})}if(widget.name.startsWith("nrel__")||!widget.layout&&!vFitWidgets.includes(widget["class"])){verticalFill=true}var parts=widget.name.split("__");if(parts.length>=3&&parts[0]==="nrel"){relationTables[_this.props.mapPrefix+parts[1]]={fk:parts[2],sortcol:parts[3]||null,noreorder:parts[4]||false}}return verticalFill});_defineProperty(_this,"reformatLayout",function(layout,relationTables,fields,buttons,nrels,externalFields,widgets,counters){layout.item=MiscUtils.ensureArray(layout.item);layout.name=layout.name||":layout_"+counters.layout++;var verticalFill=false;layout.item.forEach(function(item){if(!item){return}else if(item.widget){verticalFill|=_this.reformatWidget(item.widget,relationTables,fields,buttons,nrels,externalFields,widgets,counters)}else if(item.spacer){item.spacer.property=MiscUtils.ensureArray(item.spacer.property).reduce(function(res,prop){return _objectSpread(_objectSpread({},res),{},_defineProperty({},prop.name,prop[Object.keys(prop).find(function(key){return key!=="name"})]))},{});if(item.spacer.property.orientation==="Qt::Vertical"){verticalFill=true}}else if(item.layout){verticalFill|=_this.reformatLayout(item.layout,relationTables,fields,buttons,nrels,externalFields,widgets,counters)}});layout.verticalFill=verticalFill;return verticalFill});_defineProperty(_this,"buildErrMsg",function(record){var message=record.error;var errorDetails=record.error_details||{};if(!isEmpty(errorDetails.geometry_errors)){message+=":\n";message+=errorDetails.geometry_errors.map(function(entry){return" - "+entry.reason+" at "+entry.location})}if(!isEmpty(errorDetails.data_errors)){message+=":\n - "+errorDetails.data_errors.join("\n - ")}if(!isEmpty(errorDetails.validation_errors)){message+=":\n - "+errorDetails.validation_errors.join("\n - ")}return message});_defineProperty(_this,"translateFormString",function(label,layerName){var _this$props$translati,_this$props$translati2;return(_this$props$translati=(_this$props$translati2=_this.props.translations)===null||_this$props$translati2===void 0||(_this$props$translati2=_this$props$translati2.layers)===null||_this$props$translati2===void 0||(_this$props$translati2=_this$props$translati2[layerName])===null||_this$props$translati2===void 0||(_this$props$translati2=_this$props$translati2.form)===null||_this$props$translati2===void 0?void 0:_this$props$translati2[label])!==null&&_this$props$translati!==void 0?_this$props$translati:label});_defineProperty(_this,"translateFieldName",function(fieldName,layerName){var _this$props$translati3,_this$props$translati4;return(_this$props$translati3=(_this$props$translati4=_this.props.translations)===null||_this$props$translati4===void 0||(_this$props$translati4=_this$props$translati4.layers)===null||_this$props$translati4===void 0||(_this$props$translati4=_this$props$translati4[layerName])===null||_this$props$translati4===void 0||(_this$props$translati4=_this$props$translati4.fields)===null||_this$props$translati4===void 0?void 0:_this$props$translati4[fieldName])!==null&&_this$props$translati3!==void 0?_this$props$translati3:fieldName});_this.state=QtDesignerForm.defaultState;return _this}_inherits(QtDesignerForm,_React$Component);return _createClass(QtDesignerForm,[{key:"componentDidMount",value:function componentDidMount(){this.componentDidUpdate({})}},{key:"componentDidUpdate",value:function componentDidUpdate(prevProps){var _prevProps$editConfig,_prevProps$feature,_this2=this;// Query form
27
+ }else if(status==="new"){statusIcon="new"}else if(status){statusIcon="edited"}var statusText="";if(feature.error){statusIcon="warning";statusText=_this.buildErrMsg(feature)}var extraClass=status.startsWith("deleted")?"qt-designer-widget-relation-record-deleted":"";return/*#__PURE__*/React.createElement("tr",{className:"qt-designer-widget-relation-record "+extraClass,key:relDataset+idx},/*#__PURE__*/React.createElement("td",{className:"qt-designer-widget-relation-record-icon"},statusIcon?/*#__PURE__*/React.createElement(Icon,{icon:statusIcon,title:statusText}):null),widgetItems.map(function(item,widx){if(item.widget){return/*#__PURE__*/React.createElement("td",{className:"qt-designer-widget-relation-row-widget",key:item.widget.name,style:columnStyles[widx]},_this.renderWidget(item.widget,relFeature,editConfig,fields,updateField,nametransform,true,disabled))}else if(item.spacer){return/*#__PURE__*/React.createElement("td",{key:"spacer_"+widx})}else{return null}}),!_this.props.readOnly&&!disabled&&sortcol&&!noreorder?/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement(Icon,{icon:"chevron-up",onClick:function onClick(){return _this.props.reorderRelationRecord(relDataset,idx,-1)}}),/*#__PURE__*/React.createElement("br",null),/*#__PURE__*/React.createElement(Icon,{icon:"chevron-down",onClick:function onClick(){return _this.props.reorderRelationRecord(relDataset,idx,1)}})):null,!_this.props.readOnly&&!disabled?/*#__PURE__*/React.createElement("td",{className:"qt-designer-widget-relation-record-icon"},/*#__PURE__*/React.createElement(Icon,{icon:"trash",onClick:function onClick(){return _this.props.removeRelationRecord(relDataset,idx)}})):null)})))),!_this.props.readOnly?/*#__PURE__*/React.createElement("div",{className:"qt-designer-widget-relation-buttons"},/*#__PURE__*/React.createElement("button",{className:"button qt-designer-widget-relation-add",disabled:!_this.props.feature.relationValues,onClick:function onClick(ev){return _this.addRelationRecord(ev,relDataset)},type:"button"},LocaleUtils.tr("editing.add"))):null,/*#__PURE__*/React.createElement("div",{className:"qt-designer-widget-relation-resize-handle",onPointerDown:_this.startRelationTableResize}))});_defineProperty(_this,"addRelationRecord",function(ev,datasetname){_this.setState({relationAddPressed:ev.target});_this.props.addRelationRecord(datasetname)});_defineProperty(_this,"startRelationTableResize",function(ev){var container=ev.target.parentElement.parentElement;if(!container){return}var startHeight=container.offsetHeight;var startMouseY=ev.clientY;var resizeInput=function resizeInput(event){container.style.height=Math.max(30,startHeight+(event.clientY-startMouseY))+"px"};ev.view.document.body.style.userSelect="none";ev.view.addEventListener("pointermove",resizeInput);ev.view.addEventListener("pointerup",function(){ev.view.document.body.style.userSelect="";ev.view.removeEventListener("pointermove",resizeInput)},{once:true})});_defineProperty(_this,"groupOrName",function(widget){return widget.attribute&&widget.attribute.buttonGroup?widget.attribute.buttonGroup._:widget.name});_defineProperty(_this,"dateConstraint",function(constr){return constr.year+"-"+("0"+constr.month).slice(-2)+"-"+("0"+constr.day).slice(-2)});_defineProperty(_this,"parseForm",function(data){var loadingReqId=uuidv1();_this.setState({loading:true,loadingReqId:loadingReqId},function(){var parserOpts={isArray:function isArray(){return false},ignoreAttributes:false,attributeNamePrefix:""};var json=new XMLParser(parserOpts).parse(data);var relationTables={};var externalFields={};var widgets={};var fields={};var buttons={};var nrels={};var counters={widget:0,layout:0};_this.reformatWidget(json.ui.widget,relationTables,fields,buttons,nrels,externalFields,widgets,counters);// console.log(json);
28
+ json.externalFields=externalFields;json.widgets=widgets;json.fields=fields;json.buttons=buttons;json.nrels=nrels;if(FormPreprocessors[_this.props.editConfig.editDataset]){FormPreprocessors[_this.props.editConfig.editDataset](json,_this.props.feature,function(formData){if(_this.state.loadingReqId===loadingReqId){_this.setState({formData:formData,loading:false,loadingReqId:null})}})}else{_this.setState({formData:json,loading:false,loadingReqId:null})}_this.props.setRelationTables(relationTables)})});_defineProperty(_this,"reformatWidget",function(widget,relationTables,fields,buttons,nrels,externalFields,widgets,counters){if(widget.property){widget.property=MiscUtils.ensureArray(widget.property).reduce(function(res,prop){return _objectSpread(_objectSpread({},res),{},_defineProperty({},prop.name,prop[Object.keys(prop).find(function(key){return key!=="name"})]))},{})}else{widget.property={}}if(widget.attribute){widget.attribute=MiscUtils.ensureArray(widget.attribute).reduce(function(res,prop){return _objectSpread(_objectSpread({},res),{},_defineProperty({},prop.name,prop[Object.keys(prop).find(function(key){return key!=="name"})]))},{})}else{widget.attribute={}}var verticalFill=false;if(widget.item){MiscUtils.ensureArray(widget.item).forEach(function(item){verticalFill|=_this.reformatWidget(item,relationTables,fields,buttons,nrels,externalFields,widgets,counters)})}widget.name=widget.name||":widget_"+counters.widget++;var fieldNames=_this.props.editConfig.fields.map(function(field){return field.id});if(fieldNames.includes(widget.name)){fields[widget.name]=widget}else if(widget.name.startsWith("kvrel__")||widget.name.startsWith("img__")){var _parts2=widget.name.split("__");if(fieldNames.includes(_parts2[1])){fields[_parts2[1]]=widget}}else if(widget.name.startsWith("btn__")){buttons[widget.name.split("__")[1]]=widget}else if(widget.name.startsWith("nrel__")){nrels[widget.name.split("__")[1]]=widget}if(widget.name.startsWith("ext__")){externalFields[widget.name.slice(5)]=""}widgets[widget.name]=widget;if(widget.layout){verticalFill|=_this.reformatLayout(widget.layout,relationTables,fields,buttons,nrels,externalFields,widgets,counters)}if(widget.widget){widget.widget=Array.isArray(widget.widget)?widget.widget:[widget.widget];widget.widget.forEach(function(child){child.name=":widget_"+counters.widget++;verticalFill|=_this.reformatWidget(child,relationTables,fields,buttons,nrels,externalFields,widgets,counters)})}if(widget.name.startsWith("nrel__")||!widget.layout&&!vFitWidgets.includes(widget["class"])){verticalFill=true}var parts=widget.name.split("__");if(parts.length>=3&&parts[0]==="nrel"){relationTables[_this.props.mapPrefix+parts[1]]={fk:parts[2],sortcol:parts[3]||null,noreorder:parts[4]||false}}return verticalFill});_defineProperty(_this,"reformatLayout",function(layout,relationTables,fields,buttons,nrels,externalFields,widgets,counters){layout.item=MiscUtils.ensureArray(layout.item);layout.name=layout.name||":layout_"+counters.layout++;var verticalFill=false;layout.item.forEach(function(item){if(!item){return}else if(item.widget){verticalFill|=_this.reformatWidget(item.widget,relationTables,fields,buttons,nrels,externalFields,widgets,counters)}else if(item.spacer){item.spacer.property=MiscUtils.ensureArray(item.spacer.property).reduce(function(res,prop){return _objectSpread(_objectSpread({},res),{},_defineProperty({},prop.name,prop[Object.keys(prop).find(function(key){return key!=="name"})]))},{});if(item.spacer.property.orientation==="Qt::Vertical"){verticalFill=true}}else if(item.layout){verticalFill|=_this.reformatLayout(item.layout,relationTables,fields,buttons,nrels,externalFields,widgets,counters)}});layout.verticalFill=verticalFill;return verticalFill});_defineProperty(_this,"buildErrMsg",function(record){var message=record.error;var errorDetails=record.error_details||{};if(!isEmpty(errorDetails.geometry_errors)){message+=":\n";message+=errorDetails.geometry_errors.map(function(entry){return" - "+entry.reason+" at "+entry.location})}if(!isEmpty(errorDetails.data_errors)){message+=":\n - "+errorDetails.data_errors.join("\n - ")}if(!isEmpty(errorDetails.validation_errors)){message+=":\n - "+errorDetails.validation_errors.join("\n - ")}return message});_defineProperty(_this,"translateFormString",function(label,layerName){var _this$props$translati,_this$props$translati2;return(_this$props$translati=(_this$props$translati2=_this.props.translations)===null||_this$props$translati2===void 0||(_this$props$translati2=_this$props$translati2.layers)===null||_this$props$translati2===void 0||(_this$props$translati2=_this$props$translati2[layerName])===null||_this$props$translati2===void 0||(_this$props$translati2=_this$props$translati2.form)===null||_this$props$translati2===void 0?void 0:_this$props$translati2[label])!==null&&_this$props$translati!==void 0?_this$props$translati:label});_defineProperty(_this,"translateFieldName",function(fieldName,layerName){var _this$props$translati3,_this$props$translati4;return(_this$props$translati3=(_this$props$translati4=_this.props.translations)===null||_this$props$translati4===void 0||(_this$props$translati4=_this$props$translati4.layers)===null||_this$props$translati4===void 0||(_this$props$translati4=_this$props$translati4[layerName])===null||_this$props$translati4===void 0||(_this$props$translati4=_this$props$translati4.fields)===null||_this$props$translati4===void 0?void 0:_this$props$translati4[fieldName])!==null&&_this$props$translati3!==void 0?_this$props$translati3:fieldName});_this.state=QtDesignerForm.defaultState;return _this}_inherits(QtDesignerForm,_React$Component);return _createClass(QtDesignerForm,[{key:"componentDidMount",value:function componentDidMount(){this.componentDidUpdate({})}},{key:"componentDidUpdate",value:function componentDidUpdate(prevProps){var _prevProps$editConfig,_prevProps$feature,_this2=this;// Query form
29
29
  if(this.props.editConfig.form!==((_prevProps$editConfig=prevProps.editConfig)===null||_prevProps$editConfig===void 0?void 0:_prevProps$editConfig.form)||this.props.feature.__version__!==((_prevProps$feature=prevProps.feature)===null||_prevProps$feature===void 0?void 0:_prevProps$feature.__version__)){this.setState(function(state){var _prevProps$editConfig2;return _objectSpread(_objectSpread({},QtDesignerForm.defaultState),{},{activetabs:_this2.props.editConfig.form===((_prevProps$editConfig2=prevProps.editConfig)===null||_prevProps$editConfig2===void 0?void 0:_prevProps$editConfig2.form)?state.activetabs:{}})});var url=MiscUtils.resolveAssetsPath(this.props.editConfig.form);url+=(url.includes("?")?"&":"?")+"lang="+this.props.locale;axios.get(url).then(function(response){_this2.parseForm(response.data)})["catch"](function(e){// eslint-disable-next-line
30
30
  console.log(e)})}// As soon as relation value is added, scroll to bottom of list
31
31
  if(this.state.relationAddPressed&&this.props.feature.relationValues!==prevProps.feature.relationValues){var relationWidget=this.state.relationAddPressed.parentNode.previousSibling;relationWidget.scrollTo(0,relationWidget.scrollHeight);this.setState({relationAddPressed:null})}}},{key:"componentWillUnmount",value:function componentWillUnmount(){KeyValCache.clear();FeatureCache.clear()}},{key:"render",value:function render(){if(this.state.loading){return/*#__PURE__*/React.createElement("div",{className:"qt-designer-form-loading"},/*#__PURE__*/React.createElement(Spinner,null),/*#__PURE__*/React.createElement("span",null,LocaleUtils.tr("qtdesignerform.loading")))}else if(this.state.formData){var root=this.state.formData.ui.widget;return/*#__PURE__*/React.createElement("div",{className:this.props.report?"qt-designer-report":"qt-designer-form"},this.renderLayout(root.layout,this.props.feature,this.props.editConfig,this.props.updateField))}else{return null}}}])}(React.Component);_defineProperty(QtDesignerForm,"propTypes",{addRelationRecord:PropTypes.func,editConfig:PropTypes.object,editConfigs:PropTypes.object,editLayerId:PropTypes.string,editRelationRecord:PropTypes.func,feature:PropTypes.object,iface:PropTypes.object,locale:PropTypes.string,mapCrs:PropTypes.string,mapPrefix:PropTypes.string,readOnly:PropTypes.bool,removeRelationRecord:PropTypes.func,reorderRelationRecord:PropTypes.func,report:PropTypes.bool,setFormBusy:PropTypes.func,setRelationTables:PropTypes.func,switchEditContext:PropTypes.func,translations:PropTypes.object,updateField:PropTypes.func,updateRelationField:PropTypes.func});_defineProperty(QtDesignerForm,"defaultState",{activetabs:{},formdata:null,loading:false,loadingReqId:null,relationAddPressed:null});export default connect(function(state){return{locale:state.locale.current}},{})(QtDesignerForm);
@@ -8,13 +8,13 @@ function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof
8
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
- 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
11
+ axios.get("themes.json",{params:{lang:_this.props.locale}}).then(function(response){var _this$props$appConfig,_this$props$appConfig2,_theme;var themes=ThemeUtils.applyTranslations(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&&params.s!==undefined){var coords=params.c.split(/[;,]/g).map(function(x){return parseFloat(x)||0});var scales=theme.scales||themes.defaultScales;var zoom=MapUtils.computeZoom(scales,params.s);if(coords.length===2){var p=CoordinatesUtils.reproject(coords,params.crs||theme.mapCrs,theme.bbox.crs);var bounds=theme.bbox.bounds;// Only accept c if it is within the theme bounds
13
13
  if(bounds[0]<=p[0]&&p[0]<=bounds[2]&&bounds[1]<=p[1]&&p[1]<=bounds[3]){initialExtent={center:coords,zoom:zoom,crs:params.crs||theme.mapCrs}}else{initialExtent={center:[0.5*(bounds[0]+bounds[2]),0.5*(bounds[1]+bounds[3])],zoom:zoom,crs:theme.bbox.crs}}}}else if(params.e){var _bounds=params.e.split(/[;,]/g).map(function(x){return parseFloat(x)||0});if(CoordinatesUtils.isValidExtent(_bounds)){initialExtent={bounds:_bounds,crs:params.crs||theme.mapCrs}}}var layerParams=params.l!==undefined?params.l.split(",").filter(function(entry){return entry}):null;if(layerParams&&ConfigUtils.getConfigProp("urlReverseLayerOrder")){layerParams.reverse()}_this.props.setCurrentTheme(theme,themes,false,initialExtent,layerParams,(_params$bl=params.bl)!==null&&_params$bl!==void 0?_params$bl:null,state.layers,_this.props.appConfig.themeLayerRestorer,_this.props.appConfig.externalLayerRestorer,initialView)}var task=ConfigUtils.getConfigProp("startupTask");if(task&&!((_theme=theme)!==null&&_theme!==void 0&&(_theme=_theme.config)!==null&&_theme!==void 0&&_theme.startupTask)){var mapClickAction=ConfigUtils.getPluginConfig(task.key).mapClickAction;_this.props.setCurrentTask(task.key,task.mode,mapClickAction)}})});_this.themesLoaded=false;// Set initial bottom/topbar height to zero in case not topbar/bottombar is enabled
14
14
  // The components will set the proper height if and when initialized
15
15
  props.setTopbarHeight(0);props.setBottombarHeight(0);return _this}_inherits(AppContainerComponent,_React$Component);return _createClass(AppContainerComponent,[{key:"componentDidMount",value:function componentDidMount(){this.componentDidUpdate({})}},{key:"componentDidUpdate",value:function componentDidUpdate(prevProps){// The map component needs to have finished loading before theme initialization can proceed
16
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];return/*#__PURE__*/React.createElement(PluginsContainer,{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/
17
+ var device=ConfigUtils.isMobile()?"mobile":"desktop";var pluginsConf=this.props.localConfig.plugins[device];return/*#__PURE__*/React.createElement(PluginsContainer,{pluginsConfig:pluginsConf})}}])}(React.Component);_defineProperty(AppContainerComponent,"propTypes",{appConfig:PropTypes.object,customPlugins:PropTypes.array,defaultUrlParams:PropTypes.string,haveMapSize:PropTypes.bool,localConfig:PropTypes.object,locale:PropTypes.string,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{locale:state.locale.current,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
18
  document.documentElement.style.setProperty("--vh",window.innerHeight*0.01+"px")});_defineProperty(_this2,"init",function(){// Save initial params and clear URL
19
19
  var initialParams=UrlParams.getParams();UrlParams.clear();// Set builtin plugins
20
20
  PluginStore.setBuiltinPlugins(_this2.props.appConfig.pluginsDef.plugins);// Load config.json
@@ -12,7 +12,7 @@ Object.entries(prevColorLayers).forEach(function(_ref3){var _ref4=_slicedToArray
12
12
  tiles.tiles.addEventListener("load-tile-set",function(_ref7){var tileSet=_ref7.tileSet;if(tileSet.root.parent===null){var bbox=new Box3;tiles.tiles.getBoundingBox(bbox);var center=bbox.getCenter(new Vector3);tiles.tiles.group.position.sub(center);if(matrix){tiles.tiles.group.parent.applyMatrix4(matrix)}else{tiles.tiles.group.parent.position.copy(center)}tiles.tiles.group.parent.updateMatrixWorld(true);if(label){tiles.tiles.group.parent.userData.label=label;updateObjectLabel(tiles.tiles.group.parent,_this2.state.sceneContext)}}_this2.instance.notifyChange(tiles);if(showEditTool){_this2.zoomToObject(name);_this2.props.setCurrentTask("EditDataset3D",null,null,{objectId:name})}});tiles.tiles.addEventListener("needs-update",function(){_this2.instance.notifyChange(tiles)});// Apply style when loading tile
13
13
  tiles.tiles.addEventListener("load-model",function(_ref8){var scene=_ref8.scene;scene.userData.tilesetName=name;scene.userData.featureIdAttr="id";Tiles3DStyle.applyTileStyle(scene,_this2.state.sceneContext.sceneObjects[name],_this2.state.sceneContext);_this2.instance.notifyChange(tiles)});// Show/hide labels when tile visibility changes
14
14
  tiles.tiles.addEventListener("tile-visibility-change",function(_ref9){var scene=_ref9.scene,visible=_ref9.visible;Object.values(scene.userData.tileLabels||{}).forEach(function(l){l.labelObject.visible=visible;l.labelObject.element.style.display=visible?"initial":"none"})});tiles.castShadow=true;tiles.receiveShadow=true;tiles.userData.layertree=true;_this2.instance.add(tiles);_this2.objectMap[name]=tiles;_this2.setState(function(state){var objectState=_objectSpread({imported:true,visibility:true,opacity:255,layertree:true,title:name},options);return{sceneContext:_objectSpread(_objectSpread({},state.sceneContext),{},{sceneObjects:_objectSpread(_objectSpread({},state.sceneContext.sceneObjects),{},_defineProperty({},name,objectState))})}})});_defineProperty(_this2,"addSceneObject",function(objectId,object){var options=arguments.length>2&&arguments[2]!==undefined?arguments[2]:{};_this2.sceneObjectGroup.add(object);_this2.objectMap[objectId]=object;_this2.instance.notifyChange(object);_this2.setState(function(state){var objectState=_objectSpread({visibility:true,opacity:255,layertree:false},options);return{sceneContext:_objectSpread(_objectSpread({},state.sceneContext),{},{sceneObjects:_objectSpread(_objectSpread({},state.sceneContext.sceneObjects),{},_defineProperty({},objectId,objectState))})}})});_defineProperty(_this2,"getSceneObject",function(objectId){return _this2.objectMap[objectId]});_defineProperty(_this2,"removeSceneObject",function(objectId){var callback=arguments.length>1&&arguments[1]!==undefined?arguments[1]:undefined;var object=_this2.objectMap[objectId];if(!object){return}// Ensure labels are removed
15
- object.traverse(function(c){if(c.isCSS2DObject){c.element.parentNode.removeChild(c.element)}});if(object.tiles){_this2.instance.remove(object)}else{_this2.sceneObjectGroup.remove(object)}delete _this2.objectMap[objectId];_this2.instance.notifyChange();_this2.setState(function(state){var newSceneObjects=_objectSpread({},state.sceneContext.sceneObjects);delete newSceneObjects[objectId];return{sceneContext:_objectSpread(_objectSpread({},state.sceneContext),{},{sceneObjects:newSceneObjects})}},callback)});_defineProperty(_this2,"updateSceneObject",function(objectId,options){_this2.setState(function(state){return{sceneContext:_objectSpread(_objectSpread({},state.sceneContext),{},{sceneObjects:_objectSpread(_objectSpread({},state.sceneContext.sceneObjects),{},_defineProperty({},objectId,_objectSpread(_objectSpread({},state.sceneContext.sceneObjects[objectId]),options)))})}})});_defineProperty(_this2,"zoomToObject",function(objectId){var margin=arguments.length>1&&arguments[1]!==undefined?arguments[1]:20;var obj=_this2.state.sceneContext.getSceneObject(objectId);var bbox=new Box3;if(obj!==null&&obj!==void 0&&obj.tiles){obj.tiles.getBoundingBox(bbox)}else{bbox.setFromObject(obj)}if(!bbox.isEmpty()){var bounds=[bbox.min.x-margin,bbox.min.y-margin,bbox.max.x+margin,bbox.max.y+margin];_this2.state.sceneContext.setViewToExtent(bounds,0)}});_defineProperty(_this2,"getMap",function(){return _this2.map});_defineProperty(_this2,"setupContainer",function(el){if(el){_this2.container=el;el.resizeObserver=new ResizeObserver(function(entries){var rect=entries[0].contentRect;_this2.state.sceneContext.scene.view.dispatchEvent({type:"view-resized",width:rect.width,height:rect.height})});el.resizeObserver.observe(el);_this2.setupInstance()}});_defineProperty(_this2,"setupInstance",function(){var _this2$props$theme$ma,_this2$props$theme$ma2,_this2$props$theme$ma3,_this2$props$theme$ma6,_this2$props$theme$ma7,_this2$props$theme$ma8;if(_this2.instance){_this2.disposeInstance()}var projection=_this2.props.theme.mapCrs;// Setup instance
15
+ object.traverse(function(c){if(c.isCSS2DObject){c.element.parentNode.removeChild(c.element)}});if(object.tiles){_this2.instance.remove(object)}else{_this2.sceneObjectGroup.remove(object)}delete _this2.objectMap[objectId];_this2.instance.notifyChange();_this2.setState(function(state){var newSceneObjects=_objectSpread({},state.sceneContext.sceneObjects);delete newSceneObjects[objectId];return{sceneContext:_objectSpread(_objectSpread({},state.sceneContext),{},{sceneObjects:newSceneObjects})}},callback)});_defineProperty(_this2,"updateSceneObject",function(objectId,options){_this2.setState(function(state){return{sceneContext:_objectSpread(_objectSpread({},state.sceneContext),{},{sceneObjects:_objectSpread(_objectSpread({},state.sceneContext.sceneObjects),{},_defineProperty({},objectId,_objectSpread(_objectSpread({},state.sceneContext.sceneObjects[objectId]),options)))})}})});_defineProperty(_this2,"zoomToObject",function(objectId){var margin=arguments.length>1&&arguments[1]!==undefined?arguments[1]:20;var obj=_this2.state.sceneContext.getSceneObject(objectId);var bbox=new Box3;if(obj!==null&&obj!==void 0&&obj.tiles){obj.tiles.getBoundingBox(bbox)}else{bbox.setFromObject(obj)}if(!bbox.isEmpty()){var bounds=[bbox.min.x-margin,bbox.min.y-margin,bbox.max.x+margin,bbox.max.y+margin];_this2.state.sceneContext.setViewToExtent(bounds,0)}});_defineProperty(_this2,"getMap",function(){return _this2.map});_defineProperty(_this2,"setupContainer",function(el){if(el){_this2.container=el;el.resizeObserver=new ResizeObserver(function(entries){var rect=entries[0].contentRect;_this2.state.sceneContext.scene.view.dispatchEvent({type:"view-resized",width:rect.width,height:rect.height})});el.resizeObserver.observe(el);_this2.setupInstance()}});_defineProperty(_this2,"setupInstance",function(){var _this2$props$theme$ma,_this2$props$theme$ma2,_this2$props$theme$ma3,_this2$props$theme$ma6,_this2$props$theme$ma7,_this2$props$theme$ma8;if(_this2.instance){_this2.disposeInstance()}if(!_this2.props.theme){return}var projection=_this2.props.theme.mapCrs;// Setup instance
16
16
  _this2.instance=new Instance({target:_this2.container,crs:projection,renderer:{clearColor:0,preserveDrawingBuffer:true}});_this2.sceneObjectGroup=new Group;_this2.instance.add(_this2.sceneObjectGroup);// Setup map
17
17
  var bounds=CoordinatesUtils.reprojectBbox(_this2.props.theme.initialBbox.bounds,_this2.props.theme.initialBbox.crs,projection);var extent=new Extent(projection,bounds[0],bounds[2],bounds[1],bounds[3]);_this2.map=new Map({extent:extent,backgroundColor:"white"});_this2.instance.add(_this2.map);// Setup camera
18
18
  var center=extent.center();_this2.instance.view.camera.position.set(center.x,center.y,0.5*(extent.east-extent.west));// Skybox
@@ -40,4 +40,4 @@ var terrInter=raycaster.intersectObjects([_this2.map.object3d]).filter(function(
40
40
  if(objInter&&terrInter){return objInter.distance<terrInter.distance?objInter:terrInter}return objInter!==null&&objInter!==void 0?objInter:terrInter});_defineProperty(_this2,"getSetting",function(key){return _this2.state.sceneContext.settings[key]});_defineProperty(_this2,"setSetting",function(key,value){_this2.setState(function(state){return{sceneContext:_objectSpread(_objectSpread({},state.sceneContext),{},{settings:_objectSpread(_objectSpread({},state.sceneContext.settings),{},_defineProperty({},key,value))})}})});_defineProperty(_this2,"redrawScene",function(ev){var width=ev.target.innerWidth;var height=ev.target.innerHeight;_this2.instance.renderer.setSize(width,height);_this2.instance.view.camera.aspect=width/height;_this2.instance.view.camera.updateProjectionMatrix();_this2.instance.renderer.render(_this2.instance.scene,_this2.instance.view.camera)});_defineProperty(_this2,"setViewToExtent",function(bounds,rotation){_this2.state.sceneContext.setViewToExtent(bounds,rotation)});_defineProperty(_this2,"store3dState",function(){var promises=Object.entries(_this2.state.sceneContext.sceneObjects).map(function(_ref20){var _ref21=_slicedToArray(_ref20,2),objectId=_ref21[0],entry=_ref21[1];if(!entry.layertree){return null}return new Promise(function(resolve){var object=_this2.state.sceneContext.getSceneObject(objectId);if(entry.drawGroup){var exporter=new GLTFExporter;exporter.parse(object,function(result){resolve({id:objectId,options:entry,data:result})})}else if(entry.imported&&object.tiles){var container=object.tiles.group.parent;var tileset={matrix:container.matrix.elements,label:container.userData.label,url:object.tiles.rootURL};resolve({id:objectId,options:entry,tileset:tileset})}else{resolve({id:objectId,options:entry})}})}).filter(Boolean);return new Promise(function(resolve){Promise.all(promises).then(function(objects){var _this2$state$sceneCon2,_this2$state$sceneCon3;var camera=_this2.state.sceneContext.scene.view.camera.position;var target=_this2.state.sceneContext.scene.view.controls.target;var layers=Object.entries(_this2.state.sceneContext.colorLayers).map(function(_ref22){var _ref23=_slicedToArray(_ref22,2),layerId=_ref23[0],options=_ref23[1];return{id:layerId,options:{visibility:options.visibility,opacity:options.opacity,extrusionHeight:options.extrusionHeight}}});resolve({objects:objects,colorLayers:layers,baseLayer:((_this2$state$sceneCon2=_this2.state.sceneContext.baseLayers.find(function(layer){return layer.visibility===true}))===null||_this2$state$sceneCon2===void 0?void 0:_this2$state$sceneCon2.name)||"",personHeight:(_this2$state$sceneCon3=_this2.state.sceneContext.scene.view.controls.personHeight)!==null&&_this2$state$sceneCon3!==void 0?_this2$state$sceneCon3:0,camera:[camera.x,camera.y,camera.z],target:[target.x,target.y,target.z]})})})});_defineProperty(_this2,"restore3dState",function(data){if(isEmpty(data)){return}(data.objects||[]).forEach(function(item){if(item.data){var loader=new GLTFLoader;loader.parse(item.data,ConfigUtils.getAssetsPath(),function(gltf){gltf.scene.traverse(function(c){if(c.isMesh){c.castShadow=true;c.receiveShadow=true}updateObjectLabel(c,_this2.state.sceneContext)});_this2.state.sceneContext.addSceneObject(item.id,gltf.scene,item.options)})}else if(item.tileset){_this2.add3dTiles(item.tileset.url,item.id,item.options,false,new Matrix4().fromArray(item.tileset.matrix),item.tileset.label)}else if(item.id in _this2.state.sceneContext.sceneObjects){_this2.state.sceneContext.updateSceneObject(item.id,item.options)}});(data.colorLayers||[]).forEach(function(item){if(item.id in _this2.state.sceneContext.colorLayers){_this2.state.sceneContext.updateColorLayer(item.id,item.options)}});_this2.state.sceneContext.restoreView(data);if(data.baseLayer!==undefined){_this2.setState(function(state){return{sceneContext:_objectSpread(_objectSpread({},state.sceneContext),{},{baseLayers:state.sceneContext.baseLayers.map(function(l){return _objectSpread(_objectSpread({},l),{},{visibility:l.name===data.baseLayer})})})}});UrlParams.updateParams({bl3d:data.baseLayer})}_this2.state.sceneContext.scene.notifyChange()});_this2.container=null;_this2.inspector=null;_this2.instance=null;_this2.map=null;_this2.sceneObjectGroup=null;_this2.objectMap={};_this2.tilesetStyles={};_this2.state.sceneContext.addLayer=_this2.addLayer;_this2.state.sceneContext.getLayer=_this2.getLayer;_this2.state.sceneContext.removeLayer=_this2.removeLayer;_this2.state.sceneContext.updateColorLayer=_this2.updateColorLayer;_this2.state.sceneContext.setBaseLayer=_this2.setBaseLayer;_this2.state.sceneContext.add3dTiles=_this2.add3dTiles;_this2.state.sceneContext.addSceneObject=_this2.addSceneObject;_this2.state.sceneContext.getSceneObject=_this2.getSceneObject;_this2.state.sceneContext.removeSceneObject=_this2.removeSceneObject;_this2.state.sceneContext.updateSceneObject=_this2.updateSceneObject;_this2.state.sceneContext.zoomToObject=_this2.zoomToObject;_this2.state.sceneContext.getMap=_this2.getMap;_this2.state.sceneContext.getTerrainHeightFromDTM=_this2.getTerrainHeightFromDTM;_this2.state.sceneContext.getTerrainHeightFromMap=_this2.getTerrainHeightFromMap;_this2.state.sceneContext.getSceneIntersection=_this2.getSceneIntersection;_this2.state.sceneContext.getSetting=_this2.getSetting;_this2.state.sceneContext.setSetting=_this2.setSetting;_this2.state.sceneContext.settings.sceneQuality=props.defaultSceneQuality;registerPermalinkDataStoreHook("map3d",_this2.store3dState);return _this2}_inherits(Map3D,_React$Component2);return _createClass(Map3D,[{key:"componentDidMount",value:function componentDidMount(){this.props.innerRef(this)}},{key:"componentWillUnmount",value:function componentWillUnmount(){unregisterPermalinkDataStoreHook("map3d")}},{key:"componentDidUpdate",value:function componentDidUpdate(prevProps,prevState){var _this3=this;if(this.props.theme!==prevProps.theme){this.setupInstance()}else if(this.props.layers!==prevProps.layers){this.setState(function(state){return{sceneContext:_objectSpread(_objectSpread({},state.sceneContext),{},{colorLayers:_this3.collectColorLayers(state.sceneContext.colorLayers)})}})}// Update map layers
41
41
  if(this.state.sceneContext.baseLayers!==prevState.sceneContext.baseLayers){this.applyBaseLayer()}if(this.state.sceneContext.colorLayers!==prevState.sceneContext.colorLayers){this.applyColorLayerUpdates(this.state.sceneContext.colorLayers,prevState.sceneContext.colorLayers)}// Update scene objects
42
42
  if(this.state.sceneContext.sceneObjects!==prevState.sceneContext.sceneObjects){this.applySceneObjectUpdates(this.state.sceneContext.sceneObjects,prevState.sceneContext.sceneObjects);// Update collision objects
43
- this.setState(function(state){return{sceneContext:_objectSpread(_objectSpread({},state.sceneContext),{},{collisionObjects:Object.entries(state.sceneContext.sceneObjects).map(function(_ref24){var _ref25=_slicedToArray(_ref24,2),objId=_ref25[0],options=_ref25[1];if(options.layertree&&options.visibility){var _obj$tiles$group,_obj$tiles;var obj=_this3.objectMap[objId];return(_obj$tiles$group=(_obj$tiles=obj.tiles)===null||_obj$tiles===void 0?void 0:_obj$tiles.group)!==null&&_obj$tiles$group!==void 0?_obj$tiles$group:obj}return null}).filter(Boolean)})}})}if(this.state.sceneContext.settings.sceneQuality!==prevState.sceneContext.settings.sceneQuality){var quality=Math.max(20,this.state.sceneContext.settings.sceneQuality);this.map.segments=Math.pow(2,Math.floor(quality/20));this.instance.notifyChange(this.instance.view.camera)}}},{key:"render",value:function render(){var _this4=this;return[/*#__PURE__*/ReactDOM.createPortal(/*#__PURE__*/React.createElement("div",{className:"map3d-map",id:"map3d",key:"Map3D",ref:this.setupContainer}),this.context),this.state.sceneContext.scene?/*#__PURE__*/React.createElement(UnloadWrapper,{key:this.state.sceneId,onUnload:this.onUnload,sceneId:this.state.sceneId},/*#__PURE__*/React.createElement(MapControls3D,{controlsPosition:this.props.controlsPosition,onCameraChanged:this.props.onCameraChanged,onControlsSet:this.setupControls,sceneContext:this.state.sceneContext},/*#__PURE__*/React.createElement(EditDataset3D,{sceneContext:this.state.sceneContext}),/*#__PURE__*/React.createElement(View3DSwitcher,{position:1}),Object.entries(this.props.plugins3d).map(function(_ref26){var _ref27=_slicedToArray(_ref26,2),name=_ref27[0],Component=_ref27[1];return/*#__PURE__*/React.createElement(Suspense,{key:name},/*#__PURE__*/React.createElement(Component,_extends({sceneContext:_this4.state.sceneContext},_this4.props.pluginOptions[name])))}))):null]}}])}(React.Component);_defineProperty(Map3D,"contextType",MapContainerPortalContext);_defineProperty(Map3D,"propTypes",{controlsPosition:PropTypes.string,defaultSceneQuality:PropTypes.number,innerRef:PropTypes.func,layers:PropTypes.array,onCameraChanged:PropTypes.func,onMapInitialized:PropTypes.func,pluginOptions:PropTypes.object,plugins3d:PropTypes.object,setCurrentTask:PropTypes.func,theme:PropTypes.object,themes:PropTypes.object});_defineProperty(Map3D,"defaultProps",{geometry:{initialWidth:600,initialHeight:800,initialX:0,initialY:0,initiallyDocked:true}});_defineProperty(Map3D,"defaultSceneState",{scene:null,map:null,mapCrs:null,dtmUrl:null,dtmCrs:null,baseLayers:[],colorLayers:{},sceneObjects:{},collisionObjects:[],settings:{sceneQuality:100}});export default connect(function(state){return{theme:state.theme.current,themes:state.theme.themes,layers:state.layers.flat}},{setCurrentTask:setCurrentTask})(Map3D);
43
+ this.setState(function(state){return{sceneContext:_objectSpread(_objectSpread({},state.sceneContext),{},{collisionObjects:Object.entries(state.sceneContext.sceneObjects).map(function(_ref24){var _ref25=_slicedToArray(_ref24,2),objId=_ref25[0],options=_ref25[1];if(options.layertree&&options.visibility){var _obj$tiles$group,_obj$tiles;var obj=_this3.objectMap[objId];return(_obj$tiles$group=(_obj$tiles=obj.tiles)===null||_obj$tiles===void 0?void 0:_obj$tiles.group)!==null&&_obj$tiles$group!==void 0?_obj$tiles$group:obj}return null}).filter(Boolean)})}})}if(this.state.sceneContext.settings.sceneQuality!==prevState.sceneContext.settings.sceneQuality){var quality=Math.max(20,this.state.sceneContext.settings.sceneQuality);this.map.segments=Math.pow(2,Math.floor(quality/20));this.instance.notifyChange(this.instance.view.camera)}}},{key:"render",value:function render(){var _this4=this;return[/*#__PURE__*/ReactDOM.createPortal(/*#__PURE__*/React.createElement("div",{className:"map3d-map",id:"map3d",key:"Map3D",ref:this.setupContainer}),this.context),this.state.sceneContext.scene?/*#__PURE__*/React.createElement(UnloadWrapper,{key:this.state.sceneId,onUnload:this.onUnload,sceneId:this.state.sceneId},/*#__PURE__*/React.createElement(MapControls3D,{controlsPosition:this.props.controlsPosition,mouseButtons:this.props.mouseButtons,onCameraChanged:this.props.onCameraChanged,onControlsSet:this.setupControls,sceneContext:this.state.sceneContext},/*#__PURE__*/React.createElement(EditDataset3D,{sceneContext:this.state.sceneContext}),/*#__PURE__*/React.createElement(View3DSwitcher,{position:1}),Object.entries(this.props.plugins3d).map(function(_ref26){var _ref27=_slicedToArray(_ref26,2),name=_ref27[0],Component=_ref27[1];return/*#__PURE__*/React.createElement(Suspense,{key:name},/*#__PURE__*/React.createElement(Component,_extends({sceneContext:_this4.state.sceneContext},_this4.props.pluginOptions[name])))}))):null]}}])}(React.Component);_defineProperty(Map3D,"contextType",MapContainerPortalContext);_defineProperty(Map3D,"propTypes",{controlsPosition:PropTypes.string,defaultSceneQuality:PropTypes.number,innerRef:PropTypes.func,layers:PropTypes.array,mouseButtons:PropTypes.object,onCameraChanged:PropTypes.func,onMapInitialized:PropTypes.func,pluginOptions:PropTypes.object,plugins3d:PropTypes.object,setCurrentTask:PropTypes.func,theme:PropTypes.object,themes:PropTypes.object});_defineProperty(Map3D,"defaultProps",{geometry:{initialWidth:600,initialHeight:800,initialX:0,initialY:0,initiallyDocked:true}});_defineProperty(Map3D,"defaultSceneState",{scene:null,map:null,mapCrs:null,dtmUrl:null,dtmCrs:null,baseLayers:[],colorLayers:{},sceneObjects:{},collisionObjects:[],settings:{sceneQuality:100}});export default connect(function(state){return{theme:state.theme.current,themes:state.theme.themes,layers:state.layers.flat}},{setCurrentTask:setCurrentTask})(Map3D);
@@ -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 classNames from"classnames";import PropTypes from"prop-types";import{Vector3}from"three";import ConfigUtils from"../../utils/ConfigUtils";import{UrlParams}from"../../utils/PermaLinkUtils";import Icon from"../Icon";import{MapButtonPortalContext}from"../PluginsContainer";import FirstPersonControls3D from"./utils/FirstPersonControls3D";import OrbitControls3D from"./utils/OrbitControls3D";import"./style/MapControls3D.css";// FIXME: camera.fov is 30, but in reality seems to be 50 (as would be the threejs default)
8
- var CAMERA_FOV=50;var MapControls3D=/*#__PURE__*/function(_React$Component){function MapControls3D(props){var _this;_classCallCheck(this,MapControls3D);_this=_callSuper(this,MapControls3D,[props]);_defineProperty(_this,"state",{pickingFirstPerson:false,firstPerson:false});_defineProperty(_this,"unload",function(el){// componentWillUnmount is called too early, so do cleanup when the element is actually removed
7
+ */import React from"react";import ReactDOM from"react-dom";import{connect}from"react-redux";import classNames from"classnames";import PropTypes from"prop-types";import{MOUSE,Vector3}from"three";import ConfigUtils from"../../utils/ConfigUtils";import{UrlParams}from"../../utils/PermaLinkUtils";import Icon from"../Icon";import{MapButtonPortalContext}from"../PluginsContainer";import FirstPersonControls3D from"./utils/FirstPersonControls3D";import OrbitControls3D from"./utils/OrbitControls3D";import"./style/MapControls3D.css";// FIXME: camera.fov is 30, but in reality seems to be 50 (as would be the threejs default)
8
+ var CAMERA_FOV=50;var MapControls3D=/*#__PURE__*/function(_React$Component){function MapControls3D(props){var _buttonMap$_this$prop,_buttonMap$_this$prop2,_buttonMap$_this$prop3;var _this;_classCallCheck(this,MapControls3D);_this=_callSuper(this,MapControls3D,[props]);_defineProperty(_this,"state",{pickingFirstPerson:false,firstPerson:false});_defineProperty(_this,"unload",function(el){// componentWillUnmount is called too early, so do cleanup when the element is actually removed
9
9
  if(!el){_this.controls.removeEventListener("change",_this.updateControlsTarget);_this.fpcontrols.removeEventListener("change",_this.updateFpUrlParams);if(_this.state.firstPerson){_this.fpcontrols.disconnect()}else{_this.controls.disconnect()}_this.props.sceneContext.scene.domElement.removeEventListener("dblclick",_this.switchToFirstPersonView)}});_defineProperty(_this,"switchToFirstPersonView",function(ev){// Don't do anything if a task is set, may interfere
10
10
  if(!_this.props.currentTask&&!_this.state.firstPerson){_this.setupFirstPerson(ev)}});_defineProperty(_this,"toggleFirstPersonControls",function(){if(_this.state.firstPerson){_this.leaveFirstPerson()}else if(_this.state.pickingFirstPerson){_this.props.sceneContext.scene.domElement.removeEventListener("click",_this.setupFirstPerson);_this.props.sceneContext.scene.domElement.style.cursor="";_this.setState({pickingFirstPerson:false})}else{_this.props.sceneContext.scene.domElement.addEventListener("click",_this.setupFirstPerson,{once:true});var cursor=ConfigUtils.getAssetsPath()+"/img/person.svg";_this.props.sceneContext.scene.domElement.style.cursor="url(".concat(cursor,"), pointer");_this.setState({pickingFirstPerson:true})}});_defineProperty(_this,"setupFirstPerson",function(ev){_this.props.sceneContext.scene.domElement.style.cursor="";var rect=ev.target.getBoundingClientRect();var mouseX=(ev.clientX-rect.left)/rect.width*2-1;var mouseY=-((ev.clientY-rect.top)/rect.height)*2+1;var intersection=_this.props.sceneContext.getSceneIntersection(mouseX,mouseY,false);if(!intersection){return}var pos=intersection.point;_this.props.sceneContext.getTerrainHeightFromDTM([pos.x,pos.y]).then(function(z){var camerapos=new Vector3(pos.x,pos.y,z+_this.fpcontrols.personHeight);var targetpos=new Vector3(pos.x,pos.y+300,z+_this.fpcontrols.personHeight);_this.controls.animateTo(camerapos,targetpos,0,function(){_this.controls.disconnect();_this.fpcontrols.connect(_this.props.sceneContext);_this.fpcontrols.setView(camerapos,new Vector3(0,1,0));_this.setState({firstPerson:true,pickingFirstPerson:false})})})});_defineProperty(_this,"leaveFirstPerson",function(){if(_this.state.firstPerson){_this.setState({firstPerson:false},function(){// Need to ensure this.state.firstPerson is false to avoid endless loop
11
11
  var camerapos=_this.props.sceneContext.scene.view.camera.position;_this.fpcontrols.disconnect();_this.controls.connect(_this.props.sceneContext);_this.controls.setView(camerapos,new Vector3().addVectors(camerapos,_this.fpcontrols.lookAt));var bounds=[camerapos.x-750,camerapos.y-750,camerapos.x+750,camerapos.y+750];_this.setViewToExtent(bounds)})}});_defineProperty(_this,"home",function(){var extent=_this.props.sceneContext.map.extent;var bounds=[extent.west,extent.south,extent.east,extent.north];_this.setViewToExtent(bounds)});_defineProperty(_this,"setViewToExtent",function(bounds){var angle=arguments.length>1&&arguments[1]!==undefined?arguments[1]:0;_this.leaveFirstPerson();var fov=CAMERA_FOV/180*Math.PI;var cameraHeight=(bounds[2]-bounds[0])/(2*Math.tan(fov/2));var center={x:0.5*(bounds[0]+bounds[2]),y:0.5*(bounds[1]+bounds[3])};var camerapos=new Vector3(center.x,center.y,cameraHeight);var target=new Vector3(center.x,center.y,0);var h=_this.props.sceneContext.getTerrainHeightFromMap([center.x,center.y]);// Fall back to getTerrainHeightFromDTM if map is not yet loaded
12
- if(h===undefined){_this.props.sceneContext.getTerrainHeightFromDTM([center.x,center.y]).then(function(h2){camerapos.z+=h2;target.z+=h2;_this.controls.animateTo(camerapos,target,angle)})}else{camerapos.z+=h;target.z+=h;_this.controls.animateTo(camerapos,target,angle)}});_defineProperty(_this,"pan",function(ev,dx,dy){var panInterval=setInterval(function(){_this.props.sceneContext.scene.view.controls.panView(dx,dy)},50);ev.view.addEventListener("pointerup",function(){clearInterval(panInterval)},{once:true})});_defineProperty(_this,"tilt",function(ev,azimuth,polar){var tiltInterval=setInterval(function(){_this.props.sceneContext.scene.view.controls.tiltView(azimuth,polar)},50);ev.view.addEventListener("pointerup",function(){clearInterval(tiltInterval)},{once:true})});_defineProperty(_this,"resetTilt",function(){var camerapos=_this.props.sceneContext.scene.view.camera.position;if(_this.state.firstPerson){var newLookAt=_this.fpcontrols.lookAt.clone();newLookAt.z=0;_this.fpcontrols.setView(camerapos,newLookAt.normalize())}else{var target=_this.controls.target;var newcamerapos=new Vector3(target.x,target.y,target.distanceTo(camerapos));_this.controls.animateTo(newcamerapos,target,0)}});_defineProperty(_this,"zoom",function(ev,delta){var zoomInterval=setInterval(function(){var camerapos=_this.props.sceneContext.scene.view.camera.position;var target=_this.controls.target;var k=Math.min(150,Math.sqrt(target.distanceTo(camerapos)));_this.props.sceneContext.scene.view.controls.zoomView(delta*k)},50);ev.view.addEventListener("pointerup",function(){clearInterval(zoomInterval)},{once:true})});_defineProperty(_this,"updateUrlParams",function(){var cpos=_this.props.sceneContext.scene.view.camera.position;var tpos=_this.controls.target;UrlParams.updateParams({v3d:[cpos.x,cpos.y,cpos.z,tpos.x,tpos.y,tpos.z,0].map(function(v){return v.toFixed(1)}).join(",")});_this.props.onCameraChanged([tpos.x,tpos.y,tpos.z],[cpos.x,cpos.y,cpos.z],CAMERA_FOV)});_defineProperty(_this,"updateFpUrlParams",function(){var cpos=_this.fpcontrols.target;var lkat=_this.fpcontrols.lookAt;var h=_this.fpcontrols.personHeight;UrlParams.updateParams({v3d:[cpos.x,cpos.y,cpos.z,lkat.x,lkat.y,lkat.z,h].map(function(v){return v.toFixed(1)}).join(",")});_this.props.onCameraChanged([cpos.x,cpos.y,cpos.z],null)});_defineProperty(_this,"restoreView",function(viewState){if(viewState.camera&&viewState.target){var camera=_construct(Vector3,_toConsumableArray(viewState.camera));var target=_construct(Vector3,_toConsumableArray(viewState.target));if(viewState.personHeight>0){_this.controls.disconnect();_this.fpcontrols.connect(_this.props.sceneContext);_this.fpcontrols.setView(camera,target,viewState.personHeight);_this.setState({firstPerson:true})}else{_this.controls.setView(camera,target)}}});var sceneElement=props.sceneContext.scene.domElement;sceneElement.tabIndex=0;_this.controls=new OrbitControls3D(props.sceneContext.scene.view.camera);_this.fpcontrols=new FirstPersonControls3D(props.sceneContext.scene.view.camera);_this.controls.connect(props.sceneContext);var targetPos=props.sceneContext.scene.view.camera.position.clone();targetPos.z=0;_this.controls.target=targetPos;_this.controls.addEventListener("change",_this.updateUrlParams);_this.fpcontrols.addEventListener("change",_this.updateFpUrlParams);sceneElement.addEventListener("dblclick",_this.switchToFirstPersonView);props.onControlsSet(_this);_this.updateUrlParams();return _this}_inherits(MapControls3D,_React$Component);return _createClass(MapControls3D,[{key:"render",value:function render(){var _this2=this;var firstPersonButtonClasses=classNames({"map3d-firstperson-button":true,"map3d-firstperson-button-active":this.state.firstPerson});return[this.props.children,/*#__PURE__*/ReactDOM.createPortal(/*#__PURE__*/React.createElement("div",{className:"map3d-nav-pan","data-slot":0,key:"MapControlsPan",style:{order:1000}},/*#__PURE__*/React.createElement("span",null),/*#__PURE__*/React.createElement(Icon,{icon:"chevron-up",onPointerDown:function onPointerDown(ev){return _this2.pan(ev,0,1)}}),/*#__PURE__*/React.createElement("span",null),/*#__PURE__*/React.createElement(Icon,{icon:"chevron-left",onPointerDown:function onPointerDown(ev){return _this2.pan(ev,-1,0)}}),/*#__PURE__*/React.createElement(Icon,{icon:"home",onClick:function onClick(){return _this2.home()}}),/*#__PURE__*/React.createElement(Icon,{icon:"chevron-right",onPointerDown:function onPointerDown(ev){return _this2.pan(ev,1,0)}}),/*#__PURE__*/React.createElement("span",null),/*#__PURE__*/React.createElement(Icon,{icon:"chevron-down",onPointerDown:function onPointerDown(ev){return _this2.pan(ev,0,-1)}}),/*#__PURE__*/React.createElement("span",null)),this.context),/*#__PURE__*/ReactDOM.createPortal(/*#__PURE__*/React.createElement("div",{className:"map3d-nav-rotate","data-slot":0,key:"MapControlsRotate",style:{order:999}},/*#__PURE__*/React.createElement("span",null),/*#__PURE__*/React.createElement(Icon,{icon:"tilt-up",onPointerDown:function onPointerDown(ev){return _this2.tilt(ev,0,0.1)}}),/*#__PURE__*/React.createElement("span",null),/*#__PURE__*/React.createElement(Icon,{icon:"tilt-left",onPointerDown:function onPointerDown(ev){return _this2.tilt(ev,0.1,0)}}),/*#__PURE__*/React.createElement(Icon,{icon:"point",onClick:function onClick(){return _this2.resetTilt()}}),/*#__PURE__*/React.createElement(Icon,{icon:"tilt-right",onPointerDown:function onPointerDown(ev){return _this2.tilt(ev,-0.1,0)}}),/*#__PURE__*/React.createElement("span",null),/*#__PURE__*/React.createElement(Icon,{icon:"tilt-down",onPointerDown:function onPointerDown(ev){return _this2.tilt(ev,0,-0.1)}}),/*#__PURE__*/React.createElement("span",null)),this.context),/*#__PURE__*/ReactDOM.createPortal(!this.state.firstPerson?/*#__PURE__*/React.createElement("div",{className:"map3d-nav-zoom","data-slot":0,key:"MapControlsSpacerZoom",style:{order:998}},/*#__PURE__*/React.createElement("div",{onPointerDown:function onPointerDown(ev){return _this2.zoom(ev,+1)}},/*#__PURE__*/React.createElement(Icon,{icon:"plus"})),/*#__PURE__*/React.createElement("div",{onPointerDown:function onPointerDown(ev){return _this2.zoom(ev,-1)}},/*#__PURE__*/React.createElement(Icon,{icon:"minus"}))):null,this.context),/*#__PURE__*/ReactDOM.createPortal(/*#__PURE__*/React.createElement("div",{className:firstPersonButtonClasses,"data-slot":0,key:"MapControlsFirstPerson",onClick:this.toggleFirstPersonControls,style:{order:997}},/*#__PURE__*/React.createElement(Icon,{icon:"person"})),this.context),this.props.controlsPosition!=="bottom"?/*#__PURE__*/ReactDOM.createPortal(/*#__PURE__*/React.createElement("div",{className:"map3d-nav-spacer",key:"MapControlsSpacer",style:{order:996}}),this.context):null]}}])}(React.Component);_defineProperty(MapControls3D,"contextType",MapButtonPortalContext);_defineProperty(MapControls3D,"propTypes",{children:PropTypes.oneOfType([PropTypes.node,PropTypes.func]),controlsPosition:PropTypes.string,currentTask:PropTypes.string,onCameraChanged:PropTypes.func,onControlsSet:PropTypes.func,sceneContext:PropTypes.object});export default connect(function(state){return{currentTask:state.task.id}},{})(MapControls3D);
12
+ if(h===undefined){_this.props.sceneContext.getTerrainHeightFromDTM([center.x,center.y]).then(function(h2){camerapos.z+=h2;target.z+=h2;_this.controls.animateTo(camerapos,target,angle)})}else{camerapos.z+=h;target.z+=h;_this.controls.animateTo(camerapos,target,angle)}});_defineProperty(_this,"pan",function(ev,dx,dy){var panInterval=setInterval(function(){_this.props.sceneContext.scene.view.controls.panView(dx,dy)},50);ev.view.addEventListener("pointerup",function(){clearInterval(panInterval)},{once:true})});_defineProperty(_this,"tilt",function(ev,azimuth,polar){var tiltInterval=setInterval(function(){_this.props.sceneContext.scene.view.controls.tiltView(azimuth,polar)},50);ev.view.addEventListener("pointerup",function(){clearInterval(tiltInterval)},{once:true})});_defineProperty(_this,"resetTilt",function(){var camerapos=_this.props.sceneContext.scene.view.camera.position;if(_this.state.firstPerson){var newLookAt=_this.fpcontrols.lookAt.clone();newLookAt.z=0;_this.fpcontrols.setView(camerapos,newLookAt.normalize())}else{var target=_this.controls.target;var newcamerapos=new Vector3(target.x,target.y,target.distanceTo(camerapos));_this.controls.animateTo(newcamerapos,target,0)}});_defineProperty(_this,"zoom",function(ev,delta){var zoomInterval=setInterval(function(){var camerapos=_this.props.sceneContext.scene.view.camera.position;var target=_this.controls.target;var k=Math.min(150,Math.sqrt(target.distanceTo(camerapos)));_this.props.sceneContext.scene.view.controls.zoomView(delta*k)},50);ev.view.addEventListener("pointerup",function(){clearInterval(zoomInterval)},{once:true})});_defineProperty(_this,"updateUrlParams",function(){var cpos=_this.props.sceneContext.scene.view.camera.position;var tpos=_this.controls.target;UrlParams.updateParams({v3d:[cpos.x,cpos.y,cpos.z,tpos.x,tpos.y,tpos.z,0].map(function(v){return v.toFixed(1)}).join(",")});_this.props.onCameraChanged([tpos.x,tpos.y,tpos.z],[cpos.x,cpos.y,cpos.z],CAMERA_FOV)});_defineProperty(_this,"updateFpUrlParams",function(){var cpos=_this.fpcontrols.target;var lkat=_this.fpcontrols.lookAt;var h=_this.fpcontrols.personHeight;UrlParams.updateParams({v3d:[cpos.x,cpos.y,cpos.z,lkat.x,lkat.y,lkat.z,h].map(function(v){return v.toFixed(1)}).join(",")});_this.props.onCameraChanged([cpos.x,cpos.y,cpos.z],null)});_defineProperty(_this,"restoreView",function(viewState){if(viewState.camera&&viewState.target){var camera=_construct(Vector3,_toConsumableArray(viewState.camera));var target=_construct(Vector3,_toConsumableArray(viewState.target));if(viewState.personHeight>0){_this.controls.disconnect();_this.fpcontrols.connect(_this.props.sceneContext);_this.fpcontrols.setView(camera,target,viewState.personHeight);_this.setState({firstPerson:true})}else{_this.controls.setView(camera,target)}}});var sceneElement=props.sceneContext.scene.domElement;sceneElement.tabIndex=0;var buttonMap={pan:MOUSE.PAN,rotate:MOUSE.ROTATE,zoom:MOUSE.DOLLY};var mouseButtons={LEFT:(_buttonMap$_this$prop=buttonMap[_this.props.mouseButtons.left])!==null&&_buttonMap$_this$prop!==void 0?_buttonMap$_this$prop:null,MIDDLE:(_buttonMap$_this$prop2=buttonMap[_this.props.mouseButtons.middle])!==null&&_buttonMap$_this$prop2!==void 0?_buttonMap$_this$prop2:null,RIGHT:(_buttonMap$_this$prop3=buttonMap[_this.props.mouseButtons.right])!==null&&_buttonMap$_this$prop3!==void 0?_buttonMap$_this$prop3:null};_this.controls=new OrbitControls3D(props.sceneContext.scene.view.camera,mouseButtons);_this.fpcontrols=new FirstPersonControls3D(props.sceneContext.scene.view.camera,mouseButtons);_this.controls.connect(props.sceneContext);var targetPos=props.sceneContext.scene.view.camera.position.clone();targetPos.z=0;_this.controls.target=targetPos;_this.controls.addEventListener("change",_this.updateUrlParams);_this.fpcontrols.addEventListener("change",_this.updateFpUrlParams);sceneElement.addEventListener("dblclick",_this.switchToFirstPersonView);props.onControlsSet(_this);_this.updateUrlParams();return _this}_inherits(MapControls3D,_React$Component);return _createClass(MapControls3D,[{key:"render",value:function render(){var _this2=this;var firstPersonButtonClasses=classNames({"map3d-firstperson-button":true,"map3d-firstperson-button-active":this.state.firstPerson});return[this.props.children,/*#__PURE__*/ReactDOM.createPortal(/*#__PURE__*/React.createElement("div",{className:"map3d-nav-pan","data-slot":0,key:"MapControlsPan",style:{order:1000}},/*#__PURE__*/React.createElement("span",null),/*#__PURE__*/React.createElement(Icon,{icon:"chevron-up",onPointerDown:function onPointerDown(ev){return _this2.pan(ev,0,1)}}),/*#__PURE__*/React.createElement("span",null),/*#__PURE__*/React.createElement(Icon,{icon:"chevron-left",onPointerDown:function onPointerDown(ev){return _this2.pan(ev,-1,0)}}),/*#__PURE__*/React.createElement(Icon,{icon:"home",onClick:function onClick(){return _this2.home()}}),/*#__PURE__*/React.createElement(Icon,{icon:"chevron-right",onPointerDown:function onPointerDown(ev){return _this2.pan(ev,1,0)}}),/*#__PURE__*/React.createElement("span",null),/*#__PURE__*/React.createElement(Icon,{icon:"chevron-down",onPointerDown:function onPointerDown(ev){return _this2.pan(ev,0,-1)}}),/*#__PURE__*/React.createElement("span",null)),this.context),/*#__PURE__*/ReactDOM.createPortal(/*#__PURE__*/React.createElement("div",{className:"map3d-nav-rotate","data-slot":0,key:"MapControlsRotate",style:{order:999}},/*#__PURE__*/React.createElement("span",null),/*#__PURE__*/React.createElement(Icon,{icon:"tilt-up",onPointerDown:function onPointerDown(ev){return _this2.tilt(ev,0,0.1)}}),/*#__PURE__*/React.createElement("span",null),/*#__PURE__*/React.createElement(Icon,{icon:"tilt-left",onPointerDown:function onPointerDown(ev){return _this2.tilt(ev,0.1,0)}}),/*#__PURE__*/React.createElement(Icon,{icon:"point",onClick:function onClick(){return _this2.resetTilt()}}),/*#__PURE__*/React.createElement(Icon,{icon:"tilt-right",onPointerDown:function onPointerDown(ev){return _this2.tilt(ev,-0.1,0)}}),/*#__PURE__*/React.createElement("span",null),/*#__PURE__*/React.createElement(Icon,{icon:"tilt-down",onPointerDown:function onPointerDown(ev){return _this2.tilt(ev,0,-0.1)}}),/*#__PURE__*/React.createElement("span",null)),this.context),/*#__PURE__*/ReactDOM.createPortal(!this.state.firstPerson?/*#__PURE__*/React.createElement("div",{className:"map3d-nav-zoom","data-slot":0,key:"MapControlsSpacerZoom",style:{order:998}},/*#__PURE__*/React.createElement("div",{onPointerDown:function onPointerDown(ev){return _this2.zoom(ev,+1)}},/*#__PURE__*/React.createElement(Icon,{icon:"plus"})),/*#__PURE__*/React.createElement("div",{onPointerDown:function onPointerDown(ev){return _this2.zoom(ev,-1)}},/*#__PURE__*/React.createElement(Icon,{icon:"minus"}))):null,this.context),/*#__PURE__*/ReactDOM.createPortal(/*#__PURE__*/React.createElement("div",{className:firstPersonButtonClasses,"data-slot":0,key:"MapControlsFirstPerson",onClick:this.toggleFirstPersonControls,style:{order:997}},/*#__PURE__*/React.createElement(Icon,{icon:"person"})),this.context),this.props.controlsPosition!=="bottom"?/*#__PURE__*/ReactDOM.createPortal(/*#__PURE__*/React.createElement("div",{className:"map3d-nav-spacer",key:"MapControlsSpacer",style:{order:996}}),this.context):null]}}])}(React.Component);_defineProperty(MapControls3D,"contextType",MapButtonPortalContext);_defineProperty(MapControls3D,"propTypes",{children:PropTypes.oneOfType([PropTypes.node,PropTypes.func]),controlsPosition:PropTypes.string,currentTask:PropTypes.string,mouseButtons:PropTypes.object,onCameraChanged:PropTypes.func,onControlsSet:PropTypes.func,sceneContext:PropTypes.object});export default connect(function(state){return{currentTask:state.task.id}},{})(MapControls3D);
@@ -1,12 +1,10 @@
1
- function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(o){return typeof o}:function(o){return o&&"function"==typeof Symbol&&o.constructor===Symbol&&o!==Symbol.prototype?"symbol":typeof o},_typeof(o)}function _classCallCheck(a,n){if(!(a instanceof n))throw new TypeError("Cannot call a class as a function")}function _defineProperties(e,r){for(var t=0;t<r.length;t++){var o=r[t];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(e,_toPropertyKey(o.key),o)}}function _createClass(e,r,t){return r&&_defineProperties(e.prototype,r),t&&_defineProperties(e,t),Object.defineProperty(e,"prototype",{writable:!1}),e}function _callSuper(t,o,e){return o=_getPrototypeOf(o),_possibleConstructorReturn(t,_isNativeReflectConstruct()?Reflect.construct(o,e||[],_getPrototypeOf(t).constructor):o.apply(t,e))}function _possibleConstructorReturn(t,e){if(e&&("object"==_typeof(e)||"function"==typeof e))return e;if(void 0!==e)throw new TypeError("Derived constructors may only return object or undefined");return _assertThisInitialized(t)}function _assertThisInitialized(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function _isNativeReflectConstruct(){try{var t=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch(t){}return(_isNativeReflectConstruct=function _isNativeReflectConstruct(){return!!t})()}function _getPrototypeOf(t){return _getPrototypeOf=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(t){return t.__proto__||Object.getPrototypeOf(t)},_getPrototypeOf(t)}function _inherits(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),Object.defineProperty(t,"prototype",{writable:!1}),e&&_setPrototypeOf(t,e)}function _setPrototypeOf(t,e){return _setPrototypeOf=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,e){return t.__proto__=e,t},_setPrototypeOf(t,e)}function _defineProperty(e,r,t){return(r=_toPropertyKey(r))in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}function _toPropertyKey(t){var i=_toPrimitive(t,"string");return"symbol"==_typeof(i)?i:i+""}function _toPrimitive(t,r){if("object"!=_typeof(t)||!t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var i=e.call(t,r||"default");if("object"!=_typeof(i))return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===r?String:Number)(t)}import{Controls,Raycaster,Vector2,Vector3}from"three";var _twoPI=2*Math.PI;var STATE={NONE:-1,ROTATE:0,PAN:1,TOUCH_ROTATE:2,TOUCH_PAN:3};var FirstPersonControls3D=/*#__PURE__*/function(_Controls){function FirstPersonControls3D(object){var _this;var domElement=arguments.length>1&&arguments[1]!==undefined?arguments[1]:null;_classCallCheck(this,FirstPersonControls3D);_this=_callSuper(this,FirstPersonControls3D,[object,domElement]);// Step sizes
2
- // Keyboard navigate
1
+ function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(o){return typeof o}:function(o){return o&&"function"==typeof Symbol&&o.constructor===Symbol&&o!==Symbol.prototype?"symbol":typeof o},_typeof(o)}function _classCallCheck(a,n){if(!(a instanceof n))throw new TypeError("Cannot call a class as a function")}function _defineProperties(e,r){for(var t=0;t<r.length;t++){var o=r[t];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(e,_toPropertyKey(o.key),o)}}function _createClass(e,r,t){return r&&_defineProperties(e.prototype,r),t&&_defineProperties(e,t),Object.defineProperty(e,"prototype",{writable:!1}),e}function _callSuper(t,o,e){return o=_getPrototypeOf(o),_possibleConstructorReturn(t,_isNativeReflectConstruct()?Reflect.construct(o,e||[],_getPrototypeOf(t).constructor):o.apply(t,e))}function _possibleConstructorReturn(t,e){if(e&&("object"==_typeof(e)||"function"==typeof e))return e;if(void 0!==e)throw new TypeError("Derived constructors may only return object or undefined");return _assertThisInitialized(t)}function _assertThisInitialized(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function _isNativeReflectConstruct(){try{var t=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch(t){}return(_isNativeReflectConstruct=function _isNativeReflectConstruct(){return!!t})()}function _getPrototypeOf(t){return _getPrototypeOf=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(t){return t.__proto__||Object.getPrototypeOf(t)},_getPrototypeOf(t)}function _inherits(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),Object.defineProperty(t,"prototype",{writable:!1}),e&&_setPrototypeOf(t,e)}function _setPrototypeOf(t,e){return _setPrototypeOf=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,e){return t.__proto__=e,t},_setPrototypeOf(t,e)}function _defineProperty(e,r,t){return(r=_toPropertyKey(r))in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}function _toPropertyKey(t){var i=_toPrimitive(t,"string");return"symbol"==_typeof(i)?i:i+""}function _toPrimitive(t,r){if("object"!=_typeof(t)||!t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var i=e.call(t,r||"default");if("object"!=_typeof(i))return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===r?String:Number)(t)}import{Controls,MOUSE,Raycaster,Vector2,Vector3}from"three";var _twoPI=2*Math.PI;var STATE={NONE:-1,ROTATE:0,PAN:1,TOUCH_ROTATE:2,TOUCH_PAN:3};var FirstPersonControls3D=/*#__PURE__*/function(_Controls){function FirstPersonControls3D(object,mouseButtons){var _this;_classCallCheck(this,FirstPersonControls3D);_this=_callSuper(this,FirstPersonControls3D,[object,null]);// Keyboard navigate
3
2
  _defineProperty(_this,"_handleKeyboardNav",function(){var lr=-_this._keyState.ArrowLeft+_this._keyState.ArrowRight;var du=-_this._keyState.ArrowDown+_this._keyState.ArrowUp;var pg=-_this._keyState.PageDown+_this._keyState.PageUp;var pitch=_this._keyState.Shift?du*_this.keyRotateStep:0;var yaw=_this._keyState.Control?0:-lr*_this.keyRotateStep;var dx=_this._keyState.Control?lr*_this.keyPanStep*0.75:0;var dy=_this._keyState.Shift?0:du*_this.keyPanStep;_this._rotate(yaw,pitch);_this._pan(dx,dy);if(pg){var newPersonHeight=Math.max(2,_this.personHeight+_this.personHeight*pg*0.05);_this.target.z+=newPersonHeight-_this.personHeight;_this.personHeight=newPersonHeight;_this._changed=true;_this.update()}});// Event listeners
4
3
  _defineProperty(_this,"_onKeyDown",function(event){if(event.key in _this._keyState){_this._keyState[event.key]=true;if(!_this._keyboardNavInterval){_this._keyboardNavInterval=setInterval(_this._handleKeyboardNav,50)}}});_defineProperty(_this,"_onKeyUp",function(event){if(event.key in _this._keyState){_this._keyState[event.key]=false;if(Object.values(_this._keyState).every(function(x){return!x})){clearInterval(_this._keyboardNavInterval);_this._keyboardNavInterval=null}}});_defineProperty(_this,"_onBlur",function(){_this._keyState={ArrowLeft:false,ArrowRight:false,ArrowUp:false,ArrowDown:false,PageUp:false,PageDown:false,Control:false,Shift:false};clearInterval(_this._keyboardNavInterval);_this._keyboardNavInterval=null});_defineProperty(_this,"_onPointerDown",function(event){if(!_this.enabled){return}if(_this._pointers.length===0){_this.domElement.setPointerCapture(event.pointerId);_this.domElement.addEventListener("pointermove",_this._onPointerMove);_this.domElement.addEventListener("pointerup",_this._onPointerUp);_this.domElement.addEventListener("pointercancel",_this._onPointerUp)}else if(_this._isTrackingPointer(event)){return}_this._addPointer(event);if(event.pointerType==="touch"){_this._onTouchStart(event)}else{_this._onMouseDown(event)}});_defineProperty(_this,"_onPointerMove",function(event){if(event.pointerType==="touch"){_this._onTouchMove(event)}else{_this._onMouseMove(event)}});_defineProperty(_this,"_onPointerUp",function(event){_this._removePointer(event);if(_this._pointers.length===0){_this.domElement.releasePointerCapture(event.pointerId);_this.domElement.removeEventListener("pointermove",_this._onPointerMove);_this.domElement.removeEventListener("pointerup",_this._onPointerUp);_this.domElement.removeEventListener("pointercancel",_this._onPointerUp);_this._interactionState=STATE.NONE}else if(_this._pointers.length===1){var pointerId=_this._pointers[0];var position=_this._pointerPositions[pointerId];// minimal placeholder event - allows state correction on pointer-up
5
- _this._onTouchStart({pointerId:pointerId,pageX:position.x,pageY:position.y})}});_defineProperty(_this,"_onMouseDown",function(event){_this._interactionState=STATE.NONE;if(event.button===2){// Rotate
6
- _this._interactionState=STATE.ROTATE;_this._interactionStart.set(event.clientX,event.clientY)}else if(event.button===0){// Pan
7
- _this._interactionState=STATE.PAN;_this._interactionStart.set(event.clientX,event.clientY)}});_defineProperty(_this,"_onMouseMove",function(event){var deltaX=event.clientX-_this._interactionStart.x;var deltaY=event.clientY-_this._interactionStart.y;_this._interactionStart.set(event.clientX,event.clientY);if(_this._interactionState===STATE.PAN){_this._pan(-deltaX*_this.mousePanSpeed,deltaY*_this.mousePanSpeed)}else if(_this._interactionState===STATE.ROTATE){_this._rotate(_twoPI*deltaX*_this.mouseRotateSpeed/_this.domElement.clientHeight,// yes, height
4
+ _this._onTouchStart({pointerId:pointerId,pageX:position.x,pageY:position.y})}});_defineProperty(_this,"_onMouseDown",function(event){var buttonMap={0:"LEFT",1:"MIDDLE",2:"RIGHT"};_this._interactionState=STATE.NONE;if(_this.mouseButtons[buttonMap[event.button]]===MOUSE.ROTATE){_this._interactionState=STATE.ROTATE;_this._interactionStart.set(event.clientX,event.clientY)}else if(_this.mouseButtons[buttonMap[event.button]]===MOUSE.PAN){_this._interactionState=STATE.PAN;_this._interactionStart.set(event.clientX,event.clientY)}});_defineProperty(_this,"_onMouseMove",function(event){var deltaX=event.clientX-_this._interactionStart.x;var deltaY=event.clientY-_this._interactionStart.y;_this._interactionStart.set(event.clientX,event.clientY);if(_this._interactionState===STATE.PAN){_this._pan(-deltaX*_this.mousePanSpeed,deltaY*_this.mousePanSpeed)}else if(_this._interactionState===STATE.ROTATE){_this._rotate(_twoPI*deltaX*_this.mouseRotateSpeed/_this.domElement.clientHeight,// yes, height
8
5
  _twoPI*deltaY*_this.mouseRotateSpeed/_this.domElement.clientHeight)}});_defineProperty(_this,"_onTouchStart",function(event){_this._interactionState=STATE.NONE;if(_this._pointers.length===1){_this._interactionState=STATE.TOUCH_PAN;_this._interactionStart.set(event.pageX,event.pageY)}else if(_this._pointers.length===2){_this._interactionState=STATE.TOUCH_ROTATE;var _this$_getTwoPointerP=_this._getTwoPointerPosition(event),x=_this$_getTwoPointerP.x,y=_this$_getTwoPointerP.y;_this._interactionStart.set(x,y)}});_defineProperty(_this,"_onTouchMove",function(event){_this._trackPointer(event);if(_this._interactionState===STATE.TOUCH_PAN){var deltaX=event.pageX-_this._interactionStart.x;var deltaY=event.pageY-_this._interactionStart.y;_this._interactionStart.set(event.pageX,event.pageY);_this._pan(-deltaX*_this.mousePanSpeed,deltaY*_this.mousePanSpeed)}else if(_this._interactionState===STATE.TOUCH_ROTATE){var _this$_getTwoPointerP2=_this._getTwoPointerPosition(event),x=_this$_getTwoPointerP2.x,y=_this$_getTwoPointerP2.y;var _deltaX=x-_this._interactionStart.x;var _deltaY=y-_this._interactionStart.y;_this._interactionStart.set(x,y);_this._rotate(_twoPI*_deltaX*_this.mouseRotateSpeed/_this.domElement.clientHeight,// yes, height
9
- _twoPI*_deltaY*_this.mouseRotateSpeed/_this.domElement.clientHeight)}});_defineProperty(_this,"_onContextMenu",function(event){event.preventDefault()});_this.keyPanStep=1.5;_this.keyRotateStep=4/180*Math.PI;_this.mousePanSpeed=0.1;_this.mouseRotateSpeed=10/180*Math.PI;_this.personHeight=3;_this.sceneContext=null;_this.enabled=false;_this.yaw=0;_this.pitch=0;_this.lookAt=new Vector3(0,1,0);// Target is the actual collision detection point
6
+ _twoPI*_deltaY*_this.mouseRotateSpeed/_this.domElement.clientHeight)}});_defineProperty(_this,"_onContextMenu",function(event){event.preventDefault()});_this.mouseButtons=mouseButtons;// Step sizes
7
+ _this.keyPanStep=1.5;_this.keyRotateStep=4/180*Math.PI;_this.mousePanSpeed=0.1;_this.mouseRotateSpeed=10/180*Math.PI;_this.personHeight=3;_this.sceneContext=null;_this.enabled=false;_this.yaw=0;_this.pitch=0;_this.lookAt=new Vector3(0,1,0);// Target is the actual collision detection point
10
8
  _this.target=new Vector3().addVectors(_this.object.position,_this.lookAt.clone().multiplyScalar(3));_this.isFirstPerson=true;// Internals
11
9
  _this._keyState={ArrowLeft:false,ArrowRight:false,ArrowUp:false,ArrowDown:false,PageUp:false,PageDown:false,Control:false,Shift:false};_this._keyboardNavInterval=null;_this._changed=false;_this._interactionState=STATE.NONE;_this._interactionStart=new Vector2;_this._pointers=[];_this._pointerPositions={};return _this}_inherits(FirstPersonControls3D,_Controls);return _createClass(FirstPersonControls3D,[{key:"connect",value:function connect(sceneContext){this.domElement=sceneContext.scene.domElement;this.sceneContext=sceneContext;this.domElement.addEventListener("pointerdown",this._onPointerDown);this.domElement.addEventListener("pointercancel",this._onPointerUp);this.domElement.addEventListener("contextmenu",this._onContextMenu);this.domElement.addEventListener("keydown",this._onKeyDown);this.domElement.addEventListener("keyup",this._onKeyUp);this.domElement.addEventListener("blur",this._onBlur);this.domElement.style.touchAction="none";// disable touch scroll
12
10
  this.object.near=0.1;this.sceneContext.scene.view.setControls(this);this.enabled=true}},{key:"disconnect",value:function disconnect(){this.enabled=false;this.sceneContext.scene.view.setControls(null);this.domElement.removeEventListener("pointerdown",this._onPointerDown);this.domElement.removeEventListener("pointermove",this._onPointerMove);this.domElement.removeEventListener("pointerup",this._onPointerUp);this.domElement.removeEventListener("pointercancel",this._onPointerUp);this.domElement.removeEventListener("contextmenu",this._onContextMenu);this.domElement.removeEventListener("keydown",this._onKeyDown);this.domElement.removeEventListener("keyup",this._onKeyUp);this.domElement.removeEventListener("blur",this._onBlur);this.domElement.style.touchAction="auto"}},{key:"setView",value:function setView(targetpos,lookAt){var personHeight=arguments.length>2&&arguments[2]!==undefined?arguments[2]:undefined;this.personHeight=personHeight!==null&&personHeight!==void 0?personHeight:this.personHeight;this.target.copy(targetpos);this.lookAt.copy(lookAt);this.object.position.subVectors(targetpos,lookAt.clone().multiplyScalar(3));this.pitch=Math.asin(Math.max(-1,Math.min(1,this.lookAt.z)));this.yaw=Math.atan2(-this.lookAt.x,this.lookAt.y);this.object.lookAt(this.target);this.dispatchEvent({type:"change"})}},{key:"panView",value:function panView(dx,dy){if(dx||dy){this._pan(dx,dy)}}},{key:"tiltView",value:function tiltView(yaw,pitch){this.yaw+=yaw;this.pitch+=pitch;if(yaw||pitch){this._changed=true;this.update()}}},{key:"dispose",value:function dispose(){this.disconnect()}},{key:"update",value:function update(){var deltaTime=arguments.length>0&&arguments[0]!==undefined?arguments[0]:null;if(!this._changed){return}this.lookAt.x=-Math.sin(this.yaw)*Math.cos(this.pitch);this.lookAt.y=Math.cos(this.yaw)*Math.cos(this.pitch);this.lookAt.z=Math.sin(this.pitch);this.object.position.subVectors(this.target,this.lookAt.clone().multiplyScalar(3));this.object.lookAt(this.target);this.dispatchEvent({type:"change"});this._changed=false}// Internals
@@ -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{Vector3}from"three";import{MapControls}from"three/addons/controls/MapControls";import{v4 as uuidv4}from"uuid";var OrbitControls3D=/*#__PURE__*/function(_MapControls){function OrbitControls3D(object){var _this;_classCallCheck(this,OrbitControls3D);_this=_callSuper(this,OrbitControls3D,[object]);_defineProperty(_this,"updateControlsTarget",function(){var _this$sceneContext$ge;if(_this.animationId){// Do nothing if animating
7
+ */import{Vector3}from"three";import{MapControls}from"three/addons/controls/MapControls";import{v4 as uuidv4}from"uuid";var OrbitControls3D=/*#__PURE__*/function(_MapControls){function OrbitControls3D(object,mouseButtons){var _this;_classCallCheck(this,OrbitControls3D);_this=_callSuper(this,OrbitControls3D,[object]);_defineProperty(_this,"updateControlsTarget",function(){var _this$sceneContext$ge;if(_this.animationId){// Do nothing if animating
8
8
  return}var camerapos=_this.object.position;var x=_this.target.x;var y=_this.target.y;var height=(_this$sceneContext$ge=_this.sceneContext.getTerrainHeightFromMap([x,y]))!==null&&_this$sceneContext$ge!==void 0?_this$sceneContext$ge:0;// If camera height is at terrain height, target height should be at terrain height
9
9
  // If camera height is at twice the terrain height or further, target height should be zero
10
- var newHeight=Math.max(0,1-(camerapos.z-height)/height)*height;_this.target.z=newHeight});_defineProperty(_this,"stopAnimations",function(){_this.animationId=null});_this.animationId=null;_this.sceneContext=null;_this.enabled=false;_this.zoomToCursor=true;_this.enableDamping=true;_this.dampingFactor=0.2;_this.keyPanSpeed=10;_this.maxPolarAngle=Math.PI*0.5;return _this}_inherits(OrbitControls3D,_MapControls);return _createClass(OrbitControls3D,[{key:"connect",value:function connect(sceneContext){this.domElement=sceneContext.scene.domElement;this.sceneContext=sceneContext;this.enabled=true;_superPropGet(OrbitControls3D,"connect",this,3)([]);this.listenToKeyEvents(this.domElement);this.domElement.addEventListener("pointerdown",this.stopAnimations);this.domElement.addEventListener("wheel",this.stopAnimations);this.addEventListener("change",this.updateControlsTarget);this.object.near=2;this.sceneContext.scene.view.setControls(this)}},{key:"disconnect",value:function disconnect(){this.animationId=null;_superPropGet(OrbitControls3D,"disconnect",this,3)([]);this.enabled=false;this.sceneContext.scene.view.setControls(null);this.domElement.removeEventListener("pointerdown",this.stopAnimations);this.domElement.removeEventListener("wheel",this.stopAnimations);this.removeEventListener("change",this.updateControlsTarget)}},{key:"setView",value:function setView(camerapos,target){this.object.position.copy(camerapos);this.target.copy(target);this.update()}},{key:"panView",value:function panView(dx,dy){if(dx||dy){this._pan(-dx*10,dy*10);this.update()}}},{key:"tiltView",value:function tiltView(azimuth,polar){if(azimuth){this._rotateLeft(azimuth)}if(polar){this._rotateUp(polar)}if(azimuth||polar){this.update()}}},{key:"zoomView",value:function zoomView(delta){if(delta>0){this._dollyIn(this._getZoomScale(-delta));this.update()}else if(delta<0){this._dollyOut(this._getZoomScale(-delta));this.update()}}},{key:"animateTo",value:function animateTo(camerapos,target,azimuth){var _this2=this;var callback=arguments.length>3&&arguments[3]!==undefined?arguments[3]:null;var oldPosition=this.object.position.clone();var oldTarget=this.target.clone();var oldYaw=this.getAzimuthalAngle();var newPosition=camerapos;var newTarget=target;var rotateAngle=-oldYaw+azimuth;while(rotateAngle>Math.PI)rotateAngle-=2*Math.PI;while(rotateAngle<-Math.PI)rotateAngle+=2*Math.PI;var startTime=new Date/1000;var animationId=uuidv4();this.animationId=animationId;this.enableDamping=false;var _animate=function animate(){if(_this2.animationId!==animationId){return}var duration=2;var elapsed=new Date/1000-startTime;var x=elapsed/duration;var k=0.5*(1-Math.cos(x*Math.PI));var currentPosition=new Vector3().lerpVectors(oldPosition,newPosition,k);var currentTarget=new Vector3().lerpVectors(oldTarget,newTarget,k);currentPosition.x-=currentTarget.x;currentPosition.y-=currentTarget.y;currentPosition.applyAxisAngle(new Vector3(0,0,1),rotateAngle*k);currentPosition.x+=currentTarget.x;currentPosition.y+=currentTarget.y;_this2.object.position.copy(currentPosition);_this2.target.copy(currentTarget);_this2.update();if(elapsed<duration){requestAnimationFrame(_animate)}else{_this2.object.position.copy(newPosition);_this2.target.copy(newTarget);_this2.update();_this2._rotateLeft(_this2.getAzimuthalAngle()-azimuth);_this2.update();_this2.enableDamping=true;_this2.animationId=null;callback===null||callback===void 0||callback()}};requestAnimationFrame(_animate)}}])}(MapControls);export{OrbitControls3D as default};
10
+ var newHeight=Math.max(0,1-(camerapos.z-height)/height)*height;_this.target.z=newHeight});_defineProperty(_this,"stopAnimations",function(){_this.animationId=null});_this.animationId=null;_this.sceneContext=null;_this.enabled=false;_this.zoomToCursor=true;_this.enableDamping=true;_this.dampingFactor=0.2;_this.keyPanSpeed=10;_this.maxPolarAngle=Math.PI*0.5;_this.mouseButtons=mouseButtons;_this.zoomSpeed=5;return _this}_inherits(OrbitControls3D,_MapControls);return _createClass(OrbitControls3D,[{key:"connect",value:function connect(sceneContext){this.domElement=sceneContext.scene.domElement;this.sceneContext=sceneContext;this.enabled=true;_superPropGet(OrbitControls3D,"connect",this,3)([]);this.listenToKeyEvents(this.domElement);this.domElement.addEventListener("pointerdown",this.stopAnimations);this.domElement.addEventListener("wheel",this.stopAnimations);this.addEventListener("change",this.updateControlsTarget);this.object.near=2;this.sceneContext.scene.view.setControls(this)}},{key:"disconnect",value:function disconnect(){this.animationId=null;_superPropGet(OrbitControls3D,"disconnect",this,3)([]);this.enabled=false;this.sceneContext.scene.view.setControls(null);this.domElement.removeEventListener("pointerdown",this.stopAnimations);this.domElement.removeEventListener("wheel",this.stopAnimations);this.removeEventListener("change",this.updateControlsTarget)}},{key:"setView",value:function setView(camerapos,target){this.object.position.copy(camerapos);this.target.copy(target);this.update()}},{key:"panView",value:function panView(dx,dy){if(dx||dy){this._pan(-dx*10,dy*10);this.update()}}},{key:"tiltView",value:function tiltView(azimuth,polar){if(azimuth){this._rotateLeft(azimuth)}if(polar){this._rotateUp(polar)}if(azimuth||polar){this.update()}}},{key:"zoomView",value:function zoomView(delta){if(delta>0){this._dollyIn(this._getZoomScale(-delta));this.update()}else if(delta<0){this._dollyOut(this._getZoomScale(-delta));this.update()}}},{key:"animateTo",value:function animateTo(camerapos,target,azimuth){var _this2=this;var callback=arguments.length>3&&arguments[3]!==undefined?arguments[3]:null;var oldPosition=this.object.position.clone();var oldTarget=this.target.clone();var oldYaw=this.getAzimuthalAngle();var newPosition=camerapos;var newTarget=target;var rotateAngle=-oldYaw+azimuth;while(rotateAngle>Math.PI)rotateAngle-=2*Math.PI;while(rotateAngle<-Math.PI)rotateAngle+=2*Math.PI;var startTime=new Date/1000;var animationId=uuidv4();this.animationId=animationId;this.enableDamping=false;var _animate=function animate(){if(_this2.animationId!==animationId){return}var duration=2;var elapsed=new Date/1000-startTime;var x=elapsed/duration;var k=0.5*(1-Math.cos(x*Math.PI));var currentPosition=new Vector3().lerpVectors(oldPosition,newPosition,k);var currentTarget=new Vector3().lerpVectors(oldTarget,newTarget,k);currentPosition.x-=currentTarget.x;currentPosition.y-=currentTarget.y;currentPosition.applyAxisAngle(new Vector3(0,0,1),rotateAngle*k);currentPosition.x+=currentTarget.x;currentPosition.y+=currentTarget.y;_this2.object.position.copy(currentPosition);_this2.target.copy(currentTarget);_this2.update();if(elapsed<duration){requestAnimationFrame(_animate)}else{_this2.object.position.copy(newPosition);_this2.target.copy(newTarget);_this2.update();_this2._rotateLeft(_this2.getAzimuthalAngle()-azimuth);_this2.update();_this2.enableDamping=true;_this2.animationId=null;callback===null||callback===void 0||callback()}};requestAnimationFrame(_animate)}}])}(MapControls);export{OrbitControls3D as default};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "qwc2",
3
- "version": "2025.09.02",
3
+ "version": "2025.09.04",
4
4
  "description": "QGIS Web Client",
5
5
  "author": "Sourcepole AG",
6
6
  "license": "BSD-2-Clause",
@@ -11,7 +11,7 @@ function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof
11
11
  *
12
12
  * This plugin queries the dataset via the editing service specified by
13
13
  * `editServiceUrl` in `config.json` (by default the `qwc-data-service`).
14
- */var Editing=/*#__PURE__*/function(_React$Component){function Editing(){var _this;_classCallCheck(this,Editing);for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++){args[_key]=arguments[_key]}_this=_callSuper(this,Editing,[].concat(args));_defineProperty(_this,"state",{selectedLayer:null,selectedLayerVisibility:null,pickedFeatures:null,busy:false,minimized:false,drawPick:false});_defineProperty(_this,"onShow",function(){if(_this.props.taskData){_this.changeSelectedLayer(_this.props.taskData.layer,_this.props.taskData.feature)}else{_this.changeSelectedLayer(_this.state.selectedLayer)}_this.props.setSnappingConfig(_this.props.snapping,_this.props.snappingActive)});_defineProperty(_this,"onHide",function(){_this.props.clearEditContext("Editing");_this.setLayerVisibility(_this.state.selectedLayer,_this.state.selectedLayerVisibility);_this.setState({minimized:false,drawPick:false})});_defineProperty(_this,"renderBody",function(){if(!_this.props.theme||isEmpty(_this.props.theme.editConfig)){return/*#__PURE__*/React.createElement("div",{role:"body",style:{padding:"1em"}},LocaleUtils.tr("editing.noeditablelayers"))}var editConfig=_this.props.theme.editConfig;var curConfig=editConfig[_this.state.selectedLayer];if(!curConfig){return/*#__PURE__*/React.createElement("div",{role:"body",style:{padding:"1em"}},LocaleUtils.tr("editing.noeditablelayers"))}var editPermissions=curConfig.permissions||{};var actionButtons=[];actionButtons.push({key:"Pick",icon:"pick",label:LocaleUtils.tr("editing.pick"),data:{action:"Pick",feature:null}});if(editPermissions.creatable!==false&&!_this.props.editContext.geomReadOnly){actionButtons.push({key:"Draw",icon:"editdraw",label:LocaleUtils.tr("editing.draw"),data:{action:"Draw"}})}if(ConfigUtils.havePlugin("AttributeTable")){actionButtons.push({key:"AttribTable",icon:"editing",label:LocaleUtils.tr("editing.attrtable"),data:{action:"AttrTable"}})}var featureSelection=null;if(_this.state.pickedFeatures&&_this.state.pickedFeatures.length>1){var featureText=LocaleUtils.tr("editing.feature");featureSelection=/*#__PURE__*/React.createElement("div",{className:"editing-feature-selection"},/*#__PURE__*/React.createElement("select",{className:"combo editing-feature-select",disabled:_this.props.editContext.changed===true||_this.props.editContext.id!==_this.props.currentEditContext,onChange:function onChange(ev){return _this.setEditFeature(ev.target.value)},value:(_this.props.editContext.feature||{}).id||""},_this.state.pickedFeatures.map(function(feature){return/*#__PURE__*/React.createElement("option",{key:feature.id,value:feature.id},curConfig.displayField?feature.properties[curConfig.displayField]:featureText+" "+feature.id)})))}var pickBar=null;if(_this.props.allowCloneGeometry&&(_this.props.editContext.action==="Draw"||_this.state.drawPick)&&!(_this.props.editContext.feature||{}).geometry){var pickButtons=[{key:"DrawPick",icon:"pick",label:LocaleUtils.tr("editing.pickdrawfeature")}];pickBar=/*#__PURE__*/React.createElement(ButtonBar,{active:_this.state.drawPick?"DrawPick":null,buttons:pickButtons,onClick:_this.toggleDrawPick})}var attributeForm=null;if(_this.props.editContext.feature&&(_this.props.editContext.action==="Pick"||_this.props.editContext.feature.geometry)){attributeForm=/*#__PURE__*/React.createElement(AttributeForm,{editConfig:curConfig,editContext:_this.props.editContext,iface:_this.props.iface,onCommit:_this.updatePickedFeatures})}var themeSublayers=_this.props.layers.reduce(function(accum,layer){return layer.role===LayerRole.THEME?accum.concat(LayerUtils.getSublayerNames(layer)):accum},[]);return/*#__PURE__*/React.createElement("div",{className:"editing-body"},/*#__PURE__*/React.createElement("div",{className:"editing-layer-selection"},/*#__PURE__*/React.createElement("select",{className:"combo editing-layer-select",disabled:_this.props.editContext.changed===true||_this.props.editContext.id!==_this.props.currentEditContext,onChange:function onChange(ev){return _this.changeSelectedLayer(ev.target.value)},value:_this.state.selectedLayer||""},Object.keys(editConfig).filter(function(layerId){return themeSublayers.includes(layerId)}).map(function(layerId){var _match$sublayer$title,_match$sublayer;var layerName=editConfig[layerId].layerName;var match=LayerUtils.searchLayer(_this.props.layers,_this.props.theme.url,layerName);return/*#__PURE__*/React.createElement("option",{key:layerId,value:layerId},(_match$sublayer$title=match===null||match===void 0||(_match$sublayer=match.sublayer)===null||_match$sublayer===void 0?void 0:_match$sublayer.title)!==null&&_match$sublayer$title!==void 0?_match$sublayer$title:layerName)}))),/*#__PURE__*/React.createElement(ButtonBar,{active:_this.state.drawPick?"Draw":_this.props.editContext.action,buttons:actionButtons,disabled:_this.props.editContext.changed||_this.props.editContext.id!==_this.props.currentEditContext,onClick:_this.actionClicked}),featureSelection,pickBar,attributeForm)});_defineProperty(_this,"actionClicked",function(action,data){_this.setState({drawPick:false,pickedFeatures:null});if(action==="AttribTable"){_this.props.setCurrentTask("AttributeTable",null,null,{layer:_this.state.selectedLayer})}else if(action==="Draw"){var editConfig=_this.props.theme.editConfig;var curConfig=editConfig[_this.state.selectedLayer];var featureSkel={type:"Feature",properties:{}};var mapPrefix=(curConfig.editDataset.match(/^[^.]+\./)||[""])[0];getFeatureTemplate(curConfig,featureSkel,_this.props.iface,mapPrefix,_this.props.map.projection,function(feature){_this.props.setEditContext("Editing",_objectSpread(_objectSpread({},data),{},{feature:feature,geomReadOnly:false}))})}else{_this.props.setEditContext("Editing",_objectSpread({},data))}});_defineProperty(_this,"pickFilter",function(feature){var _this$props$theme$edi;var geomType=(_this$props$theme$edi=_this.props.theme.editConfig[_this.state.selectedLayer])===null||_this$props$theme$edi===void 0?void 0:_this$props$theme$edi.geomType;return feature.geometry&&(feature.geometry.type===geomType||"Multi"+feature.geometry.type===geomType||feature.geometry.type.replace(/^Multi/,"")===geomType&&feature.geometry.coordinates.length===1)});_defineProperty(_this,"geomPicked",function(layer,feature){var _this$props$theme$edi2;var geomType=(_this$props$theme$edi2=_this.props.theme.editConfig[_this.state.selectedLayer])===null||_this$props$theme$edi2===void 0?void 0:_this$props$theme$edi2.geomType;var geometry=feature.geometry;if(geometry.type!==geomType){if("Multi"+feature.geometry.type===geomType){// Convert picked geometry to multi-type
14
+ */var Editing=/*#__PURE__*/function(_React$Component){function Editing(){var _this;_classCallCheck(this,Editing);for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++){args[_key]=arguments[_key]}_this=_callSuper(this,Editing,[].concat(args));_defineProperty(_this,"state",{selectedLayer:null,selectedLayerVisibility:null,pickedFeatures:null,busy:false,minimized:false,drawPick:false});_defineProperty(_this,"onShow",function(){if(_this.props.taskData){_this.changeSelectedLayer(_this.props.taskData.layer,_this.props.taskData.feature)}else{_this.changeSelectedLayer(_this.state.selectedLayer)}_this.props.setSnappingConfig(_this.props.snapping,_this.props.snappingActive)});_defineProperty(_this,"onHide",function(){_this.props.clearEditContext("Editing");_this.setLayerVisibility(_this.state.selectedLayer,_this.state.selectedLayerVisibility);_this.setState({minimized:false,drawPick:false})});_defineProperty(_this,"renderBody",function(){if(!_this.props.theme||isEmpty(_this.props.theme.editConfig)){return/*#__PURE__*/React.createElement("div",{role:"body",style:{padding:"1em"}},LocaleUtils.tr("editing.noeditablelayers"))}var editConfig=_this.props.theme.editConfig;var curConfig=editConfig[_this.state.selectedLayer];if(!curConfig){return/*#__PURE__*/React.createElement("div",{role:"body",style:{padding:"1em"}},LocaleUtils.tr("editing.noeditablelayers"))}var editPermissions=curConfig.permissions||{};var actionButtons=[];actionButtons.push({key:"Pick",icon:"pick",label:LocaleUtils.tr("editing.pick"),data:{action:"Pick",feature:null}});if(editPermissions.creatable!==false&&!_this.props.editContext.geomReadOnly){actionButtons.push({key:"Draw",icon:"editdraw",label:LocaleUtils.tr("editing.draw"),data:{action:"Draw"}})}if(ConfigUtils.havePlugin("AttributeTable")){actionButtons.push({key:"AttribTable",icon:"editing",label:LocaleUtils.tr("editing.attrtable"),data:{action:"AttrTable"}})}var featureSelection=null;if(_this.state.pickedFeatures&&_this.state.pickedFeatures.length>1){var featureText=LocaleUtils.tr("editing.feature");featureSelection=/*#__PURE__*/React.createElement("div",{className:"editing-feature-selection"},/*#__PURE__*/React.createElement("select",{className:"combo editing-feature-select",disabled:_this.props.editContext.changed===true||_this.props.editContext.id!==_this.props.currentEditContext,onChange:function onChange(ev){return _this.setEditFeature(ev.target.value)},value:(_this.props.editContext.feature||{}).id||""},_this.state.pickedFeatures.map(function(feature){return/*#__PURE__*/React.createElement("option",{key:feature.id,value:feature.id},curConfig.displayField?feature.properties[curConfig.displayField]:featureText+" "+feature.id)})))}var pickBar=null;if(_this.props.allowCloneGeometry&&(_this.props.editContext.action==="Draw"||_this.state.drawPick)&&!(_this.props.editContext.feature||{}).geometry){var pickButtons=[{key:"DrawPick",icon:"pick",label:LocaleUtils.tr("editing.pickdrawfeature")}];pickBar=/*#__PURE__*/React.createElement(ButtonBar,{active:_this.state.drawPick?"DrawPick":null,buttons:pickButtons,onClick:_this.toggleDrawPick})}var attributeForm=null;if(_this.props.editContext.feature&&(_this.props.editContext.action==="Pick"||_this.props.editContext.feature.geometry)){attributeForm=/*#__PURE__*/React.createElement(AttributeForm,{editConfig:curConfig,editContext:_this.props.editContext,iface:_this.props.iface,onCommit:_this.updatePickedFeatures})}var themeSublayers=_this.props.layers.reduce(function(accum,layer){return layer.role===LayerRole.THEME?accum.concat(LayerUtils.getSublayerNames(layer)):accum},[]);return/*#__PURE__*/React.createElement("div",{className:"editing-body"},/*#__PURE__*/React.createElement("div",{className:"editing-layer-selection"},/*#__PURE__*/React.createElement("select",{className:"combo editing-layer-select",disabled:_this.props.editContext.changed===true||_this.props.editContext.id!==_this.props.currentEditContext,onChange:function onChange(ev){return _this.changeSelectedLayer(ev.target.value)},value:_this.state.selectedLayer||""},Object.keys(editConfig).filter(function(layerId){return themeSublayers.includes(layerId)}).map(function(layerId){var _this$props$theme$tra,_this$props$theme$tra2,_LayerUtils$searchLay,_LayerUtils$searchLay2;var layerName=editConfig[layerId].layerName;var layerTitle=editConfig[layerId].layerTitle?(_this$props$theme$tra=(_this$props$theme$tra2=_this.props.theme.translations)===null||_this$props$theme$tra2===void 0||(_this$props$theme$tra2=_this$props$theme$tra2.layertree)===null||_this$props$theme$tra2===void 0?void 0:_this$props$theme$tra2[layerName])!==null&&_this$props$theme$tra!==void 0?_this$props$theme$tra:editConfig[layerId].layerTitle:(_LayerUtils$searchLay=(_LayerUtils$searchLay2=LayerUtils.searchLayer(_this.props.layers,_this.props.theme.url,layerName))===null||_LayerUtils$searchLay2===void 0||(_LayerUtils$searchLay2=_LayerUtils$searchLay2.sublayer)===null||_LayerUtils$searchLay2===void 0?void 0:_LayerUtils$searchLay2.title)!==null&&_LayerUtils$searchLay!==void 0?_LayerUtils$searchLay:layerName;return/*#__PURE__*/React.createElement("option",{key:layerId,value:layerId},layerTitle)}))),/*#__PURE__*/React.createElement(ButtonBar,{active:_this.state.drawPick?"Draw":_this.props.editContext.action,buttons:actionButtons,disabled:_this.props.editContext.changed||_this.props.editContext.id!==_this.props.currentEditContext,onClick:_this.actionClicked}),featureSelection,pickBar,attributeForm)});_defineProperty(_this,"actionClicked",function(action,data){_this.setState({drawPick:false,pickedFeatures:null});if(action==="AttribTable"){_this.props.setCurrentTask("AttributeTable",null,null,{layer:_this.state.selectedLayer})}else if(action==="Draw"){var editConfig=_this.props.theme.editConfig;var curConfig=editConfig[_this.state.selectedLayer];var featureSkel={type:"Feature",properties:{}};var mapPrefix=(curConfig.editDataset.match(/^[^.]+\./)||[""])[0];getFeatureTemplate(curConfig,featureSkel,_this.props.iface,mapPrefix,_this.props.map.projection,function(feature){_this.props.setEditContext("Editing",_objectSpread(_objectSpread({},data),{},{feature:feature,geomReadOnly:false}))})}else{_this.props.setEditContext("Editing",_objectSpread({},data))}});_defineProperty(_this,"pickFilter",function(feature){var _this$props$theme$edi;var geomType=(_this$props$theme$edi=_this.props.theme.editConfig[_this.state.selectedLayer])===null||_this$props$theme$edi===void 0?void 0:_this$props$theme$edi.geomType;return feature.geometry&&(feature.geometry.type===geomType||"Multi"+feature.geometry.type===geomType||feature.geometry.type.replace(/^Multi/,"")===geomType&&feature.geometry.coordinates.length===1)});_defineProperty(_this,"geomPicked",function(layer,feature){var _this$props$theme$edi2;var geomType=(_this$props$theme$edi2=_this.props.theme.editConfig[_this.state.selectedLayer])===null||_this$props$theme$edi2===void 0?void 0:_this$props$theme$edi2.geomType;var geometry=feature.geometry;if(geometry.type!==geomType){if("Multi"+feature.geometry.type===geomType){// Convert picked geometry to multi-type
15
15
  geometry={type:"Multi"+geometry.type,coordinates:[geometry.coordinates]}}else if(geometry.type.replace(/^Multi/,"")===geomType&&geometry.coordinates.length===1){// Convert picked geometry to single type
16
16
  geometry={type:geometry.type.replace(/^Multi/,""),coordinates:geometry.coordinates[0]}}else{// Should not happen, mismatching geometries should already have been filtered from the list of choices
17
17
  return}}var editFeature={type:"Feature",geometry:geometry,id:uuidv1()};_this.props.setEditContext("Editing",{action:"Draw",feature:editFeature,changed:true});_this.setState({drawPick:false})});_defineProperty(_this,"setLayerVisibility",function(selectedLayer,visibility){if(selectedLayer!==null){var path=[];var sublayer=null;var layer=_this.props.layers.find(function(l){return l.role===LayerRole.THEME&&(sublayer=LayerUtils.searchSubLayer(l,"name",selectedLayer,path))});if(layer&&sublayer){var oldvisibility=sublayer.visibility;if(oldvisibility!==visibility&&visibility!==null){var recurseDirection=!oldvisibility?"both":"children";_this.props.changeLayerProperty(layer.id,"visibility",visibility,path,recurseDirection)}return oldvisibility}}return null});_defineProperty(_this,"changeSelectedLayer",function(selectedLayer){var feature=arguments.length>1&&arguments[1]!==undefined?arguments[1]:null;var curConfig=_this.props.theme&&_this.props.theme.editConfig&&selectedLayer?_this.props.theme.editConfig[selectedLayer]:null;_this.props.setEditContext("Editing",{action:"Pick",feature:feature,geomType:(curConfig===null||curConfig===void 0?void 0:curConfig.geomType)||null,permissions:(curConfig===null||curConfig===void 0?void 0:curConfig.permissions)||{}});var prevLayerVisibility=null;if(_this.state.selectedLayer!==null){_this.setLayerVisibility(_this.state.selectedLayer,_this.state.selectedLayerVisibility);prevLayerVisibility=_this.setLayerVisibility(selectedLayer,true)}_this.setState({selectedLayer:selectedLayer,selectedLayerVisibility:prevLayerVisibility,drawPick:false})});_defineProperty(_this,"setEditFeature",function(featureId){var feature=_this.state.pickedFeatures.find(function(f){return f.id.toString()===featureId});_this.props.setEditContext("Editing",{feature:feature,changed:false})});_defineProperty(_this,"toggleDrawPick",function(){_this.setState(function(state){var pickActive=!state.drawPick;_this.props.setEditContext("Editing",{action:pickActive?null:"Draw"});return{drawPick:pickActive}})});_defineProperty(_this,"updatePickedFeatures",function(newfeature){if(_this.state.pickedFeatures){_this.setState(function(state){return{pickedFeatures:state.pickedFeatures.map(function(feature){return feature.id===newfeature.id?newfeature:feature})}})}});return _this}_inherits(Editing,_React$Component);return _createClass(Editing,[{key:"componentDidUpdate",value:function componentDidUpdate(prevProps,prevState){var _this2=this;var themeSublayers=this.props.layers.reduce(function(accum,layer){return layer.role===LayerRole.THEME?accum.concat(LayerUtils.getSublayerNames(layer)):accum},[]);// Update selected layer on layers change
package/plugins/Print.js CHANGED
@@ -9,7 +9,7 @@ function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof
9
9
  *
10
10
  * Uses the print layouts defined in the QGIS project.
11
11
  */var Print=/*#__PURE__*/function(_React$Component){function Print(props){var _this;_classCallCheck(this,Print);_this=_callSuper(this,Print,[props]);_defineProperty(_this,"state",{center:null,extents:[],layout:null,layouts:[],rotation:0,scale:0,dpi:300,grid:false,legend:false,minimized:false,printOutputVisible:false,outputLoaded:false,printing:false,atlasFeatures:[],geoPdf:false,selectedFormat:"",printOutputData:undefined,pdfData:null,pdfDataUrl:null,downloadMode:"onepdf",printSeriesEnabled:false,printSeriesOverlap:0,printSeriesSelected:[]});_defineProperty(_this,"onShow",function(){// setup initial extent
12
- var scale=Math.round(MapUtils.computeForZoom(_this.props.map.scales,_this.props.map.zoom)*_this.props.defaultScaleFactor);if(_this.props.theme.printScales&&_this.props.theme.printScales.length>0){var closestVal=Math.abs(scale-_this.props.theme.printScales[0]);var closestIdx=0;for(var i=1;i<_this.props.theme.printScales.length;++i){var currVal=Math.abs(scale-_this.props.theme.printScales[i]);if(currVal<closestVal){closestVal=currVal;closestIdx=i}}scale=_this.props.theme.printScales[closestIdx]}var bounds=_this.props.map.bbox.bounds;var center=_this.state.center||[0,0];var resetCenter=center[0]<bounds[0]||center[0]>bounds[2]||center[1]<bounds[1]||center[1]>bounds[3];var resetScale=_this.state.scale/scale<0.01||_this.state.scale/scale>10;if(resetCenter||resetScale){_this.setState({center:null,rotation:0,scale:scale})}_this.props.setSnappingConfig(false,false)});_defineProperty(_this,"onHide",function(){_this.setState({minimized:false,printSeriesEnabled:false,atlasFeatures:[]})});_defineProperty(_this,"renderBody",function(){var _this$state$extents$a,_this$state$layout$la,_this$state$layout;if(!_this.state.layout){return/*#__PURE__*/React.createElement("div",{className:"print-body",role:"body"},LocaleUtils.tr("print.nolayouts"))}var haveThemeLayers=_this.props.layers.find(function(layer){return layer.role===LayerRole.THEME})!==undefined;if(!_this.props.theme||!_this.props.printExternalLayers&&!haveThemeLayers){return/*#__PURE__*/React.createElement("div",{className:"print-body",role:"body"},LocaleUtils.tr("print.notheme"))}var mapName=_this.state.layout.map.name;var printLegend=_this.state.layout.legendLayout;var formattedExtent=!isEmpty(_this.state.atlasFeatures)?"":_this.formatExtent((_this$state$extents$a=_this.state.extents.at(0))!==null&&_this$state$extents$a!==void 0?_this$state$extents$a:[0,0,0,0]);var resolutionChooser=null;var resolutionInput=null;if(!isEmpty(_this.props.theme.printResolutions)){if(_this.props.theme.printResolutions.length>1){resolutionChooser=/*#__PURE__*/React.createElement("select",{name:"DPI",onChange:function onChange(ev){return _this.changeResolution(ev.target.value)},value:_this.state.dpi||""},_this.props.theme.printResolutions.map(function(res){return/*#__PURE__*/React.createElement("option",{key:res,value:res},res," dpi")}))}else{resolutionInput=/*#__PURE__*/React.createElement("input",{name:"DPI",readOnly:true,type:"hidden",value:_this.props.theme.printResolutions[0]})}}else{resolutionChooser=/*#__PURE__*/React.createElement(NumberInput,{max:1200,min:50,mobile:true,name:"DPI",onChange:_this.changeResolution,suffix:" dpi",value:_this.state.dpi||""})}var formatMap={"application/pdf":"PDF","image/jpeg":"JPEG","image/png":"PNG","image/svg":"SVG"};var allowGeoPdfExport=_this.state.selectedFormat==="application/pdf"&&_this.props.allowGeoPdfExport;return/*#__PURE__*/React.createElement("div",{className:"print-body"},/*#__PURE__*/React.createElement("form",{action:_this.props.theme.printUrl,method:"POST",onSubmit:_this.print,ref:function ref(el){_this.printForm=el}},/*#__PURE__*/React.createElement("input",{name:"TEMPLATE",type:"hidden",value:printLegend&&_this.state.legend?printLegend:_this.state.layout.name}),/*#__PURE__*/React.createElement("table",{className:"options-table"},/*#__PURE__*/React.createElement("tbody",null,/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",null,LocaleUtils.tr("print.layout")),/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement("select",{onChange:_this.changeLayout,value:_this.state.layout.name},_this.state.layouts.map(function(item){return/*#__PURE__*/React.createElement("option",{key:item.name,value:item.name},_this.translateLayoutName(item.name.split("/").pop()))})))),_this.props.formats.length>1?/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",null,LocaleUtils.tr("print.format")),/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement("select",{disabled:_this.state.printSeriesEnabled,name:"FORMAT",onChange:_this.formatChanged,value:_this.state.selectedFormat},_this.props.formats.map(function(format){return/*#__PURE__*/React.createElement("option",{key:format,value:format},formatMap[format]||format)})))):null,_this.state.layout.atlasCoverageLayer&&!_this.state.printSeriesEnabled?/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",null,LocaleUtils.tr("print.atlasfeature")),/*#__PURE__*/React.createElement("td",null,!isEmpty(_this.state.atlasFeatures)?/*#__PURE__*/React.createElement("div",{className:"print-atlas-features"},_this.state.atlasFeatures.map(function(feature){return/*#__PURE__*/React.createElement("span",{key:feature.id},/*#__PURE__*/React.createElement("span",null,feature.properties[feature.displayfield]),/*#__PURE__*/React.createElement(Icon,{icon:"remove",onClick:function onClick(){return _this.deselectAtlasFeature(feature)}}))}),/*#__PURE__*/React.createElement("input",{name:"ATLAS_PK",type:"hidden",value:_this.state.atlasFeatures.map(function(feature){var _feature$properties$_;return(_feature$properties$_=feature.properties[_this.state.layout.atlas_pk])!==null&&_feature$properties$_!==void 0?_feature$properties$_:feature.id}).join(",")})):/*#__PURE__*/React.createElement("input",{disabled:true,placeholder:LocaleUtils.tr("print.pickatlasfeature",_this.state.layout.atlasCoverageLayer),type:"text"}))):null,isEmpty(_this.state.atlasFeatures)?/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",null,LocaleUtils.tr("print.scale")),/*#__PURE__*/React.createElement("td",null,!isEmpty(_this.props.theme.printScales)?/*#__PURE__*/React.createElement(InputContainer,null,/*#__PURE__*/React.createElement("span",{role:"prefix"},"1\xA0:\xA0"),/*#__PURE__*/React.createElement(EditableSelect,{name:mapName+":scale",onChange:_this.changeScale,options:_this.props.theme.printScales,role:"input",value:_this.state.scale||""})):/*#__PURE__*/React.createElement(NumberInput,{min:1,mobile:true,name:mapName+":scale",onChange:_this.changeScale,prefix:"1 : ",value:_this.state.scale||null}))):null,resolutionChooser?/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",null,LocaleUtils.tr("print.resolution")),/*#__PURE__*/React.createElement("td",null,resolutionChooser)):null,_this.props.displayRotation?/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",null,LocaleUtils.tr("print.rotation")),/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement(InputContainer,null,/*#__PURE__*/React.createElement(NumberInput,{decimals:1,mobile:true,name:mapName+":rotation",onChange:_this.changeRotation,role:"input",value:_this.state.rotation}),/*#__PURE__*/React.createElement("span",{role:"suffix",style:{transform:"rotate(-"+_this.state.rotation+"deg)"}},/*#__PURE__*/React.createElement(Icon,{icon:"arrow-up",onClick:function onClick(){return _this.setState({rotation:0})},title:LocaleUtils.tr("map.resetrotation")}))))):null,!isEmpty(_this.props.theme.printGrid)?/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",null,LocaleUtils.tr("print.grid")),/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement(ToggleSwitch,{active:_this.state.grid,onChange:function onChange(newstate){return _this.setState({grid:newstate})}}))):null,printLegend?/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",null,LocaleUtils.tr("print.legend")),/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement(ToggleSwitch,{active:_this.state.legend,onChange:function onChange(newstate){return _this.setState({legend:newstate})}}))):null,_this.props.displayPrintSeries?/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",null,LocaleUtils.tr("print.series")),/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement(ToggleSwitch,{active:_this.state.printSeriesEnabled,onChange:function onChange(newstate){return _this.setState({printSeriesEnabled:newstate,atlasFeatures:[]})}}))):null,_this.state.printSeriesEnabled?/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",null,LocaleUtils.tr("print.overlap")),/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement(InputContainer,null,/*#__PURE__*/React.createElement("input",{max:"20",min:"0",onChange:_this.changeSeriesOverlap,role:"input",type:"range",value:_this.state.printSeriesOverlap}),/*#__PURE__*/React.createElement("span",{role:"suffix"},_this.state.printSeriesOverlap,"\xA0%")))):null,!_this.props.inlinePrintOutput&&_this.state.printSeriesEnabled?/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",null,LocaleUtils.tr("print.download")),/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement("select",{onChange:_this.changeDownloadMode,role:"input",value:_this.state.downloadMode||""},/*#__PURE__*/React.createElement("option",{key:"onepdf",value:"onepdf"},LocaleUtils.tr("print.download_as_onepdf")),/*#__PURE__*/React.createElement("option",{key:"onezip",value:"onezip"},LocaleUtils.tr("print.download_as_onezip")),/*#__PURE__*/React.createElement("option",{key:"single",value:"single"},LocaleUtils.tr("print.download_as_single"))))):null,((_this$state$layout$la=(_this$state$layout=_this.state.layout)===null||_this$state$layout===void 0?void 0:_this$state$layout.labels)!==null&&_this$state$layout$la!==void 0?_this$state$layout$la:[]).map(function(label){var _this$props$theme$pri;// Omit labels which start with __
12
+ var scale=Math.round(MapUtils.computeForZoom(_this.props.map.scales,_this.props.map.zoom)*_this.props.defaultScaleFactor);if(_this.props.theme.printScales&&_this.props.theme.printScales.length>0){var closestVal=Math.abs(scale-_this.props.theme.printScales[0]);var closestIdx=0;for(var i=1;i<_this.props.theme.printScales.length;++i){var currVal=Math.abs(scale-_this.props.theme.printScales[i]);if(currVal<closestVal){closestVal=currVal;closestIdx=i}}scale=_this.props.theme.printScales[closestIdx]}var bounds=_this.props.map.bbox.bounds;var center=_this.state.center||[0,0];var resetCenter=center[0]<bounds[0]||center[0]>bounds[2]||center[1]<bounds[1]||center[1]>bounds[3];var resetScale=_this.state.scale/scale<0.01||_this.state.scale/scale>10;if(resetCenter||resetScale){_this.setState({center:null,rotation:0,scale:scale})}_this.props.setSnappingConfig(false,false)});_defineProperty(_this,"onHide",function(){_this.setState({minimized:false,printSeriesEnabled:false,atlasFeatures:[]})});_defineProperty(_this,"renderBody",function(){var _this$state$extents$a,_this$state$layout$la,_this$state$layout;if(!_this.state.layout){return/*#__PURE__*/React.createElement("div",{className:"print-body",role:"body"},LocaleUtils.tr("print.nolayouts"))}var haveThemeLayers=_this.props.layers.find(function(layer){return layer.role===LayerRole.THEME})!==undefined;if(!_this.props.theme||!_this.props.printExternalLayers&&!haveThemeLayers){return/*#__PURE__*/React.createElement("div",{className:"print-body",role:"body"},LocaleUtils.tr("print.notheme"))}var mapName=_this.state.layout.map.name;var printLegend=_this.state.layout.legendLayout;var formattedExtent=!isEmpty(_this.state.atlasFeatures)?"":_this.formatExtent((_this$state$extents$a=_this.state.extents.at(0))!==null&&_this$state$extents$a!==void 0?_this$state$extents$a:[0,0,0,0]);var resolutionChooser=null;var resolutionInput=null;if(!isEmpty(_this.props.theme.printResolutions)){if(_this.props.theme.printResolutions.length>1){resolutionChooser=/*#__PURE__*/React.createElement("select",{name:"DPI",onChange:function onChange(ev){return _this.changeResolution(ev.target.value)},value:_this.state.dpi||""},_this.props.theme.printResolutions.map(function(res){return/*#__PURE__*/React.createElement("option",{key:res,value:res},res," dpi")}))}else{resolutionInput=/*#__PURE__*/React.createElement("input",{name:"DPI",readOnly:true,type:"hidden",value:_this.props.theme.printResolutions[0]})}}else{resolutionChooser=/*#__PURE__*/React.createElement(NumberInput,{max:1200,min:50,mobile:true,name:"DPI",onChange:_this.changeResolution,suffix:" dpi",value:_this.state.dpi||""})}var formatMap={"application/pdf":"PDF","image/jpeg":"JPEG","image/png":"PNG","image/svg":"SVG"};var allowGeoPdfExport=_this.state.selectedFormat==="application/pdf"&&_this.props.allowGeoPdfExport;return/*#__PURE__*/React.createElement("div",{className:"print-body"},/*#__PURE__*/React.createElement("form",{action:_this.props.theme.printUrl,method:"POST",onSubmit:_this.print,ref:function ref(el){_this.printForm=el}},/*#__PURE__*/React.createElement("input",{name:"TEMPLATE",type:"hidden",value:printLegend&&_this.state.legend?printLegend:_this.state.layout.name}),/*#__PURE__*/React.createElement("table",{className:"options-table"},/*#__PURE__*/React.createElement("tbody",null,/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",null,LocaleUtils.tr("print.layout")),/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement("select",{onChange:_this.changeLayout,value:_this.state.layout.name},_this.state.layouts.map(function(item){return/*#__PURE__*/React.createElement("option",{key:item.name,value:item.name},_this.translateLayoutName(item.name))})))),_this.props.formats.length>1?/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",null,LocaleUtils.tr("print.format")),/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement("select",{disabled:_this.state.printSeriesEnabled,name:"FORMAT",onChange:_this.formatChanged,value:_this.state.selectedFormat},_this.props.formats.map(function(format){return/*#__PURE__*/React.createElement("option",{key:format,value:format},formatMap[format]||format)})))):null,_this.state.layout.atlasCoverageLayer&&!_this.state.printSeriesEnabled?/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",null,LocaleUtils.tr("print.atlasfeature")),/*#__PURE__*/React.createElement("td",null,!isEmpty(_this.state.atlasFeatures)?/*#__PURE__*/React.createElement("div",{className:"print-atlas-features"},_this.state.atlasFeatures.map(function(feature){return/*#__PURE__*/React.createElement("span",{key:feature.id},/*#__PURE__*/React.createElement("span",null,feature.properties[feature.displayfield]),/*#__PURE__*/React.createElement(Icon,{icon:"remove",onClick:function onClick(){return _this.deselectAtlasFeature(feature)}}))}),/*#__PURE__*/React.createElement("input",{name:"ATLAS_PK",type:"hidden",value:_this.state.atlasFeatures.map(function(feature){var _feature$properties$_;return(_feature$properties$_=feature.properties[_this.state.layout.atlas_pk])!==null&&_feature$properties$_!==void 0?_feature$properties$_:feature.id}).join(",")})):/*#__PURE__*/React.createElement("input",{disabled:true,placeholder:LocaleUtils.tr("print.pickatlasfeature",_this.state.layout.atlasCoverageLayer),type:"text"}))):null,isEmpty(_this.state.atlasFeatures)?/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",null,LocaleUtils.tr("print.scale")),/*#__PURE__*/React.createElement("td",null,!isEmpty(_this.props.theme.printScales)?/*#__PURE__*/React.createElement(InputContainer,null,/*#__PURE__*/React.createElement("span",{role:"prefix"},"1\xA0:\xA0"),/*#__PURE__*/React.createElement(EditableSelect,{name:mapName+":scale",onChange:_this.changeScale,options:_this.props.theme.printScales,role:"input",value:_this.state.scale||""})):/*#__PURE__*/React.createElement(NumberInput,{min:1,mobile:true,name:mapName+":scale",onChange:_this.changeScale,prefix:"1 : ",value:_this.state.scale||null}))):null,resolutionChooser?/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",null,LocaleUtils.tr("print.resolution")),/*#__PURE__*/React.createElement("td",null,resolutionChooser)):null,_this.props.displayRotation?/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",null,LocaleUtils.tr("print.rotation")),/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement(InputContainer,null,/*#__PURE__*/React.createElement(NumberInput,{decimals:1,mobile:true,name:mapName+":rotation",onChange:_this.changeRotation,role:"input",value:_this.state.rotation}),/*#__PURE__*/React.createElement("span",{role:"suffix",style:{transform:"rotate(-"+_this.state.rotation+"deg)"}},/*#__PURE__*/React.createElement(Icon,{icon:"arrow-up",onClick:function onClick(){return _this.setState({rotation:0})},title:LocaleUtils.tr("map.resetrotation")}))))):null,!isEmpty(_this.props.theme.printGrid)?/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",null,LocaleUtils.tr("print.grid")),/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement(ToggleSwitch,{active:_this.state.grid,onChange:function onChange(newstate){return _this.setState({grid:newstate})}}))):null,printLegend?/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",null,LocaleUtils.tr("print.legend")),/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement(ToggleSwitch,{active:_this.state.legend,onChange:function onChange(newstate){return _this.setState({legend:newstate})}}))):null,_this.props.displayPrintSeries?/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",null,LocaleUtils.tr("print.series")),/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement(ToggleSwitch,{active:_this.state.printSeriesEnabled,onChange:function onChange(newstate){return _this.setState({printSeriesEnabled:newstate,atlasFeatures:[]})}}))):null,_this.state.printSeriesEnabled?/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",null,LocaleUtils.tr("print.overlap")),/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement(InputContainer,null,/*#__PURE__*/React.createElement("input",{max:"20",min:"0",onChange:_this.changeSeriesOverlap,role:"input",type:"range",value:_this.state.printSeriesOverlap}),/*#__PURE__*/React.createElement("span",{role:"suffix"},_this.state.printSeriesOverlap,"\xA0%")))):null,!_this.props.inlinePrintOutput&&_this.state.printSeriesEnabled?/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",null,LocaleUtils.tr("print.download")),/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement("select",{onChange:_this.changeDownloadMode,role:"input",value:_this.state.downloadMode||""},/*#__PURE__*/React.createElement("option",{key:"onepdf",value:"onepdf"},LocaleUtils.tr("print.download_as_onepdf")),/*#__PURE__*/React.createElement("option",{key:"onezip",value:"onezip"},LocaleUtils.tr("print.download_as_onezip")),/*#__PURE__*/React.createElement("option",{key:"single",value:"single"},LocaleUtils.tr("print.download_as_single"))))):null,((_this$state$layout$la=(_this$state$layout=_this.state.layout)===null||_this$state$layout===void 0?void 0:_this$state$layout.labels)!==null&&_this$state$layout$la!==void 0?_this$state$layout$la:[]).map(function(label){var _this$props$theme$pri;// Omit labels which start with __
13
13
  if(label.startsWith("__")){return null}var opts=_objectSpread({rows:1,name:label.toUpperCase()},(_this$props$theme$pri=_this.props.theme.printLabelConfig)===null||_this$props$theme$pri===void 0?void 0:_this$props$theme$pri[label]);return _this.renderPrintLabelField(label,opts)}),allowGeoPdfExport?/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",null,"GeoPDF"),/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement(ToggleSwitch,{active:_this.state.geoPdf,onChange:function onChange(newstate){return _this.setState({geoPdf:newstate})}}))):null)),/*#__PURE__*/React.createElement("div",null,/*#__PURE__*/React.createElement("input",{name:"csrf_token",type:"hidden",value:MiscUtils.getCsrfToken()}),/*#__PURE__*/React.createElement("input",{name:mapName+":extent",readOnly:true,type:"hidden",value:formattedExtent}),/*#__PURE__*/React.createElement("input",{name:"SERVICE",readOnly:true,type:"hidden",value:"WMS"}),/*#__PURE__*/React.createElement("input",{name:"VERSION",readOnly:true,type:"hidden",value:_this.props.theme.version}),/*#__PURE__*/React.createElement("input",{name:"REQUEST",readOnly:true,type:"hidden",value:"GetPrint"}),/*#__PURE__*/React.createElement("input",{name:"FORMAT",readOnly:true,type:"hidden",value:_this.state.selectedFormat}),/*#__PURE__*/React.createElement("input",{name:"TRANSPARENT",readOnly:true,type:"hidden",value:"true"}),/*#__PURE__*/React.createElement("input",{name:"SRS",readOnly:true,type:"hidden",value:_this.props.map.projection}),/*#__PURE__*/React.createElement("input",{name:"CONTENT_DISPOSITION",readOnly:true,type:"hidden",value:_this.props.inlinePrintOutput?"inline":"attachment"}),allowGeoPdfExport?/*#__PURE__*/React.createElement("input",{name:"FORMAT_OPTIONS",readOnly:true,type:"hidden",value:_this.state.geoPdf?"WRITE_GEO_PDF:true":"WRITE_GEO_PDF:false"}):null,resolutionInput),/*#__PURE__*/React.createElement("div",{className:"button-bar"},/*#__PURE__*/React.createElement("button",{className:"button",disabled:_this.state.printing,type:"submit"},_this.state.printing?/*#__PURE__*/React.createElement("span",{className:"print-wait"},/*#__PURE__*/React.createElement(Spinner,null)," ",LocaleUtils.tr("print.wait")):LocaleUtils.tr("print.submit")))))});_defineProperty(_this,"renderPrintLabelField",function(label,opts){var defaultValue=opts.defaultValue||"";var autopopulated=false;if(label===_this.props.theme.printLabelForSearchResult){defaultValue=_this.getSearchMarkerLabel();autopopulated=true}else if(label===_this.props.theme.printLabelForAttribution){defaultValue=_this.getAttributionLabel();autopopulated=true}if(autopopulated&&_this.props.hideAutopopulatedFields){return/*#__PURE__*/React.createElement("tr",{key:"label."+label},/*#__PURE__*/React.createElement("td",{colSpan:"2"},/*#__PURE__*/React.createElement("input",{defaultValue:defaultValue,name:opts.name,type:"hidden"})))}else{if(opts.options){return/*#__PURE__*/React.createElement("tr",{key:"label."+label},/*#__PURE__*/React.createElement("td",null,MiscUtils.capitalizeFirst(label)),/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement("select",{defaultValue:defaultValue,name:opts.name},opts.options.map(function(value){return/*#__PURE__*/React.createElement("option",{key:value,value:value},value)}))))}else{var style={};if(opts.rows||opts.cols){style.resize="none"}if(opts.cols){style.width="initial"}return/*#__PURE__*/React.createElement("tr",{key:"label."+label},/*#__PURE__*/React.createElement("td",null,MiscUtils.capitalizeFirst(label)),/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement("textarea",_extends({},opts,{defaultValue:defaultValue,readOnly:autopopulated,style:style}))))}}});_defineProperty(_this,"getSearchMarkerLabel",function(){var _feature$properties;var searchsellayer=_this.props.layers.find(function(layer){return layer.id==="searchselection"});var feature=((searchsellayer===null||searchsellayer===void 0?void 0:searchsellayer.features)||[]).find(function(f){return f.id==="searchmarker"});return(feature===null||feature===void 0||(_feature$properties=feature.properties)===null||_feature$properties===void 0?void 0:_feature$properties.label)||""});_defineProperty(_this,"getAttributionLabel",function(){var copyrights=_this.props.layers.reduce(function(res,layer){return _objectSpread(_objectSpread({},res),LayerUtils.getAttribution(layer,_this.props.map))},{});var el=document.createElement("span");return Object.entries(copyrights).map(function(_ref){var _ref2=_slicedToArray(_ref,2),key=_ref2[0],value=_ref2[1];if(value.title){el.innerHTML=value.title;return el.innerText}else{el.innerHTML=key;return el.innerText}}).join(" | ")});_defineProperty(_this,"renderPrintSelection",function(){var printSelection=null;if(_this.state.layout&&isEmpty(_this.state.atlasFeatures)){var frame={width:_this.state.layout.map.width,height:_this.state.layout.map.height};printSelection=/*#__PURE__*/React.createElement(PrintSelection,{allowRotation:_this.props.displayRotation&&!_this.state.printSeriesEnabled,allowScaling:!_this.state.printSeriesEnabled,allowTranslation:!_this.state.printSeriesEnabled,center:_this.state.center||_this.props.map.center,fixedFrame:frame,geometryChanged:_this.geometryChanged,key:"PrintSelection",printSeriesChanged:_this.printSeriesChanged,printSeriesEnabled:_this.props.displayPrintSeries&&_this.state.printSeriesEnabled,printSeriesOverlap:_this.state.printSeriesOverlap/100,printSeriesSelected:_this.state.printSeriesSelected,rotation:_this.state.rotation,scale:_this.state.scale})}return printSelection});_defineProperty(_this,"formatExtent",function(extent){var mapCrs=_this.props.map.projection;var version=_this.props.theme.version;if(CoordinatesUtils.getAxisOrder(mapCrs).substring(0,2)==="ne"&&version==="1.3.0"){return extent[1]+","+extent[0]+","+extent[3]+","+extent[2]}return extent.join(",")});_defineProperty(_this,"geometryChanged",function(center,extents,rotation,scale){_this.setState({center:center,extents:extents,rotation:rotation,scale:scale})});_defineProperty(_this,"printSeriesChanged",function(selected){_this.setState({printSeriesSelected:selected})});_defineProperty(_this,"renderPrintOutputWindow",function(){var extraControls=[{icon:"save",title:LocaleUtils.tr("print.save"),callback:_this.savePrintOutput}];return/*#__PURE__*/React.createElement(ResizeableWindow,{extraControls:extraControls,icon:"print",initialHeight:0.75*window.innerHeight,initialWidth:0.5*window.innerWidth,key:"PrintOutputWindow",onClose:function onClose(){return _this.setState({printOutputVisible:false,outputLoaded:false,pdfData:null,pdfDataUrl:null})},title:LocaleUtils.tr("print.output"),visible:_this.state.printOutputVisible},/*#__PURE__*/React.createElement("div",{className:"print-output-window-body",role:"body"},!_this.state.outputLoaded?/*#__PURE__*/React.createElement("span",{className:"print-output-window-wait"},/*#__PURE__*/React.createElement(Spinner,null)," ",LocaleUtils.tr("print.wait")):null,/*#__PURE__*/React.createElement("iframe",{name:"print-output-window",src:_this.state.pdfDataUrl})))});_defineProperty(_this,"savePrintOutput",function(){FileSaver.saveAs(_this.state.pdfData.content,_this.state.pdfData.fileName)});_defineProperty(_this,"selectAtlasFeature",function(layer,feature){if(!feature){return}_this.setState(function(state){var index=state.atlasFeatures.findIndex(function(f){return f.id===feature.id});if(index>=0){var newAtlasFeatures=state.atlasFeatures.slice(0);newAtlasFeatures.splice(index,1);return{atlasFeatures:newAtlasFeatures}}else{return{atlasFeatures:[].concat(_toConsumableArray(state.atlasFeatures),[feature])}}})});_defineProperty(_this,"deselectAtlasFeature",function(feature){_this.setState(function(state){var index=state.atlasFeatures.find(function(f){return f.id===feature.id});var newAtlasFeatures=state.atlasFeatures.slice(0);newAtlasFeatures.splice(index,1);return{atlasFeatures:newAtlasFeatures}})});_defineProperty(_this,"changeLayout",function(ev){var layout=_this.props.theme.print.find(function(item){return item.name===ev.target.value});_this.setState({layout:layout,atlasFeature:null})});_defineProperty(_this,"changeScale",function(value){_this.setState({scale:Math.max(1,parseInt(value,10)||0)})});_defineProperty(_this,"changeResolution",function(value){_this.setState({dpi:value||300})});_defineProperty(_this,"changeRotation",function(value){var angle=value||0;_this.setState({rotation:(angle%360+360)%360})});_defineProperty(_this,"changeSeriesOverlap",function(ev){_this.setState({printSeriesOverlap:parseInt(ev.target.value,10)||0})});_defineProperty(_this,"changeDownloadMode",function(ev){_this.setState({downloadMode:ev.target.value})});_defineProperty(_this,"formatChanged",function(ev){_this.setState({selectedFormat:ev.target.value})});_defineProperty(_this,"print",function(ev){ev.preventDefault();_this.setState({printing:true});if(_this.props.inlinePrintOutput){_this.setState({printOutputVisible:true,outputLoaded:false,pdfDataUrl:null,pdfData:null})}var formData=formDataEntries(new FormData(_this.printForm));var mapCrs=_this.props.map.projection;var mapName=_this.state.layout.map.name;// Add base print params
14
14
  var printParams=LayerUtils.collectPrintParams(_this.props.layers,_this.props.theme,_this.state.scale,mapCrs,_this.props.printExternalLayers);Object.entries(printParams).forEach(function(_ref3){var _ref4=_slicedToArray(_ref3,2),key=_ref4[0],value=_ref4[1];formData[key]=value});formData[mapName+":LAYERS"]=printParams.LAYERS;formData[mapName+":STYLES"]=printParams.STYLES;formData[mapName+":FILTER"]=printParams.FILTER;formData[mapName+":FILTER_GEOM"]=printParams.FILTER_GEOM;// Add highlight params
15
15
  var printDpi=parseInt(_this.state.dpi,10)||0;if(_this.props.printMapHighlights){var highlightParams=VectorLayerUtils.createPrintHighlighParams(_this.props.layers,mapCrs,_this.state.scale,printDpi,_this.props.scaleFactor);formData[mapName+":HIGHLIGHT_GEOM"]=highlightParams.geoms.join(";");formData[mapName+":HIGHLIGHT_SYMBOL"]=highlightParams.styles.join(";");formData[mapName+":HIGHLIGHT_LABELSTRING"]=highlightParams.labels.join(";");formData[mapName+":HIGHLIGHT_LABELCOLOR"]=highlightParams.labelFillColors.join(";");formData[mapName+":HIGHLIGHT_LABELBUFFERCOLOR"]=highlightParams.labelOutlineColors.join(";");formData[mapName+":HIGHLIGHT_LABELBUFFERSIZE"]=highlightParams.labelOutlineSizes.join(";");formData[mapName+":HIGHLIGHT_LABELSIZE"]=highlightParams.labelSizes.join(";");formData[mapName+":HIGHLIGHT_LABEL_DISTANCE"]=highlightParams.labelDist.join(";");formData[mapName+":HIGHLIGHT_LABEL_ROTATION"]=highlightParams.labelRotations.join(";")}// Add grid params
package/plugins/View3D.js CHANGED
@@ -8,15 +8,15 @@ function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof
8
8
  * Displays a 3D map view.
9
9
  *
10
10
  * See [3D View](../../topics/View3D).
11
- */var View3D=/*#__PURE__*/function(_React$Component){function View3D(props){var _this;_classCallCheck(this,View3D);_this=_callSuper(this,View3D,[props]);_defineProperty(_this,"state",{componentLoaded:false,windowDetached:false,viewsLocked:false,storedState:null});_defineProperty(_this,"render3DWindow",function(){if(_this.props.view3dMode>View3DMode.DISABLED){var extraControls=[{icon:"sync",callback:_this.sync2DExtent,title:LocaleUtils.tr("map3d.syncview")},{icon:"lock",callback:_this.setLockViews,title:LocaleUtils.tr("map3d.lockview"),active:_this.state.viewsLocked}];if(!_this.state.windowDetached){extraControls.push({icon:"maximize",callback:function callback(){return _this.props.setView3dMode(View3DMode.FULLSCREEN)},title:LocaleUtils.tr("window.maximize")})}var Map3D=_this.map3dComponent;var device=ConfigUtils.isMobile()?"mobile":"desktop";var pluginsConfig=_this.props.view3dMode===View3DMode.FULLSCREEN?_this.props.localConfig.plugins[device].filter(function(entry){return entry.availableIn3D}):[];return/*#__PURE__*/React.createElement(ResizeableWindow,{extraControls:extraControls,fullscreen:_this.props.view3dMode===View3DMode.FULLSCREEN,icon:"map3d",initialHeight:_this.props.geometry.initialHeight,initialWidth:_this.props.geometry.initialWidth,initialX:_this.props.geometry.initialX,initialY:_this.props.geometry.initialY,initiallyDocked:_this.props.geometry.initiallyDocked,key:"View3DWindow",maximizeable:false,onClose:_this.onClose,onExternalWindowResized:_this.redrawScene,onFocusChanged:_this.windowFocusChanged,onGeometryChanged:_this.onGeometryChanged,splitScreenWhenDocked:true,splitTopAndBottomBar:true,title:LocaleUtils.tr("map3d.title")},_this.state.componentLoaded?/*#__PURE__*/React.createElement(Provider,{role:"body",store:_this.store},/*#__PURE__*/React.createElement(PluginsContainer,{pluginsConfig:pluginsConfig},/*#__PURE__*/React.createElement(Map3D,{controlsPosition:_this.props.controlsPosition,defaultSceneQuality:_this.props.defaultSceneQuality,innerRef:_this.setRef,onCameraChanged:_this.onCameraChanged,onMapInitialized:_this.setupMap,pluginOptions:_this.props.pluginOptions,plugins3d:_this.props.plugins3d,searchProviders:_this.props.searchProviders,theme:_this.props.theme}),_this.props.view3dMode===View3DMode.DISABLING?/*#__PURE__*/React.createElement("div",{className:"view3d-busy-overlay"},/*#__PURE__*/React.createElement(Spinner,null),/*#__PURE__*/React.createElement("span",null,LocaleUtils.tr("view3d.storingstate"))):null)):null)}return null});_defineProperty(_this,"onClose",function(){_this.props.setView3dMode(View3DMode.DISABLING)});_defineProperty(_this,"onGeometryChanged",function(geometry){if(geometry.maximized&&_this.props.view3dMode!==View3DMode.FULLSCREEN){_this.props.setView3dMode(View3DMode.FULLSCREEN)}_this.setState({windowDetached:geometry.detached})});_defineProperty(_this,"onCameraChanged",function(center,camera,fov){// Note: If camera pos is NULL, we are in first-person-view
11
+ */var View3D=/*#__PURE__*/function(_React$Component){function View3D(props){var _this;_classCallCheck(this,View3D);_this=_callSuper(this,View3D,[props]);_defineProperty(_this,"state",{componentLoaded:false,windowDetached:false,viewsLocked:false,storedState:null});_defineProperty(_this,"render3DWindow",function(){if(_this.props.view3dMode>View3DMode.DISABLED){var extraControls=[{icon:"sync",callback:_this.sync2DExtent,title:LocaleUtils.tr("map3d.syncview")},{icon:"lock",callback:_this.setLockViews,title:LocaleUtils.tr("map3d.lockview"),active:_this.state.viewsLocked}];if(!_this.state.windowDetached){extraControls.push({icon:"maximize",callback:function callback(){return _this.props.setView3dMode(View3DMode.FULLSCREEN)},title:LocaleUtils.tr("window.maximize")})}var Map3D=_this.map3dComponent;var device=ConfigUtils.isMobile()?"mobile":"desktop";var pluginsConfig=_this.props.view3dMode===View3DMode.FULLSCREEN?_this.props.localConfig.plugins[device].filter(function(entry){return entry.availableIn3D}):[];return/*#__PURE__*/React.createElement(ResizeableWindow,{extraControls:extraControls,fullscreen:_this.props.view3dMode===View3DMode.FULLSCREEN,icon:"map3d",initialHeight:_this.props.geometry.initialHeight,initialWidth:_this.props.geometry.initialWidth,initialX:_this.props.geometry.initialX,initialY:_this.props.geometry.initialY,initiallyDocked:_this.props.geometry.initiallyDocked,key:"View3DWindow",maximizeable:false,onClose:_this.onClose,onExternalWindowResized:_this.redrawScene,onFocusChanged:_this.windowFocusChanged,onGeometryChanged:_this.onGeometryChanged,splitScreenWhenDocked:true,splitTopAndBottomBar:true,title:LocaleUtils.tr("map3d.title")},_this.state.componentLoaded?/*#__PURE__*/React.createElement(Provider,{role:"body",store:_this.store},/*#__PURE__*/React.createElement(PluginsContainer,{pluginsConfig:pluginsConfig},/*#__PURE__*/React.createElement(Map3D,{controlsPosition:_this.props.controlsPosition,defaultSceneQuality:_this.props.defaultSceneQuality,innerRef:_this.setRef,mouseButtons:_this.props.mouseButtons,onCameraChanged:_this.onCameraChanged,onMapInitialized:_this.setupMap,pluginOptions:_this.props.pluginOptions,plugins3d:_this.props.plugins3d,searchProviders:_this.props.searchProviders,theme:_this.props.theme}),_this.props.view3dMode===View3DMode.DISABLING?/*#__PURE__*/React.createElement("div",{className:"view3d-busy-overlay"},/*#__PURE__*/React.createElement(Spinner,null),/*#__PURE__*/React.createElement("span",null,LocaleUtils.tr("view3d.storingstate"))):null)):null)}return null});_defineProperty(_this,"onClose",function(){_this.props.setView3dMode(View3DMode.DISABLING)});_defineProperty(_this,"onGeometryChanged",function(geometry){if(geometry.maximized&&_this.props.view3dMode!==View3DMode.FULLSCREEN){_this.props.setView3dMode(View3DMode.FULLSCREEN)}_this.setState({windowDetached:geometry.detached})});_defineProperty(_this,"onCameraChanged",function(center,camera,fov){// Note: If camera pos is NULL, we are in first-person-view
12
12
  if(_this.state.viewsLocked&&_this.focusedMap==="map3d"){var rotation=undefined;if(camera){rotation=Math.atan2(center[1]-camera[1],center[0]-camera[0])-0.5*Math.PI;var distance=Math.sqrt((camera[0]-center[0])*(camera[0]-center[0])+(camera[1]-center[1])*(camera[1]-center[1])+(camera[2]-center[2])*(camera[2]-center[2]));var fovrad=fov/180*Math.PI;var bboxWidth=distance*(2*Math.tan(fovrad/2));var bbox=[-0.5*bboxWidth,0,0.5*bboxWidth,0];var zoom=MapUtils.getZoomForExtent(bbox,_this.props.map.resolutions,_this.props.map.size,0,_this.props.map.scales.length-1);_this.props.zoomToPoint(center.slice(0,2),zoom,_this.props.theme.mapCrs,rotation);if(_this.firstPersonMarker){_this.props.removeLayer("view3d-firstperson-cone");_this.firstPersonMarker=false}}else{_this.props.panTo(center.slice(0,2),_this.props.theme.mapCrs,rotation);var feature={geometry:{type:"Point",coordinates:center.slice(0,2)},crs:_this.props.theme.mapCrs,styleName:"marker",styleOptions:{iconSrc:personIcon}};var layer={id:"view3d-firstperson-marker",role:LayerRole.MARKER};_this.props.addLayerFeatures(layer,[feature],true);_this.firstPersonMarker=true}}else if(_this.firstPersonMarker){_this.props.removeLayer("view3d-firstperson-marker");_this.firstPersonMarker=false}});_defineProperty(_this,"setRef",function(ref){_this.map3dComponentRef=ref});_defineProperty(_this,"sync2DExtent",function(){if(_this.map3dComponentRef){_this.map3dComponentRef.setViewToExtent(_this.props.map.bbox.bounds,_this.props.map.bbox.rotation)}});_defineProperty(_this,"setLockViews",function(){_this.setState(function(state){return{viewsLocked:!state.viewsLocked}});if(_this.firstPersonMarker){_this.props.removeLayer("view3d-firstperson-marker");_this.firstPersonMarker=false}});_defineProperty(_this,"setupMap",function(){if(_this.map3dComponentRef){if(!isEmpty(_this.state.storedState)){_this.map3dComponentRef.restore3dState(_this.state.storedState)}else if(_this.props.theme.current.map3d.initialView){_this.map3dComponentRef.restore3dState(_this.props.theme.current.map3d.initialView)}else{_this.sync2DExtent()}}});_defineProperty(_this,"redrawScene",function(ev){if(_this.map3dComponentRef){_this.map3dComponentRef.redrawScene(ev)}});_defineProperty(_this,"trackFocus",function(ev){var _mapEl$contains,_map3dEl$contains;var mapEl=document.getElementById("map");var map3dEl=document.getElementById("map3d");if(mapEl!==null&&mapEl!==void 0&&(_mapEl$contains=mapEl.contains)!==null&&_mapEl$contains!==void 0&&_mapEl$contains.call(mapEl,document.activeElement)){_this.focusedMap="map"}else if(map3dEl!==null&&map3dEl!==void 0&&(_map3dEl$contains=map3dEl.contains)!==null&&_map3dEl$contains!==void 0&&_map3dEl$contains.call(map3dEl,document.activeElement)){_this.focusedMap="map3d"}else{_this.focusedMap=null}});_this.map3dComponent=null;_this.map3dComponentRef=null;_this.focusedMap=null;_this.firstPersonMarker=true;// Subset of 2d reducers
13
13
  var _ReducerIndex$reducer=ReducerIndex.reducers,processNotifications=_ReducerIndex$reducer.processNotifications,task=_ReducerIndex$reducer.task,windows=_ReducerIndex$reducer.windows;// Reducer for syncronization with parent store
14
14
  var forwardReducer=function forwardReducer(key,forwardActions,syncAction){return function(){var state=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};var action=arguments.length>1?arguments[1]:undefined;if(forwardActions.includes(action.type)){// Forward to parent store
15
15
  StandardApp.store.dispatch(action);return state}else{return action.type===syncAction?action[key]:state}}};var displayActions=Object.values(displayExports).filter(function(x){return typeof x==="string"});var layersActions=Object.values(layersExports).filter(function(x){return typeof x==="string"});var mapActions=Object.values(mapExports).filter(function(x){return typeof x==="string"});var themeActions=Object.values(themeExports).filter(function(x){return typeof x==="string"});var display=forwardReducer("display",displayActions,"SYNC_DISPLAY_FROM_PARENT_STORE");var layers=forwardReducer("layers",layersActions,"SYNC_LAYERS_FROM_PARENT_STORE");var map=forwardReducer("map",mapActions,"SYNC_MAP_FROM_PARENT_STORE");var localConfig=forwardReducer("localConfig",[],"SYNC_LOCAL_CONFIG_FROM_PARENT_STORE");var theme=forwardReducer("theme",themeActions,"SYNC_THEME_FROM_PARENT_STORE");_this.store=createStore({display:display,layers:layers,localConfig:localConfig,map:map,processNotifications:processNotifications,theme:theme,task:task,windows:windows});// Set stored state
16
16
  var storedState=_objectSpread({},props.startupState.map3d);if(props.startupParams.v3d){var values=props.startupParams.v3d.split(",").map(parseFloat).filter(function(x){return!isNaN(x)});if(values.length>=6){var _values$;storedState.camera=[values[0],values[1],values[2]];storedState.target=[values[3],values[4],values[5]];storedState.personHeight=(_values$=values[6])!==null&&_values$!==void 0?_values$:0}}if(props.startupParams.bl3d!==undefined){storedState.baseLayer=props.startupParams.bl3d}_this.state.storedState=storedState;return _this}_inherits(View3D,_React$Component);return _createClass(View3D,[{key:"componentDidMount",value:function componentDidMount(){if(this.props.startupParams.v==="3d"){this.props.setView3dMode(View3DMode.FULLSCREEN)}else if(this.props.startupParams.v==="3d2d"){this.props.setView3dMode(View3DMode.SPLITSCREEN)}window.addEventListener("focus",this.trackFocus,true);this.syncParentStore({})}},{key:"componentWillUnmount",value:function componentWillUnmount(){window.removeEventListener("focus",this.trackFocus)}},{key:"componentDidUpdate",value:function componentDidUpdate(prevProps,prevState){var _this2=this,_this$props$theme$cur;if(this.props.view3dMode!==View3DMode.DISABLED&&prevProps.view3dMode===View3DMode.DISABLED){import("../components/map3d/Map3D").then(function(component){_this2.map3dComponent=component["default"];_this2.map3dComponentRef=null;_this2.setState({componentLoaded:true})})}else if(this.props.view3dMode===View3DMode.DISABLING&&prevProps.view3dMode!==View3DMode.DISABLING){if(this.map3dComponentRef){this.map3dComponentRef.store3dState().then(function(storedState){_this2.setState({storedState:storedState});UrlParams.updateParams({v3d:undefined,bl3d:undefined});_this2.props.setView3dMode(View3DMode.DISABLED)})}else{UrlParams.updateParams({v3d:undefined,bl3d:undefined});this.props.setView3dMode(View3DMode.DISABLED)}}else if(this.props.view3dMode===View3DMode.DISABLED&&prevProps.view3dMode!==View3DMode.DISABLED){this.map3dComponent=null;this.map3dComponentRef=null;this.setState({componentLoaded:false});if(this.firstPersonMarker){this.props.removeLayer("view3d-firstperson-marker");this.firstPersonMarker=false}}// Sync parts of parent store
17
17
  this.syncParentStore(prevProps);// Handle view mode change
18
- if(this.props.view3dMode!==prevProps.view3dMode){if(this.props.view3dMode===View3DMode.FULLSCREEN){UrlParams.updateParams({v:"3d"});this.setState({viewsLocked:false})}else if(this.props.view3dMode===View3DMode.SPLITSCREEN){UrlParams.updateParams({v:"3d2d"})}else{UrlParams.updateParams({v:undefined})}}// Switch to 2D mode if new theme has no 3D configuration
18
+ if(this.props.view3dMode!==prevProps.view3dMode){if(this.props.view3dMode===View3DMode.FULLSCREEN){UrlParams.updateParams({v:"3d"});this.setState({viewsLocked:false})}else if(this.props.view3dMode===View3DMode.SPLITSCREEN){UrlParams.updateParams({v:"3d2d"})}else{UrlParams.updateParams({v:"2d"})}}// Switch to 2D mode if new theme has no 3D configuration
19
19
  if(this.props.theme.current!==prevProps.theme.current&&!((_this$props$theme$cur=this.props.theme.current)!==null&&_this$props$theme$cur!==void 0&&_this$props$theme$cur.map3d)&&this.props.view3dMode!==View3DMode.DISABLED){this.props.setView3dMode(View3D.DISABLED)}// Lock views
20
20
  if(this.state.viewsLocked&&this.props.map.bbox!==prevProps.map.bbox&&this.focusedMap==="map"){this.sync2DExtent()}// Clear stored state when switching away from a theme
21
- if(prevProps.theme.current&&this.props.theme.current!==prevProps.theme.current){this.setState({storedState:null})}}},{key:"syncParentStore",value:function syncParentStore(prevProps){if(this.props.display!==prevProps.display){this.store.dispatch({type:"SYNC_DISPLAY_FROM_PARENT_STORE",display:this.props.display})}if(this.props.theme!==prevProps.theme){this.store.dispatch({type:"SYNC_THEME_FROM_PARENT_STORE",theme:this.props.theme})}if(this.props.localConfig!==prevProps.localConfig){this.store.dispatch({type:"SYNC_LOCAL_CONFIG_FROM_PARENT_STORE",localConfig:this.props.localConfig})}if(this.props.layers!==prevProps.layers){this.store.dispatch({type:"SYNC_LAYERS_FROM_PARENT_STORE",layers:this.props.layers})}if(this.props.map!==prevProps.map){this.store.dispatch({type:"SYNC_MAP_FROM_PARENT_STORE",map:this.props.map})}}},{key:"render",value:function render(){var _this$props$theme$cur2;var button=(_this$props$theme$cur2=this.props.theme.current)!==null&&_this$props$theme$cur2!==void 0&&_this$props$theme$cur2.map3d?/*#__PURE__*/React.createElement(View3DSwitcher,{key:"View3DButton",position:this.props.buttonPosition}):null;return[button,this.render3DWindow()]}}])}(React.Component);_defineProperty(View3D,"propTypes",{addLayerFeatures:PropTypes.func,/** The position slot index of the 3d switch map button, from the bottom (0: bottom slot). */buttonPosition:PropTypes.number,/** The position of the navigation controls. Either `top` or `bottom`. */controlsPosition:PropTypes.string,/** The default scene quality factor (`20`: min, `100`: max). */defaultSceneQuality:PropTypes.number,display:PropTypes.object,/** Default window geometry. */geometry:PropTypes.shape({initialWidth:PropTypes.number,initialHeight:PropTypes.number,initialX:PropTypes.number,initialY:PropTypes.number,initiallyDocked:PropTypes.bool}),layers:PropTypes.object,localConfig:PropTypes.object,map:PropTypes.object,panTo:PropTypes.func,/** Options to pass to the 3D plugins, in the form `{"<PluginName>": {<options>}}`.
22
- * Refer to the documentation of the <a href="#plugins3d">3D plugins</a> for settable options. */pluginOptions:PropTypes.object,plugins3d:PropTypes.object,removeLayer:PropTypes.func,searchProviders:PropTypes.object,setView3dMode:PropTypes.func,startupParams:PropTypes.object,startupState:PropTypes.object,theme:PropTypes.object,view3dMode:PropTypes.number,zoomToPoint:PropTypes.func});_defineProperty(View3D,"defaultProps",{buttonPosition:6,controlsPosition:"top",geometry:{initialWidth:600,initialHeight:800,initialX:0,initialY:0,initiallyDocked:true},pluginOptions:{}});export default(function(plugins3d){return connect(function(state){return{plugins3d:plugins3d,display:state.display,map:state.map,layers:state.layers,theme:state.theme,localConfig:state.localConfig,view3dMode:state.display.view3dMode,startupParams:state.localConfig.startupParams,startupState:state.localConfig.startupState}},{addLayerFeatures:addLayerFeatures,removeLayer:removeLayer,panTo:panTo,zoomToPoint:zoomToPoint,setView3dMode:setView3dMode})(View3D)});
21
+ if(prevProps.theme.current&&this.props.theme.current!==prevProps.theme.current){this.setState({storedState:null})}}},{key:"syncParentStore",value:function syncParentStore(prevProps){if(this.props.display!==prevProps.display){this.store.dispatch({type:"SYNC_DISPLAY_FROM_PARENT_STORE",display:this.props.display})}if(this.props.theme!==prevProps.theme){this.store.dispatch({type:"SYNC_THEME_FROM_PARENT_STORE",theme:this.props.theme})}if(this.props.localConfig!==prevProps.localConfig){this.store.dispatch({type:"SYNC_LOCAL_CONFIG_FROM_PARENT_STORE",localConfig:this.props.localConfig})}if(this.props.layers!==prevProps.layers){this.store.dispatch({type:"SYNC_LAYERS_FROM_PARENT_STORE",layers:this.props.layers})}if(this.props.map!==prevProps.map){this.store.dispatch({type:"SYNC_MAP_FROM_PARENT_STORE",map:this.props.map})}}},{key:"render",value:function render(){var _this$props$theme$cur2;var button=(_this$props$theme$cur2=this.props.theme.current)!==null&&_this$props$theme$cur2!==void 0&&_this$props$theme$cur2.map3d?/*#__PURE__*/React.createElement(View3DSwitcher,{key:"View3DButton",position:this.props.buttonPosition}):null;return[button,this.render3DWindow()]}}])}(React.Component);_defineProperty(View3D,"propTypes",{addLayerFeatures:PropTypes.func,/** The position slot index of the 3d switch map button, from the bottom (0: bottom slot). */buttonPosition:PropTypes.number,/** The position of the navigation controls. Either `top` or `bottom`. */controlsPosition:PropTypes.string,/** The default scene quality factor (`20`: min, `100`: max). */defaultSceneQuality:PropTypes.number,display:PropTypes.object,/** Default window geometry. */geometry:PropTypes.shape({initialWidth:PropTypes.number,initialHeight:PropTypes.number,initialX:PropTypes.number,initialY:PropTypes.number,initiallyDocked:PropTypes.bool}),layers:PropTypes.object,localConfig:PropTypes.object,map:PropTypes.object,/** Mouse buttons assignment. You can assign `pan`, `rotate`, `zoom` to each button. */mouseButtons:PropTypes.shape({left:PropTypes.string,middle:PropTypes.string,right:PropTypes.string}),panTo:PropTypes.func,/** Options to pass to the 3D plugins, in the form `{"<PluginName>": {<options>}}`.
22
+ * Refer to the documentation of the <a href="#plugins3d">3D plugins</a> for settable options. */pluginOptions:PropTypes.object,plugins3d:PropTypes.object,removeLayer:PropTypes.func,searchProviders:PropTypes.object,setView3dMode:PropTypes.func,startupParams:PropTypes.object,startupState:PropTypes.object,theme:PropTypes.object,view3dMode:PropTypes.number,zoomToPoint:PropTypes.func});_defineProperty(View3D,"defaultProps",{buttonPosition:6,controlsPosition:"top",geometry:{initialWidth:600,initialHeight:800,initialX:0,initialY:0,initiallyDocked:true},pluginOptions:{},mouseButtons:{left:"pan",middle:"zoom",right:"rotate"}});export default(function(plugins3d){return connect(function(state){return{plugins3d:plugins3d,display:state.display,map:state.map,layers:state.layers,theme:state.theme,localConfig:state.localConfig,view3dMode:state.display.view3dMode,startupParams:state.localConfig.startupParams,startupState:state.localConfig.startupState}},{addLayerFeatures:addLayerFeatures,removeLayer:removeLayer,panTo:panTo,zoomToPoint:zoomToPoint,setView3dMode:setView3dMode})(View3D)});
@@ -1,4 +1,4 @@
1
- function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(o){return typeof o}:function(o){return o&&"function"==typeof Symbol&&o.constructor===Symbol&&o!==Symbol.prototype?"symbol":typeof o},_typeof(o)}function _toConsumableArray(r){return _arrayWithoutHoles(r)||_iterableToArray(r)||_unsupportedIterableToArray(r)||_nonIterableSpread()}function _nonIterableSpread(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _iterableToArray(r){if("undefined"!=typeof Symbol&&null!=r[Symbol.iterator]||null!=r["@@iterator"])return Array.from(r)}function _arrayWithoutHoles(r){if(Array.isArray(r))return _arrayLikeToArray(r)}function _createForOfIteratorHelper(r,e){var t="undefined"!=typeof Symbol&&r[Symbol.iterator]||r["@@iterator"];if(!t){if(Array.isArray(r)||(t=_unsupportedIterableToArray(r))||e&&r&&"number"==typeof r.length){t&&(r=t);var _n=0,F=function F(){};return{s:F,n:function n(){return _n>=r.length?{done:!0}:{done:!1,value:r[_n++]}},e:function e(r){throw r},f:F}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,a=!0,u=!1;return{s:function s(){t=t.call(r)},n:function n(){var r=t.next();return a=r.done,r},e:function e(r){u=!0,o=r},f:function f(){try{a||null==t["return"]||t["return"]()}finally{if(u)throw o}}}}function _unsupportedIterableToArray(r,a){if(r){if("string"==typeof r)return _arrayLikeToArray(r,a);var t={}.toString.call(r).slice(8,-1);return"Object"===t&&r.constructor&&(t=r.constructor.name),"Map"===t||"Set"===t?Array.from(r):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?_arrayLikeToArray(r,a):void 0}}function _arrayLikeToArray(r,a){(null==a||a>r.length)&&(a=r.length);for(var e=0,n=Array(a);e<a;e++)n[e]=r[e];return n}function _readOnlyError(r){throw new TypeError("\""+r+"\" is read-only")}function ownKeys(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);r&&(o=o.filter(function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable})),t.push.apply(t,o)}return t}function _objectSpread(e){for(var r=1;r<arguments.length;r++){var t=null!=arguments[r]?arguments[r]:{};r%2?ownKeys(Object(t),!0).forEach(function(r){_defineProperty(e,r,t[r])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):ownKeys(Object(t)).forEach(function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(t,r))})}return e}function _defineProperty(e,r,t){return(r=_toPropertyKey(r))in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}function _toPropertyKey(t){var i=_toPrimitive(t,"string");return"symbol"==_typeof(i)?i:i+""}function _toPrimitive(t,r){if("object"!=_typeof(t)||!t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var i=e.call(t,r||"default");if("object"!=_typeof(i))return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===r?String:Number)(t)}/**
1
+ function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(o){return typeof o}:function(o){return o&&"function"==typeof Symbol&&o.constructor===Symbol&&o!==Symbol.prototype?"symbol":typeof o},_typeof(o)}function _toConsumableArray(r){return _arrayWithoutHoles(r)||_iterableToArray(r)||_unsupportedIterableToArray(r)||_nonIterableSpread()}function _nonIterableSpread(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _iterableToArray(r){if("undefined"!=typeof Symbol&&null!=r[Symbol.iterator]||null!=r["@@iterator"])return Array.from(r)}function _arrayWithoutHoles(r){if(Array.isArray(r))return _arrayLikeToArray(r)}function _createForOfIteratorHelper(r,e){var t="undefined"!=typeof Symbol&&r[Symbol.iterator]||r["@@iterator"];if(!t){if(Array.isArray(r)||(t=_unsupportedIterableToArray(r))||e&&r&&"number"==typeof r.length){t&&(r=t);var _n=0,F=function F(){};return{s:F,n:function n(){return _n>=r.length?{done:!0}:{done:!1,value:r[_n++]}},e:function e(r){throw r},f:F}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,a=!0,u=!1;return{s:function s(){t=t.call(r)},n:function n(){var r=t.next();return a=r.done,r},e:function e(r){u=!0,o=r},f:function f(){try{a||null==t["return"]||t["return"]()}finally{if(u)throw o}}}}function _unsupportedIterableToArray(r,a){if(r){if("string"==typeof r)return _arrayLikeToArray(r,a);var t={}.toString.call(r).slice(8,-1);return"Object"===t&&r.constructor&&(t=r.constructor.name),"Map"===t||"Set"===t?Array.from(r):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?_arrayLikeToArray(r,a):void 0}}function _arrayLikeToArray(r,a){(null==a||a>r.length)&&(a=r.length);for(var e=0,n=Array(a);e<a;e++)n[e]=r[e];return n}function ownKeys(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);r&&(o=o.filter(function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable})),t.push.apply(t,o)}return t}function _objectSpread(e){for(var r=1;r<arguments.length;r++){var t=null!=arguments[r]?arguments[r]:{};r%2?ownKeys(Object(t),!0).forEach(function(r){_defineProperty(e,r,t[r])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):ownKeys(Object(t)).forEach(function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(t,r))})}return e}function _defineProperty(e,r,t){return(r=_toPropertyKey(r))in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}function _toPropertyKey(t){var i=_toPrimitive(t,"string");return"symbol"==_typeof(i)?i:i+""}function _toPrimitive(t,r){if("object"!=_typeof(t)||!t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var i=e.call(t,r||"default");if("object"!=_typeof(i))return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===r?String:Number)(t)}/**
2
2
  * Copyright 2015 GeoSolutions Sas
3
3
  * Copyright 2016-2024 Sourcepole AG
4
4
  * All rights reserved.
@@ -10,6 +10,6 @@ return state}var newLayers=(state.flat||[]).map(function(layer){if(layer.id===ac
10
10
  if(mutexVisibilityChanged){var newParent=newlayer;parentPath.forEach(function(index){newParent=newParent.sublayers[index]});var targetIdx=action.sublayerpath[action.sublayerpath.length-1];newParent.sublayers=newParent.sublayers.map(function(l,idx){return _objectSpread(_objectSpread({},l),{},{visibility:idx===targetIdx})})}if(["children","both"].includes(recurseDirection)){// recurse to children (except visibility to children in mutex case)
11
11
  LayerUtils.propagateLayerProperty(newsublayer,action.property,action.newvalue)}if(["parents","both"].includes(recurseDirection)){// recurse to parents
12
12
  LayerUtils.propagateLayerProperty(newlayer,action.property,action.newvalue,action.sublayerpath)}if(newlayer.type==="wms"){Object.assign(newlayer,LayerUtils.buildWMSLayerParams(newlayer,state.filter))}if(newlayer.role===LayerRole.BACKGROUND){UrlParams.updateParams({bl:newlayer.visibility?newlayer.name:""})}return newlayer}else if(layer.role===LayerRole.BACKGROUND&&backgroundVisibilityChanged){return _objectSpread(_objectSpread({},layer),{},{visibility:false})}return layer});UrlParams.updateParams({l:LayerUtils.buildWMSLayerUrlParam(newLayers)});return _objectSpread(_objectSpread({},state),{},{flat:newLayers})}case SET_LAYER_DIMENSIONS:{var _state$flat$find;// Set dimensions for all layers with the same URL (i.e. if a WMS is split)
13
- var layerUrl=(_state$flat$find=state.flat.find(function(layer){return layer.id===action.layerId}))===null||_state$flat$find===void 0?void 0:_state$flat$find.url;if(!layerUrl){return""}var _newLayers=(state.flat||[]).map(function(layer){if(layer.url===layerUrl){var newLayer=_objectSpread(_objectSpread({},layer),{},{dimensionValues:action.dimensions});Object.assign(newLayer,LayerUtils.buildWMSLayerParams(newLayer,state.filter));return newLayer}return layer});return _objectSpread(_objectSpread({},state),{},{flat:_newLayers})}case ADD_LAYER:{var _action$layer$visibil,_action$layer$opacity,_action$options,_action$options2;var _newLayers2=(state.flat||[]).concat();var layerId=action.layer.id||uuidv4();var newLayer=_objectSpread(_objectSpread({},action.layer),{},{id:layerId,name:action.layer.name||layerId,role:action.layer.role||LayerRole.USERLAYER,queryable:action.layer.queryable||false,visibility:(_action$layer$visibil=action.layer.visibility)!==null&&_action$layer$visibil!==void 0?_action$layer$visibil:true,opacity:(_action$layer$opacity=action.layer.opacity)!==null&&_action$layer$opacity!==void 0?_action$layer$opacity:255,layertreehidden:action.layer.layertreehidden||action.layer.role>LayerRole.USERLAYER});if(newLayer.translations){LayerUtils.applyTranslations(newLayer,newLayer.translations),_readOnlyError("newLayer")}if((_action$options=action.options)!==null&&_action$options!==void 0&&_action$options.beforeLayerName||(_action$options2=action.options)!==null&&_action$options2!==void 0&&_action$options2.afterLayerName){_newLayers2=LayerUtils.insertLayer(_newLayers2,newLayer,"name",action.options.beforeLayerName||action.options.afterLayerName,action.options.afterLayerName?true:false)}else{var inspos=0;if(action.pos===null){for(;inspos<_newLayers2.length&&newLayer.role<_newLayers2[inspos].role;++inspos);}else{inspos=action.pos}_newLayers2.splice(inspos,0,newLayer);// Compress layers if possible
13
+ var layerUrl=(_state$flat$find=state.flat.find(function(layer){return layer.id===action.layerId}))===null||_state$flat$find===void 0?void 0:_state$flat$find.url;if(!layerUrl){return""}var _newLayers=(state.flat||[]).map(function(layer){if(layer.url===layerUrl){var newLayer=_objectSpread(_objectSpread({},layer),{},{dimensionValues:action.dimensions});Object.assign(newLayer,LayerUtils.buildWMSLayerParams(newLayer,state.filter));return newLayer}return layer});return _objectSpread(_objectSpread({},state),{},{flat:_newLayers})}case ADD_LAYER:{var _action$layer$visibil,_action$layer$opacity,_action$options,_action$options2;var _newLayers2=(state.flat||[]).concat();var layerId=action.layer.id||uuidv4();var newLayer=_objectSpread(_objectSpread({},action.layer),{},{id:layerId,name:action.layer.name||layerId,role:action.layer.role||LayerRole.USERLAYER,queryable:action.layer.queryable||false,visibility:(_action$layer$visibil=action.layer.visibility)!==null&&_action$layer$visibil!==void 0?_action$layer$visibil:true,opacity:(_action$layer$opacity=action.layer.opacity)!==null&&_action$layer$opacity!==void 0?_action$layer$opacity:255,layertreehidden:action.layer.layertreehidden||action.layer.role>LayerRole.USERLAYER});if((_action$options=action.options)!==null&&_action$options!==void 0&&_action$options.beforeLayerName||(_action$options2=action.options)!==null&&_action$options2!==void 0&&_action$options2.afterLayerName){_newLayers2=LayerUtils.insertLayer(_newLayers2,newLayer,"name",action.options.beforeLayerName||action.options.afterLayerName,action.options.afterLayerName?true:false)}else{var inspos=0;if(action.pos===null){for(;inspos<_newLayers2.length&&newLayer.role<_newLayers2[inspos].role;++inspos);}else{inspos=action.pos}_newLayers2.splice(inspos,0,newLayer);// Compress layers if possible
14
14
  _newLayers2=LayerUtils.implodeLayers(LayerUtils.explodeLayers(_newLayers2))}var _iterator=_createForOfIteratorHelper(_newLayers2),_step;try{for(_iterator.s();!(_step=_iterator.n()).done;){var lyr=_step.value;if(lyr.type==="wms"){Object.assign(lyr,LayerUtils.buildWMSLayerParams(lyr,state.filter))}}}catch(err){_iterator.e(err)}finally{_iterator.f()}UrlParams.updateParams({l:LayerUtils.buildWMSLayerUrlParam(_newLayers2)});if(newLayer.role===LayerRole.BACKGROUND&&newLayer.visibility){UrlParams.updateParams({bl:newLayer.name})}return _objectSpread(_objectSpread({},state),{},{flat:_newLayers2})}case ADD_LAYER_SEPARATOR:{var _newLayers3=LayerUtils.insertSeparator(state.flat,action.title,action.afterLayerId,action.afterSublayerPath);var _iterator2=_createForOfIteratorHelper(_newLayers3),_step2;try{for(_iterator2.s();!(_step2=_iterator2.n()).done;){var layer=_step2.value;if(layer.type==="wms"){Object.assign(layer,LayerUtils.buildWMSLayerParams(layer,state.filter))}}}catch(err){_iterator2.e(err)}finally{_iterator2.f()}UrlParams.updateParams({l:LayerUtils.buildWMSLayerUrlParam(_newLayers3)});return _objectSpread(_objectSpread({},state),{},{flat:_newLayers3})}case REMOVE_LAYER:{var _layer=state.flat.find(function(l){return l.id===action.layerId});if(!_layer){return state}var _newLayers4=state.flat;if(_layer.role===LayerRole.BACKGROUND||isEmpty(action.sublayerpath)){var position=state.flat.findIndex(function(l){return l.id===action.layerId});_newLayers4=_toConsumableArray(_newLayers4);_newLayers4.splice(position,1);if(position>0&&position<_newLayers4.length&&_newLayers4[position-1].id===_newLayers4[position].id){// Compress layers
15
15
  _newLayers4=LayerUtils.implodeLayers(LayerUtils.explodeLayers(_newLayers4))}}else{_newLayers4=LayerUtils.removeLayer(state.flat,_layer,action.sublayerpath).map(function(l){if(l.type==="wms"){return _objectSpread(_objectSpread({},l),LayerUtils.buildWMSLayerParams(l,state.filter))}else{return l}})}UrlParams.updateParams({l:LayerUtils.buildWMSLayerUrlParam(_newLayers4)});return _objectSpread(_objectSpread({},state),{},{flat:_newLayers4})}case ADD_LAYER_FEATURES:{var _layerId=action.layer.id||uuidv4();var _newLayers5=(state.flat||[]).concat();var idx=_newLayers5.findIndex(function(layer){return layer.id===_layerId});if(idx===-1){var newFeatures=action.features.map(function(f){return _objectSpread(_objectSpread({},f),{},{id:f.id||(f.properties||{}).id||uuidv4()})});var _newLayer=_objectSpread(_objectSpread({},action.layer),{},{id:_layerId,type:"vector",name:action.layer.name||_layerId,features:newFeatures,role:action.layer.role||LayerRole.USERLAYER,queryable:action.layer.queryable||false,visibility:action.layer.visibility||true,opacity:action.layer.opacity||255,layertreehidden:action.layer.layertreehidden||action.layer.role>LayerRole.USERLAYER,bbox:VectorLayerUtils.computeFeaturesBBox(action.features)});var _inspos=0;for(;_inspos<_newLayers5.length&&_newLayer.role<_newLayers5[_inspos].role;++_inspos);_newLayers5.splice(_inspos,0,_newLayer)}else{var addFeatures=action.features.map(function(f){return _objectSpread(_objectSpread({},f),{},{id:f.id||(f.properties||{}).id||uuidv4()})});var _newFeatures=action.clear?addFeatures:[].concat(_toConsumableArray((_newLayers5[idx].features||[]).filter(function(f){return!addFeatures.find(function(g){return g.id===f.id})})),_toConsumableArray(addFeatures));_newLayers5[idx]=_objectSpread(_objectSpread({},_newLayers5[idx]),{},{features:_newFeatures,bbox:VectorLayerUtils.computeFeaturesBBox(_newFeatures),rev:action.layer.rev})}return _objectSpread(_objectSpread({},state),{},{flat:_newLayers5})}case REMOVE_LAYER_FEATURES:{var changed=false;var _newLayers6=(state.flat||[]).reduce(function(result,layer){if(layer.id===action.layerId){var _newFeatures2=(layer.features||[]).filter(function(f){return action.featureIds.includes(f.id)===false});if(!isEmpty(_newFeatures2)||action.keepEmptyLayer){result.push(_objectSpread(_objectSpread({},layer),{},{features:_newFeatures2,bbox:VectorLayerUtils.computeFeaturesBBox(_newFeatures2)}))}changed=true}else{result.push(layer)}return result},[]);if(changed){return _objectSpread(_objectSpread({},state),{},{flat:_newLayers6})}else{return state}}case CLEAR_LAYER:{var _newLayers7=(state.flat||[]).map(function(layer){if(layer.id===action.layerId){return _objectSpread(_objectSpread({},layer),{},{features:[],bbox:null})}else{return layer}});return _objectSpread(_objectSpread({},state),{},{flat:_newLayers7})}case ADD_THEME_SUBLAYER:{var themeLayerIdx=state.flat.findIndex(function(layer){return layer.role===LayerRole.THEME});if(themeLayerIdx>=0){var _newLayers8=state.flat.slice(0);_newLayers8[themeLayerIdx]=LayerUtils.mergeSubLayers(state.flat[themeLayerIdx],action.layer);_newLayers8[themeLayerIdx].visibility=true;Object.assign(_newLayers8[themeLayerIdx],LayerUtils.buildWMSLayerParams(_newLayers8[themeLayerIdx],state.filter));UrlParams.updateParams({l:LayerUtils.buildWMSLayerUrlParam(_newLayers8)});return _objectSpread(_objectSpread({},state),{},{flat:_newLayers8})}return state}case REFRESH_LAYER:{var _newLayers9=(state.flat||[]).map(function(layer){if(action.filter(layer)){return _objectSpread(_objectSpread({},layer),{},{rev:+new Date})}return layer});return _objectSpread(_objectSpread({},state),{},{flat:_newLayers9})}case REMOVE_ALL_LAYERS:{return defaultState}case REORDER_LAYER:{var _newLayers10=LayerUtils.reorderLayer(state.flat,action.layer,action.sublayerpath,action.direction,action.preventSplittingGroups).map(function(layer){if(layer.type==="wms"){return _objectSpread(_objectSpread({},layer),LayerUtils.buildWMSLayerParams(layer,state.filter))}else{return layer}});UrlParams.updateParams({l:LayerUtils.buildWMSLayerUrlParam(_newLayers10)});return _objectSpread(_objectSpread({},state),{},{flat:_newLayers10})}case REPLACE_PLACEHOLDER_LAYER:{var _newLayers11=LayerUtils.replacePlaceholderLayer(state.flat,action.id,action.layer,state.filter);UrlParams.updateParams({l:LayerUtils.buildWMSLayerUrlParam(_newLayers11)});return _objectSpread(_objectSpread({},state),{},{flat:_newLayers11})}case SET_SWIPE:{return _objectSpread(_objectSpread({},state),{},{swipe:action.swipe})}case SET_FILTER:{var filter={filterParams:action.filter,filterGeom:action.filterGeom,timeRange:action.timeRange};var _newLayers12=state.flat.map(function(layer){if(layer.type==="wms"){return _objectSpread(_objectSpread({},layer),LayerUtils.buildWMSLayerParams(layer,filter))}return layer});return _objectSpread(_objectSpread({},state),{},{flat:_newLayers12,filter:filter})}case SET_THEME_LAYERS_VISIBILITY_PRESET:{var _newLayers13=state.flat.map(function(layer){if(layer.role===LayerRole.THEME){var _newLayer2=LayerUtils.applyVisibilityPreset(layer,action.preset);return _objectSpread(_objectSpread({},_newLayer2),LayerUtils.buildWMSLayerParams(_newLayer2,state.filter))}else{return layer}});UrlParams.updateParams({l:LayerUtils.buildWMSLayerUrlParam(_newLayers13)});return _objectSpread(_objectSpread({},state),{},{flat:_newLayers13})}default:return state}}
@@ -54,4 +54,4 @@ params.LAYERS.push("wfs:".concat(layer.url,"#").concat(layer.name));params.OPACI
54
54
  var printBgLayerName=printBackgroundLayer;if(Array.isArray(printBackgroundLayer)){printBgLayerName=null;for(var i=0;i<printBackgroundLayer.length;++i){printBgLayerName=printBackgroundLayer[i].name;if(printScale<=printBackgroundLayer[i].maxScale){break}}}if(printBgLayerName){var match=null;if((match=printBgLayerName.match(/^(\w+):(.*)#([^#]+)$/))&&match[1]==="wms"){if(printExternalLayers){var _backgroundLayer$opac;var layer={type:"wms",params:{LAYERS:match[3],OPACITIES:String((_backgroundLayer$opac=backgroundLayer.opacity)!==null&&_backgroundLayer$opac!==void 0?_backgroundLayer$opac:255),STYLES:""},url:match[2]};LayerUtils.addExternalLayerPrintParams(layer,params,printCrs,counterRef)}}else{var _backgroundLayer$opac2;params.LAYERS.push(printBgLayerName);params.OPACITIES.push(String((_backgroundLayer$opac2=backgroundLayer.opacity)!==null&&_backgroundLayer$opac2!==void 0?_backgroundLayer$opac2:255));params.COLORS.push("");params.STYLES.push("")}}}else if(printExternalLayers){// Inject client-side wms as external layer for print
55
55
  var items=backgroundLayer.type==="group"?backgroundLayer.items:[backgroundLayer];items.slice(0).reverse().forEach(function(layer){if(LayerUtils.layerScaleInRange(layer,printScale)){LayerUtils.addExternalLayerPrintParams(layer,params,printCrs,counterRef)}})}}params.LAYERS=params.LAYERS.reverse().join(",");params.OPACITIES=params.OPACITIES.reverse().join(",");params.COLORS=params.COLORS.reverse().join(",");params.STYLES=params.STYLES.reverse().join(",");return params},getTimeDimensionValues:function getTimeDimensionValues(layer){var result={names:new Set,values:new Set,attributes:{}};if(layer.visibility){(layer.dimensions||[]).forEach(function(dimension){if(dimension.units==="ISO8601"&&dimension.value){result.names.add(dimension.name);dimension.value.split(/,\s+/).filter(function(x){return x}).forEach(function(x){return result.values.add(x)});result.attributes[layer.name]=[dimension.fieldName,dimension.endFieldName]}})}(layer.sublayers||[]).forEach(function(sublayer){var sublayerResult=LayerUtils.getTimeDimensionValues(sublayer);sublayerResult.names.forEach(function(x){return result.names.add(x)});sublayerResult.values.forEach(function(x){return result.values.add(x)});result.attributes=_objectSpread(_objectSpread({},result.attributes),sublayerResult.attributes)});return result},getAttribution:function getAttribution(layer,map){var showThemeAttributionOnly=arguments.length>2&&arguments[2]!==undefined?arguments[2]:false;var transformedMapBBoxes=arguments.length>3&&arguments[3]!==undefined?arguments[3]:{};if(layer.visibility===false||showThemeAttributionOnly&&layer.role!==LayerRole.THEME){return{}}var mapScale=MapUtils.computeForZoom(map.scales,map.zoom);if(!LayerUtils.layerScaleInRange(layer,mapScale)){return{}}if(layer.bbox&&layer.bbox.bounds){var layerCrs=layer.bbox.crs||map.projection;if(!transformedMapBBoxes[layerCrs]){transformedMapBBoxes[layerCrs]=CoordinatesUtils.reprojectBbox(map.bbox.bounds,map.projection,layerCrs)}var mapbbox=transformedMapBBoxes[layerCrs];var laybbox=layer.bbox.bounds;if(mapbbox[0]>laybbox[2]||mapbbox[2]<laybbox[0]||mapbbox[1]>laybbox[3]||mapbbox[3]<laybbox[1]){// Extents don't overlap
56
56
  return{}}}var copyrights={};if(layer.sublayers){Object.assign(copyrights,layer.sublayers.reduce(function(res,sublayer){return _objectSpread(_objectSpread({},res),LayerUtils.getAttribution(sublayer,map,false,transformedMapBBoxes))},{}))}else if(layer.type==="group"&&layer.items){Object.assign(copyrights,layer.items.reduce(function(res,sublayer){return _objectSpread(_objectSpread({},res),LayerUtils.getAttribution(sublayer,map,false,transformedMapBBoxes))},{}))}if(layer.attribution&&layer.attribution.Title){var key=layer.attribution.OnlineResource||layer.attribution.Title;copyrights[key]={title:layer.attribution.OnlineResource?layer.attribution.Title:null,layers:[].concat(_toConsumableArray((copyrights[key]||{}).layers||[]),[layer])}}return copyrights},recomputeLayerBBox:function recomputeLayerBBox(layer){if(isEmpty(layer.sublayers)){return layer}var bounds=null;var newlayer=_objectSpread({},layer);newlayer.sublayers=newlayer.sublayers.map(function(sublayer){sublayer=LayerUtils.recomputeLayerBBox(sublayer);if(!bounds&&sublayer.bbox&&sublayer.bbox.bounds){bounds=CoordinatesUtils.reprojectBbox(sublayer.bbox.bounds,sublayer.bbox.crs,"EPSG:4326")}else if(bounds&&sublayer.bbox&&sublayer.bbox.bounds){var sublayerbounds=CoordinatesUtils.reprojectBbox(sublayer.bbox.bounds,sublayer.bbox.crs,"EPSG:4326");bounds=[Math.min(bounds[0],sublayerbounds[0]),Math.min(bounds[1],sublayerbounds[1]),Math.max(bounds[2],sublayerbounds[2]),Math.max(bounds[3],sublayerbounds[3])]}return sublayer});if(bounds){newlayer.bbox={bounds:bounds,crs:"EPSG:4326"}}return newlayer},propagateLayerProperty:function propagateLayerProperty(newlayer,property,value){var path=arguments.length>3&&arguments[3]!==undefined?arguments[3]:null;Object.assign(newlayer,_defineProperty({},property,value));// Don't propagate visibility for mutually exclusive groups
57
- if(newlayer.sublayers&&!(property==="visibility"&&newlayer.mutuallyExclusive)){newlayer.sublayers=newlayer.sublayers.map(function(sublayer,idx){if(path===null||!isEmpty(path)&&path[0]===idx){var newsublayer=_objectSpread({},sublayer);LayerUtils.propagateLayerProperty(newsublayer,property,value,path?path.slice(1):null);return newsublayer}else{return sublayer}})}},getLayerRefreshInterval:function getLayerRefreshInterval(layer){var _layer$refreshInterva;var refreshInterval=(_layer$refreshInterva=layer.refreshInterval)!==null&&_layer$refreshInterva!==void 0?_layer$refreshInterva:0;(layer.sublayers||[]).forEach(function(sublayer){var sublayerRefreshInterval=LayerUtils.getLayerRefreshInterval(sublayer);if(sublayerRefreshInterval>0){refreshInterval=refreshInterval>0?Math.min(refreshInterval,sublayerRefreshInterval):sublayerRefreshInterval}});return refreshInterval},collectFeatureReports:function collectFeatureReports(layers){if(!ConfigUtils.getConfigProp("documentServiceUrl")){return{}}var reports={};var _collectLayerReports=function collectLayerReports(toplayer,layer){if(layer.sublayers){var _iterator21=_createForOfIteratorHelper(layer.sublayers),_step21;try{for(_iterator21.s();!(_step21=_iterator21.n()).done;){var sublayer=_step21.value;reports=_objectSpread(_objectSpread({},reports),_collectLayerReports(toplayer,sublayer))}}catch(err){_iterator21.e(err)}finally{_iterator21.f()}}else if(layer.featureReport){var key=toplayer.url+"#"+layer.name;if(Array.isArray(layer.featureReport)){reports[key]=layer.featureReport}else{reports[key]=[{title:layer.title,template:layer.featureReport}]}}return reports};layers.forEach(function(layer){if(layer.role===LayerRole.THEME||layer.role===LayerRole.USERLAYER){_collectLayerReports(layer,layer)}});return reports},computeVisbilityPreset:function computeVisbilityPreset(layer){var result={};if(layer.sublayers){layer.sublayers.forEach(function(sublayer){return Object.assign(result,LayerUtils.computeVisbilityPreset(sublayer))})}else if(layer.visibility){result[layer.name]=layer.style}return result},getActiveVisibilityPreset:function getActiveVisibilityPreset(layers,presets){if(isEmpty(presets)){return null}var result={};layers.forEach(function(layer){if(layer.role===LayerRole.THEME){Object.assign(result,LayerUtils.computeVisbilityPreset(layer))}});for(var _i4=0,_Object$entries=Object.entries(presets);_i4<_Object$entries.length;_i4++){var _Object$entries$_i=_slicedToArray(_Object$entries[_i4],2),name=_Object$entries$_i[0],preset=_Object$entries$_i[1];if(isEqual(preset,result)){return name}}return null},applyVisibilityPreset:function applyVisibilityPreset(layer,preset){var newLayer=_objectSpread({},layer);if(newLayer.sublayers){var haveVisibileSublayer=false;newLayer.sublayers=newLayer.sublayers.map(function(sublayer){var newSublayer=LayerUtils.applyVisibilityPreset(sublayer,preset);haveVisibileSublayer||(haveVisibileSublayer=newSublayer.visibility===true);return newSublayer});newLayer.visibility=haveVisibileSublayer;if(newLayer.name in preset){newLayer.visibility=true}}else if(newLayer.name in preset){newLayer.visibility=true;newLayer.style=preset[newLayer.name]}else{newLayer.visibility=false}return newLayer},applyTranslations:function applyTranslations(layer,translations){var _translations$layertr,_translations$layertr2,_layer$sublayers,_layer$sublayers$map;return _objectSpread(_objectSpread({},layer),{},{title:(_translations$layertr=(_translations$layertr2=translations.layertree)===null||_translations$layertr2===void 0?void 0:_translations$layertr2[layer.name])!==null&&_translations$layertr!==void 0?_translations$layertr:layer.title,sublayers:(_layer$sublayers=layer.sublayers)===null||_layer$sublayers===void 0||(_layer$sublayers$map=_layer$sublayers.map)===null||_layer$sublayers$map===void 0?void 0:_layer$sublayers$map.call(_layer$sublayers,function(sublayer){return LayerUtils.applyTranslations(sublayer,translations)})})}};export default LayerUtils;
57
+ if(newlayer.sublayers&&!(property==="visibility"&&newlayer.mutuallyExclusive)){newlayer.sublayers=newlayer.sublayers.map(function(sublayer,idx){if(path===null||!isEmpty(path)&&path[0]===idx){var newsublayer=_objectSpread({},sublayer);LayerUtils.propagateLayerProperty(newsublayer,property,value,path?path.slice(1):null);return newsublayer}else{return sublayer}})}},getLayerRefreshInterval:function getLayerRefreshInterval(layer){var _layer$refreshInterva;var refreshInterval=(_layer$refreshInterva=layer.refreshInterval)!==null&&_layer$refreshInterva!==void 0?_layer$refreshInterva:0;(layer.sublayers||[]).forEach(function(sublayer){var sublayerRefreshInterval=LayerUtils.getLayerRefreshInterval(sublayer);if(sublayerRefreshInterval>0){refreshInterval=refreshInterval>0?Math.min(refreshInterval,sublayerRefreshInterval):sublayerRefreshInterval}});return refreshInterval},collectFeatureReports:function collectFeatureReports(layers){if(!ConfigUtils.getConfigProp("documentServiceUrl")){return{}}var reports={};var _collectLayerReports=function collectLayerReports(toplayer,layer){if(layer.sublayers){var _iterator21=_createForOfIteratorHelper(layer.sublayers),_step21;try{for(_iterator21.s();!(_step21=_iterator21.n()).done;){var sublayer=_step21.value;reports=_objectSpread(_objectSpread({},reports),_collectLayerReports(toplayer,sublayer))}}catch(err){_iterator21.e(err)}finally{_iterator21.f()}}else if(layer.featureReport){var key=toplayer.url+"#"+layer.name;if(Array.isArray(layer.featureReport)){reports[key]=layer.featureReport}else{reports[key]=[{title:layer.title,template:layer.featureReport}]}}return reports};layers.forEach(function(layer){if(layer.role===LayerRole.THEME||layer.role===LayerRole.USERLAYER){_collectLayerReports(layer,layer)}});return reports},computeVisbilityPreset:function computeVisbilityPreset(layer){var result={};if(layer.sublayers){layer.sublayers.forEach(function(sublayer){return Object.assign(result,LayerUtils.computeVisbilityPreset(sublayer))})}else if(layer.visibility){result[layer.name]=layer.style}return result},getActiveVisibilityPreset:function getActiveVisibilityPreset(layers,presets){if(isEmpty(presets)){return null}var result={};layers.forEach(function(layer){if(layer.role===LayerRole.THEME){Object.assign(result,LayerUtils.computeVisbilityPreset(layer))}});for(var _i4=0,_Object$entries=Object.entries(presets);_i4<_Object$entries.length;_i4++){var _Object$entries$_i=_slicedToArray(_Object$entries[_i4],2),name=_Object$entries$_i[0],preset=_Object$entries$_i[1];if(isEqual(preset,result)){return name}}return null},applyVisibilityPreset:function applyVisibilityPreset(layer,preset){var newLayer=_objectSpread({},layer);if(newLayer.sublayers){var haveVisibileSublayer=false;newLayer.sublayers=newLayer.sublayers.map(function(sublayer){var newSublayer=LayerUtils.applyVisibilityPreset(sublayer,preset);haveVisibileSublayer||(haveVisibileSublayer=newSublayer.visibility===true);return newSublayer});newLayer.visibility=haveVisibileSublayer;if(newLayer.name in preset){newLayer.visibility=true}}else if(newLayer.name in preset){newLayer.visibility=true;newLayer.style=preset[newLayer.name]}else{newLayer.visibility=false}return newLayer},applyTranslations:function applyTranslations(layer,translations){var _translations$layertr,_translations$layertr2,_layer$sublayers,_layer$sublayers$map;return _objectSpread(_objectSpread({},layer),{},{title:(_translations$layertr=translations===null||translations===void 0||(_translations$layertr2=translations.layertree)===null||_translations$layertr2===void 0?void 0:_translations$layertr2[layer.name])!==null&&_translations$layertr!==void 0?_translations$layertr:layer.title,sublayers:(_layer$sublayers=layer.sublayers)===null||_layer$sublayers===void 0||(_layer$sublayers$map=_layer$sublayers.map)===null||_layer$sublayers$map===void 0?void 0:_layer$sublayers$map.call(_layer$sublayers,function(sublayer){return LayerUtils.applyTranslations(sublayer,translations)})})}};export default LayerUtils;
@@ -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{remove as removeDiacritics}from"diacritics";import isEmpty from"lodash.isempty";import url from"url";import{v4 as uuidv4}from"uuid";import{LayerRole}from"../actions/layers";import{SearchResultType}from"../utils/SearchProviders";import ConfigUtils from"./ConfigUtils";import LayerUtils from"./LayerUtils";import LocaleUtils from"./LocaleUtils";var ThemeUtils={getThemeById:function getThemeById(themes,id){for(var i=0,n=themes.items.length;i<n;++i){if(themes.items[i].id===id){return themes.items[i]}}for(var _i=0,_n=themes.subdirs.length;_i<_n;++_i){var theme=this.getThemeById(themes.subdirs[_i],id);if(theme){return theme}}return null},createThemeBackgroundLayers:function createThemeBackgroundLayers(backgroundLayers,themes,visibleLayer,externalLayers){var bgLayers=[];var visibleIdx=-1;var defaultVisibleIdx=-1;var _iterator=_createForOfIteratorHelper(backgroundLayers),_step;try{var _loop=function _loop(){var entry=_step.value;if(!entry.name){return 1;// continue
7
+ */import{remove as removeDiacritics}from"diacritics";import isEmpty from"lodash.isempty";import url from"url";import{v4 as uuidv4}from"uuid";import{LayerRole}from"../actions/layers";import{SearchResultType}from"../utils/SearchProviders";import ConfigUtils from"./ConfigUtils";import LayerUtils from"./LayerUtils";var ThemeUtils={getThemeById:function getThemeById(themes,id){for(var i=0,n=themes.items.length;i<n;++i){if(themes.items[i].id===id){return themes.items[i]}}for(var _i=0,_n=themes.subdirs.length;_i<_n;++_i){var theme=this.getThemeById(themes.subdirs[_i],id);if(theme){return theme}}return null},createThemeBackgroundLayers:function createThemeBackgroundLayers(backgroundLayers,themes,visibleLayer,externalLayers){var bgLayers=[];var visibleIdx=-1;var defaultVisibleIdx=-1;var _iterator=_createForOfIteratorHelper(backgroundLayers),_step;try{var _loop=function _loop(){var entry=_step.value;if(!entry.name){return 1;// continue
8
8
  }var bgLayer=themes.backgroundLayers.find(function(lyr){return lyr.name===entry.name});if(bgLayer){if(entry.visibility===true){defaultVisibleIdx=bgLayers.length}if(bgLayer.name===visibleLayer){visibleIdx=bgLayers.length}bgLayer=_objectSpread(_objectSpread({},bgLayer),{},{role:LayerRole.BACKGROUND,thumbnail:bgLayer.thumbnail||"img/mapthumbs/default.jpg",visibility:false,opacity:bgLayer.opacity!==undefined?bgLayer.opacity:255});if(bgLayer.resource){bgLayer.id=uuidv4();bgLayer.type="placeholder";var params=LayerUtils.splitLayerUrlParam(bgLayer.resource);params.id=bgLayer.id;var key=params.type+":"+params.url;(externalLayers[key]=externalLayers[key]||[]).push(params);delete bgLayer.resource}else if(bgLayer.type==="wms"){bgLayer.version=bgLayer.params.VERSION||bgLayer.version||themes.defaultWMSVersion||"1.3.0"}else if(bgLayer.type==="group"){bgLayer.items=bgLayer.items.map(function(item){if(item.ref){var sublayer=themes.backgroundLayers.find(function(l){return l.name===item.ref});if(sublayer){item=_objectSpread(_objectSpread(_objectSpread({},item),sublayer),LayerUtils.buildWMSLayerParams(sublayer));if(item.type==="wms"){item.version=item.params.VERSION||item.version||themes.defaultWMSVersion||"1.3.0"}delete item.ref}else{item=null}}return item}).filter(function(x){return x})}bgLayers.push(bgLayer)}else{// eslint-disable-next-line
9
9
  console.warn("Could not find background layer "+entry.name)}};for(_iterator.s();!(_step=_iterator.n()).done;){if(_loop())continue}}catch(err){_iterator.e(err)}finally{_iterator.f()}if(visibleIdx>=0){bgLayers[visibleIdx].visibility=true}else if(defaultVisibleIdx>=0&&visibleLayer!==""){bgLayers[defaultVisibleIdx].visibility=true}return bgLayers},createThemeLayer:function createThemeLayer(theme,themes){var role=arguments.length>2&&arguments[2]!==undefined?arguments[2]:LayerRole.THEME;var subLayers=arguments.length>3&&arguments[3]!==undefined?arguments[3]:null;var urlParts=url.parse(theme.url,true);// Resolve relative urls
10
- if(!urlParts.host){var locationParts=url.parse(window.location.href);urlParts.protocol=locationParts.protocol;urlParts.host=locationParts.host}var sublayerNames=LayerUtils.getSublayerNames({sublayers:subLayers!==null&&subLayers!==void 0?subLayers:theme.sublayers});var baseParams=urlParts.query;var layer={type:"wms",id:theme.id,url:url.format(urlParts),version:theme.version||themes.defaultWMSVersion||"1.3.0",visibility:true,expanded:theme.expanded,name:theme.name,title:theme.title,bbox:theme.bbox,sublayers:subLayers!==null&&subLayers!==void 0?subLayers:theme.sublayers,tiled:theme.tiled,tileSize:theme.tileSize,ratio:!theme.tiled?1:undefined,serverType:"qgis",format:theme.format,rev:+new Date,role:role,attribution:theme.attribution,legendUrl:ThemeUtils.inheritBaseUrlParams(theme.legendUrl,theme.url,baseParams),printUrl:ThemeUtils.inheritBaseUrlParams(theme.printUrl,theme.url,baseParams),featureInfoUrl:ThemeUtils.inheritBaseUrlParams(theme.featureInfoUrl,theme.url,baseParams),infoFormats:theme.infoFormats,mapFormats:theme.availableFormats,layerTreeHiddenSublayers:theme.layerTreeHiddenSublayers,predefinedFilters:(theme.predefinedFilters||[]).filter(function(entry){return Object.keys(entry.filter).find(function(name){return sublayerNames.includes(name)})}),externalLayerMap:_objectSpread(_objectSpread({},theme.externalLayerMap),(theme.externalLayers||[]).reduce(function(res,cur){res[cur.internalLayer]=_objectSpread({},themes.externalLayers.find(function(entry){return entry.name===cur.name}));LayerUtils.completeExternalLayer(res[cur.internalLayer],LayerUtils.searchSubLayer(theme,"name",cur.internalLayer));return res},{}))};layer=LayerUtils.recomputeLayerBBox(layer);// Drawing order only makes sense if layer reordering is disabled
10
+ if(!urlParts.host){var locationParts=url.parse(window.location.href);urlParts.protocol=locationParts.protocol;urlParts.host=locationParts.host}var sublayerNames=LayerUtils.getSublayerNames({sublayers:subLayers!==null&&subLayers!==void 0?subLayers:theme.sublayers});var baseParams=urlParts.query;var layer={type:"wms",id:theme.id,url:url.format(urlParts),version:theme.version||themes.defaultWMSVersion||"1.3.0",visibility:true,expanded:theme.expanded,name:theme.name,title:theme.title,bbox:theme.bbox,sublayers:subLayers!==null&&subLayers!==void 0?subLayers:theme.sublayers,tiled:theme.tiled,tileSize:theme.tileSize,ratio:!theme.tiled?1:undefined,serverType:"qgis",format:theme.format,rev:+new Date,role:role,attribution:theme.attribution,legendUrl:ThemeUtils.inheritBaseUrlParams(theme.legendUrl,theme.url,baseParams),printUrl:ThemeUtils.inheritBaseUrlParams(theme.printUrl,theme.url,baseParams),featureInfoUrl:ThemeUtils.inheritBaseUrlParams(theme.featureInfoUrl,theme.url,baseParams),infoFormats:theme.infoFormats,mapFormats:theme.availableFormats,layerTreeHiddenSublayers:theme.layerTreeHiddenSublayers,predefinedFilters:(theme.predefinedFilters||[]).filter(function(entry){return Object.keys(entry.filter).find(function(name){return sublayerNames.includes(name)})}),externalLayerMap:_objectSpread(_objectSpread({},theme.externalLayerMap),(theme.externalLayers||[]).reduce(function(res,cur){res[cur.internalLayer]=_objectSpread({},themes.externalLayers.find(function(entry){return entry.name===cur.name}));LayerUtils.completeExternalLayer(res[cur.internalLayer],LayerUtils.searchSubLayer(theme,"name",cur.internalLayer));return res},{})),translations:theme.translations};layer=LayerUtils.recomputeLayerBBox(layer);// Drawing order only makes sense if layer reordering is disabled
11
11
  if(ConfigUtils.getConfigProp("allowReorderingLayers",theme)!==true){layer.drawingOrder=theme.drawingOrder}return layer},inheritBaseUrlParams:function inheritBaseUrlParams(capabilityUrl,baseUrl,baseParams){if(!capabilityUrl){return baseUrl}if(capabilityUrl.split("?")[0]===baseUrl.split("?")[0]){var parts=url.parse(capabilityUrl,true);parts.query=_objectSpread(_objectSpread({},baseParams),parts.query);return url.format(parts)}return capabilityUrl},searchThemes:function searchThemes(themes,searchtext){var filter=new RegExp(removeDiacritics(searchtext).replace(/[-[\]/{}()*+?.\\^$|]/g,"\\$&"),"i");var matches=[];var _searchThemeGroup=function searchThemeGroup(themeGroup){(themeGroup.subdirs||[]).forEach(function(subdir){return _searchThemeGroup(subdir,filter)});matches.push.apply(matches,_toConsumableArray((themeGroup.items||[]).filter(function(item){return removeDiacritics(item.title).match(filter)||removeDiacritics(item.keywords||"").match(filter)||removeDiacritics(item["abstract"]||"").match(filter)})))};_searchThemeGroup(themes,filter);return isEmpty(matches)?[]:[{id:"themes",titlemsgid:"search.themes",type:SearchResultType.THEME,items:matches.map(function(theme){return{id:theme.id,text:theme.title,theme:theme,layer:ThemeUtils.createThemeLayer(theme,themes),thumbnail:ConfigUtils.getAssetsPath()+"/"+theme.thumbnail}})}]},searchThemeLayers:function searchThemeLayers(themes,searchtext){var filter=new RegExp(removeDiacritics(searchtext).replace(/[-[\]/{}()*+?.\\^$|]/g,"\\$&"),"i");var matches=[];var _searchLayer=function searchLayer(theme,layer){var path=arguments.length>2&&arguments[2]!==undefined?arguments[2]:[];(layer.sublayers||[]).forEach(function(sublayer,idx){var subpath=[].concat(_toConsumableArray(path),[idx]);if(removeDiacritics(sublayer.name).match(filter)||removeDiacritics(sublayer.title).match(filter)){// Clone theme, ensuring path to layer is visible
12
- var newtheme=_objectSpread({},theme);var cur=newtheme;var _loop2=function _loop2(i){var isMutuallyExclusive=cur.mutuallyExclusive;cur.sublayers=cur.sublayers.map(function(entry,j){return _objectSpread(_objectSpread({},entry),{},{visibility:j===subpath[i]||entry.visibility&&!isMutuallyExclusive})});cur=cur.sublayers[subpath[i]]};for(var i=0;i<subpath.length;++i){_loop2(i)}matches.push({theme:newtheme,layer:ThemeUtils.createThemeLayer(newtheme,themes,LayerRole.USERLAYER,[cur])})}_searchLayer(theme,sublayer,subpath)})};var _searchThemeGroup2=function searchThemeGroup(themeGroup){(themeGroup.subdirs||[]).forEach(function(subdir){return _searchThemeGroup2(subdir,filter)});(themeGroup.items||[]).forEach(function(item){return _searchLayer(item,item)})};_searchThemeGroup2(themes,filter);return isEmpty(matches)?[]:[{id:"themelayers",titlemsgid:"search.themelayers",type:SearchResultType.THEMELAYER,items:matches.map(function(result){return{id:result.layer.id+":"+result.layer.sublayers[0].name,text:result.layer.title+": "+result.layer.sublayers[0].title,layer:result.layer,theme:result.theme}})}]},getThemeNames:function getThemeNames(themes){var names=(themes.items||[]).reduce(function(res,theme){return _objectSpread(_objectSpread({},res),{},_defineProperty({},theme.id,theme.title))},{});(themes.subdirs||[]).forEach(function(group){Object.assign(names,ThemeUtils.getThemeNames(group))});return names},themeFlagsAllowed:function themeFlagsAllowed(theme,flagWhitelist,flagBlacklist){var themeFlags=(theme===null||theme===void 0?void 0:theme.flags)||[];if(flagBlacklist&&flagBlacklist.find(function(flag){return themeFlags.includes(flag)})!==undefined){return false}if(flagWhitelist&&flagWhitelist.find(function(flag){return themeFlags.includes(flag)})===undefined){return false}return true},allowedItems:function allowedItems(items,theme){var filter=arguments.length>2&&arguments[2]!==undefined?arguments[2]:null;return(items||[]).map(function(item){if(item.subitems){var subitems=ThemeUtils.allowedItems(item.subitems,items,filter).filter(Boolean);if(!isEmpty(subitems)){return _objectSpread(_objectSpread({},item),{},{subitems:subitems})}else{return null}}else{if(filter&&!filter(item)){return null}if(theme){if(!ThemeUtils.themeFlagsAllowed(theme,item.themeFlagWhitelist,item.themeFlagBlacklist)){return null}if(item.themeBlacklist&&(item.themeBlacklist.includes(theme.title)||item.themeBlacklist.includes(theme.name))){return null}if(item.themeWhitelist&&!(item.themeWhitelist.includes(theme.title)||item.themeWhitelist.includes(theme.name))){return null}if(item.requireAuth&&!ConfigUtils.getConfigProp("username")){return null}}return item}}).filter(Boolean)},applyTranslations:function applyTranslations(group){return{subdirs:group.subdirs?group.subdirs.map(ThemeUtils.applyTranslations):null,items:group.items?group.items.map(function(item){var _item$translations$Lo,_item$translations;return _objectSpread(_objectSpread({},item),{},{title:(_item$translations$Lo=(_item$translations=item.translations)===null||_item$translations===void 0||(_item$translations=_item$translations[LocaleUtils.lang()])===null||_item$translations===void 0?void 0:_item$translations.title)!==null&&_item$translations$Lo!==void 0?_item$translations$Lo:item.title})}):null}}};export default ThemeUtils;
12
+ var newtheme=_objectSpread({},theme);var cur=newtheme;var _loop2=function _loop2(i){var isMutuallyExclusive=cur.mutuallyExclusive;cur.sublayers=cur.sublayers.map(function(entry,j){return _objectSpread(_objectSpread({},entry),{},{visibility:j===subpath[i]||entry.visibility&&!isMutuallyExclusive})});cur=cur.sublayers[subpath[i]]};for(var i=0;i<subpath.length;++i){_loop2(i)}matches.push({theme:newtheme,layer:ThemeUtils.createThemeLayer(newtheme,themes,LayerRole.USERLAYER,[cur])})}_searchLayer(theme,sublayer,subpath)})};var _searchThemeGroup2=function searchThemeGroup(themeGroup){(themeGroup.subdirs||[]).forEach(function(subdir){return _searchThemeGroup2(subdir,filter)});(themeGroup.items||[]).forEach(function(item){return _searchLayer(item,item)})};_searchThemeGroup2(themes,filter);return isEmpty(matches)?[]:[{id:"themelayers",titlemsgid:"search.themelayers",type:SearchResultType.THEMELAYER,items:matches.map(function(result){return{id:result.layer.id+":"+result.layer.sublayers[0].name,text:result.layer.title+": "+result.layer.sublayers[0].title,layer:result.layer,theme:result.theme}})}]},getThemeNames:function getThemeNames(themes){var names=(themes.items||[]).reduce(function(res,theme){return _objectSpread(_objectSpread({},res),{},_defineProperty({},theme.id,theme.title))},{});(themes.subdirs||[]).forEach(function(group){Object.assign(names,ThemeUtils.getThemeNames(group))});return names},themeFlagsAllowed:function themeFlagsAllowed(theme,flagWhitelist,flagBlacklist){var themeFlags=(theme===null||theme===void 0?void 0:theme.flags)||[];if(flagBlacklist&&flagBlacklist.find(function(flag){return themeFlags.includes(flag)})!==undefined){return false}if(flagWhitelist&&flagWhitelist.find(function(flag){return themeFlags.includes(flag)})===undefined){return false}return true},allowedItems:function allowedItems(items,theme){var filter=arguments.length>2&&arguments[2]!==undefined?arguments[2]:null;return(items||[]).map(function(item){if(item.subitems){var subitems=ThemeUtils.allowedItems(item.subitems,items,filter).filter(Boolean);if(!isEmpty(subitems)){return _objectSpread(_objectSpread({},item),{},{subitems:subitems})}else{return null}}else{if(filter&&!filter(item)){return null}if(theme){if(!ThemeUtils.themeFlagsAllowed(theme,item.themeFlagWhitelist,item.themeFlagBlacklist)){return null}if(item.themeBlacklist&&(item.themeBlacklist.includes(theme.title)||item.themeBlacklist.includes(theme.name))){return null}if(item.themeWhitelist&&!(item.themeWhitelist.includes(theme.title)||item.themeWhitelist.includes(theme.name))){return null}if(item.requireAuth&&!ConfigUtils.getConfigProp("username")){return null}}return item}}).filter(Boolean)},applyTranslations:function applyTranslations(group){return _objectSpread(_objectSpread({},group),{},{subdirs:group.subdirs?group.subdirs.map(ThemeUtils.applyTranslations):null,items:group.items?group.items.map(function(item){var _item$translations$th,_item$translations;return _objectSpread(_objectSpread({},LayerUtils.applyTranslations(item,item.translations)),{},{title:(_item$translations$th=(_item$translations=item.translations)===null||_item$translations===void 0||(_item$translations=_item$translations.theme)===null||_item$translations===void 0?void 0:_item$translations.title)!==null&&_item$translations$th!==void 0?_item$translations$th:item.title})}):null})}};export default ThemeUtils;