Merge pull request #13 from danstowell/jsrouting-ffoxdragok
authorRichard Fairhurst <richard@systemeD.net>
Sat, 8 Mar 2014 12:13:40 +0000 (12:13 +0000)
committerRichard Fairhurst <richard@systemeD.net>
Sat, 8 Mar 2014 12:13:40 +0000 (12:13 +0000)
fix firefox behaviour when dragging pointer from the tray to the map

app/assets/images/searching-small.gif [new file with mode: 0644]
app/assets/javascripts/routing.js.erb
app/assets/javascripts/routing_engines/cloudmade_foot.js
app/assets/javascripts/routing_engines/graphhopper_bicycle.js
app/assets/javascripts/routing_engines/mapquest_bicycle.js
app/assets/javascripts/routing_engines/osrm_car.js
app/views/layouts/_search.html.erb
config/locales/en.yml

diff --git a/app/assets/images/searching-small.gif b/app/assets/images/searching-small.gif
new file mode 100644 (file)
index 0000000..06dbc2b
Binary files /dev/null and b/app/assets/images/searching-small.gif differ
index 74607ef391572c0fe1c9e207a214c5cc50a5c240..d1c66e2939b6d86d98983fc584e54f1f018e2f54 100644 (file)
@@ -9,8 +9,6 @@
        *** translation (including all alerts and presentation)
        *** export GPX
        *** URL history (or do we consciously not want to support that?)
-       *** spinner when waiting for result (beneath 'Go' button?)
-
        *** add YOURS engine
 */
 
@@ -58,6 +56,7 @@ OSM.Routing=function(map,name,jqSearch) {
        r.route_to=null;                //  |
        r.awaitingGeocode=false;// true if the user has requested a route, but we're waiting on a geocode result
        r.awaitingRoute=false;  // true if we've asked the engine for a route and are waiting to hear back
+       r.dragging=false;               // true if the user is dragging a start/end point
        r.viaPoints=[];                 // not yet used
 
        r.polyline=null;                // Leaflet polyline object
@@ -99,7 +98,7 @@ OSM.Routing=function(map,name,jqSearch) {
        
        r._gotGeocode=function(json,field) {
                if (json.length==0) {
-                       alert("Sorry, couldn't find that place.");      // *** internationalise
+                       alert(I18n.t('javascripts.directions.errors.no_place'));
                        r[field.id]=null;
                        return;
                }
@@ -145,10 +144,11 @@ OSM.Routing=function(map,name,jqSearch) {
        };
        // Marker has been dragged
        r.markerDragged=function(e) {
-               if (e.type=='drag' && !r.chosenEngine.draggable) return;
-               if (e.type=='drag' && r.awaitingRoute) return;
+               r.dragging=(e.type=='drag');    // true for drag, false for dragend
+               if (r.dragging && !r.chosenEngine.draggable) return;
+               if (r.dragging && r.awaitingRoute) return;
                r.setNumericInput(e.target.getLatLng(), e.target.options.name);
-               r.requestRoute(e.type=='dragend', false);
+               r.requestRoute(!r.dragging, false);
        };
        // Set a route input field to a numeric value
        r.setNumericInput=function(ll,id) {
@@ -161,6 +161,7 @@ OSM.Routing=function(map,name,jqSearch) {
 
        r.requestRoute=function(isFinal, updateZoom) {
                if (r.route_from && r.route_to) {
+                       $(".query_wrapper.routing .spinner").show();
                        r.awaitingRoute=true;
                        r.chosenEngine.getRoute(isFinal,[r.route_from,r.route_to]);
                        if(updateZoom){
@@ -184,13 +185,13 @@ OSM.Routing=function(map,name,jqSearch) {
        // Take directions and write them out
        // data = { steps: array of [latlng, sprite number, instruction text, distance in metres] }
        // sprite numbers equate to OSRM's route_instructions turn values
-       // *** translations?
        r.setItinerary=function(data) {
                // Create base table
                $("#content").removeClass("overlay-sidebar");
                $('#sidebar_content').empty();
-               var html='<h2><a class="geolink" href="#" onclick="$(~.close_directions~).click();return false;"><span class="icon close"></span></a>' + I18n.t('javascripts.directions.directions') + '</h2>'.replace(/~/g,"'");
-               html+="<table id='turnbyturn' />";
+               var html=('<h2><a class="geolink" href="#" onclick="$(~.close_directions~).click();return false;">' +
+                         '<span class="icon close"></span></a>' + I18n.t('javascripts.directions.directions') + 
+                         '</h2><table id="turnbyturn" />').replace(/~/g,"'");
                $('#sidebar_content').html(html);
                // Add each row
                var cumulative=0;
@@ -247,7 +248,18 @@ OSM.Routing=function(map,name,jqSearch) {
                                script.src = url+r.name+".gotRoute"+num;
                                document.body.appendChild(script); 
                        };
-                       r['gotRoute'+num]=function(data) { r.awaitingRoute=false; list[num].gotRoute(r,data); };
+                       r['gotRoute'+num]=function(data) { 
+                               r.awaitingRoute=false;
+                               $(".query_wrapper.routing .spinner").hide();
+                               if (!list[num].gotRoute(r,data)) {
+                                       // No route found
+                                       if (r.polyline) {
+                                               map.removeLayer(r.polyline);
+                                               r.polyline=null;
+                                       }
+                                       if (!r.dragging) { alert(I18n.t('javascripts.directions.errors.no_route')); }
+                               }
+                       };
                }
                select.append("<option value='"+i+"'>"+I18n.t(list[i].name)+"</option>");
        }
index bee9e448a931be071d34349579f45e94c3b208f5..13368d0a2d09475c53693634f95a9c5836a80b5e 100644 (file)
@@ -28,6 +28,7 @@ OSM.RoutingEngines.list.push({
                url+="/foot.js";
         url+="?lang=" + I18n.currentLocale();
                this.requestJSONP(url+"&callback=");
+               return true;
        },
        gotRoute: function(router,data) {
                router.setPolyline(data.route_geometry);
index bec855f88dd44e0f1b07f6cd21a537ddf18055ab..acf089278439db8d2445085f3ac7b23d50f77550 100644 (file)
@@ -17,7 +17,6 @@ OSM.RoutingEngines.list.push({
     },
     gotRoute: function(router, data) {
         if (!data.info.routeFound) {
-            alert("Couldn't find route between those two places");
             return false;
         }
         // Draw polyline
@@ -36,6 +35,7 @@ OSM.RoutingEngines.list.push({
             steps.push([{lat: latlng[0], lng: latlng[1]}, instrCode, instrText, distInMeter]);
         }
         router.setItinerary({steps: steps});
+        return true;
     },
     GH_INSTR_MAP: {
         "-3": 6, // sharp left
index c7995246ab22466a84aeed019eac1d86c1f26498..5d5ff9ffd49c119bf017982966376235b668bf83 100644 (file)
@@ -60,5 +60,6 @@ OSM.RoutingEngines.list.push({
                        steps.push([L.latLng(s.startPoint.lat, s.startPoint.lng), d, s.narrative, s.distance*1000]);
                }
                router.setItinerary( { steps: steps });
+               return true;
        }
 });
index da94adf053aa8356c385a1aff8b9ad9562850545..8ff6ba482a3883cd5ea0d86643f4d0cdbe0894e1 100644 (file)
@@ -19,7 +19,6 @@ OSM.RoutingEngines.list.push({
        },
        gotRoute: function(router,data) {
                if (data.status==207) {
-                       alert("Couldn't find route between those two places");
                        return false;
                }
                // Draw polyline
@@ -39,5 +38,6 @@ OSM.RoutingEngines.list.push({
                        steps.push([line[s[3]], s[0].split('-')[0], instText, s[2]]);
                }
                if (steps.length) router.setItinerary({ steps: steps });
+               return true;
        }
 });
index e9aa76f5a47c89bce57741c105c5ab96b837859c..839b3dceca6106b270fef6d3ed06be633fc29e84 100644 (file)
@@ -20,6 +20,7 @@
     <%= image_tag "marker-red.png"  , :class => 'routing_marker', :id => 'marker_to'  , :draggable => 'true' %>
     <%= text_field_tag "route_to"  , params[:to]  , :placeholder => t('site.search.to')  , :onchange=>"OSM.routing.geocode('route_to'  ,event)" %>
     <select class='routing_engines' name='routing_engines' onchange="OSM.routing.selectEngine(event)"></select>
+    <%= image_tag "searching-small.gif", :class => 'spinner', :style => "vertical-align: middle; display: none;" %>
   </div>
 
 <% end %>
index 573afa5855bca6b51feae1e52e74e5b0844f0201..46fe41d10d9a0d626c8f61fc5ef68e14fc31fbac 100644 (file)
@@ -2125,6 +2125,9 @@ en:
         osrm_car: "Car (OSRM)"
         cloudmade_foot: "Foot (Cloudmade)"
       directions: "Directions"
+      errors:
+        no_route: "Couldn't find a route between those two places."
+        no_place: "Sorry - couldn't find that place."
       instructions:
         continue_on: "Continue on "
         slight_right: "Slight right onto "