X-Git-Url: https://git.openstreetmap.org./rails.git/blobdiff_plain/459d3b314a900b3fb83eb88502bb29e1c961082e..feeaa1b03f0dd8f1ecdcdcdcc8e2b9dbf26f95f5:/app/assets/javascripts/index/directions.js?ds=sidebyside diff --git a/app/assets/javascripts/index/directions.js b/app/assets/javascripts/index/directions.js index 07d39974d..89888bbd1 100644 --- a/app/assets/javascripts/index/directions.js +++ b/app/assets/javascripts/index/directions.js @@ -4,6 +4,7 @@ OSM.Directions = function (map) { let controller = null; // the AbortController for the current route request if a route request is in progress + let lastLocation = []; let chosenEngine; const popup = L.popup({ autoPanPadding: [100, 100] }); @@ -133,7 +134,7 @@ OSM.Directions = function (map) { // copy loading item to sidebar and display it. we copy it, rather than // just using it in-place and replacing it in case it has to be used // again. - $("#sidebar_content").html($(".directions_form .loader_copy").html()); + $("#directions_content").html($(".directions_form .loader_copy").html()); map.setSidebarOverlaid(false); controller = new AbortController(); chosenEngine.getRoute(points, controller.signal).then(function (route) { @@ -157,16 +158,10 @@ OSM.Directions = function (map) { const turnByTurnTable = $("") .append($("")); - const directionsCloseButton = $(""); - row.append(" "); + if (direction) { + row.append(""); + } else { + row.append("
"); + } row.append("" + instruction); row.append("" + getDistText(dist)); @@ -202,27 +201,19 @@ OSM.Directions = function (map) { URL.revokeObjectURL(downloadURL); downloadURL = URL.createObjectURL(blob); - $("#sidebar_content").append(`

${ I18n.t("javascripts.directions.download") }

`); - $("#sidebar_content").append("

" + + $("#directions_content").append("

" + I18n.t("javascripts.directions.instructions.courtesy", { link: chosenEngine.creditline }) + "

"); - - directionsCloseButton.on("click", function () { - map.removeLayer(polyline); - $("#sidebar_content").html(""); - popup.close(); - map.setSidebarOverlaid(true); - // TODO: collapse width of sidebar back to previous - }); }).catch(function () { map.removeLayer(polyline); if (reportErrors) { - $("#sidebar_content").html("
" + I18n.t("javascripts.directions.errors.no_route") + "
"); + $("#directions_content").html("
" + I18n.t("javascripts.directions.errors.no_route") + "
"); } }).finally(function () { controller = null; @@ -237,6 +228,15 @@ OSM.Directions = function (map) { } } + function hideRoute(e) { + e.stopPropagation(); + map.removeLayer(polyline); + $("#directions_content").html(""); + popup.close(); + map.setSidebarOverlaid(true); + // TODO: collapse width of sidebar back to previous + } + setEngine("fossgis_osrm_car"); setEngine(Cookies.get("_osm_directions_engine")); @@ -247,7 +247,7 @@ OSM.Directions = function (map) { }); select.on("change", function (e) { - setEngine(e.target.selectedOptions[0].value + "_" + chosenEngine.mode); + setEngine(e.target.value + "_" + chosenEngine.mode); Cookies.set("_osm_directions_engine", chosenEngine.id, { secure: true, expires: expiry, path: "/", samesite: "lax" }); getRoute(true, true); }); @@ -268,11 +268,33 @@ OSM.Directions = function (map) { } }); - const page = {}; + function sendstartinglocation({ latlng: { lat, lng } }) { + map.fire("startinglocation", { latlng: [lat, lng] }); + } - page.pushstate = page.popstate = function () { - $(".search_form").hide(); - $(".directions_form").show(); + function startingLocationListener({ latlng }) { + if (endpoints[0].value) return; + endpoints[0].setValue(latlng.join(", ")); + } + + map.on("locationfound", ({ latlng: { lat, lng } }) => + lastLocation = [lat, lng] + ).on("locateactivate", () => { + map.once("startinglocation", startingLocationListener); + }); + + function initializeFromParams() { + const params = new URLSearchParams(location.search), + route = (params.get("route") || "").split(";"); + + if (params.has("engine")) setEngine(params.get("engine")); + + endpoints[0].setValue(params.get("from") || route[0] || lastLocation.join(", ")); + endpoints[1].setValue(params.get("to") || route[1] || ""); + } + + function enableListeners() { + $("#sidebar_content").on("click", ".btn-close", hideRoute); $("#map").on("dragend dragover", function (e) { e.preventDefault(); @@ -290,31 +312,53 @@ OSM.Directions = function (map) { endpoints[type === "from" ? 0 : 1].setValue(llWithPrecision.join(", ")); }); - endpoints[0].enable(); - endpoints[1].enable(); + map.on("locationfound", sendstartinglocation); - const params = new URLSearchParams(location.search), - route = (params.get("route") || "").split(";"); + endpoints[0].enableListeners(); + endpoints[1].enableListeners(); + } - if (params.has("engine")) setEngine(params.get("engine")); + const page = {}; - endpoints[0].setValue(params.get("from") || route[0] || ""); - endpoints[1].setValue(params.get("to") || route[1] || ""); + page.pushstate = page.popstate = function () { + if ($("#directions_content").length) { + page.load(); + } else { + initializeFromParams(); - map.setSidebarOverlaid(!endpoints[0].latlng || !endpoints[1].latlng); + $(".search_form").hide(); + $(".directions_form").show(); + + OSM.loadSidebarContent("/directions", enableListeners); + + map.setSidebarOverlaid(!endpoints[0].latlng || !endpoints[1].latlng); + } }; page.load = function () { - page.pushstate(); + initializeFromParams(); + + $(".search_form").hide(); + $(".directions_form").show(); + + enableListeners(); + + map.setSidebarOverlaid(!endpoints[0].latlng || !endpoints[1].latlng); }; page.unload = function () { $(".search_form").show(); $(".directions_form").hide(); + + $("#sidebar_content").off("click", ".btn-close", hideRoute); $("#map").off("dragend dragover drop"); + map.off("locationfound", sendstartinglocation); + + endpoints[0].disableListeners(); + endpoints[1].disableListeners(); - endpoints[0].disable(); - endpoints[1].disable(); + endpoints[0].clearValue(); + endpoints[1].clearValue(); map .removeLayer(popup) @@ -327,7 +371,7 @@ OSM.Directions = function (map) { OSM.Directions.engines = []; OSM.Directions.addEngine = function (engine, supportsHTTPS) { - if (document.location.protocol === "http:" || supportsHTTPS) { + if (location.protocol === "http:" || supportsHTTPS) { engine.id = engine.provider + "_" + engine.mode; OSM.Directions.engines.push(engine); }