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:54 UTC
[whimsy.git] [23/37] Commit 1adbf5d: rough in keyboard logic
Commit 1adbf5d3198189365dd761700f767c1aa4edd5c6:
rough in keyboard logic
Branch: refs/heads/secmail
Author: Sam Ruby <ru...@intertwingly.net>
Committer: Sam Ruby <ru...@intertwingly.net>
Pusher: rubys <ru...@apache.org>
------------------------------------------------------------
views/index.html.rb | ++++
views/index.js.rb | +++++++ ---
------------------------------------------------------------
77 changes: 58 additions, 19 deletions.
------------------------------------------------------------
diff --git a/views/index.html.rb b/views/index.html.rb
index 4d9e96e..554e5c6 100644
--- a/views/index.html.rb
+++ b/views/index.html.rb
@@ -4,6 +4,10 @@
padding-right: 7px;
padding-left: 7px;
}
+
+ .selected {
+ background-color: yellow
+ }
}
_div.index!
diff --git a/views/index.js.rb b/views/index.js.rb
index 53accf2..cafe71c 100644
--- a/views/index.js.rb
+++ b/views/index.js.rb
@@ -1,28 +1,33 @@
+#
+# Index page showing unprocessed messages with attachments
+#
+
class Index < React
def initialize
+ @selected = nil
@messages = []
end
def render
_table do
_thead do
- _tr do
- _th 'Timestamp'
- _th 'From'
- _th 'Subject'
- end
+ _tr do
+ _th 'Timestamp'
+ _th 'From'
+ _th 'Subject'
+ end
end
_tbody do
- @messages.each do |messsage|
- _tr do
- _td do
- _a messsage.time, href: "#{messsage.href}"
- end
- _td messsage.from
- _td messsage.subject
- end
- end
+ @messages.each do |message|
+ _tr class: ('selected' if message.href == @selected) do
+ _td do
+ _a message.time, href: "#{message.href}"
+ end
+ _td message.from
+ _td message.subject
+ end
+ end
end
end
@@ -30,14 +35,26 @@ def render
onClick: self.fetch
end
+ # initialize latest mailbox (year+month)
def componentWillMount()
@latest = @@mbox
end
+ # on initial load, fetch latest mailbox and subscribe to keyboard events
def componentDidMount()
self.fetch()
+ window.onkeydown = self.keydown
+ end
+
+ # when content changes, scroll to selected message
+ def componentDidUpdate()
+ if @selected
+ selected = document.querySelector("a[href='#{@selected}']")
+ selected.scrollIntoView() if selected
+ end
end
+ # fetch a month's worth of messages
def fetch()
# build JSON post XMLHttpRequest
xhr = XMLHttpRequest.new()
@@ -48,16 +65,34 @@ def fetch()
# process response
def xhr.onreadystatechange()
if xhr.readyState == 4
- response = xhr.response.json
+ response = xhr.response.json
- # update latest mbox
- @latest = response.mbox if response.mbox
+ # update latest mbox
+ @latest = response.mbox if response.mbox
- # add messages to list
- @messages = @messages.concat(*response.messages)
+ # add messages to list
+ @messages = @messages.concat(*response.messages)
+
+ # select oldest message
+ @selected = @messages.last.href
end
end
xhr.send(JSON.stringify mbox: @latest)
end
+
+ # handle keyboard events
+ def keydown(event)
+ if event.keyCode == 38 # up
+ index = @messages.findIndex {|m| return m.href == @selected}
+ @selected = @messages[index-1].href if index > 0
+ event.preventDefault()
+ elsif event.keyCode == 40 # down
+ index = @messages.findIndex {|m| return m.href == @selected}
+ @selected = @messages[index+1].href if index < @messages.length-1
+ event.preventDefault()
+ else
+ alert event.keyCode
+ end
+ end
end