Add support for creating new notes
authorTom Hughes <tom@compton.nu>
Fri, 21 Sep 2012 08:05:56 +0000 (09:05 +0100)
committerTom Hughes <tom@compton.nu>
Sun, 23 Sep 2012 14:05:03 +0000 (15:05 +0100)
app/assets/javascripts/notes.js.erb
app/views/notes/_new.html.erb [new file with mode: 0644]
app/views/site/index.html.erb

index 72b7b21181ef44d17832a9e0f53dba984a55ef39..4df32264c35068d1d855a39ce4a206f4883d2cff 100644 (file)
@@ -1,4 +1,4 @@
-function addNoteLayer(map, notesUrl, newNoteControls, minZoom) {
+function addNoteLayer(map, notesUrl, newNoteControls, newNoteForm, minZoom) {
   var newNotes;
 
   var noteCallback = function (scope, response) {
@@ -22,17 +22,69 @@ function addNoteLayer(map, notesUrl, newNoteControls, minZoom) {
   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 = "<p>" + feature.attributes.id + "</p>";
+      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) {
diff --git a/app/views/notes/_new.html.erb b/app/views/notes/_new.html.erb
new file mode 100644 (file)
index 0000000..8a34093
--- /dev/null
@@ -0,0 +1,12 @@
+<p>
+  Move the marker to the correct position and<br/>
+  describe the problem in the box below:
+</p>
+<%= form_tag notes_path do %>
+  <%= hidden_field_tag "lon" %>
+  <%= hidden_field_tag "lat" %>
+  <%= text_area_tag "comment", "", :cols => 40, :rows => 10 %>
+  <br/>
+  <%= submit_tag "Submit", :id => "note-submit" %>
+  <%= submit_tag "Cancel", :id => "note-cancel" %>
+<% end %>
index 58bc59c204b53cc3e6c252e627eb24476687b923..d613754f23021db05f31ac99b128cc8a7e86c0a4 100644 (file)
@@ -45,6 +45,8 @@
   </table>
 </div>
 
+<div id="new-note" class="hidden"><%= render :partial => "notes/new" %></div>
+
 <script type="text/javascript">
   var marker;
   var map;
@@ -64,7 +66,7 @@
       });
       map.addLayer(map.dataLayer);
 
-      map.noteLayer = addNoteLayer(map, "<%= notes_url :format => 'json' %>", $("#createnoteanchor"), 11);
+      map.noteLayer = addNoteLayer(map, "<%= notes_url :format => 'json' %>", $("#createnoteanchor"), $("#new-note"), 11);
 
       <% if params[:notes] == "yes" -%>
       map.noteLayer.setVisibility(true);