]> git.openstreetmap.org Git - rails.git/blobdiff - app/assets/javascripts/index.js
Allow users to get default contextmenu on shift-click
[rails.git] / app / assets / javascripts / index.js
index 9e386d54bf2bccef0b56c1e331d3fef0494c35dc..69e223b22a74e71bbb2a2f997fafbf36fefac9fc 100644 (file)
@@ -7,6 +7,7 @@
 //= require leaflet.share
 //= require leaflet.polyline
 //= require leaflet.query
+//= require leaflet.contextmenu
 //= require index/search
 //= require index/browse
 //= require index/export
@@ -54,7 +55,7 @@ $(document).ready(function () {
 
         if (xhr.getResponseHeader('X-Page-Title')) {
           var title = xhr.getResponseHeader('X-Page-Title');
-          document.title = decodeURIComponent(escape(title));
+          document.title = decodeURIComponent(title);
         }
 
         $('head')
@@ -75,9 +76,81 @@ $(document).ready(function () {
 
   var params = OSM.mapParams();
 
+  // TODO consider using a separate js file for the context menu additions
+  var context_describe = function(e){
+    var precision = OSM.zoomPrecision(map.getZoom());
+    OSM.router.route("/search?query=" + encodeURIComponent(
+      e.latlng.lat.toFixed(precision) + "," + e.latlng.lng.toFixed(precision)
+    ));
+  };
+
+  var context_directionsfrom = function(e){
+    var precision = OSM.zoomPrecision(map.getZoom());
+    OSM.router.route("/directions?" + querystring.stringify({
+      route: e.latlng.lat.toFixed(precision) + ',' + e.latlng.lng.toFixed(precision) + ';' + $('#route_to').val()
+    }));
+  }
+
+  var context_directionsto = function(e){
+    var precision = OSM.zoomPrecision(map.getZoom());
+    OSM.router.route("/directions?" + querystring.stringify({
+      route: $('#route_from').val() + ';' + e.latlng.lat.toFixed(precision) + ',' + e.latlng.lng.toFixed(precision)
+    }));
+  }
+
+  // TODO only allow this if zoomed in enough
+  var context_addnote = function(e){
+    // TODO this currently doesn't work correctly - I think the "route" needs to be chained to ensure it comes once the pan has finished.
+    map.panTo(e.latlng, {animate: false});
+    OSM.router.route('/note/new');
+  }
+
+  var context_centrehere = function(e){
+    map.panTo(e.latlng);
+  }
+
+  var context_queryhere = function(e) {
+    var precision = OSM.zoomPrecision(map.getZoom()),
+      latlng = e.latlng.wrap(),
+      lat = latlng.lat.toFixed(precision),
+      lng = latlng.lng.toFixed(precision);
+
+    OSM.router.route("/query?lat=" + lat + "&lon=" + lng);
+  }
+
+  // TODO internationalisation of the context menu strings
   var map = new L.OSM.Map("map", {
     zoomControl: false,
-    layerControl: false
+    layerControl: false,
+    contextmenu: true,
+    contextmenuWidth: 140,
+    contextmenuItems: [{
+        text: 'Directions from here',
+        callback: context_directionsfrom
+    }, {
+        text: 'Directions to here',
+        callback: context_directionsto
+    }, '-', {
+        text: 'Add a note here',
+        callback: context_addnote
+    }, {
+        text: 'Show address',
+        callback: context_describe
+    }, {
+        text: 'Query features',
+        callback: context_queryhere
+    }, {
+        text: 'Centre map here',
+        callback: context_centrehere
+    }]
+  });
+
+  $(document).on('mousedown', function(e){
+    if(e.shiftKey){
+      map.contextmenu.disable(); // on firefox, shift disables our contextmenu. we explicitly do this for all browsers.
+    }else{
+      map.contextmenu.enable();
+    }
   });
 
   map.attributionControl.setPrefix('');
@@ -148,7 +221,8 @@ $(document).ready(function () {
     }
   }
 
-  $('.leaflet-control .control-button').tooltip({placement: 'left', container: 'body'});
+  var placement = $('html').attr('dir') === 'rtl' ? 'right' : 'left';
+  $('.leaflet-control .control-button').tooltip({placement: placement, container: 'body'});
 
   var expiry = new Date();
   expiry.setYear(expiry.getFullYear() + 10);