// default selects the first item in // the list of results selectFirst: true, // The number of characters entered should start searching howManyCharacters: 2, // onSearch onSearch: ({ currentValue }) => { // You can also use static files // const api = '../static/search.json' const api = `https://nominatim.openstreetmap.org/search?format=geojson&limit=1&city=${encodeURI(currentValue)}`; return new Promise((resolve) => { fetch(api) .then((response) => response.json()) .then((data) => { resolve(data.features); }) .catch((error) => { console.error(error); }); }); }, // nominatim GeoJSON format parse this part turns json into the list of // records that appears when you type. onResults: ({ currentValue, matches, template }) => { const regex = new RegExp(currentValue, "gi"); // if the result returns 0 we // show the no results element return matches === 0 ? template : matches .map((element) => { let split_address = element.properties.display_name.split(', '); if (split_address.length >= 3) { let country = split_address[split_address.length - 1]; let city = split_address[0]; // First element let data = city + ', ' + country; // Highlight the search term in the modified text let modifiedText = data.replace( regex, (str) => `${str}` ); return `
  • ${modifiedText}

  • `; } else { console.log("Not enough elements in the array to extract."); } }) .join(""); }, // we add an action to enter or click onSubmit: ({ object }) => { // console.log(object) // remove all layers from the map leaflet_map.eachLayer(function(layer) { if (!!layer.toGeoJSON) { leaflet_map.removeLayer(layer); } }); const { display_name } = object.properties; const [lng, lat] = object.geometry.coordinates; // const marker = L.marker([lat, lng], { // title: display_name, // }); // marker.addTo(leaflet_map).bindPopup(display_name); leaflet_map.setView([lat, lng], 8); }, // get index and data from li element after // hovering over li with the mouse or using // arrow keys ↓ | ↑ onSelectedItem: ({ index, element, object }) => { // console.log(object.properties) // console.log(object.geometry.coordinates) let leaf_lon = object.geometry.coordinates[0] let leaf_lat = object.geometry.coordinates[1] let full_address = object.properties.display_name let split_address = full_address.split(', '); if (split_address.length >= 3) { let country = split_address[split_address.length - 1]; let state = split_address[1]; // Second element let city = split_address[0]; // First element // Now you have the country, state, and city console.log("Country: " + country); console.log("State: " + state); console.log("City: " + city); // You can use this information as needed, for example, to update form fields or make API requests. } else { console.log("Not enough elements in the array to extract."); } $('.leaf_lon').val(leaf_lon); $('.leaf_lat').val(leaf_lat); let split_string = full_address.split(', '); let country = split_string.pop(); // var form = new FormData(); // form.append('lat', leaf_lat); // form.append('lng', leaf_lon); // form.append('country', country); // form.append('place', full_address); // axios.post('/set/session', form) // .then((res) => { // // alert() // // console.log(res.data); // // toastr.success("Location Saved", 'Success!'); // }) // .catch((e) => { // toastr.error("Something Wrong", 'Error!'); // }); }, // the method presents no results element noResults: ({ currentValue, template }) => template(`
  • No results found: "${currentValue}"
  • `), });