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(
'