X-Git-Url: https://git.openstreetmap.org./rails.git/blobdiff_plain/4b0fed0aa43651026fb4efa39c0409171942e608..17323257685bf5134d9286f5baefaddcae65478c:/app/assets/javascripts/index/new_note.js?ds=sidebyside diff --git a/app/assets/javascripts/index/new_note.js b/app/assets/javascripts/index/new_note.js index fa2872f45..4f38f8b55 100644 --- a/app/assets/javascripts/index/new_note.js +++ b/app/assets/javascripts/index/new_note.js @@ -1,10 +1,12 @@ -OSM.NewNote = function(map) { +//= require qs/dist/qs + +OSM.NewNote = function (map) { var noteLayer = map.noteLayer, - content = $('#sidebar_content'), - page = {}, - addNoteButton = $(".control-note .control-button"), - newNote, - halo; + content = $("#sidebar_content"), + page = {}, + addNoteButton = $(".control-note .control-button"), + newNoteMarker, + halo; var noteIcons = { "new": L.icon({ @@ -28,44 +30,26 @@ OSM.NewNote = function(map) { e.preventDefault(); e.stopPropagation(); - if ($(this).hasClass('disabled')) return; + if ($(this).hasClass("disabled")) return; - OSM.router.route('/note/new'); + OSM.router.route("/note/new"); }); - function createNote(marker, form, url) { - var location = marker.getLatLng().wrap(); - - marker.options.draggable = false; - marker.dragging.disable(); - - $(form).find("input[type=submit]").prop("disabled", true); - + function createNote(location, text, callback) { $.ajax({ - url: url, + url: "/api/0.6/notes.json", type: "POST", oauth: true, data: { lat: location.lat, lon: location.lng, - text: $(form.text).val() + text }, - success: function (feature) { - noteCreated(feature, marker); - } + success: callback }); - - function noteCreated(feature, marker) { - content.find("textarea").val(""); - updateMarker(feature); - newNote = null; - noteLayer.removeLayer(marker); - addNoteButton.removeClass("active"); - OSM.router.route('/note/' + feature.properties.id); - } } - function updateMarker(feature) { + function addCreatedNoteMarker(feature) { var marker = L.marker(feature.geometry.coordinates.reverse(), { icon: noteIcons[feature.properties.status], opacity: 0.9, @@ -73,41 +57,83 @@ OSM.NewNote = function(map) { }); marker.id = feature.properties.id; marker.addTo(noteLayer); - return marker; } - page.pushstate = page.popstate = function (path) { - OSM.loadSidebarContent(path, function () { - page.load(path); + function addHalo(latlng) { + if (halo) map.removeLayer(halo); + + halo = L.circleMarker(latlng, { + weight: 2.5, + radius: 20, + fillOpacity: 0.5, + color: "#FF6200" }); - }; - function newHalo(loc, a) { - if (a === 'dragstart' && map.hasLayer(halo)) { - map.removeLayer(halo); - } else { - if (map.hasLayer(halo)) map.removeLayer(halo); + map.addLayer(halo); + } - halo = L.circleMarker(loc, { - weight: 2.5, - radius: 20, - fillOpacity: 0.5, - color: "#FF6200" - }); + function removeHalo() { + if (halo) map.removeLayer(halo); + halo = null; + } - map.addLayer(halo); - } + function addNewNoteMarker(latlng) { + if (newNoteMarker) map.removeLayer(newNoteMarker); + + newNoteMarker = L.marker(latlng, { + icon: noteIcons.new, + opacity: 0.9, + draggable: true + }); + + newNoteMarker.on("dragstart dragend", function (a) { + removeHalo(); + if (a.type === "dragend") { + addHalo(newNoteMarker.getLatLng()); + } + }); + + newNoteMarker.addTo(map); + addHalo(newNoteMarker.getLatLng()); + + newNoteMarker.on("dragend", function () { + content.find("textarea").focus(); + }); } - page.load = function (path) { - if (addNoteButton.hasClass("disabled")) return; - if (addNoteButton.hasClass("active")) return; + function removeNewNoteMarker() { + removeHalo(); + if (newNoteMarker) map.removeLayer(newNoteMarker); + newNoteMarker = null; + } + + function moveNewNotMarkerToClick(e) { + if (newNoteMarker) newNoteMarker.setLatLng(e.latlng); + if (halo) halo.setLatLng(e.latlng); + content.find("textarea").focus(); + } + + function updateControls() { + const zoomedOut = addNoteButton.hasClass("disabled"); + const withoutText = content.find("textarea").val() === ""; + + content.find("#new-note-zoom-warning").prop("hidden", !zoomedOut); + content.find("input[type=submit]").prop("disabled", zoomedOut || withoutText); + if (newNoteMarker) newNoteMarker.setOpacity(zoomedOut ? 0.5 : 0.9); + } + + page.pushstate = page.popstate = function (path) { + OSM.loadSidebarContent(path, function () { + page.load(path); + }); + }; + page.load = function (path) { addNoteButton.addClass("active"); map.addLayer(noteLayer); - var params = querystring.parse(path.substring(path.indexOf('?') + 1)); + var params = Qs.parse(path.substring(path.indexOf("?") + 1)); var markerLatlng; if (params.lat && params.lon) { @@ -120,46 +146,43 @@ OSM.NewNote = function(map) { padding: [50, 50] }); - newNote = L.marker(markerLatlng, { - icon: noteIcons["new"], - opacity: 0.9, - draggable: true - }); - - newNote.on("dragstart dragend", function(a) { - newHalo(newNote.getLatLng(), a.type); - }); - - newNote.addTo(noteLayer); - newHalo(newNote.getLatLng()); - - newNote.on("remove", function () { - addNoteButton.removeClass("active"); - }).on("dragstart",function () { - $(newNote).stopTime("removenote"); - }).on("dragend", function () { - content.find("textarea").focus(); - }); + addNewNoteMarker(markerLatlng); content.find("textarea") - .on("input", disableWhenBlank) + .on("input", updateControls) .focus(); - function disableWhenBlank(e) { - $(e.target.form.add).prop("disabled", $(e.target).val() === ""); - } + content.find("input[type=submit]").on("click", function (e) { + const location = newNoteMarker.getLatLng().wrap(); + const text = content.find("textarea").val(); - content.find('input[type=submit]').on('click', function (e) { e.preventDefault(); - createNote(newNote, e.target.form, '/api/0.6/notes.json'); + $(this).prop("disabled", true); + newNoteMarker.options.draggable = false; + newNoteMarker.dragging.disable(); + + createNote(location, text, (feature) => { + if (typeof OSM.user === "undefined") { + var anonymousNotesCount = Number(Cookies.get("_osm_anonymous_notes_count")) || 0; + Cookies.set("_osm_anonymous_notes_count", anonymousNotesCount + 1, { secure: true, expires: 30, path: "/", samesite: "lax" }); + } + content.find("textarea").val(""); + addCreatedNoteMarker(feature); + OSM.router.route("/note/" + feature.properties.id); + }); }); + map.on("click", moveNewNotMarkerToClick); + addNoteButton.on("disabled enabled", updateControls); + updateControls(); + return map.getState(); }; page.unload = function () { - noteLayer.removeLayer(newNote); - map.removeLayer(halo); + map.off("click", moveNewNotMarkerToClick); + addNoteButton.off("disabled enabled", updateControls); + removeNewNoteMarker(); addNoteButton.removeClass("active"); };