BR.Search = class extends L.Control.Geocoder {
constructor(options) {
super(
Object.assign(
{
geocoder: new L.Control.Geocoder.LatLng({
next: new L.Control.Geocoder.Nominatim({
serviceUrl: 'https://nominatim.openstreetmap.org/',
}),
sizeInMeters: 800,
}),
position: 'topleft',
expand: 'click',
shortcut: {
search: 70, // char code for 'f'
},
placeholder: i18next.t('map.geocoder-placeholder'),
},
options
)
);
L.DomEvent.addListener(document, 'keydown', this._keydownListener, this);
}
markGeocode(result) {
this._map.fitBounds(result.geocode.bbox, {
maxZoom: 17,
});
this.clear();
this._geocodeMarker = new L.CircleMarker(result.geocode.center, {
interactive: false,
color: 'red',
opacity: 1,
weight: 3,
}).addTo(this._map);
return this;
}
clear() {
if (this._geocodeMarker) {
this._map.removeLayer(this._geocodeMarker);
}
}
_keydownListener(e) {
if (BR.Util.keyboardShortcutsAllowed(e) && e.keyCode === this.options.shortcut.search) {
$('#map .leaflet-control-geocoder')[0].dispatchEvent(new MouseEvent('click'));
e.preventDefault();
}
}
/* Search favorites handling */
onAdd(map) {
if(!BR.Util.localStorageAvailable())
return super.onAdd(map);
let container=super.onAdd(map);
new SearchFavorites(this,container);
return container;
}
};
class SearchFavorites {
constructor(geocoder,container) {
//because eslint does not support instance var declaration
this.searchInput=undefined;
this.autocompleteContainer=undefined;
this.autocompleteSelect=undefined;
this.autocompleteMenu=undefined;
this.geocoderForm=undefined;
this.geocoder=undefined;
this.favElements=undefined;
this.isFiltered=true;
this.arFavitems=[];
this.arFavitemsLC=[];
this.geocoder=geocoder;
this.searchInput=$(container).find(".leaflet-control-geocoder-form input[type=text]");
this.searchInput.after(`
`);
//otherwise parent catches event and click is never fired
$(container).find(".leaflet-control-geocoder-form .search-fav-ctrls").on("mousedown",
(e) => { e.stopPropagation();e.preventDefault(); });
$(container).find(".leaflet-control-geocoder-form .search-fav-ctrls").click((e) => this.onCtrlsClick(e));
$(container).find(".leaflet-control-geocoder-form").append(`
`);
this.autocompleteContainer=$(container).find("#search-autocomplete-container");
this.autocompleteSelect=this.autocompleteContainer.find("#search-autocomplete-select");
this.autocompleteMenu=this.autocompleteContainer.find("#autocomplete-btngroup");
this.geocoderForm=$(container).find(".leaflet-control-geocoder-form");
this.autocompleteContainer.on("mousedown",
(e) => { e.stopPropagation();e.preventDefault(); });
this.autocompleteContainer.find("#search-fav-menu-toggle").on("mousedown touchend",
(e) => { e.stopPropagation();e.preventDefault();});
this.autocompleteContainer.find("#search-fav-menu-toggle").on("click touchend",
(e) => {
e.stopPropagation();e.preventDefault();
this.autocompleteMenu.collapse('toggle');
});
this.autocompleteContainer.find(".autocomplete-select-container").on("wheel",
(e) => { e.stopPropagation(); });
this.autocompleteContainer.on("shown.bs.collapse", (e) => this.geocoderForm.addClass("stayvisible"));
this.autocompleteContainer.on("hidden.bs.collapse", (e) => {
this.geocoderForm.removeClass("stayvisible");
this.autocompleteMenu.collapse('hide');
});
this.autocompleteSelect.click((e) => this.onFavItemClicked(e));
this.autocompleteContainer.find(".autocomplete-menu").click((e) => this.onFavMenuClicked(e));
this.autocompleteContainer.find("#search-fav-file").on("change",(e) => this.onImportFavFile(e));
let strFavitems=localStorage['searchFavItems'];
if(strFavitems) {
this.arFavitems=JSON.parse(strFavitems);
this.arFavitemsLC = this.arFavitems.map(x => x.toLowerCase()); //copy to Lowercase
}
this.updateFavList();
this.searchInput.on("keyup",(e) => this.onInput(e));
}
updateFavList() {
if(this.arFavitems.length > 0){
let opts=this.arFavitems.join('