From 1531fa973916e607e5e186e0702a7c3b8527648b Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Thu, 16 Feb 2017 11:21:04 +0900
Subject: [PATCH] [Client] Improve usability

---
 src/web/app/common/tags/messaging/index.tag | 140 ++++++++++++--------
 1 file changed, 84 insertions(+), 56 deletions(-)

diff --git a/src/web/app/common/tags/messaging/index.tag b/src/web/app/common/tags/messaging/index.tag
index 4b1bc6576a..f3785a8d1b 100644
--- a/src/web/app/common/tags/messaging/index.tag
+++ b/src/web/app/common/tags/messaging/index.tag
@@ -2,16 +2,14 @@
 	<div class="search">
 		<div class="form">
 			<label for="search-input"><i class="fa fa-search"></i></label>
-			<input ref="searchInput" type="search" oninput={ search } placeholder="ユーザーを探す"/>
+			<input ref="search" type="search" oninput={ search } onkeydown={ onSearchKeydown } placeholder="ユーザーを探す"/>
 		</div>
 		<div class="result">
-			<ol class="users" if={ searchResult.length > 0 }>
-				<li each={ user in searchResult }>
-					<a onclick={ user._click }>
-						<img class="avatar" src={ user.avatar_url + '?thumbnail&size=32' } alt=""/>
-						<span class="name">{ user.name }</span>
-						<span class="username">@{ user.username }</span>
-					</a>
+			<ol class="users" if={ searchResult.length > 0 } ref="searchResult">
+				<li each={ user, i in searchResult } onkeydown={ parent.onSearchResultKeydown.bind(null, i) } onclick={ user._click } tabindex="-1">
+					<img class="avatar" src={ user.avatar_url + '?thumbnail&size=32' } alt=""/>
+					<span class="name">{ user.name }</span>
+					<span class="username">@{ user.username }</span>
 				</li>
 			</ol>
 		</div>
@@ -113,56 +111,57 @@
 						list-style none
 
 						> li
-							> a
-								display inline-block
-								z-index 1
-								width 100%
-								padding 8px 32px
-								vertical-align top
-								white-space nowrap
-								overflow hidden
-								color rgba(0, 0, 0, 0.8)
-								text-decoration none
-								transition none
+							display inline-block
+							z-index 1
+							width 100%
+							padding 8px 32px
+							vertical-align top
+							white-space nowrap
+							overflow hidden
+							color rgba(0, 0, 0, 0.8)
+							text-decoration none
+							transition none
+							cursor pointer
 
-								&:hover
-									color #fff
-									background $theme-color
-
-									.name
-										color #fff
-
-									.username
-										color #fff
-
-								&:active
-									color #fff
-									background darken($theme-color, 10%)
-
-									.name
-										color #fff
-
-									.username
-										color #fff
-
-								.avatar
-									vertical-align middle
-									min-width 32px
-									min-height 32px
-									max-width 32px
-									max-height 32px
-									margin 0 8px 0 0
-									border-radius 6px
+							&:hover
+							&:focus
+								color #fff
+								background $theme-color
 
 								.name
-									margin 0 8px 0 0
-									/*font-weight bold*/
-									font-weight normal
-									color rgba(0, 0, 0, 0.8)
+									color #fff
 
 								.username
-									font-weight normal
-									color rgba(0, 0, 0, 0.3)
+									color #fff
+
+							&:active
+								color #fff
+								background darken($theme-color, 10%)
+
+								.name
+									color #fff
+
+								.username
+									color #fff
+
+							.avatar
+								vertical-align middle
+								min-width 32px
+								min-height 32px
+								max-width 32px
+								max-height 32px
+								margin 0 8px 0 0
+								border-radius 6px
+
+							.name
+								margin 0 8px 0 0
+								/*font-weight bold*/
+								font-weight normal
+								color rgba(0, 0, 0, 0.8)
+
+							.username
+								font-weight normal
+								color rgba(0, 0, 0, 0.3)
 
 
 			> .history
@@ -274,8 +273,7 @@
 					> .result
 						> .users
 							> li
-								> a
-									padding 8px 16px
+								padding 8px 16px
 
 				> .history
 					> a
@@ -310,12 +308,13 @@
 				console.error err
 
 		@search = ~>
-			q = @refs.search-input.value
+			q = @refs.search.value
 			if q == ''
 				@search-result = []
 			else
 				@api \users/search do
 					query: q
+					max: 5
 				.then (users) ~>
 					users.for-each (user) ~>
 						user._click = ~>
@@ -325,5 +324,34 @@
 					@update!
 				.catch (err) ~>
 					console.error err
+
+		@on-search-keydown = (e) ~>
+			key = e.which
+			switch (key)
+				| 9, 40 => # Key[TAB] or Key[↓]
+					e.prevent-default!
+					e.stop-propagation!
+					@refs.search-result.child-nodes[0].focus!
+
+		@on-search-result-keydown = (i, e) ~>
+			key = e.which
+			switch (key)
+				| 10, 13 => # Key[ENTER]
+					e.prevent-default!
+					e.stop-propagation!
+					@search-result[i]._click!
+				| 27 => # Key[ESC]
+					e.prevent-default!
+					e.stop-propagation!
+					@refs.search.focus!
+				| 38 => # Key[↑]
+					e.prevent-default!
+					e.stop-propagation!
+					(@refs.search-result.child-nodes[i].previous-element-sibling || @refs.search-result.child-nodes[@search-result.length - 1]).focus!
+				| 9, 40 => # Key[TAB] or Key[↓]
+					e.prevent-default!
+					e.stop-propagation!
+					(@refs.search-result.child-nodes[i].next-element-sibling || @refs.search-result.child-nodes[0]).focus!
+
 	</script>
 </mk-messaging>