qwc2 2025.10.8 → 2025.10.9

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/SearchBox.js +2 -2
  2. package/package.json +1 -1
  3. package/plugins/FeatureSearch.js +2 -2
  4. package/plugins/LayerCatalog.js +1 -1
  5. package/plugins/Redlining.js +3 -3
  6. package/plugins/TopBar.js +3 -3
  7. package/plugins/map/RedliningSupport.js +1 -1
  8. package/plugins/style/FeatureSearch.css +6 -1
  9. package/plugins/style/Redlining.css +5 -0
  10. package/reducers/redlining.js +1 -1
  11. package/static/translations/bg-BG.json +2 -3
  12. package/static/translations/ca-ES.json +2 -3
  13. package/static/translations/cs-CZ.json +2 -3
  14. package/static/translations/de-CH.json +2 -3
  15. package/static/translations/de-DE.json +2 -3
  16. package/static/translations/en-US.json +2 -3
  17. package/static/translations/es-ES.json +2 -3
  18. package/static/translations/fi-FI.json +2 -3
  19. package/static/translations/fr-FR.json +2 -3
  20. package/static/translations/hu-HU.json +2 -3
  21. package/static/translations/it-IT.json +3 -4
  22. package/static/translations/ja-JP.json +2 -3
  23. package/static/translations/nl-NL.json +2 -3
  24. package/static/translations/no-NO.json +2 -3
  25. package/static/translations/pl-PL.json +2 -3
  26. package/static/translations/pt-BR.json +2 -3
  27. package/static/translations/pt-PT.json +2 -3
  28. package/static/translations/ro-RO.json +2 -3
  29. package/static/translations/ru-RU.json +2 -3
  30. package/static/translations/sv-SE.json +2 -3
  31. package/static/translations/tr-TR.json +2 -3
  32. package/static/translations/tsconfig.json +1 -2
  33. package/static/translations/uk-UA.json +2 -3
  34. package/utils/SearchProviders.js +1 -1
  35. package/utils/VectorLayerUtils.js +1 -1
@@ -4,14 +4,14 @@ function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof
4
4
  *
5
5
  * This source code is licensed under the BSD-style license found in the
6
6
  * LICENSE file in the root directory of this source tree.
7
- */import React from"react";import{connect}from"react-redux";import axios from"axios";import classnames from"classnames";import DOMPurify from"dompurify";import isEmpty from"lodash.isempty";import pointInPolygon from"point-in-polygon";import polygonIntersectTest from"polygon-intersect-test";import PropTypes from"prop-types";import{createSelector}from"reselect";import{v4 as uuidv4}from"uuid";import{LayerRole,addLayerFeatures,addThemeSublayer,changeLayerProperty,removeLayer,replacePlaceholderLayer,addLayer}from"../actions/layers";import{logAction}from"../actions/logging";import{panTo,zoomToExtent,zoomToPoint}from"../actions/map";import{setCurrentSearchResult}from"../actions/search";import{setCurrentTask}from"../actions/task";import{setCurrentTheme}from"../actions/theme";import{openExternalUrl,showNotification}from"../actions/windows";import searchProvidersSelector from"../selectors/searchproviders";import ConfigUtils from"../utils/ConfigUtils";import CoordinatesUtils from"../utils/CoordinatesUtils";import LayerUtils from"../utils/LayerUtils";import LocaleUtils from"../utils/LocaleUtils";import MapUtils from"../utils/MapUtils";import MiscUtils from"../utils/MiscUtils";import{UrlParams}from"../utils/PermaLinkUtils";import{FulltextSearch,SearchResultType}from"../utils/SearchProviders";import ServiceLayerUtils from"../utils/ServiceLayerUtils";import VectorLayerUtils from"../utils/VectorLayerUtils";import Icon from"./Icon";import MapSelection from"./MapSelection";import ButtonBar from"./widgets/ButtonBar";import ComboBox from"./widgets/ComboBox";import InputContainer from"./widgets/InputContainer";import NumberInput from"./widgets/NumberInput";import Spinner from"./widgets/Spinner";import"./style/SearchBox.css";var SearchBox=/*#__PURE__*/function(_React$Component){function SearchBox(props){var _this;_classCallCheck(this,SearchBox);_this=_callSuper(this,SearchBox,[props]);_defineProperty(_this,"state",{searchText:"",searchSession:null,pendingSearches:[],recentSearches:[],searchResults:{},resultsVisible:false,collapsedSections:{},expandedLayerGroup:null,activeLayerInfo:null,filterOptionsVisible:false,searchFilterRegions:null,selectedProvider:"",filterRegionName:"",filterGeomType:null,filterGeometry:null});_defineProperty(_this,"loadFilterRegions",function(){var searchRegions=ConfigUtils.getConfigProp("searchFilterRegions",_this.props.theme);if(Array.isArray(searchRegions)){_this.setState({searchFilterRegions:searchRegions})}else if(typeof searchRegions==="string"){axios.get(searchRegions).then(function(response){_this.setState({searchFilterRegions:response.data})})["catch"](function(){_this.setState({searchFilterRegions:null})})}else{_this.setState({searchFilterRegions:null})}});_defineProperty(_this,"renderFilterOptions",function(){var _this$state$filterGeo;if(!_this.state.filterOptionsVisible){return null}var providerSelection=/*#__PURE__*/React.createElement(ComboBox,{onChange:function onChange(value){return _this.setState({selectedProvider:value})},value:_this.state.selectedProvider},/*#__PURE__*/React.createElement("div",{value:""},LocaleUtils.tr("search.all")),Object.entries(_this.props.searchProviders).map(function(_ref){var _prov$params,_prov$label;var _ref2=_slicedToArray(_ref,2),key=_ref2[0],prov=_ref2[1];return/*#__PURE__*/React.createElement("div",{key:key,value:key},(prov===null||prov===void 0||(_prov$params=prov.params)===null||_prov$params===void 0?void 0:_prov$params.title)||((_prov$label=prov.label)!==null&&_prov$label!==void 0?_prov$label:LocaleUtils.tr(prov.labelmsgid)))}));var searchRegionSelection=null;if(Array.isArray(_this.state.searchFilterRegions)){searchRegionSelection=/*#__PURE__*/React.createElement(ComboBox,{onChange:function onChange(value){return _this.setFilterRegion(value,_this.state.searchFilterRegions)},value:_this.state.filterRegionName},/*#__PURE__*/React.createElement("div",{value:""},LocaleUtils.tr("search.none")),_this.state.searchFilterRegions.map(function(group,gidx){return[/*#__PURE__*/React.createElement("div",{"data-group-header":gidx,disabled:true,key:"group"+gidx},group.name)].concat(_toConsumableArray(group.items.map(function(item,idx){return/*#__PURE__*/React.createElement("div",{"data-group":gidx,key:item.name,value:gidx+":"+idx+":"+item.name},item.name)})))}))}var filterButtons=[{key:"Polygon",tooltip:LocaleUtils.tr("redlining.polygon"),icon:"polygon",label:LocaleUtils.tr("redlining.polygon")},{key:"Circle",tooltip:LocaleUtils.tr("redlining.circle"),icon:"circle",label:LocaleUtils.tr("redlining.circle")}];return/*#__PURE__*/React.createElement("div",{className:"searchbox-filter-options"},/*#__PURE__*/React.createElement("table",null,/*#__PURE__*/React.createElement("tbody",null,/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",null,LocaleUtils.tr("search.providerselection"),":"),/*#__PURE__*/React.createElement("td",null,providerSelection)),/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",null,LocaleUtils.tr("search.limittoarea"),":"),/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement("div",{className:"searchbox-filter-options-geometry controlgroup"},/*#__PURE__*/React.createElement(ButtonBar,{active:_this.state.filterGeomType,buttons:filterButtons,onClick:_this.setFilterGeomType}),searchRegionSelection,/*#__PURE__*/React.createElement("button",{className:"button",onClick:_this.clearFilter,title:LocaleUtils.tr("search.clearfilter")},/*#__PURE__*/React.createElement(Icon,{icon:"clear"}))))),_this.state.filterGeomType==="Circle"?/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",null,LocaleUtils.tr("search.circleradius"),":"),/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement(NumberInput,{disabled:!_this.state.filterGeometry,min:1,mobile:true,onChange:_this.setCircleRadius,suffix:" m",value:((_this$state$filterGeo=_this.state.filterGeometry)===null||_this$state$filterGeo===void 0?void 0:_this$state$filterGeo.radius)||0}))):null)))});_defineProperty(_this,"setFilterGeomType",function(geomType){_this.setState({filterGeomType:geomType,filterRegionName:"",filterGeometry:null})});_defineProperty(_this,"setFilterRegion",function(value,searchRegions){if(value){var parts=value.split(":");var item=searchRegions[parts[0]].items[parts[1]];var geometry={type:"Polygon",coordinates:[item.coordinates]};var mapGeometry=VectorLayerUtils.reprojectGeometry(geometry,item.crs,_this.props.map.projection);_this.setState({filterGeomType:null,filterRegionName:value,filterGeometry:mapGeometry})}else{_this.setState({filterGeomType:null,filterRegionName:"",filterGeometry:null})}});_defineProperty(_this,"setCircleRadius",function(value){_this.setState(function(state){return{filterGeometry:_objectSpread(_objectSpread({},state.filterGeometry),{},{radius:value})}})});_defineProperty(_this,"clearFilter",function(){_this.setState({filterGeomType:null,filterRegionName:"",filterGeometry:null})});_defineProperty(_this,"renderResultsMenu",function(){if(!_this.state.resultsVisible){return false}var children=[_this.renderRecentResults(),_this.renderFilters(),_this.renderResults()];children=children.filter(function(child){return!isEmpty(child)});if(isEmpty(children)){if(isEmpty(_this.state.pendingSearches)&&_this.state.searchResults.query_text){children=/*#__PURE__*/React.createElement("div",{className:"searchbox-noresults"},LocaleUtils.tr("search.noresults"))}else{return null}}return/*#__PURE__*/React.createElement("div",{className:"searchbox-results",onMouseDown:_this.setPreventBlur,ref:MiscUtils.setupKillTouchEvents},children)});_defineProperty(_this,"renderRecentResults",function(){var recentSearches=_this.state.recentSearches.filter(function(entry){return entry.toLowerCase().includes(_this.state.searchText.toLowerCase())});if(isEmpty(recentSearches)||recentSearches.length===1&&recentSearches[0].toLowerCase()===_this.state.searchText.toLowerCase()){return null}return/*#__PURE__*/React.createElement("div",{key:"recent"},/*#__PURE__*/React.createElement("div",{className:"searchbox-results-section-title",onClick:function onClick(){return _this.toggleSection("recent")},onMouseDown:MiscUtils.killEvent},/*#__PURE__*/React.createElement(Icon,{icon:_this.isCollapsed("recent")?"expand":"collapse"}),LocaleUtils.tr("search.recent")),!_this.isCollapsed("recent")?/*#__PURE__*/React.createElement("div",{className:"searchbox-results-section-body"},recentSearches.map(function(entry,idx){return/*#__PURE__*/React.createElement("div",{className:"searchbox-result",key:"r"+idx,onClick:function onClick(){return _this.searchTextChanged(entry)},onMouseDown:MiscUtils.killEvent},entry)})):null)});_defineProperty(_this,"renderFilters",function(){return Object.entries(_this.state.searchResults).map(function(_ref3){var _ref4=_slicedToArray(_ref3,2),provider=_ref4[0],results=_ref4[1];if(isEmpty(results.result_counts)||results.result_counts.length<2){return null}var collapsed=_this.isCollapsed("filter",false);var values=results.result_counts.map(function(entry){return entry.filterword+": "+_this.state.searchResults.query_text});values.sort(function(a,b){return a.localeCompare(b)});return/*#__PURE__*/React.createElement("div",{key:"filter"},/*#__PURE__*/React.createElement("div",{className:"searchbox-results-section-title",onClick:function onClick(){return _this.toggleSection("filter")},onMouseDown:MiscUtils.killEvent},/*#__PURE__*/React.createElement(Icon,{icon:collapsed?"expand":"collapse"}),LocaleUtils.tr("search.filter")),!collapsed?/*#__PURE__*/React.createElement("div",{className:"searchbox-results-section-body"},values.map(function(value,idx){return/*#__PURE__*/React.createElement("div",{className:"searchbox-result",key:"f"+idx,onClick:function onClick(){return _this.searchTextChanged(value,true,provider)},onMouseDown:MiscUtils.killEvent},/*#__PURE__*/React.createElement("span",{className:"searchbox-result-label"},value))})):null)}).filter(Boolean)});_defineProperty(_this,"renderResults",function(){var resultRenderers=_defineProperty(_defineProperty(_defineProperty(_defineProperty({},SearchResultType.PLACE,_this.renderPlaceResult),SearchResultType.THEMELAYER,_this.renderLayerResult),SearchResultType.EXTERNALLAYER,_this.renderLayerResult),SearchResultType.THEME,_this.renderThemeResult);var layersBeforePlaces=_this.props.searchOptions.showLayerResultsBeforePlaces;var priorities=_defineProperty(_defineProperty(_defineProperty(_defineProperty({},SearchResultType.PLACE,layersBeforePlaces?0:3),SearchResultType.THEMELAYER,layersBeforePlaces?2:1),SearchResultType.EXTERNALLAYER,layersBeforePlaces?3:2),SearchResultType.THEME,layersBeforePlaces?1:0);var results=Object.keys(_this.props.searchProviders).reduce(function(result,provider){if(!_this.state.searchResults[provider]){return result}return result.concat(_this.state.searchResults[provider].results.map(function(group){var _group$type,_group$type2,_group$title,_group$title2;var sectionId=provider+":"+group.id;var moreLabel=null;if(group.resultCount>0&&group.resultCount>group.items.length){moreLabel=LocaleUtils.tr("search.more",group.resultCount-group.items.length)}else if(group.resultCount===-1){moreLabel=LocaleUtils.tr("search.unknownmore")}if(group.items.length===0){return null}var renderer=resultRenderers[(_group$type=group.type)!==null&&_group$type!==void 0?_group$type:SearchResultType.PLACE];if(!renderer){return null}var priority=priorities[(_group$type2=group.type)!==null&&_group$type2!==void 0?_group$type2:SearchResultType.PLACE];return{priority:priority*1000000+(group.priority||0),title:(_group$title=group.title)!==null&&_group$title!==void 0?_group$title:LocaleUtils.tr(group.titlemsgid),tree:/*#__PURE__*/React.createElement("div",{key:sectionId},/*#__PURE__*/React.createElement("div",{className:"searchbox-results-section-title",onClick:function onClick(){return _this.toggleSection(sectionId)},onMouseDown:MiscUtils.killEvent},/*#__PURE__*/React.createElement(Icon,{icon:_this.isCollapsed(sectionId)?"expand":"collapse"}),/*#__PURE__*/React.createElement("span",null,(_group$title2=group.title)!==null&&_group$title2!==void 0?_group$title2:LocaleUtils.tr(group.titlemsgid))),!_this.isCollapsed(sectionId)?/*#__PURE__*/React.createElement("div",{className:"searchbox-results-section-body"},group.items.map(function(entry){return renderer(provider,group,entry)}),moreLabel?/*#__PURE__*/React.createElement("div",{className:"searchbox-more-results"},moreLabel):null):null)}}))},[]).filter(Boolean);results.sort(function(a,b){if(b.priority!==a.priority){return b.priority-a.priority}else{return b.title.localeCompare(a.title)}});return isEmpty(results)?null:results.map(function(entry){return entry.tree})});_defineProperty(_this,"renderPlaceResult",function(provider,group,result){var _result$label;var key=provider+":"+group.id+":"+result.id;return/*#__PURE__*/React.createElement("div",{className:"searchbox-result",key:key,onClick:function onClick(){_this.selectPlaceResult(provider,group,result);_this.blur()},onMouseDown:MiscUtils.killEvent},result.thumbnail?/*#__PURE__*/React.createElement("img",{className:"searchbox-result-thumbnail",onError:function onError(ev){return _this.loadFallbackResultImage(ev,group.type)},src:result.thumbnail}):null,/*#__PURE__*/React.createElement("span",{className:"searchbox-result-label",dangerouslySetInnerHTML:{__html:DOMPurify.sanitize(result.text).replace(/<br\s*\/>/ig," ")},title:(_result$label=result.label)!==null&&_result$label!==void 0?_result$label:result.text}),result.externalLink?/*#__PURE__*/React.createElement(Icon,{icon:"info-sign",onClick:function onClick(ev){var _result$label2;MiscUtils.killEvent(ev);_this.openUrl(result.externalLink,result.target,(_result$label2=result.label)!==null&&_result$label2!==void 0?_result$label2:result.text)}}):null)});_defineProperty(_this,"renderLayerResult",function(provider,group,result){var _result$label3,_result$layer;var parent=arguments.length>3&&arguments[3]!==undefined?arguments[3]:null;var key=provider+":"+group.id+":"+result.id;var addThemes=ConfigUtils.getConfigProp("allowAddingOtherThemes",_this.props.theme);var icon=null;if(result.sublayers){var toggleLayerGroup=function toggleLayerGroup(){_this.setState(function(state){return{expandedLayerGroup:state.expandedLayerGroup===key?null:key}})};icon=/*#__PURE__*/React.createElement(Icon,{icon:_this.state.expandedLayerGroup===key?"minus":"plus",onClick:function onClick(ev){MiscUtils.killEvent(ev);toggleLayerGroup()}})}else if(result.thumbnail){icon=/*#__PURE__*/React.createElement("img",{className:"searchbox-result-thumbnail",onError:function onError(ev){return _this.loadFallbackResultImage(ev,group.type)},src:result.thumbnail})}var selectResult=result.theme?_this.selectThemeResult:_this.selectLayerResult;return/*#__PURE__*/React.createElement("div",{key:key},/*#__PURE__*/React.createElement("div",{className:"searchbox-result",onClick:function onClick(){selectResult(provider,group,result);_this.blur()},onMouseDown:MiscUtils.killEvent},icon,result.theme?/*#__PURE__*/React.createElement(Icon,{className:"searchbox-result-openicon",icon:"open"}):null,/*#__PURE__*/React.createElement("span",{className:"searchbox-result-label",dangerouslySetInnerHTML:{__html:DOMPurify.sanitize(result.text).replace(/<br\s*\/>/ig," ")},title:(_result$label3=result.label)!==null&&_result$label3!==void 0?_result$label3:result.text}),result.theme&&addThemes?/*#__PURE__*/React.createElement(Icon,{icon:"plus",onClick:function onClick(ev){MiscUtils.killEvent(ev);_this.selectLayerResult(provider,group,result);_this.blur()},title:LocaleUtils.tr("themeswitcher.addtotheme")}):null,result.sublayers?/*#__PURE__*/React.createElement(Icon,{icon:"group",onClick:function onClick(ev){MiscUtils.killEvent(ev);_this.selectLayerResult(provider,group,result,true)},title:LocaleUtils.tr("importlayer.asgroup")}):null,result.info?/*#__PURE__*/React.createElement(Icon,{icon:"info-sign",onClick:function onClick(ev){MiscUtils.killEvent(ev);_this.toggleLayerInfo(provider,group,result,key,parent)}}):null),_this.state.activeLayerInfo===key?/*#__PURE__*/React.createElement("div",{className:"searchbox-result-abstract",dangerouslySetInnerHTML:{__html:MiscUtils.addLinkAnchors(DOMPurify.sanitize(((_result$layer=result.layer)===null||_result$layer===void 0?void 0:_result$layer["abstract"])||""))||LocaleUtils.tr("search.nodescription")}}):null,_this.state.expandedLayerGroup===key?/*#__PURE__*/React.createElement("div",{className:"searchbox-result-group"},result.sublayers.map(function(sublayer){return _this.renderLayerResult(provider,group,sublayer,result.id)})):null)});_defineProperty(_this,"renderThemeResult",function(provider,group,result){var _result$label4;var addThemes=ConfigUtils.getConfigProp("allowAddingOtherThemes",_this.props.theme);return/*#__PURE__*/React.createElement("div",{className:"searchbox-result",key:provider+":"+group.id+":"+result.id,onClick:function onClick(){_this.selectThemeResult(provider,group,result);_this.blur()},onMouseDown:MiscUtils.killEvent},result.thumbnail?/*#__PURE__*/React.createElement("img",{className:"searchbox-result-thumbnail",onError:function onError(ev){return _this.loadFallbackResultImage(ev,group.type)},src:result.thumbnail}):null,/*#__PURE__*/React.createElement(Icon,{className:"searchbox-result-openicon",icon:"open"}),/*#__PURE__*/React.createElement("span",{className:"searchbox-result-label",dangerouslySetInnerHTML:{__html:DOMPurify.sanitize(result.text).replace(/<br\s*\/>/ig," ")},title:(_result$label4=result.label)!==null&&_result$label4!==void 0?_result$label4:result.text}),result.theme&&addThemes?/*#__PURE__*/React.createElement(Icon,{icon:"plus",onClick:function onClick(ev){MiscUtils.killEvent(ev);_this.addThemeLayers(result.layer);_this.blur()},title:LocaleUtils.tr("themeswitcher.addtotheme")}):null)});_defineProperty(_this,"selectPlaceResult",function(provider,group,result){var resultText=result.text.replace(/<\/?\w+\s*\/?>/g,"");if(_this.props.searchOptions.showResultInSearchText!==false){// Show selected result text in search field
7
+ */import React from"react";import{connect}from"react-redux";import axios from"axios";import classnames from"classnames";import DOMPurify from"dompurify";import isEmpty from"lodash.isempty";import pointInPolygon from"point-in-polygon";import polygonIntersectTest from"polygon-intersect-test";import PropTypes from"prop-types";import{createSelector}from"reselect";import{v4 as uuidv4}from"uuid";import{LayerRole,addLayerFeatures,addThemeSublayer,changeLayerProperty,removeLayer,replacePlaceholderLayer,addLayer}from"../actions/layers";import{logAction}from"../actions/logging";import{panTo,zoomToExtent,zoomToPoint}from"../actions/map";import{setCurrentSearchResult}from"../actions/search";import{setCurrentTask}from"../actions/task";import{setCurrentTheme}from"../actions/theme";import{openExternalUrl,showNotification}from"../actions/windows";import searchProvidersSelector from"../selectors/searchproviders";import ConfigUtils from"../utils/ConfigUtils";import CoordinatesUtils from"../utils/CoordinatesUtils";import LayerUtils from"../utils/LayerUtils";import LocaleUtils from"../utils/LocaleUtils";import MapUtils from"../utils/MapUtils";import MiscUtils from"../utils/MiscUtils";import{UrlParams}from"../utils/PermaLinkUtils";import{FulltextSearch,SearchResultType}from"../utils/SearchProviders";import ServiceLayerUtils from"../utils/ServiceLayerUtils";import VectorLayerUtils from"../utils/VectorLayerUtils";import Icon from"./Icon";import MapSelection from"./MapSelection";import ButtonBar from"./widgets/ButtonBar";import ComboBox from"./widgets/ComboBox";import InputContainer from"./widgets/InputContainer";import NumberInput from"./widgets/NumberInput";import Spinner from"./widgets/Spinner";import"./style/SearchBox.css";var SearchBox=/*#__PURE__*/function(_React$Component){function SearchBox(props){var _this;_classCallCheck(this,SearchBox);_this=_callSuper(this,SearchBox,[props]);_defineProperty(_this,"state",{searchText:"",searchSession:null,pendingSearches:[],recentSearches:[],searchResults:{},resultsVisible:false,collapsedSections:{},expandedLayerGroup:null,activeLayerInfo:null,filterOptionsVisible:false,searchFilterRegions:null,selectedProvider:"",filterRegionName:"",filterGeomType:null,filterGeometry:null});_defineProperty(_this,"loadFilterRegions",function(){var searchRegions=ConfigUtils.getConfigProp("searchFilterRegions",_this.props.theme);if(Array.isArray(searchRegions)){_this.setState({searchFilterRegions:searchRegions})}else if(typeof searchRegions==="string"){axios.get(searchRegions).then(function(response){_this.setState({searchFilterRegions:response.data})})["catch"](function(){_this.setState({searchFilterRegions:null})})}else{_this.setState({searchFilterRegions:null})}});_defineProperty(_this,"renderFilterOptions",function(){var _this$state$filterGeo;if(!_this.state.filterOptionsVisible){return null}var providerSelection=/*#__PURE__*/React.createElement(ComboBox,{onChange:function onChange(value){return _this.setState({selectedProvider:value})},value:_this.state.selectedProvider},/*#__PURE__*/React.createElement("div",{value:""},LocaleUtils.tr("search.all")),Object.entries(_this.props.searchProviders).map(function(_ref){var _prov$params,_prov$label;var _ref2=_slicedToArray(_ref,2),key=_ref2[0],prov=_ref2[1];return/*#__PURE__*/React.createElement("div",{key:key,value:key},(prov===null||prov===void 0||(_prov$params=prov.params)===null||_prov$params===void 0?void 0:_prov$params.title)||((_prov$label=prov.label)!==null&&_prov$label!==void 0?_prov$label:LocaleUtils.tr(prov.labelmsgid)))}));var searchRegionSelection=null;if(Array.isArray(_this.state.searchFilterRegions)){searchRegionSelection=/*#__PURE__*/React.createElement(ComboBox,{onChange:function onChange(value){return _this.setFilterRegion(value,_this.state.searchFilterRegions)},value:_this.state.filterRegionName},/*#__PURE__*/React.createElement("div",{value:""},LocaleUtils.tr("search.none")),_this.state.searchFilterRegions.map(function(group,gidx){return[/*#__PURE__*/React.createElement("div",{"data-group-header":gidx,disabled:true,key:"group"+gidx},group.name)].concat(_toConsumableArray(group.items.map(function(item,idx){return/*#__PURE__*/React.createElement("div",{"data-group":gidx,key:item.name,value:gidx+":"+idx+":"+item.name},item.name)})))}))}var filterButtons=[{key:"Polygon",tooltip:LocaleUtils.tr("redlining.polygon"),icon:"polygon",label:LocaleUtils.tr("redlining.polygon")},{key:"Circle",tooltip:LocaleUtils.tr("redlining.circle"),icon:"circle",label:LocaleUtils.tr("redlining.circle")}];return/*#__PURE__*/React.createElement("div",{className:"searchbox-filter-options"},/*#__PURE__*/React.createElement("table",null,/*#__PURE__*/React.createElement("tbody",null,/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",null,LocaleUtils.tr("search.providerselection"),":"),/*#__PURE__*/React.createElement("td",null,providerSelection)),/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",null,LocaleUtils.tr("search.limittoarea"),":"),/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement("div",{className:"searchbox-filter-options-geometry controlgroup"},/*#__PURE__*/React.createElement(ButtonBar,{active:_this.state.filterGeomType,buttons:filterButtons,onClick:_this.setFilterGeomType}),searchRegionSelection,/*#__PURE__*/React.createElement("button",{className:"button",onClick:_this.clearFilter,title:LocaleUtils.tr("search.clearfilter")},/*#__PURE__*/React.createElement(Icon,{icon:"clear"}))))),_this.state.filterGeomType==="Circle"?/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",null,LocaleUtils.tr("search.circleradius"),":"),/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement(NumberInput,{disabled:!_this.state.filterGeometry,min:1,mobile:true,onChange:_this.setCircleRadius,suffix:" m",value:((_this$state$filterGeo=_this.state.filterGeometry)===null||_this$state$filterGeo===void 0?void 0:_this$state$filterGeo.radius)||0}))):null)))});_defineProperty(_this,"setFilterGeomType",function(geomType){_this.setState({filterGeomType:geomType,filterRegionName:"",filterGeometry:null})});_defineProperty(_this,"setFilterRegion",function(value,searchRegions){if(value){var parts=value.split(":");var item=searchRegions[parts[0]].items[parts[1]];var geometry={type:"Polygon",coordinates:[item.coordinates]};var mapGeometry=VectorLayerUtils.reprojectGeometry(geometry,item.crs,_this.props.map.projection);_this.setState({filterGeomType:null,filterRegionName:value,filterGeometry:mapGeometry})}else{_this.setState({filterGeomType:null,filterRegionName:"",filterGeometry:null})}});_defineProperty(_this,"setCircleRadius",function(value){_this.setState(function(state){return{filterGeometry:_objectSpread(_objectSpread({},state.filterGeometry),{},{radius:value})}})});_defineProperty(_this,"clearFilter",function(){_this.setState({filterGeomType:null,filterRegionName:"",filterGeometry:null})});_defineProperty(_this,"renderResultsMenu",function(){if(!_this.state.resultsVisible){return false}var children=[_this.renderRecentResults(),_this.renderFilters(),_this.renderResults()];children=children.filter(function(child){return!isEmpty(child)});if(isEmpty(children)){if(isEmpty(_this.state.pendingSearches)&&_this.state.searchResults.query_text){children=/*#__PURE__*/React.createElement("div",{className:"searchbox-noresults"},LocaleUtils.tr("search.noresults"))}else{return null}}return/*#__PURE__*/React.createElement("div",{className:"searchbox-results",onMouseDown:_this.setPreventBlur,ref:MiscUtils.setupKillTouchEvents},children)});_defineProperty(_this,"renderRecentResults",function(){var recentSearches=_this.state.recentSearches.filter(function(entry){return entry.toLowerCase().includes(_this.state.searchText.toLowerCase())});if(isEmpty(recentSearches)||recentSearches.length===1&&recentSearches[0].toLowerCase()===_this.state.searchText.toLowerCase()){return null}return/*#__PURE__*/React.createElement("div",{key:"recent"},/*#__PURE__*/React.createElement("div",{className:"searchbox-results-section-title",onClick:function onClick(){return _this.toggleSection("recent")},onMouseDown:MiscUtils.killEvent},/*#__PURE__*/React.createElement(Icon,{icon:_this.isCollapsed("recent")?"expand":"collapse"}),LocaleUtils.tr("search.recent")),!_this.isCollapsed("recent")?/*#__PURE__*/React.createElement("div",{className:"searchbox-results-section-body"},recentSearches.map(function(entry,idx){return/*#__PURE__*/React.createElement("div",{className:"searchbox-result",key:"r"+idx,onClick:function onClick(){return _this.searchTextChanged(entry)},onMouseDown:MiscUtils.killEvent},entry)})):null)});_defineProperty(_this,"renderFilters",function(){return Object.entries(_this.state.searchResults).map(function(_ref3){var _ref4=_slicedToArray(_ref3,2),provider=_ref4[0],results=_ref4[1];if(isEmpty(results.result_counts)||results.result_counts.length<2){return null}var collapsed=_this.isCollapsed("filter",false);var values=results.result_counts.map(function(entry){return entry.filterword+": "+_this.state.searchResults.query_text});values.sort(function(a,b){return a.localeCompare(b)});return/*#__PURE__*/React.createElement("div",{key:"filter"},/*#__PURE__*/React.createElement("div",{className:"searchbox-results-section-title",onClick:function onClick(){return _this.toggleSection("filter")},onMouseDown:MiscUtils.killEvent},/*#__PURE__*/React.createElement(Icon,{icon:collapsed?"expand":"collapse"}),LocaleUtils.tr("search.filter")),!collapsed?/*#__PURE__*/React.createElement("div",{className:"searchbox-results-section-body"},values.map(function(value,idx){return/*#__PURE__*/React.createElement("div",{className:"searchbox-result",key:"f"+idx,onClick:function onClick(){return _this.searchTextChanged(value,true,provider)},onMouseDown:MiscUtils.killEvent},/*#__PURE__*/React.createElement("span",{className:"searchbox-result-label"},value))})):null)}).filter(Boolean)});_defineProperty(_this,"renderResults",function(){var resultRenderers=_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty({},SearchResultType.PLACE,_this.renderPlaceResult),SearchResultType.THEMELAYER,_this.renderLayerResult),SearchResultType.EXTERNALLAYER,_this.renderLayerResult),SearchResultType.THEME,_this.renderThemeResult),SearchResultType.TASK,_this.renderTaskResult);var layersBeforePlaces=_this.props.searchOptions.showLayerResultsBeforePlaces;var priorities=_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty({},SearchResultType.PLACE,layersBeforePlaces?0:3),SearchResultType.THEMELAYER,layersBeforePlaces?2:1),SearchResultType.EXTERNALLAYER,layersBeforePlaces?3:2),SearchResultType.THEME,layersBeforePlaces?1:0),SearchResultType.TASK,4);var results=Object.keys(_this.props.searchProviders).reduce(function(result,provider){if(!_this.state.searchResults[provider]){return result}return result.concat(_this.state.searchResults[provider].results.map(function(group){var _group$type,_group$type2,_group$title,_group$title2;var sectionId=provider+":"+group.id;var moreLabel=null;if(group.resultCount>0&&group.resultCount>group.items.length){moreLabel=LocaleUtils.tr("search.more",group.resultCount-group.items.length)}else if(group.resultCount===-1){moreLabel=LocaleUtils.tr("search.unknownmore")}if(group.items.length===0){return null}var renderer=resultRenderers[(_group$type=group.type)!==null&&_group$type!==void 0?_group$type:SearchResultType.PLACE];if(!renderer){return null}var priority=priorities[(_group$type2=group.type)!==null&&_group$type2!==void 0?_group$type2:SearchResultType.PLACE];return{priority:priority*1000000+(group.priority||0),title:(_group$title=group.title)!==null&&_group$title!==void 0?_group$title:LocaleUtils.tr(group.titlemsgid),tree:/*#__PURE__*/React.createElement("div",{key:sectionId},/*#__PURE__*/React.createElement("div",{className:"searchbox-results-section-title",onClick:function onClick(){return _this.toggleSection(sectionId)},onMouseDown:MiscUtils.killEvent},/*#__PURE__*/React.createElement(Icon,{icon:_this.isCollapsed(sectionId)?"expand":"collapse"}),/*#__PURE__*/React.createElement("span",null,(_group$title2=group.title)!==null&&_group$title2!==void 0?_group$title2:LocaleUtils.tr(group.titlemsgid))),!_this.isCollapsed(sectionId)?/*#__PURE__*/React.createElement("div",{className:"searchbox-results-section-body"},group.items.map(function(entry){return renderer(provider,group,entry)}),moreLabel?/*#__PURE__*/React.createElement("div",{className:"searchbox-more-results"},moreLabel):null):null)}}))},[]).filter(Boolean);results.sort(function(a,b){if(b.priority!==a.priority){return b.priority-a.priority}else{return b.title.localeCompare(a.title)}});return isEmpty(results)?null:results.map(function(entry){return entry.tree})});_defineProperty(_this,"renderPlaceResult",function(provider,group,result){var _result$label;var key=provider+":"+group.id+":"+result.id;return/*#__PURE__*/React.createElement("div",{className:"searchbox-result",key:key,onClick:function onClick(){_this.selectPlaceResult(provider,group,result);_this.blur()},onMouseDown:MiscUtils.killEvent},result.thumbnail?/*#__PURE__*/React.createElement("img",{className:"searchbox-result-thumbnail",onError:function onError(ev){return _this.loadFallbackResultImage(ev,group.type)},src:result.thumbnail}):null,/*#__PURE__*/React.createElement("span",{className:"searchbox-result-label",dangerouslySetInnerHTML:{__html:DOMPurify.sanitize(result.text).replace(/<br\s*\/>/ig," ")},title:(_result$label=result.label)!==null&&_result$label!==void 0?_result$label:result.text}),result.externalLink?/*#__PURE__*/React.createElement(Icon,{icon:"info-sign",onClick:function onClick(ev){var _result$label2;MiscUtils.killEvent(ev);_this.openUrl(result.externalLink,result.target,(_result$label2=result.label)!==null&&_result$label2!==void 0?_result$label2:result.text)}}):null)});_defineProperty(_this,"renderLayerResult",function(provider,group,result){var _result$label3,_result$layer;var parent=arguments.length>3&&arguments[3]!==undefined?arguments[3]:null;var key=provider+":"+group.id+":"+result.id;var addThemes=ConfigUtils.getConfigProp("allowAddingOtherThemes",_this.props.theme);var icon=null;if(result.sublayers){var toggleLayerGroup=function toggleLayerGroup(){_this.setState(function(state){return{expandedLayerGroup:state.expandedLayerGroup===key?null:key}})};icon=/*#__PURE__*/React.createElement(Icon,{icon:_this.state.expandedLayerGroup===key?"minus":"plus",onClick:function onClick(ev){MiscUtils.killEvent(ev);toggleLayerGroup()}})}else if(result.thumbnail){icon=/*#__PURE__*/React.createElement("img",{className:"searchbox-result-thumbnail",onError:function onError(ev){return _this.loadFallbackResultImage(ev,group.type)},src:result.thumbnail})}var selectResult=result.theme?_this.selectThemeResult:_this.selectLayerResult;return/*#__PURE__*/React.createElement("div",{key:key},/*#__PURE__*/React.createElement("div",{className:"searchbox-result",onClick:function onClick(){selectResult(provider,group,result);_this.blur()},onMouseDown:MiscUtils.killEvent},icon,result.theme?/*#__PURE__*/React.createElement(Icon,{className:"searchbox-result-openicon",icon:"open"}):null,/*#__PURE__*/React.createElement("span",{className:"searchbox-result-label",dangerouslySetInnerHTML:{__html:DOMPurify.sanitize(result.text).replace(/<br\s*\/>/ig," ")},title:(_result$label3=result.label)!==null&&_result$label3!==void 0?_result$label3:result.text}),result.theme&&addThemes?/*#__PURE__*/React.createElement(Icon,{icon:"plus",onClick:function onClick(ev){MiscUtils.killEvent(ev);_this.selectLayerResult(provider,group,result);_this.blur()},title:LocaleUtils.tr("themeswitcher.addtotheme")}):null,result.sublayers?/*#__PURE__*/React.createElement(Icon,{icon:"group",onClick:function onClick(ev){MiscUtils.killEvent(ev);_this.selectLayerResult(provider,group,result,true)},title:LocaleUtils.tr("importlayer.asgroup")}):null,result.info?/*#__PURE__*/React.createElement(Icon,{icon:"info-sign",onClick:function onClick(ev){MiscUtils.killEvent(ev);_this.toggleLayerInfo(provider,group,result,key,parent)}}):null),_this.state.activeLayerInfo===key?/*#__PURE__*/React.createElement("div",{className:"searchbox-result-abstract",dangerouslySetInnerHTML:{__html:MiscUtils.addLinkAnchors(DOMPurify.sanitize(((_result$layer=result.layer)===null||_result$layer===void 0?void 0:_result$layer["abstract"])||""))||LocaleUtils.tr("search.nodescription")}}):null,_this.state.expandedLayerGroup===key?/*#__PURE__*/React.createElement("div",{className:"searchbox-result-group"},result.sublayers.map(function(sublayer){return _this.renderLayerResult(provider,group,sublayer,result.id)})):null)});_defineProperty(_this,"renderThemeResult",function(provider,group,result){var _result$label4;var addThemes=ConfigUtils.getConfigProp("allowAddingOtherThemes",_this.props.theme);return/*#__PURE__*/React.createElement("div",{className:"searchbox-result",key:provider+":"+group.id+":"+result.id,onClick:function onClick(){_this.selectThemeResult(provider,group,result);_this.blur()},onMouseDown:MiscUtils.killEvent},result.thumbnail?/*#__PURE__*/React.createElement("img",{className:"searchbox-result-thumbnail",onError:function onError(ev){return _this.loadFallbackResultImage(ev,group.type)},src:result.thumbnail}):null,/*#__PURE__*/React.createElement(Icon,{className:"searchbox-result-openicon",icon:"open"}),/*#__PURE__*/React.createElement("span",{className:"searchbox-result-label",dangerouslySetInnerHTML:{__html:DOMPurify.sanitize(result.text).replace(/<br\s*\/>/ig," ")},title:(_result$label4=result.label)!==null&&_result$label4!==void 0?_result$label4:result.text}),result.theme&&addThemes?/*#__PURE__*/React.createElement(Icon,{icon:"plus",onClick:function onClick(ev){MiscUtils.killEvent(ev);_this.addThemeLayers(result.layer);_this.blur()},title:LocaleUtils.tr("themeswitcher.addtotheme")}):null)});_defineProperty(_this,"renderTaskResult",function(provider,group,result){return/*#__PURE__*/React.createElement("div",{className:"searchbox-result",key:provider+":"+group.id+":"+result.id,onClick:function onClick(){_this.selectTaskResult(provider,group,result);_this.blur()},onMouseDown:MiscUtils.killEvent},result.task.icon?/*#__PURE__*/React.createElement(Icon,{icon:result.task.icon}):null,/*#__PURE__*/React.createElement("span",{className:"searchbox-result-label"},result.text))});_defineProperty(_this,"selectPlaceResult",function(provider,group,result){var resultText=result.text.replace(/<\/?\w+\s*\/?>/g,"");if(_this.props.searchOptions.showResultInSearchText!==false){// Show selected result text in search field
8
8
  _this.setState({searchText:resultText,searchResults:_defineProperty({query_text:resultText},provider,{results:[_objectSpread(_objectSpread({},group),{},{items:[result]})],tot_result_count:1})})}_this.updateRecentSearches();if(result.geometry){_this.showResultGeometry(result,{feature:{type:"Feature",geometry:result.geometry},crs:result.crs})}else if(_this.props.searchProviders[provider].getResultGeometry){_this.props.searchProviders[provider].getResultGeometry(result,function(response){_this.showResultGeometry(result,response)},axios)}else{// Display marker
9
9
  _this.showResultGeometry(result,{feature:{type:"Feature",geometry:{type:"Point",coordinates:[result.x,result.y]}},crs:result.crs})}if(result.dataproduct_id){var quot=typeof result.id==="string"?"\"":"";var filter="[[\"".concat(result.id_field_name,"\",\"=\", ").concat(quot).concat(result.id).concat(quot,"]]");UrlParams.updateParams({hp:result.dataproduct_id,hf:filter,st:resultText})}else{UrlParams.updateParams({hp:undefined,hf:undefined,st:resultText})}_this.props.logAction("SEARCH_TEXT",{searchText:_this.state.searchText});_this.props.logAction("SEARCH_RESULT_SELECTED",{place:resultText});// Enable layer
10
10
  if(result.layername){var path=[];var sublayer=null;var layer=_this.props.layers.find(function(l){return l.role===LayerRole.THEME&&(sublayer=LayerUtils.searchSubLayer(l,"name",result.layername,path))});if(layer&&sublayer){_this.props.changeLayerProperty(layer.id,"visibility",true,path,"both")}}});_defineProperty(_this,"selectLayerResult",function(provider,group,result){var asGroup=arguments.length>3&&arguments[3]!==undefined?arguments[3]:false;if(result.layer){if(result.theme){_this.addThemeLayers(result.layer)}else if(group.type===SearchResultType.THEMELAYER){_this.props.addThemeSublayer(result.layer)}else if(group.type===SearchResultType.EXTERNALLAYER){_this.addExternalLayer(result.layer,asGroup)}// Show layer tree to notify user that something has happened
11
11
  _this.props.setCurrentTask("LayerTree")}else if(_this.props.searchProviders[provider].getLayerDefinition){_this.props.searchProviders[provider].getLayerDefinition(result,function(layer){if(layer){if(result.theme){_this.addThemeLayers(layer)}else if(group.type===SearchResultType.THEMELAYER){_this.props.addThemeSublayer({sublayers:[layer]})}else if(group.type===SearchResultType.EXTERNALLAYER){_this.addExternalLayer(layer,asGroup)}// Show layer tree to notify user that something has happened
12
12
  _this.props.setCurrentTask("LayerTree")}},axios)}});_defineProperty(_this,"addExternalLayer",function(entry){var asGroup=arguments.length>1&&arguments[1]!==undefined?arguments[1]:false;if(entry.resource){var _entry$title;var params=LayerUtils.splitLayerUrlParam(entry.resource);// Create placeholder layer
13
13
  _this.props.addLayer({id:params.id,type:"placeholder",name:params.name,title:(_entry$title=entry.title)!==null&&_entry$title!==void 0?_entry$title:params.name,role:params.USERLAYER,loading:true});ServiceLayerUtils.findLayers(params.type,params.url,[params],_this.props.map.projection,function(id,layer){if(layer){if(!asGroup){layer.sublayers=null}LayerUtils.propagateLayerProperty(layer,"opacity",params.opacity);_this.props.replacePlaceholderLayer(params.id,layer)}else{// eslint-disable-next-line
14
- alert(LocaleUtils.tr("importlayer.addfailed"));_this.props.removeLayer(params.id)}})}else if(entry.type==="wms"||entry.type==="wfs"||entry.type==="wmts"){if(asGroup){_this.props.addLayer(entry)}else{_this.props.addLayer(_objectSpread(_objectSpread({},entry),{},{sublayers:null}))}}});_defineProperty(_this,"selectThemeResult",function(provider,group,result){_this.props.setCurrentTheme(result.theme,_this.props.themes);if(_this.props.searchOptions.showLayerAfterChangeTheme){_this.props.setCurrentTask("LayerTree")}});_defineProperty(_this,"loadFallbackResultImage",function(ev,type){if(type===SearchResultType.PLACE){var iconPath=ConfigUtils.getAssetsPath()+"/img/search/";if(!ev.target.src.endsWith(iconPath+"feature.svg")){ev.target.src=iconPath+"feature.svg"}}else{ev.target.style.display="none"}});_defineProperty(_this,"toggleLayerInfo",function(provider,group,result,key,parent){var setResultLayerAndActiveInfo=function setResultLayerAndActiveInfo(layer){// Embed returned layer into result item, so that layer info is read from item.layer.abstract
14
+ alert(LocaleUtils.tr("importlayer.addfailed"));_this.props.removeLayer(params.id)}})}else if(entry.type==="wms"||entry.type==="wfs"||entry.type==="wmts"){if(asGroup){_this.props.addLayer(entry)}else{_this.props.addLayer(_objectSpread(_objectSpread({},entry),{},{sublayers:null}))}}});_defineProperty(_this,"selectThemeResult",function(provider,group,result){_this.props.setCurrentTheme(result.theme,_this.props.themes);if(_this.props.searchOptions.showLayerAfterChangeTheme){_this.props.setCurrentTask("LayerTree")}});_defineProperty(_this,"selectTaskResult",function(provider,group,result){if(result.task.url){_this.props.openExternalUrl(result.task.url,result.task.target,result.text,result.task.icon)}else{_this.props.setCurrentTask(result.task.task||result.task.key,result.task.mode,result.task.mapClickAction||(result.task.identifyEnabled?"identify":null))}});_defineProperty(_this,"loadFallbackResultImage",function(ev,type){if(type===SearchResultType.PLACE){var iconPath=ConfigUtils.getAssetsPath()+"/img/search/";if(!ev.target.src.endsWith(iconPath+"feature.svg")){ev.target.src=iconPath+"feature.svg"}}else{ev.target.style.display="none"}});_defineProperty(_this,"toggleLayerInfo",function(provider,group,result,key,parent){var setResultLayerAndActiveInfo=function setResultLayerAndActiveInfo(layer){// Embed returned layer into result item, so that layer info is read from item.layer.abstract
15
15
  _this.setState(function(state){return{searchResults:_objectSpread(_objectSpread({},state.searchResults),{},_defineProperty({},provider,_objectSpread(_objectSpread({},state.searchResults[provider]),{},{results:state.searchResults[provider].results.map(function(g){if(g.id===group.id){return _objectSpread(_objectSpread({},g),{},{items:g.items.map(function(item){if(item.id===result.id){return _objectSpread(_objectSpread({},item),{},{layer:layer})}else if(item.id===parent){return _objectSpread(_objectSpread({},item),{},{sublayers:item.sublayers.map(function(sublayer){if(sublayer.id===result.id){return _objectSpread(_objectSpread({},sublayer),{},{layer:layer})}else{return sublayer}})})}else{return item}})})}else{return g}})}))),activeLayerInfo:key}})};_this.setState(function(state){if(state.activeLayerInfo===key){return{activeLayerInfo:null}}else{if(!result.layer&&_this.props.searchProviders[provider].getLayerDefinition){_this.props.searchProviders[provider].getLayerDefinition(result,setResultLayerAndActiveInfo,axios);return{}}else{return{activeLayerInfo:key}}}})});_defineProperty(_this,"setPreventBlur",function(){_this.preventBlur=true;setTimeout(function(){_this.preventBlur=false;return false},100)});_defineProperty(_this,"toggleSection",function(key){return _this.setState(function(state){var _newCollapsedSections;var newCollapsedSections=_objectSpread({},state.collapsedSections);var deflt=_this.props.searchOptions.sectionsDefaultCollapsed||false;newCollapsedSections[key]=!((_newCollapsedSections=newCollapsedSections[key])!==null&&_newCollapsedSections!==void 0?_newCollapsedSections:deflt);return{collapsedSections:newCollapsedSections}})});_defineProperty(_this,"isCollapsed",function(section){var _this$state$collapsed;var deflt=arguments.length>1&&arguments[1]!==undefined?arguments[1]:null;deflt=deflt!==null&&deflt!==void 0?deflt:_this.props.searchOptions.sectionsDefaultCollapsed||false;return(_this$state$collapsed=_this.state.collapsedSections[section])!==null&&_this$state$collapsed!==void 0?_this$state$collapsed:deflt});_defineProperty(_this,"toggleFilterOptions",function(visible){_this.setState({filterOptionsVisible:visible})});_defineProperty(_this,"searchTextChanged",function(text){var expandSections=arguments.length>1&&arguments[1]!==undefined?arguments[1]:false;var provider=arguments.length>2&&arguments[2]!==undefined?arguments[2]:null;if(_this.props.layers.find(function(layer){return layer.id==="searchselection"})){_this.props.removeLayer("searchselection")}var newState={searchText:text,expandedLayerGroup:null,activeLayerInfo:null,pendingSearches:[],searchSession:null};if(expandSections){newState.collapsedSections={}}_this.setState(newState);clearTimeout(_this.searchTimeout);_this.searchTimeout=setTimeout(function(){return _this.startSearch(provider)},250)});_defineProperty(_this,"onFocus",function(){_this.setState({resultsVisible:true});if(_this.searchBox){_this.searchBox.select()}if(isEmpty(_this.state.searchResults)&&_this.props.theme){_this.startSearch()}if(_this.props.searchOptions.allowSearchFilters){_this.toggleFilterOptions(false)}});_defineProperty(_this,"onBlur",function(){if(_this.preventBlur&&_this.searchBox){_this.searchBox.focus()}else{_this.setState({resultsVisible:false,collapsedSections:{},expandedLayerGroup:null,activeLayerInfo:null})}});_defineProperty(_this,"clear",function(){_this.props.setCurrentSearchResult(null);_this.blur();_this.setState({searchText:"",searchResults:{},selectedProvider:"",filterRegionName:"",filterGeometry:null});_this.props.removeLayer("searchselection");UrlParams.updateParams({hp:undefined,hf:undefined,st:undefined})});_defineProperty(_this,"startSearch",function(){var _this$state$filterGeo2;var provider=arguments.length>0&&arguments[0]!==undefined?arguments[0]:null;var uniquePlaceResult=arguments.length>1&&arguments[1]!==undefined?arguments[1]:false;var availableProviders=_this.props.searchProviders;var selectedProvider=provider!==null&&provider!==void 0?provider:_this.state.selectedProvider;if(selectedProvider){availableProviders=_defineProperty({},selectedProvider,_this.props.searchProviders[selectedProvider])}// eslint-disable-next-line
16
16
  var searchText=_this.state.searchText.trim();if(isEmpty(searchText)){_this.setState({searchResults:{}});return}var searchSession=uuidv4();_this.setState({searchResults:{query_text:searchText},searchSession:searchSession,pendingSearches:Object.keys(availableProviders)});var searchParams={mapcrs:_this.props.map.projection,displaycrs:_this.props.map.displayCrs,lang:LocaleUtils.lang(),limit:_this.props.searchOptions.resultLimit,filterPoly:(_this$state$filterGeo2=_this.state.filterGeometry)===null||_this$state$filterGeo2===void 0||(_this$state$filterGeo2=_this$state$filterGeo2.coordinates)===null||_this$state$filterGeo2===void 0?void 0:_this$state$filterGeo2[0],filterBBox:_this.state.filterGeometry?VectorLayerUtils.computeFeatureBBox(_this.state.filterGeometry):null};Object.entries(availableProviders).forEach(function(_ref5){var _ref6=_slicedToArray(_ref5,2),provKey=_ref6[0],prov=_ref6[1];prov.onSearch(searchText,_objectSpread(_objectSpread({cfgParams:prov.cfgParams},prov.params),searchParams),function(response){var results=prov.handlesGeomFilter?response.results:_this.filterProviderResults(response.results);var totResultCount=results.reduce(function(tot,group){var _group$resultCount;return tot+((_group$resultCount=group.resultCount)!==null&&_group$resultCount!==void 0?_group$resultCount:group.items.length)},0);if(uniquePlaceResult){// If looking for unique place result, filter non-place results
17
17
  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){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];// Avoid warning about setState called in setState
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "qwc2",
3
- "version": "2025.10.08",
3
+ "version": "2025.10.09",
4
4
  "description": "QGIS Web Client",
5
5
  "author": "Sourcepole AG",
6
6
  "license": "BSD-2-Clause",
@@ -4,8 +4,8 @@ function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof
4
4
  *
5
5
  * This source code is licensed under the BSD-style license found in the
6
6
  * LICENSE file in the root directory of this source tree.
7
- */import React from"react";import{connect}from"react-redux";import axios from"axios";import isEmpty from"lodash.isempty";import PropTypes from"prop-types";import{v4 as uuidv4}from"uuid";import IdentifyViewer from"../components/IdentifyViewer";import SideBar from"../components/SideBar";import Spinner from"../components/widgets/Spinner";import IdentifyUtils from"../utils/IdentifyUtils";import LocaleUtils from"../utils/LocaleUtils";import"./style/FeatureSearch.css";/**
7
+ */import React from"react";import{connect}from"react-redux";import axios from"axios";import isEmpty from"lodash.isempty";import PropTypes from"prop-types";import{v4 as uuidv4}from"uuid";import Icon from"../components/Icon";import IdentifyViewer from"../components/IdentifyViewer";import SideBar from"../components/SideBar";import InputContainer from"../components/widgets/InputContainer";import Spinner from"../components/widgets/Spinner";import IdentifyUtils from"../utils/IdentifyUtils";import LocaleUtils from"../utils/LocaleUtils";import"./style/FeatureSearch.css";/**
8
8
  * Displays a dialog with a search form for configured QGIS feature searches with one or more input fields.
9
9
  *
10
10
  * See [Configuring the QGIS feature search](../../topics/Search/#configuring-the-qgis-feature-search).
11
- */var FeatureSearch=/*#__PURE__*/function(_React$Component){function FeatureSearch(){var _this;_classCallCheck(this,FeatureSearch);for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++){args[_key]=arguments[_key]}_this=_callSuper(this,FeatureSearch,[].concat(args));_defineProperty(_this,"state",{busy:false,searchProviders:{},providerGroups:{},selectedProvider:"",formValues:{},providerSelectOptions:{},searchResults:null});_defineProperty(_this,"onHide",function(){_this.setState({searchResults:null})});_defineProperty(_this,"renderBody",function(){return/*#__PURE__*/React.createElement("div",{className:"feature-search-body"},/*#__PURE__*/React.createElement("div",{className:"feature-search-selection"},/*#__PURE__*/React.createElement("select",{onChange:_this.selectProvider,value:_this.state.selectedProvider},/*#__PURE__*/React.createElement("option",{disabled:true,value:""},LocaleUtils.tr("featuresearch.select")),Object.entries(_this.state.providerGroups).map(function(_ref){var _ref2=_slicedToArray(_ref,2),group=_ref2[0],entries=_ref2[1];return[group!==""?/*#__PURE__*/React.createElement("option",{disabled:true,key:group,value:group},group):null,entries.map(function(providerId){return/*#__PURE__*/React.createElement("option",{key:providerId,value:providerId},_this.state.searchProviders[providerId].params.title)})]}))),_this.renderSearchForm(),_this.renderSearchResults())});_defineProperty(_this,"renderSearchForm",function(){var provider=_this.state.searchProviders[_this.state.selectedProvider];if(!provider){return null}return/*#__PURE__*/React.createElement("form",{className:"feature-search-form",disabled:_this.state.busy,onChange:function onChange(){return _this.setState({searchResults:null})},onSubmit:_this.search},/*#__PURE__*/React.createElement("fieldset",{disabled:_this.state.busy},provider.params.description?/*#__PURE__*/React.createElement("div",{className:"feature-search-form-descr"},provider.params.description):null,/*#__PURE__*/React.createElement("table",null,/*#__PURE__*/React.createElement("tbody",null,Object.entries(provider.params.fields).map(function(_ref3){var _value$label;var _ref4=_slicedToArray(_ref3,2),key=_ref4[0],value=_ref4[1];return/*#__PURE__*/React.createElement("tr",{key:key},/*#__PURE__*/React.createElement("td",null,(_value$label=value.label)!==null&&_value$label!==void 0?_value$label:LocaleUtils.tr(value.labelmsgid),":"),/*#__PURE__*/React.createElement("td",null,_this.renderField(key,value)))})))),/*#__PURE__*/React.createElement("div",{className:"feature-search-bar"},/*#__PURE__*/React.createElement("button",{className:"button",disabled:_this.state.busy,type:"submit"},_this.state.busy?/*#__PURE__*/React.createElement(Spinner,null):null,LocaleUtils.tr("search.search"))))});_defineProperty(_this,"renderField",function(fieldname,fieldcfg){var onChange=function onChange(ev){return _this.setState(function(state){return{formValues:_objectSpread(_objectSpread({},state.formValues),{},_defineProperty({},fieldname,ev.target.value))}})};if(fieldcfg.type==="select"){var _this$state$providerS,_this$state$providerS2;var options=(_this$state$providerS=(_this$state$providerS2=_this.state.providerSelectOptions[fieldname])===null||_this$state$providerS2===void 0?void 0:_this$state$providerS2.options)!==null&&_this$state$providerS!==void 0?_this$state$providerS:fieldcfg.options;return/*#__PURE__*/React.createElement("select",{name:fieldname,onChange:onChange},options.map(function(entry){var _entry$value,_entry$value2,_entry$label;return/*#__PURE__*/React.createElement("option",{key:(_entry$value=entry.value)!==null&&_entry$value!==void 0?_entry$value:entry,value:(_entry$value2=entry.value)!==null&&_entry$value2!==void 0?_entry$value2:entry},(_entry$label=entry.label)!==null&&_entry$label!==void 0?_entry$label:entry.labelmsgid?LocaleUtils.tr(entry.labelmsgid):entry)}))}else{return/*#__PURE__*/React.createElement("input",_extends({name:fieldname,onChange:onChange,type:fieldcfg.type||"text"},fieldcfg.options))}});_defineProperty(_this,"renderSearchResults",function(){if(!_this.state.searchResults){return null}var provider=_this.state.searchProviders[_this.state.selectedProvider];return/*#__PURE__*/React.createElement("div",{className:"feature-search-results"},isEmpty(_this.state.searchResults)?/*#__PURE__*/React.createElement("div",{className:"feature-search-noresults"},LocaleUtils.tr("featuresearch.noresults")):/*#__PURE__*/React.createElement(IdentifyViewer,{collapsible:true,displayResultTree:false,enableExport:true,identifyResults:_this.state.searchResults,showLayerTitles:!provider.params.resultTitle}))});_defineProperty(_this,"selectProvider",function(ev){_this.setState({selectedProvider:ev.target.value,searchResults:null,providerSelectOptions:{},formValues:{}})});_defineProperty(_this,"search",function(ev){ev.preventDefault();var provider=_this.state.searchProviders[_this.state.selectedProvider];if(!provider){return}var form=ev.target;var filter=_objectSpread({},provider.params.expression);var values={};Object.keys(provider.params.fields).forEach(function(fieldname){values[fieldname]=form.elements[fieldname].value});var params={SERVICE:"WMS",VERSION:_this.props.theme.version,REQUEST:"GetFeatureInfo",CRS:_this.props.theme.mapCrs,WIDTH:100,HEIGHT:100,LAYERS:[],FILTER:[],WITH_GEOMETRY:true,WITH_MAPTIP:false,feature_count:provider.params.featureCount||100,info_format:"text/xml"};Object.keys(filter).forEach(function(layer){Object.entries(values).forEach(function(_ref5){var _ref6=_slicedToArray(_ref5,2),key=_ref6[0],value=_ref6[1];filter[layer]=filter[layer].replaceAll("$".concat(key,"$"),value.replace("'","\\'"))});params.LAYERS.push(layer);params.FILTER.push(layer+":"+filter[layer])});params.QUERY_LAYERS=params.LAYERS=params.LAYERS.join(",");params.FILTER=params.FILTER.join(";");_this.setState({busy:true,searchResults:null});axios.get(_this.props.theme.featureInfoUrl,{params:params}).then(function(response){var results=IdentifyUtils.parseResponse(response.data,_this.props.theme,"text/xml",null,_this.props.map.projection);if(provider.params.resultTitle){Object.entries(results).forEach(function(_ref7){var _ref8=_slicedToArray(_ref7,2),layername=_ref8[0],features=_ref8[1];features.forEach(function(feature){var formatValues=_objectSpread(_objectSpread({},feature.properties),{},{id:feature.id,layername:layername});feature.displayname=provider.params.resultTitle.replace(/{([^}]+)}/g,function(match){return formatValues[match.slice(1,-1)]})})})}_this.setState({busy:false,searchResults:results})})["catch"](function(){_this.setState({busy:false,searchResults:{}})})});_defineProperty(_this,"reloadSelectOptions",function(){var _this$state$searchPro,_this$state$searchPro2;Object.entries((_this$state$searchPro=(_this$state$searchPro2=_this.state.searchProviders[_this.state.selectedProvider])===null||_this$state$searchPro2===void 0||(_this$state$searchPro2=_this$state$searchPro2.params)===null||_this$state$searchPro2===void 0?void 0:_this$state$searchPro2.fields)!==null&&_this$state$searchPro!==void 0?_this$state$searchPro:{}).forEach(function(_ref9){var _ref10=_slicedToArray(_ref9,2),name=_ref10[0],fieldcfg=_ref10[1];if(fieldcfg.type==="select"){if(fieldcfg.options_query){var _this$state$providerS3;var url=fieldcfg.options_query;Object.entries(_this.state.formValues).forEach(function(_ref11){var _ref12=_slicedToArray(_ref11,2),key=_ref12[0],value=_ref12[1];url=url.replace("$".concat(key,"$"),value)});if(((_this$state$providerS3=_this.state.providerSelectOptions[name])===null||_this$state$providerS3===void 0?void 0:_this$state$providerS3.source)!==url){axios.get(url).then(function(response){var options=[];if(response.data.type==="FeatureCollection"){options=Object.entries(response.data.features.reduce(function(res,feature){var value=fieldcfg.value_field==="id"?feature.id:feature.properties[fieldcfg.value_field];var label=fieldcfg.label_field==="id"?feature.id:feature.properties[fieldcfg.label_field];return _objectSpread(_objectSpread({},res),{},_defineProperty({},value,label))},{})).map(function(entry){return{value:entry[0],label:entry[1]}})}else if(Array.isArray(response.data)){options=response.data.map(function(entry){return{value:entry.key,label:entry.value}})}_this.setState(function(state){return{providerSelectOptions:_objectSpread(_objectSpread({},state.providerSelectOptions),{},_defineProperty({},name,{source:url,options:options}))}})})["catch"](function(){/* eslint-disable-next-line */console.warn("Failed to query options for field ".concat(name));_this.setState(function(state){return{providerSelectOptions:_objectSpread(_objectSpread({},state.providerSelectOptions),{},_defineProperty({},name,{source:url,options:[]}))}})})}}else if(fieldcfg.options&&!_this.state.providerSelectOptions[name]){_this.setState(function(state){return{providerSelectOptions:_objectSpread(_objectSpread({},state.providerSelectOptions),{},_defineProperty({},name,{source:"static",options:fieldcfg.options}))}})}}})});return _this}_inherits(FeatureSearch,_React$Component);return _createClass(FeatureSearch,[{key:"componentDidUpdate",value:function componentDidUpdate(prevProps,prevState){if(this.props.theme!==prevProps.theme){var _this$props$theme;var defaultProvider="";var providerGroups={};var searchProviders=(((_this$props$theme=this.props.theme)===null||_this$props$theme===void 0?void 0:_this$props$theme.searchProviders)||[]).reduce(function(res,entry){if(entry.provider==="qgis"&&entry.params){var providerDef=_objectSpread({},entry);if(!providerDef.params.fields){providerDef.params=_objectSpread({},providerDef.params);providerDef.params.fields={TEXT:{label:LocaleUtils.tr("featuresearch.query"),type:"text"}}}if(providerDef.params.titlemsgid){providerDef.params.title=LocaleUtils.tr(providerDef.params.titlemsgid)}var providerId=uuidv4();res[providerId]=providerDef;if(providerDef.params["default"]){defaultProvider=providerId}var group=providerDef.params.group||"";providerGroups[group]=[].concat(_toConsumableArray(providerGroups[group]||[]),[providerId])}return res},{});var sortedProviderGroups=Object.keys(providerGroups).sort().reduce(function(res,group){res[group]=providerGroups[group].sort(function(a,b){return searchProviders[a].params.title.localeCompare(searchProviders[b].params.title)});return res},{});this.setState({searchProviders:searchProviders,selectedProvider:defaultProvider,providerGroups:sortedProviderGroups})}if(this.state.selectedProvider!==prevState.selectedProvider){this.setState(function(state){var _state$searchProvider;return{formValues:Object.entries(((_state$searchProvider=state.searchProviders[state.selectedProvider])===null||_state$searchProvider===void 0||(_state$searchProvider=_state$searchProvider.params)===null||_state$searchProvider===void 0?void 0:_state$searchProvider.fields)||[]).reduce(function(res,_ref13){var _ref15,_cfg$options$0$value,_cfg$options,_cfg$options2;var _ref14=_slicedToArray(_ref13,2),field=_ref14[0],cfg=_ref14[1];return _objectSpread(_objectSpread({},res),{},_defineProperty({},field,(_ref15=(_cfg$options$0$value=(_cfg$options=cfg.options)===null||_cfg$options===void 0||(_cfg$options=_cfg$options[0])===null||_cfg$options===void 0?void 0:_cfg$options.value)!==null&&_cfg$options$0$value!==void 0?_cfg$options$0$value:(_cfg$options2=cfg.options)===null||_cfg$options2===void 0?void 0:_cfg$options2[0])!==null&&_ref15!==void 0?_ref15:""))},{})}})}else if(this.state.formValues!==prevState.formValues){this.reloadSelectOptions()}}},{key:"render",value:function render(){var _this2=this;return/*#__PURE__*/React.createElement(SideBar,{icon:"search",id:"FeatureSearch",onHide:this.onHide,side:this.props.side,title:LocaleUtils.tr("featuresearch.title"),width:"20em"},function(){return{body:_this2.renderBody()}})}}])}(React.Component);_defineProperty(FeatureSearch,"propTypes",{map:PropTypes.object,/** The side of the application on which to display the sidebar. */side:PropTypes.string,theme:PropTypes.object});_defineProperty(FeatureSearch,"defaultProps",{side:"right"});export default connect(function(state){return{map:state.map,theme:state.theme.current}},{})(FeatureSearch);
11
+ */var FeatureSearch=/*#__PURE__*/function(_React$Component){function FeatureSearch(){var _this;_classCallCheck(this,FeatureSearch);for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++){args[_key]=arguments[_key]}_this=_callSuper(this,FeatureSearch,[].concat(args));_defineProperty(_this,"state",{busy:false,searchProviders:{},providerGroups:{},selectedProvider:"",formValues:{},providerSelectOptions:{},searchResults:null});_defineProperty(_this,"onHide",function(){_this.setState({searchResults:null})});_defineProperty(_this,"renderBody",function(){return/*#__PURE__*/React.createElement("div",{className:"feature-search-body"},/*#__PURE__*/React.createElement("div",{className:"feature-search-selection"},/*#__PURE__*/React.createElement("select",{onChange:_this.selectProvider,value:_this.state.selectedProvider},/*#__PURE__*/React.createElement("option",{disabled:true,value:""},LocaleUtils.tr("featuresearch.select")),Object.entries(_this.state.providerGroups).map(function(_ref){var _ref2=_slicedToArray(_ref,2),group=_ref2[0],entries=_ref2[1];return[group!==""?/*#__PURE__*/React.createElement("option",{disabled:true,key:group,value:group},group):null,entries.map(function(providerId){return/*#__PURE__*/React.createElement("option",{key:providerId,value:providerId},_this.state.searchProviders[providerId].params.title)})]}))),_this.renderSearchForm(),_this.renderSearchResults())});_defineProperty(_this,"renderSearchForm",function(){var provider=_this.state.searchProviders[_this.state.selectedProvider];if(!provider){return null}var fields=Object.entries(provider.params.fields).map(function(_ref3,idx){var _value$order;var _ref4=_slicedToArray(_ref3,2),key=_ref4[0],value=_ref4[1];return _objectSpread(_objectSpread({key:key},value),{},{order:(_value$order=value.order)!==null&&_value$order!==void 0?_value$order:idx})}).sort(function(a,b){return a.order-b.order});return/*#__PURE__*/React.createElement("form",{className:"feature-search-form",disabled:_this.state.busy,onChange:function onChange(){return _this.setState({searchResults:null})},onSubmit:_this.search},/*#__PURE__*/React.createElement("fieldset",{disabled:_this.state.busy},provider.params.description?/*#__PURE__*/React.createElement("div",{className:"feature-search-form-descr"},provider.params.description):null,/*#__PURE__*/React.createElement("table",null,/*#__PURE__*/React.createElement("tbody",null,fields.map(function(field){var _field$label;return/*#__PURE__*/React.createElement("tr",{key:field.key},/*#__PURE__*/React.createElement("td",null,(_field$label=field.label)!==null&&_field$label!==void 0?_field$label:LocaleUtils.tr(field.labelmsgid),":"),/*#__PURE__*/React.createElement("td",null,_this.renderField(field.key,field)))})))),/*#__PURE__*/React.createElement("div",{className:"feature-search-bar"},/*#__PURE__*/React.createElement("button",{className:"button",disabled:_this.state.busy,type:"submit"},_this.state.busy?/*#__PURE__*/React.createElement(Spinner,null):null,LocaleUtils.tr("search.search"))))});_defineProperty(_this,"renderField",function(fieldname,fieldcfg){var onChange=function onChange(ev){return _this.setState(function(state){return{formValues:_objectSpread(_objectSpread({},state.formValues),{},_defineProperty({},fieldname,ev.target.value))}})};if(fieldcfg.type==="select"){var _ref5,_this$state$providerS,_this$state$providerS2;var options=(_ref5=(_this$state$providerS=(_this$state$providerS2=_this.state.providerSelectOptions[fieldname])===null||_this$state$providerS2===void 0?void 0:_this$state$providerS2.options)!==null&&_this$state$providerS!==void 0?_this$state$providerS:fieldcfg.options)!==null&&_ref5!==void 0?_ref5:[];return/*#__PURE__*/React.createElement(InputContainer,null,/*#__PURE__*/React.createElement("select",{defaultValue:"",name:fieldname,onChange:onChange,role:"input"},/*#__PURE__*/React.createElement("option",{disabled:true,value:""},LocaleUtils.tr("featuresearch.select")),options.map(function(entry){var _entry$value,_entry$value2,_entry$label;return/*#__PURE__*/React.createElement("option",{key:(_entry$value=entry.value)!==null&&_entry$value!==void 0?_entry$value:entry,value:(_entry$value2=entry.value)!==null&&_entry$value2!==void 0?_entry$value2:entry},(_entry$label=entry.label)!==null&&_entry$label!==void 0?_entry$label:entry.labelmsgid?LocaleUtils.tr(entry.labelmsgid):entry)})),/*#__PURE__*/React.createElement(Icon,{icon:"clear",onClick:function onClick(ev){return _this.clearField(ev,fieldname)},role:"suffix"}))}else{return/*#__PURE__*/React.createElement("input",_extends({name:fieldname,onChange:onChange,type:fieldcfg.type||"text"},fieldcfg.options))}});_defineProperty(_this,"renderSearchResults",function(){if(!_this.state.searchResults){return null}var provider=_this.state.searchProviders[_this.state.selectedProvider];return/*#__PURE__*/React.createElement("div",{className:"feature-search-results"},isEmpty(_this.state.searchResults)?/*#__PURE__*/React.createElement("div",{className:"feature-search-noresults"},LocaleUtils.tr("featuresearch.noresults")):/*#__PURE__*/React.createElement(IdentifyViewer,{collapsible:true,displayResultTree:false,enableExport:true,identifyResults:_this.state.searchResults,showLayerTitles:!provider.params.resultTitle}))});_defineProperty(_this,"selectProvider",function(ev){_this.setState({selectedProvider:ev.target.value,searchResults:null,providerSelectOptions:{},formValues:{}})});_defineProperty(_this,"search",function(ev){ev.preventDefault();var provider=_this.state.searchProviders[_this.state.selectedProvider];if(!provider){return}var form=ev.target;var filter=_objectSpread({},provider.params.expression);var values={};Object.keys(provider.params.fields).forEach(function(fieldname){values[fieldname]=form.elements[fieldname].value});var params={SERVICE:"WMS",VERSION:_this.props.theme.version,REQUEST:"GetFeatureInfo",CRS:_this.props.theme.mapCrs,WIDTH:100,HEIGHT:100,LAYERS:[],FILTER:[],WITH_GEOMETRY:true,WITH_MAPTIP:false,feature_count:provider.params.featureCount||100,info_format:"text/xml"};Object.keys(filter).forEach(function(layer){Object.entries(values).forEach(function(_ref6){var _ref7=_slicedToArray(_ref6,2),key=_ref7[0],value=_ref7[1];filter[layer]=filter[layer].replaceAll("$".concat(key,"$"),value.replace("'","\\'"))});params.LAYERS.push(layer);params.FILTER.push(layer+":"+filter[layer])});params.QUERY_LAYERS=params.LAYERS=params.LAYERS.join(",");params.FILTER=params.FILTER.join(";");_this.setState({busy:true,searchResults:null});axios.get(_this.props.theme.featureInfoUrl,{params:params}).then(function(response){var results=IdentifyUtils.parseResponse(response.data,_this.props.theme,"text/xml",null,_this.props.map.projection);if(provider.params.resultTitle){Object.entries(results).forEach(function(_ref8){var _ref9=_slicedToArray(_ref8,2),layername=_ref9[0],features=_ref9[1];features.forEach(function(feature){var formatValues=_objectSpread(_objectSpread({},feature.properties),{},{id:feature.id,layername:layername});feature.displayname=provider.params.resultTitle.replace(/{([^}]+)}/g,function(match){return formatValues[match.slice(1,-1)]})})})}_this.setState({busy:false,searchResults:results})})["catch"](function(){_this.setState({busy:false,searchResults:{}})})});_defineProperty(_this,"clearField",function(ev,fieldname){ev.target.previousElementSibling.value="";_this.setState(function(state){return{formValues:_objectSpread(_objectSpread({},state.formValues),{},_defineProperty({},fieldname,ev.target.value))}})});_defineProperty(_this,"reloadSelectOptions",function(){var _this$state$searchPro,_this$state$searchPro2;Object.entries((_this$state$searchPro=(_this$state$searchPro2=_this.state.searchProviders[_this.state.selectedProvider])===null||_this$state$searchPro2===void 0||(_this$state$searchPro2=_this$state$searchPro2.params)===null||_this$state$searchPro2===void 0?void 0:_this$state$searchPro2.fields)!==null&&_this$state$searchPro!==void 0?_this$state$searchPro:{}).forEach(function(_ref10){var _ref11=_slicedToArray(_ref10,2),name=_ref11[0],fieldcfg=_ref11[1];if(fieldcfg.type==="select"){if(fieldcfg.options_query){var _this$state$providerS3;var url=fieldcfg.options_query;Object.entries(_this.state.formValues).forEach(function(_ref12){var _ref13=_slicedToArray(_ref12,2),key=_ref13[0],value=_ref13[1];url=url.replace("$".concat(key,"$"),value)});if(((_this$state$providerS3=_this.state.providerSelectOptions[name])===null||_this$state$providerS3===void 0?void 0:_this$state$providerS3.source)!==url){axios.get(url).then(function(response){var options=[];if(response.data.type==="FeatureCollection"){options=Object.entries(response.data.features.reduce(function(res,feature){var value=fieldcfg.value_field==="id"?feature.id:feature.properties[fieldcfg.value_field];var label=fieldcfg.label_field==="id"?feature.id:feature.properties[fieldcfg.label_field];return _objectSpread(_objectSpread({},res),{},_defineProperty({},value,label))},{})).map(function(entry){return{value:entry[0],label:entry[1]}})}else if(Array.isArray(response.data)){options=response.data.map(function(entry){return{value:entry.key,label:entry.value}})}_this.setState(function(state){return{providerSelectOptions:_objectSpread(_objectSpread({},state.providerSelectOptions),{},_defineProperty({},name,{source:url,options:options}))}})})["catch"](function(){/* eslint-disable-next-line */console.warn("Failed to query options for field ".concat(name));_this.setState(function(state){return{providerSelectOptions:_objectSpread(_objectSpread({},state.providerSelectOptions),{},_defineProperty({},name,{source:url,options:[]}))}})})}}else if(fieldcfg.options&&!_this.state.providerSelectOptions[name]){_this.setState(function(state){return{providerSelectOptions:_objectSpread(_objectSpread({},state.providerSelectOptions),{},_defineProperty({},name,{source:"static",options:fieldcfg.options}))}})}}})});return _this}_inherits(FeatureSearch,_React$Component);return _createClass(FeatureSearch,[{key:"componentDidUpdate",value:function componentDidUpdate(prevProps,prevState){if(this.props.theme!==prevProps.theme){var _this$props$theme;var defaultProvider="";var providerGroups={};var searchProviders=(((_this$props$theme=this.props.theme)===null||_this$props$theme===void 0?void 0:_this$props$theme.searchProviders)||[]).reduce(function(res,entry){if(entry.provider==="qgis"&&entry.params){var providerDef=_objectSpread({},entry);if(!providerDef.params.fields){providerDef.params=_objectSpread({},providerDef.params);providerDef.params.fields={TEXT:{label:LocaleUtils.tr("featuresearch.query"),type:"text"}}}if(providerDef.params.titlemsgid){providerDef.params.title=LocaleUtils.tr(providerDef.params.titlemsgid)}var providerId=uuidv4();res[providerId]=providerDef;if(providerDef.params["default"]){defaultProvider=providerId}var group=providerDef.params.group||"";providerGroups[group]=[].concat(_toConsumableArray(providerGroups[group]||[]),[providerId])}return res},{});var sortedProviderGroups=Object.keys(providerGroups).sort().reduce(function(res,group){res[group]=providerGroups[group].sort(function(a,b){return searchProviders[a].params.title.localeCompare(searchProviders[b].params.title)});return res},{});this.setState({searchProviders:searchProviders,selectedProvider:defaultProvider,providerGroups:sortedProviderGroups})}if(this.state.selectedProvider!==prevState.selectedProvider){this.setState(function(state){var _state$searchProvider;return{formValues:Object.entries(((_state$searchProvider=state.searchProviders[state.selectedProvider])===null||_state$searchProvider===void 0||(_state$searchProvider=_state$searchProvider.params)===null||_state$searchProvider===void 0?void 0:_state$searchProvider.fields)||[]).reduce(function(res,_ref14){var _ref15=_slicedToArray(_ref14,2),field=_ref15[0],cfg=_ref15[1];return _objectSpread(_objectSpread({},res),{},_defineProperty({},field,""))},{})}})}else if(this.state.formValues!==prevState.formValues){this.reloadSelectOptions()}}},{key:"render",value:function render(){var _this2=this;return/*#__PURE__*/React.createElement(SideBar,{icon:"search",id:"FeatureSearch",onHide:this.onHide,side:this.props.side,title:LocaleUtils.tr("featuresearch.title"),width:"20em"},function(){return{body:_this2.renderBody()}})}}])}(React.Component);_defineProperty(FeatureSearch,"propTypes",{map:PropTypes.object,/** The side of the application on which to display the sidebar. */side:PropTypes.string,theme:PropTypes.object});_defineProperty(FeatureSearch,"defaultProps",{side:"right"});export default connect(function(state){return{map:state.map,theme:state.theme.current}},{})(FeatureSearch);
@@ -42,4 +42,4 @@ function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof
42
42
  * }
43
43
  * ```
44
44
  */var LayerCatalog=/*#__PURE__*/function(_React$Component){function LayerCatalog(){var _this;_classCallCheck(this,LayerCatalog);for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++){args[_key]=arguments[_key]}_this=_callSuper(this,LayerCatalog,[].concat(args));_defineProperty(_this,"state",{catalog:null,visible:false});_defineProperty(_this,"onClose",function(){_this.setState({visible:false})});_defineProperty(_this,"searchCatalog",function(text,searchParams,callback){var filter=new RegExp(removeDiacritics(text).replace(/[-[\]/{}()*+?.\\^$|]/g,"\\$&"),"i");var results=[];if(_this.state.catalog){_this.searchCatalogGroup(results,filter,_this.state.catalog)}if(results.length>0){callback({results:[{id:"cataloglayers",title:LocaleUtils.tr("layercatalog.windowtitle"),type:SearchResultType.EXTERNALLAYER,items:results}]})}else{callback({results:[]})}});_defineProperty(_this,"searchCatalogGroup",function(results,filter,group){group.forEach(function(entry){var type=entry.resource?entry.resource.slice(0,entry.resource.indexOf(":")):entry.type;if(entry.sublayers){_this.searchCatalogGroup(results,filter,entry.sublayers)}if(entry.sublayers&&type!=="wms"){return}if(removeDiacritics(entry.title).match(filter)){var _entry$sublayers,_entry$sublayers$map;results.push({id:"cataloglayer:"+results.length,text:entry.title,layer:entry,sublayers:(_entry$sublayers=entry.sublayers)===null||_entry$sublayers===void 0||(_entry$sublayers$map=_entry$sublayers.map)===null||_entry$sublayers$map===void 0?void 0:_entry$sublayers$map.call(_entry$sublayers,function(sublayer,idx){return{id:"cataloglayer:"+results.length+":"+idx,text:sublayer.title,layer:sublayer}})})}})});return _this}_inherits(LayerCatalog,_React$Component);return _createClass(LayerCatalog,[{key:"componentDidMount",value:function componentDidMount(){var _this2=this;if(this.props.catalogUrl){axios.get(MiscUtils.resolveAssetsPath(this.props.catalogUrl)).then(function(response){_this2.setState({catalog:response.data.catalog||[]})})["catch"](function(e){_this2.setState({catalog:[]});// eslint-disable-next-line
45
- console.warn("Failed to load catalog: "+e)})}registerSearchProvider("catalogsearch",{label:LocaleUtils.tr("layercatalog.windowtitle"),onSearch:this.searchCatalog})}},{key:"componentWillUnmount",value:function componentWillUnmount(){unregisterSearchProvider("catalogsearch")}},{key:"componentDidUpdate",value:function componentDidUpdate(prevProps){if(this.props.active&&!prevProps.active){this.setState({visible:true});this.props.setCurrentTask("LayerTree")}}},{key:"render",value:function render(){if(!this.state.visible){return null}return/*#__PURE__*/React.createElement(ResizeableWindow,{dockable:this.props.geometry.side,icon:"catalog",initialHeight:this.props.geometry.initialHeight,initialWidth:this.props.geometry.initialWidth,initialX:this.props.geometry.initialX,initialY:this.props.geometry.initialY,initiallyDocked:this.props.geometry.initiallyDocked,onClose:this.onClose,title:LocaleUtils.tr("layercatalog.windowtitle")},/*#__PURE__*/React.createElement("div",{className:"layer-catalog",role:"body"},/*#__PURE__*/React.createElement(LayerCatalogWidget,{addLayer:this.props.addLayer,catalog:this.state.catalog,levelBasedIndentSize:this.props.levelBasedIndentSize,pendingRequests:0,removeLayer:this.props.removeLayer,replacePlaceholderLayer:this.props.replacePlaceholderLayer})))}}])}(React.Component);_defineProperty(LayerCatalog,"propTypes",{active:PropTypes.bool,addLayer:PropTypes.func,/** The URL to the catalog JSON file. */catalogUrl:PropTypes.string,/** 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 increase the indent size dynamically according to the current level (`true`) or keep the indent size constant (`false`). */levelBasedIndentSize:PropTypes.bool,removeLayer:PropTypes.func,replacePlaceholderLayer:PropTypes.func,setCurrentTask:PropTypes.func});_defineProperty(LayerCatalog,"defaultProps",{geometry:{initialWidth:320,initialHeight:320,initialX:0,initialY:0,initiallyDocked:false,side:"left"},levelBasedIndentSize:true});export default connect(function(state){return{active:state.task.id==="LayerCatalog"}},{addLayer:addLayer,removeLayer:removeLayer,replacePlaceholderLayer:replacePlaceholderLayer,setCurrentTask:setCurrentTask})(LayerCatalog);
45
+ console.warn("Failed to load catalog: "+e)})}if(this.props.registerCatalogSearchProvider){registerSearchProvider("catalogsearch",{label:LocaleUtils.tr("layercatalog.windowtitle"),onSearch:this.searchCatalog})}}},{key:"componentWillUnmount",value:function componentWillUnmount(){if(this.props.registerCatalogSearchProvider){unregisterSearchProvider("catalogsearch")}}},{key:"componentDidUpdate",value:function componentDidUpdate(prevProps){if(this.props.active&&!prevProps.active){this.setState({visible:true});this.props.setCurrentTask("LayerTree")}}},{key:"render",value:function render(){if(!this.state.visible){return null}return/*#__PURE__*/React.createElement(ResizeableWindow,{dockable:this.props.geometry.side,icon:"catalog",initialHeight:this.props.geometry.initialHeight,initialWidth:this.props.geometry.initialWidth,initialX:this.props.geometry.initialX,initialY:this.props.geometry.initialY,initiallyDocked:this.props.geometry.initiallyDocked,onClose:this.onClose,title:LocaleUtils.tr("layercatalog.windowtitle")},/*#__PURE__*/React.createElement("div",{className:"layer-catalog",role:"body"},/*#__PURE__*/React.createElement(LayerCatalogWidget,{addLayer:this.props.addLayer,catalog:this.state.catalog,levelBasedIndentSize:this.props.levelBasedIndentSize,pendingRequests:0,removeLayer:this.props.removeLayer,replacePlaceholderLayer:this.props.replacePlaceholderLayer})))}}])}(React.Component);_defineProperty(LayerCatalog,"propTypes",{active:PropTypes.bool,addLayer:PropTypes.func,/** The URL to the catalog JSON file. */catalogUrl:PropTypes.string,/** 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 increase the indent size dynamically according to the current level (`true`) or keep the indent size constant (`false`). */levelBasedIndentSize:PropTypes.bool,/** Whether to register a search provider which allows searching catalog layers through the global search field. */registerCatalogSearchProvider:PropTypes.bool,removeLayer:PropTypes.func,replacePlaceholderLayer:PropTypes.func,setCurrentTask:PropTypes.func});_defineProperty(LayerCatalog,"defaultProps",{geometry:{initialWidth:320,initialHeight:320,initialX:0,initialY:0,initiallyDocked:false,side:"left"},levelBasedIndentSize:true,registerCatalogSearchProvider:true});export default connect(function(state){return{active:state.task.id==="LayerCatalog"}},{addLayer:addLayer,removeLayer:removeLayer,replacePlaceholderLayer:replacePlaceholderLayer,setCurrentTask:setCurrentTask})(LayerCatalog);
@@ -6,7 +6,7 @@ function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof
6
6
  * LICENSE file in the root directory of this source tree.
7
7
  */import React from"react";import{connect}from"react-redux";import FileSaver from"file-saver";import ol from"openlayers";import PropTypes from"prop-types";import{LayerRole,addLayer}from"../actions/layers";import{setSnappingConfig}from"../actions/map";import{changeRedliningState,resetRedliningState}from"../actions/redlining";import Icon from"../components/Icon";import TaskBar from"../components/TaskBar";import ButtonBar from"../components/widgets/ButtonBar";import ColorButton from"../components/widgets/ColorButton";import ComboBox from"../components/widgets/ComboBox";import MenuButton from"../components/widgets/MenuButton";import NumberInput from"../components/widgets/NumberInput";import VectorLayerPicker from"../components/widgets/VectorLayerPicker";import ConfigUtils from"../utils/ConfigUtils";import{END_MARKERS}from"../utils/FeatureStyles";import LocaleUtils from"../utils/LocaleUtils";import MapUtils from"../utils/MapUtils";import VectorLayerUtils from"../utils/VectorLayerUtils";import"./style/Redlining.css";/**
8
8
  * Allows drawing figures and text labels on the map.
9
- */var Redlining=/*#__PURE__*/function(_React$Component){function Redlining(props){var _this;_classCallCheck(this,Redlining);_this=_callSuper(this,Redlining,[props]);_defineProperty(_this,"state",{selectText:false});_defineProperty(_this,"onShow",function(mode,data){var _data$geomType;_this.props.changeRedliningState(_objectSpread({action:mode!==null&&mode!==void 0?mode:"Pick",geomType:(_data$geomType=data===null||data===void 0?void 0:data.geomType)!==null&&_data$geomType!==void 0?_data$geomType:null},_this.redliningStateDefaults()));_this.props.setSnappingConfig(_this.props.snapping,_this.props.snappingActive);if(data&&data.layerId){var layer=_this.props.layers.find(function(l){return l.id===data.layerId});if(layer){_this.changeRedliningLayer(layer)}}});_defineProperty(_this,"onHide",function(){_this.props.resetRedliningState()});_defineProperty(_this,"redliningStateDefaults",function(){return{style:_objectSpread(_objectSpread({},_this.props.redlining.style),{},{borderColor:_this.props.defaultBorderColor,fillColor:_this.props.defaultFillColor,textOutlineColor:_this.props.defaultTextOutlineColor,textFillColor:_this.props.defaultTextFillColor}),lenUnit:_this.props.defaultLengthUnit,areaUnit:_this.props.defaultAreaUnit}});_defineProperty(_this,"updateRedliningStyle",function(diff){var newStyle=_objectSpread(_objectSpread({},_this.props.redlining.style),diff);_this.props.changeRedliningState({style:newStyle})});_defineProperty(_this,"renderBody",function(){var _this$props$layers$fi;var toolEnabled=function toolEnabled(tool){return!_this.props.hiddenTools.includes(tool)};var activeButton=_this.props.redlining.action==="Draw"?_this.props.redlining.geomType:_this.props.redlining.action;var drawButtons=[{key:"Point",tooltip:LocaleUtils.tr("redlining.point"),icon:"point",data:{action:"Draw",geomType:"Point",text:""}},{key:"LineString",tooltip:LocaleUtils.tr("redlining.line"),icon:"line",data:{action:"Draw",geomType:"LineString",text:""}},{key:"Polygon",tooltip:LocaleUtils.tr("redlining.polygon"),icon:"polygon",data:{action:"Draw",geomType:"Polygon",text:""}},[toolEnabled("Circle")?{key:"Circle",tooltip:LocaleUtils.tr("redlining.circle"),icon:"circle",data:{action:"Draw",geomType:"Circle",text:""}}:null,toolEnabled("Ellipse")?{key:"Ellipse",tooltip:LocaleUtils.tr("redlining.ellipse"),icon:"ellipse",data:{action:"Draw",geomType:"Ellipse",text:""}}:null,toolEnabled("Square")?{key:"Square",tooltip:LocaleUtils.tr("redlining.square"),icon:"box",data:{action:"Draw",geomType:"Square",text:""}}:null,toolEnabled("Box")?{key:"Box",tooltip:LocaleUtils.tr("redlining.rectangle"),icon:"rect",data:{action:"Draw",geomType:"Box",text:""}}:null].filter(Boolean),{key:"Text",tooltip:LocaleUtils.tr("redlining.text"),icon:"text",data:{action:"Draw",geomType:"Text",text:"",measurements:false}}];if(ConfigUtils.isMobile()){drawButtons=[drawButtons.flat()]}var activeFreeHand=_this.props.redlining.freehand?"HandDrawing":null;var freehandButtons=toolEnabled("HandWriting")?[{key:"HandDrawing",tooltip:LocaleUtils.tr("redlining.freehand"),icon:"freehand",data:{action:"Draw",geomType:_this.props.redlining.geomType,text:"",freehand:!_this.props.redlining.freehand},disabled:_this.props.redlining.geomType!=="LineString"&&_this.props.redlining.geomType!=="Polygon"}]:[];var editButtons=[{key:"Pick",tooltip:LocaleUtils.tr("redlining.pick"),icon:"nodetool",data:{action:"Pick",geomType:null,text:""}},toolEnabled("Transform")?{key:"Transform",tooltip:LocaleUtils.tr("redlining.transform"),icon:"transformtool",data:{action:"Transform",geomType:null,text:""}}:null,{key:"Delete",tooltip:LocaleUtils.tr("redlining.delete"),icon:"trash",data:{action:"Delete",geomType:null},disabled:!_this.props.redlining.selectedFeature}].filter(Boolean);var extraButtons=toolEnabled("NumericInput")?[{key:"NumericInput",tooltip:LocaleUtils.tr("redlining.numericinput"),icon:"numericinput"}]:[];for(var _i=0,_Object$values=Object.values(_this.props.plugins||{});_i<_Object$values.length;_i++){var plugin=_Object$values[_i];if(toolEnabled(plugin.cfg.key)){editButtons.push(_objectSpread(_objectSpread({},plugin.cfg),{},{tooltip:plugin.cfg.tooltip?LocaleUtils.tr(plugin.cfg.tooltip):undefined}))}}var vectorLayers=_this.props.layers.filter(function(layer){return layer.type==="vector"&&layer.role===LayerRole.USERLAYER&&!layer.readonly});// Ensure list always contains at least a "Redlining" layer
9
+ */var Redlining=/*#__PURE__*/function(_React$Component){function Redlining(props){var _this;_classCallCheck(this,Redlining);_this=_callSuper(this,Redlining,[props]);_defineProperty(_this,"state",{selectText:false});_defineProperty(_this,"onShow",function(mode,data){var _data$geomType;_this.props.changeRedliningState(_objectSpread({action:mode!==null&&mode!==void 0?mode:"Pick",geomType:(_data$geomType=data===null||data===void 0?void 0:data.geomType)!==null&&_data$geomType!==void 0?_data$geomType:null},_this.redliningStateDefaults()));_this.props.setSnappingConfig(_this.props.snapping,_this.props.snappingActive);if(data&&data.layerId){var layer=_this.props.layers.find(function(l){return l.id===data.layerId});if(layer){_this.changeRedliningLayer(layer)}}});_defineProperty(_this,"onHide",function(){_this.props.resetRedliningState()});_defineProperty(_this,"redliningStateDefaults",function(){return{style:_objectSpread(_objectSpread({},_this.props.redlining.style),{},{borderColor:_this.props.defaultBorderColor,fillColor:_this.props.defaultFillColor,textOutlineColor:_this.props.defaultTextOutlineColor,textFillColor:_this.props.defaultTextFillColor}),lenUnit:_this.props.defaultLengthUnit,areaUnit:_this.props.defaultAreaUnit}});_defineProperty(_this,"generateDashIcons",function(){_this.dashIcons=_this.props.predefinedDashPatterns.reduce(function(res,pattern){var svg="<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"32\" height=\"16\"><line x1=\"0\" y1=\"8\" x2=\"32\" y2=\"8\" stroke=\"black\" stroke-width=\"2\" stroke-dasharray=\"".concat(pattern.join(" "),"\"></line></svg>");res[pattern.join(":")]="data:image/svg+xml;base64,".concat(btoa(svg));return res},{})});_defineProperty(_this,"updateRedliningStyle",function(diff){var newStyle=_objectSpread(_objectSpread({},_this.props.redlining.style),diff);_this.props.changeRedliningState({style:newStyle})});_defineProperty(_this,"renderBody",function(){var _this$props$layers$fi;var toolEnabled=function toolEnabled(tool){return!_this.props.hiddenTools.includes(tool)};var activeButton=_this.props.redlining.action==="Draw"?_this.props.redlining.geomType:_this.props.redlining.action;var drawButtons=[{key:"Point",tooltip:LocaleUtils.tr("redlining.point"),icon:"point",data:{action:"Draw",geomType:"Point",text:""}},{key:"LineString",tooltip:LocaleUtils.tr("redlining.line"),icon:"line",data:{action:"Draw",geomType:"LineString",text:""}},{key:"Polygon",tooltip:LocaleUtils.tr("redlining.polygon"),icon:"polygon",data:{action:"Draw",geomType:"Polygon",text:""}},[toolEnabled("Circle")?{key:"Circle",tooltip:LocaleUtils.tr("redlining.circle"),icon:"circle",data:{action:"Draw",geomType:"Circle",text:""}}:null,toolEnabled("Ellipse")?{key:"Ellipse",tooltip:LocaleUtils.tr("redlining.ellipse"),icon:"ellipse",data:{action:"Draw",geomType:"Ellipse",text:""}}:null,toolEnabled("Square")?{key:"Square",tooltip:LocaleUtils.tr("redlining.square"),icon:"box",data:{action:"Draw",geomType:"Square",text:""}}:null,toolEnabled("Box")?{key:"Box",tooltip:LocaleUtils.tr("redlining.rectangle"),icon:"rect",data:{action:"Draw",geomType:"Box",text:""}}:null].filter(Boolean),{key:"Text",tooltip:LocaleUtils.tr("redlining.text"),icon:"text",data:{action:"Draw",geomType:"Text",text:"",measurements:false}}];if(ConfigUtils.isMobile()){drawButtons=[drawButtons.flat()]}var activeFreeHand=_this.props.redlining.freehand?"HandDrawing":null;var freehandButtons=toolEnabled("HandWriting")?[{key:"HandDrawing",tooltip:LocaleUtils.tr("redlining.freehand"),icon:"freehand",data:{action:"Draw",geomType:_this.props.redlining.geomType,text:"",freehand:!_this.props.redlining.freehand},disabled:_this.props.redlining.geomType!=="LineString"&&_this.props.redlining.geomType!=="Polygon"}]:[];var editButtons=[{key:"Pick",tooltip:LocaleUtils.tr("redlining.pick"),icon:"nodetool",data:{action:"Pick",geomType:null,text:""}},toolEnabled("Transform")?{key:"Transform",tooltip:LocaleUtils.tr("redlining.transform"),icon:"transformtool",data:{action:"Transform",geomType:null,text:""}}:null,{key:"Delete",tooltip:LocaleUtils.tr("redlining.delete"),icon:"trash",data:{action:"Delete",geomType:null},disabled:!_this.props.redlining.selectedFeature}].filter(Boolean);var extraButtons=toolEnabled("NumericInput")?[{key:"NumericInput",tooltip:LocaleUtils.tr("redlining.numericinput"),icon:"numericinput"}]:[];for(var _i=0,_Object$values=Object.values(_this.props.plugins||{});_i<_Object$values.length;_i++){var plugin=_Object$values[_i];if(toolEnabled(plugin.cfg.key)){editButtons.push(_objectSpread(_objectSpread({},plugin.cfg),{},{tooltip:plugin.cfg.tooltip?LocaleUtils.tr(plugin.cfg.tooltip):undefined}))}}var vectorLayers=_this.props.layers.filter(function(layer){return layer.type==="vector"&&layer.role===LayerRole.USERLAYER&&!layer.readonly});// Ensure list always contains at least a "Redlining" layer
10
10
  if(vectorLayers.length===0){vectorLayers=[{id:"redlining",title:LocaleUtils.tr("redlining.layertitle")}].concat(_toConsumableArray(vectorLayers))}var haveLayer=(((_this$props$layers$fi=_this.props.layers.find(function(l){return l.id===_this.props.redlining.layer}))===null||_this$props$layers$fi===void 0||(_this$props$layers$fi=_this$props$layers$fi.features)===null||_this$props$layers$fi===void 0?void 0:_this$props$layers$fi.length)||0)>0;var activePlugin=Object.values(_this.props.plugins||{}).find(function(plugin){return plugin.cfg.key===_this.props.redlining.action});var controls=activePlugin?/*#__PURE__*/React.createElement(activePlugin.controls,null):_this.renderStandardControls();return/*#__PURE__*/React.createElement("div",null,/*#__PURE__*/React.createElement("div",{className:"redlining-controlsbar"},/*#__PURE__*/React.createElement("div",{className:"redlining-groupcontrol"},/*#__PURE__*/React.createElement("div",null,LocaleUtils.tr("redlining.layer")),/*#__PURE__*/React.createElement(VectorLayerPicker,{addLayer:_this.props.addLayer,layers:vectorLayers,onChange:_this.changeRedliningLayer,value:_this.props.redlining.layer})),/*#__PURE__*/React.createElement("div",{className:"redlining-groupcontrol"},/*#__PURE__*/React.createElement("div",null,LocaleUtils.tr("redlining.draw")),/*#__PURE__*/React.createElement("div",{className:"controlgroup"},/*#__PURE__*/React.createElement(ButtonBar,{active:activeButton,buttons:drawButtons,onClick:function onClick(key,data){return _this.actionChanged(data)}}),_this.props.redlining.action==="Draw"&&(_this.props.redlining.geomType==="LineString"||_this.props.redlining.geomType==="Polygon")?/*#__PURE__*/React.createElement(ButtonBar,{active:activeFreeHand,buttons:freehandButtons,onClick:function onClick(key,data){return _this.actionChanged(data)}}):null)),/*#__PURE__*/React.createElement("div",{className:"redlining-groupcontrol"},/*#__PURE__*/React.createElement("div",null,LocaleUtils.tr("redlining.edit")),/*#__PURE__*/React.createElement(ButtonBar,{active:activeButton,buttons:editButtons,onClick:function onClick(key,data){return _this.actionChanged(data)}})),/*#__PURE__*/React.createElement("div",{className:"redlining-groupcontrol"},/*#__PURE__*/React.createElement("div",null,"\xA0"),/*#__PURE__*/React.createElement(ButtonBar,{active:_this.props.redlining.numericInput?"NumericInput":null,buttons:extraButtons,onClick:function onClick(){return _this.props.changeRedliningState({numericInput:!_this.props.redlining.numericInput})}})),toolEnabled("Export")?/*#__PURE__*/React.createElement("div",{className:"redlining-groupcontrol"},/*#__PURE__*/React.createElement("div",null,"\xA0"),/*#__PURE__*/React.createElement(MenuButton,{className:"redlining-export-menu",disabled:!haveLayer,menuIcon:"export",onActivate:_this["export"],tooltip:LocaleUtils.tr("redlining.export")},/*#__PURE__*/React.createElement("div",{className:"redlining-export-menu-entry",key:"GeoJSON",value:"geojson"},"GeoJSON"),/*#__PURE__*/React.createElement("div",{className:"redlining-export-menu-entry",key:"KML",value:"kml"},"KML"))):null),controls)});_defineProperty(_this,"export",function(type){if(type==="geojson"){var layer=_this.props.layers.find(function(l){return l.id===_this.props.redlining.layer});if(!layer){return}var geojson=JSON.stringify({type:"FeatureCollection",features:layer.features.map(function(feature){var newFeature=_objectSpread(_objectSpread({},feature),{},{geometry:VectorLayerUtils.reprojectGeometry(feature.geometry,feature.crs||_this.props.mapCrs,"EPSG:4326")});delete newFeature.crs;return newFeature})},null," ");FileSaver.saveAs(new Blob([geojson],{type:"text/plain;charset=utf-8"}),layer.title+".json")}else if(type==="kml"){var getNativeLayer=MapUtils.getHook(MapUtils.GET_NATIVE_LAYER);var _layer=_this.props.layers.find(function(l){return l.id===_this.props.redlining.layer});var nativeLayer=getNativeLayer(_this.props.redlining.layer);if(!nativeLayer){return}var kmlFormat=new ol.format.KML;var features=nativeLayer.getSource().getFeatures().map(function(feature){// Circle is not supported by kml format
11
- if(feature.getGeometry()instanceof ol.geom.Circle){feature=feature.clone();feature.setGeometry(ol.geom.polygonFromCircle(feature.getGeometry()))}return feature});var data=kmlFormat.writeFeatures(features,{featureProjection:_this.props.mapCrs});FileSaver.saveAs(new Blob([data],{type:"application/vnd.google-earth.kml+xml"}),_layer.title+".kml")}});_defineProperty(_this,"renderStandardControls",function(){var sizeLabel=LocaleUtils.tr("redlining.size");if(_this.props.redlining.geomType==="LineString"){sizeLabel=LocaleUtils.tr("redlining.width")}else if(_this.props.redlining.geomType==="Polygon"){sizeLabel=LocaleUtils.tr("redlining.border")}var labelPlaceholder=LocaleUtils.tr("redlining.label");if(_this.props.redlining.geomType==="Text"){labelPlaceholder=LocaleUtils.tr("redlining.text")}if(_this.props.redlining.action!=="Draw"&&!_this.props.redlining.selectedFeature){return null}return/*#__PURE__*/React.createElement("div",{className:"redlining-controlsbar"},/*#__PURE__*/React.createElement("div",{className:"redlining-control"},/*#__PURE__*/React.createElement(Icon,{className:"redlining-control-icon",icon:"pen",size:"large"}),_this.props.redlining.geomType==="Text"?/*#__PURE__*/React.createElement(ColorButton,{color:_this.props.redlining.style.textOutlineColor,defaultColors:_this.props.predefinedBorderColors,onColorChanged:function onColorChanged(color){return _this.updateRedliningStyle({textOutlineColor:color})}}):/*#__PURE__*/React.createElement(ColorButton,{color:_this.props.redlining.style.borderColor,defaultColors:_this.props.predefinedBorderColors,onColorChanged:function onColorChanged(color){return _this.updateRedliningStyle({borderColor:color})}})),_this.props.redlining.geomType==="LineString"?null:/*#__PURE__*/React.createElement("div",{className:"redlining-control"},/*#__PURE__*/React.createElement(Icon,{className:"redlining-control-icon",icon:"fill",size:"large"}),_this.props.redlining.geomType==="Text"?/*#__PURE__*/React.createElement(ColorButton,{color:_this.props.redlining.style.textFillColor,defaultColors:_this.props.predefinedFillColors,onColorChanged:function onColorChanged(color){return _this.updateRedliningStyle({textFillColor:color})}}):/*#__PURE__*/React.createElement(ColorButton,{color:_this.props.redlining.style.fillColor,defaultColors:_this.props.predefinedFillColors,onColorChanged:function onColorChanged(color){return _this.updateRedliningStyle({fillColor:color})}})),/*#__PURE__*/React.createElement("div",{className:"redlining-control"},/*#__PURE__*/React.createElement("span",null,sizeLabel,":\xA0"),/*#__PURE__*/React.createElement(NumberInput,{max:99,min:1,mobile:true,onChange:function onChange(nr){return _this.updateRedliningStyle({size:nr})},value:_this.props.redlining.style.size})),_this.props.redlining.geomType==="LineString"?/*#__PURE__*/React.createElement("div",{className:"redlining-control"},/*#__PURE__*/React.createElement("span",null,LocaleUtils.tr("redlining.markers"),":\xA0"),/*#__PURE__*/React.createElement("div",{className:"controlgroup"},/*#__PURE__*/React.createElement(ComboBox,{className:"redlining-marker-combo",onChange:function onChange(value){return _this.updateRedliningStyle({headmarker:value})},value:_this.props.redlining.style.headmarker||""},/*#__PURE__*/React.createElement("div",{className:"redlining-marker-combo-entry",value:""}),Object.entries(END_MARKERS).map(function(_ref){var _ref2=_slicedToArray(_ref,2),key=_ref2[0],params=_ref2[1];return/*#__PURE__*/React.createElement("div",{className:"redlining-marker-combo-entry",key:key,value:key},/*#__PURE__*/React.createElement("img",{src:params.src,style:{transform:"rotate("+params.baserotation+"deg)"}}))})),/*#__PURE__*/React.createElement(ComboBox,{className:"redlining-marker-combo",onChange:function onChange(value){return _this.updateRedliningStyle({tailmarker:value})},value:_this.props.redlining.style.tailmarker||""},/*#__PURE__*/React.createElement("div",{className:"redlining-marker-combo-entry",value:""}),Object.entries(END_MARKERS).map(function(_ref3){var _ref4=_slicedToArray(_ref3,2),key=_ref4[0],params=_ref4[1];return/*#__PURE__*/React.createElement("div",{className:"redlining-marker-combo-entry",key:key,value:key},/*#__PURE__*/React.createElement("img",{src:params.src,style:{transform:"rotate("+(180+params.baserotation)+"deg)"}}))})))):null,/*#__PURE__*/React.createElement("div",{className:"redlining-control redlining-control-fill"},/*#__PURE__*/React.createElement("div",{className:"controlgroup"},_this.props.redlining.geomType!=="Text"&&_this.props.allowGeometryLabels?/*#__PURE__*/React.createElement("button",{className:"button"+(_this.props.redlining.measurements?" pressed":""),onClick:function onClick(){return _this.props.changeRedliningState({measurements:!_this.props.redlining.measurements,style:_objectSpread(_objectSpread({},_this.props.redlining.style),{},{text:""})})},title:LocaleUtils.tr("redlining.measurements")},/*#__PURE__*/React.createElement(Icon,{icon:"measure"})):null,(_this.props.redlining.geomType==="Text"||_this.props.allowGeometryLabels)&&!_this.props.redlining.measurements?/*#__PURE__*/React.createElement("input",{className:"controlgroup-fillitem",onChange:function onChange(ev){return _this.updateRedliningStyle({text:ev.target.value})},placeholder:labelPlaceholder,readOnly:_this.props.redlining.measurements,ref:function ref(el){return _this.setLabelRef(el)},type:"text",value:_this.props.redlining.style.text}):null,_this.props.redlining.measurements&&["LineString","Circle"].includes(_this.props.redlining.geomType)?/*#__PURE__*/React.createElement("select",{className:"controlgroup-fillitem",onChange:function onChange(ev){return _this.props.changeRedliningState({lenUnit:ev.target.value})},value:_this.props.redlining.lenUnit},/*#__PURE__*/React.createElement("option",{value:"metric"},LocaleUtils.tr("measureComponent.metric")),/*#__PURE__*/React.createElement("option",{value:"imperial"},LocaleUtils.tr("measureComponent.imperial")),/*#__PURE__*/React.createElement("option",{value:"m"},"m"),/*#__PURE__*/React.createElement("option",{value:"km"},"km"),/*#__PURE__*/React.createElement("option",{value:"ft"},"ft"),/*#__PURE__*/React.createElement("option",{value:"mi"},"mi")):null,_this.props.redlining.measurements&&["Polygon","Ellipse","Square","Box"].includes(_this.props.redlining.geomType)?/*#__PURE__*/React.createElement("select",{className:"controlgroup-fillitem",onChange:function onChange(ev){return _this.props.changeRedliningState({areaUnit:ev.target.value})},value:_this.props.redlining.areaUnit},/*#__PURE__*/React.createElement("option",{value:"metric"},LocaleUtils.tr("measureComponent.metric")),/*#__PURE__*/React.createElement("option",{value:"imperial"},LocaleUtils.tr("measureComponent.imperial")),/*#__PURE__*/React.createElement("option",{value:"sqm"},"m\xB2"),/*#__PURE__*/React.createElement("option",{value:"ha"},"ha"),/*#__PURE__*/React.createElement("option",{value:"sqkm"},"km\xB2"),/*#__PURE__*/React.createElement("option",{value:"sqft"},"ft\xB2"),/*#__PURE__*/React.createElement("option",{value:"acre"},"acre"),/*#__PURE__*/React.createElement("option",{value:"sqmi"},"mi\xB2")):null)))});_defineProperty(_this,"setLabelRef",function(el){_this.labelInput=el;if(el&&_this.state.selectText){el.focus();el.select();_this.setState({selectText:false})}});_defineProperty(_this,"actionChanged",function(data){if(data.action==="Draw"&&data.geomType==="Text"){data=_objectSpread(_objectSpread({},data),{},{style:{text:LocaleUtils.tr("redlining.text")}})}else if(!_this.props.allowGeometryLabels){data=_objectSpread(_objectSpread({},data),{},{style:{text:""}})}_this.props.changeRedliningState(data)});_defineProperty(_this,"changeRedliningLayer",function(layer){var action=["Draw","Pick","Transform"].includes(_this.props.redlining.action)?_this.props.redlining.action:"Pick";_this.props.changeRedliningState({layer:layer.id,layerTitle:layer.title,action:action})});_this.labelInput=null;return _this}_inherits(Redlining,_React$Component);return _createClass(Redlining,[{key:"componentDidMount",value:function componentDidMount(){this.componentDidUpdate({redlining:{}})}},{key:"componentDidUpdate",value:function componentDidUpdate(prevProps){var _this2=this;if(this.props.defaultBorderColor!==prevProps.defaultBorderColor||this.props.defaultFillColor!==prevProps.defaultFillColor||this.props.defaultLengthUnit!==prevProps.defaultLengthUnit||this.props.defaultAreaUnit!==prevProps.defaultAreaUnit||this.props.defaultTextFillColor!==prevProps.defaultTextFillColor||this.props.defaultTextOutlineColor!==prevProps.defaultTextOutlineColor){this.props.changeRedliningState(this.redliningStateDefaults())}if(prevProps.redlining.geomType!==this.props.redlining.geomType&&this.props.redlining.geomType==="Text"&&!this.state.selectText){this.setState({selectText:true})}if(!this.props.layers.find(function(layer){return layer.id===_this2.props.redlining.layer})){var vectorLayers=this.props.layers.filter(function(layer){return layer.type==="vector"&&layer.role===LayerRole.USERLAYER&&!layer.readonly});if(vectorLayers.length>=1){this.props.changeRedliningState({layer:vectorLayers[0].id,layerTitle:vectorLayers[0].title})}else if(this.props.redlining.layer!=="redlining"){this.props.changeRedliningState({layer:"redlining",layerTitle:LocaleUtils.tr("redlining.layertitle")})}}}},{key:"render",value:function render(){var _this3=this;return/*#__PURE__*/React.createElement(TaskBar,{onHide:this.onHide,onShow:this.onShow,task:"Redlining"},function(){return{body:_this3.renderBody()}})}}])}(React.Component);_defineProperty(Redlining,"propTypes",{addLayer:PropTypes.func,/** Whether to allow labeling geometric figures. */allowGeometryLabels:PropTypes.bool,changeRedliningState:PropTypes.func,/** Default area unit. Options: metric, imperial, sqm, ha, sqkm, sqft, acre, sqmi */defaultAreaUnit:PropTypes.string,/** Default border color. In format [r, g, b, a]. */defaultBorderColor:PropTypes.array,/** Default fill color. In format [r, g, b, a]. */defaultFillColor:PropTypes.array,/** Default length unit. Options: metric, imperial, m, km, ft, mi */defaultLengthUnit:PropTypes.string,/** Default text fill color. In format [r, g, b, a]. */defaultTextFillColor:PropTypes.array,/** Default text outline color. In format [r, g, b, a]. */defaultTextOutlineColor:PropTypes.array,/** Tools to hide. Available tools: Circle, Ellipse, Square, Box, HandDrawing, Transform, NumericInput, Buffer, Export. */hiddenTools:PropTypes.array,layers:PropTypes.array,mapCrs:PropTypes.string,plugins:PropTypes.object,/** Predefined border colors. In format [[r, g, b, a], ...]. */predefinedBorderColors:PropTypes.arrayOf(PropTypes.array),/** Predefined fill colors. In format [[r, g, b, a], ...]. */predefinedFillColors:PropTypes.arrayOf(PropTypes.array),redlining:PropTypes.object,resetRedliningState:PropTypes.func,setCurrentTask:PropTypes.func,setSnappingConfig:PropTypes.func,/** Whether snapping is available when editing. */snapping:PropTypes.bool,/** Whether snapping is enabled by default when editing.
12
- * Either `false`, `edge`, `vertex` or `true` (i.e. both vertex and edge). */snappingActive:PropTypes.oneOfType([PropTypes.bool,PropTypes.string])});_defineProperty(Redlining,"defaultProps",{allowGeometryLabels:true,hiddenTools:[],snapping:true,snappingActive:true,plugins:[],defaultBorderColor:[255,0,0,1],defaultFillColor:[255,255,255,1],defaultTextFillColor:[0,0,0,1],defaultTextOutlineColor:[255,255,255,1],defaultAreaUnit:"metric",defaultLengthUnit:"metric"});export default(function(plugins){return connect(function(state){return{layers:state.layers.flat,redlining:state.redlining,mapCrs:state.map.projection,plugins:plugins}},{changeRedliningState:changeRedliningState,addLayer:addLayer,resetRedliningState:resetRedliningState,setSnappingConfig:setSnappingConfig})(Redlining)});
11
+ if(feature.getGeometry()instanceof ol.geom.Circle){feature=feature.clone();feature.setGeometry(ol.geom.polygonFromCircle(feature.getGeometry()))}return feature});var data=kmlFormat.writeFeatures(features,{featureProjection:_this.props.mapCrs});FileSaver.saveAs(new Blob([data],{type:"application/vnd.google-earth.kml+xml"}),_layer.title+".kml")}});_defineProperty(_this,"renderStandardControls",function(){var sizeLabel=LocaleUtils.tr("redlining.line");var showDash=true;if(["Text","Point"].includes(_this.props.redlining.geomType)){sizeLabel=LocaleUtils.tr("redlining.size");showDash=false}var labelPlaceholder=LocaleUtils.tr("redlining.label");if(_this.props.redlining.geomType==="Text"){labelPlaceholder=LocaleUtils.tr("redlining.text")}if(_this.props.redlining.action!=="Draw"&&!_this.props.redlining.selectedFeature){return null}return/*#__PURE__*/React.createElement("div",{className:"redlining-controlsbar"},/*#__PURE__*/React.createElement("div",{className:"redlining-control"},/*#__PURE__*/React.createElement(Icon,{className:"redlining-control-icon",icon:"pen",size:"large"}),_this.props.redlining.geomType==="Text"?/*#__PURE__*/React.createElement(ColorButton,{color:_this.props.redlining.style.textOutlineColor,defaultColors:_this.props.predefinedBorderColors,onColorChanged:function onColorChanged(color){return _this.updateRedliningStyle({textOutlineColor:color})}}):/*#__PURE__*/React.createElement(ColorButton,{color:_this.props.redlining.style.borderColor,defaultColors:_this.props.predefinedBorderColors,onColorChanged:function onColorChanged(color){return _this.updateRedliningStyle({borderColor:color})}})),_this.props.redlining.geomType==="LineString"?null:/*#__PURE__*/React.createElement("div",{className:"redlining-control"},/*#__PURE__*/React.createElement(Icon,{className:"redlining-control-icon",icon:"fill",size:"large"}),_this.props.redlining.geomType==="Text"?/*#__PURE__*/React.createElement(ColorButton,{color:_this.props.redlining.style.textFillColor,defaultColors:_this.props.predefinedFillColors,onColorChanged:function onColorChanged(color){return _this.updateRedliningStyle({textFillColor:color})}}):/*#__PURE__*/React.createElement(ColorButton,{color:_this.props.redlining.style.fillColor,defaultColors:_this.props.predefinedFillColors,onColorChanged:function onColorChanged(color){return _this.updateRedliningStyle({fillColor:color})}})),/*#__PURE__*/React.createElement("div",{className:"redlining-control"},/*#__PURE__*/React.createElement("span",null,sizeLabel,":\xA0"),/*#__PURE__*/React.createElement(NumberInput,{max:99,min:1,mobile:true,onChange:function onChange(nr){return _this.updateRedliningStyle({size:nr})},value:_this.props.redlining.style.size}),showDash?/*#__PURE__*/React.createElement(ComboBox,{onChange:function onChange(value){return _this.updateRedliningStyle({strokeDash:value.split(":").filter(Boolean).map(Number)})},value:_this.props.redlining.style.strokeDash.join(":")},_this.props.predefinedDashPatterns.map(function(pattern){var value=pattern.join(":");return/*#__PURE__*/React.createElement("div",{className:"redlining-dash-combo-entry",key:value,value:value},/*#__PURE__*/React.createElement("img",{src:_this.dashIcons[value]}))})):null),_this.props.redlining.geomType==="LineString"?/*#__PURE__*/React.createElement("div",{className:"redlining-control"},/*#__PURE__*/React.createElement("span",null,LocaleUtils.tr("redlining.markers"),":\xA0"),/*#__PURE__*/React.createElement("div",{className:"controlgroup"},/*#__PURE__*/React.createElement(ComboBox,{className:"redlining-marker-combo",onChange:function onChange(value){return _this.updateRedliningStyle({headmarker:value})},value:_this.props.redlining.style.headmarker||""},/*#__PURE__*/React.createElement("div",{className:"redlining-marker-combo-entry",value:""}),Object.entries(END_MARKERS).map(function(_ref){var _ref2=_slicedToArray(_ref,2),key=_ref2[0],params=_ref2[1];return/*#__PURE__*/React.createElement("div",{className:"redlining-marker-combo-entry",key:key,value:key},/*#__PURE__*/React.createElement("img",{src:params.src,style:{transform:"rotate("+params.baserotation+"deg)"}}))})),/*#__PURE__*/React.createElement(ComboBox,{className:"redlining-marker-combo",onChange:function onChange(value){return _this.updateRedliningStyle({tailmarker:value})},value:_this.props.redlining.style.tailmarker||""},/*#__PURE__*/React.createElement("div",{className:"redlining-marker-combo-entry",value:""}),Object.entries(END_MARKERS).map(function(_ref3){var _ref4=_slicedToArray(_ref3,2),key=_ref4[0],params=_ref4[1];return/*#__PURE__*/React.createElement("div",{className:"redlining-marker-combo-entry",key:key,value:key},/*#__PURE__*/React.createElement("img",{src:params.src,style:{transform:"rotate("+(180+params.baserotation)+"deg)"}}))})))):null,/*#__PURE__*/React.createElement("div",{className:"redlining-control redlining-control-fill"},/*#__PURE__*/React.createElement("div",{className:"controlgroup"},_this.props.redlining.geomType!=="Text"&&_this.props.allowGeometryLabels?/*#__PURE__*/React.createElement("button",{className:"button"+(_this.props.redlining.measurements?" pressed":""),onClick:function onClick(){return _this.props.changeRedliningState({measurements:!_this.props.redlining.measurements,style:_objectSpread(_objectSpread({},_this.props.redlining.style),{},{text:""})})},title:LocaleUtils.tr("redlining.measurements")},/*#__PURE__*/React.createElement(Icon,{icon:"measure"})):null,(_this.props.redlining.geomType==="Text"||_this.props.allowGeometryLabels)&&!_this.props.redlining.measurements?/*#__PURE__*/React.createElement("input",{className:"controlgroup-fillitem",onChange:function onChange(ev){return _this.updateRedliningStyle({text:ev.target.value})},placeholder:labelPlaceholder,readOnly:_this.props.redlining.measurements,ref:function ref(el){return _this.setLabelRef(el)},type:"text",value:_this.props.redlining.style.text}):null,_this.props.redlining.measurements&&["LineString","Circle"].includes(_this.props.redlining.geomType)?/*#__PURE__*/React.createElement("select",{className:"controlgroup-fillitem",onChange:function onChange(ev){return _this.props.changeRedliningState({lenUnit:ev.target.value})},value:_this.props.redlining.lenUnit},/*#__PURE__*/React.createElement("option",{value:"metric"},LocaleUtils.tr("measureComponent.metric")),/*#__PURE__*/React.createElement("option",{value:"imperial"},LocaleUtils.tr("measureComponent.imperial")),/*#__PURE__*/React.createElement("option",{value:"m"},"m"),/*#__PURE__*/React.createElement("option",{value:"km"},"km"),/*#__PURE__*/React.createElement("option",{value:"ft"},"ft"),/*#__PURE__*/React.createElement("option",{value:"mi"},"mi")):null,_this.props.redlining.measurements&&["Polygon","Ellipse","Square","Box"].includes(_this.props.redlining.geomType)?/*#__PURE__*/React.createElement("select",{className:"controlgroup-fillitem",onChange:function onChange(ev){return _this.props.changeRedliningState({areaUnit:ev.target.value})},value:_this.props.redlining.areaUnit},/*#__PURE__*/React.createElement("option",{value:"metric"},LocaleUtils.tr("measureComponent.metric")),/*#__PURE__*/React.createElement("option",{value:"imperial"},LocaleUtils.tr("measureComponent.imperial")),/*#__PURE__*/React.createElement("option",{value:"sqm"},"m\xB2"),/*#__PURE__*/React.createElement("option",{value:"ha"},"ha"),/*#__PURE__*/React.createElement("option",{value:"sqkm"},"km\xB2"),/*#__PURE__*/React.createElement("option",{value:"sqft"},"ft\xB2"),/*#__PURE__*/React.createElement("option",{value:"acre"},"acre"),/*#__PURE__*/React.createElement("option",{value:"sqmi"},"mi\xB2")):null)))});_defineProperty(_this,"setLabelRef",function(el){_this.labelInput=el;if(el&&_this.state.selectText){el.focus();el.select();_this.setState({selectText:false})}});_defineProperty(_this,"actionChanged",function(data){if(data.action==="Draw"&&data.geomType==="Text"){data=_objectSpread(_objectSpread({},data),{},{style:{text:LocaleUtils.tr("redlining.text")}})}else if(!_this.props.allowGeometryLabels){data=_objectSpread(_objectSpread({},data),{},{style:{text:""}})}_this.props.changeRedliningState(data)});_defineProperty(_this,"changeRedliningLayer",function(layer){var action=["Draw","Pick","Transform"].includes(_this.props.redlining.action)?_this.props.redlining.action:"Pick";_this.props.changeRedliningState({layer:layer.id,layerTitle:layer.title,action:action})});_this.labelInput=null;_this.dashIcons={};return _this}_inherits(Redlining,_React$Component);return _createClass(Redlining,[{key:"componentDidMount",value:function componentDidMount(){this.componentDidUpdate({redlining:{}})}},{key:"componentDidUpdate",value:function componentDidUpdate(prevProps){var _this2=this;if(this.props.defaultBorderColor!==prevProps.defaultBorderColor||this.props.defaultFillColor!==prevProps.defaultFillColor||this.props.defaultLengthUnit!==prevProps.defaultLengthUnit||this.props.defaultAreaUnit!==prevProps.defaultAreaUnit||this.props.defaultTextFillColor!==prevProps.defaultTextFillColor||this.props.defaultTextOutlineColor!==prevProps.defaultTextOutlineColor){this.props.changeRedliningState(this.redliningStateDefaults())}if(prevProps.redlining.geomType!==this.props.redlining.geomType&&this.props.redlining.geomType==="Text"&&!this.state.selectText){this.setState({selectText:true})}if(!this.props.layers.find(function(layer){return layer.id===_this2.props.redlining.layer})){var vectorLayers=this.props.layers.filter(function(layer){return layer.type==="vector"&&layer.role===LayerRole.USERLAYER&&!layer.readonly});if(vectorLayers.length>=1){this.props.changeRedliningState({layer:vectorLayers[0].id,layerTitle:vectorLayers[0].title})}else if(this.props.redlining.layer!=="redlining"){this.props.changeRedliningState({layer:"redlining",layerTitle:LocaleUtils.tr("redlining.layertitle")})}}if(this.props.predefinedDashPatterns!==prevProps.predefinedDashPatterns){this.generateDashIcons()}}},{key:"render",value:function render(){var _this3=this;return/*#__PURE__*/React.createElement(TaskBar,{onHide:this.onHide,onShow:this.onShow,task:"Redlining"},function(){return{body:_this3.renderBody()}})}}])}(React.Component);_defineProperty(Redlining,"propTypes",{addLayer:PropTypes.func,/** Whether to allow labeling geometric figures. */allowGeometryLabels:PropTypes.bool,changeRedliningState:PropTypes.func,/** Default area unit. Options: `metric`, `imperial`, `sqm`, `ha`, `sqkm`, `sqft`, `acre`, `sqmi` */defaultAreaUnit:PropTypes.string,/** Default border color. In format `[r, g, b, a]`. */defaultBorderColor:PropTypes.array,/** Default fill color. In format `[r, g, b, a]`. */defaultFillColor:PropTypes.array,/** Default length unit. Options: `metric`, `imperial`, `m`, `km`, `ft`, `mi` */defaultLengthUnit:PropTypes.string,/** Default text fill color. In format `[r, g, b, a]`. */defaultTextFillColor:PropTypes.array,/** Default text outline color. In format `[r, g, b, a]`. */defaultTextOutlineColor:PropTypes.array,/** Tools to hide. Available tools: `Circle`, `Ellipse`, `Square`, `Box`, `HandDrawing`, `Transform`, `NumericInput`, `Buffer`, `Export`. */hiddenTools:PropTypes.array,layers:PropTypes.array,mapCrs:PropTypes.string,plugins:PropTypes.object,/** Predefined border colors. In format `[[r, g, b, a], ...]`. */predefinedBorderColors:PropTypes.arrayOf(PropTypes.array),/** Predefined dash patterns. In format `[<dash-array>, ...]`, where a dash-array is list of alternating dash and gap widths, i.e. `[8 4]` for long dashes followed by shorter gaps. */predefinedDashPatterns:PropTypes.arrayOf(PropTypes.array),/** Predefined fill colors. In format `[[r, g, b, a], ...]`. */predefinedFillColors:PropTypes.arrayOf(PropTypes.array),redlining:PropTypes.object,resetRedliningState:PropTypes.func,setCurrentTask:PropTypes.func,setSnappingConfig:PropTypes.func,/** Whether snapping is available when editing. */snapping:PropTypes.bool,/** Whether snapping is enabled by default when editing.
12
+ * Either `false`, `edge`, `vertex` or `true` (i.e. both vertex and edge). */snappingActive:PropTypes.oneOfType([PropTypes.bool,PropTypes.string])});_defineProperty(Redlining,"defaultProps",{allowGeometryLabels:true,hiddenTools:[],snapping:true,snappingActive:true,plugins:[],defaultBorderColor:[255,0,0,1],defaultFillColor:[255,255,255,1],defaultTextFillColor:[0,0,0,1],defaultTextOutlineColor:[255,255,255,1],defaultAreaUnit:"metric",defaultLengthUnit:"metric",predefinedDashPatterns:[[],[8,8],[1,8],[8,8,1,8]]});export default(function(plugins){return connect(function(state){return{layers:state.layers.flat,redlining:state.redlining,mapCrs:state.map.projection,plugins:plugins}},{changeRedliningState:changeRedliningState,addLayer:addLayer,resetRedliningState:resetRedliningState,setSnappingConfig:setSnappingConfig})(Redlining)});
package/plugins/TopBar.js CHANGED
@@ -4,10 +4,10 @@ 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 classnames from"classnames";import PropTypes from"prop-types";import{toggleFullscreen}from"../actions/display";import{openExternalUrl,setTopbarHeight}from"../actions/windows";import{Swipeable}from"../components/Swipeable";import ConfigUtils from"../utils/ConfigUtils";import LocaleUtils from"../utils/LocaleUtils";import ThemeUtils from"../utils/ThemeUtils";import"./style/TopBar.css";/**
7
+ */import React from"react";import{connect}from"react-redux";import classnames from"classnames";import{remove as removeDiacritics}from"diacritics";import PropTypes from"prop-types";import{toggleFullscreen}from"../actions/display";import{openExternalUrl,setTopbarHeight}from"../actions/windows";import{Swipeable}from"../components/Swipeable";import ConfigUtils from"../utils/ConfigUtils";import LocaleUtils from"../utils/LocaleUtils";import{registerSearchProvider,SearchResultType,unregisterSearchProvider}from"../utils/SearchProviders";import ThemeUtils from"../utils/ThemeUtils";import"./style/TopBar.css";/**
8
8
  * Top bar, containing the logo, searchbar, task buttons and app menu.
9
- */var TopBar=/*#__PURE__*/function(_React$Component){function TopBar(){var _this;_classCallCheck(this,TopBar);for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++){args[_key]=arguments[_key]}_this=_callSuper(this,TopBar,[].concat(args));_defineProperty(_this,"state",{allowedMenuItems:[],allowedToolbarItems:[]});_defineProperty(_this,"openUrl",function(url,target,title,icon){if(target==="iframe"){target=":iframedialog:externallinkiframe"}_this.props.openExternalUrl(url,target,{title:title,icon:icon})});_defineProperty(_this,"storeHeight",function(el){if(el){_this.props.setTopbarHeight(el.clientHeight)}});return _this}_inherits(TopBar,_React$Component);return _createClass(TopBar,[{key:"componentDidMount",value:function componentDidMount(){this.setState({allowedToolbarItems:ThemeUtils.allowedItems(this.props.toolbarItems,this.props.currentTheme),allowedMenuItems:ThemeUtils.allowedItems(this.props.menuItems,this.props.currentTheme)})}},{key:"componentDidUpdate",value:function componentDidUpdate(prevProps){if(this.props.currentTheme!==prevProps.currentTheme){this.setState({allowedToolbarItems:ThemeUtils.allowedItems(this.props.toolbarItems,this.props.currentTheme),allowedMenuItems:ThemeUtils.allowedItems(this.props.menuItems,this.props.currentTheme)})}}},{key:"render",value:function render(){var _this2=this;var logo;var assetsPath=ConfigUtils.getAssetsPath();var isMobile=ConfigUtils.isMobile();if(isMobile){logo=assetsPath+"/img/logo-mobile."+this.props.logoFormat}else{logo=assetsPath+"/img/logo."+this.props.logoFormat}var classes=classnames({TopBar:true,mobile:isMobile,fullscreen:this.props.fullscreen});var logoEl=/*#__PURE__*/React.createElement("img",{className:"topbar-logo",src:this.props.logoSrc||logo});if(this.props.logoUrl){logoEl=/*#__PURE__*/React.createElement("a",{href:this.props.logoUrl,rel:"noreferrer",target:"_blank"},logoEl)}// Convert legacy minScale option to minScaleDenom
9
+ */var TopBar=/*#__PURE__*/function(_React$Component){function TopBar(){var _this;_classCallCheck(this,TopBar);for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++){args[_key]=arguments[_key]}_this=_callSuper(this,TopBar,[].concat(args));_defineProperty(_this,"state",{allowedMenuItems:[],allowedToolbarItems:[]});_defineProperty(_this,"openUrl",function(url,target,title,icon){if(target==="iframe"){target=":iframedialog:externallinkiframe"}_this.props.openExternalUrl(url,target,{title:title,icon:icon})});_defineProperty(_this,"storeHeight",function(el){if(el){_this.props.setTopbarHeight(el.clientHeight)}});_defineProperty(_this,"searchTasks",function(text,searchParams,callback){var filter=new RegExp(removeDiacritics(text).replace(/[-[\]/{}()*+?.\\^$|]/g,"\\$&"),"i");var results=[];_this.searchTaskGroup(results,filter,_this.state.allowedMenuItems);if(results.length>0){callback({results:[{id:"tasks",title:LocaleUtils.tr("search.tasks"),type:SearchResultType.TASK,items:results}]})}else{callback({results:[]})}});_defineProperty(_this,"searchTaskGroup",function(results,filter,group){group.forEach(function(item){if(item.subitems){_this.searchTaskGroup(results,filter,item.subitems)}else{var label=item.title?LocaleUtils.tr(item.title):LocaleUtils.tr("appmenu.items."+item.key+(item.mode||""));if(removeDiacritics(label).match(filter)){results.push({id:"tasks:"+results.length,text:label,task:item})}}})});return _this}_inherits(TopBar,_React$Component);return _createClass(TopBar,[{key:"componentDidMount",value:function componentDidMount(){this.setState({allowedToolbarItems:ThemeUtils.allowedItems(this.props.toolbarItems,this.props.currentTheme),allowedMenuItems:ThemeUtils.allowedItems(this.props.menuItems,this.props.currentTheme)});if(this.props.registerTaskSearchProvider){registerSearchProvider("tasksearch",{label:LocaleUtils.tr("search.tasks"),onSearch:this.searchTasks})}}},{key:"componentWillUnmount",value:function componentWillUnmount(){if(this.props.registerTaskSearchProvider){unregisterSearchProvider("tasksearch")}}},{key:"componentDidUpdate",value:function componentDidUpdate(prevProps){if(this.props.currentTheme!==prevProps.currentTheme){this.setState({allowedToolbarItems:ThemeUtils.allowedItems(this.props.toolbarItems,this.props.currentTheme),allowedMenuItems:ThemeUtils.allowedItems(this.props.menuItems,this.props.currentTheme)})}}},{key:"render",value:function render(){var _this2=this;var logo;var assetsPath=ConfigUtils.getAssetsPath();var isMobile=ConfigUtils.isMobile();if(isMobile){logo=assetsPath+"/img/logo-mobile."+this.props.logoFormat}else{logo=assetsPath+"/img/logo."+this.props.logoFormat}var classes=classnames({TopBar:true,mobile:isMobile,fullscreen:this.props.fullscreen});var logoEl=/*#__PURE__*/React.createElement("img",{className:"topbar-logo",src:this.props.logoSrc||logo});if(this.props.logoUrl){logoEl=/*#__PURE__*/React.createElement("a",{href:this.props.logoUrl,rel:"noreferrer",target:"_blank"},logoEl)}// Convert legacy minScale option to minScaleDenom
10
10
  var searchOptions=_objectSpread(_objectSpread({},TopBar.defaultProps.searchOptions),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={marginLeft:this.props.mapMargins.outerLeft+"px",marginRight:this.props.mapMargins.outerRight+"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 a highlight marker in the center of the search result geometry. */showHighlightMarker: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:{showHighlightMarker:true,showResultInSearchText:true,minScaleDenom:1000},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={marginLeft:this.props.mapMargins.outerLeft+"px",marginRight:this.props.mapMargins.outerRight+"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,/** Whether to register a search provider which allows searching menu tasks through the global search field. */registerTaskSearchProvider:PropTypes.bool,/** 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 a highlight marker in the center of the search result geometry. */showHighlightMarker: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:{showHighlightMarker:true,showResultInSearchText:true,minScaleDenom:1000},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)});
@@ -6,7 +6,7 @@ function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof
6
6
  * LICENSE file in the root directory of this source tree.
7
7
  */import React from"react";import{connect}from"react-redux";import Mousetrap from"mousetrap";import ol from"openlayers";import PropTypes from"prop-types";import{v4 as uuidv4}from"uuid";import{LayerRole,addLayerFeatures,removeLayerFeatures}from"../../actions/layers";import{changeRedliningState}from"../../actions/redlining";import NumericInputWindow from"../../components/NumericInputWindow";import{OlLayerAdded,OlLayerUpdated}from"../../components/map/OlLayer";import FeatureStyles from"../../utils/FeatureStyles";import MapUtils from"../../utils/MapUtils";import MeasureUtils from"../../utils/MeasureUtils";import VectorLayerUtils from"../../utils/VectorLayerUtils";var GeomTypeConfig={Text:{drawInteraction:function drawInteraction(opts){return new ol.interaction.Draw(_objectSpread(_objectSpread({},opts),{},{type:"Point"}))},editTool:"Pick",drawNodes:true},Point:{drawInteraction:function drawInteraction(opts){return new ol.interaction.Draw(_objectSpread(_objectSpread({},opts),{},{type:"Point"}))},editTool:"Pick",drawNodes:true},LineString:{drawInteraction:function drawInteraction(opts){return new ol.interaction.Draw(_objectSpread(_objectSpread({},opts),{},{type:"LineString"}))},editTool:"Pick",drawNodes:true},Polygon:{drawInteraction:function drawInteraction(opts){return new ol.interaction.Draw(_objectSpread(_objectSpread({},opts),{},{type:"Polygon"}))},editTool:"Pick",drawNodes:true},Circle:{drawInteraction:function drawInteraction(opts){return new ol.interaction.Draw(_objectSpread(_objectSpread({},opts),{},{type:"Circle"}))},editTool:"Pick",drawNodes:true,regular:true},Ellipse:{drawInteraction:function drawInteraction(opts){return new ol.interaction.DrawRegular(_objectSpread(_objectSpread({},opts),{},{sides:0}))},editTool:"Transform",drawNodes:false},Box:{drawInteraction:function drawInteraction(opts){return new ol.interaction.Draw(_objectSpread(_objectSpread({},opts),{},{type:"Circle",geometryFunction:ol.interaction.createBox()}))},editTool:"Transform",drawNodes:true},Square:{drawInteraction:function drawInteraction(opts){return new ol.interaction.DrawRegular(_objectSpread(_objectSpread({},opts),{},{sides:4,squareCondition:function squareCondition(){return true}}))},editTool:"Transform",regular:true}};/**
8
8
  * Redlining support for the map component.
9
- */var RedliningSupport=/*#__PURE__*/function(_React$Component){function RedliningSupport(props){var _this;_classCallCheck(this,RedliningSupport);_this=_callSuper(this,RedliningSupport,[props]);_defineProperty(_this,"updateCurrentFeature",function(feature){if(_this.currentFeature&&_this.props.redlining.selectedFeature){if(feature.circleParams){var circleParams=feature.circleParams;_this.currentFeature.setGeometry(new ol.geom.Circle(circleParams.center,circleParams.radius))}else{_this.currentFeature.getGeometry().setCoordinates(feature.geometry.coordinates)}_this.props.changeRedliningState({selectedFeature:feature,geomType:feature.shape})}});_defineProperty(_this,"styleOptions",function(styleProps,isText){return{strokeColor:isText?styleProps.textOutlineColor:styleProps.borderColor,strokeWidth:1+0.5*styleProps.size,fillColor:isText?styleProps.textFillColor:styleProps.fillColor,circleRadius:5+styleProps.size,strokeDash:[],headmarker:styleProps.headmarker,tailmarker:styleProps.tailmarker}});_defineProperty(_this,"styleProps",function(feature){var styleOptions=feature.get("styleOptions");var label=feature.get("label")||"";var isText=feature.get("shape")==="Text";return _defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty({},isText?"textOutlineColor":"borderColor",styleOptions.strokeColor),"size",(styleOptions.strokeWidth-1)*2),isText?"textFillColor":"fillColor",styleOptions.fillColor),"text",label),"headmarker",styleOptions.headmarker),"tailmarker",styleOptions.tailmarker)});_defineProperty(_this,"updateFeatureStyle",function(styleProps){var isText=_this.currentFeature.get("shape")==="Text";var styleName=isText?"text":"default";var opts=_this.styleOptions(styleProps,isText);_this.blockOnChange=true;_this.currentFeature.set("label",styleProps.text);_this.currentFeature.set("styleName",styleName);_this.currentFeature.set("styleOptions",opts);_this.blockOnChange=false});_defineProperty(_this,"styleFunction",function(feature){var styleOptions=feature.get("styleOptions");var styleName=feature.get("styleName");var styles=[];if(styleName==="text"){styles.push(_this.selectedTextStyle(feature,styleOptions))}styles.push.apply(styles,_toConsumableArray(FeatureStyles[styleName](feature,styleOptions)));var shape=feature.get("shape");var geomTypeConfig=GeomTypeConfig[shape];if((geomTypeConfig||{}).drawNodes!==false){styles.push(_this.selectedStyle)}return styles});_defineProperty(_this,"setCurrentFeature",function(feature){var _featureObj$shape;_this.currentFeature=feature;_this.currentFeature.setStyle(_this.styleFunction);var circleParams=_this.currentFeature.get("circleParams");if(circleParams){_this.currentFeature.setGeometry(new ol.geom.Circle(circleParams.center,circleParams.radius))}var measurements=_this.currentFeature.get("measurements");var featureObj=_this.currentFeatureObject();var newRedliningState={style:_this.styleProps(_this.currentFeature),measurements:!!_this.currentFeature.get("measurements"),selectedFeature:featureObj,geomType:(_featureObj$shape=featureObj===null||featureObj===void 0?void 0:featureObj.shape)!==null&&_featureObj$shape!==void 0?_featureObj$shape:_this.props.redlining.geomType};if(measurements){newRedliningState.lenUnit=measurements.lenUnit;newRedliningState.areaUnit=measurements.areaUnit}_this.props.changeRedliningState(newRedliningState);_this.currentFeature.on("change",_this.updateMeasurements)});_defineProperty(_this,"addDrawInteraction",function(){var geomTypeConfig=GeomTypeConfig[_this.props.redlining.geomType];if(!geomTypeConfig){return}var isFreeHand=_this.props.redlining.freehand;var drawInteraction=geomTypeConfig.drawInteraction({stopClick:true,condition:function condition(event){return event.originalEvent.buttons===1},style:function style(){return _this.picking?[]:FeatureStyles.sketchInteraction()},freehand:isFreeHand});drawInteraction.on("drawstart",function(evt){if(_this.picking&&_this.props.redlining.drawMultiple===false){return}_this.leaveTemporaryEditMode();_this.currentFeature=evt.feature;_this.currentFeature.setId(uuidv4());_this.currentFeature.set("shape",_this.props.redlining.geomType);_this.currentFeature.setStyle(_this.styleFunction);_this.updateFeatureStyle(_this.props.redlining.style);_this.currentFeature.on("change",_this.updateMeasurements)},_this);drawInteraction.on("drawend",function(){var featureId=_this.currentFeature.getId();_this.commitCurrentFeature(_this.props.redlining,true);_this.enterTemporaryEditMode(featureId,_this.props.redlining.layer,geomTypeConfig.editTool)},_this);_this.props.map.addInteraction(drawInteraction);_this.interactions.push(drawInteraction)});_defineProperty(_this,"updateMeasurements",function(){if(_this.blockOnChange||!_this.currentFeature){return}var feature=_this.currentFeature;var hadMeasurements=!!feature.get("measurements");if(_this.props.redlining.measurements){var settings={displayCrs:_this.props.displayCrs,lenUnit:_this.props.redlining.lenUnit,areaUnit:_this.props.redlining.areaUnit};MeasureUtils.updateFeatureMeasurements(feature,feature.get("shape"),_this.props.mapCrs,settings)}else if(hadMeasurements){feature.set("measurements",undefined);feature.set("segment_labels",undefined);feature.set("label","")}});_defineProperty(_this,"waitForFeatureAndLayer",function(layerId,featureId,callback){var redliningLayer=_this.searchRedliningLayer(layerId);if(!redliningLayer){OlLayerAdded.connect(function(layer){if(layer.get("id")===layerId){var feature=featureId?layer.getSource().getFeatureById(featureId):null;callback(layer,feature);return true}return false})}else if(featureId){var feature=redliningLayer.getSource().getFeatureById(featureId);if(feature){callback(redliningLayer,feature)}else{OlLayerUpdated.connect(function(layer){if(layer.get("id")===layerId){var feat=layer.getSource().getFeatureById(featureId);if(feat){callback(layer,feat);return true}}return false})}}else{callback(redliningLayer,null)}});_defineProperty(_this,"enterTemporaryEditMode",function(featureId,layerId,editTool){_this.waitForFeatureAndLayer(layerId,featureId,function(redliningLayer,feature){if(!feature){return}_this.setCurrentFeature(feature);if(editTool==="Transform"){_this.setupTransformInteraction([_this.currentFeature])}else{_this.setupModifyInteraction([_this.currentFeature])}_this.picking=true})});_defineProperty(_this,"leaveTemporaryEditMode",function(){if(_this.currentFeature){_this.commitCurrentFeature(_this.props.redlining)}if(_this.picking){// Remove modify interactions
9
+ */var RedliningSupport=/*#__PURE__*/function(_React$Component){function RedliningSupport(props){var _this;_classCallCheck(this,RedliningSupport);_this=_callSuper(this,RedliningSupport,[props]);_defineProperty(_this,"updateCurrentFeature",function(feature){if(_this.currentFeature&&_this.props.redlining.selectedFeature){if(feature.circleParams){var circleParams=feature.circleParams;_this.currentFeature.setGeometry(new ol.geom.Circle(circleParams.center,circleParams.radius))}else{_this.currentFeature.getGeometry().setCoordinates(feature.geometry.coordinates)}_this.props.changeRedliningState({selectedFeature:feature,geomType:feature.shape})}});_defineProperty(_this,"styleOptions",function(styleProps,isText){return{strokeColor:isText?styleProps.textOutlineColor:styleProps.borderColor,strokeWidth:1+0.5*styleProps.size,strokeDash:styleProps.strokeDash,fillColor:isText?styleProps.textFillColor:styleProps.fillColor,circleRadius:5+styleProps.size,headmarker:styleProps.headmarker,tailmarker:styleProps.tailmarker}});_defineProperty(_this,"styleProps",function(feature){var styleOptions=feature.get("styleOptions");var label=feature.get("label")||"";var isText=feature.get("shape")==="Text";return _defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty({},isText?"textOutlineColor":"borderColor",styleOptions.strokeColor),"strokeDash",styleOptions.strokeDash),"size",(styleOptions.strokeWidth-1)*2),isText?"textFillColor":"fillColor",styleOptions.fillColor),"text",label),"headmarker",styleOptions.headmarker),"tailmarker",styleOptions.tailmarker)});_defineProperty(_this,"updateFeatureStyle",function(styleProps){var isText=_this.currentFeature.get("shape")==="Text";var styleName=isText?"text":"default";var opts=_this.styleOptions(styleProps,isText);_this.blockOnChange=true;_this.currentFeature.set("label",styleProps.text);_this.currentFeature.set("styleName",styleName);_this.currentFeature.set("styleOptions",opts);_this.blockOnChange=false});_defineProperty(_this,"styleFunction",function(feature){var styleOptions=feature.get("styleOptions");var styleName=feature.get("styleName");var styles=[];if(styleName==="text"){styles.push(_this.selectedTextStyle(feature,styleOptions))}styles.push.apply(styles,_toConsumableArray(FeatureStyles[styleName](feature,styleOptions)));var shape=feature.get("shape");var geomTypeConfig=GeomTypeConfig[shape];if((geomTypeConfig||{}).drawNodes!==false){styles.push(_this.selectedStyle)}return styles});_defineProperty(_this,"setCurrentFeature",function(feature){var _featureObj$shape;_this.currentFeature=feature;_this.currentFeature.setStyle(_this.styleFunction);var circleParams=_this.currentFeature.get("circleParams");if(circleParams){_this.currentFeature.setGeometry(new ol.geom.Circle(circleParams.center,circleParams.radius))}var measurements=_this.currentFeature.get("measurements");var featureObj=_this.currentFeatureObject();var newRedliningState={style:_this.styleProps(_this.currentFeature),measurements:!!_this.currentFeature.get("measurements"),selectedFeature:featureObj,geomType:(_featureObj$shape=featureObj===null||featureObj===void 0?void 0:featureObj.shape)!==null&&_featureObj$shape!==void 0?_featureObj$shape:_this.props.redlining.geomType};if(measurements){newRedliningState.lenUnit=measurements.lenUnit;newRedliningState.areaUnit=measurements.areaUnit}_this.props.changeRedliningState(newRedliningState);_this.currentFeature.on("change",_this.updateMeasurements)});_defineProperty(_this,"addDrawInteraction",function(){var geomTypeConfig=GeomTypeConfig[_this.props.redlining.geomType];if(!geomTypeConfig){return}var isFreeHand=_this.props.redlining.freehand;var drawInteraction=geomTypeConfig.drawInteraction({stopClick:true,condition:function condition(event){return event.originalEvent.buttons===1},style:function style(){return _this.picking?[]:FeatureStyles.sketchInteraction()},freehand:isFreeHand});drawInteraction.on("drawstart",function(evt){if(_this.picking&&_this.props.redlining.drawMultiple===false){return}_this.leaveTemporaryEditMode();_this.currentFeature=evt.feature;_this.currentFeature.setId(uuidv4());_this.currentFeature.set("shape",_this.props.redlining.geomType);_this.currentFeature.setStyle(_this.styleFunction);_this.updateFeatureStyle(_this.props.redlining.style);_this.currentFeature.on("change",_this.updateMeasurements)},_this);drawInteraction.on("drawend",function(){var featureId=_this.currentFeature.getId();_this.commitCurrentFeature(_this.props.redlining,true);_this.enterTemporaryEditMode(featureId,_this.props.redlining.layer,geomTypeConfig.editTool)},_this);_this.props.map.addInteraction(drawInteraction);_this.interactions.push(drawInteraction)});_defineProperty(_this,"updateMeasurements",function(){if(_this.blockOnChange||!_this.currentFeature){return}var feature=_this.currentFeature;var hadMeasurements=!!feature.get("measurements");if(_this.props.redlining.measurements){var settings={displayCrs:_this.props.displayCrs,lenUnit:_this.props.redlining.lenUnit,areaUnit:_this.props.redlining.areaUnit};MeasureUtils.updateFeatureMeasurements(feature,feature.get("shape"),_this.props.mapCrs,settings)}else if(hadMeasurements){feature.set("measurements",undefined);feature.set("segment_labels",undefined);feature.set("label","")}});_defineProperty(_this,"waitForFeatureAndLayer",function(layerId,featureId,callback){var redliningLayer=_this.searchRedliningLayer(layerId);if(!redliningLayer){OlLayerAdded.connect(function(layer){if(layer.get("id")===layerId){var feature=featureId?layer.getSource().getFeatureById(featureId):null;callback(layer,feature);return true}return false})}else if(featureId){var feature=redliningLayer.getSource().getFeatureById(featureId);if(feature){callback(redliningLayer,feature)}else{OlLayerUpdated.connect(function(layer){if(layer.get("id")===layerId){var feat=layer.getSource().getFeatureById(featureId);if(feat){callback(layer,feat);return true}}return false})}}else{callback(redliningLayer,null)}});_defineProperty(_this,"enterTemporaryEditMode",function(featureId,layerId,editTool){_this.waitForFeatureAndLayer(layerId,featureId,function(redliningLayer,feature){if(!feature){return}_this.setCurrentFeature(feature);if(editTool==="Transform"){_this.setupTransformInteraction([_this.currentFeature])}else{_this.setupModifyInteraction([_this.currentFeature])}_this.picking=true})});_defineProperty(_this,"leaveTemporaryEditMode",function(){if(_this.currentFeature){_this.commitCurrentFeature(_this.props.redlining)}if(_this.picking){// Remove modify interactions
10
10
  _this.props.map.removeInteraction(_this.interactions.pop());_this.picking=false}});_defineProperty(_this,"addPickInteraction",function(){var redliningLayer=_this.searchRedliningLayer(_this.props.redlining.layer);if(!redliningLayer){return}var selectInteraction=new ol.interaction.Select({layers:[redliningLayer],hitTolerance:5});var currentEditInteraction=null;selectInteraction.on("select",function(evt){if(evt.selected.length===1&&evt.selected[0]===_this.currentFeature){return}if(_this.currentFeature){_this.commitCurrentFeature(_this.props.redlining)}if(currentEditInteraction){_this.props.map.removeInteraction(currentEditInteraction);_this.interactions=_this.interactions.filter(function(i){return i!==currentEditInteraction});currentEditInteraction=null}if(evt.selected.length===1){_this.setCurrentFeature(evt.selected[0]);var geomTypeConfig=GeomTypeConfig[_this.currentFeature.get("shape")];if(geomTypeConfig&&geomTypeConfig.editTool==="Transform"){currentEditInteraction=_this.setupTransformInteraction([_this.currentFeature]);currentEditInteraction.on("select",function(ev){// Clear selection when selecting a different feature, and let the parent select interaction deal with the new feature
11
11
  if(_this.currentFeature&&ev.feature!==_this.currentFeature){_this.commitCurrentFeature(_this.props.redlining);currentEditInteraction.setSelection(new ol.Collection)}})}else{currentEditInteraction=_this.setupModifyInteraction(selectInteraction.getFeatures().getArray())}}},_this);if(_this.props.redlining.action==="PickDraw"){_this.props.map.on("click",_this.maybeEnterTemporaryDrawMode)}_this.props.map.addInteraction(selectInteraction);_this.interactions.push(selectInteraction);_this.picking=true});_defineProperty(_this,"addTransformInteraction",function(){var redliningLayer=_this.searchRedliningLayer(_this.props.redlining.layer);if(!redliningLayer){return}var transformInteraction=_this.setupTransformInteraction();transformInteraction.on("select",function(evt){if(evt.feature===_this.currentFeature){return}if(_this.currentFeature){_this.commitCurrentFeature(_this.props.redlining)}if(evt.feature){_this.setCurrentFeature(evt.feature)}});_this.picking=true});_defineProperty(_this,"addPickDrawInteraction",function(){_this.waitForFeatureAndLayer(_this.props.redlining.layer,null,function(){return _this.addPickInteraction()})});_defineProperty(_this,"maybeEnterTemporaryDrawMode",function(ev){var redliningLayer=_this.searchRedliningLayer(_this.props.redlining.layer);if(_this.currentFeature||!_this.props.redlining.drawMultiple&&redliningLayer.getSource().getFeatures().length>0){return}var featureHit=false;_this.props.map.forEachFeatureAtPixel(ev.pixel,function(feature,layer){featureHit|=layer===redliningLayer},{hitTolerance:5});if(!redliningLayer||featureHit){return}_this.reset(_this.props.redlining);_this.props.map.un("click",_this.maybeEnterTemporaryDrawMode);var geomTypeConfig=GeomTypeConfig[_this.props.redlining.geomType];if(!geomTypeConfig){return}var isFreeHand=_this.props.redlining.freehand;var drawInteraction=geomTypeConfig.drawInteraction({stopClick:true,condition:function condition(event){return event.originalEvent.buttons===1},style:function style(){return _this.picking?[]:FeatureStyles.sketchInteraction()},freehand:isFreeHand});drawInteraction.on("drawstart",function(evt){_this.currentFeature=evt.feature;_this.currentFeature.setId(uuidv4());_this.currentFeature.set("shape",_this.props.redlining.geomType);_this.currentFeature.setStyle(_this.styleFunction);_this.updateFeatureStyle(_this.props.redlining.style);_this.currentFeature.on("change",_this.updateMeasurements)},_this);drawInteraction.on("drawend",function(){// Draw end
12
12
  _this.commitCurrentFeature(_this.props.redlining,true);_this.reset(_this.props.redlining);// Ughh... Apparently we need to wait 250ms for the 'singleclick' event processing to finish to avoid pick interactions picking up the current event
@@ -35,8 +35,13 @@ form.feature-search-form > fieldset table {
35
35
  width: 100%;
36
36
  }
37
37
 
38
+ form.feature-search-form > fieldset td:first-child {
39
+ width: 1%;
40
+ }
41
+
38
42
  form.feature-search-form > fieldset td > input,
39
- form.feature-search-form > fieldset td > select {
43
+ form.feature-search-form > fieldset td > select,
44
+ form.feature-search-form > fieldset td > div.input-container {
40
45
  width: 100%;
41
46
  }
42
47
 
@@ -55,3 +55,8 @@ div.redlining-message {
55
55
  text-align: center;
56
56
  font-style: italic;
57
57
  }
58
+
59
+ div.redlining-dash-combo-entry {
60
+ display: flex;
61
+ align-items: center;
62
+ }
@@ -4,4 +4,4 @@ function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof
4
4
  *
5
5
  * This source code is licensed under the BSD-style license found in the
6
6
  * LICENSE file in the root directory of this source tree.
7
- */import{CHANGE_REDLINING_STATE,RESET_REDLINING_STATE}from"../actions/redlining";var defaultState={action:null,geomType:null,style:{borderColor:[255,0,0,1],fillColor:[255,255,255,1],size:2,text:"",textOutlineColor:[255,255,255,1],textFillColor:[0,0,0,1]},layer:null,layerTitle:null,selectedFeature:null,drawMultiple:true,freehand:false,measurements:false,numericInput:false,lenUnit:"metric",areaUnit:"metric"};export default function redlining(){var state=arguments.length>0&&arguments[0]!==undefined?arguments[0]:defaultState;var action=arguments.length>1?arguments[1]:undefined;switch(action.type){case CHANGE_REDLINING_STATE:{return _objectSpread(_objectSpread(_objectSpread({},state),action.data),{},{style:_objectSpread(_objectSpread({},state.style),action.data.style)})}case RESET_REDLINING_STATE:{return defaultState}default:return state}}
7
+ */import{CHANGE_REDLINING_STATE,RESET_REDLINING_STATE}from"../actions/redlining";var defaultState={action:null,geomType:null,style:{borderColor:[255,0,0,1],fillColor:[255,255,255,1],strokeDash:[],size:2,text:"",textOutlineColor:[255,255,255,1],textFillColor:[0,0,0,1]},layer:null,layerTitle:null,selectedFeature:null,drawMultiple:true,freehand:false,measurements:false,numericInput:false,lenUnit:"metric",areaUnit:"metric"};export default function redlining(){var state=arguments.length>0&&arguments[0]!==undefined?arguments[0]:defaultState;var action=arguments.length>1?arguments[1]:undefined;switch(action.type){case CHANGE_REDLINING_STATE:{return _objectSpread(_objectSpread(_objectSpread({},state),action.data),{},{style:_objectSpread(_objectSpread({},state.style),action.data.style)})}case RESET_REDLINING_STATE:{return defaultState}default:return state}}
@@ -479,7 +479,6 @@
479
479
  "loading": "Зареждане на формуляра..."
480
480
  },
481
481
  "redlining": {
482
- "border": "Граница",
483
482
  "buffer": "Буфер",
484
483
  "buffercompute": "Изчисляване",
485
484
  "bufferdistance": "Разстояние",
@@ -507,8 +506,7 @@
507
506
  "size": "Размер",
508
507
  "square": "Квадрат",
509
508
  "text": "Текст",
510
- "transform": "Преобразуване",
511
- "width": "Ширина"
509
+ "transform": "Преобразуване"
512
510
  },
513
511
  "reports": {
514
512
  "all": "Всички",
@@ -579,6 +577,7 @@
579
577
  "providerselection": "Търсене на доставчици",
580
578
  "recent": "Последни търсения",
581
579
  "search": "Търсене",
580
+ "tasks": "",
582
581
  "themelayers": "Тематични слоеве",
583
582
  "themes": "Теми",
584
583
  "unknownmore": ""
@@ -479,7 +479,6 @@
479
479
  "loading": "Carregant formulari..."
480
480
  },
481
481
  "redlining": {
482
- "border": "Límit",
483
482
  "buffer": "Buffer",
484
483
  "buffercompute": "Computar",
485
484
  "bufferdistance": "Distància",
@@ -507,8 +506,7 @@
507
506
  "size": "Tamany",
508
507
  "square": "Quadrat",
509
508
  "text": "Text",
510
- "transform": "Transformar",
511
- "width": "Amplada"
509
+ "transform": "Transformar"
512
510
  },
513
511
  "reports": {
514
512
  "all": "Tot",
@@ -579,6 +577,7 @@
579
577
  "providerselection": "Proveidor",
580
578
  "recent": "Cerques recents",
581
579
  "search": "Buscar",
580
+ "tasks": "",
582
581
  "themelayers": "Capes del tema",
583
582
  "themes": "Temes",
584
583
  "unknownmore": "Més resultats"
@@ -479,7 +479,6 @@
479
479
  "loading": ""
480
480
  },
481
481
  "redlining": {
482
- "border": "Okraj",
483
482
  "buffer": "",
484
483
  "buffercompute": "",
485
484
  "bufferdistance": "",
@@ -507,8 +506,7 @@
507
506
  "size": "Velikost",
508
507
  "square": "",
509
508
  "text": "Text",
510
- "transform": "",
511
- "width": "Šířka"
509
+ "transform": ""
512
510
  },
513
511
  "reports": {
514
512
  "all": "",
@@ -579,6 +577,7 @@
579
577
  "providerselection": "Poskytovatelé vyhledávání",
580
578
  "recent": "Nedávná hledání",
581
579
  "search": "Hledat",
580
+ "tasks": "",
582
581
  "themelayers": "",
583
582
  "themes": "Témata",
584
583
  "unknownmore": ""
@@ -479,7 +479,6 @@
479
479
  "loading": "Formular wird geladen..."
480
480
  },
481
481
  "redlining": {
482
- "border": "Rand",
483
482
  "buffer": "Puffern",
484
483
  "buffercompute": "Berechnen",
485
484
  "bufferdistance": "Distanz",
@@ -507,8 +506,7 @@
507
506
  "size": "Grösse",
508
507
  "square": "Quadrat",
509
508
  "text": "Text",
510
- "transform": "Transformieren",
511
- "width": "Breite"
509
+ "transform": "Transformieren"
512
510
  },
513
511
  "reports": {
514
512
  "all": "Alle",
@@ -579,6 +577,7 @@
579
577
  "providerselection": "Suchdienste",
580
578
  "recent": "Zuletzt gesucht",
581
579
  "search": "Suchen",
580
+ "tasks": "Menüwerkzeuge",
582
581
  "themelayers": "Themenebenen",
583
582
  "themes": "Themen",
584
583
  "unknownmore": "Weitere Treffer"
@@ -479,7 +479,6 @@
479
479
  "loading": "Formular wird geladen..."
480
480
  },
481
481
  "redlining": {
482
- "border": "Rand",
483
482
  "buffer": "Puffern",
484
483
  "buffercompute": "Berechnen",
485
484
  "bufferdistance": "Distanz",
@@ -507,8 +506,7 @@
507
506
  "size": "Größe",
508
507
  "square": "Quadrat",
509
508
  "text": "Text",
510
- "transform": "Transformieren",
511
- "width": "Breite"
509
+ "transform": "Transformieren"
512
510
  },
513
511
  "reports": {
514
512
  "all": "Alle",
@@ -579,6 +577,7 @@
579
577
  "providerselection": "Suchdienste",
580
578
  "recent": "Zuletzt gesucht",
581
579
  "search": "Suchen",
580
+ "tasks": "Menüwerkzeuge",
582
581
  "themelayers": "Themenebenen",
583
582
  "themes": "Themen",
584
583
  "unknownmore": "Weitere Treffer"
@@ -479,7 +479,6 @@
479
479
  "loading": "Loading form..."
480
480
  },
481
481
  "redlining": {
482
- "border": "Border",
483
482
  "buffer": "Buffer",
484
483
  "buffercompute": "Compute",
485
484
  "bufferdistance": "Distance",
@@ -507,8 +506,7 @@
507
506
  "size": "Size",
508
507
  "square": "Square",
509
508
  "text": "Text",
510
- "transform": "Transform",
511
- "width": "Width"
509
+ "transform": "Transform"
512
510
  },
513
511
  "reports": {
514
512
  "all": "All",
@@ -579,6 +577,7 @@
579
577
  "providerselection": "Search providers",
580
578
  "recent": "Recent searches",
581
579
  "search": "Search",
580
+ "tasks": "Menu tasks",
582
581
  "themelayers": "Theme layers",
583
582
  "themes": "Themes",
584
583
  "unknownmore": "More results"
@@ -479,7 +479,6 @@
479
479
  "loading": "Cargando formulario..."
480
480
  },
481
481
  "redlining": {
482
- "border": "Límite",
483
482
  "buffer": "Bufer",
484
483
  "buffercompute": "Computar",
485
484
  "bufferdistance": "Distancia",
@@ -507,8 +506,7 @@
507
506
  "size": "Tamaño",
508
507
  "square": "Cuadrado",
509
508
  "text": "Texto",
510
- "transform": "Transformar",
511
- "width": "Ancho"
509
+ "transform": "Transformar"
512
510
  },
513
511
  "reports": {
514
512
  "all": "Todo",
@@ -579,6 +577,7 @@
579
577
  "providerselection": "Proveedores de búsqueda",
580
578
  "recent": "Búsquedas recientes",
581
579
  "search": "Buscar",
580
+ "tasks": "",
582
581
  "themelayers": "Capas del tema",
583
582
  "themes": "Temas",
584
583
  "unknownmore": "Más resultados"
@@ -479,7 +479,6 @@
479
479
  "loading": ""
480
480
  },
481
481
  "redlining": {
482
- "border": "Reunat",
483
482
  "buffer": "Bufferi",
484
483
  "buffercompute": "Laske",
485
484
  "bufferdistance": "Etäisyys",
@@ -507,8 +506,7 @@
507
506
  "size": "Koko",
508
507
  "square": "",
509
508
  "text": "Teksti",
510
- "transform": "",
511
- "width": "Leveys"
509
+ "transform": ""
512
510
  },
513
511
  "reports": {
514
512
  "all": "",
@@ -579,6 +577,7 @@
579
577
  "providerselection": "",
580
578
  "recent": "Viimeisimmät haut",
581
579
  "search": "Etsi",
580
+ "tasks": "",
582
581
  "themelayers": "",
583
582
  "themes": "Teemat",
584
583
  "unknownmore": ""
@@ -479,7 +479,6 @@
479
479
  "loading": "Chargement du formulaire..."
480
480
  },
481
481
  "redlining": {
482
- "border": "Bordure",
483
482
  "buffer": "Tampon",
484
483
  "buffercompute": "Calculer",
485
484
  "bufferdistance": "Distance",
@@ -507,8 +506,7 @@
507
506
  "size": "Taille",
508
507
  "square": "Carré",
509
508
  "text": "Texte",
510
- "transform": "Transformer",
511
- "width": "Largeur"
509
+ "transform": "Transformer"
512
510
  },
513
511
  "reports": {
514
512
  "all": "Tous",
@@ -579,6 +577,7 @@
579
577
  "providerselection": "Services de recherche",
580
578
  "recent": "Recherches récentes",
581
579
  "search": "Chercher",
580
+ "tasks": "Outils",
582
581
  "themelayers": "Couches de thèmes",
583
582
  "themes": "Cartes",
584
583
  "unknownmore": "Plus de résultats"
@@ -479,7 +479,6 @@
479
479
  "loading": ""
480
480
  },
481
481
  "redlining": {
482
- "border": "Szegély",
483
482
  "buffer": "",
484
483
  "buffercompute": "",
485
484
  "bufferdistance": "",
@@ -507,8 +506,7 @@
507
506
  "size": "Méret",
508
507
  "square": "",
509
508
  "text": "Szöveg",
510
- "transform": "",
511
- "width": "Szélesség"
509
+ "transform": ""
512
510
  },
513
511
  "reports": {
514
512
  "all": "",
@@ -579,6 +577,7 @@
579
577
  "providerselection": "",
580
578
  "recent": "",
581
579
  "search": "Keresés",
580
+ "tasks": "",
582
581
  "themelayers": "",
583
582
  "themes": "",
584
583
  "unknownmore": ""
@@ -3,7 +3,7 @@
3
3
  "messages": {
4
4
  "app": {
5
5
  "missingbg": "Impossibile trovare lo sfondo \"{0}\", viene visualizzato lo sfondo predefinito.",
6
- "missingdefaulttheme": "",
6
+ "missingdefaulttheme": "Impossibile caricare il tema predefinito.",
7
7
  "missinglayers": "Impossibile trovare i seguenti livelli: {0}.",
8
8
  "missingpermalink": "Il permalink o il segnalibro non è valido o è scaduto.",
9
9
  "missingprojection": "Impossibile caricare il tema \"{0}\": la proiezione {1} non è definita.",
@@ -479,7 +479,6 @@
479
479
  "loading": "Caricando formulario..."
480
480
  },
481
481
  "redlining": {
482
- "border": "Bordo",
483
482
  "buffer": "Buffer",
484
483
  "buffercompute": "Calcola",
485
484
  "bufferdistance": "Distanza",
@@ -507,8 +506,7 @@
507
506
  "size": "Dimensione",
508
507
  "square": "Quadrato",
509
508
  "text": "Testo",
510
- "transform": "Transforma",
511
- "width": "Larghezza"
509
+ "transform": "Transforma"
512
510
  },
513
511
  "reports": {
514
512
  "all": "Tutti",
@@ -579,6 +577,7 @@
579
577
  "providerselection": "Selezione provider",
580
578
  "recent": "Ricerche recenti",
581
579
  "search": "Cerca",
580
+ "tasks": "Strumenti",
582
581
  "themelayers": "Livelli di temi",
583
582
  "themes": "Temi",
584
583
  "unknownmore": "Ulteriori risultati"
@@ -479,7 +479,6 @@
479
479
  "loading": "フォームをロード中..."
480
480
  },
481
481
  "redlining": {
482
- "border": "境界線",
483
482
  "buffer": "バッファ",
484
483
  "buffercompute": "計算",
485
484
  "bufferdistance": "距離",
@@ -507,8 +506,7 @@
507
506
  "size": "サイズ",
508
507
  "square": "四角形",
509
508
  "text": "テキスト",
510
- "transform": "変形",
511
- "width": "幅"
509
+ "transform": "変形"
512
510
  },
513
511
  "reports": {
514
512
  "all": "全て",
@@ -579,6 +577,7 @@
579
577
  "providerselection": "検索プロバイダ",
580
578
  "recent": "最近の検索",
581
579
  "search": "検索",
580
+ "tasks": "",
582
581
  "themelayers": "テーマのレイヤ",
583
582
  "themes": "テーマ",
584
583
  "unknownmore": "更なる結果"
@@ -479,7 +479,6 @@
479
479
  "loading": "Formulier laden..."
480
480
  },
481
481
  "redlining": {
482
- "border": "Rand",
483
482
  "buffer": "Buffer",
484
483
  "buffercompute": "Berekenen",
485
484
  "bufferdistance": "Afstand",
@@ -507,8 +506,7 @@
507
506
  "size": "Afmeting",
508
507
  "square": "",
509
508
  "text": "Tekst",
510
- "transform": "Transformeer",
511
- "width": "Breedte"
509
+ "transform": "Transformeer"
512
510
  },
513
511
  "reports": {
514
512
  "all": "",
@@ -579,6 +577,7 @@
579
577
  "providerselection": "Zoek providers",
580
578
  "recent": "",
581
579
  "search": "Zoeken",
580
+ "tasks": "",
582
581
  "themelayers": "Kaartlagen",
583
582
  "themes": "Kaarten",
584
583
  "unknownmore": ""
@@ -479,7 +479,6 @@
479
479
  "loading": ""
480
480
  },
481
481
  "redlining": {
482
- "border": "Kant",
483
482
  "buffer": "Buffer",
484
483
  "buffercompute": "Beregner",
485
484
  "bufferdistance": "Avstand",
@@ -507,8 +506,7 @@
507
506
  "size": "Størrelse",
508
507
  "square": "",
509
508
  "text": "Tekst",
510
- "transform": "",
511
- "width": "Bredde"
509
+ "transform": ""
512
510
  },
513
511
  "reports": {
514
512
  "all": "",
@@ -579,6 +577,7 @@
579
577
  "providerselection": "",
580
578
  "recent": "Nylige søk",
581
579
  "search": "Søk",
580
+ "tasks": "",
582
581
  "themelayers": "",
583
582
  "themes": "Tema",
584
583
  "unknownmore": ""
@@ -479,7 +479,6 @@
479
479
  "loading": ""
480
480
  },
481
481
  "redlining": {
482
- "border": "Obramowanie",
483
482
  "buffer": "Buforuj",
484
483
  "buffercompute": "Oblicz",
485
484
  "bufferdistance": "Odległość",
@@ -507,8 +506,7 @@
507
506
  "size": "Rozmiar",
508
507
  "square": "",
509
508
  "text": "Tekst",
510
- "transform": "",
511
- "width": "Szerokość"
509
+ "transform": ""
512
510
  },
513
511
  "reports": {
514
512
  "all": "",
@@ -579,6 +577,7 @@
579
577
  "providerselection": "",
580
578
  "recent": "",
581
579
  "search": "Szukaj",
580
+ "tasks": "",
582
581
  "themelayers": "",
583
582
  "themes": "Motywy",
584
583
  "unknownmore": ""
@@ -479,7 +479,6 @@
479
479
  "loading": "Carregando"
480
480
  },
481
481
  "redlining": {
482
- "border": "Borda",
483
482
  "buffer": "Buffer",
484
483
  "buffercompute": "Compute",
485
484
  "bufferdistance": "Distância",
@@ -507,8 +506,7 @@
507
506
  "size": "Tamanho",
508
507
  "square": "Praça",
509
508
  "text": "Texto",
510
- "transform": "Transformar",
511
- "width": "Largura"
509
+ "transform": "Transformar"
512
510
  },
513
511
  "reports": {
514
512
  "all": "",
@@ -579,6 +577,7 @@
579
577
  "providerselection": "Escolher o provedor",
580
578
  "recent": "Pesquisas recentes",
581
579
  "search": "Pesquisa",
580
+ "tasks": "",
582
581
  "themelayers": "",
583
582
  "themes": "Temas",
584
583
  "unknownmore": ""
@@ -479,7 +479,6 @@
479
479
  "loading": "A carregar..."
480
480
  },
481
481
  "redlining": {
482
- "border": "Fronteira",
483
482
  "buffer": "Tampão",
484
483
  "buffercompute": "Calcular",
485
484
  "bufferdistance": "Distância do Tampão",
@@ -507,8 +506,7 @@
507
506
  "size": "Tamanho",
508
507
  "square": "Quadrado",
509
508
  "text": "Texto",
510
- "transform": "Transformar",
511
- "width": "Largura"
509
+ "transform": "Transformar"
512
510
  },
513
511
  "reports": {
514
512
  "all": "",
@@ -579,6 +577,7 @@
579
577
  "providerselection": "Seleção do Provedor",
580
578
  "recent": "Pesquisas Recentes",
581
579
  "search": "Pesquisar",
580
+ "tasks": "",
582
581
  "themelayers": "",
583
582
  "themes": "Temas",
584
583
  "unknownmore": ""
@@ -479,7 +479,6 @@
479
479
  "loading": "Formularul se încarcă"
480
480
  },
481
481
  "redlining": {
482
- "border": "Margine",
483
482
  "buffer": "Zonă tampon",
484
483
  "buffercompute": "Calcul",
485
484
  "bufferdistance": "Distanța",
@@ -507,8 +506,7 @@
507
506
  "size": "Dimeniuni",
508
507
  "square": "Pătrat",
509
508
  "text": "Text",
510
- "transform": "Transformare",
511
- "width": "Lățime"
509
+ "transform": "Transformare"
512
510
  },
513
511
  "reports": {
514
512
  "all": "",
@@ -579,6 +577,7 @@
579
577
  "providerselection": "Selectare furnizor",
580
578
  "recent": "Căutări recente",
581
579
  "search": "Caută",
580
+ "tasks": "",
582
581
  "themelayers": "",
583
582
  "themes": "Hărți tematice",
584
583
  "unknownmore": ""
@@ -479,7 +479,6 @@
479
479
  "loading": ""
480
480
  },
481
481
  "redlining": {
482
- "border": "Граница",
483
482
  "buffer": "",
484
483
  "buffercompute": "",
485
484
  "bufferdistance": "",
@@ -507,8 +506,7 @@
507
506
  "size": "Размер",
508
507
  "square": "",
509
508
  "text": "Текст",
510
- "transform": "",
511
- "width": "Ширина"
509
+ "transform": ""
512
510
  },
513
511
  "reports": {
514
512
  "all": "",
@@ -579,6 +577,7 @@
579
577
  "providerselection": "",
580
578
  "recent": "",
581
579
  "search": "Поиск",
580
+ "tasks": "",
582
581
  "themelayers": "",
583
582
  "themes": "",
584
583
  "unknownmore": ""
@@ -479,7 +479,6 @@
479
479
  "loading": ""
480
480
  },
481
481
  "redlining": {
482
- "border": "Kant",
483
482
  "buffer": "Buffert",
484
483
  "buffercompute": "Beräkna",
485
484
  "bufferdistance": "Avstånd",
@@ -507,8 +506,7 @@
507
506
  "size": "Storlek",
508
507
  "square": "",
509
508
  "text": "Text",
510
- "transform": "",
511
- "width": "Bredd"
509
+ "transform": ""
512
510
  },
513
511
  "reports": {
514
512
  "all": "",
@@ -579,6 +577,7 @@
579
577
  "providerselection": "",
580
578
  "recent": "",
581
579
  "search": "",
580
+ "tasks": "",
582
581
  "themelayers": "",
583
582
  "themes": "",
584
583
  "unknownmore": ""
@@ -479,7 +479,6 @@
479
479
  "loading": "Form yükleniyor..."
480
480
  },
481
481
  "redlining": {
482
- "border": "Sınır",
483
482
  "buffer": "Tampon",
484
483
  "buffercompute": "Hesapla",
485
484
  "bufferdistance": "Mesafe",
@@ -507,8 +506,7 @@
507
506
  "size": "Boyut",
508
507
  "square": "Kare",
509
508
  "text": "Metin",
510
- "transform": "Dönüşüm",
511
- "width": "Genişlik"
509
+ "transform": "Dönüşüm"
512
510
  },
513
511
  "reports": {
514
512
  "all": "Tümü",
@@ -579,6 +577,7 @@
579
577
  "providerselection": "Arama sağlayıcılar",
580
578
  "recent": "Son aramalar",
581
579
  "search": "Ara",
580
+ "tasks": "",
582
581
  "themelayers": "Tema katmanları",
583
582
  "themes": "Temalar",
584
583
  "unknownmore": ""
@@ -411,7 +411,6 @@
411
411
  "print.submit",
412
412
  "print.wait",
413
413
  "qtdesignerform.loading",
414
- "redlining.border",
415
414
  "redlining.buffer",
416
415
  "redlining.buffercompute",
417
416
  "redlining.bufferdistance",
@@ -440,7 +439,6 @@
440
439
  "redlining.square",
441
440
  "redlining.text",
442
441
  "redlining.transform",
443
- "redlining.width",
444
442
  "reports.all",
445
443
  "reports.download",
446
444
  "reports.pick",
@@ -503,6 +501,7 @@
503
501
  "search.providerselection",
504
502
  "search.recent",
505
503
  "search.search",
504
+ "search.tasks",
506
505
  "search.themelayers",
507
506
  "search.themes",
508
507
  "search.unknownmore",
@@ -479,7 +479,6 @@
479
479
  "loading": ""
480
480
  },
481
481
  "redlining": {
482
- "border": "Межа",
483
482
  "buffer": "",
484
483
  "buffercompute": "",
485
484
  "bufferdistance": "",
@@ -507,8 +506,7 @@
507
506
  "size": "Розмір",
508
507
  "square": "",
509
508
  "text": "Текст",
510
- "transform": "",
511
- "width": "Ширина"
509
+ "transform": ""
512
510
  },
513
511
  "reports": {
514
512
  "all": "",
@@ -579,6 +577,7 @@
579
577
  "providerselection": "",
580
578
  "recent": "",
581
579
  "search": "Пошук",
580
+ "tasks": "",
582
581
  "themelayers": "",
583
582
  "themes": "",
584
583
  "unknownmore": ""
@@ -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 axios from"axios";import yaml from"js-yaml";import polygonIntersectTest from"polygon-intersect-test";import{LayerRole}from"../actions/layers";import ConfigUtils from"./ConfigUtils";import CoordinatesUtils from"./CoordinatesUtils";import IdentifyUtils from"./IdentifyUtils";import LayerUtils from"./LayerUtils";import LocaleUtils from"./LocaleUtils";import VectorLayerUtils from"./VectorLayerUtils";export var SearchResultType={PLACE:0,THEMELAYER:1,THEME:2,EXTERNALLAYER:3};function coordinatesSearch(text,searchParams,callback){var displaycrs=searchParams.displaycrs||"EPSG:4326";var matches=text.replace(/[’']/g,"").match(/^\s*([+-]?\d+\.?\d*)[,\s]\s*([+-]?\d+\.?\d*)\s*$/);var items=[];if(matches&&matches.length>=3){var x=parseFloat(matches[1]);var y=parseFloat(matches[2]);if(displaycrs!=="EPSG:4326"){items.push({id:"coord0",text:x+", "+y+" ("+displaycrs+")",x:x,y:y,crs:displaycrs,bbox:[x,y,x,y]})}if(x>=-180&&x<=180&&y>=-90&&y<=90){var title=Math.abs(x)+(x>=0?"\xB0E":"\xB0W")+", "+Math.abs(y)+(y>=0?"\xB0N":"\xB0S");items.push({id:"coord"+items.length,text:title,x:x,y:y,crs:"EPSG:4326",bbox:[x,y,x,y]})}if(x>=-90&&x<=90&&y>=-180&&y<=180&&x!==y){var _title=Math.abs(y)+(y>=0?"\xB0E":"\xB0W")+", "+Math.abs(x)+(x>=0?"\xB0N":"\xB0S");items.push({id:"coord"+items.length,text:_title,x:y,y:x,crs:"EPSG:4326",bbox:[y,x,y,x]})}}var results=[];if(items.length>0){results.push({id:"coords",titlemsgid:LocaleUtils.trmsg("search.coordinates"),type:SearchResultType.PLACE,items:items})}callback({results:results})}/** ************************************************************************ **/var NominatimSearch=/*#__PURE__*/function(){function NominatimSearch(){_classCallCheck(this,NominatimSearch)}return _createClass(NominatimSearch,null,[{key:"search",value:function search(text,searchParams,callback){var viewboxParams={};if(searchParams.filterBBox){viewboxParams.viewbox=CoordinatesUtils.reprojectBbox(searchParams.filterBBox,searchParams.mapcrs,"EPSG:4326").join(",");viewboxParams.bounded=1}axios.get("https://nominatim.openstreetmap.org/search",{params:_objectSpread(_objectSpread({"q":text,"addressdetails":1,"polygon_geojson":1,"limit":20,"format":"json","accept-language":searchParams.lang},searchParams.cfgParams||{}),viewboxParams)}).then(function(response){var locale=searchParams.lang;if(NominatimSearch.TRANSLATIONS[locale]===undefined){NominatimSearch.TRANSLATIONS[locale]={promise:NominatimSearch.loadLocale(locale)};NominatimSearch.TRANSLATIONS[locale].promise.then(function(){NominatimSearch.parseResults(response.data,NominatimSearch.TRANSLATIONS[locale].strings,callback)})}else if(NominatimSearch.TRANSLATIONS[locale].promise){NominatimSearch.TRANSLATIONS[locale].promise.then(function(){NominatimSearch.parseResults(response.data,NominatimSearch.TRANSLATIONS[locale].strings,callback)})}else if(NominatimSearch.TRANSLATIONS[locale].strings){NominatimSearch.parseResults(response.data,NominatimSearch.TRANSLATIONS[locale].strings,callback)}})}},{key:"parseResults",value:function parseResults(obj,translations,callback){var results=[];var groups={};var groupcounter=0;(obj||[]).map(function(entry){if(!(entry["class"]in groups)){var title=entry.type;try{title=translations[entry["class"]][entry.type]||entry.type}catch(e){/* pass */}groups[entry["class"]]={id:"nominatimgroup"+groupcounter++,// capitalize class
7
+ */import axios from"axios";import yaml from"js-yaml";import polygonIntersectTest from"polygon-intersect-test";import{LayerRole}from"../actions/layers";import ConfigUtils from"./ConfigUtils";import CoordinatesUtils from"./CoordinatesUtils";import IdentifyUtils from"./IdentifyUtils";import LayerUtils from"./LayerUtils";import LocaleUtils from"./LocaleUtils";import VectorLayerUtils from"./VectorLayerUtils";export var SearchResultType={PLACE:0,THEMELAYER:1,THEME:2,EXTERNALLAYER:3,TASK:4};function coordinatesSearch(text,searchParams,callback){var displaycrs=searchParams.displaycrs||"EPSG:4326";var matches=text.replace(/[’']/g,"").match(/^\s*([+-]?\d+\.?\d*)[,\s]\s*([+-]?\d+\.?\d*)\s*$/);var items=[];if(matches&&matches.length>=3){var x=parseFloat(matches[1]);var y=parseFloat(matches[2]);if(displaycrs!=="EPSG:4326"){items.push({id:"coord0",text:x+", "+y+" ("+displaycrs+")",x:x,y:y,crs:displaycrs,bbox:[x,y,x,y]})}if(x>=-180&&x<=180&&y>=-90&&y<=90){var title=Math.abs(x)+(x>=0?"\xB0E":"\xB0W")+", "+Math.abs(y)+(y>=0?"\xB0N":"\xB0S");items.push({id:"coord"+items.length,text:title,x:x,y:y,crs:"EPSG:4326",bbox:[x,y,x,y]})}if(x>=-90&&x<=90&&y>=-180&&y<=180&&x!==y){var _title=Math.abs(y)+(y>=0?"\xB0E":"\xB0W")+", "+Math.abs(x)+(x>=0?"\xB0N":"\xB0S");items.push({id:"coord"+items.length,text:_title,x:y,y:x,crs:"EPSG:4326",bbox:[y,x,y,x]})}}var results=[];if(items.length>0){results.push({id:"coords",titlemsgid:LocaleUtils.trmsg("search.coordinates"),type:SearchResultType.PLACE,items:items})}callback({results:results})}/** ************************************************************************ **/var NominatimSearch=/*#__PURE__*/function(){function NominatimSearch(){_classCallCheck(this,NominatimSearch)}return _createClass(NominatimSearch,null,[{key:"search",value:function search(text,searchParams,callback){var viewboxParams={};if(searchParams.filterBBox){viewboxParams.viewbox=CoordinatesUtils.reprojectBbox(searchParams.filterBBox,searchParams.mapcrs,"EPSG:4326").join(",");viewboxParams.bounded=1}axios.get("https://nominatim.openstreetmap.org/search",{params:_objectSpread(_objectSpread({"q":text,"addressdetails":1,"polygon_geojson":1,"limit":20,"format":"json","accept-language":searchParams.lang},searchParams.cfgParams||{}),viewboxParams)}).then(function(response){var locale=searchParams.lang;if(NominatimSearch.TRANSLATIONS[locale]===undefined){NominatimSearch.TRANSLATIONS[locale]={promise:NominatimSearch.loadLocale(locale)};NominatimSearch.TRANSLATIONS[locale].promise.then(function(){NominatimSearch.parseResults(response.data,NominatimSearch.TRANSLATIONS[locale].strings,callback)})}else if(NominatimSearch.TRANSLATIONS[locale].promise){NominatimSearch.TRANSLATIONS[locale].promise.then(function(){NominatimSearch.parseResults(response.data,NominatimSearch.TRANSLATIONS[locale].strings,callback)})}else if(NominatimSearch.TRANSLATIONS[locale].strings){NominatimSearch.parseResults(response.data,NominatimSearch.TRANSLATIONS[locale].strings,callback)}})}},{key:"parseResults",value:function parseResults(obj,translations,callback){var results=[];var groups={};var groupcounter=0;(obj||[]).map(function(entry){if(!(entry["class"]in groups)){var title=entry.type;try{title=translations[entry["class"]][entry.type]||entry.type}catch(e){/* pass */}groups[entry["class"]]={id:"nominatimgroup"+groupcounter++,// capitalize class
8
8
  title:title,type:SearchResultType.PLACE,items:[]};results.push(groups[entry["class"]])}// shorten display_name
9
9
  var text=entry.display_name.split(", ").slice(0,3).join(", ");// map label
10
10
  var label=text;// collect address fields
@@ -10,7 +10,7 @@ var coords=geometry.coordinates;for(var i=0;i<coords.length-1;++i){var segment={
10
10
  var x=geometry.coordinates[0];var y=geometry.coordinates[1];geometry={type:"Polygon",coordinates:[[[x-0.01,y-0.01],[x+0.01,y-0.01],[x+0.01,y+0.01],[x-0.01,y+0.01],[x-0.01,y-0.01]]]};params.geoms.push(VectorLayerUtils.geoJSONGeomToWkt(geometry));params.labelFillColors.push(ensureHex(styleOptions.fillColor));params.labelOutlineColors.push(ensureHex(styleOptions.strokeColor));params.labelOutlineSizes.push(scaleFactor*styleOptions.strokeWidth*0.5);params.labelSizes.push(Math.round(10*styleOptions.strokeWidth*scaleFactor));params.labelDist.push("5");params.labelRotations.push(((properties.rotation||0)/Math.PI*180).toFixed(0))}else{params.geoms.push(VectorLayerUtils.geoJSONGeomToWkt(geometry));params.labelFillColors.push(ensureHex(styleOptions.textFill));params.labelOutlineColors.push(ensureHex(styleOptions.textStroke));params.labelOutlineSizes.push(scaleFactor);params.labelSizes.push(Math.round(10*scaleFactor));params.labelDist.push("-5");params.labelRotations.push("0")}}}}catch(err){_iterator2.e(err)}finally{_iterator2.f()}}}catch(err){_iterator.e(err)}finally{_iterator.f()}return params},removeDuplicateNodes:function removeDuplicateNodes(coordinates){if(Array.isArray(coordinates[0][0])){return coordinates.map(VectorLayerUtils.removeDuplicateNodes)}else if(Array.isArray(coordinates[0])){return coordinates.filter(function(item,pos,arr){return pos===0||item[0]!==arr[pos-1][0]||item[1]!==arr[pos-1][1]})}else{return coordinates}},simplifyFeature:function simplifyFeature(feature){if(!feature.geometry){return feature}else if(feature.geometry.type==="MultiPolygon"){return feature.geometry.coordinates.map(function(part){return VectorLayerUtils.simplifyFeature(_objectSpread(_objectSpread({},feature),{},{geometry:{type:"Polygon",coordinates:part}}))}).flat()}else if(feature.geometry.type==="Polygon"){return simplepolygon(feature).features.map(function(feat,idx,features){if(feat.properties.parent>=0){features[feat.properties.parent].geometry.coordinates.push(feat.geometry.coordinates[0]);return null}return feat}).filter(function(x){return x}).map(function(feat){return _objectSpread(_objectSpread({},feature),{},{geometry:feat.geometry})})}else{return feature}},validateGeometry:function validateGeometry(geometry){if(!geometry){return false}if(geometry.type==="GeometryCollection"){return geometry.geometries.every(VectorLayerUtils.validateGeometry)}if(geometry.type==="Point"){return!isEmpty(geometry.coordinates)}var minLength=geometry.type.endsWith("LineString")?2:3;var _isDegenerate=function isDegenerate(coordinates){if(Array.isArray(coordinates[0][0])){return coordinates.map(_isDegenerate).find(function(entry){return entry===false})}else{return coordinates.length<minLength}};return!_isDegenerate(geometry.coordinates)},createSld:function createSld(geometrytype,styleName,styleOptions,layerOpacity){var dpi=arguments.length>4&&arguments[4]!==undefined?arguments[4]:96;var scaleFactor=arguments.length>5&&arguments[5]!==undefined?arguments[5]:1;var opts={};var dpiScale=dpi/96*scaleFactor;// Special cases
11
11
  if(styleName==="text"){// Make geometry transparent
12
12
  opts={strokeColor:[0,0,0,0],fillColor:[0,0,0,0]}}else if(styleName==="marker"){opts={strokeColor:[0,0,255,1],strokeWidth:1*dpiScale,fillColor:[255,255,255,1],circleRadius:2*dpiScale}}else{// Default style
13
- opts=styleOptions}var ensureHex=function ensureHex(rgb){return!Array.isArray(rgb)?rgb:"#"+(16777216+(rgb[2]|rgb[1]<<8|rgb[0]<<16)).toString(16).slice(1)};var opacity=function opacity(rgb){if(Array.isArray(rgb)&&rgb.length>3){return rgb[3]*layerOpacity/255}return 1*layerOpacity/255};var stroke="<se:Stroke>"+"<se:SvgParameter name=\"stroke\">"+ensureHex(opts.strokeColor)+"</se:SvgParameter>"+"<se:SvgParameter name=\"stroke-opacity\">"+opacity(opts.strokeColor)+"</se:SvgParameter>"+"<se:SvgParameter name=\"stroke-width\">"+opts.strokeWidth*dpiScale+"</se:SvgParameter>"+"<se:SvgParameter name=\"stroke-linejoin\">round</se:SvgParameter>"+(!isEmpty(opts.strokeDash)?"<CssParameter name=\"stroke-dasharray\">"+opts.strokeDash.join(" ")+"</CssParameter>":"")+"</se:Stroke>";var fill="<se:Fill>"+"<se:SvgParameter name=\"fill\">"+ensureHex(opts.fillColor)+"</se:SvgParameter>"+"<se:SvgParameter name=\"fill-opacity\">"+opacity(opts.fillColor)+"</se:SvgParameter>"+"</se:Fill>";var rule=null;if(geometrytype.endsWith("Point")){rule="<se:PointSymbolizer>"+"<se:Graphic>"+"<se:Mark>"+"<se:WellKnownName>circle</se:WellKnownName>"+"<se:Stroke>"+"<se:SvgParameter name=\"stroke\">"+ensureHex(opts.strokeColor)+"</se:SvgParameter>"+"<se:SvgParameter name=\"stroke-opacity\">"+opacity(opts.strokeColor)+"</se:SvgParameter>"+"<se:SvgParameter name=\"stroke-width\">"+opts.strokeWidth*dpiScale+"</se:SvgParameter>"+"</se:Stroke>"+fill+"</se:Mark>"+"<se:Size>"+2*opts.circleRadius*dpiScale+"</se:Size>"+"</se:Graphic>"+"</se:PointSymbolizer>"}else if(geometrytype.endsWith("LineString")){rule="<se:LineSymbolizer>"+stroke+"</se:LineSymbolizer>"}else if(geometrytype.endsWith("Polygon")){rule="<se:PolygonSymbolizer>"+stroke+fill+"</se:PolygonSymbolizer>"}if(rule){return"<?xml version=\"1.0\" encoding=\"UTF-8\"?>"+"<StyledLayerDescriptor xmlns=\"http://www.opengis.net/sld\" xmlns:ogc=\"http://www.opengis.net/ogc\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" version=\"1.1.0\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" xsi:schemaLocation=\"http://www.opengis.net/sld http://schemas.opengis.net/sld/1.1.0/StyledLayerDescriptor.xsd\" xmlns:se=\"http://www.opengis.net/se\">"+"<UserStyle>"+"<se:FeatureTypeStyle>"+"<se:Rule>"+rule+"</se:Rule>"+"</se:FeatureTypeStyle>"+"</UserStyle>"+"</StyledLayerDescriptor>"}return null},generateMarkerGeometry:function generateMarkerGeometry(params,markername,tail,feature,layer,dpi,mapScale,printCrs,scaleFactor){if(!END_MARKERS[markername]){return}var marker=END_MARKERS[markername];// Read the SVG and generate a matching WKT geometry for the marker
13
+ opts=styleOptions}var ensureHex=function ensureHex(rgb){return!Array.isArray(rgb)?rgb:"#"+(16777216+(rgb[2]|rgb[1]<<8|rgb[0]<<16)).toString(16).slice(1)};var opacity=function opacity(rgb){if(Array.isArray(rgb)&&rgb.length>3){return rgb[3]*layerOpacity/255}return 1*layerOpacity/255};var stroke="<se:Stroke>"+"<se:SvgParameter name=\"stroke\">"+ensureHex(opts.strokeColor)+"</se:SvgParameter>"+"<se:SvgParameter name=\"stroke-opacity\">"+opacity(opts.strokeColor)+"</se:SvgParameter>"+"<se:SvgParameter name=\"stroke-width\">"+opts.strokeWidth*dpiScale+"</se:SvgParameter>"+"<se:SvgParameter name=\"stroke-linejoin\">round</se:SvgParameter>"+(!isEmpty(opts.strokeDash)?"<se:SvgParameter name=\"stroke-dasharray\">"+opts.strokeDash.map(function(x){return x*dpiScale}).join(" ")+"</se:SvgParameter>":"")+"</se:Stroke>";var fill="<se:Fill>"+"<se:SvgParameter name=\"fill\">"+ensureHex(opts.fillColor)+"</se:SvgParameter>"+"<se:SvgParameter name=\"fill-opacity\">"+opacity(opts.fillColor)+"</se:SvgParameter>"+"</se:Fill>";var rule=null;if(geometrytype.endsWith("Point")){rule="<se:PointSymbolizer>"+"<se:Graphic>"+"<se:Mark>"+"<se:WellKnownName>circle</se:WellKnownName>"+"<se:Stroke>"+"<se:SvgParameter name=\"stroke\">"+ensureHex(opts.strokeColor)+"</se:SvgParameter>"+"<se:SvgParameter name=\"stroke-opacity\">"+opacity(opts.strokeColor)+"</se:SvgParameter>"+"<se:SvgParameter name=\"stroke-width\">"+opts.strokeWidth*dpiScale+"</se:SvgParameter>"+"</se:Stroke>"+fill+"</se:Mark>"+"<se:Size>"+2*opts.circleRadius*dpiScale+"</se:Size>"+"</se:Graphic>"+"</se:PointSymbolizer>"}else if(geometrytype.endsWith("LineString")){rule="<se:LineSymbolizer>"+stroke+"</se:LineSymbolizer>"}else if(geometrytype.endsWith("Polygon")){rule="<se:PolygonSymbolizer>"+stroke+fill+"</se:PolygonSymbolizer>"}if(rule){return"<?xml version=\"1.0\" encoding=\"UTF-8\"?>"+"<StyledLayerDescriptor xmlns=\"http://www.opengis.net/sld\" xmlns:ogc=\"http://www.opengis.net/ogc\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" version=\"1.1.0\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" xsi:schemaLocation=\"http://www.opengis.net/sld http://schemas.opengis.net/sld/1.1.0/StyledLayerDescriptor.xsd\" xmlns:se=\"http://www.opengis.net/se\">"+"<UserStyle>"+"<se:FeatureTypeStyle>"+"<se:Rule>"+rule+"</se:Rule>"+"</se:FeatureTypeStyle>"+"</UserStyle>"+"</StyledLayerDescriptor>"}return null},generateMarkerGeometry:function generateMarkerGeometry(params,markername,tail,feature,layer,dpi,mapScale,printCrs,scaleFactor){if(!END_MARKERS[markername]){return}var marker=END_MARKERS[markername];// Read the SVG and generate a matching WKT geometry for the marker
14
14
  var path="";var width=0;var height=0;try{var parser=new DOMParser;var svgSrc=atob(marker.src.slice(26));var svgDoc=parser.parseFromString(svgSrc,"text/xml");width=parseInt(svgDoc.getElementsByTagName("svg")[0].getAttribute("width"),10);height=parseInt(svgDoc.getElementsByTagName("svg")[0].getAttribute("height"),10);path=svgDoc.getElementsByTagName("path")[0].getAttribute("d")}catch(e){/* eslint-disable-next-line */console.warn("Could not parse path for marker "+markername);return}// [ Same as in FeatureStyles.js ] [ pixel to map units ]
15
15
  var markerScaleFactor=0.125*(1+feature.styleOptions.strokeWidth)/dpi*0.0254*mapScale*scaleFactor;var origin=feature.geometry.coordinates[tail?feature.geometry.coordinates.length-1:0];var p2=feature.geometry.coordinates[tail?feature.geometry.coordinates.length-2:1];var coordinates=[];var angle=0.5*Math.PI+Math.atan2(origin[0]-p2[0],origin[1]-p2[1]);var alpha=marker.baserotation/180*Math.PI+angle;var cosa=Math.cos(alpha);var sina=Math.sin(alpha);svgpath(path).iterate(function(segment,index,x,y){// Skip move instructions
16
16
  if(["m","M"].includes(segment[0])){return}var dx=(x-marker.anchor[0]*width)*markerScaleFactor;var dy=(y-marker.anchor[1]*height)*markerScaleFactor;var rx=cosa*dx+sina*dy;var ry=-sina*dx+cosa*dy;coordinates.push([origin[0]+rx,origin[1]+ry])});// Closing coordinate