qwc2 2025.4.30 → 2025.5.0-7.1

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 (35) hide show
  1. package/components/IdentifyViewer.js +1 -1
  2. package/components/SearchBox.js +1 -1
  3. package/components/map/OlLayer.js +5 -5
  4. package/components/map3d/LayerTree3D.js +1 -1
  5. package/components/map3d/Map3D.js +3 -3
  6. package/components/map3d/Map3DLight.js +2 -2
  7. package/components/map3d/layers/VectorLayer3D.js +2 -2
  8. package/components/map3d/layers/WFSLayer3D.js +3 -3
  9. package/components/widgets/EditableSelect.js +2 -2
  10. package/package.json +1 -1
  11. package/plugins/Identify.js +1 -1
  12. package/plugins/TopBar.js +1 -1
  13. package/static/translations/bg-BG.json +1 -0
  14. package/static/translations/ca-ES.json +1 -0
  15. package/static/translations/cs-CZ.json +1 -0
  16. package/static/translations/de-CH.json +2 -1
  17. package/static/translations/de-DE.json +1 -0
  18. package/static/translations/en-US.json +1 -0
  19. package/static/translations/es-ES.json +1 -0
  20. package/static/translations/fi-FI.json +1 -0
  21. package/static/translations/fr-FR.json +1 -0
  22. package/static/translations/hu-HU.json +1 -0
  23. package/static/translations/it-IT.json +1 -0
  24. package/static/translations/ja-JP.json +1 -0
  25. package/static/translations/nl-NL.json +1 -0
  26. package/static/translations/no-NO.json +1 -0
  27. package/static/translations/pl-PL.json +1 -0
  28. package/static/translations/pt-BR.json +1 -0
  29. package/static/translations/pt-PT.json +1 -0
  30. package/static/translations/ro-RO.json +1 -0
  31. package/static/translations/ru-RU.json +1 -0
  32. package/static/translations/sv-SE.json +1 -0
  33. package/static/translations/tr-TR.json +1 -0
  34. package/static/translations/tsconfig.json +1 -0
  35. package/utils/LayerUtils.js +1 -1
@@ -13,4 +13,4 @@ match=LayerUtils.searchLayer(_this.props.layers,"title",result.layertitle)}if(ma
13
13
  text=_this.props.attributeTransform(attrName,text,layer,result);text=MiscUtils.addLinkAnchors(text);return _this.parsedContent(text)});_defineProperty(_this,"parsedContent",function(text){text=text.replace("&#10;","<br />");var options={replace:function replace(node){if(node.name==="a"){return/*#__PURE__*/React.createElement("a",{href:node.attribs.href,onClick:node.attribs.onclick?function(ev){return _this.evalOnClick(ev,node.attribs.onclick)}:_this.attributeLinkClicked,target:node.attribs.target||"_blank"},domToReact(node.children,options))}return undefined}};return htmlReactParser(text,options)});_defineProperty(_this,"evalOnClick",function(ev,onclick){// eslint-disable-next-line
14
14
  eval(onclick);ev.preventDefault()});_defineProperty(_this,"attributeLinkClicked",function(ev){_this.props.openExternalUrl(ev.target.href,ev.target.target,{docked:_this.props.iframeDialogsInitiallyDocked});ev.preventDefault()});_this.currentResultElRef=null;_this.scrollIntoView=false;_this.state.exportFormat=!Array.isArray(props.enableExport)||props.enableExport.includes("geojson")?"geojson":props.enableExport[0];return _this}_inherits(IdentifyViewer,_React$Component);return _createClass(IdentifyViewer,[{key:"componentDidMount",value:function componentDidMount(){this.updateResultTree()}},{key:"componentDidUpdate",value:function componentDidUpdate(prevProps,prevState){if(this.props.identifyResults!==prevProps.identifyResults){this.updateResultTree()}if(prevState.currentResult!==this.state.currentResult||prevState.resultTree!==this.state.resultTree){this.setHighlightedResults(this.state.currentResult===null?null:[this.state.currentResult],this.state.resultTree)}// Scroll to selected result
15
15
  if(this.state.currentResult&&this.state.currentResult!==prevState.currentResult&&this.currentResultElRef&&this.scrollIntoView){this.currentResultElRef.parentNode.scrollTop=this.currentResultElRef.offsetTop-this.currentResultElRef.parentNode.offsetTop;this.scrollIntoView=false;this.currentResultElRef=null}}},{key:"componentWillUnmount",value:function componentWillUnmount(){this.props.removeLayer("__identifyviewerhighlight")}},{key:"render",value:function render(){var _this2=this,_exporters$find;var tree=this.props.displayResultTree;var body=null;var reportFeatures={};if(tree){var contents=Object.keys(this.state.resultTree).map(function(layer){return _this2.renderLayer(layer)});var attributes=this.renderResultAttributes(this.state.currentLayer,this.state.currentResult,"identify-result-tree-frame",reportFeatures);var resultsContainerStyle={maxHeight:attributes?"10em":"initial"};body=[/*#__PURE__*/React.createElement("div",{className:"identify-results-container",key:"results-container",style:resultsContainerStyle},contents),attributes]}else{body=/*#__PURE__*/React.createElement("div",{className:"identify-flat-results-list"},this.props.showLayerSelector?/*#__PURE__*/React.createElement("div",{className:"identify-selectbox"},/*#__PURE__*/React.createElement("select",{className:"identify-layer-select",onChange:function onChange(e){var selectedLayer=e.target.value;_this2.setState({selectedLayer:selectedLayer})}},/*#__PURE__*/React.createElement("option",{value:""},LocaleUtils.tr("identify.layerall")),Object.keys(this.state.resultTree).sort().map(function(layer){return/*#__PURE__*/React.createElement("option",{key:layer,value:layer},layer)})),/*#__PURE__*/React.createElement("span",{className:"identify-buttonbox-spacer"}),/*#__PURE__*/React.createElement("span",null,LocaleUtils.tr("identify.featurecount"),": ",Object.values(this.state.selectedLayer!==""?this.state.resultTree[this.state.selectedLayer]:this.state.resultTree).flat().length)):null,Object.keys(this.state.selectedLayer!==""?_defineProperty({},this.state.selectedLayer,this.state.resultTree[this.state.selectedLayer]):this.state.resultTree).map(function(layer){var layerResults=_this2.state.resultTree[layer];return layerResults.map(function(result){var resultClass=_this2.state.currentResult===result?"identify-result-frame-highlighted":"identify-result-frame-normal";return/*#__PURE__*/React.createElement("div",{key:result.id,onMouseEnter:function onMouseEnter(){return _this2.setState({currentResult:result,currentLayer:layer})},onMouseLeave:function onMouseLeave(){return _this2.setState({currentResult:null,currentLayer:null})}},_this2.renderResultAttributes(layer,result,resultClass,reportFeatures))})}))}// "el.style.background='inherit'": HACK to trigger an additional repaint, since Safari/Chrome on iOS render the element cut off the first time
16
- var exporters=this.getExporters();var clipboardExportDisabled=((_exporters$find=exporters.find(function(entry){return entry.id===_this2.state.exportFormat}))===null||_exporters$find===void 0?void 0:_exporters$find.allowClipboard)!==true;return/*#__PURE__*/React.createElement("div",{className:"identify-body",ref:function ref(el){if(el)el.style.background="inherit"}},body,this.props.enableExport===true||!isEmpty(this.props.enableExport)?/*#__PURE__*/React.createElement("div",{className:"identify-buttonbox"},/*#__PURE__*/React.createElement("span",{className:"identify-buttonbox-spacer"}),/*#__PURE__*/React.createElement("span",null,LocaleUtils.tr("identify.export"),":\xA0"),/*#__PURE__*/React.createElement("div",{className:"controlgroup"},/*#__PURE__*/React.createElement("select",{className:"combo identify-export-format",onChange:function onChange(ev){return _this2.setState({exportFormat:ev.target.value})},value:this.state.exportFormat},exporters.filter(function(entry){return!Array.isArray(_this2.props.enableExport)||_this2.props.enableExport.includes(entry.id)}).map(function(entry){var _entry$title;return/*#__PURE__*/React.createElement("option",{key:entry.id,value:entry.id},(_entry$title=entry.title)!==null&&_entry$title!==void 0?_entry$title:LocaleUtils.tr(entry.titleMsgId))})),/*#__PURE__*/React.createElement("button",{className:"button",onClick:function onClick(){return _this2.exportResults()},title:LocaleUtils.tr("identify.download")},/*#__PURE__*/React.createElement(Icon,{icon:"export"})),/*#__PURE__*/React.createElement("button",{className:"button",disabled:clipboardExportDisabled,onClick:function onClick(){return _this2.exportResults(true)},title:LocaleUtils.tr("identify.clipboard")},/*#__PURE__*/React.createElement(Icon,{icon:"copy"})))):null,Object.values(reportFeatures).find(function(entry){return entry.length>1})!==undefined?/*#__PURE__*/React.createElement("div",{className:"identify-buttonbox"},/*#__PURE__*/React.createElement("span",{className:"identify-buttonbox-spacer"}),/*#__PURE__*/React.createElement("span",null,LocaleUtils.tr("identify.aggregatedreport"),":\xA0"),/*#__PURE__*/React.createElement("div",{className:"controlgroup"},/*#__PURE__*/React.createElement("select",{className:"combo identify-export-format",onChange:function onChange(ev){return _this2.setState({selectedAggregatedReport:ev.target.value})},value:this.state.selectedAggregatedReport||""},/*#__PURE__*/React.createElement("option",{disabled:true,value:""},LocaleUtils.tr("identify.selectlayer")),Object.entries(reportFeatures).map(function(_ref15){var _ref16=_slicedToArray(_ref15,2),layername=_ref16[0],results=_ref16[1];if(results.length>1){return/*#__PURE__*/React.createElement("option",{key:layername,value:layername},results[0].layertitle)}return null})),/*#__PURE__*/React.createElement("button",{className:"button",disabled:!this.state.selectedAggregatedReport||this.state.generatingReport,onClick:function onClick(){return _this2.downloadAggregatedReport(_this2.state.selectedAggregatedReport,reportFeatures[_this2.state.selectedAggregatedReport])}},this.state.generatingReport?/*#__PURE__*/React.createElement(Spinner,null):/*#__PURE__*/React.createElement(Icon,{icon:"report"})))):null)}}])}(React.Component);_defineProperty(IdentifyViewer,"propTypes",{addLayerFeatures:PropTypes.func,attributeCalculator:PropTypes.func,attributeTransform:PropTypes.func,collapsible:PropTypes.bool,customExporters:PropTypes.array,displayResultTree:PropTypes.bool,enableExport:PropTypes.oneOfType([PropTypes.bool,PropTypes.array]),exportGeometry:PropTypes.bool,highlightAllResults:PropTypes.bool,identifyResults:PropTypes.object,iframeDialogsInitiallyDocked:PropTypes.bool,layers:PropTypes.array,longAttributesDisplay:PropTypes.oneOf(["ellipsis","wrap"]),mapcrs:PropTypes.string,openExternalUrl:PropTypes.func,removeLayer:PropTypes.func,replaceImageUrls:PropTypes.bool,setActiveLayerInfo:PropTypes.func,showLayerSelector:PropTypes.bool,showLayerTitles:PropTypes.bool,theme:PropTypes.object,zoomToExtent:PropTypes.func});_defineProperty(IdentifyViewer,"defaultProps",{longAttributesDisplay:"ellipsis",customExporters:[],displayResultTree:true,attributeCalculator:function attributeCalculator(/* layer, feature */){return[]},attributeTransform:function attributeTransform(name,value/* , layer, feature */){return value},showLayerTitles:true,showLayerSelector:true,highlightAllResults:true});var selector=function selector(state){return{theme:state.theme.current,layers:state.layers.flat,mapcrs:state.map.projection}};export default connect(selector,{addLayerFeatures:addLayerFeatures,removeLayer:removeLayer,setActiveLayerInfo:setActiveLayerInfo,openExternalUrl:openExternalUrl,zoomToExtent:zoomToExtent})(IdentifyViewer);
16
+ var exporters=this.getExporters();var clipboardExportDisabled=((_exporters$find=exporters.find(function(entry){return entry.id===_this2.state.exportFormat}))===null||_exporters$find===void 0?void 0:_exporters$find.allowClipboard)!==true;return/*#__PURE__*/React.createElement("div",{className:"identify-body",ref:function ref(el){if(el)el.style.background="inherit"}},body,this.props.enableExport===true||!isEmpty(this.props.enableExport)?/*#__PURE__*/React.createElement("div",{className:"identify-buttonbox"},/*#__PURE__*/React.createElement("span",{className:"identify-buttonbox-spacer"}),/*#__PURE__*/React.createElement("span",null,LocaleUtils.tr("identify.export"),":\xA0"),/*#__PURE__*/React.createElement("div",{className:"controlgroup"},/*#__PURE__*/React.createElement("select",{className:"combo identify-export-format",onChange:function onChange(ev){return _this2.setState({exportFormat:ev.target.value})},value:this.state.exportFormat},exporters.filter(function(entry){return!Array.isArray(_this2.props.enableExport)||_this2.props.enableExport.includes(entry.id)}).map(function(entry){var _entry$title;return/*#__PURE__*/React.createElement("option",{key:entry.id,value:entry.id},(_entry$title=entry.title)!==null&&_entry$title!==void 0?_entry$title:LocaleUtils.tr(entry.titleMsgId))})),/*#__PURE__*/React.createElement("button",{className:"button",onClick:function onClick(){return _this2.exportResults()},title:LocaleUtils.tr("identify.download")},/*#__PURE__*/React.createElement(Icon,{icon:"export"})),/*#__PURE__*/React.createElement("button",{className:"button",disabled:clipboardExportDisabled,onClick:function onClick(){return _this2.exportResults(true)},title:LocaleUtils.tr("identify.clipboard")},/*#__PURE__*/React.createElement(Icon,{icon:"copy"})))):null,this.props.enableAggregatedReports&&Object.values(reportFeatures).find(function(entry){return entry.length>1})!==undefined?/*#__PURE__*/React.createElement("div",{className:"identify-buttonbox"},/*#__PURE__*/React.createElement("span",{className:"identify-buttonbox-spacer"}),/*#__PURE__*/React.createElement("span",null,LocaleUtils.tr("identify.aggregatedreport"),":\xA0"),/*#__PURE__*/React.createElement("div",{className:"controlgroup"},/*#__PURE__*/React.createElement("select",{className:"combo identify-export-format",onChange:function onChange(ev){return _this2.setState({selectedAggregatedReport:ev.target.value})},value:this.state.selectedAggregatedReport||""},/*#__PURE__*/React.createElement("option",{disabled:true,value:""},LocaleUtils.tr("identify.selectlayer")),Object.entries(reportFeatures).map(function(_ref15){var _ref16=_slicedToArray(_ref15,2),layername=_ref16[0],results=_ref16[1];if(results.length>1){return/*#__PURE__*/React.createElement("option",{key:layername,value:layername},results[0].layertitle)}return null})),/*#__PURE__*/React.createElement("button",{className:"button",disabled:!this.state.selectedAggregatedReport||this.state.generatingReport,onClick:function onClick(){return _this2.downloadAggregatedReport(_this2.state.selectedAggregatedReport,reportFeatures[_this2.state.selectedAggregatedReport])}},this.state.generatingReport?/*#__PURE__*/React.createElement(Spinner,null):/*#__PURE__*/React.createElement(Icon,{icon:"report"})))):null)}}])}(React.Component);_defineProperty(IdentifyViewer,"propTypes",{addLayerFeatures:PropTypes.func,attributeCalculator:PropTypes.func,attributeTransform:PropTypes.func,collapsible:PropTypes.bool,customExporters:PropTypes.array,displayResultTree:PropTypes.bool,enableAggregatedReports:PropTypes.bool,enableExport:PropTypes.oneOfType([PropTypes.bool,PropTypes.array]),exportGeometry:PropTypes.bool,highlightAllResults:PropTypes.bool,identifyResults:PropTypes.object,iframeDialogsInitiallyDocked:PropTypes.bool,layers:PropTypes.array,longAttributesDisplay:PropTypes.oneOf(["ellipsis","wrap"]),mapcrs:PropTypes.string,openExternalUrl:PropTypes.func,removeLayer:PropTypes.func,replaceImageUrls:PropTypes.bool,setActiveLayerInfo:PropTypes.func,showLayerSelector:PropTypes.bool,showLayerTitles:PropTypes.bool,theme:PropTypes.object,zoomToExtent:PropTypes.func});_defineProperty(IdentifyViewer,"defaultProps",{longAttributesDisplay:"ellipsis",customExporters:[],displayResultTree:true,attributeCalculator:function attributeCalculator(/* layer, feature */){return[]},attributeTransform:function attributeTransform(name,value/* , layer, feature */){return value},enableAggregatedReports:true,showLayerTitles:true,showLayerSelector:true,highlightAllResults:true});var selector=function selector(state){return{theme:state.theme.current,layers:state.layers.flat,mapcrs:state.map.projection}};export default connect(selector,{addLayerFeatures:addLayerFeatures,removeLayer:removeLayer,setActiveLayerInfo:setActiveLayerInfo,openExternalUrl:openExternalUrl,zoomToExtent:zoomToExtent})(IdentifyViewer);
@@ -14,7 +14,7 @@ var searchText=_this.state.searchText.trim();if(isEmpty(searchText)){_this.setSt
14
14
  results=results.filter(function(group){var _group$type3;return((_group$type3=group.type)!==null&&_group$type3!==void 0?_group$type3:SearchResultType.PLACE)===SearchResultType.PLACE})}_this.setState(function(state){if(searchSession!==state.searchSession){return{}}var searchResults=_objectSpread(_objectSpread({},state.searchResults),{},_defineProperty({},provKey,{results:results,result_counts:response.result_counts,tot_result_count:totResultCount}));var newPendingSearches=state.pendingSearches.filter(function(entry){return entry!==provKey});if(isEmpty(newPendingSearches)&&uniquePlaceResult){// eslint-disable-next-line no-unused-vars
15
15
  var providersWithResults=Object.entries(searchResults).filter(function(_ref7){var _ref8=_slicedToArray(_ref7,2),_=_ref8[0],providerResults=_ref8[1];return providerResults.tot_result_count>0});if(providersWithResults.length===1&&providersWithResults[0][1].tot_result_count===1){var group=providersWithResults[0][1].results[0];_this.selectPlaceResult(providersWithResults[0][0],group,group.items[0])}}return{searchResults:searchResults,pendingSearches:newPendingSearches}})},axios)})});_defineProperty(_this,"filterProviderResults",function(results){if(!_this.state.filterGeometry){return results}var filterPolygon=_this.state.filterGeometry.coordinates[0];return results.map(function(group){var _group$type4;var resultType=(_group$type4=group.type)!==null&&_group$type4!==void 0?_group$type4:SearchResultType.PLACE;if(resultType!==SearchResultType.PLACE){return group}var newItems=group.items.filter(function(item){var _item$crs;var geometry=null;var itemCrs=(_item$crs=item.crs)!==null&&_item$crs!==void 0?_item$crs:_this.props.map.projection;if(item.geometry){geometry=VectorLayerUtils.reprojectGeometry(item.geometry,itemCrs,_this.props.map.projection)}else{geometry={type:"Point",coordinates:CoordinatesUtils.reproject([item.x,item.y],itemCrs,_this.props.map.projection)}}if(geometry.type==="Polygon"){return polygonIntersectTest(geometry.coordinates[0],filterPolygon)}else if(item.bbox){var _CoordinatesUtils$rep=CoordinatesUtils.reprojectBbox(item.bbox,itemCrs,_this.props.map.projection),_CoordinatesUtils$rep2=_slicedToArray(_CoordinatesUtils$rep,4),xmin=_CoordinatesUtils$rep2[0],ymin=_CoordinatesUtils$rep2[1],xmax=_CoordinatesUtils$rep2[2],ymax=_CoordinatesUtils$rep2[3];return polygonIntersectTest([[xmin,ymin],[xmax,ymin],[xmax,ymax],[xmin,ymax],[xmin,ymin]],filterPolygon)}else if(geometry.type==="Point"){return pointInPolygon(geometry.coordinates,filterPolygon)}return true});return newItems.length>0?_objectSpread(_objectSpread({},group),{},{items:newItems}):null}).filter(Boolean)});_defineProperty(_this,"updateRecentSearches",function(){var text=_this.state.searchResults.query_text;if(text&&!_this.state.recentSearches.includes(text)){_this.setState(function(state){return{recentSearches:[text].concat(_toConsumableArray(state.recentSearches.slice(0,4)))}})}});_defineProperty(_this,"blur",function(){if(_this.searchBox){_this.searchBox.blur()}});_defineProperty(_this,"addThemeLayers",function(layer){// Check if layer is already in the LayerTree
16
16
  var sublayers=LayerUtils.getSublayerNames(layer);var existing=_this.props.layers.find(function(l){return l.type===layer.type&&l.url===layer.url&&!isEmpty(LayerUtils.getSublayerNames(l).filter(function(v){return sublayers.includes(v)}))});if(existing){var existingLayerName=(layer.sublayers||[]).length===1?layer.sublayers[0].title:layer.title;var text=LocaleUtils.tr("search.existinglayer")+": "+existingLayerName;_this.props.showNotification("existinglayer",text)}else{_this.props.addLayer(_objectSpread(_objectSpread({},layer),{},{role:LayerRole.USERLAYER}))}if(_this.props.searchOptions.zoomToLayers&&layer.bbox){_this.props.zoomToExtent(layer.bbox.bounds,layer.bbox.crs)}// Show layer tree to notify user that something has happened
17
- _this.props.setCurrentTask("LayerTree")});_defineProperty(_this,"showResultGeometry",function(item,response){var _ref10,_response$bbox,_item$crs3;var scale=arguments.length>2&&arguments[2]!==undefined?arguments[2]:undefined;if(response!==null&&response!==void 0&&response.feature){var _response$feature$fea;var features=(_response$feature$fea=response.feature.features)!==null&&_response$feature$fea!==void 0?_response$feature$fea:[response.feature];var layer={id:"searchselection",role:LayerRole.SELECTION};features.forEach(function(feature){var _response$crs,_feature$geometry;feature.geometry=VectorLayerUtils.reprojectGeometry(feature.geometry,(_response$crs=response.crs)!==null&&_response$crs!==void 0?_response$crs:_this.props.map.projection,_this.props.map.projection);feature.styleName=((_feature$geometry=feature.geometry)===null||_feature$geometry===void 0?void 0:_feature$geometry.type)==="Point"?"marker":"default";feature.styleOptions=_this.props.searchOptions.highlightStyle||{}});// If first feature is not a point(=marker), add a marker
17
+ _this.props.setCurrentTask("LayerTree")});_defineProperty(_this,"showResultGeometry",function(item,response){var _ref10,_response$bbox,_item$crs3;var scale=arguments.length>2&&arguments[2]!==undefined?arguments[2]:undefined;if(response!==null&&response!==void 0&&response.feature){var _response$feature$fea;var features=(_response$feature$fea=response.feature.features)!==null&&_response$feature$fea!==void 0?_response$feature$fea:[response.feature];var layer={id:"searchselection",role:LayerRole.SELECTION};features.forEach(function(feature){var _response$crs,_feature$geometry,_feature$crs;feature.geometry=VectorLayerUtils.reprojectGeometry(feature.geometry,(_response$crs=response.crs)!==null&&_response$crs!==void 0?_response$crs:_this.props.map.projection,_this.props.map.projection);feature.styleName=((_feature$geometry=feature.geometry)===null||_feature$geometry===void 0?void 0:_feature$geometry.type)==="Point"?"marker":"default";feature.styleOptions=_this.props.searchOptions.highlightStyle||{};if((_feature$crs=feature.crs)!==null&&_feature$crs!==void 0&&(_feature$crs=_feature$crs.properties)!==null&&_feature$crs!==void 0&&_feature$crs.name){feature.crs=CoordinatesUtils.fromOgcUrnCrs(feature.crs.properties.name)}});// If first feature is not a point(=marker), add a marker
18
18
  if(features[0].styleName!=="marker"&&!response.hidemarker){var _response$center,_item$crs2;features.unshift({geometry:{type:"Point",coordinates:CoordinatesUtils.reproject((_response$center=response.center)!==null&&_response$center!==void 0?_response$center:[item.x,item.y],(_item$crs2=item.crs)!==null&&_item$crs2!==void 0?_item$crs2:_this.props.map.projection,_this.props.map.projection)},styleName:"marker"})}// Label first feature
19
19
  if(!_this.props.searchOptions.hideResultLabels){var _ref9,_item$label;var label=((_ref9=(_item$label=item.label)!==null&&_item$label!==void 0?_item$label:item.text)!==null&&_ref9!==void 0?_ref9:"").replace(/<\/?\w+\s*\/?>/g,"");features[0].properties=_objectSpread(_objectSpread({},features[0].properties),{},{label:label})}// Mark first feature as searchmarker
20
20
  features[0].id="searchmarker";_this.props.addLayerFeatures(layer,features,true)}var bbox=(_ref10=(_response$bbox=response.bbox)!==null&&_response$bbox!==void 0?_response$bbox:item.bbox)!==null&&_ref10!==void 0?_ref10:[item.x,item.y,item.x,item.y];bbox=CoordinatesUtils.reprojectBbox(bbox,(_item$crs3=item.crs)!==null&&_item$crs3!==void 0?_item$crs3:_this.props.map.projection,_this.props.map.projection);_this.zoomToResultBBox(bbox,scale)});_defineProperty(_this,"zoomToResultBBox",function(bbox,scale){var zoom=0;if(scale){zoom=MapUtils.computeZoom(_this.props.map.scales,scale)}else{var maxZoom=MapUtils.computeZoom(_this.props.map.scales,_this.props.theme.minSearchScaleDenom||_this.props.searchOptions.minScaleDenom);if(bbox[0]!==bbox[2]&&bbox[1]!==bbox[3]){zoom=Math.max(0,MapUtils.getZoomForExtent(bbox,_this.props.map.resolutions,_this.props.map.size,0,maxZoom+1)-1)}else{zoom=maxZoom}}var x=0.5*(bbox[0]+bbox[2]);var y=0.5*(bbox[1]+bbox[3]);_this.props.zoomToPoint([x,y],zoom,_this.props.map.projection)});_defineProperty(_this,"showFeatureGeometry",function(data){var scale=arguments.length>1&&arguments[1]!==undefined?arguments[1]:undefined;var label=arguments.length>2&&arguments[2]!==undefined?arguments[2]:"";// Zoom to bbox
@@ -5,8 +5,8 @@ function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof
5
5
  *
6
6
  * This source code is licensed under the BSD-style license found in the
7
7
  * LICENSE file in the root directory of this source tree.
8
- */import React from"react";import{connect}from"react-redux";import ol from"openlayers";import PropTypes from"prop-types";import{setLayerLoading}from"../../actions/layers";import CoordinatesUtils from"../../utils/CoordinatesUtils";import MapUtils from"../../utils/MapUtils";import Signal from"../../utils/Signal";import LayerRegistry from"./layers/index";export var OlLayerAdded=new Signal;export var OlLayerUpdated=new Signal;var OlLayer=/*#__PURE__*/function(_React$Component){function OlLayer(props){var _this;_classCallCheck(this,OlLayer);_this=_callSuper(this,OlLayer,[props]);_defineProperty(_this,"makeOptions",function(options){var _options$opacity,_options$visibility;var projection=options.srs||options.crs||options.projection||_this.props.projection;return _objectSpread(_objectSpread({},options),{},{projection:projection,opacity:(_options$opacity=options.opacity)!==null&&_options$opacity!==void 0?_options$opacity:255,visibility:(_options$visibility=options.visibility)!==null&&_options$visibility!==void 0?_options$visibility:true,minResolution:typeof options.minScale==="number"?MapUtils.getResolutionsForScales([options.minScale],projection)[0]:undefined,maxResolution:typeof options.maxScale==="number"?MapUtils.getResolutionsForScales([options.maxScale],projection)[0]:undefined})});_defineProperty(_this,"createLayer",function(options){if(options.type==="group"){_this.layer=new ol.layer.Group({zIndex:_this.props.zIndex});_this.layer.setLayers(new ol.Collection(options.items.map(function(item){var layerCreator=LayerRegistry[item.type];if(layerCreator){var sublayer=layerCreator.create(_this.makeOptions(item),_this.props.map);sublayer.set("id",options.id+"#"+item.name);return sublayer}else{return null}}).filter(function(x){return x})))}else{var layerCreator=LayerRegistry[options.type];if(layerCreator){_this.layer=layerCreator.create(options,_this.props.map)}}if(_this.layer){_this.layer.set("id",options.id);// WMS layer handles visibility and opacity internally
9
- if(options.type!=="wms"){_this.layer.setVisible(_this.layer.get("empty")!==true&&options.visibility);_this.layer.setOpacity(options.opacity/255)}_this.layer.setZIndex(_this.props.zIndex);_this.addLayer(_this.layer,options)}});_defineProperty(_this,"updateLayer",function(newOptions,oldOptions){// optimization to avoid to update the layer if not necessary
10
- if(newOptions===oldOptions){return}var layerCreator=LayerRegistry[_this.props.options.type];if(layerCreator&&layerCreator.update){layerCreator.update(_this.layer,newOptions,oldOptions,_this.props.map);OlLayerUpdated.notify(_this.layer)}});_defineProperty(_this,"addLayer",function(layer,options){_this.props.map.addLayer(layer);OlLayerAdded.notify(layer);layer.on("prerender",function(event){var ctx=event.context;ctx.save();ctx.beginPath();if(_this.props.swipe!==null&&_this.props.swipe!==undefined){var width=ctx.canvas.width*(_this.props.swipe/100);ctx.rect(0,0,width,ctx.canvas.height);ctx.clip()}});layer.on("postrender",function(event){event.context.restore()});if(options.zoomToExtent&&options.bbox&&options.bbox.bounds){var map=_this.props.map;var extent=CoordinatesUtils.reprojectBbox(options.bbox.bounds,options.bbox.crs,map.getView().getProjection());try{map.getView().fit(extent,map.getSize())}catch(e){/* pass */}}var sublayers={};if(layer instanceof ol.layer.Group){layer.getLayers().forEach(function(sublayer){sublayers[options.id+"#"+sublayer.get("id")]=sublayer})}else{sublayers[options.id]=layer}Object.entries(sublayers).map(function(_ref){var _ref2=_slicedToArray(_ref,2),id=_ref2[0],sublayer=_ref2[1];if(sublayer.getSource()&&sublayer.getSource().getImageLoadFunction){sublayer.getSource().on("imageloadstart",function(){_this.props.setLayerLoading(id,true)});sublayer.getSource().on("imageloadend",function(){_this.props.setLayerLoading(id,false)});sublayer.getSource().on("imageloaderror",function(){_this.props.setLayerLoading(id,false)})}else if(sublayer.getSource()&&sublayer.getSource().getTileLoadFunction){sublayer.getSource().on("tileloadstart",function(){if(_this.tilestoload===0){_this.props.setLayerLoading(id,true)}_this.tilestoload++});sublayer.getSource().on("tileloadend",function(){_this.tilestoload--;if(_this.tilestoload===0){_this.props.setLayerLoading(id,false)}});sublayer.getSource().on("tileloaderror",function(){_this.tilestoload--;if(_this.tilestoload===0){_this.props.setLayerLoading(id,false)}})}else if(sublayer.getSource()&&sublayer.getSource()instanceof ol.source.Vector&&sublayer.getSource().getUrl()){sublayer.getSource().on("featuresloadstart",function(){_this.props.setLayerLoading(id,true)});sublayer.getSource().on("featuresloadend",function(){_this.props.setLayerLoading(id,false)});sublayer.getSource().on("featuresloaderror",function(){_this.props.setLayerLoading(id,false)})}})});_this.layer=null;return _this}_inherits(OlLayer,_React$Component);return _createClass(OlLayer,[{key:"componentDidMount",value:function componentDidMount(){this.tilestoload=0;this.createLayer(this.makeOptions(this.props.options))}},{key:"componentDidUpdate",value:function componentDidUpdate(prevProps){if(!this.layer){return}var newOptions=this.makeOptions(this.props.options);var oldOptions=this.makeOptions(prevProps.options);this.updateLayer(newOptions,oldOptions);// WMS layer handles visibility and opacity internally
11
- if(newOptions.type!=="wms"){this.layer.setVisible(newOptions.visibility);this.layer.setOpacity(newOptions.opacity/255)}this.layer.setZIndex(this.props.zIndex);if(this.props.swipe!==prevProps.swipe){this.props.map.render()}}},{key:"componentWillUnmount",value:function componentWillUnmount(){if(this.layer&&this.props.map){this.props.map.removeLayer(this.layer)}}},{key:"render",value:function render(){var layerCreator=LayerRegistry[this.props.options.type];if(layerCreator&&layerCreator.render){// NOTE: required for Google Maps layer
12
- return layerCreator.render(this.props.options,this.props.map,this.layer)}return null}}])}(React.Component);_defineProperty(OlLayer,"propTypes",{map:PropTypes.object,options:PropTypes.object,projection:PropTypes.string,setLayerLoading:PropTypes.func,swipe:PropTypes.number,zIndex:PropTypes.number});export default connect(function(){return{}},{setLayerLoading:setLayerLoading})(OlLayer);
8
+ */import React from"react";import{connect}from"react-redux";import ol from"openlayers";import PropTypes from"prop-types";import{refreshLayer,setLayerLoading}from"../../actions/layers";import CoordinatesUtils from"../../utils/CoordinatesUtils";import LayerUtils from"../../utils/LayerUtils";import MapUtils from"../../utils/MapUtils";import Signal from"../../utils/Signal";import LayerRegistry from"./layers/index";export var OlLayerAdded=new Signal;export var OlLayerUpdated=new Signal;var OlLayer=/*#__PURE__*/function(_React$Component){function OlLayer(props){var _this;_classCallCheck(this,OlLayer);_this=_callSuper(this,OlLayer,[props]);_defineProperty(_this,"makeOptions",function(options){var _options$opacity,_options$visibility;var projection=options.srs||options.crs||options.projection||_this.props.projection;return _objectSpread(_objectSpread({},options),{},{projection:projection,opacity:(_options$opacity=options.opacity)!==null&&_options$opacity!==void 0?_options$opacity:255,visibility:(_options$visibility=options.visibility)!==null&&_options$visibility!==void 0?_options$visibility:true,minResolution:typeof options.minScale==="number"?MapUtils.getResolutionsForScales([options.minScale],projection)[0]:undefined,maxResolution:typeof options.maxScale==="number"?MapUtils.getResolutionsForScales([options.maxScale],projection)[0]:undefined})});_defineProperty(_this,"createLayer",function(options){if(options.type==="group"){_this.layer=new ol.layer.Group({zIndex:_this.props.zIndex});_this.layer.setLayers(new ol.Collection(options.items.map(function(item){var layerCreator=LayerRegistry[item.type];if(layerCreator){var sublayer=layerCreator.create(_this.makeOptions(item),_this.props.map);sublayer.set("id",options.id+"#"+item.name);return sublayer}else{return null}}).filter(function(x){return x})))}else{var layerCreator=LayerRegistry[options.type];if(layerCreator){_this.layer=layerCreator.create(options,_this.props.map)}}if(_this.layer){_this.layer.set("id",options.id);// WMS layer handles visibility and opacity internally
9
+ if(options.type!=="wms"){_this.layer.setVisible(_this.layer.get("empty")!==true&&options.visibility);_this.layer.setOpacity(options.opacity/255)}_this.layer.setZIndex(_this.props.zIndex);_this.addLayer(_this.layer,options);var refreshInterval=LayerUtils.getLayerRefreshInterval(options);if(refreshInterval>0&&options.visibility){_this.updateInterval=setInterval(function(){_this.props.refreshLayer(function(layer){return layer.id===options.id})},refreshInterval)}}});_defineProperty(_this,"updateLayer",function(newOptions,oldOptions){// optimization to avoid to update the layer if not necessary
10
+ if(newOptions===oldOptions){return}var layerCreator=LayerRegistry[_this.props.options.type];if(layerCreator&&layerCreator.update){layerCreator.update(_this.layer,newOptions,oldOptions,_this.props.map);OlLayerUpdated.notify(_this.layer)}var oldRefreshInterval=LayerUtils.getLayerRefreshInterval(oldOptions);var newRefreshInterval=LayerUtils.getLayerRefreshInterval(newOptions);if(oldRefreshInterval!==newRefreshInterval||oldOptions.visibility!==newOptions.visibility){clearInterval(_this.updateInterval);_this.updateInterval=null;if(newRefreshInterval&&newOptions.visibility){_this.updateInterval=setInterval(function(){_this.props.refreshLayer(function(layer){return layer.id===newOptions.id})},newRefreshInterval)}}});_defineProperty(_this,"addLayer",function(layer,options){_this.props.map.addLayer(layer);OlLayerAdded.notify(layer);layer.on("prerender",function(event){var ctx=event.context;ctx.save();ctx.beginPath();if(_this.props.swipe!==null&&_this.props.swipe!==undefined){var width=ctx.canvas.width*(_this.props.swipe/100);ctx.rect(0,0,width,ctx.canvas.height);ctx.clip()}});layer.on("postrender",function(event){event.context.restore()});if(options.zoomToExtent&&options.bbox&&options.bbox.bounds){var map=_this.props.map;var extent=CoordinatesUtils.reprojectBbox(options.bbox.bounds,options.bbox.crs,map.getView().getProjection());try{map.getView().fit(extent,map.getSize())}catch(e){/* pass */}}var sublayers={};if(layer instanceof ol.layer.Group){layer.getLayers().forEach(function(sublayer){sublayers[options.id+"#"+sublayer.get("id")]=sublayer})}else{sublayers[options.id]=layer}Object.entries(sublayers).map(function(_ref){var _ref2=_slicedToArray(_ref,2),id=_ref2[0],sublayer=_ref2[1];if(sublayer.getSource()&&sublayer.getSource().getImageLoadFunction){sublayer.getSource().on("imageloadstart",function(){_this.props.setLayerLoading(id,true)});sublayer.getSource().on("imageloadend",function(){_this.props.setLayerLoading(id,false)});sublayer.getSource().on("imageloaderror",function(){_this.props.setLayerLoading(id,false)})}else if(sublayer.getSource()&&sublayer.getSource().getTileLoadFunction){sublayer.getSource().on("tileloadstart",function(){if(_this.tilestoload===0){_this.props.setLayerLoading(id,true)}_this.tilestoload++});sublayer.getSource().on("tileloadend",function(){_this.tilestoload--;if(_this.tilestoload===0){_this.props.setLayerLoading(id,false)}});sublayer.getSource().on("tileloaderror",function(){_this.tilestoload--;if(_this.tilestoload===0){_this.props.setLayerLoading(id,false)}})}else if(sublayer.getSource()&&sublayer.getSource()instanceof ol.source.Vector&&sublayer.getSource().getUrl()){sublayer.getSource().on("featuresloadstart",function(){_this.props.setLayerLoading(id,true)});sublayer.getSource().on("featuresloadend",function(){_this.props.setLayerLoading(id,false)});sublayer.getSource().on("featuresloaderror",function(){_this.props.setLayerLoading(id,false)})}})});_this.layer=null;_this.updateInterval=null;return _this}_inherits(OlLayer,_React$Component);return _createClass(OlLayer,[{key:"componentDidMount",value:function componentDidMount(){this.tilestoload=0;this.createLayer(this.makeOptions(this.props.options))}},{key:"componentDidUpdate",value:function componentDidUpdate(prevProps){if(!this.layer){return}var newOptions=this.makeOptions(this.props.options);var oldOptions=this.makeOptions(prevProps.options);this.updateLayer(newOptions,oldOptions);// WMS layer handles visibility and opacity internally
11
+ if(newOptions.type!=="wms"){this.layer.setVisible(newOptions.visibility);this.layer.setOpacity(newOptions.opacity/255)}this.layer.setZIndex(this.props.zIndex);if(this.props.swipe!==prevProps.swipe){this.props.map.render()}}},{key:"componentWillUnmount",value:function componentWillUnmount(){if(this.layer&&this.props.map){this.props.map.removeLayer(this.layer)}clearInterval(this.updateInterval)}},{key:"render",value:function render(){var layerCreator=LayerRegistry[this.props.options.type];if(layerCreator&&layerCreator.render){// NOTE: required for Google Maps layer
12
+ return layerCreator.render(this.props.options,this.props.map,this.layer)}return null}}])}(React.Component);_defineProperty(OlLayer,"propTypes",{map:PropTypes.object,options:PropTypes.object,projection:PropTypes.string,refreshLayer:PropTypes.func,setLayerLoading:PropTypes.func,swipe:PropTypes.number,zIndex:PropTypes.number});export default connect(function(){return{}},{setLayerLoading:setLayerLoading,refreshLayer:refreshLayer})(OlLayer);
@@ -4,5 +4,5 @@ function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof
4
4
  *
5
5
  * This source code is licensed under the BSD-style license found in the
6
6
  * LICENSE file in the root directory of this source tree.
7
- */import React from"react";import classNames from"classnames";import PropTypes from"prop-types";import{Box3,Group}from"three";import{GLTFLoader}from"three/addons/loaders/GLTFLoader";import{v4 as uuidv4}from"uuid";import ConfigUtils from"../../utils/ConfigUtils";import LocaleUtils from"../../utils/LocaleUtils";import Icon from"../Icon";import SideBar from"../SideBar";import FileSelector from"../widgets/FileSelector";import NumberInput from"../widgets/NumberInput";import Spinner from"../widgets/Spinner";import"./style/LayerTree3D.css";var LayerTree3D=/*#__PURE__*/function(_React$Component){function LayerTree3D(){var _this;_classCallCheck(this,LayerTree3D);for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++){args[_key]=arguments[_key]}_this=_callSuper(this,LayerTree3D,[].concat(args));_defineProperty(_this,"state",{activemenu:null,importvisible:false,selectedfile:null,importing:false});_defineProperty(_this,"renderBody",function(){var sceneContext=_this.props.sceneContext;return/*#__PURE__*/React.createElement("div",null,/*#__PURE__*/React.createElement("div",{className:"layertree3d-section"},LocaleUtils.tr("layertree3d.objects")),Object.entries(sceneContext.sceneObjects).map(function(_ref){var _ref2=_slicedToArray(_ref,2),objectId=_ref2[0],entry=_ref2[1];return _this.renderLayerEntry(objectId,entry,sceneContext.updateSceneObject,true)}),/*#__PURE__*/React.createElement("div",{className:"layertree3d-section"},LocaleUtils.tr("layertree3d.layers")),Object.entries(sceneContext.colorLayers).map(function(_ref3){var _ref4=_slicedToArray(_ref3,2),layerId=_ref4[0],entry=_ref4[1];return _this.renderLayerEntry(layerId,entry,sceneContext.updateColorLayer,false)}),/*#__PURE__*/React.createElement("div",{className:"layertree3d-option",onClick:function onClick(){return _this.setState(function(state){return{importvisible:!state.importvisible}})}},/*#__PURE__*/React.createElement(Icon,{icon:_this.state.importvisible?"collapse":"expand"})," ",LocaleUtils.tr("layertree3d.importobjects")),_this.state.importvisible?_this.renderImportForm():null)});_defineProperty(_this,"renderLayerEntry",function(entryId,entry,updateCallback,isObject){var _entry$title,_entry$title2;if(entry.layertree===false){return null}var classes=classNames({"layertree3d-item":true,"layertree3d-item-disabled":!entry.visibility});var optMenuClasses=classNames({"layertree3d-item-menubutton":true,"layertree3d-item-menubutton-active":_this.state.activemenu===entryId});return/*#__PURE__*/React.createElement("div",{className:"layertree3d-item-container",key:entryId},/*#__PURE__*/React.createElement("div",{className:classes},/*#__PURE__*/React.createElement(Icon,{className:"layertree3d-item-checkbox",icon:entry.visibility?"checked":"unchecked",onClick:function onClick(){return updateCallback(entryId,{visibility:!entry.visibility})}}),/*#__PURE__*/React.createElement("span",{className:"layertree3d-item-title",title:(_entry$title=entry.title)!==null&&_entry$title!==void 0?_entry$title:entryId},(_entry$title2=entry.title)!==null&&_entry$title2!==void 0?_entry$title2:entryId),entry.drawGroup?/*#__PURE__*/React.createElement(Icon,{className:"layertree3d-item-remove",icon:"trash",onClick:function onClick(){return _this.props.sceneContext.removeSceneObject(entryId)}}):null,/*#__PURE__*/React.createElement(Icon,{className:optMenuClasses,icon:"cog",onClick:function onClick(){return _this.layerMenuToggled(entryId)}})),_this.state.activemenu===entryId?/*#__PURE__*/React.createElement("div",{className:"layertree3d-item-optionsmenu"},/*#__PURE__*/React.createElement("div",{className:"layertree3d-item-optionsmenu-row"},isObject?/*#__PURE__*/React.createElement(Icon,{icon:"zoom",onClick:function onClick(){return _this.zoomToObject(entryId)},title:LocaleUtils.tr("layertree3d.zoomtoobject")}):null,/*#__PURE__*/React.createElement(Icon,{icon:"transparency"}),/*#__PURE__*/React.createElement("input",{className:"layertree3d-item-transparency-slider",max:"255",min:"0",onChange:function onChange(ev){return updateCallback(entryId,{opacity:parseInt(ev.target.value,10)})},step:"1",type:"range",value:entry.opacity})),entry.extrusionHeight!==undefined?/*#__PURE__*/React.createElement("div",{className:"layertree3d-item-optionsmenu-row"},/*#__PURE__*/React.createElement("span",null,"Extrude: "),/*#__PURE__*/React.createElement(NumberInput,{max:500,min:0,onChange:function onChange(h){return updateCallback(entryId,{extrusionHeight:h})},value:entry.extrusionHeight})):null):null)});_defineProperty(_this,"renderImportForm",function(){return/*#__PURE__*/React.createElement("div",{className:"layertree3d-import-widget"},/*#__PURE__*/React.createElement("div",null,/*#__PURE__*/React.createElement(FileSelector,{accept:".gltf",file:_this.state.selectedfile,onFileSelected:function onFileSelected(file){return _this.setState({selectedfile:file})},title:LocaleUtils.tr("layertree3d.supportedformats")})),/*#__PURE__*/React.createElement("div",null,/*#__PURE__*/React.createElement("button",{className:"button importlayer-addbutton",disabled:_this.state.selectedfile===null||_this.state.importing,onClick:_this.importFile,type:"button"},_this.state.importing?/*#__PURE__*/React.createElement(Spinner,null):null,LocaleUtils.tr("layertree3d.import"))))});_defineProperty(_this,"layerMenuToggled",function(entryId){_this.setState(function(state){return{activemenu:state.activemenu===entryId?null:entryId}})});_defineProperty(_this,"zoomToObject",function(objectId){var _obj$tiles;var obj=_this.props.sceneContext.getSceneObject(objectId);var bbox=new Box3;if(obj!==null&&obj!==void 0&&(_obj$tiles=obj.tiles)!==null&&_obj$tiles!==void 0&&_obj$tiles.root){obj.tiles.root.cached.boundingVolume.getAABB(bbox)}else{bbox.setFromObject(obj)}if(!bbox.isEmpty()){var bounds=[bbox.min.x,bbox.min.y,bbox.max.x,bbox.max.y];_this.props.sceneContext.setViewToExtent(bounds,0)}});_defineProperty(_this,"importFile",function(){if(!_this.state.selectedfile){return}_this.setState({importing:true});var file=_this.state.selectedfile;var reader=new FileReader;reader.onload=function(ev){var loader=new GLTFLoader;loader.parse(ev.target.result,ConfigUtils.getAssetsPath(),function(gltf){// GLTF is Y-UP, we need Z-UP
7
+ */import React from"react";import classNames from"classnames";import PropTypes from"prop-types";import{Box3,Group}from"three";import{GLTFLoader}from"three/addons/loaders/GLTFLoader";import{v4 as uuidv4}from"uuid";import ConfigUtils from"../../utils/ConfigUtils";import LocaleUtils from"../../utils/LocaleUtils";import Icon from"../Icon";import SideBar from"../SideBar";import FileSelector from"../widgets/FileSelector";import NumberInput from"../widgets/NumberInput";import Spinner from"../widgets/Spinner";import"./style/LayerTree3D.css";var LayerTree3D=/*#__PURE__*/function(_React$Component){function LayerTree3D(){var _this;_classCallCheck(this,LayerTree3D);for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++){args[_key]=arguments[_key]}_this=_callSuper(this,LayerTree3D,[].concat(args));_defineProperty(_this,"state",{activemenu:null,importvisible:false,selectedfile:null,importing:false});_defineProperty(_this,"renderBody",function(){var sceneContext=_this.props.sceneContext;return/*#__PURE__*/React.createElement("div",null,/*#__PURE__*/React.createElement("div",{className:"layertree3d-section"},LocaleUtils.tr("layertree3d.objects")),Object.entries(sceneContext.sceneObjects).map(function(_ref){var _ref2=_slicedToArray(_ref,2),objectId=_ref2[0],entry=_ref2[1];return _this.renderLayerEntry(objectId,entry,sceneContext.updateSceneObject,true)}),/*#__PURE__*/React.createElement("div",{className:"layertree3d-section"},LocaleUtils.tr("layertree3d.layers")),Object.entries(sceneContext.colorLayers).map(function(_ref3){var _ref4=_slicedToArray(_ref3,2),layerId=_ref4[0],entry=_ref4[1];return _this.renderLayerEntry(layerId,entry,sceneContext.updateColorLayer,false)}),/*#__PURE__*/React.createElement("div",{className:"layertree3d-option",onClick:function onClick(){return _this.setState(function(state){return{importvisible:!state.importvisible}})}},/*#__PURE__*/React.createElement(Icon,{icon:_this.state.importvisible?"collapse":"expand"})," ",LocaleUtils.tr("layertree3d.importobjects")),_this.state.importvisible?_this.renderImportForm():null)});_defineProperty(_this,"renderLayerEntry",function(entryId,entry,updateCallback,isObject){var _entry$title,_entry$title2;if(entry.layertree===false){return null}var classes=classNames({"layertree3d-item":true,"layertree3d-item-disabled":!entry.visibility});var optMenuClasses=classNames({"layertree3d-item-menubutton":true,"layertree3d-item-menubutton-active":_this.state.activemenu===entryId});return/*#__PURE__*/React.createElement("div",{className:"layertree3d-item-container",key:entryId},/*#__PURE__*/React.createElement("div",{className:classes},/*#__PURE__*/React.createElement(Icon,{className:"layertree3d-item-checkbox",icon:entry.visibility?"checked":"unchecked",onClick:function onClick(){return updateCallback(entryId,{visibility:!entry.visibility})}}),/*#__PURE__*/React.createElement("span",{className:"layertree3d-item-title",title:(_entry$title=entry.title)!==null&&_entry$title!==void 0?_entry$title:entryId},(_entry$title2=entry.title)!==null&&_entry$title2!==void 0?_entry$title2:entryId),entry.drawGroup?/*#__PURE__*/React.createElement(Icon,{className:"layertree3d-item-remove",icon:"trash",onClick:function onClick(){return _this.props.sceneContext.removeSceneObject(entryId)}}):null,/*#__PURE__*/React.createElement(Icon,{className:optMenuClasses,icon:"cog",onClick:function onClick(){return _this.layerMenuToggled(entryId)}})),_this.state.activemenu===entryId?/*#__PURE__*/React.createElement("div",{className:"layertree3d-item-optionsmenu"},/*#__PURE__*/React.createElement("div",{className:"layertree3d-item-optionsmenu-row"},isObject?/*#__PURE__*/React.createElement(Icon,{icon:"zoom",onClick:function onClick(){return _this.zoomToObject(entryId)},title:LocaleUtils.tr("layertree3d.zoomtoobject")}):null,/*#__PURE__*/React.createElement(Icon,{icon:"transparency"}),/*#__PURE__*/React.createElement("input",{className:"layertree3d-item-transparency-slider",max:"255",min:"0",onChange:function onChange(ev){return updateCallback(entryId,{opacity:parseInt(ev.target.value,10)})},step:"1",type:"range",value:entry.opacity})),entry.extrusionHeight!==undefined?/*#__PURE__*/React.createElement("div",{className:"layertree3d-item-optionsmenu-row"},/*#__PURE__*/React.createElement("span",null,"Extrude:"),/*#__PURE__*/React.createElement(React.Fragment,null,"\xA0"),/*#__PURE__*/React.createElement("select",{onChange:function onChange(ev){return updateCallback(entryId,{extrusionHeight:ev.target.value==="__value"?0:ev.target.value})},value:typeof entry.extrusionHeight==="string"?entry.extrusionHeight:"__value"},/*#__PURE__*/React.createElement("option",{value:"__value"},LocaleUtils.tr("layertree3d.customheight")),(entry.fields||[]).map(function(field){return/*#__PURE__*/React.createElement("option",{key:field,value:field},field)})),typeof entry.extrusionHeight!=="string"?/*#__PURE__*/React.createElement(NumberInput,{max:500,min:0,onChange:function onChange(h){return updateCallback(entryId,{extrusionHeight:h})},value:entry.extrusionHeight}):null):null):null)});_defineProperty(_this,"renderImportForm",function(){return/*#__PURE__*/React.createElement("div",{className:"layertree3d-import-widget"},/*#__PURE__*/React.createElement("div",null,/*#__PURE__*/React.createElement(FileSelector,{accept:".gltf",file:_this.state.selectedfile,onFileSelected:function onFileSelected(file){return _this.setState({selectedfile:file})},title:LocaleUtils.tr("layertree3d.supportedformats")})),/*#__PURE__*/React.createElement("div",null,/*#__PURE__*/React.createElement("button",{className:"button importlayer-addbutton",disabled:_this.state.selectedfile===null||_this.state.importing,onClick:_this.importFile,type:"button"},_this.state.importing?/*#__PURE__*/React.createElement(Spinner,null):null,LocaleUtils.tr("layertree3d.import"))))});_defineProperty(_this,"layerMenuToggled",function(entryId){_this.setState(function(state){return{activemenu:state.activemenu===entryId?null:entryId}})});_defineProperty(_this,"zoomToObject",function(objectId){var _obj$tiles;var obj=_this.props.sceneContext.getSceneObject(objectId);var bbox=new Box3;if(obj!==null&&obj!==void 0&&(_obj$tiles=obj.tiles)!==null&&_obj$tiles!==void 0&&_obj$tiles.root){obj.tiles.root.cached.boundingVolume.getAABB(bbox)}else{bbox.setFromObject(obj)}if(!bbox.isEmpty()){var bounds=[bbox.min.x,bbox.min.y,bbox.max.x,bbox.max.y];_this.props.sceneContext.setViewToExtent(bounds,0)}});_defineProperty(_this,"importFile",function(){if(!_this.state.selectedfile){return}_this.setState({importing:true});var file=_this.state.selectedfile;var reader=new FileReader;reader.onload=function(ev){var loader=new GLTFLoader;loader.parse(ev.target.result,ConfigUtils.getAssetsPath(),function(gltf){// GLTF is Y-UP, we need Z-UP
8
8
  gltf.scene.rotation.x=Math.PI/2;gltf.scene.updateMatrixWorld();var objectId=uuidv4();var options={drawGroup:true,layertree:true,title:file.name};var group=new Group;group.add(gltf.scene);gltf.scene.traverse(function(c){if(c.geometry){c.castShadow=true;c.receiveShadow=true}if(c.userData.label){_this.props.sceneContext.updateObjectLabel(c)}});_this.props.sceneContext.addSceneObject(objectId,group,options)},function(err){/* eslint-disable-next-line */console.warn(err)});_this.setState({selectedfile:null,importing:false})};reader.readAsArrayBuffer(_this.state.selectedfile)});return _this}_inherits(LayerTree3D,_React$Component);return _createClass(LayerTree3D,[{key:"render",value:function render(){var _this2=this;return/*#__PURE__*/React.createElement("div",null,/*#__PURE__*/React.createElement(SideBar,{icon:"layers",id:"LayerTree3D",title:LocaleUtils.tr("appmenu.items.LayerTree3D"),width:"20em"},function(){return{body:_this2.renderBody()}}))}}])}(React.Component);_defineProperty(LayerTree3D,"propTypes",{sceneContext:PropTypes.object});export{LayerTree3D as default};
@@ -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;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});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){_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,elevation:function elevation(feature){var coordinates=feature.getGeometry().getCoordinates();while(Array.isArray(coordinates[0])){coordinates=coordinates[0]}return coordinates[2]||_this2.getTerrainHeightFromMap(coordinates)||0},extrusionOffset:function extrusionOffset(){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.traverse(function(mesh){mesh.castShadow=true;mesh.receiveShadow=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.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
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
@@ -4,7 +4,7 @@ function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof
4
4
  *
5
5
  * This source code is licensed under the BSD-style license found in the
6
6
  * LICENSE file in the root directory of this source tree.
7
- */import React from"react";import Sun from"@giro3d/giro3d/core/geographic/Sun.js";import{MapLightingMode}from"@giro3d/giro3d/entities/MapLightingOptions";import PropTypes from"prop-types";import suncalc from"suncalc";import{AmbientLight,BasicShadowMap,CameraHelper,DirectionalLight,DirectionalLightHelper,PCFShadowMap,PCFSoftShadowMap,VSMShadowMap}from"three";import CoordinatesUtils from"../../utils/CoordinatesUtils";import LocaleUtils from"../../utils/LocaleUtils";import Icon from"../Icon";import SideBar from"../SideBar";import NumberInput from"../widgets/NumberInput";import ToggleSwitch from"../widgets/ToggleSwitch";import"./style/Map3DLight.css";var Map3DLight=/*#__PURE__*/function(_React$Component){function Map3DLight(){var _this;_classCallCheck(this,Map3DLight);for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++){args[_key]=arguments[_key]}_this=_callSuper(this,Map3DLight,[].concat(args));_defineProperty(_this,"state",{showAdvanced:false,lightParams:{day:182,time:720,helpersVisible:false,ambientLightIntensity:2.1,directionalLightIntensity:1.8,zFactor:1,lightElevationLayersOnly:false,shadowsEnabled:true,shadowType:PCFShadowMap,shadowMapSize:4096,shadowBias:-0.0001,sunDistance:80000,normalBias:0,shadowIntensity:0.9,shadowVolumeNear:60000,shadowVolumeFar:100000},dayAnimation:false,dayAnimationSettings:false,dayStep:30,timeAnimation:false,timeAnimationSettings:false,timeStep:30});_defineProperty(_this,"onHide",function(){clearInterval(_this.animationInterval);_this.setState({dayAnimation:false,timeAnimation:false})});_defineProperty(_this,"renderBody",function(){var lightParams=_this.state.lightParams;var dateFormatter=function dateFormatter(day){var date=new Date(new Date().getFullYear(),0,day);return"".concat(String(date.getDate()).padStart(2,"0"),".").concat(String(date.getMonth()+1).padStart(2,"0"))};var timeFormatter=function timeFormatter(time){return"".concat(String(Math.trunc(time/60)).padStart(2,"0"),":").concat(String(time%60).padStart(2,"0"))};return/*#__PURE__*/React.createElement("div",{className:"maplight3d-body"},/*#__PURE__*/React.createElement("table",null,/*#__PURE__*/React.createElement("tbody",null,/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",null,LocaleUtils.tr("maplight3d.date")),/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement("div",{className:"map3d-animation-slider"},/*#__PURE__*/React.createElement(Icon,{icon:_this.state.dayAnimation?"square":"triangle-right",onClick:_this.toggleDayAnimation}),_this.renderSlider("day",1,365,1,dateFormatter),/*#__PURE__*/React.createElement(Icon,{className:_this.state.dayAnimationSettings?"map3d-animation-settings-active":"",icon:"cog",onClick:function onClick(){return _this.setState(function(state){return{dayAnimationSettings:!state.dayAnimationSettings}})}})))),_this.state.dayAnimationSettings?/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",{colSpan:"2"},/*#__PURE__*/React.createElement("div",{className:"maplight3d-animation-settings"},/*#__PURE__*/React.createElement("span",null,LocaleUtils.tr("maplight3d.animationstep"),":"),/*#__PURE__*/React.createElement(NumberInput,{max:60,min:1,onChange:function onChange(dayStep){return _this.setState({dayStep:dayStep})},suffix:" "+LocaleUtils.tr("maplight3d.dayspersec"),value:_this.state.dayStep})))):null,/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",null,LocaleUtils.tr("maplight3d.time")),/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement("div",{className:"map3d-animation-slider"},/*#__PURE__*/React.createElement(Icon,{icon:_this.state.timeAnimation?"square":"triangle-right",onClick:_this.toggleTimeAnimation}),_this.renderSlider("time",0,1439,1,timeFormatter),/*#__PURE__*/React.createElement(Icon,{className:_this.state.timeAnimationSettings?"map3d-animation-settings-active":"",icon:"cog",onClick:function onClick(){return _this.setState(function(state){return{timeAnimationSettings:!state.timeAnimationSettings}})}})))),_this.state.timeAnimationSettings?/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",{colSpan:"2"},/*#__PURE__*/React.createElement("div",{className:"maplight3d-animation-settings"},/*#__PURE__*/React.createElement("span",null,LocaleUtils.tr("maplight3d.animationstep"),":"),/*#__PURE__*/React.createElement(NumberInput,{max:60,min:1,onChange:function onChange(timeStep){return _this.setState({timeStep:timeStep})},suffix:" "+LocaleUtils.tr("maplight3d.minspersec"),value:_this.state.timeStep})))):null,/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",null,LocaleUtils.tr("maplight3d.ambientLightIntensity")),/*#__PURE__*/React.createElement("td",null,_this.renderSlider("ambientLightIntensity",0,5,0.1))),/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",null,LocaleUtils.tr("maplight3d.directionalLightIntensity")),/*#__PURE__*/React.createElement("td",null,_this.renderSlider("directionalLightIntensity",0,10,0.1))),/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",null,LocaleUtils.tr("maplight3d.shadows")),/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement(ToggleSwitch,{active:lightParams.shadowsEnabled,onChange:function onChange(value){return _this.updateLightParams("shadowsEnabled",value)}}))),/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",null,LocaleUtils.tr("maplight3d.shadowintensity")),/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement(NumberInput,{decimals:1,disabled:!lightParams.shadowsEnabled,max:2,min:0,onChange:function onChange(value){return _this.updateLightParams("shadowIntensity",value)},value:lightParams.shadowIntensity}))),/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",{className:"maplight3d-advanced",colSpan:"2"},/*#__PURE__*/React.createElement("label",null,/*#__PURE__*/React.createElement("input",{checked:_this.state.showAdvanced,onChange:function onChange(ev){return _this.setState(function(state){return{showAdvanced:!state.showAdvanced}})},type:"checkbox"})," ",LocaleUtils.tr("maplight3d.showadvanced")))),_this.state.showAdvanced?[/*#__PURE__*/React.createElement("tr",{key:"helpersVisible"},/*#__PURE__*/React.createElement("td",null,LocaleUtils.tr("maplight3d.helpersVisible")),/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement(ToggleSwitch,{active:lightParams.helpersVisible,onChange:function onChange(value){return _this.updateLightParams("helpersVisible",value)}}))),/*#__PURE__*/React.createElement("tr",{key:"zFactor"},/*#__PURE__*/React.createElement("td",null,LocaleUtils.tr("maplight3d.zFactor")),/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement("input",{max:10,min:0,onChange:function onChange(ev){return _this.updateLightParams("zFactor",ev.target.value)},step:0.1,type:"range",value:lightParams.zFactor}))),/*#__PURE__*/React.createElement("tr",{key:"shadowType"},/*#__PURE__*/React.createElement("td",null,LocaleUtils.tr("maplight3d.shadowType")),/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement("select",{onChange:function onChange(ev){return _this.updateLightParams("shadowType",parseInt(ev.target.value,10))},value:lightParams.shadowType},/*#__PURE__*/React.createElement("option",{value:BasicShadowMap},"BasicShadowMap"),/*#__PURE__*/React.createElement("option",{value:PCFShadowMap},"PCFShadowMap"),/*#__PURE__*/React.createElement("option",{value:PCFSoftShadowMap},"PCFSoftShadowMap"),/*#__PURE__*/React.createElement("option",{value:VSMShadowMap},"VSMShadowMap")))),/*#__PURE__*/React.createElement("tr",{key:"shadowMapSize"},/*#__PURE__*/React.createElement("td",null,LocaleUtils.tr("maplight3d.shadowMapSize")),/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement(NumberInput,{decimals:0,max:8192,min:64,onChange:function onChange(value){return _this.updateLightParams("shadowMapSize",value)},value:lightParams.shadowMapSize}))),/*#__PURE__*/React.createElement("tr",{key:"shadowBias"},/*#__PURE__*/React.createElement("td",null,LocaleUtils.tr("maplight3d.shadowBias")),/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement(NumberInput,{decimals:5,max:0.01,min:-0.01,onChange:function onChange(value){return _this.updateLightParams("shadowBias",value)},value:lightParams.shadowBias}))),/*#__PURE__*/React.createElement("tr",{key:"normalBias"},/*#__PURE__*/React.createElement("td",null,LocaleUtils.tr("maplight3d.normalBias")),/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement(NumberInput,{decimals:1,max:10,min:-10,onChange:function onChange(value){return _this.updateLightParams("normalBias",value)},value:lightParams.normalBias}))),/*#__PURE__*/React.createElement("tr",{key:"shadowVolumeNear"},/*#__PURE__*/React.createElement("td",null,LocaleUtils.tr("maplight3d.shadowVolumeNear")),/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement(NumberInput,{decimals:0,max:100000,min:100,onChange:function onChange(value){return _this.updateLightParams("shadowVolumeNear",value)},value:lightParams.shadowVolumeNear}))),/*#__PURE__*/React.createElement("tr",{key:"shadowVolumeFar"},/*#__PURE__*/React.createElement("td",null,LocaleUtils.tr("maplight3d.shadowVolumeFar")),/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement(NumberInput,{decimals:0,max:100000,min:100,onChange:function onChange(value){return _this.updateLightParams("shadowVolumeFar",value)},value:lightParams.shadowVolumeFar})))]:null)))});_defineProperty(_this,"toggleDayAnimation",function(){_this.setState(function(state){return{dayAnimation:!state.dayAnimation,timeAnimation:false}},function(){clearInterval(_this.animationInterval);if(_this.state.dayAnimation){_this.animationInterval=setInterval(function(){_this.updateLightParams("day",(_this.state.lightParams.day+_this.state.dayStep/10)%365)},100)}})});_defineProperty(_this,"toggleTimeAnimation",function(){_this.setState(function(state){return{timeAnimation:!state.timeAnimation,dayAnimation:false}},function(){clearInterval(_this.animationInterval);if(_this.state.timeAnimation){_this.animationInterval=setInterval(function(){_this.updateLightParams("time",(_this.state.lightParams.time+_this.state.timeStep/10)%1440)},100)}})});_defineProperty(_this,"renderSlider",function(key,min,max,step){var labelFormatter=arguments.length>4&&arguments[4]!==undefined?arguments[4]:undefined;var value=_this.state.lightParams[key];var parseValue=function parseValue(x){return Number.isInteger(step)?parseInt(x,10):parseFloat(x)};labelFormatter=labelFormatter!==null&&labelFormatter!==void 0?labelFormatter:function(x){return x.toFixed(-Math.log10(step))};return/*#__PURE__*/React.createElement("div",{className:"maplight3d-slider"},/*#__PURE__*/React.createElement("input",{max:max,min:min,onChange:function onChange(ev){return _this.updateLightParams(key,parseValue(ev.target.value))},step:step,type:"range",value:value}),/*#__PURE__*/React.createElement("div",{className:"maplight3d-slider-label"},/*#__PURE__*/React.createElement("span",{style:{left:(value-min)*100/(max-min)+"%"}},labelFormatter(value))))});_defineProperty(_this,"updateLightParams",function(key,value){_this.setState(function(state){return{lightParams:_objectSpread(_objectSpread({},state.lightParams),{},_defineProperty({},key,value))}})});_defineProperty(_this,"computeShadowVolume",function(directionalLight,lightParams){if(!lightParams.shadowsEnabled){_this.props.sceneContext.scene.renderer.shadowMap.enabled=false;return}var cameraHeight=_this.props.sceneContext.scene.view.camera.position.z;var targetHeight=_this.props.sceneContext.scene.view.controls.target.z;var volumeSize=Math.min(20000,Math.max(1000,cameraHeight-targetHeight));directionalLight.shadow.camera.top=volumeSize;directionalLight.shadow.camera.bottom=-volumeSize;directionalLight.shadow.camera.left=-volumeSize;directionalLight.shadow.camera.right=volumeSize;directionalLight.shadow.camera.near=lightParams.shadowVolumeNear;directionalLight.shadow.camera.far=lightParams.shadowVolumeFar;_this.props.sceneContext.scene.renderer.shadowMap.enabled=true});_defineProperty(_this,"setLighting",function(){var sceneContext=_this.props.sceneContext;var lightParams=_this.state.lightParams;var ambientLight=sceneContext.getSceneObject("__ambientLight");var directionalLight=sceneContext.getSceneObject("__directionalLight");var directionalLightHelper=sceneContext.getSceneObject("__directionalLightHelper");var shadowCameraHelper=sceneContext.getSceneObject("__shadowCameraHelper");var lightTarget=sceneContext.scene.view.controls.target.clone();lightTarget.z=0;// Compute azimuth / zenith and sun position
7
+ */import React from"react";import Sun from"@giro3d/giro3d/core/geographic/Sun.js";import{MapLightingMode}from"@giro3d/giro3d/entities/MapLightingOptions";import PropTypes from"prop-types";import suncalc from"suncalc";import{AmbientLight,BasicShadowMap,CameraHelper,DirectionalLight,DirectionalLightHelper,PCFShadowMap,PCFSoftShadowMap,VSMShadowMap}from"three";import CoordinatesUtils from"../../utils/CoordinatesUtils";import LocaleUtils from"../../utils/LocaleUtils";import Icon from"../Icon";import SideBar from"../SideBar";import NumberInput from"../widgets/NumberInput";import ToggleSwitch from"../widgets/ToggleSwitch";import"./style/Map3DLight.css";var Map3DLight=/*#__PURE__*/function(_React$Component){function Map3DLight(){var _this;_classCallCheck(this,Map3DLight);for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++){args[_key]=arguments[_key]}_this=_callSuper(this,Map3DLight,[].concat(args));_defineProperty(_this,"state",{showAdvanced:false,lightParams:{day:182,time:720,helpersVisible:false,ambientLightIntensity:2.1,directionalLightIntensity:1.8,zFactor:1,lightElevationLayersOnly:false,shadowsEnabled:true,shadowType:PCFShadowMap,shadowMapSize:4096,shadowBias:-0.0001,sunDistance:80000,normalBias:0,shadowIntensity:0.9,shadowVolumeNear:60000,shadowVolumeFar:100000},dayAnimation:false,dayAnimationSettings:false,dayStep:30,timeAnimation:false,timeAnimationSettings:false,timeStep:30});_defineProperty(_this,"onHide",function(){clearInterval(_this.animationInterval);_this.setState({dayAnimation:false,timeAnimation:false})});_defineProperty(_this,"renderBody",function(){var lightParams=_this.state.lightParams;var dateFormatter=function dateFormatter(day){var date=new Date(new Date().getFullYear(),0,day);return"".concat(String(date.getDate()).padStart(2,"0"),".").concat(String(date.getMonth()+1).padStart(2,"0"))};var timeFormatter=function timeFormatter(time){return"".concat(String(Math.trunc(time/60)).padStart(2,"0"),":").concat(String(time%60).padStart(2,"0"))};return/*#__PURE__*/React.createElement("div",{className:"maplight3d-body"},/*#__PURE__*/React.createElement("table",null,/*#__PURE__*/React.createElement("tbody",null,/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",null,LocaleUtils.tr("maplight3d.date")),/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement("div",{className:"map3d-animation-slider"},/*#__PURE__*/React.createElement(Icon,{icon:_this.state.dayAnimation?"square":"triangle-right",onClick:_this.toggleDayAnimation}),_this.renderSlider("day",1,365,1,dateFormatter),/*#__PURE__*/React.createElement(Icon,{className:_this.state.dayAnimationSettings?"map3d-animation-settings-active":"",icon:"cog",onClick:function onClick(){return _this.setState(function(state){return{dayAnimationSettings:!state.dayAnimationSettings}})}})))),_this.state.dayAnimationSettings?/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",{colSpan:"2"},/*#__PURE__*/React.createElement("div",{className:"maplight3d-animation-settings"},/*#__PURE__*/React.createElement("span",null,LocaleUtils.tr("maplight3d.animationstep"),":"),/*#__PURE__*/React.createElement(NumberInput,{max:60,min:1,onChange:function onChange(dayStep){return _this.setState({dayStep:dayStep})},suffix:" "+LocaleUtils.tr("maplight3d.dayspersec"),value:_this.state.dayStep})))):null,/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",null,LocaleUtils.tr("maplight3d.time")),/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement("div",{className:"map3d-animation-slider"},/*#__PURE__*/React.createElement(Icon,{icon:_this.state.timeAnimation?"square":"triangle-right",onClick:_this.toggleTimeAnimation}),_this.renderSlider("time",0,1439,1,timeFormatter),/*#__PURE__*/React.createElement(Icon,{className:_this.state.timeAnimationSettings?"map3d-animation-settings-active":"",icon:"cog",onClick:function onClick(){return _this.setState(function(state){return{timeAnimationSettings:!state.timeAnimationSettings}})}})))),_this.state.timeAnimationSettings?/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",{colSpan:"2"},/*#__PURE__*/React.createElement("div",{className:"maplight3d-animation-settings"},/*#__PURE__*/React.createElement("span",null,LocaleUtils.tr("maplight3d.animationstep"),":"),/*#__PURE__*/React.createElement(NumberInput,{max:60,min:1,onChange:function onChange(timeStep){return _this.setState({timeStep:timeStep})},suffix:" "+LocaleUtils.tr("maplight3d.minspersec"),value:_this.state.timeStep})))):null,/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",null,LocaleUtils.tr("maplight3d.ambientLightIntensity")),/*#__PURE__*/React.createElement("td",null,_this.renderSlider("ambientLightIntensity",0,5,0.1))),/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",null,LocaleUtils.tr("maplight3d.directionalLightIntensity")),/*#__PURE__*/React.createElement("td",null,_this.renderSlider("directionalLightIntensity",0,10,0.1))),/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",null,LocaleUtils.tr("maplight3d.shadows")),/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement(ToggleSwitch,{active:lightParams.shadowsEnabled,onChange:function onChange(value){return _this.updateLightParams("shadowsEnabled",value)}}))),/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",null,LocaleUtils.tr("maplight3d.shadowintensity")),/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement(NumberInput,{decimals:1,disabled:!lightParams.shadowsEnabled,max:2,min:0,onChange:function onChange(value){return _this.updateLightParams("shadowIntensity",value)},value:lightParams.shadowIntensity}))),/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",{className:"maplight3d-advanced",colSpan:"2"},/*#__PURE__*/React.createElement("label",null,/*#__PURE__*/React.createElement("input",{checked:_this.state.showAdvanced,onChange:function onChange(ev){return _this.setState(function(state){return{showAdvanced:!state.showAdvanced}})},type:"checkbox"})," ",LocaleUtils.tr("maplight3d.showadvanced")))),_this.state.showAdvanced?[/*#__PURE__*/React.createElement("tr",{key:"helpersVisible"},/*#__PURE__*/React.createElement("td",null,LocaleUtils.tr("maplight3d.helpersVisible")),/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement(ToggleSwitch,{active:lightParams.helpersVisible,onChange:function onChange(value){return _this.updateLightParams("helpersVisible",value)}}))),/*#__PURE__*/React.createElement("tr",{key:"zFactor"},/*#__PURE__*/React.createElement("td",null,LocaleUtils.tr("maplight3d.zFactor")),/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement("input",{max:10,min:0,onChange:function onChange(ev){return _this.updateLightParams("zFactor",ev.target.value)},step:0.1,type:"range",value:lightParams.zFactor}))),/*#__PURE__*/React.createElement("tr",{key:"shadowType"},/*#__PURE__*/React.createElement("td",null,LocaleUtils.tr("maplight3d.shadowType")),/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement("select",{onChange:function onChange(ev){return _this.updateLightParams("shadowType",parseInt(ev.target.value,10))},value:lightParams.shadowType},/*#__PURE__*/React.createElement("option",{value:BasicShadowMap},"BasicShadowMap"),/*#__PURE__*/React.createElement("option",{value:PCFShadowMap},"PCFShadowMap"),/*#__PURE__*/React.createElement("option",{value:PCFSoftShadowMap},"PCFSoftShadowMap"),/*#__PURE__*/React.createElement("option",{value:VSMShadowMap},"VSMShadowMap")))),/*#__PURE__*/React.createElement("tr",{key:"shadowMapSize"},/*#__PURE__*/React.createElement("td",null,LocaleUtils.tr("maplight3d.shadowMapSize")),/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement(NumberInput,{decimals:0,max:8192,min:64,onChange:function onChange(value){return _this.updateLightParams("shadowMapSize",value)},value:lightParams.shadowMapSize}))),/*#__PURE__*/React.createElement("tr",{key:"shadowBias"},/*#__PURE__*/React.createElement("td",null,LocaleUtils.tr("maplight3d.shadowBias")),/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement(NumberInput,{decimals:5,max:0.01,min:-0.01,onChange:function onChange(value){return _this.updateLightParams("shadowBias",value)},value:lightParams.shadowBias}))),/*#__PURE__*/React.createElement("tr",{key:"normalBias"},/*#__PURE__*/React.createElement("td",null,LocaleUtils.tr("maplight3d.normalBias")),/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement(NumberInput,{decimals:1,max:10,min:-10,onChange:function onChange(value){return _this.updateLightParams("normalBias",value)},value:lightParams.normalBias}))),/*#__PURE__*/React.createElement("tr",{key:"shadowVolumeNear"},/*#__PURE__*/React.createElement("td",null,LocaleUtils.tr("maplight3d.shadowVolumeNear")),/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement(NumberInput,{decimals:0,max:100000,min:100,onChange:function onChange(value){return _this.updateLightParams("shadowVolumeNear",value)},value:lightParams.shadowVolumeNear}))),/*#__PURE__*/React.createElement("tr",{key:"shadowVolumeFar"},/*#__PURE__*/React.createElement("td",null,LocaleUtils.tr("maplight3d.shadowVolumeFar")),/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement(NumberInput,{decimals:0,max:100000,min:100,onChange:function onChange(value){return _this.updateLightParams("shadowVolumeFar",value)},value:lightParams.shadowVolumeFar})))]:null)))});_defineProperty(_this,"toggleDayAnimation",function(){_this.setState(function(state){return{dayAnimation:!state.dayAnimation,timeAnimation:false}},function(){clearInterval(_this.animationInterval);if(_this.state.dayAnimation){_this.animationInterval=setInterval(function(){_this.updateLightParams("day",(_this.state.lightParams.day+_this.state.dayStep/10)%365)},100)}})});_defineProperty(_this,"toggleTimeAnimation",function(){_this.setState(function(state){return{timeAnimation:!state.timeAnimation,dayAnimation:false}},function(){clearInterval(_this.animationInterval);if(_this.state.timeAnimation){_this.animationInterval=setInterval(function(){_this.updateLightParams("time",(_this.state.lightParams.time+_this.state.timeStep/10)%1440)},100)}})});_defineProperty(_this,"renderSlider",function(key,min,max,step){var labelFormatter=arguments.length>4&&arguments[4]!==undefined?arguments[4]:undefined;var value=_this.state.lightParams[key];var parseValue=function parseValue(x){return Number.isInteger(step)?parseInt(x,10):parseFloat(x)};labelFormatter=labelFormatter!==null&&labelFormatter!==void 0?labelFormatter:function(x){return x.toFixed(-Math.log10(step))};return/*#__PURE__*/React.createElement("div",{className:"maplight3d-slider"},/*#__PURE__*/React.createElement("input",{max:max,min:min,onChange:function onChange(ev){return _this.updateLightParams(key,parseValue(ev.target.value))},step:step,type:"range",value:value}),/*#__PURE__*/React.createElement("div",{className:"maplight3d-slider-label"},/*#__PURE__*/React.createElement("span",{style:{left:(value-min)*100/(max-min)+"%"}},labelFormatter(value))))});_defineProperty(_this,"updateLightParams",function(key,value){_this.setState(function(state){return{lightParams:_objectSpread(_objectSpread({},state.lightParams),{},_defineProperty({},key,value))}})});_defineProperty(_this,"computeShadowVolume",function(directionalLight,lightParams){if(!lightParams.shadowsEnabled){_this.props.sceneContext.scene.renderer.shadowMap.enabled=false;return}var cameraHeight=_this.props.sceneContext.scene.view.camera.position.z;var targetHeight=_this.props.sceneContext.scene.view.controls.target.z;var volumeSize=Math.min(20000,Math.max(1000,cameraHeight-targetHeight));directionalLight.shadow.camera.top=volumeSize;directionalLight.shadow.camera.bottom=-volumeSize;directionalLight.shadow.camera.left=-volumeSize;directionalLight.shadow.camera.right=volumeSize;directionalLight.shadow.camera.near=lightParams.shadowVolumeNear;directionalLight.shadow.camera.far=lightParams.shadowVolumeFar;_this.props.sceneContext.scene.renderer.shadowMap.enabled=true});_defineProperty(_this,"setLighting",function(){var sceneContext=_this.props.sceneContext;var lightParams=_this.state.lightParams;var ambientLight=sceneContext.getSceneObject("__ambientLight");var directionalLight=sceneContext.getSceneObject("__directionalLight");var lightTarget=sceneContext.scene.view.controls.target.clone();lightTarget.z=0;// Compute azimuth / zenith and sun position
8
8
  var date=new Date(new Date().getFullYear(),0,lightParams.day,Math.trunc(lightParams.time/60),lightParams.time%60);var latlon=CoordinatesUtils.reproject([lightTarget.x,lightTarget.y],sceneContext.mapCrs,"EPSG:4326");var sunPos=suncalc.getPosition(date,latlon[1],latlon[0]);var zenith=90-sunPos.altitude/Math.PI*180;var azimuth=180+sunPos.azimuth/Math.PI*180;var sunLocalPos=Sun.getLocalPosition({point:lightTarget,zenith:zenith,azimuth:azimuth,distance:lightParams.sunDistance});directionalLight.position.copy(sunLocalPos);// Set lighting params
9
9
  sceneContext.map.lighting.enabled=true;sceneContext.map.lighting.mode=lightParams.shadowsEnabled?MapLightingMode.LightBased:MapLightingMode.Hillshade;sceneContext.map.lighting.elevationLayersOnly=lightParams.lightElevationLayersOnly;sceneContext.map.lighting.hillshadeAzimuth=azimuth;sceneContext.map.lighting.hillshadeZenith=zenith;sceneContext.map.lighting.zFactor=lightParams.zFactor;sceneContext.scene.notifyChange(sceneContext.map);sceneContext.scene.renderer.shadowMap.type=lightParams.shadowType;var zenithAttenuation=Math.pow(zenith/90,4);ambientLight.intensity=lightParams.ambientLightIntensity-3*zenithAttenuation;directionalLight.intensity=lightParams.directionalLightIntensity-0.5*zenithAttenuation;directionalLight.shadow.mapSize.set(lightParams.shadowMapSize,lightParams.shadowMapSize);directionalLight.shadow.bias=lightParams.shadowBias;directionalLight.shadow.normalBias=lightParams.normalBias;directionalLight.shadow.intensity=lightParams.shadowIntensity;directionalLight.target.position.copy(lightTarget);_this.computeShadowVolume(directionalLight,lightParams);// Update scene
10
- directionalLight.updateMatrixWorld(true);directionalLight.target.updateMatrixWorld(true);directionalLight.shadow.updateMatrices(directionalLight);directionalLight.shadow.camera.updateProjectionMatrix();directionalLight.shadow.camera.updateMatrix();directionalLightHelper.visible=lightParams.helpersVisible;directionalLightHelper.update();directionalLightHelper.updateMatrixWorld(true);shadowCameraHelper.visible=lightParams.helpersVisible;shadowCameraHelper.update();shadowCameraHelper.updateMatrixWorld(true);sceneContext.scene.notifyChange()});return _this}_inherits(Map3DLight,_React$Component);return _createClass(Map3DLight,[{key:"componentDidMount",value:function componentDidMount(){this.animationInterval=null;this.componentDidUpdate({})}},{key:"componentDidUpdate",value:function componentDidUpdate(prevProps,prevState){var _prevProps$sceneConte;if(this.props.sceneContext.scene!==((_prevProps$sceneConte=prevProps.sceneContext)===null||_prevProps$sceneConte===void 0?void 0:_prevProps$sceneConte.scene)){var ambientLight=new AmbientLight(16777215,this.state.ambientLightIntensity);this.props.sceneContext.addSceneObject("__ambientLight",ambientLight);var directionalLight=new DirectionalLight(16777215,this.state.directionalLightIntensity);directionalLight.castShadow=true;this.props.sceneContext.addSceneObject("__directionalLight",directionalLight);var directionalLightHelper=new DirectionalLightHelper(directionalLight,200,"white");this.props.sceneContext.addSceneObject("__directionalLightHelper",directionalLightHelper);directionalLightHelper.visible=this.state.lightParams.helpersVisible;var shadowCameraHelper=new CameraHelper(directionalLight.shadow.camera);this.props.sceneContext.addSceneObject("__shadowCameraHelper",shadowCameraHelper);shadowCameraHelper.visible=this.state.lightParams.helpersVisible;this.props.sceneContext.scene.view.controls.addEventListener("change",this.setLighting);this.setLighting()}else if(this.state.lightParams!==prevState.lightParams){this.setLighting()}}},{key:"componentWillUnmount",value:function componentWillUnmount(){clearInterval(this.lightPositionInterval)}},{key:"render",value:function render(){var _this2=this;return/*#__PURE__*/React.createElement("div",null,/*#__PURE__*/React.createElement(SideBar,{icon:"light",id:"MapLight3D",onHide:this.onHide,title:LocaleUtils.tr("appmenu.items.MapLight3D"),width:"25em"},function(){return{body:_this2.renderBody()}}))}}])}(React.Component);_defineProperty(Map3DLight,"propTypes",{sceneContext:PropTypes.object});export{Map3DLight as default};
10
+ directionalLight.updateMatrixWorld(true);directionalLight.target.updateMatrixWorld(true);directionalLight.shadow.updateMatrices(directionalLight);directionalLight.shadow.camera.updateProjectionMatrix();directionalLight.shadow.camera.updateMatrix();if(lightParams.helpersVisible){var directionalLightHelper=sceneContext.getSceneObject("__directionalLightHelper");directionalLightHelper.update();directionalLightHelper.updateMatrixWorld(true);var shadowCameraHelper=sceneContext.getSceneObject("__shadowCameraHelper");shadowCameraHelper.update();shadowCameraHelper.updateMatrixWorld(true)}sceneContext.scene.notifyChange()});return _this}_inherits(Map3DLight,_React$Component);return _createClass(Map3DLight,[{key:"componentDidMount",value:function componentDidMount(){this.animationInterval=null;this.componentDidUpdate({})}},{key:"componentDidUpdate",value:function componentDidUpdate(prevProps,prevState){var _prevProps$sceneConte;if(this.props.sceneContext.scene!==((_prevProps$sceneConte=prevProps.sceneContext)===null||_prevProps$sceneConte===void 0?void 0:_prevProps$sceneConte.scene)){var ambientLight=new AmbientLight(16777215,this.state.ambientLightIntensity);this.props.sceneContext.addSceneObject("__ambientLight",ambientLight);var directionalLight=new DirectionalLight(16777215,this.state.directionalLightIntensity);directionalLight.castShadow=true;this.props.sceneContext.addSceneObject("__directionalLight",directionalLight);if(this.state.lightParams.helpersVisible){var directionalLightHelper=new DirectionalLightHelper(directionalLight,200,"white");this.props.sceneContext.addSceneObject("__directionalLightHelper",directionalLightHelper);var shadowCameraHelper=new CameraHelper(directionalLight.shadow.camera);this.props.sceneContext.addSceneObject("__shadowCameraHelper",shadowCameraHelper)}this.props.sceneContext.scene.view.controls.addEventListener("change",this.setLighting);this.setLighting()}else if(this.state.lightParams!==prevState.lightParams){if(this.state.lightParams.helpersVisible&&!prevState.lightParams.helpersVisible){var _directionalLight=this.props.sceneContext.getSceneObject("__directionalLight");var _directionalLightHelper=new DirectionalLightHelper(_directionalLight,200,"white");this.props.sceneContext.addSceneObject("__directionalLightHelper",_directionalLightHelper);var _shadowCameraHelper=new CameraHelper(_directionalLight.shadow.camera);this.props.sceneContext.addSceneObject("__shadowCameraHelper",_shadowCameraHelper)}else if(prevState.lightParams.helpersVisible&&!this.state.lightParams.helpersVisible){this.props.sceneContext.removeSceneObject("__directionalLightHelper");this.props.sceneContext.removeSceneObject("__shadowCameraHelper")}this.setLighting()}}},{key:"componentWillUnmount",value:function componentWillUnmount(){clearInterval(this.lightPositionInterval)}},{key:"render",value:function render(){var _this2=this;return/*#__PURE__*/React.createElement("div",null,/*#__PURE__*/React.createElement(SideBar,{icon:"light",id:"MapLight3D",onHide:this.onHide,title:LocaleUtils.tr("appmenu.items.MapLight3D"),width:"25em"},function(){return{body:_this2.renderBody()}}))}}])}(React.Component);_defineProperty(Map3DLight,"propTypes",{sceneContext:PropTypes.object});export{Map3DLight as default};
@@ -1,7 +1,7 @@
1
- /**
1
+ function _toConsumableArray(r){return _arrayWithoutHoles(r)||_iterableToArray(r)||_unsupportedIterableToArray(r)||_nonIterableSpread()}function _nonIterableSpread(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _unsupportedIterableToArray(r,a){if(r){if("string"==typeof r)return _arrayLikeToArray(r,a);var t={}.toString.call(r).slice(8,-1);return"Object"===t&&r.constructor&&(t=r.constructor.name),"Map"===t||"Set"===t?Array.from(r):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?_arrayLikeToArray(r,a):void 0}}function _iterableToArray(r){if("undefined"!=typeof Symbol&&null!=r[Symbol.iterator]||null!=r["@@iterator"])return Array.from(r)}function _arrayWithoutHoles(r){if(Array.isArray(r))return _arrayLikeToArray(r)}function _arrayLikeToArray(r,a){(null==a||a>r.length)&&(a=r.length);for(var e=0,n=Array(a);e<a;e++)n[e]=r[e];return n}/**
2
2
  * Copyright 2024 Sourcepole AG
3
3
  * All rights reserved.
4
4
  *
5
5
  * This source code is licensed under the BSD-style license found in the
6
6
  * LICENSE file in the root directory of this source tree.
7
- */import ColorLayer from"@giro3d/giro3d/core/layer/ColorLayer";import VectorSource from"@giro3d/giro3d/sources/VectorSource.js";import ol from"openlayers";import FeatureStyles from"../../../utils/FeatureStyles";import{createFeatures,featureStyleFunction,updateFeatures}from"../../map/layers/VectorLayer";export default{create3d:function create3d(options,projection){return new ColorLayer({name:options.name,source:new VectorSource({data:createFeatures(options,projection),format:new ol.format.GeoJSON,style:options.styleFunction||function(feature){var styleName=options.styleName||"default";var styleOptions=options.styleOptions||{};return FeatureStyles[styleName](feature,styleOptions)}})})},update3d:function update3d(layer,newOptions,oldOptions,projection){if(newOptions.styleName!==oldOptions.styleName||newOptions.styleOptions!==oldOptions.styleOptions){layer.source.setStyle(featureStyleFunction(newOptions))}else if(newOptions.styleFunction!==oldOptions.styleFunction){layer.source.setStyle(newOptions.styleFunction)}if(newOptions.features!==oldOptions.features){updateFeatures(layer.source,newOptions,oldOptions,projection)}else if((oldOptions.rev||0)!==(newOptions.rev||0)){layer.source.update()}}};
7
+ */import ColorLayer from"@giro3d/giro3d/core/layer/ColorLayer";import VectorSource from"@giro3d/giro3d/sources/VectorSource.js";import ol from"openlayers";import FeatureStyles from"../../../utils/FeatureStyles";import{createFeatures,featureStyleFunction,updateFeatures}from"../../map/layers/VectorLayer";export default{create3d:function create3d(options,projection){return new ColorLayer({name:options.name,source:new VectorSource({data:createFeatures(options,projection),format:new ol.format.GeoJSON,style:options.styleFunction||function(feature){var styleName=options.styleName||"default";var styleOptions=options.styleOptions||{};return FeatureStyles[styleName](feature,styleOptions)}})})},update3d:function update3d(layer,newOptions,oldOptions,projection){if(newOptions.styleName!==oldOptions.styleName||newOptions.styleOptions!==oldOptions.styleOptions){layer.source.setStyle(featureStyleFunction(newOptions))}else if(newOptions.styleFunction!==oldOptions.styleFunction){layer.source.setStyle(newOptions.styleFunction)}if(newOptions.features!==oldOptions.features){updateFeatures(layer.source,newOptions,oldOptions,projection)}else if((oldOptions.rev||0)!==(newOptions.rev||0)){layer.source.update()}},getFields:function getFields(options){return new Promise(function(resolve){var fields=new Set;options.features.forEach(function(feature){Object.keys(feature.properties).forEach(function(key){return fields.add(key)})});resolve(_toConsumableArray(fields.values()))})}};
@@ -1,8 +1,8 @@
1
- function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(o){return typeof o}:function(o){return o&&"function"==typeof Symbol&&o.constructor===Symbol&&o!==Symbol.prototype?"symbol":typeof o},_typeof(o)}function ownKeys(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);r&&(o=o.filter(function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable})),t.push.apply(t,o)}return t}function _objectSpread(e){for(var r=1;r<arguments.length;r++){var t=null!=arguments[r]?arguments[r]:{};r%2?ownKeys(Object(t),!0).forEach(function(r){_defineProperty(e,r,t[r])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):ownKeys(Object(t)).forEach(function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(t,r))})}return e}function _defineProperty(e,r,t){return(r=_toPropertyKey(r))in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}function _toPropertyKey(t){var i=_toPrimitive(t,"string");return"symbol"==_typeof(i)?i:i+""}function _toPrimitive(t,r){if("object"!=_typeof(t)||!t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var i=e.call(t,r||"default");if("object"!=_typeof(i))return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===r?String:Number)(t)}function _slicedToArray(r,e){return _arrayWithHoles(r)||_iterableToArrayLimit(r,e)||_unsupportedIterableToArray(r,e)||_nonIterableRest()}function _nonIterableRest(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _unsupportedIterableToArray(r,a){if(r){if("string"==typeof r)return _arrayLikeToArray(r,a);var t={}.toString.call(r).slice(8,-1);return"Object"===t&&r.constructor&&(t=r.constructor.name),"Map"===t||"Set"===t?Array.from(r):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?_arrayLikeToArray(r,a):void 0}}function _arrayLikeToArray(r,a){(null==a||a>r.length)&&(a=r.length);for(var e=0,n=Array(a);e<a;e++)n[e]=r[e];return n}function _iterableToArrayLimit(r,l){var t=null==r?null:"undefined"!=typeof Symbol&&r[Symbol.iterator]||r["@@iterator"];if(null!=t){var e,n,i,u,a=[],f=!0,o=!1;try{if(i=(t=t.call(r)).next,0===l){if(Object(t)!==t)return;f=!1}else for(;!(f=(e=i.call(t)).done)&&(a.push(e.value),a.length!==l);f=!0);}catch(r){o=!0,n=r}finally{try{if(!f&&null!=t["return"]&&(u=t["return"](),Object(u)!==u))return}finally{if(o)throw n}}return a}}function _arrayWithHoles(r){if(Array.isArray(r))return r}/**
1
+ function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(o){return typeof o}:function(o){return o&&"function"==typeof Symbol&&o.constructor===Symbol&&o!==Symbol.prototype?"symbol":typeof o},_typeof(o)}function _toConsumableArray(r){return _arrayWithoutHoles(r)||_iterableToArray(r)||_unsupportedIterableToArray(r)||_nonIterableSpread()}function _nonIterableSpread(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _iterableToArray(r){if("undefined"!=typeof Symbol&&null!=r[Symbol.iterator]||null!=r["@@iterator"])return Array.from(r)}function _arrayWithoutHoles(r){if(Array.isArray(r))return _arrayLikeToArray(r)}function ownKeys(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);r&&(o=o.filter(function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable})),t.push.apply(t,o)}return t}function _objectSpread(e){for(var r=1;r<arguments.length;r++){var t=null!=arguments[r]?arguments[r]:{};r%2?ownKeys(Object(t),!0).forEach(function(r){_defineProperty(e,r,t[r])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):ownKeys(Object(t)).forEach(function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(t,r))})}return e}function _defineProperty(e,r,t){return(r=_toPropertyKey(r))in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}function _toPropertyKey(t){var i=_toPrimitive(t,"string");return"symbol"==_typeof(i)?i:i+""}function _toPrimitive(t,r){if("object"!=_typeof(t)||!t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var i=e.call(t,r||"default");if("object"!=_typeof(i))return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===r?String:Number)(t)}function _slicedToArray(r,e){return _arrayWithHoles(r)||_iterableToArrayLimit(r,e)||_unsupportedIterableToArray(r,e)||_nonIterableRest()}function _nonIterableRest(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _unsupportedIterableToArray(r,a){if(r){if("string"==typeof r)return _arrayLikeToArray(r,a);var t={}.toString.call(r).slice(8,-1);return"Object"===t&&r.constructor&&(t=r.constructor.name),"Map"===t||"Set"===t?Array.from(r):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?_arrayLikeToArray(r,a):void 0}}function _arrayLikeToArray(r,a){(null==a||a>r.length)&&(a=r.length);for(var e=0,n=Array(a);e<a;e++)n[e]=r[e];return n}function _iterableToArrayLimit(r,l){var t=null==r?null:"undefined"!=typeof Symbol&&r[Symbol.iterator]||r["@@iterator"];if(null!=t){var e,n,i,u,a=[],f=!0,o=!1;try{if(i=(t=t.call(r)).next,0===l){if(Object(t)!==t)return;f=!1}else for(;!(f=(e=i.call(t)).done)&&(a.push(e.value),a.length!==l);f=!0);}catch(r){o=!0,n=r}finally{try{if(!f&&null!=t["return"]&&(u=t["return"](),Object(u)!==u))return}finally{if(o)throw n}}return a}}function _arrayWithHoles(r){if(Array.isArray(r))return r}/**
2
2
  * Copyright 2024 Sourcepole AG
3
3
  * All rights reserved.
4
4
  *
5
5
  * This source code is licensed under the BSD-style license found in the
6
6
  * LICENSE file in the root directory of this source tree.
7
- */import ColorLayer from"@giro3d/giro3d/core/layer/ColorLayer";import VectorSource from"@giro3d/giro3d/sources/VectorSource.js";import url from"url";import CoordinatesUtils from"../../../utils/CoordinatesUtils";import FeatureStyles from"../../../utils/FeatureStyles";import{wfsToOpenlayersOptions}from"../../map/layers/WFSLayer";export default{create3d:function create3d(options,projection){var olOpts=wfsToOpenlayersOptions(options);var typeName=options.version<"2.0.0"?"typeName":"typeNames";var srsName=options.projection;if(options.version>="1.1.0"){srsName=CoordinatesUtils.toOgcUrnCrs(options.projection)}var urlParts=url.parse(options.url,true);var urlParams=Object.entries(urlParts.query).reduce(function(res,_ref){var _ref2=_slicedToArray(_ref,2),key=_ref2[0],val=_ref2[1];return _objectSpread(_objectSpread({},res),{},_defineProperty({},key.toUpperCase(),val))},{});delete urlParts.search;urlParts.query=_objectSpread(_objectSpread({},urlParams),{},_defineProperty(_defineProperty(_defineProperty({SERVICE:"WFS",VERSION:options.version,REQUEST:"GetFeature"},typeName,options.name),"outputFormat",olOpts.formatName),"srsName",srsName));return new ColorLayer({name:options.name,source:new VectorSource({dataProjection:options.projection,data:{url:url.format(urlParts),format:olOpts.format},style:function style(feature){return FeatureStyles["default"](feature,{fillColor:options.color,strokeColor:feature.getGeometry().getType().endsWith("LineString")?options.color:"#000",strokeWidth:1,strokeDash:[],circleRadius:5})}})})},update3d:function update3d(layer,newOptions,oldOptions,projection){// pass
8
- }};
7
+ */import ColorLayer from"@giro3d/giro3d/core/layer/ColorLayer";import VectorSource from"@giro3d/giro3d/sources/VectorSource.js";import axios from"axios";import{tile}from"ol/loadingstrategy.js";import{createXYZ}from"ol/tilegrid.js";import url from"url";import CoordinatesUtils from"../../../utils/CoordinatesUtils";import FeatureStyles from"../../../utils/FeatureStyles";import{wfsToOpenlayersOptions}from"../../map/layers/WFSLayer";export default{create3d:function create3d(options,projection){var olOpts=wfsToOpenlayersOptions(options);var typeName=options.version<"2.0.0"?"typeName":"typeNames";var srsName=options.projection;if(options.version>="1.1.0"){srsName=CoordinatesUtils.toOgcUrnCrs(options.projection)}var urlParts=url.parse(options.url,true);var urlParams=Object.entries(urlParts.query).reduce(function(res,_ref){var _ref2=_slicedToArray(_ref,2),key=_ref2[0],val=_ref2[1];return _objectSpread(_objectSpread({},res),{},_defineProperty({},key.toUpperCase(),val))},{});delete urlParts.search;urlParts.query=_objectSpread(_objectSpread({},urlParams),{},_defineProperty(_defineProperty(_defineProperty({SERVICE:"WFS",VERSION:options.version,REQUEST:"GetFeature"},typeName,options.name),"outputFormat",olOpts.formatName),"srsName",srsName));return new ColorLayer({name:options.name,source:new VectorSource({dataProjection:options.projection,data:{url:url.format(urlParts),format:olOpts.format},style:function style(feature){return FeatureStyles["default"](feature,{fillColor:options.color,strokeColor:feature.getGeometry().getType().endsWith("LineString")?options.color:"#000",strokeWidth:1,strokeDash:[],circleRadius:5})},strategy:tile(createXYZ({tileSize:512}))})})},update3d:function update3d(layer,newOptions,oldOptions,projection){// pass
8
+ },getFields:function getFields(options){return new Promise(function(resolve,reject){var typeName=options.version<"2.0.0"?"typeName":"typeNames";var urlParts=url.parse(options.url,true);var urlParams=Object.entries(urlParts.query).reduce(function(res,_ref3){var _ref4=_slicedToArray(_ref3,2),key=_ref4[0],val=_ref4[1];return _objectSpread(_objectSpread({},res),{},_defineProperty({},key.toUpperCase(),val))},{});delete urlParts.search;urlParts.query=_objectSpread(_objectSpread({},urlParams),{},_defineProperty({SERVICE:"WFS",VERSION:options.version,REQUEST:"DescribeFeatureType"},typeName,options.name));axios.get(url.format(urlParts)).then(function(response){var parser=new DOMParser;var doc=parser.parseFromString(response.data,"text/xml");var elements=[].slice.call(doc.getElementsByTagName("element"));var fields=elements.reduce(function(res,element){var _element$attributes$t;if(element.attributes.name&&element.attributes.name.value!=="id"&&["int","decimal"].includes((_element$attributes$t=element.attributes.type)===null||_element$attributes$t===void 0?void 0:_element$attributes$t.value)){return[].concat(_toConsumableArray(res),[element.attributes.name.value])}return res},[]);resolve(fields)})["catch"](function(e){reject([])})})}};
@@ -4,5 +4,5 @@ function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof
4
4
  *
5
5
  * This source code is licensed under the BSD-style license found in the
6
6
  * LICENSE file in the root directory of this source tree.
7
- */import React from"react";import classNames from"classnames";import PropTypes from"prop-types";import MiscUtils from"../../utils/MiscUtils";import Icon from"../Icon";import InputContainer from"./InputContainer";import PopupMenu from"./PopupMenu";import"./style/EditableSelect.css";var EditableSelect=/*#__PURE__*/function(_React$Component){function EditableSelect(props){var _this;_classCallCheck(this,EditableSelect);_this=_callSuper(this,EditableSelect,[props]);_defineProperty(_this,"state",{propValue:"",value:"",changed:false,selectedOption:null,focused:false});_defineProperty(_this,"renderOptions",function(){var rect=_this.el.getBoundingClientRect();var lvalue=_this.state.value.toLowerCase();return/*#__PURE__*/React.createElement(PopupMenu,{className:"editable-select-dropdown",onClose:function onClose(){return _this.setState({focused:false})},width:rect.width,x:rect.left,y:rect.bottom},_this.props.options.map(function(option,idx){var label=EditableSelect.optionLabel(option);if(_this.state.changed&&lvalue&&!label.toLowerCase().startsWith(lvalue)){return null}return/*#__PURE__*/React.createElement("div",{key:"opt"+idx,onClickCapture:function onClickCapture(){return _this.optionSelected(option)},onMouseDown:MiscUtils.killEvent,title:label},label)}))});_defineProperty(_this,"renderSelectedOption",function(){var label=EditableSelect.optionLabel(_this.state.selectedOption);return/*#__PURE__*/React.createElement("div",{className:"editable-select-selopt",title:label},label)});_defineProperty(_this,"valueChanged",function(ev){_this.setState({value:ev.target.value,selectedOption:null,changed:true})});_defineProperty(_this,"optionSelected",function(option){var value=EditableSelect.optionValue(option);_this.props.onChange(value);_this.setState({selectedOption:option,focused:false,value:value})});_defineProperty(_this,"clear",function(){if(!_this.props.readOnly){_this.props.onChange("")}});_defineProperty(_this,"onClick",function(ev){ev.target.select();_this.setState({focused:true})});_defineProperty(_this,"onBlur",function(){if(!_this.props.readOnly){_this.props.onChange(_this.state.value.trim());_this.setState({focused:false,changed:false})}});_defineProperty(_this,"onKeyDown",function(ev){if(!_this.props.readOnly&&ev.key==="Enter"){_this.props.onChange(_this.state.value.trim());_this.setState({changed:false});MiscUtils.killEvent(ev);if(_this.props.onSubmit){_this.props.onSubmit(_this.state.value.trim())}}});_this.el=null;return _this}_inherits(EditableSelect,_React$Component);return _createClass(EditableSelect,[{key:"render",value:function render(){var _this2=this;var classes=classNames(_defineProperty({EditableSelect:true},this.props.className,true));return/*#__PURE__*/React.createElement("div",{className:classes},/*#__PURE__*/React.createElement(InputContainer,{className:"editable-select-inputcontainer"},/*#__PURE__*/React.createElement("input",{autoComplete:"off",name:this.props.name,onBlur:this.onBlur,onChange:this.valueChanged,onClick:this.onClick,onKeyDown:this.onKeyDown,placeholder:this.props.placeholder,readOnly:this.props.readOnly,ref:function ref(el){_this2.el=el},role:"input",type:"text",value:this.state.value}),/*#__PURE__*/React.createElement(Icon,{icon:"clear",onClick:this.clear,role:"suffix"})),this.state.selectedOption?this.renderSelectedOption():null,this.el&&this.state.focused&&!this.props.readOnly?this.renderOptions():null)}}],[{key:"getDerivedStateFromProps",value:function getDerivedStateFromProps(nextProps,state){var _nextProps$value;if(state.focused){// No changes while focussed
8
- return null}var value=String((_nextProps$value=nextProps.value)!==null&&_nextProps$value!==void 0?_nextProps$value:"");if(value!==state.propValue){var _nextProps$options$fi;var selectedOption=(_nextProps$options$fi=nextProps.options.find(function(option){return EditableSelect.optionValue(option)===value}))!==null&&_nextProps$options$fi!==void 0?_nextProps$options$fi:null;return{propValue:value,value:value,changed:false,selectedOption:selectedOption}}return null}},{key:"optionLabel",value:function optionLabel(option){return _typeof(option)==="object"?option.label:String(option)}},{key:"optionValue",value:function optionValue(option){return _typeof(option)==="object"?option.value:String(option)}}])}(React.Component);_defineProperty(EditableSelect,"propTypes",{className:PropTypes.string,name:PropTypes.string,onChange:PropTypes.func,onSubmit:PropTypes.func,options:PropTypes.array,placeholder:PropTypes.string,readOnly:PropTypes.bool,value:PropTypes.oneOfType([PropTypes.string,PropTypes.number])});export{EditableSelect as default};
7
+ */import React from"react";import classNames from"classnames";import isEmpty from"lodash.isempty";import PropTypes from"prop-types";import MiscUtils from"../../utils/MiscUtils";import Icon from"../Icon";import InputContainer from"./InputContainer";import PopupMenu from"./PopupMenu";import"./style/EditableSelect.css";var EditableSelect=/*#__PURE__*/function(_React$Component){function EditableSelect(props){var _this;_classCallCheck(this,EditableSelect);_this=_callSuper(this,EditableSelect,[props]);_defineProperty(_this,"state",{propValue:"",value:"",manualInput:false,selectedOption:null,focused:false,popup:false});_defineProperty(_this,"renderOptions",function(){var rect=_this.el.getBoundingClientRect();var lvalue=_this.state.value.toLowerCase();var options=_this.props.options.map(function(option,idx){var label=EditableSelect.optionLabel(option);if(_this.state.manualInput&&lvalue&&!label.toLowerCase().includes(lvalue)){return null}return/*#__PURE__*/React.createElement("div",{key:"opt"+idx,onClickCapture:function onClickCapture(){return _this.optionSelected(option)},onMouseDown:MiscUtils.killEvent,title:label},label)}).filter(Boolean);return!isEmpty(options)?/*#__PURE__*/React.createElement(PopupMenu,{className:"editable-select-dropdown",onClose:function onClose(){return _this.setState({popup:false})},width:rect.width,x:rect.left,y:rect.bottom},options):null});_defineProperty(_this,"renderSelectedOption",function(){var label=EditableSelect.optionLabel(_this.state.selectedOption);return/*#__PURE__*/React.createElement("div",{className:"editable-select-selopt",onClick:function onClick(){return _this.setState({popup:true})},title:label},label)});_defineProperty(_this,"valueChanged",function(ev){_this.setState({value:ev.target.value,selectedOption:null,manualInput:true})});_defineProperty(_this,"optionSelected",function(option){var value=EditableSelect.optionValue(option);_this.props.onChange(value);_this.setState({selectedOption:option,popup:false,value:value})});_defineProperty(_this,"clear",function(){if(!_this.props.readOnly){_this.props.onChange("")}});_defineProperty(_this,"onClick",function(ev){if(!_this.state.manualInput){ev.target.select();_this.setState({popup:true})}});_defineProperty(_this,"onFocus",function(ev){ev.target.select();_this.setState({focused:true,manualInput:false,popup:true})});_defineProperty(_this,"onBlur",function(){if(!_this.props.readOnly){_this.props.onChange(_this.state.value.trim());_this.setState({focused:false,popup:false})}});_defineProperty(_this,"onKeyDown",function(ev){if(!_this.props.readOnly&&ev.key==="Enter"){_this.props.onChange(_this.state.value.trim());MiscUtils.killEvent(ev);if(_this.props.onSubmit){_this.props.onSubmit(_this.state.value.trim())}}});_this.el=null;return _this}_inherits(EditableSelect,_React$Component);return _createClass(EditableSelect,[{key:"componentDidUpdate",value:function componentDidUpdate(prevProps,prevState){if(this.state.value!==prevState.value&&!this.state.manualInput){this.el.select()}else if(!this.state.value&&this.state.manualInput){this.setState({manualInput:false,popup:true})}}},{key:"render",value:function render(){var _this2=this;var classes=classNames(_defineProperty({EditableSelect:true},this.props.className,true));return/*#__PURE__*/React.createElement("div",{className:classes},/*#__PURE__*/React.createElement(InputContainer,{className:"editable-select-inputcontainer"},/*#__PURE__*/React.createElement("input",{autoComplete:"off",name:this.props.name,onBlur:this.onBlur,onChange:this.valueChanged,onClick:this.onClick,onFocus:this.onFocus,onKeyDown:this.onKeyDown,placeholder:this.props.placeholder,readOnly:this.props.readOnly,ref:function ref(el){_this2.el=el},role:"input",type:"text",value:this.state.value}),/*#__PURE__*/React.createElement(Icon,{icon:"clear",onClick:this.clear,role:"suffix"})),this.state.selectedOption?this.renderSelectedOption():null,this.el&&this.state.popup&&!this.props.readOnly?this.renderOptions():null)}}],[{key:"getDerivedStateFromProps",value:function getDerivedStateFromProps(nextProps,state){var _nextProps$value;if(state.focused){// No changes while focussed
8
+ return null}var value=String((_nextProps$value=nextProps.value)!==null&&_nextProps$value!==void 0?_nextProps$value:"");if(value!==state.propValue){var _nextProps$options$fi;var selectedOption=(_nextProps$options$fi=nextProps.options.find(function(option){return EditableSelect.optionValue(option)===value}))!==null&&_nextProps$options$fi!==void 0?_nextProps$options$fi:null;return{propValue:value,value:value,manualInput:false,selectedOption:selectedOption}}return null}},{key:"optionLabel",value:function optionLabel(option){return _typeof(option)==="object"?option.label:String(option)}},{key:"optionValue",value:function optionValue(option){return _typeof(option)==="object"?option.value:String(option)}}])}(React.Component);_defineProperty(EditableSelect,"propTypes",{className:PropTypes.string,name:PropTypes.string,onChange:PropTypes.func,onSubmit:PropTypes.func,options:PropTypes.array,placeholder:PropTypes.string,readOnly:PropTypes.bool,value:PropTypes.oneOfType([PropTypes.string,PropTypes.number])});export{EditableSelect as default};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "qwc2",
3
- "version": "2025.04.30",
3
+ "version": "2025.05.07.1",
4
4
  "description": "QGIS Web Client",
5
5
  "author": "Sourcepole AG",
6
6
  "license": "BSD-2-Clause",
@@ -15,4 +15,4 @@ function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof
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
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,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 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",{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);
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,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);
package/plugins/TopBar.js CHANGED
@@ -10,4 +10,4 @@ function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof
10
10
  var searchOptions=_objectSpread({},this.props.searchOptions);searchOptions.minScaleDenom=searchOptions.minScaleDenom||searchOptions.minScale;delete searchOptions.minScale;// Menu compact only available for desktop client
11
11
  var menuCompact=!isMobile?this.props.appMenuCompact:false;// Keep menu open when appMenu is in compact mode (Visible on Hover)
12
12
  var keepMenuOpen=menuCompact;// Menu should be visible on startup when appMenu is in compact mode (Visible on Hover)
13
- var showOnStartup=this.props.appMenuVisibleOnStartup||menuCompact;var style=this.props.mapMargins.splitTopAndBottomBar?{marginLeft:this.props.mapMargins.left+"px",marginRight:this.props.mapMargins.right+"px"}:{};return/*#__PURE__*/React.createElement(Swipeable,{onSwipedDown:function onSwipedDown(){return _this2.props.toggleFullscreen(false)},onSwipedUp:function onSwipedUp(){return _this2.props.toggleFullscreen(true)}},/*#__PURE__*/React.createElement("div",{className:classes,ref:this.storeHeight,style:style},logoEl,/*#__PURE__*/React.createElement("div",{className:"topbar-center-span"},this.props.components.Search?/*#__PURE__*/React.createElement("div",{className:"topbar-search-container"},/*#__PURE__*/React.createElement(this.props.components.Search,{searchOptions:searchOptions})):null,this.props.components.Toolbar?/*#__PURE__*/React.createElement(this.props.components.Toolbar,{openExternalUrl:this.openUrl,toolbarItems:this.state.allowedToolbarItems,toolbarItemsShortcutPrefix:this.props.toolbarItemsShortcutPrefix}):null),this.props.components.AppMenu&&!this.props.appMenuHidden?/*#__PURE__*/React.createElement(this.props.components.AppMenu,{appMenuClearsTask:this.props.appMenuClearsTask,appMenuShortcut:this.props.appMenuShortcut,buttonLabel:LocaleUtils.tr("appmenu.menulabel"),keepMenuOpen:keepMenuOpen,menuCompact:menuCompact,menuItems:this.state.allowedMenuItems,openExternalUrl:this.openUrl,showFilterField:this.props.appMenuFilterField,showOnStartup:showOnStartup}):null,this.props.components.FullscreenSwitcher?/*#__PURE__*/React.createElement(this.props.components.FullscreenSwitcher,null):null))}}])}(React.Component);_defineProperty(TopBar,"propTypes",{/** Whether opening the app menu clears the active task. */appMenuClearsTask:PropTypes.bool,/** Whether show an appMenu compact (menu visible on icons hover) - Only available for desktop client. */appMenuCompact:PropTypes.bool,/** Whether to display the filter field in the app menu. */appMenuFilterField:PropTypes.bool,/** Whether to hide the app menu (useful primarely as a theme specific setting). */appMenuHidden:PropTypes.bool,/** The shortcut for tiggering the app menu, i.e. alt+shift+m. */appMenuShortcut:PropTypes.string,/** Whether to open the app menu on application startup. */appMenuVisibleOnStartup:PropTypes.bool,components:PropTypes.object,currentTheme:PropTypes.object,fullscreen:PropTypes.bool,/** The logo file format. */logoFormat:PropTypes.string,/** The logo image URL if a different source than the default assets/img/logo.<ext> and assets/img/logo-mobile.<ext> is desired. */logoSrc:PropTypes.string,/** The hyperlink to open when the logo is clicked. */logoUrl:PropTypes.string,mapMargins:PropTypes.object,/** The menu items. Refer to the corresponding chapter of the viewer documentation and the sample config.json. */menuItems:PropTypes.array,openExternalUrl:PropTypes.func,/** Options passed down to the search component. */searchOptions:PropTypes.shape({/** Whether to show the search filter widget. */allowSearchFilters:PropTypes.bool,/** Whether to hide the result labels on the map. */hideResultLabels:PropTypes.bool,/** The style used for highlighting search result geometries. */highlightStyle:PropTypes.shape({/* Stroke color rgba array, i.e. [255, 0, 0, 0.5] */strokeColor:PropTypes.array,/* Stroke width */strokeWidth:PropTypes.number,/* Stroke dash/gap pattern array. Empty for solid line. */strokeDash:PropTypes.array,/* Fill color rgba array, i.e. [255, 0, 0, 0.33] */fillColor:PropTypes.array}),/** Minimum scale denominator when zooming to search result. */minScaleDenom:PropTypes.number,/** Result count limit which is passed to the search provider. */resultLimit:PropTypes.number,/** Whether to collapse search sections by default. */sectionsDefaultCollapsed:PropTypes.bool,/** Whether to show the layer tree after selecting a theme result. */showLayerAfterChangeTheme:PropTypes.bool,/** Whether to show layer results before pkaces in the result menu. */showLayerResultsBeforePlaces:PropTypes.bool,/** Whether to replace the search text with the selected search result text. */showResultInSearchText:PropTypes.bool,/** Whether to zoom to layer search results. */zoomToLayers:PropTypes.bool}),setTopbarHeight:PropTypes.func,toggleFullscreen:PropTypes.func,/** The toolbar. Refer to the corresponding chapter of the viewer documentation and the sample config.json. */toolbarItems:PropTypes.array,/** The keyboard shortcut prefix for triggering toolbar tasks. I.e. alt+shift. The task are then triggered by <prefix>+{1,2,3,...} for the 1st, 2nd, 3rd... toolbar icon. */toolbarItemsShortcutPrefix:PropTypes.string});_defineProperty(TopBar,"defaultProps",{searchOptions:{showResultInSearchText:true},menuItems:[],toolbarItems:[],logoFormat:"svg"});export default(function(components){return connect(function(state){return{fullscreen:state.display.fullscreen,components:components,currentTheme:state.theme.current,mapMargins:state.windows.mapMargins}},{toggleFullscreen:toggleFullscreen,openExternalUrl:openExternalUrl,setTopbarHeight:setTopbarHeight})(TopBar)});
13
+ var showOnStartup=this.props.appMenuVisibleOnStartup||menuCompact;var style=this.props.mapMargins.splitTopAndBottomBar?{marginLeft:this.props.mapMargins.left+"px",marginRight:this.props.mapMargins.right+"px"}:{};return/*#__PURE__*/React.createElement(Swipeable,{onSwipedDown:function onSwipedDown(){return _this2.props.toggleFullscreen(false)},onSwipedUp:function onSwipedUp(){return _this2.props.toggleFullscreen(true)}},/*#__PURE__*/React.createElement("div",{className:classes,ref:this.storeHeight,style:style},logoEl,/*#__PURE__*/React.createElement("div",{className:"topbar-center-span"},this.props.components.Search?/*#__PURE__*/React.createElement("div",{className:"topbar-search-container"},/*#__PURE__*/React.createElement(this.props.components.Search,{searchOptions:searchOptions})):null,this.props.components.Toolbar?/*#__PURE__*/React.createElement(this.props.components.Toolbar,{openExternalUrl:this.openUrl,toolbarItems:this.state.allowedToolbarItems,toolbarItemsShortcutPrefix:this.props.toolbarItemsShortcutPrefix}):null),this.props.components.AppMenu&&!this.props.appMenuHidden?/*#__PURE__*/React.createElement(this.props.components.AppMenu,{appMenuClearsTask:this.props.appMenuClearsTask,appMenuShortcut:this.props.appMenuShortcut,buttonLabel:LocaleUtils.tr("appmenu.menulabel"),keepMenuOpen:keepMenuOpen,menuCompact:menuCompact,menuItems:this.state.allowedMenuItems,openExternalUrl:this.openUrl,showFilterField:this.props.appMenuFilterField,showOnStartup:showOnStartup}):null,this.props.components.FullscreenSwitcher?/*#__PURE__*/React.createElement(this.props.components.FullscreenSwitcher,null):null))}}])}(React.Component);_defineProperty(TopBar,"propTypes",{/** Whether opening the app menu clears the active task. */appMenuClearsTask:PropTypes.bool,/** Whether show an appMenu compact (menu visible on icons hover) - Only available for desktop client. */appMenuCompact:PropTypes.bool,/** Whether to display the filter field in the app menu. */appMenuFilterField:PropTypes.bool,/** Whether to hide the app menu (useful primarely as a theme specific setting). */appMenuHidden:PropTypes.bool,/** The shortcut for tiggering the app menu, i.e. alt+shift+m. */appMenuShortcut:PropTypes.string,/** Whether to open the app menu on application startup. */appMenuVisibleOnStartup:PropTypes.bool,components:PropTypes.object,currentTheme:PropTypes.object,fullscreen:PropTypes.bool,/** The logo file format. */logoFormat:PropTypes.string,/** The logo image URL if a different source than the default `assets/img/logo.<ext>` and `assets/img/logo-mobile.<ext>` is desired. */logoSrc:PropTypes.string,/** The hyperlink to open when the logo is clicked. */logoUrl:PropTypes.string,mapMargins:PropTypes.object,/** The menu items. Refer to the corresponding chapter of the viewer documentation and the sample config.json. */menuItems:PropTypes.array,openExternalUrl:PropTypes.func,/** Options passed down to the search component. */searchOptions:PropTypes.shape({/** Whether to show the search filter widget. */allowSearchFilters:PropTypes.bool,/** Whether to hide the result labels on the map. */hideResultLabels:PropTypes.bool,/** The style used for highlighting search result geometries. */highlightStyle:PropTypes.shape({/* Stroke color rgba array, i.e. [255, 0, 0, 0.5] */strokeColor:PropTypes.array,/* Stroke width */strokeWidth:PropTypes.number,/* Stroke dash/gap pattern array. Empty for solid line. */strokeDash:PropTypes.array,/* Fill color rgba array, i.e. [255, 0, 0, 0.33] */fillColor:PropTypes.array}),/** Minimum scale denominator when zooming to search result. */minScaleDenom:PropTypes.number,/** Result count limit which is passed to the search provider. */resultLimit:PropTypes.number,/** Whether to collapse search sections by default. */sectionsDefaultCollapsed:PropTypes.bool,/** Whether to show the layer tree after selecting a theme result. */showLayerAfterChangeTheme:PropTypes.bool,/** Whether to show layer results before pkaces in the result menu. */showLayerResultsBeforePlaces:PropTypes.bool,/** Whether to replace the search text with the selected search result text. */showResultInSearchText:PropTypes.bool,/** Whether to zoom to layer search results. */zoomToLayers:PropTypes.bool}),setTopbarHeight:PropTypes.func,toggleFullscreen:PropTypes.func,/** The toolbar. Refer to the corresponding chapter of the viewer documentation and the sample config.json. */toolbarItems:PropTypes.array,/** The keyboard shortcut prefix for triggering toolbar tasks. I.e. alt+shift. The task are then triggered by <prefix>+{1,2,3,...} for the 1st, 2nd, 3rd... toolbar icon. */toolbarItemsShortcutPrefix:PropTypes.string});_defineProperty(TopBar,"defaultProps",{searchOptions:{showResultInSearchText:true},menuItems:[],toolbarItems:[],logoFormat:"svg"});export default(function(components){return connect(function(state){return{fullscreen:state.display.fullscreen,components:components,currentTheme:state.theme.current,mapMargins:state.windows.mapMargins}},{toggleFullscreen:toggleFullscreen,openExternalUrl:openExternalUrl,setTopbarHeight:setTopbarHeight})(TopBar)});
@@ -297,6 +297,7 @@
297
297
  "zoomtolayer": "Увеличаване на слоя"
298
298
  },
299
299
  "layertree3d": {
300
+ "customheight": "",
300
301
  "import": "",
301
302
  "importobjects": "",
302
303
  "layers": "Слоеве",
@@ -297,6 +297,7 @@
297
297
  "zoomtolayer": "Zoom a la capa"
298
298
  },
299
299
  "layertree3d": {
300
+ "customheight": "",
300
301
  "import": "",
301
302
  "importobjects": "",
302
303
  "layers": "",
@@ -297,6 +297,7 @@
297
297
  "zoomtolayer": "Vycentrovat na vrstvu"
298
298
  },
299
299
  "layertree3d": {
300
+ "customheight": "",
300
301
  "import": "",
301
302
  "importobjects": "",
302
303
  "layers": "",
@@ -135,7 +135,7 @@
135
135
  "delete": "Löschen",
136
136
  "drawings": "Zeichnungen",
137
137
  "intersect": "Verschnitt",
138
- "label": "",
138
+ "label": "Beschriftung",
139
139
  "newgroupprompt": "Zeichungsgruppe hinzufügen",
140
140
  "numericinput": "Numerische Eingabe",
141
141
  "pick": "Auswählen",
@@ -297,6 +297,7 @@
297
297
  "zoomtolayer": "Auf den Layer zoomen"
298
298
  },
299
299
  "layertree3d": {
300
+ "customheight": "Wert",
300
301
  "import": "Importieren",
301
302
  "importobjects": "Objekte importieren",
302
303
  "layers": "Ebenen",
@@ -297,6 +297,7 @@
297
297
  "zoomtolayer": "Auf den Layer zoomen"
298
298
  },
299
299
  "layertree3d": {
300
+ "customheight": "Wert",
300
301
  "import": "Importieren",
301
302
  "importobjects": "Objekte importieren",
302
303
  "layers": "Ebenen",
@@ -297,6 +297,7 @@
297
297
  "zoomtolayer": "Zoom to layer"
298
298
  },
299
299
  "layertree3d": {
300
+ "customheight": "Value",
300
301
  "import": "Import",
301
302
  "importobjects": "Import objects",
302
303
  "layers": "Layers",
@@ -297,6 +297,7 @@
297
297
  "zoomtolayer": "Zoom a la capa"
298
298
  },
299
299
  "layertree3d": {
300
+ "customheight": "",
300
301
  "import": "",
301
302
  "importobjects": "",
302
303
  "layers": "",
@@ -297,6 +297,7 @@
297
297
  "zoomtolayer": "Zoomaa tasolle"
298
298
  },
299
299
  "layertree3d": {
300
+ "customheight": "",
300
301
  "import": "",
301
302
  "importobjects": "",
302
303
  "layers": "",
@@ -297,6 +297,7 @@
297
297
  "zoomtolayer": "Zoomer sur la couche"
298
298
  },
299
299
  "layertree3d": {
300
+ "customheight": "Valeur",
300
301
  "import": "Importer",
301
302
  "importobjects": "Importer objets",
302
303
  "layers": "Couches",
@@ -297,6 +297,7 @@
297
297
  "zoomtolayer": ""
298
298
  },
299
299
  "layertree3d": {
300
+ "customheight": "",
300
301
  "import": "",
301
302
  "importobjects": "",
302
303
  "layers": "",
@@ -297,6 +297,7 @@
297
297
  "zoomtolayer": "Zoom a tutto il livello"
298
298
  },
299
299
  "layertree3d": {
300
+ "customheight": "Valore",
300
301
  "import": "Importa",
301
302
  "importobjects": "Importa oggetti",
302
303
  "layers": "Livelli",
@@ -297,6 +297,7 @@
297
297
  "zoomtolayer": "レイヤにズーム"
298
298
  },
299
299
  "layertree3d": {
300
+ "customheight": "",
300
301
  "import": "インポート",
301
302
  "importobjects": "オブジェクトをインポート",
302
303
  "layers": "レイヤ",
@@ -297,6 +297,7 @@
297
297
  "zoomtolayer": "Zoom naar laag"
298
298
  },
299
299
  "layertree3d": {
300
+ "customheight": "",
300
301
  "import": "",
301
302
  "importobjects": "",
302
303
  "layers": "",
@@ -297,6 +297,7 @@
297
297
  "zoomtolayer": "Zoom til lag"
298
298
  },
299
299
  "layertree3d": {
300
+ "customheight": "",
300
301
  "import": "",
301
302
  "importobjects": "",
302
303
  "layers": "",
@@ -297,6 +297,7 @@
297
297
  "zoomtolayer": ""
298
298
  },
299
299
  "layertree3d": {
300
+ "customheight": "",
300
301
  "import": "",
301
302
  "importobjects": "",
302
303
  "layers": "",
@@ -297,6 +297,7 @@
297
297
  "zoomtolayer": "Ampliar a camada"
298
298
  },
299
299
  "layertree3d": {
300
+ "customheight": "",
300
301
  "import": "",
301
302
  "importobjects": "",
302
303
  "layers": "",
@@ -297,6 +297,7 @@
297
297
  "zoomtolayer": "Zoom para a Camada"
298
298
  },
299
299
  "layertree3d": {
300
+ "customheight": "",
300
301
  "import": "",
301
302
  "importobjects": "",
302
303
  "layers": "",
@@ -297,6 +297,7 @@
297
297
  "zoomtolayer": "Vedeți tot stratul"
298
298
  },
299
299
  "layertree3d": {
300
+ "customheight": "",
300
301
  "import": "",
301
302
  "importobjects": "",
302
303
  "layers": "",
@@ -297,6 +297,7 @@
297
297
  "zoomtolayer": ""
298
298
  },
299
299
  "layertree3d": {
300
+ "customheight": "",
300
301
  "import": "",
301
302
  "importobjects": "",
302
303
  "layers": "",
@@ -297,6 +297,7 @@
297
297
  "zoomtolayer": ""
298
298
  },
299
299
  "layertree3d": {
300
+ "customheight": "",
300
301
  "import": "",
301
302
  "importobjects": "",
302
303
  "layers": "",
@@ -297,6 +297,7 @@
297
297
  "zoomtolayer": "Katman sınırlarına yaklaş"
298
298
  },
299
299
  "layertree3d": {
300
+ "customheight": "",
300
301
  "import": "",
301
302
  "importobjects": "",
302
303
  "layers": "Katmanlar",
@@ -274,6 +274,7 @@
274
274
  "layertree.transparency",
275
275
  "layertree.visiblefilter",
276
276
  "layertree.zoomtolayer",
277
+ "layertree3d.customheight",
277
278
  "layertree3d.import",
278
279
  "layertree3d.importobjects",
279
280
  "layertree3d.layers",
@@ -54,4 +54,4 @@ params.LAYERS.push("wfs:".concat(layer.url,"#").concat(layer.name));params.OPACI
54
54
  var printBgLayerName=printBackgroundLayer;if(Array.isArray(printBackgroundLayer)){printBgLayerName=null;for(var i=0;i<printBackgroundLayer.length;++i){printBgLayerName=printBackgroundLayer[i].name;if(printScale<=printBackgroundLayer[i].maxScale){break}}}if(printBgLayerName){var match=null;if((match=printBgLayerName.match(/^(\w+):(.*)#([^#]+)$/))&&match[1]==="wms"){if(printExternalLayers){var _backgroundLayer$opac;var layer={type:"wms",params:{LAYERS:match[3],OPACITIES:String((_backgroundLayer$opac=backgroundLayer.opacity)!==null&&_backgroundLayer$opac!==void 0?_backgroundLayer$opac:255),STYLES:""},url:match[2]};LayerUtils.addExternalLayerPrintParams(layer,params,printCrs,counterRef)}}else{var _backgroundLayer$opac2;params.LAYERS.push(printBgLayerName);params.OPACITIES.push(String((_backgroundLayer$opac2=backgroundLayer.opacity)!==null&&_backgroundLayer$opac2!==void 0?_backgroundLayer$opac2:255));params.COLORS.push("");params.STYLES.push("")}}}else if(printExternalLayers){// Inject client-side wms as external layer for print
55
55
  var items=backgroundLayer.type==="group"?backgroundLayer.items:[backgroundLayer];items.slice(0).reverse().forEach(function(layer){if(LayerUtils.layerScaleInRange(layer,printScale)){LayerUtils.addExternalLayerPrintParams(layer,params,printCrs,counterRef)}})}}params.LAYERS=params.LAYERS.reverse().join(",");params.OPACITIES=params.OPACITIES.reverse().join(",");params.COLORS=params.COLORS.reverse().join(",");params.STYLES=params.STYLES.reverse().join(",");return params},getTimeDimensionValues:function getTimeDimensionValues(layer){var result={names:new Set,values:new Set,attributes:{}};if(layer.visibility){(layer.dimensions||[]).forEach(function(dimension){if(dimension.units==="ISO8601"&&dimension.value){result.names.add(dimension.name);dimension.value.split(/,\s+/).filter(function(x){return x}).forEach(function(x){return result.values.add(x)});result.attributes[layer.name]=[dimension.fieldName,dimension.endFieldName]}})}(layer.sublayers||[]).forEach(function(sublayer){var sublayerResult=LayerUtils.getTimeDimensionValues(sublayer);sublayerResult.names.forEach(function(x){return result.names.add(x)});sublayerResult.values.forEach(function(x){return result.values.add(x)});result.attributes=_objectSpread(_objectSpread({},result.attributes),sublayerResult.attributes)});return result},getAttribution:function getAttribution(layer,map){var showThemeAttributionOnly=arguments.length>2&&arguments[2]!==undefined?arguments[2]:false;var transformedMapBBoxes=arguments.length>3&&arguments[3]!==undefined?arguments[3]:{};if(layer.visibility===false||showThemeAttributionOnly&&layer.role!==LayerRole.THEME){return{}}var mapScale=MapUtils.computeForZoom(map.scales,map.zoom);if(!LayerUtils.layerScaleInRange(layer,mapScale)){return{}}if(layer.bbox&&layer.bbox.bounds){var layerCrs=layer.bbox.crs||map.projection;if(!transformedMapBBoxes[layerCrs]){transformedMapBBoxes[layerCrs]=CoordinatesUtils.reprojectBbox(map.bbox.bounds,map.projection,layerCrs)}var mapbbox=transformedMapBBoxes[layerCrs];var laybbox=layer.bbox.bounds;if(mapbbox[0]>laybbox[2]||mapbbox[2]<laybbox[0]||mapbbox[1]>laybbox[3]||mapbbox[3]<laybbox[1]){// Extents don't overlap
56
56
  return{}}}var copyrights={};if(layer.sublayers){Object.assign(copyrights,layer.sublayers.reduce(function(res,sublayer){return _objectSpread(_objectSpread({},res),LayerUtils.getAttribution(sublayer,map,false,transformedMapBBoxes))},{}))}else if(layer.type==="group"&&layer.items){Object.assign(copyrights,layer.items.reduce(function(res,sublayer){return _objectSpread(_objectSpread({},res),LayerUtils.getAttribution(sublayer,map,false,transformedMapBBoxes))},{}))}if(layer.attribution&&layer.attribution.Title){var key=layer.attribution.OnlineResource||layer.attribution.Title;copyrights[key]={title:layer.attribution.OnlineResource?layer.attribution.Title:null,layers:[].concat(_toConsumableArray((copyrights[key]||{}).layers||[]),[layer])}}return copyrights},recomputeLayerBBox:function recomputeLayerBBox(layer){if(isEmpty(layer.sublayers)){return layer}var bounds=null;var newlayer=_objectSpread({},layer);newlayer.sublayers=newlayer.sublayers.map(function(sublayer){sublayer=LayerUtils.recomputeLayerBBox(sublayer);if(!bounds&&sublayer.bbox&&sublayer.bbox.bounds){bounds=CoordinatesUtils.reprojectBbox(sublayer.bbox.bounds,sublayer.bbox.crs,"EPSG:4326")}else if(bounds&&sublayer.bbox&&sublayer.bbox.bounds){var sublayerbounds=CoordinatesUtils.reprojectBbox(sublayer.bbox.bounds,sublayer.bbox.crs,"EPSG:4326");bounds=[Math.min(bounds[0],sublayerbounds[0]),Math.min(bounds[1],sublayerbounds[1]),Math.max(bounds[2],sublayerbounds[2]),Math.max(bounds[3],sublayerbounds[3])]}return sublayer});if(bounds){newlayer.bbox={bounds:bounds,crs:"EPSG:4326"}}return newlayer},propagateLayerProperty:function propagateLayerProperty(newlayer,property,value){var path=arguments.length>3&&arguments[3]!==undefined?arguments[3]:null;Object.assign(newlayer,_defineProperty({},property,value));// Don't propagate visibility for mutually exclusive groups
57
- if(newlayer.sublayers&&!(property==="visibility"&&newlayer.mutuallyExclusive)){newlayer.sublayers=newlayer.sublayers.map(function(sublayer,idx){if(path===null||!isEmpty(path)&&path[0]===idx){var newsublayer=_objectSpread({},sublayer);LayerUtils.propagateLayerProperty(newsublayer,property,value,path?path.slice(1):null);return newsublayer}else{return sublayer}})}}};export default LayerUtils;
57
+ if(newlayer.sublayers&&!(property==="visibility"&&newlayer.mutuallyExclusive)){newlayer.sublayers=newlayer.sublayers.map(function(sublayer,idx){if(path===null||!isEmpty(path)&&path[0]===idx){var newsublayer=_objectSpread({},sublayer);LayerUtils.propagateLayerProperty(newsublayer,property,value,path?path.slice(1):null);return newsublayer}else{return sublayer}})}},getLayerRefreshInterval:function getLayerRefreshInterval(layer){var _layer$refreshInterva;var refreshInterval=(_layer$refreshInterva=layer.refreshInterval)!==null&&_layer$refreshInterva!==void 0?_layer$refreshInterva:0;(layer.sublayers||[]).forEach(function(sublayer){var sublayerRefreshInterval=LayerUtils.getLayerRefreshInterval(sublayer);if(sublayerRefreshInterval>0){refreshInterval=refreshInterval>0?Math.min(refreshInterval,sublayerRefreshInterval):sublayerRefreshInterval}});return refreshInterval}};export default LayerUtils;