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