X-Git-Url: https://git.openstreetmap.org./rails.git/blobdiff_plain/11af8512489b43c794d003e3cae945bb5793943e..0fa051fb40d30978325679bcfec2d128cc15e9e5:/app/assets/javascripts/index.js diff --git a/app/assets/javascripts/index.js b/app/assets/javascripts/index.js index 9e386d54b..496ab29b9 100644 --- a/app/assets/javascripts/index.js +++ b/app/assets/javascripts/index.js @@ -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,89 @@ $(document).ready(function () { var params = OSM.mapParams(); + // a separate js file would be nice for the context menu additions; however not clear if context menu can be added outside of context of map obj constructor + var context_describe = 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("/search?query=" + encodeURIComponent(lat + "," + lng)); + }; + + var context_directionsfrom = 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("/directions?" + querystring.stringify({ + route: lat + ',' + lng + ';' + $('#route_to').val() + })); + } + + var context_directionsto = 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("/directions?" + querystring.stringify({ + route: $('#route_from').val() + ';' + lat + ',' + lng + })); + } + + var context_addnote = function(e){ + // I'd like this, instead of panning, to pass a query parameter about where to place the marker + map.panTo(e.latlng.wrap(), {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(); + // we also decide whether to disable some options that only like high zoom + map.contextmenu.setDisabled(3, map.getZoom() < 12); + map.contextmenu.setDisabled(5, map.getZoom() < 14); + } }); map.attributionControl.setPrefix(''); @@ -148,7 +229,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);