qwc2 2025.5.16 → 2025.5.21

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.
Files changed (55) hide show
  1. package/actions/layers.js +2 -2
  2. package/components/AttributeForm.js +1 -1
  3. package/components/AttributeTableWidget.js +2 -2
  4. package/components/EditComboField.js +4 -3
  5. package/components/IdentifyViewer.js +5 -7
  6. package/components/PickFeature.js +1 -1
  7. package/components/QtDesignerForm.js +2 -2
  8. package/components/SearchBox.js +1 -1
  9. package/components/map3d/Map3D.js +3 -3
  10. package/components/style/EditComboField.css +7 -0
  11. package/components/style/PluginsContainer.css +3 -2
  12. package/components/widgets/style/NumberInput.css +1 -1
  13. package/icons/clone.svg +63 -0
  14. package/package.json +1 -1
  15. package/plugins/BackgroundSwitcher.js +1 -1
  16. package/plugins/Cyclomedia.js +1 -1
  17. package/plugins/Editing.js +2 -2
  18. package/plugins/FeatureForm.js +1 -1
  19. package/plugins/Identify.js +2 -2
  20. package/plugins/LayerTree.js +3 -3
  21. package/plugins/Map.js +3 -3
  22. package/plugins/MapTip.js +1 -1
  23. package/plugins/Print.js +1 -1
  24. package/plugins/Reports.js +2 -2
  25. package/plugins/TimeManager.js +5 -5
  26. package/plugins/map/SnappingSupport.js +1 -1
  27. package/reducers/layers.js +6 -5
  28. package/static/translations/bg-BG.json +1 -1
  29. package/static/translations/ca-ES.json +1 -1
  30. package/static/translations/cs-CZ.json +1 -1
  31. package/static/translations/de-CH.json +1 -1
  32. package/static/translations/de-DE.json +1 -1
  33. package/static/translations/en-US.json +1 -1
  34. package/static/translations/es-ES.json +1 -1
  35. package/static/translations/fi-FI.json +1 -1
  36. package/static/translations/fr-FR.json +1 -1
  37. package/static/translations/hu-HU.json +1 -1
  38. package/static/translations/it-IT.json +1 -1
  39. package/static/translations/ja-JP.json +1 -1
  40. package/static/translations/nl-NL.json +1 -1
  41. package/static/translations/no-NO.json +1 -1
  42. package/static/translations/pl-PL.json +1 -1
  43. package/static/translations/pt-BR.json +1 -1
  44. package/static/translations/pt-PT.json +1 -1
  45. package/static/translations/ro-RO.json +1 -1
  46. package/static/translations/ru-RU.json +1 -1
  47. package/static/translations/sv-SE.json +1 -1
  48. package/static/translations/tr-TR.json +1 -1
  49. package/static/translations/tsconfig.json +1 -1
  50. package/utils/EditingUtils.js +4 -4
  51. package/utils/IdentifyUtils.js +3 -3
  52. package/utils/LayerUtils.js +10 -10
  53. package/utils/expr_grammar/grammar.js +1 -1
  54. package/utils/expr_grammar/grammar.ne +12 -1
  55. package/utils/expr_grammar/test.js +3 -2
@@ -7,7 +7,7 @@ function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof
7
7
  */import React from"react";import{connect}from"react-redux";import axios from"axios";import classnames from"classnames";import isEmpty from"lodash.isempty";import pointInPolygon from"point-in-polygon";import polygonIntersectTest from"polygon-intersect-test";import PropTypes from"prop-types";import{createSelector}from"reselect";import{v1 as uuidv1}from"uuid";import{LayerRole,addLayerFeatures,addThemeSublayer,changeLayerProperty,removeLayer,addLayer}from"../actions/layers";import{logAction}from"../actions/logging";import{panTo,zoomToExtent,zoomToPoint}from"../actions/map";import{setCurrentTask}from"../actions/task";import{setCurrentTheme}from"../actions/theme";import{openExternalUrl,showNotification}from"../actions/windows";import searchProvidersSelector from"../selectors/searchproviders";import ConfigUtils from"../utils/ConfigUtils";import CoordinatesUtils from"../utils/CoordinatesUtils";import LayerUtils from"../utils/LayerUtils";import LocaleUtils from"../utils/LocaleUtils";import MapUtils from"../utils/MapUtils";import MiscUtils from"../utils/MiscUtils";import{UrlParams}from"../utils/PermaLinkUtils";import{FulltextSearch,SearchResultType}from"../utils/SearchProviders";import VectorLayerUtils from"../utils/VectorLayerUtils";import Icon from"./Icon";import MapSelection from"./MapSelection";import ButtonBar from"./widgets/ButtonBar";import ComboBox from"./widgets/ComboBox";import InputContainer from"./widgets/InputContainer";import NumberInput from"./widgets/NumberInput";import Spinner from"./widgets/Spinner";import"./style/SearchBox.css";var SearchBox=/*#__PURE__*/function(_React$Component){function SearchBox(props){var _this;_classCallCheck(this,SearchBox);_this=_callSuper(this,SearchBox,[props]);_defineProperty(_this,"state",{searchText:"",searchSession:null,pendingSearches:[],recentSearches:[],searchResults:{},resultsVisible:false,collapsedSections:{},expandedLayerGroup:null,activeLayerInfo:null,filterOptionsVisible:false,selectedProvider:"",filterRegionName:"",filterGeomType:null,filterGeometry:null});_defineProperty(_this,"renderFilterOptions",function(){var _this$state$filterGeo;if(!_this.state.filterOptionsVisible){return null}var providerSelection=/*#__PURE__*/React.createElement(ComboBox,{onChange:function onChange(value){return _this.setState({selectedProvider:value})},value:_this.state.selectedProvider},/*#__PURE__*/React.createElement("div",{value:""},LocaleUtils.tr("search.all")),Object.entries(_this.props.searchProviders).map(function(_ref){var _prov$params,_prov$label;var _ref2=_slicedToArray(_ref,2),key=_ref2[0],prov=_ref2[1];return/*#__PURE__*/React.createElement("div",{key:key,value:key},(prov===null||prov===void 0||(_prov$params=prov.params)===null||_prov$params===void 0?void 0:_prov$params.title)||((_prov$label=prov.label)!==null&&_prov$label!==void 0?_prov$label:LocaleUtils.tr(prov.labelmsgid)))}));var searchRegionSelection=null;var searchRegions=ConfigUtils.getConfigProp("searchFilterRegions",_this.props.theme);if(!isEmpty(searchRegions)){searchRegionSelection=/*#__PURE__*/React.createElement(ComboBox,{onChange:function onChange(value){return _this.setFilterRegion(value,searchRegions)},value:_this.state.filterRegionName},/*#__PURE__*/React.createElement("div",{value:""},LocaleUtils.tr("search.none")),searchRegions.map(function(group,gidx){return[/*#__PURE__*/React.createElement("div",{"data-group-header":gidx,disabled:true,key:"group"+gidx},group.name)].concat(_toConsumableArray(group.items.map(function(item,idx){return/*#__PURE__*/React.createElement("div",{"data-group":gidx,key:item.name,value:gidx+":"+idx+":"+item.name},item.name)})))}))}var filterButtons=[{key:"Polygon",tooltip:LocaleUtils.tr("redlining.polygon"),icon:"polygon",label:LocaleUtils.tr("redlining.polygon")},{key:"Circle",tooltip:LocaleUtils.tr("redlining.circle"),icon:"circle",label:LocaleUtils.tr("redlining.circle")}];return/*#__PURE__*/React.createElement("div",{className:"searchbox-filter-options"},/*#__PURE__*/React.createElement("table",null,/*#__PURE__*/React.createElement("tbody",null,/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",null,LocaleUtils.tr("search.providerselection"),":"),/*#__PURE__*/React.createElement("td",null,providerSelection)),/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",null,LocaleUtils.tr("search.limittoarea"),":"),/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement("div",{className:"searchbox-filter-options-geometry controlgroup"},/*#__PURE__*/React.createElement(ButtonBar,{active:_this.state.filterGeomType,buttons:filterButtons,onClick:_this.setFilterGeomType}),searchRegionSelection,/*#__PURE__*/React.createElement("button",{className:"button",onClick:_this.clearFilter,title:LocaleUtils.tr("search.clearfilter")},/*#__PURE__*/React.createElement(Icon,{icon:"clear"}))))),_this.state.filterGeomType==="Circle"?/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",null,LocaleUtils.tr("search.circleradius"),":"),/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement(NumberInput,{disabled:!_this.state.filterGeometry,min:1,mobile:true,onChange:_this.setCircleRadius,suffix:" m",value:((_this$state$filterGeo=_this.state.filterGeometry)===null||_this$state$filterGeo===void 0?void 0:_this$state$filterGeo.radius)||0}))):null)))});_defineProperty(_this,"setFilterGeomType",function(geomType){_this.setState({filterGeomType:geomType,filterRegionName:"",filterGeometry:null})});_defineProperty(_this,"setFilterRegion",function(value,searchRegions){if(value){var parts=value.split(":");var item=searchRegions[parts[0]].items[parts[1]];var geometry={type:"Polygon",coordinates:[item.coordinates]};var mapGeometry=VectorLayerUtils.reprojectGeometry(geometry,item.crs,_this.props.map.projection);_this.setState({filterGeomType:null,filterRegionName:value,filterGeometry:mapGeometry})}else{_this.setState({filterGeomType:null,filterRegionName:"",filterGeometry:null})}});_defineProperty(_this,"setCircleRadius",function(value){_this.setState(function(state){return{filterGeometry:_objectSpread(_objectSpread({},state.filterGeometry),{},{radius:value})}})});_defineProperty(_this,"clearFilter",function(){_this.setState({filterGeomType:null,filterRegionName:"",filterGeometry:null})});_defineProperty(_this,"renderResultsMenu",function(){if(!_this.state.resultsVisible){return false}var children=[_this.renderRecentResults(),_this.renderFilters(),_this.renderResults()];children=children.filter(function(child){return!isEmpty(child)});if(isEmpty(children)){if(isEmpty(_this.state.pendingSearches)&&_this.state.searchResults.query_text){children=/*#__PURE__*/React.createElement("div",{className:"searchbox-noresults"},LocaleUtils.tr("search.noresults"))}else{return null}}return/*#__PURE__*/React.createElement("div",{className:"searchbox-results",onMouseDown:_this.setPreventBlur,ref:MiscUtils.setupKillTouchEvents},children)});_defineProperty(_this,"renderRecentResults",function(){var recentSearches=_this.state.recentSearches.filter(function(entry){return entry.toLowerCase().includes(_this.state.searchText.toLowerCase())});if(isEmpty(recentSearches)||recentSearches.length===1&&recentSearches[0].toLowerCase()===_this.state.searchText.toLowerCase()){return null}return/*#__PURE__*/React.createElement("div",{key:"recent"},/*#__PURE__*/React.createElement("div",{className:"searchbox-results-section-title",onClick:function onClick(){return _this.toggleSection("recent")},onMouseDown:MiscUtils.killEvent},/*#__PURE__*/React.createElement(Icon,{icon:_this.isCollapsed("recent")?"expand":"collapse"}),LocaleUtils.tr("search.recent")),!_this.isCollapsed("recent")?/*#__PURE__*/React.createElement("div",{className:"searchbox-results-section-body"},recentSearches.map(function(entry,idx){return/*#__PURE__*/React.createElement("div",{className:"searchbox-result",key:"r"+idx,onClick:function onClick(){return _this.searchTextChanged(entry)},onMouseDown:MiscUtils.killEvent},entry)})):null)});_defineProperty(_this,"renderFilters",function(){return Object.entries(_this.state.searchResults).map(function(_ref3){var _ref4=_slicedToArray(_ref3,2),provider=_ref4[0],results=_ref4[1];if(isEmpty(results.result_counts)||results.result_counts.length<2){return null}var collapsed=_this.isCollapsed("filter",false);var values=results.result_counts.map(function(entry){return entry.filterword+": "+_this.state.searchResults.query_text});values.sort(function(a,b){return a.localeCompare(b)});return/*#__PURE__*/React.createElement("div",{key:"filter"},/*#__PURE__*/React.createElement("div",{className:"searchbox-results-section-title",onClick:function onClick(){return _this.toggleSection("filter")},onMouseDown:MiscUtils.killEvent},/*#__PURE__*/React.createElement(Icon,{icon:collapsed?"expand":"collapse"}),LocaleUtils.tr("search.filter")),!collapsed?/*#__PURE__*/React.createElement("div",{className:"searchbox-results-section-body"},values.map(function(value,idx){return/*#__PURE__*/React.createElement("div",{className:"searchbox-result",key:"f"+idx,onClick:function onClick(){return _this.searchTextChanged(value,true,provider)},onMouseDown:MiscUtils.killEvent},/*#__PURE__*/React.createElement("span",{className:"searchbox-result-label"},value))})):null)}).filter(Boolean)});_defineProperty(_this,"renderResults",function(){var resultRenderers=_defineProperty(_defineProperty(_defineProperty({},SearchResultType.PLACE,_this.renderPlaceResult),SearchResultType.THEMELAYER,_this.renderThemeLayerResult),SearchResultType.THEME,_this.renderThemeResult);var layersBeforePlaces=_this.props.searchOptions.showLayerResultsBeforePlaces;var priorities=_defineProperty(_defineProperty(_defineProperty({},SearchResultType.PLACE,layersBeforePlaces?0:2),SearchResultType.THEMELAYER,layersBeforePlaces?2:1),SearchResultType.THEME,layersBeforePlaces?1:0);var results=Object.keys(_this.props.searchProviders).reduce(function(result,provider){if(!_this.state.searchResults[provider]){return result}return result.concat(_this.state.searchResults[provider].results.map(function(group){var _group$type,_group$type2,_group$title,_group$title2;var sectionId=provider+":"+group.id;var moreLabel=null;if(group.resultCount>0&&group.resultCount>group.items.length){moreLabel=LocaleUtils.tr("search.more",group.resultCount-group.items.length)}else if(group.resultCount===-1){moreLabel=LocaleUtils.tr("search.unknownmore")}if(group.items.length===0){return null}var renderer=resultRenderers[(_group$type=group.type)!==null&&_group$type!==void 0?_group$type:SearchResultType.PLACE];if(!renderer){return null}var priority=priorities[(_group$type2=group.type)!==null&&_group$type2!==void 0?_group$type2:SearchResultType.PLACE];return{priority:priority*1000000+(group.priority||0),title:(_group$title=group.title)!==null&&_group$title!==void 0?_group$title:LocaleUtils.tr(group.titlemsgid),tree:/*#__PURE__*/React.createElement("div",{key:sectionId},/*#__PURE__*/React.createElement("div",{className:"searchbox-results-section-title",onClick:function onClick(){return _this.toggleSection(sectionId)},onMouseDown:MiscUtils.killEvent},/*#__PURE__*/React.createElement(Icon,{icon:_this.isCollapsed(sectionId)?"expand":"collapse"}),/*#__PURE__*/React.createElement("span",null,(_group$title2=group.title)!==null&&_group$title2!==void 0?_group$title2:LocaleUtils.tr(group.titlemsgid))),!_this.isCollapsed(sectionId)?/*#__PURE__*/React.createElement("div",{className:"searchbox-results-section-body"},group.items.map(function(entry){return renderer(provider,group,entry)}),moreLabel?/*#__PURE__*/React.createElement("div",{className:"searchbox-more-results"},moreLabel):null):null)}}))},[]).filter(Boolean);results.sort(function(a,b){if(b.priority!==a.priority){return b.priority-a.priority}else{return b.title.localeCompare(a.title)}});return isEmpty(results)?null:results.map(function(entry){return entry.tree})});_defineProperty(_this,"renderPlaceResult",function(provider,group,result){var _result$label;var key=provider+":"+group.id+":"+result.id;return/*#__PURE__*/React.createElement("div",{className:"searchbox-result",key:key,onClick:function onClick(){_this.selectPlaceResult(provider,group,result);_this.blur()},onMouseDown:MiscUtils.killEvent},result.thumbnail?/*#__PURE__*/React.createElement("img",{className:"searchbox-result-thumbnail",onError:function onError(ev){return _this.loadFallbackResultImage(ev,result)},src:result.thumbnail}):null,/*#__PURE__*/React.createElement("span",{className:"searchbox-result-label",dangerouslySetInnerHTML:{__html:result.text.replace(/<br\s*\/>/ig," ")},title:(_result$label=result.label)!==null&&_result$label!==void 0?_result$label:result.text}),result.externalLink?/*#__PURE__*/React.createElement(Icon,{icon:"info-sign",onClick:function onClick(ev){var _result$label2;MiscUtils.killEvent(ev);_this.openUrl(result.externalLink,result.target,(_result$label2=result.label)!==null&&_result$label2!==void 0?_result$label2:result.text)}}):null)});_defineProperty(_this,"renderThemeLayerResult",function(provider,group,result){var _result$label3,_result$layer;var parent=arguments.length>3&&arguments[3]!==undefined?arguments[3]:null;var key=provider+":"+group.id+":"+result.id;var addThemes=ConfigUtils.getConfigProp("allowAddingOtherThemes",_this.props.theme);var icon=null;if(result.sublayers){var toggleLayerGroup=function toggleLayerGroup(){_this.setState(function(state){return{expandedLayerGroup:state.expandedLayerGroup===key?null:key}})};icon=/*#__PURE__*/React.createElement(Icon,{className:"searchbox-result-thumbnail",icon:_this.state.expandedLayerGroup===key?"minus":"plus",onClick:function onClick(ev){MiscUtils.killEvent(ev);toggleLayerGroup()}})}else if(result.thumbnail){icon=/*#__PURE__*/React.createElement("img",{className:"searchbox-result-thumbnail",onError:function onError(ev){return _this.loadFallbackResultImage(ev,result)},src:result.thumbnail})}var selectResult=result.theme?_this.selectThemeResult:_this.selectThemeLayerResult;return/*#__PURE__*/React.createElement("div",{key:key},/*#__PURE__*/React.createElement("div",{className:"searchbox-result",onClick:function onClick(){selectResult(provider,group,result);_this.blur()},onMouseDown:MiscUtils.killEvent},icon,result.theme?/*#__PURE__*/React.createElement(Icon,{className:"searchbox-result-openicon",icon:"open"}):null,/*#__PURE__*/React.createElement("span",{className:"searchbox-result-label",dangerouslySetInnerHTML:{__html:result.text.replace(/<br\s*\/>/ig," ")},title:(_result$label3=result.label)!==null&&_result$label3!==void 0?_result$label3:result.text}),result.theme&&addThemes?/*#__PURE__*/React.createElement(Icon,{icon:"plus",onClick:function onClick(ev){MiscUtils.killEvent(ev);_this.selectThemeLayerResult(provider,group,result);_this.blur()},title:LocaleUtils.tr("themeswitcher.addtotheme")}):null,result.info?/*#__PURE__*/React.createElement(Icon,{icon:"info-sign",onClick:function onClick(ev){MiscUtils.killEvent(ev);_this.toggleLayerInfo(provider,group,result,key,parent)}}):null),_this.state.activeLayerInfo===key?/*#__PURE__*/React.createElement("div",{className:"searchbox-result-abstract",dangerouslySetInnerHTML:{__html:MiscUtils.addLinkAnchors(((_result$layer=result.layer)===null||_result$layer===void 0?void 0:_result$layer["abstract"])||"")||LocaleUtils.tr("search.nodescription")}}):null,_this.state.expandedLayerGroup===key?/*#__PURE__*/React.createElement("div",{className:"searchbox-result-group"},result.sublayers.map(function(sublayer){return _this.renderThemeLayerResult(provider,group,sublayer,result.id)})):null)});_defineProperty(_this,"renderThemeResult",function(provider,group,result){var _result$label4;var addThemes=ConfigUtils.getConfigProp("allowAddingOtherThemes",_this.props.theme);return/*#__PURE__*/React.createElement("div",{className:"searchbox-result",key:provider+":"+group.id+":"+result.id,onClick:function onClick(){_this.selectThemeResult(provider,group,result);_this.blur()},onMouseDown:MiscUtils.killEvent},result.thumbnail?/*#__PURE__*/React.createElement("img",{className:"searchbox-result-thumbnail",onError:function onError(ev){return _this.loadFallbackResultImage(ev,result)},src:result.thumbnail}):null,/*#__PURE__*/React.createElement(Icon,{className:"searchbox-result-openicon",icon:"open"}),/*#__PURE__*/React.createElement("span",{className:"searchbox-result-label",dangerouslySetInnerHTML:{__html:result.text.replace(/<br\s*\/>/ig," ")},title:(_result$label4=result.label)!==null&&_result$label4!==void 0?_result$label4:result.text}),result.theme&&addThemes?/*#__PURE__*/React.createElement(Icon,{icon:"plus",onClick:function onClick(ev){MiscUtils.killEvent(ev);_this.addThemeLayers(result.layer);_this.blur()},title:LocaleUtils.tr("themeswitcher.addtotheme")}):null)});_defineProperty(_this,"selectPlaceResult",function(provider,group,result){var resultText=result.text.replace(/<\/?\w+\s*\/?>/g,"");if(_this.props.searchOptions.showResultInSearchText!==false){// Show selected result text in search field
8
8
  _this.setState({searchText:resultText,searchResults:_defineProperty({query_text:resultText},provider,{results:[_objectSpread(_objectSpread({},group),{},{items:[result]})],tot_result_count:1})})}_this.updateRecentSearches();if(_this.props.searchProviders[provider].getResultGeometry){_this.props.searchProviders[provider].getResultGeometry(result,function(response){_this.showResultGeometry(result,response)},axios)}else{// Display marker
9
9
  _this.showResultGeometry(result,{feature:{type:"Feature",geometry:{type:"Point",coordinates:[result.x,result.y]}},crs:result.crs})}if(result.dataproduct_id){var quot=typeof result.id==="string"?"\"":"";var filter="[[\"".concat(result.id_field_name,"\",\"=\", ").concat(quot).concat(result.id).concat(quot,"]]");UrlParams.updateParams({hp:result.dataproduct_id,hf:filter,st:resultText})}else{UrlParams.updateParams({hp:undefined,hf:undefined,st:resultText})}_this.props.logAction("SEARCH_TEXT",{searchText:_this.state.searchText});_this.props.logAction("SEARCH_RESULT_SELECTED",{place:resultText});// Enable layer
10
- if(result.layername){var path=[];var sublayer=null;var layer=_this.props.layers.find(function(l){return l.role===LayerRole.THEME&&(sublayer=LayerUtils.searchSubLayer(l,"name",result.layername,path))});if(layer&&sublayer){_this.props.changeLayerProperty(layer.uuid,"visibility",true,path)}}});_defineProperty(_this,"selectThemeLayerResult",function(provider,group,result){if(result.layer){if(result.theme){_this.addThemeLayers(result.layer)}else{_this.props.addThemeSublayer(result.layer)}// Show layer tree to notify user that something has happened
10
+ if(result.layername){var path=[];var sublayer=null;var layer=_this.props.layers.find(function(l){return l.role===LayerRole.THEME&&(sublayer=LayerUtils.searchSubLayer(l,"name",result.layername,path))});if(layer&&sublayer){_this.props.changeLayerProperty(layer.id,"visibility",true,path)}}});_defineProperty(_this,"selectThemeLayerResult",function(provider,group,result){if(result.layer){if(result.theme){_this.addThemeLayers(result.layer)}else{_this.props.addThemeSublayer(result.layer)}// Show layer tree to notify user that something has happened
11
11
  _this.props.setCurrentTask("LayerTree")}else if(_this.props.searchProviders[provider].getLayerDefinition){_this.props.searchProviders[provider].getLayerDefinition(result,function(layer){if(layer){if(result.theme){_this.addThemeLayers(layer)}else{_this.props.addThemeSublayer({sublayers:[layer]})}// Show layer tree to notify user that something has happened
12
12
  _this.props.setCurrentTask("LayerTree")}},axios)}});_defineProperty(_this,"selectThemeResult",function(provider,group,result){_this.props.setCurrentTheme(result.theme,_this.props.themes);if(_this.props.searchOptions.showLayerAfterChangeTheme){_this.props.setCurrentTask("LayerTree")}});_defineProperty(_this,"loadFallbackResultImage",function(ev,item){var _item$type;if(((_item$type=item.type)!==null&&_item$type!==void 0?_item$type:SearchResultType.PLACE)===SearchResultType.PLACE){var iconPath=ConfigUtils.getAssetsPath()+"/img/search/";if(!ev.target.src.endsWith(iconPath+"feature.svg")){ev.target.src=iconPath+"feature.svg"}}});_defineProperty(_this,"toggleLayerInfo",function(provider,group,result,key,parent){var setResultLayerAndActiveInfo=function setResultLayerAndActiveInfo(layer){// Embed returned layer into result item, so that layer info is read from item.layer.abstract
13
13
  _this.setState(function(state){return{searchResults:_objectSpread(_objectSpread({},state.searchResults),{},_defineProperty({},provider,_objectSpread(_objectSpread({},state.searchResults[provider]),{},{results:state.searchResults[provider].results.map(function(g){if(g.id===group.id){return _objectSpread(_objectSpread({},g),{},{items:g.items.map(function(item){if(item.id===result.id){return _objectSpread(_objectSpread({},item),{},{layer:layer})}else if(item.id===parent){return _objectSpread(_objectSpread({},item),{},{sublayers:item.sublayers.map(function(sublayer){if(sublayer.id===result.id){return _objectSpread(_objectSpread({},sublayer),{},{layer:layer})}else{return sublayer}})})}else{return item}})})}else{return g}})}))),activeLayerInfo:key}})};_this.setState(function(state){if(state.activeLayerInfo===key){return{activeLayerInfo:null}}else{if(!result.layer&&_this.props.searchProviders[provider].getLayerDefinition){_this.props.searchProviders[provider].getLayerDefinition(result,setResultLayerAndActiveInfo,axios);return{}}else{return{activeLayerInfo:key}}}})});_defineProperty(_this,"setPreventBlur",function(){_this.preventBlur=true;setTimeout(function(){_this.preventBlur=false;return false},100)});_defineProperty(_this,"toggleSection",function(key){return _this.setState(function(state){var _newCollapsedSections;var newCollapsedSections=_objectSpread({},state.collapsedSections);var deflt=_this.props.searchOptions.sectionsDefaultCollapsed||false;newCollapsedSections[key]=!((_newCollapsedSections=newCollapsedSections[key])!==null&&_newCollapsedSections!==void 0?_newCollapsedSections:deflt);return{collapsedSections:newCollapsedSections}})});_defineProperty(_this,"isCollapsed",function(section){var _this$state$collapsed;var deflt=arguments.length>1&&arguments[1]!==undefined?arguments[1]:null;deflt=deflt!==null&&deflt!==void 0?deflt:_this.props.searchOptions.sectionsDefaultCollapsed||false;return(_this$state$collapsed=_this.state.collapsedSections[section])!==null&&_this$state$collapsed!==void 0?_this$state$collapsed:deflt});_defineProperty(_this,"toggleFilterOptions",function(visible){_this.setState({filterOptionsVisible:visible})});_defineProperty(_this,"searchTextChanged",function(text){var expandSections=arguments.length>1&&arguments[1]!==undefined?arguments[1]:false;var provider=arguments.length>2&&arguments[2]!==undefined?arguments[2]:null;if(_this.props.layers.find(function(layer){return layer.id==="searchselection"})){_this.props.removeLayer("searchselection")}var newState={searchText:text,expandedLayerGroup:null,activeLayerInfo:null,pendingSearches:[],searchSession:null};if(expandSections){newState.collapsedSections={}}_this.setState(newState);clearTimeout(_this.searchTimeout);_this.searchTimeout=setTimeout(function(){return _this.startSearch(provider)},250)});_defineProperty(_this,"onFocus",function(){_this.setState({resultsVisible:true});if(_this.searchBox){_this.searchBox.select()}if(isEmpty(_this.state.searchResults)&&_this.props.theme){_this.startSearch()}if(_this.props.searchOptions.allowSearchFilters){_this.toggleFilterOptions(false)}});_defineProperty(_this,"onBlur",function(){if(_this.preventBlur&&_this.searchBox){_this.searchBox.focus()}else{_this.setState({resultsVisible:false,collapsedSections:{},expandedLayerGroup:null,activeLayerInfo:null})}});_defineProperty(_this,"clear",function(){_this.blur();_this.setState({searchText:"",searchResults:{},selectedProvider:"",filterRegionName:"",filterGeometry:null});_this.props.removeLayer("searchselection");UrlParams.updateParams({hp:undefined,hf:undefined,st:undefined})});_defineProperty(_this,"startSearch",function(){var _this$state$filterGeo2;var provider=arguments.length>0&&arguments[0]!==undefined?arguments[0]:null;var uniquePlaceResult=arguments.length>1&&arguments[1]!==undefined?arguments[1]:false;var availableProviders=_this.props.searchProviders;var selectedProvider=provider!==null&&provider!==void 0?provider:_this.state.selectedProvider;if(selectedProvider){availableProviders=_defineProperty({},selectedProvider,_this.props.searchProviders[selectedProvider])}// eslint-disable-next-line
@@ -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{connect}from"react-redux";import Instance from"@giro3d/giro3d/core/Instance.js";import Coordinates from"@giro3d/giro3d/core/geographic/Coordinates";import Extent from"@giro3d/giro3d/core/geographic/Extent.js";import ElevationLayer from"@giro3d/giro3d/core/layer/ElevationLayer.js";import FeatureCollection from"@giro3d/giro3d/entities/FeatureCollection.js";import Map from"@giro3d/giro3d/entities/Map.js";import Tiles3D from"@giro3d/giro3d/entities/Tiles3D.js";import Inspector from"@giro3d/giro3d/gui/Inspector.js";import GeoTIFFSource from"@giro3d/giro3d/sources/GeoTIFFSource.js";import axios from"axios";import{fromUrl}from"geotiff";import isEmpty from"lodash.isempty";import PropTypes from"prop-types";import{Vector2,CubeTextureLoader,Group,Raycaster,Mesh}from"three";import{GLTFExporter}from"three/addons/exporters/GLTFExporter.js";import{GLTFLoader}from"three/addons/loaders/GLTFLoader";import{CSS2DObject}from"three/addons/renderers/CSS2DRenderer";import{v4 as uuidv4}from"uuid";import{LayerRole}from"../../actions/layers";import{setCurrentTask}from"../../actions/task";import{BackgroundSwitcher}from"../../plugins/BackgroundSwitcher";import ConfigUtils from"../../utils/ConfigUtils";import CoordinatesUtils from"../../utils/CoordinatesUtils";import MiscUtils from"../../utils/MiscUtils";import{registerPermalinkDataStoreHook,unregisterPermalinkDataStoreHook,UrlParams}from"../../utils/PermaLinkUtils";import BottomBar3D from"./BottomBar3D";import Compare3D from"./Compare3D";import Draw3D from"./Draw3D";import ExportObjects3D from"./ExportObjects3D";import HideObjects3D from"./HideObjects3D";import Identify3D from"./Identify3D";import LayerTree3D from"./LayerTree3D";import Map3DLight from"./Map3DLight";import MapControls3D from"./MapControls3D";import MapExport3D from"./MapExport3D";import Measure3D from"./Measure3D";import OverviewMap3D from"./OverviewMap3D";import TopBar3D from"./TopBar3D";import View3DSwitcher from"./View3DSwitcher";import LayerRegistry from"./layers/index";import Tiles3DStyle from"./utils/Tiles3DStyle";import"./style/Map3D.css";var UnloadWrapper=/*#__PURE__*/function(_React$Component){function UnloadWrapper(){var _this;_classCallCheck(this,UnloadWrapper);for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++){args[_key]=arguments[_key]}_this=_callSuper(this,UnloadWrapper,[].concat(args));_defineProperty(_this,"onUnload",function(el){if(!el){_this.props.onUnload(_this.props.sceneId)}});return _this}_inherits(UnloadWrapper,_React$Component);return _createClass(UnloadWrapper,[{key:"render",value:function render(){return/*#__PURE__*/React.createElement("div",null,this.props.children,/*#__PURE__*/React.createElement("span",{ref:this.onUnload}))}}])}(React.Component);_defineProperty(UnloadWrapper,"propTypes",{children:PropTypes.oneOfType([PropTypes.node,PropTypes.func]),onUnload:PropTypes.func,sceneId:PropTypes.string});var Map3D=/*#__PURE__*/function(_React$Component2){function Map3D(props){var _this2;_classCallCheck(this,Map3D);_this2=_callSuper(this,Map3D,[props]);_defineProperty(_this2,"state",{sceneContext:_objectSpread(_objectSpread({},Map3D.defaultSceneState),{},{addLayer:function addLayer(layer){},getLayer:function getLayer(layerId){},removeLayer:function removeLayer(layerId){},updateColorLayer:function updateColorLayer(layerId,options){},addSceneObject:function addSceneObject(objectId,object){var options=arguments.length>2&&arguments[2]!==undefined?arguments[2]:{}},getSceneObject:function getSceneObject(objectId){},removeSceneObject:function removeSceneObject(objectId){},updateSceneObject:function updateSceneObject(objectId,options){},updateObjectLabel:function updateObjectLabel(object){},getMap:function getMap(){},setViewToExtent:function setViewToExtent(bounds,angle){},getTerrainHeightFromDTM:function getTerrainHeightFromDTM(scenePos){},getTerrainHeightFromMap:function getTerrainHeightFromMap(scenePos){},getSceneIntersection:function getSceneIntersection(x,y){}}),sceneId:null});_defineProperty(_this2,"applyBaseLayer",function(){var baseLayer=_this2.state.sceneContext.baseLayers.find(function(e){return e.visibility===true});_this2.removeLayer("__baselayer");if(!baseLayer){return}var layerCreator=LayerRegistry[baseLayer.type];if(layerCreator!==null&&layerCreator!==void 0&&layerCreator.create3d){var layer3d=layerCreator.create3d(baseLayer,_this2.state.sceneContext.mapCrs);_this2.addLayer("__baselayer",layer3d);_this2.map.insertLayerAfter(layer3d,null)}});_defineProperty(_this2,"setBaseLayer",function(layer,visibility){_this2.setState(function(state){return{sceneContext:_objectSpread(_objectSpread({},state.sceneContext),{},{baseLayers:state.sceneContext.baseLayers.map(function(entry){return _objectSpread(_objectSpread({},entry),{},{visibility:entry.name===layer.name?visibility:false})})})}})});_defineProperty(_this2,"collectColorLayers",function(prevColorLayers){return _this2.props.layers.reduce(function(colorLayers,layer){var _prevOptions$visibili,_prevOptions$opacity,_prevOptions$extrusio,_prevOptions$fields;if(layer.role!==LayerRole.THEME&&layer.role!==LayerRole.USERLAYER){return colorLayers}var layerCreator=LayerRegistry[layer.type];if(!layerCreator||!layerCreator.create3d){return colorLayers}var prevOptions=prevColorLayers[layer.uuid];colorLayers[layer.uuid]=_objectSpread(_objectSpread({},layer),{},{visibility:(_prevOptions$visibili=prevOptions===null||prevOptions===void 0?void 0:prevOptions.visibility)!==null&&_prevOptions$visibili!==void 0?_prevOptions$visibili:false,opacity:(_prevOptions$opacity=prevOptions===null||prevOptions===void 0?void 0:prevOptions.opacity)!==null&&_prevOptions$opacity!==void 0?_prevOptions$opacity:255,extrusionHeight:(_prevOptions$extrusio=prevOptions===null||prevOptions===void 0?void 0:prevOptions.extrusionHeight)!==null&&_prevOptions$extrusio!==void 0?_prevOptions$extrusio:["vector","wfs"].includes(layer.type)?0:undefined,fields:(_prevOptions$fields=prevOptions===null||prevOptions===void 0?void 0:prevOptions.fields)!==null&&_prevOptions$fields!==void 0?_prevOptions$fields:undefined});if(colorLayers[layer.uuid].fields===undefined&&layerCreator.getFields){layerCreator.getFields(layer).then(function(fields){_this2.updateColorLayer(layer.uuid,{fields:fields})})}return colorLayers},{})});_defineProperty(_this2,"applyColorLayerUpdates",function(colorLayers,prevColorLayers){// Add-update new layers
8
- var layerBelow=_this2.getLayer("__baselayer");Object.entries(colorLayers).reverse().forEach(function(_ref){var _ref2=_slicedToArray(_ref,2),layerId=_ref2[0],options=_ref2[1];var prevOptions=prevColorLayers[layerId];var layerCreator=LayerRegistry[options.type];var mapLayer=_this2.getLayer(layerId);if(mapLayer){layerCreator.update3d(mapLayer.source,options,prevOptions,_this2.state.sceneContext.mapCrs)}else{mapLayer=layerCreator.create3d(options,_this2.state.sceneContext.mapCrs);_this2.addLayer(layerId,mapLayer)}_this2.map.insertLayerAfter(mapLayer,layerBelow);mapLayer.visible=options.visibility;mapLayer.opacity=options.opacity/255;layerBelow=mapLayer;if(options.extrusionHeight!==0){_this2.createUpdateExtrudedLayer(mapLayer,options,options.features!==(prevOptions===null||prevOptions===void 0?void 0:prevOptions.features))}else if((prevOptions===null||prevOptions===void 0?void 0:prevOptions.extrusionHeight)!==0){_this2.removeExtrudedLayer(options.uuid)}});// Remove old layers
9
- Object.entries(prevColorLayers).forEach(function(_ref3){var _ref4=_slicedToArray(_ref3,2),layerId=_ref4[0],options=_ref4[1];if(!(layerId in colorLayers)){if(options.extrusionHeight!==0){_this2.removeExtrudedLayer(options.uuid)}_this2.removeLayer(layerId)}});_this2.instance.notifyChange(_this2.map)});_defineProperty(_this2,"createUpdateExtrudedLayer",function(mapLayer,options){var _options$features,_options$features$red;var forceCreate=arguments.length>2&&arguments[2]!==undefined?arguments[2]:false;var bounds=options.bbox.bounds;var extent=new Extent(options.bbox.crs,bounds[0],bounds[2],bounds[1],bounds[3]);var objId=options.uuid+":extruded";var makeColor=function makeColor(c){if(Array.isArray(c)){return c[0]<<16|c[1]<<8|c[2]}else if(typeof c==="string"){return parseInt(c.replace("#",""),16)}else{return c}};var obj=_this2.objectMap[objId];if(!obj||forceCreate){var _options$color;if(obj){_this2.instance.remove(obj)}var layercolor=makeColor((_options$color=options.color)!==null&&_options$color!==void 0?_options$color:"#FF0000");obj=new FeatureCollection({source:mapLayer.source.source,extent:extent,minLevel:1,maxLevel:1,ignoreZ:true,elevation:function elevation(feature){var _this2$getTerrainHeig;var coordinates=feature.getGeometry().getCoordinates();while(Array.isArray(coordinates[0])){coordinates=coordinates[0]}return(_this2$getTerrainHeig=_this2.getTerrainHeightFromMap(coordinates))!==null&&_this2$getTerrainHeig!==void 0?_this2$getTerrainHeig:0},extrusionOffset:function extrusionOffset(feature){if(typeof obj.userData.extrusionHeight==="string"){return parseFloat(feature.getProperties()[obj.userData.extrusionHeight])||0}else{return obj.userData.extrusionHeight}},style:function style(feature){var _obj$userData$feature,_obj$userData$feature2;return(_obj$userData$feature=(_obj$userData$feature2=obj.userData.featureStyles)===null||_obj$userData$feature2===void 0?void 0:_obj$userData$feature2[feature.getId()])!==null&&_obj$userData$feature!==void 0?_obj$userData$feature:{fill:{color:layercolor,shading:true}}}});obj.castShadow=true;obj.receiveShadow=true;_this2.instance.add(obj);_this2.objectMap[objId]=obj}obj.userData.extrusionHeight=options.extrusionHeight;obj.userData.featureStyles=(_options$features=options.features)===null||_options$features===void 0||(_options$features$red=_options$features.reduce)===null||_options$features$red===void 0?void 0:_options$features$red.call(_options$features,function(res,feature){return _objectSpread(_objectSpread({},res),{},_defineProperty({},feature.id,{fill:{color:makeColor(feature.styleOptions.fillColor),shading:true}}))},{});obj.opacity=mapLayer.opacity;obj.visible=mapLayer.visible;obj.updateStyles()});_defineProperty(_this2,"removeExtrudedLayer",function(layerId){var objId=layerId+":extruded";if(_this2.objectMap[objId]){_this2.instance.remove(_this2.objectMap[objId]);delete _this2.objectMap[objId]}_this2.instance.notifyChange()});_defineProperty(_this2,"applySceneObjectUpdates",function(sceneObjects){Object.entries(sceneObjects).forEach(function(_ref5){var _ref6=_slicedToArray(_ref5,2),objectId=_ref6[0],options=_ref6[1];var object=_this2.objectMap[objectId];object.visible=options.visibility&&options.opacity>0;if(object.opacity!==undefined){object.opacity=options.opacity/255}else{object.traverse(function(child){if(child instanceof Mesh){child.material.transparent=options.opacity<255;child.material.opacity=options.opacity/255;child.material.needsUpdate=true}})}_this2.instance.notifyChange(object)})});_defineProperty(_this2,"updateObjectLabel",function(sceneObject){var labelObject=sceneObject.children.find(function(child){return child.isCSS2DObject});if(sceneObject.userData.label){if(!labelObject){var labelEl=document.createElement("span");labelEl.className="map3d-object-label";labelObject=new CSS2DObject(labelEl);labelObject.updateMatrixWorld();sceneObject.add(labelObject);labelObject.userData.removeCallback=function(){// Explicitly remove label DOM element
7
+ */import React from"react";import{connect}from"react-redux";import Instance from"@giro3d/giro3d/core/Instance.js";import Coordinates from"@giro3d/giro3d/core/geographic/Coordinates";import Extent from"@giro3d/giro3d/core/geographic/Extent.js";import ElevationLayer from"@giro3d/giro3d/core/layer/ElevationLayer.js";import FeatureCollection from"@giro3d/giro3d/entities/FeatureCollection.js";import Map from"@giro3d/giro3d/entities/Map.js";import Tiles3D from"@giro3d/giro3d/entities/Tiles3D.js";import Inspector from"@giro3d/giro3d/gui/Inspector.js";import GeoTIFFSource from"@giro3d/giro3d/sources/GeoTIFFSource.js";import axios from"axios";import{fromUrl}from"geotiff";import isEmpty from"lodash.isempty";import PropTypes from"prop-types";import{Vector2,CubeTextureLoader,Group,Raycaster,Mesh}from"three";import{GLTFExporter}from"three/addons/exporters/GLTFExporter.js";import{GLTFLoader}from"three/addons/loaders/GLTFLoader";import{CSS2DObject}from"three/addons/renderers/CSS2DRenderer";import{v4 as uuidv4}from"uuid";import{LayerRole}from"../../actions/layers";import{setCurrentTask}from"../../actions/task";import{BackgroundSwitcher}from"../../plugins/BackgroundSwitcher";import ConfigUtils from"../../utils/ConfigUtils";import CoordinatesUtils from"../../utils/CoordinatesUtils";import MiscUtils from"../../utils/MiscUtils";import{registerPermalinkDataStoreHook,unregisterPermalinkDataStoreHook,UrlParams}from"../../utils/PermaLinkUtils";import BottomBar3D from"./BottomBar3D";import Compare3D from"./Compare3D";import Draw3D from"./Draw3D";import ExportObjects3D from"./ExportObjects3D";import HideObjects3D from"./HideObjects3D";import Identify3D from"./Identify3D";import LayerTree3D from"./LayerTree3D";import Map3DLight from"./Map3DLight";import MapControls3D from"./MapControls3D";import MapExport3D from"./MapExport3D";import Measure3D from"./Measure3D";import OverviewMap3D from"./OverviewMap3D";import TopBar3D from"./TopBar3D";import View3DSwitcher from"./View3DSwitcher";import LayerRegistry from"./layers/index";import Tiles3DStyle from"./utils/Tiles3DStyle";import"./style/Map3D.css";var UnloadWrapper=/*#__PURE__*/function(_React$Component){function UnloadWrapper(){var _this;_classCallCheck(this,UnloadWrapper);for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++){args[_key]=arguments[_key]}_this=_callSuper(this,UnloadWrapper,[].concat(args));_defineProperty(_this,"onUnload",function(el){if(!el){_this.props.onUnload(_this.props.sceneId)}});return _this}_inherits(UnloadWrapper,_React$Component);return _createClass(UnloadWrapper,[{key:"render",value:function render(){return/*#__PURE__*/React.createElement("div",null,this.props.children,/*#__PURE__*/React.createElement("span",{ref:this.onUnload}))}}])}(React.Component);_defineProperty(UnloadWrapper,"propTypes",{children:PropTypes.oneOfType([PropTypes.node,PropTypes.func]),onUnload:PropTypes.func,sceneId:PropTypes.string});var Map3D=/*#__PURE__*/function(_React$Component2){function Map3D(props){var _this2;_classCallCheck(this,Map3D);_this2=_callSuper(this,Map3D,[props]);_defineProperty(_this2,"state",{sceneContext:_objectSpread(_objectSpread({},Map3D.defaultSceneState),{},{addLayer:function addLayer(layer){},getLayer:function getLayer(layerId){},removeLayer:function removeLayer(layerId){},updateColorLayer:function updateColorLayer(layerId,options){},addSceneObject:function addSceneObject(objectId,object){var options=arguments.length>2&&arguments[2]!==undefined?arguments[2]:{}},getSceneObject:function getSceneObject(objectId){},removeSceneObject:function removeSceneObject(objectId){},updateSceneObject:function updateSceneObject(objectId,options){},updateObjectLabel:function updateObjectLabel(object){},getMap:function getMap(){},setViewToExtent:function setViewToExtent(bounds,angle){},getTerrainHeightFromDTM:function getTerrainHeightFromDTM(scenePos){},getTerrainHeightFromMap:function getTerrainHeightFromMap(scenePos){},getSceneIntersection:function getSceneIntersection(x,y){}}),sceneId:null});_defineProperty(_this2,"applyBaseLayer",function(){var baseLayer=_this2.state.sceneContext.baseLayers.find(function(e){return e.visibility===true});_this2.removeLayer("__baselayer");if(!baseLayer){return}var layerCreator=LayerRegistry[baseLayer.type];if(layerCreator!==null&&layerCreator!==void 0&&layerCreator.create3d){var layer3d=layerCreator.create3d(baseLayer,_this2.state.sceneContext.mapCrs);_this2.addLayer("__baselayer",layer3d);_this2.map.insertLayerAfter(layer3d,null)}});_defineProperty(_this2,"setBaseLayer",function(layer,visibility){_this2.setState(function(state){return{sceneContext:_objectSpread(_objectSpread({},state.sceneContext),{},{baseLayers:state.sceneContext.baseLayers.map(function(entry){return _objectSpread(_objectSpread({},entry),{},{visibility:entry.name===layer.name?visibility:false})})})}})});_defineProperty(_this2,"collectColorLayers",function(prevColorLayers){return _this2.props.layers.reduce(function(colorLayers,layer){var _prevOptions$visibili,_prevOptions$opacity,_prevOptions$extrusio,_prevOptions$fields;if(layer.role!==LayerRole.THEME&&layer.role!==LayerRole.USERLAYER){return colorLayers}var layerCreator=LayerRegistry[layer.type];if(!layerCreator||!layerCreator.create3d){return colorLayers}var prevOptions=prevColorLayers[layer.id];colorLayers[layer.id]=_objectSpread(_objectSpread({},layer),{},{visibility:(_prevOptions$visibili=prevOptions===null||prevOptions===void 0?void 0:prevOptions.visibility)!==null&&_prevOptions$visibili!==void 0?_prevOptions$visibili:false,opacity:(_prevOptions$opacity=prevOptions===null||prevOptions===void 0?void 0:prevOptions.opacity)!==null&&_prevOptions$opacity!==void 0?_prevOptions$opacity:255,extrusionHeight:(_prevOptions$extrusio=prevOptions===null||prevOptions===void 0?void 0:prevOptions.extrusionHeight)!==null&&_prevOptions$extrusio!==void 0?_prevOptions$extrusio:["vector","wfs"].includes(layer.type)?0:undefined,fields:(_prevOptions$fields=prevOptions===null||prevOptions===void 0?void 0:prevOptions.fields)!==null&&_prevOptions$fields!==void 0?_prevOptions$fields:undefined});if(colorLayers[layer.id].fields===undefined&&layerCreator.getFields){layerCreator.getFields(layer).then(function(fields){_this2.updateColorLayer(layer.id,{fields:fields})})}return colorLayers},{})});_defineProperty(_this2,"applyColorLayerUpdates",function(colorLayers,prevColorLayers){// Add-update new layers
8
+ var layerBelow=_this2.getLayer("__baselayer");Object.entries(colorLayers).reverse().forEach(function(_ref){var _ref2=_slicedToArray(_ref,2),layerId=_ref2[0],options=_ref2[1];var prevOptions=prevColorLayers[layerId];var layerCreator=LayerRegistry[options.type];var mapLayer=_this2.getLayer(layerId);if(mapLayer){layerCreator.update3d(mapLayer.source,options,prevOptions,_this2.state.sceneContext.mapCrs)}else{mapLayer=layerCreator.create3d(options,_this2.state.sceneContext.mapCrs);_this2.addLayer(layerId,mapLayer)}_this2.map.insertLayerAfter(mapLayer,layerBelow);mapLayer.visible=options.visibility;mapLayer.opacity=options.opacity/255;layerBelow=mapLayer;if(options.extrusionHeight!==0){_this2.createUpdateExtrudedLayer(mapLayer,options,options.features!==(prevOptions===null||prevOptions===void 0?void 0:prevOptions.features))}else if((prevOptions===null||prevOptions===void 0?void 0:prevOptions.extrusionHeight)!==0){_this2.removeExtrudedLayer(options.id)}});// Remove old layers
9
+ Object.entries(prevColorLayers).forEach(function(_ref3){var _ref4=_slicedToArray(_ref3,2),layerId=_ref4[0],options=_ref4[1];if(!(layerId in colorLayers)){if(options.extrusionHeight!==0){_this2.removeExtrudedLayer(options.id)}_this2.removeLayer(layerId)}});_this2.instance.notifyChange(_this2.map)});_defineProperty(_this2,"createUpdateExtrudedLayer",function(mapLayer,options){var _options$features,_options$features$red;var forceCreate=arguments.length>2&&arguments[2]!==undefined?arguments[2]:false;var bounds=options.bbox.bounds;var extent=new Extent(options.bbox.crs,bounds[0],bounds[2],bounds[1],bounds[3]);var objId=options.id+":extruded";var makeColor=function makeColor(c){if(Array.isArray(c)){return c[0]<<16|c[1]<<8|c[2]}else if(typeof c==="string"){return parseInt(c.replace("#",""),16)}else{return c}};var obj=_this2.objectMap[objId];if(!obj||forceCreate){var _options$color;if(obj){_this2.instance.remove(obj)}var layercolor=makeColor((_options$color=options.color)!==null&&_options$color!==void 0?_options$color:"#FF0000");obj=new FeatureCollection({source:mapLayer.source.source,extent:extent,minLevel:1,maxLevel:1,ignoreZ:true,elevation:function elevation(feature){var _this2$getTerrainHeig;var coordinates=feature.getGeometry().getCoordinates();while(Array.isArray(coordinates[0])){coordinates=coordinates[0]}return(_this2$getTerrainHeig=_this2.getTerrainHeightFromMap(coordinates))!==null&&_this2$getTerrainHeig!==void 0?_this2$getTerrainHeig:0},extrusionOffset:function extrusionOffset(feature){if(typeof obj.userData.extrusionHeight==="string"){return parseFloat(feature.getProperties()[obj.userData.extrusionHeight])||0}else{return obj.userData.extrusionHeight}},style:function style(feature){var _obj$userData$feature,_obj$userData$feature2;return(_obj$userData$feature=(_obj$userData$feature2=obj.userData.featureStyles)===null||_obj$userData$feature2===void 0?void 0:_obj$userData$feature2[feature.getId()])!==null&&_obj$userData$feature!==void 0?_obj$userData$feature:{fill:{color:layercolor,shading:true}}}});obj.castShadow=true;obj.receiveShadow=true;_this2.instance.add(obj);_this2.objectMap[objId]=obj}obj.userData.extrusionHeight=options.extrusionHeight;obj.userData.featureStyles=(_options$features=options.features)===null||_options$features===void 0||(_options$features$red=_options$features.reduce)===null||_options$features$red===void 0?void 0:_options$features$red.call(_options$features,function(res,feature){return _objectSpread(_objectSpread({},res),{},_defineProperty({},feature.id,{fill:{color:makeColor(feature.styleOptions.fillColor),shading:true}}))},{});obj.opacity=mapLayer.opacity;obj.visible=mapLayer.visible;obj.updateStyles()});_defineProperty(_this2,"removeExtrudedLayer",function(layerId){var objId=layerId+":extruded";if(_this2.objectMap[objId]){_this2.instance.remove(_this2.objectMap[objId]);delete _this2.objectMap[objId]}_this2.instance.notifyChange()});_defineProperty(_this2,"applySceneObjectUpdates",function(sceneObjects){Object.entries(sceneObjects).forEach(function(_ref5){var _ref6=_slicedToArray(_ref5,2),objectId=_ref6[0],options=_ref6[1];var object=_this2.objectMap[objectId];object.visible=options.visibility&&options.opacity>0;if(object.opacity!==undefined){object.opacity=options.opacity/255}else{object.traverse(function(child){if(child instanceof Mesh){child.material.transparent=options.opacity<255;child.material.opacity=options.opacity/255;child.material.needsUpdate=true}})}_this2.instance.notifyChange(object)})});_defineProperty(_this2,"updateObjectLabel",function(sceneObject){var labelObject=sceneObject.children.find(function(child){return child.isCSS2DObject});if(sceneObject.userData.label){if(!labelObject){var labelEl=document.createElement("span");labelEl.className="map3d-object-label";labelObject=new CSS2DObject(labelEl);labelObject.updateMatrixWorld();sceneObject.add(labelObject);labelObject.userData.removeCallback=function(){// Explicitly remove label DOM element
10
10
  labelEl.parentNode.removeChild(labelEl)};sceneObject.addEventListener("removed",labelObject.userData.removeCallback);sceneObject.updateMatrixWorld()}labelObject.element.textContent=sceneObject.userData.label}else if(labelObject){sceneObject.removeEventListener("removed",labelObject.userData.removeCallback);sceneObject.remove(labelObject)}_this2.instance.notifyChange(sceneObject)});_defineProperty(_this2,"addLayer",function(layerId,layer){layer.userData.layerId=layerId;_this2.map.addLayer(layer)});_defineProperty(_this2,"getLayer",function(layerId){var _this2$map$getLayers$;return(_this2$map$getLayers$=_this2.map.getLayers(function(l){return l.userData.layerId===layerId})[0])!==null&&_this2$map$getLayers$!==void 0?_this2$map$getLayers$:null});_defineProperty(_this2,"removeLayer",function(layerId){_this2.map.getLayers(function(l){return l.userData.layerId===layerId}).forEach(function(layer){_this2.map.removeLayer(layer,{dispose:true})})});_defineProperty(_this2,"updateColorLayer",function(layerId,options){_this2.setState(function(state){return{sceneContext:_objectSpread(_objectSpread({},state.sceneContext),{},{colorLayers:_objectSpread(_objectSpread({},state.sceneContext.colorLayers),{},_defineProperty({},layerId,_objectSpread(_objectSpread({},state.sceneContext.colorLayers[layerId]),options)))})}})});_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.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;if(!_this2.objectMap[objectId]){return}_this2.objectMap[objectId].traverse(function(child){child.dispatchEvent({type:"removed"})});_this2.sceneObjectGroup.remove(_this2.objectMap[objectId]);delete _this2.objectMap[objectId];_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,"getMap",function(){return _this2.map});_defineProperty(_this2,"setupContainer",function(el){if(el){_this2.container=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;if(_this2.instance){_this2.disposeInstance()}var projection=_this2.props.theme.mapCrs;// Setup instance
11
11
  _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
12
12
  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
@@ -0,0 +1,7 @@
1
+ div.edit-multi-select {
2
+ border: 1px solid var(--border-color);
3
+ padding: 0.25em;
4
+ background-color: var(--input-bg-color);
5
+ max-height: 5em;
6
+ overflow-y: auto;
7
+ }
@@ -16,10 +16,11 @@ div.map-buttons-container {
16
16
  justify-content: flex-start;
17
17
  flex-wrap: wrap-reverse;
18
18
  z-index: 2;
19
+ overflow: hidden;
19
20
  }
20
21
 
21
22
  div.map-buttons-spacer {
22
23
  display: inline-block;
23
- width: 3em;
24
- height: 3em;
24
+ width: 4em;
25
+ height: 4em;
25
26
  }
@@ -32,7 +32,7 @@ div.number-input:not(.number-input-disabled) > span.icon:hover {
32
32
 
33
33
  /** Normal **/
34
34
  div.number-input-normal > input {
35
- padding-right: 1.5em;
35
+ padding-right: 1.5em!important;
36
36
  }
37
37
 
38
38
  div.number-input > span.icon-chevron-up,
@@ -0,0 +1,63 @@
1
+ <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
+ <!-- Created with Inkscape (http://www.inkscape.org/) -->
3
+
4
+ <svg
5
+ width="24"
6
+ height="24"
7
+ viewBox="0 0 6.3500001 6.3500001"
8
+ version="1.1"
9
+ id="svg1"
10
+ inkscape:version="1.4 (e7c3feb100, 2024-10-09)"
11
+ sodipodi:docname="clone.svg"
12
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
13
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
14
+ xmlns="http://www.w3.org/2000/svg"
15
+ xmlns:svg="http://www.w3.org/2000/svg">
16
+ <sodipodi:namedview
17
+ id="namedview1"
18
+ pagecolor="#ffffff"
19
+ bordercolor="#666666"
20
+ borderopacity="1.0"
21
+ inkscape:showpageshadow="2"
22
+ inkscape:pageopacity="0.0"
23
+ inkscape:pagecheckerboard="0"
24
+ inkscape:deskcolor="#d1d1d1"
25
+ inkscape:document-units="mm"
26
+ inkscape:zoom="32"
27
+ inkscape:cx="11.90625"
28
+ inkscape:cy="13.703125"
29
+ inkscape:window-width="1920"
30
+ inkscape:window-height="1172"
31
+ inkscape:window-x="0"
32
+ inkscape:window-y="0"
33
+ inkscape:window-maximized="1"
34
+ inkscape:current-layer="layer1"
35
+ showgrid="true">
36
+ <inkscape:grid
37
+ id="grid1"
38
+ units="mm"
39
+ originx="0"
40
+ originy="0"
41
+ spacingx="0.26458334"
42
+ spacingy="0.26458334"
43
+ empcolor="#0099e5"
44
+ empopacity="0.30196078"
45
+ color="#0099e5"
46
+ opacity="0.14901961"
47
+ empspacing="5"
48
+ enabled="true"
49
+ visible="true" />
50
+ </sodipodi:namedview>
51
+ <defs
52
+ id="defs1" />
53
+ <g
54
+ inkscape:label="Layer 1"
55
+ inkscape:groupmode="layer"
56
+ id="layer1">
57
+ <path
58
+ id="path1"
59
+ style="stroke-width:0.312689;stroke-linejoin:round"
60
+ d="m 0.26509339,-5.2658543e-4 c -0.14632,2e-5 -0.26485000012,0.11877999543 -0.26458000012,0.26509999543 L -3.2798775e-6,4.2328102 C -2.7327988e-4,4.3791302 0.11825672,4.4979002 0.26457672,4.4979102 l 1.58751498,2.699e-4 v -0.52916 L 0.52916669,3.9687502 0.52968336,0.52915341 3.9687502,0.52916669 3.9682269,1.8520834 h 0.52969 l 5.233e-4,-1.58749671 c 2.7e-4,-0.14632 -0.11827,-0.26507999988 -0.26459,-0.26509999988 z M 2.3812451,2.11693 c -0.14612,1e-5 -0.26457,0.11846 -0.26458,0.26458 l 1.8e-6,3.7039036 c 1e-5,0.14612 0.11846,0.26457 0.26458,0.26458 h 3.7041667 c 0.14612,-1e-5 0.26457,-0.11846 0.26459,-0.26458 L 6.3500018,2.38151 c -2e-5,-0.14612 -0.11847,-0.26457 -0.26459,-0.26458 z m 0.2651,0.52916 h 3.1744867 l 1.8e-6,3.1747436 H 2.6463469 Z m 1.3224051,0.2643268 -5.1e-6,1.0585965 -1.0583283,-2.564e-4 v 0.52916 l 1.0583283,2.564e-4 1.8e-6,1.0580769 h 0.52917 l -1.8e-6,-1.0580769 1.0583351,-2.564e-4 v -0.52916 l -1.0583351,2.564e-4 5.1e-6,-1.0585965 z"
61
+ sodipodi:nodetypes="ccccccccccccccccccccccccccccccccccccccccc" />
62
+ </g>
63
+ </svg>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "qwc2",
3
- "version": "2025.05.16",
3
+ "version": "2025.05.21",
4
4
  "description": "QGIS Web Client",
5
5
  "author": "Sourcepole AG",
6
6
  "license": "BSD-2-Clause",
@@ -7,4 +7,4 @@ function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof
7
7
  */import React from"react";import{connect}from"react-redux";import classnames from"classnames";import isEmpty from"lodash.isempty";import PropTypes from"prop-types";import{LayerRole,changeLayerProperty}from"../actions/layers";import Icon from"../components/Icon";import MapButton from"../components/MapButton";import ConfigUtils from"../utils/ConfigUtils";import LocaleUtils from"../utils/LocaleUtils";import"./style/BackgroundSwitcher.css";/**
8
8
  * Map button for switching the background layer.
9
9
  */export var BackgroundSwitcher=/*#__PURE__*/function(_React$Component){function BackgroundSwitcher(){var _this;_classCallCheck(this,BackgroundSwitcher);for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++){args[_key]=arguments[_key]}_this=_callSuper(this,BackgroundSwitcher,[].concat(args));_defineProperty(_this,"state",{visible:false});_defineProperty(_this,"itemTitle",function(item){var _item$title;return item.titleMsgId?LocaleUtils.tr(item.titleMsgId):(_item$title=item.title)!==null&&_item$title!==void 0?_item$title:item.name});_defineProperty(_this,"renderLayerItem",function(layer,visible){var assetsPath=ConfigUtils.getAssetsPath();var itemclasses=classnames({"background-switcher-item":true,"background-switcher-item-active":visible});return/*#__PURE__*/React.createElement("div",{className:itemclasses,key:layer?layer.name:"empty",onClick:function onClick(){return _this.backgroundLayerClicked(layer)}},/*#__PURE__*/React.createElement("div",{className:"background-switcher-item-title"},layer?/*#__PURE__*/React.createElement("span",{title:_this.itemTitle(layer)},_this.itemTitle(layer)):/*#__PURE__*/React.createElement("span",null,LocaleUtils.tr("bgswitcher.nobg"))),/*#__PURE__*/React.createElement("div",{className:"background-switcher-item-thumbnail"},/*#__PURE__*/React.createElement("img",{src:layer?assetsPath+"/"+layer.thumbnail:"data:image/gif;base64,R0lGODlhAQABAIAAAP7//wAAACH5BAAAAAAALAAAAAABAAEAAAICRAEAOw=="})))});_defineProperty(_this,"renderGroupItem",function(entry){var assetsPath=ConfigUtils.getAssetsPath();var layer=entry.layers.find(function(l){return l.visibility===true})||entry.layers.find(function(l){return l["default"]===true})||entry.layers[entry.layers.length-1];var itemclasses=classnames({"background-switcher-item":true,"background-switcher-item-active":layer.visibility});return/*#__PURE__*/React.createElement("div",{className:itemclasses,key:layer.name},/*#__PURE__*/React.createElement("div",{className:"background-switcher-item-title"},/*#__PURE__*/React.createElement("span",{title:_this.itemTitle(layer)},_this.itemTitle(layer)),/*#__PURE__*/React.createElement(Icon,{icon:"chevron-down"})),/*#__PURE__*/React.createElement("div",{className:"background-switcher-item-thumbnail"},/*#__PURE__*/React.createElement("img",{onClick:function onClick(){return _this.backgroundLayerClicked(layer)},src:assetsPath+"/"+layer.thumbnail})),/*#__PURE__*/React.createElement("div",{className:"background-switcher-group"},entry.layers.map(function(l){var menuitemclasses=classnames({"background-switcher-group-item":true,"background-switcher-group-item-active":l.visibility});return/*#__PURE__*/React.createElement("div",{className:menuitemclasses,key:l.name,onClick:function onClick(){return _this.backgroundLayerClicked(l)},onMouseEnter:function onMouseEnter(ev){return _this.updateGroupItem(ev,l)},onMouseLeave:function onMouseLeave(ev){return _this.updateGroupItem(ev,layer)},title:_this.itemTitle(l)},_this.itemTitle(l))})))});_defineProperty(_this,"updateGroupItem",function(ev,layer){var assetsPath=ConfigUtils.getAssetsPath();ev.target.parentElement.parentElement.childNodes[0].firstChild.innerText=_this.itemTitle(layer);ev.target.parentElement.parentElement.childNodes[1].firstChild.src=assetsPath+"/"+layer.thumbnail});_defineProperty(_this,"buttonClicked",function(){_this.setState(function(state){return{visible:!state.visible}})});_defineProperty(_this,"backgroundLayerClicked",function(layer){if(layer){_this.props.changeLayerVisibility(layer,true)}else{var visible=_this.props.layers.find(function(l){return l.visibility});if(visible){_this.props.changeLayerVisibility(visible,false)}}_this.setState({visible:false})});return _this}_inherits(BackgroundSwitcher,_React$Component);return _createClass(BackgroundSwitcher,[{key:"render",value:function render(){var _this2=this;var backgroundLayers=this.props.layers.slice(0).reverse();// Re-sort layers, ensuring grouped layers are grouped together
10
- var idx=0;var indices=backgroundLayers.reduce(function(res,l){var name=l.group||l.name;if(!res[name]){res[name]=++idx}return res},{});backgroundLayers.sort(function(a,b){return indices[a.group||a.name]-indices[b.group||b.name]});var entries=backgroundLayers.reduce(function(res,layer){if(!isEmpty(res)&&layer.group&&layer.group===res[res.length-1].group){res[res.length-1].layers.push(layer)}else if(layer.group){res.push({group:layer.group,layers:[layer]})}else{res.push(layer)}return res},[]);if(entries.length>0){return/*#__PURE__*/React.createElement(MapButton,{active:this.state.visible,icon:"bglayer",onClick:this.buttonClicked,position:this.props.position,tooltip:LocaleUtils.tr("tooltip.background")},/*#__PURE__*/React.createElement("div",{className:"background-switcher "+(this.state.visible?"background-switcher-active":"")},this.renderLayerItem(null,backgroundLayers.filter(function(layer){return layer.visibility===true}).length===0),entries.map(function(entry){return entry.group?_this2.renderGroupItem(entry):_this2.renderLayerItem(entry,entry.visibility===true)})))}return null}}])}(React.Component);_defineProperty(BackgroundSwitcher,"propTypes",{changeLayerVisibility:PropTypes.func,layers:PropTypes.array,/** The position slot index of the map button, from the bottom (0: bottom slot). */position:PropTypes.number});_defineProperty(BackgroundSwitcher,"defaultProps",{position:0});var selector=function selector(state){return{layers:state.layers.flat.filter(function(layer){return layer.role===LayerRole.BACKGROUND})}};export default connect(selector,{changeLayerVisibility:function changeLayerVisibility(layer,visibility){return changeLayerProperty(layer.uuid,"visibility",visibility)}})(BackgroundSwitcher);
10
+ var idx=0;var indices=backgroundLayers.reduce(function(res,l){var name=l.group||l.name;if(!res[name]){res[name]=++idx}return res},{});backgroundLayers.sort(function(a,b){return indices[a.group||a.name]-indices[b.group||b.name]});var entries=backgroundLayers.reduce(function(res,layer){if(!isEmpty(res)&&layer.group&&layer.group===res[res.length-1].group){res[res.length-1].layers.push(layer)}else if(layer.group){res.push({group:layer.group,layers:[layer]})}else{res.push(layer)}return res},[]);if(entries.length>0){return/*#__PURE__*/React.createElement(MapButton,{active:this.state.visible,icon:"bglayer",onClick:this.buttonClicked,position:this.props.position,tooltip:LocaleUtils.tr("tooltip.background")},/*#__PURE__*/React.createElement("div",{className:"background-switcher "+(this.state.visible?"background-switcher-active":"")},this.renderLayerItem(null,backgroundLayers.filter(function(layer){return layer.visibility===true}).length===0),entries.map(function(entry){return entry.group?_this2.renderGroupItem(entry):_this2.renderLayerItem(entry,entry.visibility===true)})))}return null}}])}(React.Component);_defineProperty(BackgroundSwitcher,"propTypes",{changeLayerVisibility:PropTypes.func,layers:PropTypes.array,/** The position slot index of the map button, from the bottom (0: bottom slot). */position:PropTypes.number});_defineProperty(BackgroundSwitcher,"defaultProps",{position:0});var selector=function selector(state){return{layers:state.layers.flat.filter(function(layer){return layer.role===LayerRole.BACKGROUND})}};export default connect(selector,{changeLayerVisibility:function changeLayerVisibility(layer,visibility){return changeLayerProperty(layer.id,"visibility",visibility)}})(BackgroundSwitcher);
@@ -6,6 +6,6 @@ function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof
6
6
  * LICENSE file in the root directory of this source tree.
7
7
  */import React from"react";import{connect}from"react-redux";import PropTypes from"prop-types";import{addLayer,addLayerFeatures,changeLayerProperty,removeLayer,LayerRole}from"../actions/layers";import{setCurrentTask}from"../actions/task";import ResizeableWindow from"../components/ResizeableWindow";import Spinner from"../components/widgets/Spinner";import CoordinatesUtils from"../utils/CoordinatesUtils";import LocaleUtils from"../utils/LocaleUtils";import MapUtils from"../utils/MapUtils";import ResourceRegistry from"../utils/ResourceRegistry";import"./style/Cyclomedia.css";var Status={LOGIN:0,INITIALIZING:1,INITIALIZED:2,ERROR:3,LOADPOS:4,HAVEPOS:5};/**
8
8
  * Cyclomedia integration for QWC2.
9
- */var Cyclomedia=/*#__PURE__*/function(_React$Component){function Cyclomedia(props){var _this;_classCallCheck(this,Cyclomedia);_this=_callSuper(this,Cyclomedia,[props]);_defineProperty(_this,"state",{status:Status.LOGIN,message:"",username:"",password:"",loginFailed:false});_defineProperty(_this,"onClose",function(){_this.props.setCurrentTask(null);_this.setState({status:Status.LOGIN,loginFailed:false});_this.iframe=null});_defineProperty(_this,"setIframeRef",function(iframe){if(iframe&&iframe!==_this.iframe){_this.iframe=iframe;clearInterval(_this.iframePollIntervall);_this.iframePollIntervall=setInterval(function(){return _this.setupIframe(iframe)},500)}});_defineProperty(_this,"setupIframe",function(iframe){if(!iframe.getAttribute("content-set")){if(iframe.contentWindow&&iframe.contentWindow.document){iframe.setAttribute("content-set",true);iframe.contentWindow.document.open();iframe.contentWindow.document.write(_this.cyclomediaIndexHtml());iframe.contentWindow.document.close();_this.iframe=iframe}}else if(!iframe.getAttribute("callback-registered")){if(iframe.contentWindow&&iframe.contentWindow.registerCallbacks){iframe.setAttribute("callback-registered",true);iframe.contentWindow.registerCallbacks(_this.apiInitialized,_this.panoramaPositionChanged,_this.measurementChanged)}}else if(!iframe.getAttribute("init-called")){if(iframe.contentWindow&&iframe.contentWindow.StreetSmartApi){iframe.setAttribute("init-called",true);iframe.contentWindow.initApi()}}else{clearInterval(_this.iframePollIntervall)}});_defineProperty(_this,"apiInitialized",function(success){var message=arguments.length>1&&arguments[1]!==undefined?arguments[1]:"";_this.setState({status:success?Status.INITIALIZED:Status.LOGIN,message:message,loginFailed:!success})});_defineProperty(_this,"panoramaPositionChanged",function(posData){if(_this.state.status!==Status.HAVEPOS){_this.setState({status:Status.HAVEPOS})}var scale=50;var angle=posData.hFov/2;var width=Math.sin(angle);var length=Math.sqrt(1-width*width);var size=scale/Math.sqrt(width*length);var coordinates=[[0,0],[size*width*2,0],[size*width,size*length]];var dimensions=[coordinates[1][0]+0.5,coordinates[2][1]+0.5];var canvas=document.createElement("canvas");canvas.width=dimensions[0];canvas.height=dimensions[1];var context=canvas.getContext("2d");context.fillStyle="rgba(255, 0, 0, 0.5)";context.strokeStyle="#FF0000";context.lineWidth=1;context.beginPath();context.moveTo(coordinates[0][0],coordinates[0][1]);coordinates.slice(1).forEach(function(coo){return context.lineTo(coo[0],coo[1])});context.closePath();context.fill();ResourceRegistry.addResource("cyclomedia-cone",context.canvas.toDataURL());var feature={geometry:{type:"Point",coordinates:posData.pos},crs:posData.crs,styleName:"image",styleOptions:{img:"cyclomedia-cone",rotation:posData.yaw,size:dimensions}};var layer={id:"cyclomedia-cone",role:LayerRole.MARKER};_this.props.addLayerFeatures(layer,[feature],true)});_defineProperty(_this,"measurementChanged",function(measurement){if(_this.props.displayMeasurements){if(measurement){var layer={id:"cyclomedia-measurements",role:LayerRole.MARKER,crs:measurement.crs.properties.name,styleOptions:{strokeColor:"red",strokeWidth:4,fillColor:[255,0,0,0.25],strokeDash:[]}};_this.props.addLayerFeatures(layer,measurement.features,true)}else{_this.props.removeLayer("cyclomedia-measurements")}}});_defineProperty(_this,"cyclomediaIndexHtml",function(){var supportedLang=["de","en-GB","en-US","fi","fr","nl","tr","pl"];var lang=LocaleUtils.lang();if(supportedLang.indexOf(lang)<0){lang=lang.slice(0,2);if(supportedLang.indexOf(lang)<0){lang="en-US"}}var loginOauth=!!_this.props.clientId&&!_this.state.loginFailed;return"\n <!DOCTYPE html>\n <html>\n <head>\n <script type=\"text/javascript\" src=\"https://unpkg.com/react@16.12.0/umd/react.production.min.js\"></script>\n <script type=\"text/javascript\" src=\"https://unpkg.com/react-dom@16.12.0/umd/react-dom.production.min.js\"></script>\n <script type=\"text/javascript\" src=\"https://streetsmart.cyclomedia.com/api/v".concat(_this.props.cyclomediaVersion,"/StreetSmartApi.js\"></script>\n <script type=\"text/javascript\">\n let apiInitialized = false;\n let initCallback = null;\n let posCallback = null;\n let measureCallback = null;\n\n function initApi() {\n StreetSmartApi.init({\n targetElement: document.getElementById(\"streetsmartApi\"),\n username: \"").concat(_this.state.username||undefined,"\",\n password: \"").concat(_this.state.password||undefined,"\",\n apiKey: \"").concat(_this.props.apikey,"\",\n clientId: \"").concat(_this.props.clientId,"\",\n loginOauth: ").concat(loginOauth,",\n loginRedirectUri: \"").concat(_this.props.loginRedirectUri,"\",\n logoutRedirectUri: \"").concat(_this.props.logoutRedirectUri,"\",\n srs: \"").concat(_this.props.projection,"\",\n locale: \"").concat(lang,"\",\n configurationUrl: 'https://atlas.cyclomedia.com/configuration',\n addressSettings: {\n locale: \"us\",\n database: \"Nokia\"\n }\n }).then(() => {\n apiInitialized = true;\n if (initCallback) {\n initCallback(true);\n }\n }, (e) => {\n apiInitialized = false;\n if (initCallback) {\n initCallback(false, e.message);\n }\n });\n }\n function openImage(posStr, crs) {\n if (!apiInitialized) {\n return;\n }\n StreetSmartApi.open(posStr, {\n viewerType: StreetSmartApi.ViewerType.PANORAMA,\n srs: crs,\n panoramaViewer: {\n closable: false,\n maximizable: true,\n replace: true,\n recordingsVisible: true,\n navbarVisible: true,\n timeTravelVisible: true,\n measureTypeButtonVisible: true,\n measureTypeButtonStart: true,\n measureTypeButtonToggle: true,\n },\n }).then((result) => {\n if (result && result[0]){\n window.panoramaViewer = result[0];\n window.panoramaViewer.on(StreetSmartApi.Events.panoramaViewer.IMAGE_CHANGE, changeView);\n window.panoramaViewer.on(StreetSmartApi.Events.panoramaViewer.VIEW_CHANGE, changeView);\n StreetSmartApi.on(StreetSmartApi.Events.measurement.MEASUREMENT_CHANGED, changeMeasurement);\n StreetSmartApi.on(StreetSmartApi.Events.measurement.MEASUREMENT_STOPPED, stopMeasurement);\n }\n }).catch((reason) => {\n console.log('Failed to create component(s) through API: ' + reason);\n });\n }\n function changeView() {\n if (posCallback) {\n const recording = window.panoramaViewer.getRecording();\n const orientation = window.panoramaViewer.getOrientation();\n const pos = recording.xyz;\n const posData = {\n pos: [pos[0], pos[1]],\n crs: recording.srs,\n yaw: orientation.yaw * Math.PI / 180,\n hFov: orientation.hFov * Math.PI / 180.0\n }\n posCallback(posData);\n }\n }\n function changeMeasurement(e) {\n measureCallback(e.detail.activeMeasurement);\n }\n function stopMeasurement() {\n measureCallback(null);\n }\n function registerCallbacks(_initCallback, _posCallback, _measureCallback) {\n initCallback = _initCallback;\n posCallback = _posCallback;\n measureCallback = _measureCallback;\n }\n </script>\n <style>\n html, body, #streetsmartApi {height: 100%;}\n </style>\n </head>\n <body style=\"margin: 0\">\n <div id=\"streetsmartApi\">\n </div>\n </body>\n </html>\n ")});_defineProperty(_this,"addRecordingsWFS",function(){var layer={uuid:"cyclomedia-recordings",id:"cyclomedia-recordings",type:"wfs",loader:function loader(vectorSource,extent,resolution,projection,success,failure){var bbox=CoordinatesUtils.reprojectBbox(extent,projection.getCode(),_this.props.mapCrs);var bboxstr=bbox.join(",");var reqUrl="https://atlasapi.cyclomedia.com/api/recording/wfs?service=WFS&version=1.1.0&request=GetFeature&typename=atlas:Recording&srsname=".concat(_this.props.mapCrs,"&bbox=").concat(bboxstr,"&maxFeatures=10000000");var xhr=new XMLHttpRequest;xhr.open("GET",reqUrl);xhr.setRequestHeader("Authorization","Basic "+btoa(_this.state.username+":"+_this.state.password));var onError=function onError(){vectorSource.removeLoadedExtent(extent);failure()};xhr.onerror=onError;xhr.onload=function(){if(xhr.status===200){var features=vectorSource.getFormat().readFeatures(xhr.responseText,{dataProjection:_this.props.mapCrs,featureProjection:projection.getCode()});vectorSource.addFeatures(features);success(features)}else{onError()}};xhr.send()},name:"atlas:Recording",version:"1.1.0",projection:_this.props.mapCrs,formats:["text/xml; subtype=gml/3.1.1"],invertAxisOrientation:true,role:LayerRole.SELECTION,color:"#6666FF",visibility:_this.props.mapScale<=_this.props.maxMapScale};_this.props.addLayer(layer)});_defineProperty(_this,"queryPoint",function(prevProps){if(_this.props.click===prevProps.click){return null}var cmFeature=_this.props.click.features.find(function(feature){return feature.layerId==="cyclomedia-recordings"});return cmFeature?cmFeature.geometry.coordinates:null});_this.iframe=null;_this.iframePollIntervall=null;if(props.credentialUserInfoFields){_this.state.username=props.userInfos[props.credentialUserInfoFields.username];_this.state.password=props.userInfos[props.credentialUserInfoFields.password]}return _this}_inherits(Cyclomedia,_React$Component);return _createClass(Cyclomedia,[{key:"componentDidUpdate",value:function componentDidUpdate(prevProps,prevState){if(!prevProps.active&&this.props.active){this.setState({status:this.props.clientId?Status.INITIALIZING:Status.LOGIN,loginFailed:false})}else if(prevProps.active&&!this.props.active||prevProps.theme&&!this.props.theme){this.onClose()}// Load WFS when loading
9
+ */var Cyclomedia=/*#__PURE__*/function(_React$Component){function Cyclomedia(props){var _this;_classCallCheck(this,Cyclomedia);_this=_callSuper(this,Cyclomedia,[props]);_defineProperty(_this,"state",{status:Status.LOGIN,message:"",username:"",password:"",loginFailed:false});_defineProperty(_this,"onClose",function(){_this.props.setCurrentTask(null);_this.setState({status:Status.LOGIN,loginFailed:false});_this.iframe=null});_defineProperty(_this,"setIframeRef",function(iframe){if(iframe&&iframe!==_this.iframe){_this.iframe=iframe;clearInterval(_this.iframePollIntervall);_this.iframePollIntervall=setInterval(function(){return _this.setupIframe(iframe)},500)}});_defineProperty(_this,"setupIframe",function(iframe){if(!iframe.getAttribute("content-set")){if(iframe.contentWindow&&iframe.contentWindow.document){iframe.setAttribute("content-set",true);iframe.contentWindow.document.open();iframe.contentWindow.document.write(_this.cyclomediaIndexHtml());iframe.contentWindow.document.close();_this.iframe=iframe}}else if(!iframe.getAttribute("callback-registered")){if(iframe.contentWindow&&iframe.contentWindow.registerCallbacks){iframe.setAttribute("callback-registered",true);iframe.contentWindow.registerCallbacks(_this.apiInitialized,_this.panoramaPositionChanged,_this.measurementChanged)}}else if(!iframe.getAttribute("init-called")){if(iframe.contentWindow&&iframe.contentWindow.StreetSmartApi){iframe.setAttribute("init-called",true);iframe.contentWindow.initApi()}}else{clearInterval(_this.iframePollIntervall)}});_defineProperty(_this,"apiInitialized",function(success){var message=arguments.length>1&&arguments[1]!==undefined?arguments[1]:"";_this.setState({status:success?Status.INITIALIZED:Status.LOGIN,message:message,loginFailed:!success})});_defineProperty(_this,"panoramaPositionChanged",function(posData){if(_this.state.status!==Status.HAVEPOS){_this.setState({status:Status.HAVEPOS})}var scale=50;var angle=posData.hFov/2;var width=Math.sin(angle);var length=Math.sqrt(1-width*width);var size=scale/Math.sqrt(width*length);var coordinates=[[0,0],[size*width*2,0],[size*width,size*length]];var dimensions=[coordinates[1][0]+0.5,coordinates[2][1]+0.5];var canvas=document.createElement("canvas");canvas.width=dimensions[0];canvas.height=dimensions[1];var context=canvas.getContext("2d");context.fillStyle="rgba(255, 0, 0, 0.5)";context.strokeStyle="#FF0000";context.lineWidth=1;context.beginPath();context.moveTo(coordinates[0][0],coordinates[0][1]);coordinates.slice(1).forEach(function(coo){return context.lineTo(coo[0],coo[1])});context.closePath();context.fill();ResourceRegistry.addResource("cyclomedia-cone",context.canvas.toDataURL());var feature={geometry:{type:"Point",coordinates:posData.pos},crs:posData.crs,styleName:"image",styleOptions:{img:"cyclomedia-cone",rotation:posData.yaw,size:dimensions}};var layer={id:"cyclomedia-cone",role:LayerRole.MARKER};_this.props.addLayerFeatures(layer,[feature],true)});_defineProperty(_this,"measurementChanged",function(measurement){if(_this.props.displayMeasurements){if(measurement){var layer={id:"cyclomedia-measurements",role:LayerRole.MARKER,crs:measurement.crs.properties.name,styleOptions:{strokeColor:"red",strokeWidth:4,fillColor:[255,0,0,0.25],strokeDash:[]}};_this.props.addLayerFeatures(layer,measurement.features,true)}else{_this.props.removeLayer("cyclomedia-measurements")}}});_defineProperty(_this,"cyclomediaIndexHtml",function(){var supportedLang=["de","en-GB","en-US","fi","fr","nl","tr","pl"];var lang=LocaleUtils.lang();if(supportedLang.indexOf(lang)<0){lang=lang.slice(0,2);if(supportedLang.indexOf(lang)<0){lang="en-US"}}var loginOauth=!!_this.props.clientId&&!_this.state.loginFailed;return"\n <!DOCTYPE html>\n <html>\n <head>\n <script type=\"text/javascript\" src=\"https://unpkg.com/react@16.12.0/umd/react.production.min.js\"></script>\n <script type=\"text/javascript\" src=\"https://unpkg.com/react-dom@16.12.0/umd/react-dom.production.min.js\"></script>\n <script type=\"text/javascript\" src=\"https://streetsmart.cyclomedia.com/api/v".concat(_this.props.cyclomediaVersion,"/StreetSmartApi.js\"></script>\n <script type=\"text/javascript\">\n let apiInitialized = false;\n let initCallback = null;\n let posCallback = null;\n let measureCallback = null;\n\n function initApi() {\n StreetSmartApi.init({\n targetElement: document.getElementById(\"streetsmartApi\"),\n username: \"").concat(_this.state.username||undefined,"\",\n password: \"").concat(_this.state.password||undefined,"\",\n apiKey: \"").concat(_this.props.apikey,"\",\n clientId: \"").concat(_this.props.clientId,"\",\n loginOauth: ").concat(loginOauth,",\n loginRedirectUri: \"").concat(_this.props.loginRedirectUri,"\",\n logoutRedirectUri: \"").concat(_this.props.logoutRedirectUri,"\",\n srs: \"").concat(_this.props.projection,"\",\n locale: \"").concat(lang,"\",\n configurationUrl: 'https://atlas.cyclomedia.com/configuration',\n addressSettings: {\n locale: \"us\",\n database: \"Nokia\"\n }\n }).then(() => {\n apiInitialized = true;\n if (initCallback) {\n initCallback(true);\n }\n }, (e) => {\n apiInitialized = false;\n if (initCallback) {\n initCallback(false, e.message);\n }\n });\n }\n function openImage(posStr, crs) {\n if (!apiInitialized) {\n return;\n }\n StreetSmartApi.open(posStr, {\n viewerType: StreetSmartApi.ViewerType.PANORAMA,\n srs: crs,\n panoramaViewer: {\n closable: false,\n maximizable: true,\n replace: true,\n recordingsVisible: true,\n navbarVisible: true,\n timeTravelVisible: true,\n measureTypeButtonVisible: true,\n measureTypeButtonStart: true,\n measureTypeButtonToggle: true,\n },\n }).then((result) => {\n if (result && result[0]){\n window.panoramaViewer = result[0];\n window.panoramaViewer.on(StreetSmartApi.Events.panoramaViewer.IMAGE_CHANGE, changeView);\n window.panoramaViewer.on(StreetSmartApi.Events.panoramaViewer.VIEW_CHANGE, changeView);\n StreetSmartApi.on(StreetSmartApi.Events.measurement.MEASUREMENT_CHANGED, changeMeasurement);\n StreetSmartApi.on(StreetSmartApi.Events.measurement.MEASUREMENT_STOPPED, stopMeasurement);\n }\n }).catch((reason) => {\n console.log('Failed to create component(s) through API: ' + reason);\n });\n }\n function changeView() {\n if (posCallback) {\n const recording = window.panoramaViewer.getRecording();\n const orientation = window.panoramaViewer.getOrientation();\n const pos = recording.xyz;\n const posData = {\n pos: [pos[0], pos[1]],\n crs: recording.srs,\n yaw: orientation.yaw * Math.PI / 180,\n hFov: orientation.hFov * Math.PI / 180.0\n }\n posCallback(posData);\n }\n }\n function changeMeasurement(e) {\n measureCallback(e.detail.activeMeasurement);\n }\n function stopMeasurement() {\n measureCallback(null);\n }\n function registerCallbacks(_initCallback, _posCallback, _measureCallback) {\n initCallback = _initCallback;\n posCallback = _posCallback;\n measureCallback = _measureCallback;\n }\n </script>\n <style>\n html, body, #streetsmartApi {height: 100%;}\n </style>\n </head>\n <body style=\"margin: 0\">\n <div id=\"streetsmartApi\">\n </div>\n </body>\n </html>\n ")});_defineProperty(_this,"addRecordingsWFS",function(){var layer={id:"cyclomedia-recordings",type:"wfs",loader:function loader(vectorSource,extent,resolution,projection,success,failure){var bbox=CoordinatesUtils.reprojectBbox(extent,projection.getCode(),_this.props.mapCrs);var bboxstr=bbox.join(",");var reqUrl="https://atlasapi.cyclomedia.com/api/recording/wfs?service=WFS&version=1.1.0&request=GetFeature&typename=atlas:Recording&srsname=".concat(_this.props.mapCrs,"&bbox=").concat(bboxstr,"&maxFeatures=10000000");var xhr=new XMLHttpRequest;xhr.open("GET",reqUrl);xhr.setRequestHeader("Authorization","Basic "+btoa(_this.state.username+":"+_this.state.password));var onError=function onError(){vectorSource.removeLoadedExtent(extent);failure()};xhr.onerror=onError;xhr.onload=function(){if(xhr.status===200){var features=vectorSource.getFormat().readFeatures(xhr.responseText,{dataProjection:_this.props.mapCrs,featureProjection:projection.getCode()});vectorSource.addFeatures(features);success(features)}else{onError()}};xhr.send()},name:"atlas:Recording",version:"1.1.0",projection:_this.props.mapCrs,formats:["text/xml; subtype=gml/3.1.1"],invertAxisOrientation:true,role:LayerRole.SELECTION,color:"#6666FF",visibility:_this.props.mapScale<=_this.props.maxMapScale};_this.props.addLayer(layer)});_defineProperty(_this,"queryPoint",function(prevProps){if(_this.props.click===prevProps.click){return null}var cmFeature=_this.props.click.features.find(function(feature){return feature.layerId==="cyclomedia-recordings"});return cmFeature?cmFeature.geometry.coordinates:null});_this.iframe=null;_this.iframePollIntervall=null;if(props.credentialUserInfoFields){_this.state.username=props.userInfos[props.credentialUserInfoFields.username];_this.state.password=props.userInfos[props.credentialUserInfoFields.password]}return _this}_inherits(Cyclomedia,_React$Component);return _createClass(Cyclomedia,[{key:"componentDidUpdate",value:function componentDidUpdate(prevProps,prevState){if(!prevProps.active&&this.props.active){this.setState({status:this.props.clientId?Status.INITIALIZING:Status.LOGIN,loginFailed:false})}else if(prevProps.active&&!this.props.active||prevProps.theme&&!this.props.theme){this.onClose()}// Load WFS when loading
10
10
  if(this.state.status===Status.INITIALIZING&&prevState.status<Status.INITIALIZING){this.addRecordingsWFS()}// Handle map click events
11
11
  if((this.state.status===Status.INITIALIZED||this.state.status===Status.HAVEPOS)&&this.iframe){var clickPoint=this.queryPoint(prevProps);if(clickPoint){var posStr=clickPoint[0]+","+clickPoint[1];this.iframe.contentWindow.openImage(posStr,this.props.mapCrs);if(this.state.status!==Status.LOADPOS){this.setState({status:Status.LOADPOS});this.props.removeLayer("cyclomedia-cone");this.props.removeLayer("cyclomedia-measurements");ResourceRegistry.removeResource("cyclomedia-cone")}}}if(this.props.active&&this.props.mapScale!==prevProps.mapScale){this.props.changeLayerProperty("cyclomedia-recordings","visibility",this.props.mapScale<=this.props.maxMapScale)}if(this.state.status===Status.LOGIN&&prevState.status>Status.LOGIN){this.props.removeLayer("cyclomedia-recordings");this.props.removeLayer("cyclomedia-cone");this.props.removeLayer("cyclomedia-measurements");ResourceRegistry.removeResource("cyclomedia-cone")}}},{key:"render",value:function render(){var _this2=this;if(!this.props.active){return null}var overlay=null;if(this.state.status===Status.LOGIN){overlay=/*#__PURE__*/React.createElement("div",{className:"cyclomedia-body-overlay"},/*#__PURE__*/React.createElement("div",{className:"cyclomedia-login"},/*#__PURE__*/React.createElement("table",null,/*#__PURE__*/React.createElement("tbody",null,/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",null,"Username:"),/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement("input",{onChange:function onChange(ev){return _this2.setState({username:ev.target.value})},type:"text",value:this.state.username}))),/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",null,"Password:"),/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement("input",{onChange:function onChange(ev){return _this2.setState({password:ev.target.value})},type:"password",value:this.state.password}))),/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",{colSpan:"2"},/*#__PURE__*/React.createElement("button",{className:"button",disabled:!this.state.username,onClick:function onClick(){return _this2.setState({status:Status.INITIALIZING})},type:"button"},LocaleUtils.tr("cyclomedia.login")))),/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",{className:"cyclomedia-login-message",colSpan:"2"},this.state.message))))))}else if(this.state.status===Status.INITIALIZING){overlay=/*#__PURE__*/React.createElement("div",{className:"cyclomedia-body-overlay"},/*#__PURE__*/React.createElement(Spinner,null),/*#__PURE__*/React.createElement("span",null,LocaleUtils.tr("cyclomedia.initializing")))}else if(this.state.status===Status.ERROR){overlay=/*#__PURE__*/React.createElement("div",{className:"cyclomedia-body-overlay"},/*#__PURE__*/React.createElement("span",null,LocaleUtils.tr("cyclomedia.loaderror")))}else if(this.state.status===Status.INITIALIZED){overlay=/*#__PURE__*/React.createElement("div",{className:"cyclomedia-body-overlay"},/*#__PURE__*/React.createElement("span",null,LocaleUtils.tr("cyclomedia.clickonmap")))}else if(this.state.status===Status.LOADPOS){overlay=/*#__PURE__*/React.createElement("div",{className:"cyclomedia-body-overlay"},/*#__PURE__*/React.createElement(Spinner,null),/*#__PURE__*/React.createElement("span",null,LocaleUtils.tr("cyclomedia.loading")))}return/*#__PURE__*/React.createElement(ResizeableWindow,{dockable:this.props.geometry.side,icon:"cyclomedia",initialHeight:this.props.geometry.initialHeight,initialWidth:this.props.geometry.initialWidth,initialX:this.props.geometry.initialX,initialY:this.props.geometry.initialY,initiallyDocked:this.props.geometry.initiallyDocked,onClose:this.onClose,splitScreenWhenDocked:true,title:LocaleUtils.tr("cyclomedia.title"),usePortal:false},/*#__PURE__*/React.createElement("div",{className:"cyclomedia-body",role:"body"},this.props.mapScale>this.props.maxMapScale&&this.state.status>Status.LOGIN?/*#__PURE__*/React.createElement("div",{className:"cyclomedia-scale-hint"},LocaleUtils.tr("cyclomedia.scalehint",this.props.maxMapScale)):null,this.state.status>Status.LOGIN?/*#__PURE__*/React.createElement("iframe",{className:"cyclomedia-frame",onLoad:function onLoad(ev){return _this2.setupIframe(ev.target)},ref:function ref(el){return _this2.setIframeRef(el)}}):null,overlay))}}])}(React.Component);_defineProperty(Cyclomedia,"propTypes",{active:PropTypes.bool,addLayer:PropTypes.func,addLayerFeatures:PropTypes.func,/** The Cyclomedia API key */apikey:PropTypes.string,changeLayerProperty:PropTypes.func,click:PropTypes.object,/** OAuth client ID. */clientId:PropTypes.string,/** Fields from user_infos which contain username and password which will be pre-inserted into the login form. */credentialUserInfoFields:PropTypes.shape({username:PropTypes.string,password:PropTypes.string}),/** The cyclomedia version. */cyclomediaVersion:PropTypes.string,/** Whether to display Cyclomedia measurement geometries on the map. */displayMeasurements:PropTypes.bool,/** Default window geometry with size, position and docking status. Positive position values (including '0') are related to top (InitialY) and left (InitialX), negative values (including '-0') to bottom (InitialY) and right (InitialX). */geometry:PropTypes.shape({initialWidth:PropTypes.number,initialHeight:PropTypes.number,initialX:PropTypes.number,initialY:PropTypes.number,initiallyDocked:PropTypes.bool,side:PropTypes.string}),/** The relative path to the redirect login handling of oauth. */loginRedirectUri:PropTypes.string,/** The relative path to the redirect logout handling of oauth. */logoutRedirectUri:PropTypes.string,mapCrs:PropTypes.string,mapScale:PropTypes.number,/** The maximum map scale above which the recordings WFS won't be displayed. */maxMapScale:PropTypes.number,/** The projection to use for Cyclomedia. */projection:PropTypes.string,removeLayer:PropTypes.func,setCurrentTask:PropTypes.func,theme:PropTypes.object,userInfos:PropTypes.object});_defineProperty(Cyclomedia,"defaultProps",{cyclomediaVersion:"24.1",displayMeasurements:true,geometry:{initialWidth:480,initialHeight:640,initialX:0,initialY:0,initiallyDocked:false,side:"left"},maxMapScale:5000,projection:"EPSG:3857"});export default connect(function(state){return{active:state.task.id==="Cyclomedia",click:state.map.click,mapCrs:state.map.projection,mapScale:MapUtils.computeForZoom(state.map.scales,state.map.zoom),theme:state.theme.current,userInfos:state.localConfig.user_infos}},{addLayer:addLayer,addLayerFeatures:addLayerFeatures,changeLayerProperty:changeLayerProperty,removeLayer:removeLayer,setCurrentTask:setCurrentTask})(Cyclomedia);
@@ -12,10 +12,10 @@ function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof
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
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,"Pick",_this.props.taskData.feature)}else{_this.changeSelectedLayer(_this.state.selectedLayer,"Pick")}_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",geomReadOnly:false,feature:null}});if(editPermissions.creatable!==false){// Draw button will appear by default if no permissions are defined in theme editConfig or when creatable permission is set
15
- actionButtons.push({key:"Draw",icon:"editdraw",label:LocaleUtils.tr("editing.draw"),data:{action:"Draw",geomReadOnly:false}})}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){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})}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 layerName=editConfig[layerId].layerName;var match=LayerUtils.searchLayer(_this.props.layers,"name",layerName,[LayerRole.THEME]);return/*#__PURE__*/React.createElement("option",{key:layerId,value:layerId},match?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
15
+ actionButtons.push({key:"Draw",icon:"editdraw",label:LocaleUtils.tr("editing.draw"),data:{action:"Draw",geomReadOnly:false}})}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){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})}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
16
16
  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
17
17
  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
18
- 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.uuid,"visibility",visibility,path,recurseDirection)}return oldvisibility}}return null});_defineProperty(_this,"changeSelectedLayer",function(selectedLayer){var action=arguments.length>1&&arguments[1]!==undefined?arguments[1]:null;var feature=arguments.length>2&&arguments[2]!==undefined?arguments[2]:null;var curConfig=_this.props.theme&&_this.props.theme.editConfig&&selectedLayer?_this.props.theme.editConfig[selectedLayer]:null;var editPermissions=curConfig?curConfig.permissions||{}:{};_this.props.setEditContext("Editing",{action:action||(_this.state.drawPick?"Draw":_this.props.editContext.action),feature:feature,geomType:curConfig?curConfig.geomType:null,geomReadOnly:editPermissions.updatable===false});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});var editConfig=_this.props.theme.editConfig[_this.state.selectedLayer];var editPermissions=editConfig.permissions||{};_this.props.setEditContext("Editing",{feature:feature,changed:false,geomReadOnly:editPermissions.updatable===false})});_defineProperty(_this,"toggleDrawPick",function(){_this.setState(function(state){var pickActive=!state.drawPick;_this.props.setEditContext("Editing",{action:pickActive?null:"Draw"});return{drawPick:pickActive}})});return _this}_inherits(Editing,_React$Component);return _createClass(Editing,[{key:"componentDidUpdate",value:function componentDidUpdate(prevProps,prevState){var _this2=this;var themeSublayers=this.props.layers.reduce(function(accum,layer){return layer.role===LayerRole.THEME?accum.concat(LayerUtils.getSublayerNames(layer)):accum},[]);// Update selected layer on layers change
18
+ 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 action=arguments.length>1&&arguments[1]!==undefined?arguments[1]:null;var feature=arguments.length>2&&arguments[2]!==undefined?arguments[2]:null;var curConfig=_this.props.theme&&_this.props.theme.editConfig&&selectedLayer?_this.props.theme.editConfig[selectedLayer]:null;var editPermissions=curConfig?curConfig.permissions||{}:{};_this.props.setEditContext("Editing",{action:action||(_this.state.drawPick?"Draw":_this.props.editContext.action),feature:feature,geomType:curConfig?curConfig.geomType:null,geomReadOnly:editPermissions.updatable===false});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});var editConfig=_this.props.theme.editConfig[_this.state.selectedLayer];var editPermissions=editConfig.permissions||{};_this.props.setEditContext("Editing",{feature:feature,changed:false,geomReadOnly:editPermissions.updatable===false})});_defineProperty(_this,"toggleDrawPick",function(){_this.setState(function(state){var pickActive=!state.drawPick;_this.props.setEditContext("Editing",{action:pickActive?null:"Draw"});return{drawPick:pickActive}})});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
19
19
  if(this.props.enabled&&(this.props.layers!==prevProps.layers||!prevProps.enabled)){var layerIds=Object.keys(this.props.theme&&this.props.theme.editConfig||{}).filter(function(layerId){return themeSublayers.includes(layerId)});if(!isEmpty(layerIds)){if(!layerIds.includes(this.state.selectedLayer)){this.changeSelectedLayer(layerIds[0],"Pick")}}else if(this.state.selectedLayer){this.changeSelectedLayer(null)}}// If click point changed and in pick mode with a selected layer, trigger a pick
20
20
  var isCurrentContext=this.props.editContext.id===this.props.currentEditContext;if(this.props.enabled&&isCurrentContext&&this.props.editContext.action==="Pick"&&this.state.selectedLayer&&!this.props.editContext.changed){var newPoint=this.props.map.click||{};var oldPoint=prevProps.map.click||{};if(newPoint.coordinate&&!isEqual(newPoint.coordinate,oldPoint.coordinate)){var _this$props$filter$fi;var scale=Math.round(MapUtils.computeForZoom(this.props.map.scales,this.props.map.zoom));var editConfig=this.props.theme.editConfig[this.state.selectedLayer];var editPermissions=editConfig.permissions||{};var editDataset=editConfig.editDataset;this.props.iface.getFeature(editDataset,newPoint.coordinate,this.props.map.projection,scale,96,function(featureCollection){var features=featureCollection?featureCollection.features:null;_this2.setState({pickedFeatures:features});var feature=features?features[0]:null;_this2.props.setEditContext("Editing",{feature:feature,changed:false,geomReadOnly:editPermissions.updatable===false})},(_this$props$filter$fi=this.props.filter.filterParams)===null||_this$props$filter$fi===void 0?void 0:_this$props$filter$fi[this.state.selectedLayer],this.props.filter.filterGeom)}}if(prevProps.editContext.changed!==this.props.editContext.changed){this.props.setCurrentTaskBlocked(this.props.editContext.changed===true,LocaleUtils.tr("editing.unsavedchanged"))}if(!this.props.editContext.feature&&prevState.pickedFeatures){this.setState({pickedFeatures:null})}}},{key:"render",value:function render(){var _this3=this;var minMaxTooltip=this.state.minimized?LocaleUtils.tr("editing.maximize"):LocaleUtils.tr("editing.minimize");var extraTitlebarContent=/*#__PURE__*/React.createElement(Icon,{className:"editing-minimize-maximize",icon:this.state.minimized?"chevron-down":"chevron-up",onClick:function onClick(){return _this3.setState(function(state){return{minimized:!state.minimized}})},title:minMaxTooltip});var attribFormVisible=!!(this.props.editContext.feature&&(this.props.editContext.action==="Pick"||this.props.editContext.feature.geometry));return[/*#__PURE__*/React.createElement(SideBar,{extraTitlebarContent:extraTitlebarContent,heightResizeable:!this.state.minimized&&attribFormVisible,icon:"editing",id:"Editing",key:"EditingSidebar",onHide:this.onHide,onShow:this.onShow,side:this.props.side,title:LocaleUtils.tr("appmenu.items.Editing"),width:this.props.width},function(){return{body:_this3.state.minimized?null:_this3.renderBody()}}),this.state.drawPick?/*#__PURE__*/React.createElement(PickFeature,{featureFilter:this.pickFilter,featurePicked:this.geomPicked,key:"FeaturePicker"}):null]}}])}(React.Component);_defineProperty(Editing,"propTypes",{addLayerFeatures:PropTypes.func,/** Whether to enable the "Clone existing geometry" functionality. */allowCloneGeometry:PropTypes.bool,changeLayerProperty:PropTypes.func,clearEditContext:PropTypes.func,currentEditContext:PropTypes.string,editContext:PropTypes.object,enabled:PropTypes.bool,filter:PropTypes.object,iface:PropTypes.object,layers:PropTypes.array,map:PropTypes.object,refreshLayer:PropTypes.func,removeLayer:PropTypes.func,setCurrentTask:PropTypes.func,setCurrentTaskBlocked:PropTypes.func,setEditContext:PropTypes.func,setSnappingConfig:PropTypes.func,/** The side of the application on which to display the sidebar. */side:PropTypes.string,/** Whether snapping is available when editing. */snapping:PropTypes.bool,/** Whether snapping is enabled by default when editing.
21
21
  * Either `false`, `edge`, `vertex` or `true` (i.e. both vertex and edge). */snappingActive:PropTypes.oneOfType([PropTypes.bool,PropTypes.string]),taskData:PropTypes.object,theme:PropTypes.object,/** The default width of the editing sidebar, as a CSS width string. */width:PropTypes.string});_defineProperty(Editing,"defaultProps",{width:"30em",side:"right",snapping:true,snappingActive:true,allowCloneGeometry:true});export default(function(){var iface=arguments.length>0&&arguments[0]!==undefined?arguments[0]:EditingInterface;return connect(function(state){return{enabled:state.task.id==="Editing",theme:state.theme.current,layers:state.layers.flat,filter:state.layers.filter,map:state.map,iface:iface,editContext:state.editing.contexts.Editing||{},currentEditContext:state.editing.currentContext,taskData:state.task.id==="Editing"?state.task.data:null}},{addLayerFeatures:addLayerFeatures,removeLayer:removeLayer,clearEditContext:clearEditContext,setEditContext:setEditContext,setSnappingConfig:setSnappingConfig,setCurrentTask:setCurrentTask,setCurrentTaskBlocked:setCurrentTaskBlocked,refreshLayer:refreshLayer,changeLayerProperty:changeLayerProperty})(Editing)});
@@ -18,4 +18,4 @@ function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof
18
18
  *
19
19
  * Can be used as default identify tool by setting `"identifyTool": "FeatureForm"` in `config.json`.
20
20
  */var FeatureForm=/*#__PURE__*/function(_React$Component){function FeatureForm(props){var _this;_classCallCheck(this,FeatureForm);_this=_callSuper(this,FeatureForm,[props]);_defineProperty(_this,"queryPoint",function(prevProps){if(_this.props.click.button!==0||_this.props.click===prevProps.click||(_this.props.click.features||[]).find(function(feature){return feature.id==="startupposmarker"})){return null}var searchMarker=(_this.props.click.features||[]).find(function(feature){return feature.id==="searchmarker"});if(searchMarker&&searchMarker.geometry.type==="Point"){return searchMarker.geometry.coordinates}return _this.props.click.coordinate});_defineProperty(_this,"queryFeatures",function(pos){var pendingRequests=0;Object.entries(_this.props.theme.editConfig||{}).forEach(function(_ref){var _this$props$filter$fi;var _ref2=_slicedToArray(_ref,2),layerId=_ref2[0],editConfig=_ref2[1];if(!editConfig.geomType){// Skip geometryless datasets
21
- return}var path=[];var sublayer=null;var mapScale=MapUtils.computeForZoom(_this.props.map.scales,_this.props.map.zoom);var layer=_this.props.layers.find(function(l){return l.role===LayerRole.THEME&&(sublayer=LayerUtils.searchSubLayer(l,"name",layerId,path))});if(!layer||!sublayer||!LayerUtils.sublayerVisible(layer,path)||!LayerUtils.layerScaleInRange(sublayer,mapScale)){return}var layerOrder=layer.params.LAYERS.split(",");++pendingRequests;var editDataset=editConfig.editDataset||layerId;var scale=Math.round(MapUtils.computeForZoom(_this.props.map.scales,_this.props.map.zoom));_this.props.iface.getFeature(editDataset,pos,_this.props.map.projection,scale,96,function(featureCollection){if(featureCollection&&!isEmpty(featureCollection.features)){_this.setState(function(state){var newPickedFeatures=Object.fromEntries(Object.entries(_objectSpread(_objectSpread({},state.pickedFeatures),featureCollection.features.reduce(function(res,feature){return _objectSpread(_objectSpread({},res),{},_defineProperty({},layerId+"::"+feature.id,feature))},{}))).sort(function(a,b){var partsA=a[0].split("::");var partsB=b[0].split("::");var diff=layerOrder.indexOf(partsB[0])-layerOrder.indexOf(partsA[0]);return diff===0?partsA[1].localeCompare(partsB[1]):diff}));var selectedFeature=state.pendingRequests<=1&&!state.selectedFeature?Object.keys(newPickedFeatures)[0]:"";return{pickedFeatures:newPickedFeatures,pendingRequests:state.pendingRequests-1,selectedFeature:selectedFeature}})}else{_this.setState(function(state){var _Object$keys$;var selectedFeature=state.pendingRequests<=1&&!state.selectedFeature?(_Object$keys$=Object.keys(state.pickedFeatures)[0])!==null&&_Object$keys$!==void 0?_Object$keys$:"":"";return{pendingRequests:state.pendingRequests-1,selectedFeature:selectedFeature}})}},(_this$props$filter$fi=_this.props.filter.filterParams)===null||_this$props$filter$fi===void 0?void 0:_this$props$filter$fi[sublayer.name],_this.props.filter.filterGeom)});_this.setState({pendingRequests:pendingRequests,pickedFeatures:{},selectedFeature:""})});_defineProperty(_this,"setSelectedFeature",function(ev){_this.setState({selectedFeature:ev.target.value})});_defineProperty(_this,"onWindowClose",function(){_this.clearResults();if(_this.props.exitTaskOnResultsClose){_this.props.setCurrentTask(null)}});_defineProperty(_this,"clearResults",function(){if(!_this.props.editContext.changed){_this.setState(FeatureForm.defaultState)}});_this.state=FeatureForm.defaultState;return _this}_inherits(FeatureForm,_React$Component);return _createClass(FeatureForm,[{key:"componentDidUpdate",value:function componentDidUpdate(prevProps,prevState){if(this.props.enabled&&!prevProps.enabled){this.props.setEditContext("FeatureForm",{action:"Pick"})}var isCurrentContext=this.props.editContext.id===this.props.currentEditContext;if(this.props.enabled&&isCurrentContext&&!this.props.editContext.changed&&this.state.pendingRequests===0){var clickPoint=this.queryPoint(prevProps);if(clickPoint){this.queryFeatures(clickPoint)}}if(this.props.enabled&&this.state.selectedFeature!==prevState.selectedFeature){var feature=this.state.pickedFeatures?this.state.pickedFeatures[this.state.selectedFeature]:null;var curLayerId=this.state.selectedFeature.split("::")[0];var curConfig=this.props.theme.editConfig[curLayerId]||{};var editPermissions=curConfig.permissions||{};this.props.setEditContext("FeatureForm",{action:"Pick",feature:feature,changed:false,geomType:curConfig.geomType||null,geomReadOnly:editPermissions.updatable===false})}if(!this.props.enabled&&prevProps.enabled){this.props.clearEditContext("FeatureForm");this.setState(FeatureForm.defaultState)}}},{key:"render",value:function render(){var _this2=this;var resultWindow=null;if(this.state.pickedFeatures!==null){var body=null;if(this.state.pendingRequests>0){body=/*#__PURE__*/React.createElement("div",{className:"feature-query-body",role:"body"},/*#__PURE__*/React.createElement("span",{className:"identify-body-message"},LocaleUtils.tr("featureform.querying")))}else if(isEmpty(this.state.pickedFeatures)){body=/*#__PURE__*/React.createElement("div",{className:"feature-query-body",role:"body"},/*#__PURE__*/React.createElement("span",{className:"identify-body-message"},LocaleUtils.tr("featureform.noresults")))}else{var featureText=LocaleUtils.tr("featureform.feature");var curLayerId=this.state.selectedFeature.split("::")[0];var curConfig=this.props.theme.editConfig[curLayerId];body=/*#__PURE__*/React.createElement("div",{className:"feature-query-body",role:"body"},Object.keys(this.state.pickedFeatures).length>1?/*#__PURE__*/React.createElement("div",{className:"feature-query-selection"},/*#__PURE__*/React.createElement("select",{onChange:this.setSelectedFeature,value:this.state.selectedFeature},Object.entries(this.state.pickedFeatures).map(function(_ref3){var _ref4=_slicedToArray(_ref3,2),id=_ref4[0],feature=_ref4[1];var _id$split=id.split("::"),_id$split2=_slicedToArray(_id$split,2),layerId=_id$split2[0],featureId=_id$split2[1];var editConfig=_this2.props.theme.editConfig[layerId];var match=LayerUtils.searchLayer(_this2.props.layers,"name",editConfig.layerName,[LayerRole.THEME]);var layerName=match?match.sublayer.title:editConfig.layerName;var featureName=editConfig.displayField?feature.properties[editConfig.displayField]:featureText+" "+featureId;return/*#__PURE__*/React.createElement("option",{key:id,value:id},layerName+": "+featureName)}))):null,this.props.editContext.feature?/*#__PURE__*/React.createElement(AttributeForm,{editConfig:curConfig,editContext:this.props.editContext,iface:this.props.iface}):null)}resultWindow=/*#__PURE__*/React.createElement(ResizeableWindow,{dockable:this.props.geometry.side,icon:"featureform",initialHeight:this.props.geometry.initialHeight,initialWidth:this.props.geometry.initialWidth,initialX:this.props.geometry.initialX,initialY:this.props.geometry.initialY,initiallyDocked:this.props.geometry.initiallyDocked,key:"FeatureForm",onClose:this.onWindowClose,title:LocaleUtils.tr("featureform.title")},body)}return[resultWindow,/*#__PURE__*/React.createElement(TaskBar,{key:"FeatureFormTaskBar",task:"FeatureForm"},function(){return{body:LocaleUtils.tr("infotool.clickhelpPoint")}})]}}])}(React.Component);_defineProperty(FeatureForm,"propTypes",{clearEditContext:PropTypes.func,click:PropTypes.object,currentEditContext:PropTypes.string,editContext:PropTypes.object,enabled:PropTypes.bool,/** Whether to clear the task when the results window is closed. */exitTaskOnResultsClose:PropTypes.bool,filter:PropTypes.object,/** Default window geometry with size, position and docking status. Positive position values (including '0') are related to top (InitialY) and left (InitialX), negative values (including '-0') to bottom (InitialY) and right (InitialX). */geometry:PropTypes.shape({initialWidth:PropTypes.number,initialHeight:PropTypes.number,initialX:PropTypes.number,initialY:PropTypes.number,initiallyDocked:PropTypes.bool,side:PropTypes.string}),iface:PropTypes.object,layers:PropTypes.array,map:PropTypes.object,setCurrentTask:PropTypes.func,setEditContext:PropTypes.func,theme:PropTypes.object});_defineProperty(FeatureForm,"defaultProps",{geometry:{initialWidth:320,initialHeight:480,initialX:0,initialY:0,initiallyDocked:false,side:"left"}});_defineProperty(FeatureForm,"defaultState",{pendingRequests:0,pickedFeatures:null,selectedFeature:""});export default(function(){var iface=arguments.length>0&&arguments[0]!==undefined?arguments[0]:EditingInterface;return connect(function(state){var enabled=state.task.id==="FeatureForm"||state.task.identifyEnabled&&ConfigUtils.getConfigProp("identifyTool",state.theme.current,"Identify")==="FeatureForm";return{click:state.map.click||{modifiers:{}},enabled:enabled,editContext:state.editing.contexts.FeatureForm||{},currentEditContext:state.editing.currentContext,iface:iface,layers:state.layers.flat,filter:state.layers.filter,map:state.map,theme:state.theme.current}},{setCurrentTask:setCurrentTask,clearEditContext:clearEditContext,setEditContext:setEditContext})(FeatureForm)});
21
+ return}var path=[];var sublayer=null;var mapScale=MapUtils.computeForZoom(_this.props.map.scales,_this.props.map.zoom);var layer=_this.props.layers.find(function(l){return l.role===LayerRole.THEME&&(sublayer=LayerUtils.searchSubLayer(l,"name",layerId,path))});if(!layer||!sublayer||!LayerUtils.sublayerVisible(layer,path)||!LayerUtils.layerScaleInRange(sublayer,mapScale)){return}var layerOrder=layer.params.LAYERS.split(",");++pendingRequests;var editDataset=editConfig.editDataset||layerId;var scale=Math.round(MapUtils.computeForZoom(_this.props.map.scales,_this.props.map.zoom));_this.props.iface.getFeature(editDataset,pos,_this.props.map.projection,scale,96,function(featureCollection){if(featureCollection&&!isEmpty(featureCollection.features)){_this.setState(function(state){var newPickedFeatures=Object.fromEntries(Object.entries(_objectSpread(_objectSpread({},state.pickedFeatures),featureCollection.features.reduce(function(res,feature){return _objectSpread(_objectSpread({},res),{},_defineProperty({},layerId+"::"+feature.id,feature))},{}))).sort(function(a,b){var partsA=a[0].split("::");var partsB=b[0].split("::");var diff=layerOrder.indexOf(partsB[0])-layerOrder.indexOf(partsA[0]);return diff===0?partsA[1].localeCompare(partsB[1]):diff}));var selectedFeature=state.pendingRequests<=1&&!state.selectedFeature?Object.keys(newPickedFeatures)[0]:"";return{pickedFeatures:newPickedFeatures,pendingRequests:state.pendingRequests-1,selectedFeature:selectedFeature}})}else{_this.setState(function(state){var _Object$keys$;var selectedFeature=state.pendingRequests<=1&&!state.selectedFeature?(_Object$keys$=Object.keys(state.pickedFeatures)[0])!==null&&_Object$keys$!==void 0?_Object$keys$:"":"";return{pendingRequests:state.pendingRequests-1,selectedFeature:selectedFeature}})}},(_this$props$filter$fi=_this.props.filter.filterParams)===null||_this$props$filter$fi===void 0?void 0:_this$props$filter$fi[sublayer.name],_this.props.filter.filterGeom)});_this.setState({pendingRequests:pendingRequests,pickedFeatures:{},selectedFeature:""})});_defineProperty(_this,"setSelectedFeature",function(ev){_this.setState({selectedFeature:ev.target.value})});_defineProperty(_this,"onWindowClose",function(){_this.clearResults();if(_this.props.exitTaskOnResultsClose){_this.props.setCurrentTask(null)}});_defineProperty(_this,"clearResults",function(){if(!_this.props.editContext.changed){_this.setState(FeatureForm.defaultState)}});_this.state=FeatureForm.defaultState;return _this}_inherits(FeatureForm,_React$Component);return _createClass(FeatureForm,[{key:"componentDidUpdate",value:function componentDidUpdate(prevProps,prevState){if(this.props.enabled&&!prevProps.enabled){this.props.setEditContext("FeatureForm",{action:"Pick"})}var isCurrentContext=this.props.editContext.id===this.props.currentEditContext;if(this.props.enabled&&isCurrentContext&&!this.props.editContext.changed&&this.state.pendingRequests===0){var clickPoint=this.queryPoint(prevProps);if(clickPoint){this.queryFeatures(clickPoint)}}if(this.props.enabled&&this.state.selectedFeature!==prevState.selectedFeature){var feature=this.state.pickedFeatures?this.state.pickedFeatures[this.state.selectedFeature]:null;var curLayerId=this.state.selectedFeature.split("::")[0];var curConfig=this.props.theme.editConfig[curLayerId]||{};var editPermissions=curConfig.permissions||{};this.props.setEditContext("FeatureForm",{action:"Pick",feature:feature,changed:false,geomType:curConfig.geomType||null,geomReadOnly:editPermissions.updatable===false})}if(!this.props.enabled&&prevProps.enabled){this.props.clearEditContext("FeatureForm");this.setState(FeatureForm.defaultState)}}},{key:"render",value:function render(){var _this2=this;var resultWindow=null;if(this.state.pickedFeatures!==null){var body=null;if(this.state.pendingRequests>0){body=/*#__PURE__*/React.createElement("div",{className:"feature-query-body",role:"body"},/*#__PURE__*/React.createElement("span",{className:"identify-body-message"},LocaleUtils.tr("featureform.querying")))}else if(isEmpty(this.state.pickedFeatures)){body=/*#__PURE__*/React.createElement("div",{className:"feature-query-body",role:"body"},/*#__PURE__*/React.createElement("span",{className:"identify-body-message"},LocaleUtils.tr("featureform.noresults")))}else{var featureText=LocaleUtils.tr("featureform.feature");var curLayerId=this.state.selectedFeature.split("::")[0];var curConfig=this.props.theme.editConfig[curLayerId];body=/*#__PURE__*/React.createElement("div",{className:"feature-query-body",role:"body"},Object.keys(this.state.pickedFeatures).length>1?/*#__PURE__*/React.createElement("div",{className:"feature-query-selection"},/*#__PURE__*/React.createElement("select",{onChange:this.setSelectedFeature,value:this.state.selectedFeature},Object.entries(this.state.pickedFeatures).map(function(_ref3){var _match$sublayer$title,_match$sublayer;var _ref4=_slicedToArray(_ref3,2),id=_ref4[0],feature=_ref4[1];var _id$split=id.split("::"),_id$split2=_slicedToArray(_id$split,2),layerId=_id$split2[0],featureId=_id$split2[1];var editConfig=_this2.props.theme.editConfig[layerId];var match=LayerUtils.searchLayer(_this2.props.layers,_this2.props.theme.url,editConfig.layerName);var layerName=(_match$sublayer$title=match===null||match===void 0||(_match$sublayer=match.sublayer)===null||_match$sublayer===void 0?void 0:_match$sublayer.title)!==null&&_match$sublayer$title!==void 0?_match$sublayer$title:editConfig.layerName;var featureName=editConfig.displayField?feature.properties[editConfig.displayField]:featureText+" "+featureId;return/*#__PURE__*/React.createElement("option",{key:id,value:id},layerName+": "+featureName)}))):null,this.props.editContext.feature?/*#__PURE__*/React.createElement(AttributeForm,{editConfig:curConfig,editContext:this.props.editContext,iface:this.props.iface}):null)}resultWindow=/*#__PURE__*/React.createElement(ResizeableWindow,{dockable:this.props.geometry.side,icon:"featureform",initialHeight:this.props.geometry.initialHeight,initialWidth:this.props.geometry.initialWidth,initialX:this.props.geometry.initialX,initialY:this.props.geometry.initialY,initiallyDocked:this.props.geometry.initiallyDocked,key:"FeatureForm",onClose:this.onWindowClose,title:LocaleUtils.tr("featureform.title")},body)}return[resultWindow,/*#__PURE__*/React.createElement(TaskBar,{key:"FeatureFormTaskBar",task:"FeatureForm"},function(){return{body:LocaleUtils.tr("infotool.clickhelpPoint")}})]}}])}(React.Component);_defineProperty(FeatureForm,"propTypes",{clearEditContext:PropTypes.func,click:PropTypes.object,currentEditContext:PropTypes.string,editContext:PropTypes.object,enabled:PropTypes.bool,/** Whether to clear the task when the results window is closed. */exitTaskOnResultsClose:PropTypes.bool,filter:PropTypes.object,/** Default window geometry with size, position and docking status. Positive position values (including '0') are related to top (InitialY) and left (InitialX), negative values (including '-0') to bottom (InitialY) and right (InitialX). */geometry:PropTypes.shape({initialWidth:PropTypes.number,initialHeight:PropTypes.number,initialX:PropTypes.number,initialY:PropTypes.number,initiallyDocked:PropTypes.bool,side:PropTypes.string}),iface:PropTypes.object,layers:PropTypes.array,map:PropTypes.object,setCurrentTask:PropTypes.func,setEditContext:PropTypes.func,theme:PropTypes.object});_defineProperty(FeatureForm,"defaultProps",{geometry:{initialWidth:320,initialHeight:480,initialX:0,initialY:0,initiallyDocked:false,side:"left"}});_defineProperty(FeatureForm,"defaultState",{pendingRequests:0,pickedFeatures:null,selectedFeature:""});export default(function(){var iface=arguments.length>0&&arguments[0]!==undefined?arguments[0]:EditingInterface;return connect(function(state){var enabled=state.task.id==="FeatureForm"||state.task.identifyEnabled&&ConfigUtils.getConfigProp("identifyTool",state.theme.current,"Identify")==="FeatureForm";return{click:state.map.click||{modifiers:{}},enabled:enabled,editContext:state.editing.contexts.FeatureForm||{},currentEditContext:state.editing.currentContext,iface:iface,layers:state.layers.flat,filter:state.layers.filter,map:state.map,theme:state.theme.current}},{setCurrentTask:setCurrentTask,clearEditContext:clearEditContext,setEditContext:setEditContext})(FeatureForm)});
@@ -14,5 +14,5 @@ function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof
14
14
  * Extendable in combination with the `qwc-feature-info-service`, which provides support
15
15
  * for customized queries and templates for the result presentation.
16
16
  */var Identify=/*#__PURE__*/function(_React$Component){function Identify(){var _this;_classCallCheck(this,Identify);for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++){args[_key]=arguments[_key]}_this=_callSuper(this,Identify,[].concat(args));_defineProperty(_this,"state",{mode:"Point",identifyResults:null,pendingRequests:0,radius:0,radiusUnits:_this.props.initialRadiusUnits,exitTaskOnResultsClose:null,filterGeom:null,filterGeomModifiers:{}});_defineProperty(_this,"identifyPoint",function(clickPoint){if(clickPoint){_this.setState(function(state){// Remove any search selection layer to avoid confusion
17
- _this.props.removeLayer("searchselection");var pendingRequests=0;var identifyResults=_this.props.click.modifiers.ctrl!==true?{}:state.identifyResults;var queryableLayers=[];queryableLayers=IdentifyUtils.getQueryLayers(_this.props.layers,_this.props.map);queryableLayers.forEach(function(l){var request=IdentifyUtils.buildRequest(l,l.queryLayers.join(","),clickPoint,_this.props.map,_this.props.params);++pendingRequests;IdentifyUtils.sendRequest(request,function(response){_this.setState(function(state2){return{pendingRequests:state2.pendingRequests-1}});if(response){_this.parseResult(response,l,request.params.info_format,clickPoint)}})});if(!isEmpty(_this.props.click.features)){_this.props.click.features.forEach(function(feature){var layer=_this.props.layers.find(function(l){return l.id===feature.layerId});if((layer===null||layer===void 0?void 0:layer.role)===LayerRole.USERLAYER){var _layer$features$find,_layer$features,_layer$features$find2,_layer$projection;var queryFeature=_objectSpread({},(_layer$features$find=(_layer$features=layer.features)===null||_layer$features===void 0||(_layer$features$find2=_layer$features.find)===null||_layer$features$find2===void 0?void 0:_layer$features$find2.call(_layer$features,function(f){return f.id===feature.id}))!==null&&_layer$features$find!==void 0?_layer$features$find:feature);if(!(queryFeature!==null&&queryFeature!==void 0&&queryFeature.properties)){return}if(!identifyResults[layer.name]){identifyResults[layer.name]=[]}queryFeature.crs=(_layer$projection=layer.projection)!==null&&_layer$projection!==void 0?_layer$projection:_this.props.map.projection;queryFeature.displayname=queryFeature.properties.name||queryFeature.properties.Name||queryFeature.properties.NAME||queryFeature.properties.label||queryFeature.properties.id||queryFeature.id;queryFeature.layertitle=layer.title||layer.name||layer.id;queryFeature.properties=Object.entries(queryFeature.properties).reduce(function(res,_ref){var _ref2=_slicedToArray(_ref,2),key=_ref2[0],val=_ref2[1];return _objectSpread(_objectSpread({},res),{},_defineProperty({},key,_typeof(val)==="object"?JSON.stringify(val):val))},{});identifyResults[layer.name].push(queryFeature)}})}_this.props.addMarker("identify",clickPoint,"",_this.props.map.projection);return{identifyResults:identifyResults,pendingRequests:pendingRequests}})}});_defineProperty(_this,"queryPoint",function(prevProps){if(_this.props.click.button!==0||_this.props.click===prevProps.click||(_this.props.click.features||[]).find(function(feature){return feature.id==="startupposmarker"})){return null}var searchMarker=(_this.props.click.features||[]).find(function(feature){return feature.id==="searchmarker"});if(searchMarker&&searchMarker.geometry.type==="Point"){return searchMarker.geometry.coordinates}return _this.props.click.coordinate});_defineProperty(_this,"identifyRegion",function(){var queryableLayers=IdentifyUtils.getQueryLayers(_this.props.layers,_this.props.map);var poly=_this.state.filterGeom.coordinates[0];if(poly.length<3||isEmpty(queryableLayers)){return}var identifyResults=_this.state.filterGeomModifiers.ctrl!==true?{}:_this.state.identifyResults;var center=[0,0];poly.forEach(function(point){center[0]+=point[0];center[1]+=point[1]});center[0]/=poly.length;center[1]/=poly.length;var filter=VectorLayerUtils.geoJSONGeomToWkt(_this.state.filterGeom);var pendingRequests=0;var params=_objectSpread({},_this.props.params);if(_this.props.params.region_feature_count){params.feature_count=_this.props.params.region_feature_count;delete params.region_feature_count}queryableLayers.forEach(function(layer){var request=IdentifyUtils.buildFilterRequest(layer,layer.queryLayers.join(","),filter,_this.props.map,params);++pendingRequests;IdentifyUtils.sendRequest(request,function(response){_this.setState(function(state){return{pendingRequests:state.pendingRequests-1}});if(response){_this.parseResult(response,layer,request.params.info_format,center)}});_this.setState({identifyResults:identifyResults,pendingRequests:pendingRequests})})});_defineProperty(_this,"identifyRadius",function(){var clickPoint=_this.state.filterGeom.center;var queryableLayers=IdentifyUtils.getQueryLayers(_this.props.layers,_this.props.map);if(isEmpty(queryableLayers)){return}var identifyResults=_this.state.filterGeomModifiers.ctrl!==true?{}:_this.state.identifyResults;var filter=VectorLayerUtils.geoJSONGeomToWkt(_this.state.filterGeom);var pendingRequests=0;var params=_objectSpread({},_this.props.params);if(_this.props.params.radius_feature_count){params.feature_count=_this.props.params.radius_feature_count;delete params.radius_feature_count}queryableLayers.forEach(function(layer){var request=IdentifyUtils.buildFilterRequest(layer,layer.queryLayers.join(","),filter,_this.props.map,params);++pendingRequests;IdentifyUtils.sendRequest(request,function(response){_this.setState(function(state){return{pendingRequests:state.pendingRequests-1}});if(response){_this.parseResult(response,layer,request.params.info_format,clickPoint)}});_this.setState({identifyResults:identifyResults,pendingRequests:pendingRequests})});_this.props.addMarker("identify",clickPoint,"",_this.props.map.projection)});_defineProperty(_this,"changeBufferUnit",function(ev){_this.setState({radiusUnits:ev.target.value})});_defineProperty(_this,"parseResult",function(response,layer,format,clickPoint){var newResults=IdentifyUtils.parseResponse(response,layer,format,clickPoint,_this.props.map.projection,_this.props.featureInfoReturnsLayerName,_this.props.layers);// Merge with previous
18
- _this.setState(function(state){var identifyResults=_objectSpread({},state.identifyResults);Object.keys(newResults).forEach(function(layername){var existingFeatures=identifyResults[layername]||[];newResults[layername].forEach(function(newFeature){var featureIndex=existingFeatures.findIndex(function(feature){return feature.id===newFeature.id});if(featureIndex===-1){existingFeatures.push(newFeature)}});identifyResults[layername]=existingFeatures});return{identifyResults:identifyResults}})});_defineProperty(_this,"onShow",function(mode,data){_this.setState({mode:mode||"Point",exitTaskOnResultsClose:data===null||data===void 0?void 0:data.exitTaskOnResultsClose});if(mode==="Point"&&data!==null&&data!==void 0&&data.pos){_this.identifyPoint(data.pos)}});_defineProperty(_this,"onToolClose",function(){_this.setState({mode:"Point",exitTaskOnResultsClose:null,filterGeom:null});if(_this.props.clearResultsOnClose){_this.clearResults()}});_defineProperty(_this,"onWindowClose",function(){_this.clearResults();if(_this.state.exitTaskOnResultsClose||_this.props.exitTaskOnResultsClose){_this.props.setCurrentTask(null)}});_defineProperty(_this,"clearResults",function(){_this.props.removeMarker("identify");_this.props.removeLayer("identifyslection");_this.props.removeLayer("identifyradiusbuffer");_this.setState({identifyResults:null,pendingRequests:0})});_defineProperty(_this,"updateRadius",function(radius,units){_this.setState(function(state){return{radius:radius,radiusUnits:units,filterGeom:_objectSpread(_objectSpread({},state.filterGeom),{},{radius:MeasureUtils.convertLength(radius,units,"m")})}})});_defineProperty(_this,"renderBody",function(){if(_this.state.mode==="Point"){return LocaleUtils.tr("infotool.clickhelpPoint")}else if(_this.state.mode==="Region"){return LocaleUtils.tr("infotool.clickhelpPolygon")}else if(_this.state.mode==="Radius"){var text=LocaleUtils.tr("infotool.clickhelpRadius");return/*#__PURE__*/React.createElement("div",null,/*#__PURE__*/React.createElement("div",null,text),/*#__PURE__*/React.createElement("div",{className:"identify-radius-controls controlgroup"},/*#__PURE__*/React.createElement("span",null,LocaleUtils.tr("infotool.radius"),":\xA0"),/*#__PURE__*/React.createElement(NumberInput,{disabled:!_this.state.filterGeom,max:1000000,min:1,mobile:true,onChange:function onChange(rad){return _this.updateRadius(rad,_this.state.radiusUnits)},value:_this.state.radius}),/*#__PURE__*/React.createElement("select",{onChange:function onChange(ev){return _this.updateRadius(_this.state.radius,ev.target.value)},value:_this.state.radiusUnits},/*#__PURE__*/React.createElement("option",{value:"m"},"m"),/*#__PURE__*/React.createElement("option",{value:"ft"},"ft"),/*#__PURE__*/React.createElement("option",{value:"km"},"km"),/*#__PURE__*/React.createElement("option",{value:"mi"},"mi"))))}return null});return _this}_inherits(Identify,_React$Component);return _createClass(Identify,[{key:"componentDidUpdate",value:function componentDidUpdate(prevProps,prevState){if(this.props.theme!==prevProps.theme){this.clearResults()}else if(!this.props.enabled&&prevProps.enabled){if(this.props.clearResultsOnClose){this.clearResults()}}if(this.props.enabled){if(this.state.mode==="Point"){var clickPoint=this.queryPoint(prevProps);this.identifyPoint(clickPoint)}else if(this.state.mode==="Region"){if(this.state.filterGeom&&this.state.filterGeom!==prevState.filterGeom){this.identifyRegion()}}else if(this.state.mode==="Radius"){if(this.state.filterGeom&&this.state.filterGeom!==prevState.filterGeom){this.setState(function(state){return{radius:MeasureUtils.convertLength(state.filterGeom.radius,"m",state.radiusUnits)}});this.identifyRadius()}}}}},{key:"render",value:function render(){var _this2=this;var resultWindow=null;if(this.state.pendingRequests>0||this.state.identifyResults!==null){var body=null;if(isEmpty(this.state.identifyResults)){if(this.state.pendingRequests>0){body=/*#__PURE__*/React.createElement("div",{className:"identify-body",role:"body"},/*#__PURE__*/React.createElement("span",{className:"identify-body-message"},LocaleUtils.tr("identify.querying")))}else{body=/*#__PURE__*/React.createElement("div",{className:"identify-body",role:"body"},/*#__PURE__*/React.createElement("span",{className:"identify-body-message"},LocaleUtils.tr("identify.noresults")))}}else{body=/*#__PURE__*/React.createElement(IdentifyViewer,{attributeCalculator:this.props.attributeCalculator,attributeTransform:this.props.attributeTransform,customExporters:this.props.customExporters,displayResultTree:this.props.displayResultTree,enableAggregatedReports:this.props.enableAggregatedReports,enableExport:this.props.enableExport,exportGeometry:this.props.exportGeometry,highlightAllResults:this.props.highlightAllResults,identifyResults:this.state.identifyResults,iframeDialogsInitiallyDocked:this.props.iframeDialogsInitiallyDocked,longAttributesDisplay:this.props.longAttributesDisplay,replaceImageUrls:this.props.replaceImageUrls,role:"body",showLayerSelector:this.props.showLayerSelector})}resultWindow=/*#__PURE__*/React.createElement(ResizeableWindow,{busyIcon:this.state.pendingRequests>0,dockable:this.props.geometry.side,icon:"info-sign",initialHeight:this.props.geometry.initialHeight,initialWidth:this.props.geometry.initialWidth,initialX:this.props.geometry.initialX,initialY:this.props.geometry.initialY,initiallyDocked:this.props.geometry.initiallyDocked,key:"IdentifyWindow",onClose:this.onWindowClose,title:LocaleUtils.tr("identify.title")},body)}return[resultWindow,/*#__PURE__*/React.createElement(TaskBar,{key:"IdentifyTaskBar",onHide:this.onToolClose,onShow:this.onShow,task:"Identify"},function(){return{body:_this2.renderBody()}}),this.state.mode==="Region"||this.state.mode==="Radius"?/*#__PURE__*/React.createElement(MapSelection,{active:true,geomType:this.state.mode==="Radius"?"Circle":"Polygon",geometry:this.state.filterGeom,geometryChanged:function geometryChanged(geom,mod){return _this2.setState({filterGeom:geom,filterGeomModifiers:mod})},key:"MapSelection",measure:this.state.mode==="Radius"}):null]}}])}(React.Component);_defineProperty(Identify,"propTypes",{addLayerFeatures:PropTypes.func,addMarker:PropTypes.func,/** Optional function for computing derived attributes. See js/IdentifyExtensions.js for details. This prop can be specified in the appConfig.js cfg section. */attributeCalculator:PropTypes.func,/** Optional function for transforming attribute values. See js/IdentifyExtensions.js for details. This prop can be specified in the appConfig.js cfg section. */attributeTransform:PropTypes.func,/** Whether to clear the identify results when exiting the identify tool. */clearResultsOnClose:PropTypes.bool,click:PropTypes.object,currentIdentifyTool:PropTypes.string,currentTask:PropTypes.string,/** Optional list of custom exporters to offer along with the built-in exporters. See js/IdentifyExtensions.js for details. This prop can be specified in the appConfig.js cfg section. */customExporters:PropTypes.array,/** Whether to display a tree overview of results (as opposed to a flat list of results). */displayResultTree:PropTypes.bool,/** Whether to enable the aggregated report download button. */enableAggregatedReports:PropTypes.bool,/** Whether to enable the export functionality. Either `true|false` or a list of single allowed formats (builtin formats: `json`, `geojson`, `csv`, `csvzip`) */enableExport:PropTypes.oneOfType([PropTypes.bool,PropTypes.array]),enabled:PropTypes.bool,/** Whether to clear the task when the results window is closed. */exitTaskOnResultsClose:PropTypes.bool,/** Whether to include the geometry in exported features. Default: `true`. */exportGeometry:PropTypes.bool,/** Whether to assume that XML GetFeatureInfo responses specify the technical layer name in the `name` attribute, rather than the layer title. */featureInfoReturnsLayerName:PropTypes.bool,/** Default window geometry with size, position and docking status. Positive position values (including '0') are related to top (InitialY) and left (InitialX), negative values (including '-0') to bottom (InitialY) and right (InitialX). */geometry:PropTypes.shape({initialWidth:PropTypes.number,initialHeight:PropTypes.number,initialX:PropTypes.number,initialY:PropTypes.number,initiallyDocked:PropTypes.bool,side:PropTypes.string}),/** Whether to highlight all results if no result is hovered */highlightAllResults:PropTypes.bool,iframeDialogsInitiallyDocked:PropTypes.bool,/** The initial radius units of the identify dialog in radius mode. One of 'm', 'ft', 'km', 'mi'. */initialRadiusUnits:PropTypes.string,layers:PropTypes.array,longAttributesDisplay:PropTypes.string,map:PropTypes.object,/** Extra params to append to the GetFeatureInfo request (i.e. `FI_POINT_TOLERANCE`, `FI_LINE_TOLERANCE`, `feature_count`, ...). Additionally, `region_feature_count` and `radius_feature_count` are supported. */params:PropTypes.object,removeLayer:PropTypes.func,removeMarker:PropTypes.func,/** Whether to replace an attribute value containing an URL to an image with an inline image. */replaceImageUrls:PropTypes.bool,selection:PropTypes.object,setCurrentTask:PropTypes.func,/** Whether to show a layer selector to filter the identify results by layer. */showLayerSelector:PropTypes.bool,theme:PropTypes.object});_defineProperty(Identify,"defaultProps",{enableAggregatedReports:true,enableExport:true,exportGeometry:true,clearResultsOnClose:true,customExporters:[],longAttributesDisplay:"ellipsis",displayResultTree:true,replaceImageUrls:true,featureInfoReturnsLayerName:true,geometry:{initialWidth:240,initialHeight:320,initialX:0,initialY:0,initiallyDocked:false,side:"left"},initialRadiusUnits:"m",highlightAllResults:true,showLayerSelector:true});export default connect(function(state){var enabled=state.task.id==="Identify"||state.task.identifyEnabled&&ConfigUtils.getConfigProp("identifyTool",state.theme.current,"Identify")==="Identify";return{click:state.map.click||{modifiers:{}},enabled:enabled,layers:state.layers.flat,map:state.map,selection:state.selection,theme:state.theme.current}},{addLayerFeatures:addLayerFeatures,addMarker:addMarker,removeMarker:removeMarker,removeLayer:removeLayer,setCurrentTask:setCurrentTask})(Identify);
17
+ _this.props.removeLayer("searchselection");var pendingRequests=0;var identifyResults=_this.props.click.modifiers.ctrl!==true?{}:state.identifyResults;var queryableLayers=[];queryableLayers=IdentifyUtils.getQueryLayers(_this.props.layers,_this.props.map);queryableLayers.forEach(function(l){var request=IdentifyUtils.buildRequest(l,l.queryLayers.join(","),clickPoint,_this.props.map,_this.props.params);++pendingRequests;IdentifyUtils.sendRequest(request,function(response){_this.setState(function(state2){return{pendingRequests:state2.pendingRequests-1}});if(response){_this.parseResult(response,l,request.params.info_format,clickPoint)}})});if(!isEmpty(_this.props.click.features)){_this.props.click.features.forEach(function(feature){var layer=_this.props.layers.find(function(l){return l.id===feature.layerId});if((layer===null||layer===void 0?void 0:layer.role)===LayerRole.USERLAYER){var _layer$features$find,_layer$features,_layer$features$find2,_layer$projection;var queryFeature=_objectSpread({},(_layer$features$find=(_layer$features=layer.features)===null||_layer$features===void 0||(_layer$features$find2=_layer$features.find)===null||_layer$features$find2===void 0?void 0:_layer$features$find2.call(_layer$features,function(f){return f.id===feature.id}))!==null&&_layer$features$find!==void 0?_layer$features$find:feature);if(!(queryFeature!==null&&queryFeature!==void 0&&queryFeature.properties)){return}if(!identifyResults[layer.name]){identifyResults[layer.name]=[]}queryFeature.crs=(_layer$projection=layer.projection)!==null&&_layer$projection!==void 0?_layer$projection:_this.props.map.projection;queryFeature.displayname=queryFeature.properties.name||queryFeature.properties.Name||queryFeature.properties.NAME||queryFeature.properties.label||queryFeature.properties.id||queryFeature.id;queryFeature.layertitle=layer.title||layer.name||layer.id;queryFeature.properties=Object.entries(queryFeature.properties).reduce(function(res,_ref){var _ref2=_slicedToArray(_ref,2),key=_ref2[0],val=_ref2[1];return _objectSpread(_objectSpread({},res),{},_defineProperty({},key,_typeof(val)==="object"?JSON.stringify(val):val))},{});identifyResults[layer.name].push(queryFeature)}})}_this.props.addMarker("identify",clickPoint,"",_this.props.map.projection);return{identifyResults:identifyResults,pendingRequests:pendingRequests}})}});_defineProperty(_this,"queryPoint",function(prevProps){if(_this.props.click.button!==0||_this.props.click===prevProps.click||(_this.props.click.features||[]).find(function(feature){return feature.id==="startupposmarker"})){return null}var searchMarker=(_this.props.click.features||[]).find(function(feature){return feature.id==="searchmarker"});if(searchMarker&&searchMarker.geometry.type==="Point"){return searchMarker.geometry.coordinates}return _this.props.click.coordinate});_defineProperty(_this,"identifyRegion",function(){var queryableLayers=IdentifyUtils.getQueryLayers(_this.props.layers,_this.props.map);var poly=_this.state.filterGeom.coordinates[0];if(poly.length<3||isEmpty(queryableLayers)){return}var identifyResults=_this.state.filterGeomModifiers.ctrl!==true?{}:_this.state.identifyResults;var center=[0,0];poly.forEach(function(point){center[0]+=point[0];center[1]+=point[1]});center[0]/=poly.length;center[1]/=poly.length;var filter=VectorLayerUtils.geoJSONGeomToWkt(_this.state.filterGeom);var pendingRequests=0;var params=_objectSpread({},_this.props.params);if(_this.props.params.region_feature_count){params.feature_count=_this.props.params.region_feature_count;delete params.region_feature_count}queryableLayers.forEach(function(layer){var request=IdentifyUtils.buildFilterRequest(layer,layer.queryLayers.join(","),filter,_this.props.map,params);++pendingRequests;IdentifyUtils.sendRequest(request,function(response){_this.setState(function(state){return{pendingRequests:state.pendingRequests-1}});if(response){_this.parseResult(response,layer,request.params.info_format,center)}});_this.setState({identifyResults:identifyResults,pendingRequests:pendingRequests})})});_defineProperty(_this,"identifyRadius",function(){var clickPoint=_this.state.filterGeom.center;var queryableLayers=IdentifyUtils.getQueryLayers(_this.props.layers,_this.props.map);if(isEmpty(queryableLayers)){return}var identifyResults=_this.state.filterGeomModifiers.ctrl!==true?{}:_this.state.identifyResults;var filter=VectorLayerUtils.geoJSONGeomToWkt(_this.state.filterGeom);var pendingRequests=0;var params=_objectSpread({},_this.props.params);if(_this.props.params.radius_feature_count){params.feature_count=_this.props.params.radius_feature_count;delete params.radius_feature_count}queryableLayers.forEach(function(layer){var request=IdentifyUtils.buildFilterRequest(layer,layer.queryLayers.join(","),filter,_this.props.map,params);++pendingRequests;IdentifyUtils.sendRequest(request,function(response){_this.setState(function(state){return{pendingRequests:state.pendingRequests-1}});if(response){_this.parseResult(response,layer,request.params.info_format,clickPoint)}});_this.setState({identifyResults:identifyResults,pendingRequests:pendingRequests})});_this.props.addMarker("identify",clickPoint,"",_this.props.map.projection)});_defineProperty(_this,"changeBufferUnit",function(ev){_this.setState({radiusUnits:ev.target.value})});_defineProperty(_this,"parseResult",function(response,layer,format,clickPoint){var newResults=IdentifyUtils.parseResponse(response,layer,format,clickPoint,_this.props.map.projection,_this.props.featureInfoReturnsLayerName);// Merge with previous
18
+ _this.setState(function(state){var identifyResults=_objectSpread({},state.identifyResults);Object.entries(newResults).forEach(function(_ref3){var _ref4=_slicedToArray(_ref3,2),layername=_ref4[0],features=_ref4[1];var key=layer.url+"#"+layername;identifyResults[key]=features.reduce(function(result,feature){if(result.find(function(f){return f.id===feature.id})===undefined){result.push(feature)}return result},identifyResults[key]||[])});return{identifyResults:identifyResults}})});_defineProperty(_this,"onShow",function(mode,data){_this.setState({mode:mode||"Point",exitTaskOnResultsClose:data===null||data===void 0?void 0:data.exitTaskOnResultsClose});if(mode==="Point"&&data!==null&&data!==void 0&&data.pos){_this.identifyPoint(data.pos)}});_defineProperty(_this,"onToolClose",function(){_this.setState({mode:"Point",exitTaskOnResultsClose:null,filterGeom:null});if(_this.props.clearResultsOnClose){_this.clearResults()}});_defineProperty(_this,"onWindowClose",function(){_this.clearResults();if(_this.state.exitTaskOnResultsClose||_this.props.exitTaskOnResultsClose){_this.props.setCurrentTask(null)}});_defineProperty(_this,"clearResults",function(){_this.props.removeMarker("identify");_this.props.removeLayer("identifyslection");_this.props.removeLayer("identifyradiusbuffer");_this.setState({identifyResults:null,pendingRequests:0})});_defineProperty(_this,"updateRadius",function(radius,units){_this.setState(function(state){return{radius:radius,radiusUnits:units,filterGeom:_objectSpread(_objectSpread({},state.filterGeom),{},{radius:MeasureUtils.convertLength(radius,units,"m")})}})});_defineProperty(_this,"renderBody",function(){if(_this.state.mode==="Point"){return LocaleUtils.tr("infotool.clickhelpPoint")}else if(_this.state.mode==="Region"){return LocaleUtils.tr("infotool.clickhelpPolygon")}else if(_this.state.mode==="Radius"){var text=LocaleUtils.tr("infotool.clickhelpRadius");return/*#__PURE__*/React.createElement("div",null,/*#__PURE__*/React.createElement("div",null,text),/*#__PURE__*/React.createElement("div",{className:"identify-radius-controls controlgroup"},/*#__PURE__*/React.createElement("span",null,LocaleUtils.tr("infotool.radius"),":\xA0"),/*#__PURE__*/React.createElement(NumberInput,{disabled:!_this.state.filterGeom,max:1000000,min:1,mobile:true,onChange:function onChange(rad){return _this.updateRadius(rad,_this.state.radiusUnits)},value:_this.state.radius}),/*#__PURE__*/React.createElement("select",{onChange:function onChange(ev){return _this.updateRadius(_this.state.radius,ev.target.value)},value:_this.state.radiusUnits},/*#__PURE__*/React.createElement("option",{value:"m"},"m"),/*#__PURE__*/React.createElement("option",{value:"ft"},"ft"),/*#__PURE__*/React.createElement("option",{value:"km"},"km"),/*#__PURE__*/React.createElement("option",{value:"mi"},"mi"))))}return null});return _this}_inherits(Identify,_React$Component);return _createClass(Identify,[{key:"componentDidUpdate",value:function componentDidUpdate(prevProps,prevState){if(this.props.theme!==prevProps.theme){this.clearResults()}else if(!this.props.enabled&&prevProps.enabled){if(this.props.clearResultsOnClose){this.clearResults()}}if(this.props.enabled){if(this.state.mode==="Point"){var clickPoint=this.queryPoint(prevProps);this.identifyPoint(clickPoint)}else if(this.state.mode==="Region"){if(this.state.filterGeom&&this.state.filterGeom!==prevState.filterGeom){this.identifyRegion()}}else if(this.state.mode==="Radius"){if(this.state.filterGeom&&this.state.filterGeom!==prevState.filterGeom){this.setState(function(state){return{radius:MeasureUtils.convertLength(state.filterGeom.radius,"m",state.radiusUnits)}});this.identifyRadius()}}}}},{key:"render",value:function render(){var _this2=this;var resultWindow=null;if(this.state.pendingRequests>0||this.state.identifyResults!==null){var body=null;if(isEmpty(this.state.identifyResults)){if(this.state.pendingRequests>0){body=/*#__PURE__*/React.createElement("div",{className:"identify-body",role:"body"},/*#__PURE__*/React.createElement("span",{className:"identify-body-message"},LocaleUtils.tr("identify.querying")))}else{body=/*#__PURE__*/React.createElement("div",{className:"identify-body",role:"body"},/*#__PURE__*/React.createElement("span",{className:"identify-body-message"},LocaleUtils.tr("identify.noresults")))}}else{body=/*#__PURE__*/React.createElement(IdentifyViewer,{attributeCalculator:this.props.attributeCalculator,attributeTransform:this.props.attributeTransform,customExporters:this.props.customExporters,displayResultTree:this.props.displayResultTree,enableAggregatedReports:this.props.enableAggregatedReports,enableExport:this.props.enableExport,exportGeometry:this.props.exportGeometry,highlightAllResults:this.props.highlightAllResults,identifyResults:this.state.identifyResults,iframeDialogsInitiallyDocked:this.props.iframeDialogsInitiallyDocked,longAttributesDisplay:this.props.longAttributesDisplay,replaceImageUrls:this.props.replaceImageUrls,role:"body",showLayerSelector:this.props.showLayerSelector})}resultWindow=/*#__PURE__*/React.createElement(ResizeableWindow,{busyIcon:this.state.pendingRequests>0,dockable:this.props.geometry.side,icon:"info-sign",initialHeight:this.props.geometry.initialHeight,initialWidth:this.props.geometry.initialWidth,initialX:this.props.geometry.initialX,initialY:this.props.geometry.initialY,initiallyDocked:this.props.geometry.initiallyDocked,key:"IdentifyWindow",onClose:this.onWindowClose,title:LocaleUtils.tr("identify.title")},body)}return[resultWindow,/*#__PURE__*/React.createElement(TaskBar,{key:"IdentifyTaskBar",onHide:this.onToolClose,onShow:this.onShow,task:"Identify"},function(){return{body:_this2.renderBody()}}),this.state.mode==="Region"||this.state.mode==="Radius"?/*#__PURE__*/React.createElement(MapSelection,{active:true,geomType:this.state.mode==="Radius"?"Circle":"Polygon",geometry:this.state.filterGeom,geometryChanged:function geometryChanged(geom,mod){return _this2.setState({filterGeom:geom,filterGeomModifiers:mod})},key:"MapSelection",measure:this.state.mode==="Radius"}):null]}}])}(React.Component);_defineProperty(Identify,"propTypes",{addLayerFeatures:PropTypes.func,addMarker:PropTypes.func,/** Optional function for computing derived attributes. See js/IdentifyExtensions.js for details. This prop can be specified in the appConfig.js cfg section. */attributeCalculator:PropTypes.func,/** Optional function for transforming attribute values. See js/IdentifyExtensions.js for details. This prop can be specified in the appConfig.js cfg section. */attributeTransform:PropTypes.func,/** Whether to clear the identify results when exiting the identify tool. */clearResultsOnClose:PropTypes.bool,click:PropTypes.object,currentIdentifyTool:PropTypes.string,currentTask:PropTypes.string,/** Optional list of custom exporters to offer along with the built-in exporters. See js/IdentifyExtensions.js for details. This prop can be specified in the appConfig.js cfg section. */customExporters:PropTypes.array,/** Whether to display a tree overview of results (as opposed to a flat list of results). */displayResultTree:PropTypes.bool,/** Whether to enable the aggregated report download button. */enableAggregatedReports:PropTypes.bool,/** Whether to enable the export functionality. Either `true|false` or a list of single allowed formats (builtin formats: `json`, `geojson`, `csv`, `csvzip`) */enableExport:PropTypes.oneOfType([PropTypes.bool,PropTypes.array]),enabled:PropTypes.bool,/** Whether to clear the task when the results window is closed. */exitTaskOnResultsClose:PropTypes.bool,/** Whether to include the geometry in exported features. Default: `true`. */exportGeometry:PropTypes.bool,/** Whether to assume that XML GetFeatureInfo responses specify the technical layer name in the `name` attribute, rather than the layer title. */featureInfoReturnsLayerName:PropTypes.bool,/** Default window geometry with size, position and docking status. Positive position values (including '0') are related to top (InitialY) and left (InitialX), negative values (including '-0') to bottom (InitialY) and right (InitialX). */geometry:PropTypes.shape({initialWidth:PropTypes.number,initialHeight:PropTypes.number,initialX:PropTypes.number,initialY:PropTypes.number,initiallyDocked:PropTypes.bool,side:PropTypes.string}),/** Whether to highlight all results if no result is hovered */highlightAllResults:PropTypes.bool,iframeDialogsInitiallyDocked:PropTypes.bool,/** The initial radius units of the identify dialog in radius mode. One of 'm', 'ft', 'km', 'mi'. */initialRadiusUnits:PropTypes.string,layers:PropTypes.array,longAttributesDisplay:PropTypes.string,map:PropTypes.object,/** Extra params to append to the GetFeatureInfo request (i.e. `FI_POINT_TOLERANCE`, `FI_LINE_TOLERANCE`, `feature_count`, ...). Additionally, `region_feature_count` and `radius_feature_count` are supported. */params:PropTypes.object,removeLayer:PropTypes.func,removeMarker:PropTypes.func,/** Whether to replace an attribute value containing an URL to an image with an inline image. */replaceImageUrls:PropTypes.bool,selection:PropTypes.object,setCurrentTask:PropTypes.func,/** Whether to show a layer selector to filter the identify results by layer. */showLayerSelector:PropTypes.bool,theme:PropTypes.object});_defineProperty(Identify,"defaultProps",{enableAggregatedReports:true,enableExport:true,exportGeometry:true,clearResultsOnClose:true,customExporters:[],longAttributesDisplay:"ellipsis",displayResultTree:true,replaceImageUrls:true,featureInfoReturnsLayerName:true,geometry:{initialWidth:240,initialHeight:320,initialX:0,initialY:0,initiallyDocked:false,side:"left"},initialRadiusUnits:"m",highlightAllResults:true,showLayerSelector:true});export default connect(function(state){var enabled=state.task.id==="Identify"||state.task.identifyEnabled&&ConfigUtils.getConfigProp("identifyTool",state.theme.current,"Identify")==="Identify";return{click:state.map.click||{modifiers:{}},enabled:enabled,layers:state.layers.flat,map:state.map,selection:state.selection,theme:state.theme.current}},{addLayerFeatures:addLayerFeatures,addMarker:addMarker,removeMarker:removeMarker,removeLayer:removeLayer,setCurrentTask:setCurrentTask})(Identify);