-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({
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,
- clickable: true
+ interactive: true
});
marker.id = feature.properties.id;
marker.addTo(noteLayer);
}
page.pushstate = page.popstate = function (path) {
- OSM.loadSidebarContent(path, page.load);
+ OSM.loadSidebarContent(path, function () {
+ page.load(path);
+ });
};
function newHalo(loc, a) {
- if (a == 'dragstart' && map.hasLayer(halo)) {
+ var hasHalo = halo && map.hasLayer(halo);
+
+ if (a === "dragstart" && hasHalo) {
map.removeLayer(halo);
} else {
- if (map.hasLayer(halo)) map.removeLayer(halo);
+ if (hasHalo) map.removeLayer(halo);
halo = L.circleMarker(loc, {
weight: 2.5,
}
}
- page.load = function () {
+ page.load = function (path) {
if (addNoteButton.hasClass("disabled")) return;
if (addNoteButton.hasClass("active")) return;
map.addLayer(noteLayer);
- var mapSize = map.getSize();
- var markerPosition;
+ var params = Qs.parse(path.substring(path.indexOf("?") + 1));
+ var markerLatlng;
- if (mapSize.y > 800) {
- markerPosition = [mapSize.x / 2, mapSize.y / 2];
- } else if (mapSize.y > 400) {
- markerPosition = [mapSize.x / 2, 400];
+ if (params.lat && params.lon) {
+ markerLatlng = L.latLng(params.lat, params.lon);
} else {
- markerPosition = [mapSize.x / 2, mapSize.y];
+ markerLatlng = map.getCenter();
}
- newNote = L.marker(map.containerPointToLatLng(markerPosition), {
- icon: noteIcons["new"],
+ map.panInside(markerLatlng, {
+ padding: [50, 50]
+ });
+
+ newNoteMarker = L.marker(markerLatlng, {
+ icon: noteIcons.new,
opacity: 0.9,
draggable: true
});
- newNote.on("dragstart dragend", function(a) {
- newHalo(newNote.getLatLng(), a.type);
+ newNoteMarker.on("dragstart dragend", function (a) {
+ newHalo(newNoteMarker.getLatLng(), a.type);
});
- newNote.addTo(noteLayer);
- newHalo(newNote.getLatLng());
+ newNoteMarker.addTo(noteLayer);
+ newHalo(newNoteMarker.getLatLng());
- newNote.on("remove", function () {
+ newNoteMarker.on("remove", function () {
addNoteButton.removeClass("active");
- }).on("dragstart",function () {
- $(newNote).stopTime("removenote");
}).on("dragend", function () {
content.find("textarea").focus();
});
$(e.target.form.add).prop("disabled", $(e.target).val() === "");
}
- content.find('input[type=submit]').on('click', function (e) {
+ content.find("input[type=submit]").on("click", function (e) {
+ const location = newNoteMarker.getLatLng().wrap();
+ const text = content.find("textarea").val();
+
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) => {
+ content.find("textarea").val("");
+ addCreatedNoteMarker(feature);
+ noteLayer.removeLayer(newNoteMarker);
+ newNoteMarker = null;
+ addNoteButton.removeClass("active");
+ OSM.router.route("/note/" + feature.properties.id);
+ });
});
return map.getState();
};
page.unload = function () {
- noteLayer.removeLayer(newNote);
- map.removeLayer(halo);
+ if (newNoteMarker) noteLayer.removeLayer(newNoteMarker);
+ if (halo) map.removeLayer(halo);
addNoteButton.removeClass("active");
};