X-Git-Url: https://git.openstreetmap.org./rails.git/blobdiff_plain/4b43396ede248f97560b059ef202c7fa26d63947..HEAD:/app/assets/javascripts/index/note.js diff --git a/app/assets/javascripts/index/note.js b/app/assets/javascripts/index/note.js index 3973420bd..b9310a1af 100644 --- a/app/assets/javascripts/index/note.js +++ b/app/assets/javascripts/index/note.js @@ -1,9 +1,8 @@ OSM.Note = function (map) { - var content = $('#sidebar_content'), - page = {}, - halo, currentNote; + const content = $("#sidebar_content"), + page = {}; - var noteIcons = { + const noteIcons = { "new": L.icon({ iconUrl: OSM.NEW_NOTE_MARKER, iconSize: [25, 40], @@ -21,94 +20,97 @@ OSM.Note = function (map) { }) }; - function updateNote(form, method, url) { - $(form).find("input[type=submit]").prop("disabled", true); - - $.ajax({ - url: url, - type: method, - oauth: true, - data: {text: $(form.text).val()}, - success: function () { - OSM.loadSidebarContent(window.location.pathname, page.load); - } - }); - } - - page.pushstate = page.popstate = function (path) { - OSM.loadSidebarContent(path, function() { - initialize(function() { - var data = $('.details').data(), - latLng = L.latLng(data.coordinates.split(',')); - if (!map.getBounds().contains(latLng)) moveToNote(); - }); + page.pushstate = page.popstate = function (path, id) { + OSM.loadSidebarContent(path, function () { + const data = $(".details").data(); + if (!data) return; + const latLng = L.latLng(data.coordinates.split(",")); + initialize(path, id, map.getBounds().contains(latLng)); }); }; - page.load = function() { - initialize(moveToNote); + page.load = function (path, id) { + initialize(path, id); }; - function initialize(callback) { - content.find("input[type=submit]").on("click", function (e) { + function initialize(path, id, skipMoveToNote) { + content.find("button[name]").on("click", function (e) { e.preventDefault(); - var data = $(e.target).data(); - updateNote(e.target.form, data.method, data.url); - }); - - content.find("textarea").on("input", function (e) { - var form = e.target.form; + const { url, method } = $(e.target).data(), + name = $(e.target).attr("name"), + data = new URLSearchParams(); + content.find("button[name]").prop("disabled", true); - if ($(e.target).val() === "") { - $(form.close).val(I18n.t("javascripts.notes.show.resolve")); - $(form.comment).prop("disabled", true); - } else { - $(form.close).val(I18n.t("javascripts.notes.show.comment_and_resolve")); - $(form.comment).prop("disabled", false); + if (name !== "subscribe" && name !== "unsubscribe" && name !== "reopen") { + data.set("text", content.find("textarea").val()); } - }); - content.find("textarea").val('').trigger("input"); + fetch(url, { + method: method, + headers: { ...OSM.oauth }, + body: data + }) + .then(response => { + if (response.ok) return response; + return response.text().then(text => { + throw new Error(text); + }); + }) + .then(() => { + OSM.loadSidebarContent(path, () => { + initialize(path, id, false); + }); + }) + .catch(error => { + content.find("#comment-error") + .text(error.message) + .prop("hidden", false) + .get(0).scrollIntoView({ block: "nearest" }); + updateButtons(); + }); + }); - var data = $('.details').data(), - latLng = L.latLng(data.coordinates.split(',')); + content.find("textarea").on("input", function (e) { + updateButtons(e.target.form); + }); - if (!map.hasLayer(halo)) { - halo = L.circleMarker(latLng, { - weight: 2.5, - radius: 20, - fillOpacity: 0.5, - color: "#FF6200" + content.find("textarea").val("").trigger("input"); + + const data = $(".details").data(); + + if (data) { + const hashParams = OSM.parseHash(window.location.hash); + map.addObject({ + type: "note", + id: parseInt(id, 10), + latLng: L.latLng(data.coordinates.split(",")), + icon: noteIcons[data.status] + }, function () { + if (!hashParams.center && !skipMoveToNote) { + const latLng = L.latLng(data.coordinates.split(",")); + OSM.router.withoutMoveListener(function () { + map.setView(latLng, 15, { reset: true }); + }); + } }); - map.addLayer(halo); } - - if (map.hasLayer(currentNote)) map.removeLayer(currentNote); - currentNote = L.marker(latLng, { - icon: noteIcons[data.status], - opacity: 1, - interactive: true - }); - - map.addLayer(currentNote); - - if (callback) callback(); } - function moveToNote() { - var data = $('.details').data(), - latLng = L.latLng(data.coordinates.split(',')); + function updateButtons() { + const resolveButton = content.find("button[name='close']"); + const commentButton = content.find("button[name='comment']"); - if (!window.location.hash || window.location.hash.match(/^#?c[0-9]+$/)) { - OSM.router.withoutMoveListener(function () { - map.setView(latLng, 15, {reset: true}); - }); + content.find("button[name]").prop("disabled", false); + if (content.find("textarea").val() === "") { + resolveButton.text(resolveButton.data("defaultActionText")); + commentButton.prop("disabled", true); + } else { + resolveButton.text(resolveButton.data("commentActionText")); } } page.unload = function () { - if (map.hasLayer(halo)) map.removeLayer(halo); - if (map.hasLayer(currentNote)) map.removeLayer(currentNote); + map.removeObject(); }; return page;