X-Git-Url: https://git.openstreetmap.org./rails.git/blobdiff_plain/a1051b418e7a838e5dc14f8491f97de5510d1437..09d31dc6be38d0bbd7cb0531b2596d20bfa78dc4:/app/assets/javascripts/index/directions-endpoint.js diff --git a/app/assets/javascripts/index/directions-endpoint.js b/app/assets/javascripts/index/directions-endpoint.js index 6cb94f39f..e3f6afa46 100644 --- a/app/assets/javascripts/index/directions-endpoint.js +++ b/app/assets/javascripts/index/directions-endpoint.js @@ -1,5 +1,5 @@ OSM.DirectionsEndpoint = function Endpoint(map, input, iconUrl, dragCallback, changeCallback) { - var endpoint = {}; + const endpoint = {}; endpoint.marker = L.marker([0, 0], { icon: L.icon({ @@ -14,27 +14,20 @@ OSM.DirectionsEndpoint = function Endpoint(map, input, iconUrl, dragCallback, ch autoPan: true }); - endpoint.enable = function () { + endpoint.enableListeners = function () { endpoint.marker.on("drag dragend", markerDragListener); input.on("keydown", inputKeydownListener); input.on("change", inputChangeListener); }; - endpoint.disable = function () { + endpoint.disableListeners = function () { endpoint.marker.off("drag dragend", markerDragListener); input.off("keydown", inputKeydownListener); input.off("change", inputChangeListener); - - if (endpoint.geocodeRequest) endpoint.geocodeRequest.abort(); - delete endpoint.geocodeRequest; - removeLatLng(); - delete endpoint.value; - input.val(""); - map.removeLayer(endpoint.marker); }; function markerDragListener(e) { - var latlng = convertLatLngToZoomPrecision(e.target.getLatLng()); + const latlng = L.latLng(OSM.cropLocation(e.target.getLatLng(), map.getZoom())); if (endpoint.geocodeRequest) endpoint.geocodeRequest.abort(); delete endpoint.geocodeRequest; @@ -52,7 +45,7 @@ OSM.DirectionsEndpoint = function Endpoint(map, input, iconUrl, dragCallback, ch function inputChangeListener(e) { // make text the same in both text boxes - var value = e.target.value; + const value = e.target.value; endpoint.setValue(value); } @@ -61,12 +54,17 @@ OSM.DirectionsEndpoint = function Endpoint(map, input, iconUrl, dragCallback, ch delete endpoint.geocodeRequest; input.removeClass("is-invalid"); - var coordinatesMatch = value.match(/^\s*([+-]?\d+(?:\.\d*)?)(?:\s+|\s*[/,]\s*)([+-]?\d+(?:\.\d*)?)\s*$/); - var latlng = coordinatesMatch && L.latLng(coordinatesMatch[1], coordinatesMatch[2]); + const coordinatesMatch = value.match(/^\s*([+-]?\d+(?:\.\d*)?)(?:\s+|\s*[/,]\s*)([+-]?\d+(?:\.\d*)?)\s*$/); + const latlng = coordinatesMatch && L.latLng(coordinatesMatch[1], coordinatesMatch[2]); if (latlng && endpoint.cachedReverseGeocode && endpoint.cachedReverseGeocode.latlng.equals(latlng)) { setLatLng(latlng); - endpoint.value = endpoint.cachedReverseGeocode.value; + if (endpoint.cachedReverseGeocode.notFound) { + endpoint.value = value; + input.addClass("is-invalid"); + } else { + endpoint.value = endpoint.cachedReverseGeocode.value; + } input.val(endpoint.value); changeCallback(); return; @@ -86,9 +84,18 @@ OSM.DirectionsEndpoint = function Endpoint(map, input, iconUrl, dragCallback, ch } }; + endpoint.clearValue = function () { + if (endpoint.geocodeRequest) endpoint.geocodeRequest.abort(); + delete endpoint.geocodeRequest; + removeLatLng(); + delete endpoint.value; + input.val(""); + map.removeLayer(endpoint.marker); + }; + endpoint.swapCachedReverseGeocodes = function (otherEndpoint) { - var g0 = endpoint.cachedReverseGeocode; - var g1 = otherEndpoint.cachedReverseGeocode; + const g0 = endpoint.cachedReverseGeocode; + const g1 = otherEndpoint.cachedReverseGeocode; delete endpoint.cachedReverseGeocode; delete otherEndpoint.cachedReverseGeocode; if (g0) otherEndpoint.cachedReverseGeocode = g0; @@ -96,13 +103,20 @@ OSM.DirectionsEndpoint = function Endpoint(map, input, iconUrl, dragCallback, ch }; function getGeocode() { - var viewbox = map.getBounds().toBBoxString(); // ,,, - var geocodeUrl = OSM.NOMINATIM_URL + "search?q=" + encodeURIComponent(endpoint.value) + "&format=json&viewbox=" + viewbox; + const viewbox = map.getBounds().toBBoxString(), // ,,, + geocodeUrl = OSM.NOMINATIM_URL + "search?" + new URLSearchParams({ q: endpoint.value, format: "json", viewbox }); + + endpoint.geocodeRequest = new AbortController(); + fetch(geocodeUrl, { signal: endpoint.geocodeRequest.signal }) + .then(r => r.json()) + .then(success) + .catch(() => {}); - endpoint.geocodeRequest = $.getJSON(geocodeUrl, function (json) { + function success(json) { delete endpoint.geocodeRequest; if (json.length === 0) { input.addClass("is-invalid"); + // eslint-disable-next-line no-alert alert(I18n.t("javascripts.directions.errors.no_place", { place: endpoint.value })); return; } @@ -113,23 +127,31 @@ OSM.DirectionsEndpoint = function Endpoint(map, input, iconUrl, dragCallback, ch input.val(json[0].display_name); changeCallback(); - }); + } } function getReverseGeocode() { - var latlng = endpoint.latlng.clone(); - var reverseGeocodeUrl = OSM.NOMINATIM_URL + "reverse?lat=" + latlng.lat + "&lon=" + latlng.lng + "&format=json"; + const latlng = endpoint.latlng.clone(), + { lat, lng } = latlng, + reverseGeocodeUrl = OSM.NOMINATIM_URL + "reverse?" + new URLSearchParams({ lat, lon: lng, format: "json" }); + + endpoint.geocodeRequest = new AbortController(); + fetch(reverseGeocodeUrl, { signal: endpoint.geocodeRequest.signal }) + .then(r => r.json()) + .then(success) + .catch(() => {}); - endpoint.geocodeRequest = $.getJSON(reverseGeocodeUrl, function (json) { + function success(json) { delete endpoint.geocodeRequest; if (!json || !json.display_name) { + endpoint.cachedReverseGeocode = { latlng: latlng, notFound: true }; return; } endpoint.value = json.display_name; input.val(json.display_name); endpoint.cachedReverseGeocode = { latlng: latlng, value: endpoint.value }; - }); + } } function setLatLng(ll) { @@ -153,11 +175,5 @@ OSM.DirectionsEndpoint = function Endpoint(map, input, iconUrl, dragCallback, ch input.val(latlng.lat + ", " + latlng.lng); } - function convertLatLngToZoomPrecision(latlng) { - var precision = OSM.zoomPrecision(map.getZoom()); - - return L.latLng(latlng.lat.toFixed(precision), latlng.lng.toFixed(precision)); - } - return endpoint; };