]> git.openstreetmap.org Git - rails.git/blobdiff - app/assets/javascripts/notes.js.erb
Generate proper descriptions for notes
[rails.git] / app / assets / javascripts / notes.js.erb
index 72b7b21181ef44d17832a9e0f53dba984a55ef39..c55c11ec958d7315a9c32f080aa120e1e1d91f52 100644 (file)
@@ -1,12 +1,6 @@
-function addNoteLayer(map, notesUrl, newNoteControls, minZoom) {
+function addNoteLayer(map, notesUrl, newNoteControls, newNoteForm, minZoom) {
   var newNotes;
 
-  var noteCallback = function (scope, response) {
-    for (var f = 0; f < response.features.length; f++) {
-      var feature = response.features[f];
-    }
-  };
-
   var saveNewNotes = function (o) {
     var layer = o.object;
     newNotes = layer.getFeaturesByAttribute("status", "new")
@@ -19,20 +13,83 @@ function addNoteLayer(map, notesUrl, newNoteControls, minZoom) {
     newNotes = undefined;
   };
 
+  var describeNote = function (n) {
+    var description = "<h2>Note " + n.id + "</h2>";
+
+    n.comments.forEach(function (c) {
+      description += "<p><small class='deemphasize'>" + c.action + " by ";
+      description += c.user + " at " + c.date + "</small><br/>" + c.text + "</p>";
+    });
+
+    return description;
+  }
+
   var noteSelected = function (o) {
     var feature = o.feature;
     var location = feature.geometry.getBounds().getCenterLonLat();
+    var content;
+    var close;
+
+    if (feature.attributes.status === "new") {
+      var form = newNoteForm.clone();
+      form.removeClass("hidden");
+      content = form.html();
+      close = false;
+    } else {
+      content = describeNote(feature.attributes);
+      close = true;
+    };
 
     feature.popup = new OpenLayers.Popup.FramedCloud(
-      feature.attributes.id, location, null,
-      "<p>" + feature.attributes.id + "</p>",
-      null, 
-      feature.attributes.status !== "new",
+      feature.attributes.id, location, null, content, null, close,
       function (e) { map.noteSelector.unselect(feature) }
     );
 
     map.addPopup(feature.popup);
     // feature.popup.show();
+
+    $(feature.popup.contentDiv).find("textarea").autoGrow();
+
+    $(feature.popup.contentDiv).find("input#note-submit").click(function (e) {
+      var location = unproj(feature.geometry.getBounds().getCenterLonLat());
+      var form = $(e.target).parents("form").first();
+
+      $.ajax(form.prop("action"), {
+        type: form.prop("method"),
+        data: {
+          lon: location.lon,
+          lat: location.lat,
+          text: form.find("textarea#comment").val()
+        },
+        success: function (data) {
+          map.noteSelector.unselect(feature);
+
+          feature.attributes.status = "open";
+          feature.attributes.id = data;
+
+          map.noteLayer.drawFeature(feature);
+
+          map.noteMover.deactivate();
+        }
+      });
+
+      e.preventDefault();
+    });
+
+    $(feature.popup.contentDiv).find("input#note-cancel").click(function (e) {
+      feature.attributes.status = "cancelled";
+
+      map.noteSelector.unselect(feature);
+      map.noteLayer.removeFeatures(feature);
+
+      feature.destroy();
+
+      map.noteMover.deactivate();
+
+      e.preventDefault();
+    });
+
+    feature.popup.updateSize();
   };
 
   var noteUnselected = function (o) {
@@ -115,8 +172,7 @@ function addNoteLayer(map, notesUrl, newNoteControls, minZoom) {
     ],
     protocol: new OpenLayers.Protocol.HTTP({
       url: notesUrl,
-      format: new OpenLayers.Format.GeoJSON(),
-      callback: noteCallback
+      format: new OpenLayers.Format.GeoJSON()
     })
   });