From: Tom Hughes Date: Sun, 12 Feb 2017 17:26:17 +0000 (+0000) Subject: Allow context menu to add notes without panning the map X-Git-Tag: live~3596^2 X-Git-Url: https://git.openstreetmap.org/rails.git/commitdiff_plain/8376a430b6e8fb3de96b66a05c36cb8ac67e9c59?ds=sidebyside Allow context menu to add notes without panning the map --- diff --git a/app/assets/javascripts/index/contextmenu.js b/app/assets/javascripts/index/contextmenu.js index 8a4654b97..1e7251ec6 100644 --- a/app/assets/javascripts/index/contextmenu.js +++ b/app/assets/javascripts/index/contextmenu.js @@ -30,9 +30,12 @@ OSM.initializeContextMenu = function (map) { map.contextmenu.addItem({ text: I18n.t("javascripts.context.add_note"), callback: function addNoteHere(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 precision = OSM.zoomPrecision(map.getZoom()), + latlng = e.latlng.wrap(), + lat = latlng.lat.toFixed(precision), + lng = latlng.lng.toFixed(precision); + + OSM.router.route("/note/new?lat=" + lat + "&lon=" + lng); } }); diff --git a/app/assets/javascripts/index/new_note.js b/app/assets/javascripts/index/new_note.js index 397daa637..53697e65b 100644 --- a/app/assets/javascripts/index/new_note.js +++ b/app/assets/javascripts/index/new_note.js @@ -77,7 +77,9 @@ OSM.NewNote = function(map) { } page.pushstate = page.popstate = function (path) { - OSM.loadSidebarContent(path, page.load); + OSM.loadSidebarContent(path, function () { + page.load(path); + }); }; function newHalo(loc, a) { @@ -97,7 +99,7 @@ OSM.NewNote = function(map) { } } - page.load = function () { + page.load = function (path) { if (addNoteButton.hasClass("disabled")) return; if (addNoteButton.hasClass("active")) return; @@ -105,12 +107,34 @@ OSM.NewNote = function(map) { map.addLayer(noteLayer); - var mapSize = map.getSize(); - var markerPosition; + var params = querystring.parse(path.substring(path.indexOf('?') + 1)); + var markerLatlng; + + if (params.lat && params.lon) { + markerLatlng = L.latLng(params.lat, params.lon); + + var markerPosition = map.latLngToContainerPoint(markerLatlng), + mapSize = map.getSize(), + panBy = L.point(0, 0); + + if (markerPosition.x < 50) { + panBy.x = markerPosition.x - 50; + } else if (markerPosition.x > mapSize.x - 50) { + panBy.x = 50 - mapSize.x + markerPosition.x; + } - markerPosition = [mapSize.x / 2, mapSize.y / 2]; + if (markerPosition.y < 50) { + panBy.y = markerPosition.y - 50; + } else if (markerPosition.y > mapSize.y - 50) { + panBy.y = 50 - mapSize.y + markerPosition.y; + } + + map.panBy(panBy); + } else { + markerLatlng = map.getCenter(); + } - newNote = L.marker(map.containerPointToLatLng(markerPosition), { + newNote = L.marker(markerLatlng, { icon: noteIcons["new"], opacity: 0.9, draggable: true