//= require_tree ./directions
OSM.Directions = function (map) {
- var routeRequest = null; // jqXHR object of an ongoing route request or null
+ let controller = null; // the AbortController for the current route request if a route request is in progress
var chosenEngine;
var popup = L.popup({ autoPanPadding: [100, 100] });
var endpointDragCallback = function (dragging) {
if (!map.hasLayer(polyline)) return;
if (dragging && !chosenEngine.draggable) return;
- if (dragging && routeRequest) return;
+ if (dragging && controller) return;
getRoute(false, !dragging);
};
});
function formatDistance(m) {
- if (m < 1000) {
- return I18n.t("javascripts.directions.distance_m", { distance: Math.round(m) });
- } else if (m < 10000) {
- return I18n.t("javascripts.directions.distance_km", { distance: (m / 1000.0).toFixed(1) });
- } else {
- return I18n.t("javascripts.directions.distance_km", { distance: Math.round(m / 1000) });
- }
+ const unitTemplate = "javascripts.directions.distance_";
+ if (m < 1000) return I18n.t(unitTemplate + "m", { distance: Math.round(m) });
+ if (m < 10000) return I18n.t(unitTemplate + "km", { distance: (m / 1000.0).toFixed(1) });
+ return I18n.t(unitTemplate + "km", { distance: Math.round(m / 1000) });
}
function formatHeight(m) {
function getRoute(fitRoute, reportErrors) {
// Cancel any route that is already in progress
- if (routeRequest) routeRequest.abort();
+ if (controller) controller.abort();
const points = endpoints.map(p => p.latlng);
// again.
$("#sidebar_content").html($(".directions_form .loader_copy").html());
map.setSidebarOverlaid(false);
-
- routeRequest = chosenEngine.getRoute(points, function (err, route) {
- routeRequest = null;
-
- if (err) {
- map.removeLayer(polyline);
-
- if (reportErrors) {
- $("#sidebar_content").html("<div class=\"alert alert-danger\">" + I18n.t("javascripts.directions.errors.no_route") + "</div>");
- }
-
- return;
- }
-
+ controller = new AbortController();
+ chosenEngine.getRoute(points, controller.signal).then(function (route) {
polyline
.setLatLngs(route.line)
.addTo(map);
// Add each row
route.steps.forEach(function (step) {
- var ll = step[0],
- direction = step[1],
- instruction = step[2],
- dist = step[3],
- lineseg = step[4];
-
- if (dist < 5) {
- dist = "";
- } else if (dist < 200) {
- dist = String(Math.round(dist / 10) * 10) + "m";
- } else if (dist < 1500) {
- dist = String(Math.round(dist / 100) * 100) + "m";
- } else if (dist < 5000) {
- dist = String(Math.round(dist / 100) / 10) + "km";
- } else {
- dist = String(Math.round(dist / 1000)) + "km";
- }
+ const [ll, direction, instruction, dist, lineseg] = step;
var row = $("<tr class='turn'/>");
row.append("<td class='border-0'><div class='direction i" + direction + "'/></td> ");
row.append("<td>" + instruction);
- row.append("<td class='distance text-body-secondary text-end'>" + dist);
+ row.append("<td class='distance text-body-secondary text-end'>" + getDistText(dist));
row.on("click", function () {
popup
map.setSidebarOverlaid(true);
// TODO: collapse width of sidebar back to previous
});
+ }).catch(function () {
+ map.removeLayer(polyline);
+ if (reportErrors) {
+ $("#sidebar_content").html("<div class=\"alert alert-danger\">" + I18n.t("javascripts.directions.errors.no_route") + "</div>");
+ }
+ }).finally(function () {
+ controller = null;
});
+
+ function getDistText(dist) {
+ if (dist < 5) return "";
+ if (dist < 200) return String(Math.round(dist / 10) * 10) + "m";
+ if (dist < 1500) return String(Math.round(dist / 100) * 100) + "m";
+ if (dist < 5000) return String(Math.round(dist / 100) / 10) + "km";
+ return String(Math.round(dist / 1000)) + "km";
+ }
}
var chosenEngineIndex = findEngine("fossgis_osrm_car");