You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@whimsical.apache.org by Sam Ruby <ru...@apache.org> on 2015/12/13 16:14:56 UTC

[whimsy.git] [33/37] Commit 5f38416: undo delete

Commit 5f384166f3378962eb0b4e0201d5b41031bbac2e:
    undo delete


Branch: refs/heads/secmail
Author: Sam Ruby <ru...@intertwingly.net>
Committer: Sam Ruby <ru...@intertwingly.net>
Pusher: rubys <ru...@apache.org>

------------------------------------------------------------
server.rb                                                    | +++++++++++++ -
views/index.js.rb                                            | ++++++++++++ -
------------------------------------------------------------
52 changes: 49 additions, 3 deletions.
------------------------------------------------------------


diff --git a/server.rb b/server.rb
index 1c565bc..403db29 100644
--- a/server.rb
+++ b/server.rb
@@ -23,14 +23,14 @@
   _json :index
 end
 
-# a single message
+# retrieve a single message
 get %r{^/(\d+)/(\w+)/$} do |month, hash|
   @message = Mailbox.new(month).headers[hash]
   pass unless @message
   _html :message
 end
 
-# a single message
+# mark a single message as deleted
 delete %r{^/(\d+)/(\w+)/$} do |month, hash|
   success = false
 
@@ -45,6 +45,30 @@
   _json success: true
 end
 
+# update a single message
+patch %r{^/(\d+)/(\w+)/$} do |month, hash|
+  success = false
+
+  Mailbox.update(month) do |headers|
+    if headers[hash]
+      updates = JSON.parse(request.env['rack.input'].read)
+
+      # special processing for entries with symbols as keys
+      headers[hash].each do |key, value|
+        if Symbol === key and updates.has_key? key.to_s
+          headers[hash][key] = updates.delete(key.to_s)
+        end
+      end
+
+      headers[hash].merge! updates
+      success = true
+    end
+  end
+
+  pass unless success
+  [204, {}, '']
+end
+
 # list of parts for a single message
 get %r{^/(\d+)/(\w+)/_index_$} do |month, hash|
   @message = Mailbox.new(month).headers[hash]
diff --git a/views/index.js.rb b/views/index.js.rb
index 7b3908e..1268941 100644
--- a/views/index.js.rb
+++ b/views/index.js.rb
@@ -41,6 +41,11 @@ def render
 
     _input.btn.btn_primary type: 'submit', value: 'fetch previous month',
       onClick: self.fetch_month
+
+    unless @undoStack.empty?
+      _input.btn.btn_info type: 'submit', value: 'undo delete',
+        onClick: self.undo
+    end
   end
 
   # initialize latest mailbox (year+month)
@@ -97,6 +102,20 @@ def nav(event)
     event.preventDefault()
   end
 
+  def undo(event)
+    @selected = @undoStack.pop()
+    selected = @messages.find {|m| return m.href == @selected}
+    if selected
+      selected.status = :deletePending
+
+      # send request to server to remove delete status
+      HTTP.patch(@selected, status: nil) do
+        delete selected.status
+        self.forceUpdate()
+      end
+    end
+  end
+
   # handle keyboard events
   def keydown(event)
     if event.keyCode == 38 # up
@@ -132,12 +151,15 @@ def keydown(event)
       # send request to server to perform delete
       HTTP.delete(selected) do
         index = @messages.findIndex {|m| return m.href == selected}
-        console.log index
         @messages[index].status = :deleted if index >= 0
         @undoStack << selected
         self.forceUpdate()
       end
 
+    elsif event.keyCode == 'Z'.ord
+      if event.ctrlKey or event.metaKey
+        self.undo() unless @undoStack.empty?
+      end
     else
       console.log "keydown: #{event.keyCode}"
     end