openstreetmap-website/app/assets/javascripts/index/new_note.js
2022-04-18 14:10:06 +01:00

171 lines
3.9 KiB
JavaScript

//= require qs/dist/qs
OSM.NewNote = function (map) {
var noteLayer = map.noteLayer,
content = $("#sidebar_content"),
page = {},
addNoteButton = $(".control-note .control-button"),
newNote,
halo;
var noteIcons = {
"new": L.icon({
iconUrl: OSM.NEW_NOTE_MARKER,
iconSize: [25, 40],
iconAnchor: [12, 40]
}),
"open": L.icon({
iconUrl: OSM.OPEN_NOTE_MARKER,
iconSize: [25, 40],
iconAnchor: [12, 40]
}),
"closed": L.icon({
iconUrl: OSM.CLOSED_NOTE_MARKER,
iconSize: [25, 40],
iconAnchor: [12, 40]
})
};
addNoteButton.on("click", function (e) {
e.preventDefault();
e.stopPropagation();
if ($(this).hasClass("disabled")) return;
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);
$.ajax({
url: url,
type: "POST",
oauth: true,
data: {
lat: location.lat,
lon: location.lng,
text: $(form.text).val()
},
success: function (feature) {
noteCreated(feature, marker);
}
});
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) {
var marker = L.marker(feature.geometry.coordinates.reverse(), {
icon: noteIcons[feature.properties.status],
opacity: 0.9,
interactive: true
});
marker.id = feature.properties.id;
marker.addTo(noteLayer);
return marker;
}
page.pushstate = page.popstate = function (path) {
OSM.loadSidebarContent(path, function () {
page.load(path);
});
};
function newHalo(loc, a) {
var hasHalo = halo && map.hasLayer(halo)
if (a === "dragstart" && hasHalo) {
map.removeLayer(halo);
} else {
if (hasHalo) map.removeLayer(halo);
halo = L.circleMarker(loc, {
weight: 2.5,
radius: 20,
fillOpacity: 0.5,
color: "#FF6200"
});
map.addLayer(halo);
}
}
page.load = function (path) {
if (addNoteButton.hasClass("disabled")) return;
if (addNoteButton.hasClass("active")) return;
addNoteButton.addClass("active");
map.addLayer(noteLayer);
var params = Qs.parse(path.substring(path.indexOf("?") + 1));
var markerLatlng;
if (params.lat && params.lon) {
markerLatlng = L.latLng(params.lat, params.lon);
} else {
markerLatlng = map.getCenter();
}
map.panInside(markerLatlng, {
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();
});
content.find("textarea")
.on("input", disableWhenBlank)
.focus();
function disableWhenBlank(e) {
$(e.target.form.add).prop("disabled", $(e.target).val() === "");
}
content.find("input[type=submit]").on("click", function (e) {
e.preventDefault();
createNote(newNote, e.target.form, "/api/0.6/notes.json");
});
return map.getState();
};
page.unload = function () {
if (newNote) noteLayer.removeLayer(newNote);
if (halo) map.removeLayer(halo);
addNoteButton.removeClass("active");
};
return page;
};