@@ -62,12 +62,13 @@ angular.module('ui.bootstrap.dropdown', ['ui.bootstrap.position'])
62
62
63
63
. controller ( 'DropdownController' , [ '$scope' , '$attrs' , '$parse' , 'dropdownConfig' , 'dropdownService' , '$animate' , '$position' , '$document' , function ( $scope , $attrs , $parse , dropdownConfig , dropdownService , $animate , $position , $document ) {
64
64
var self = this ,
65
- scope = $scope . $new ( ) , // create a child scope so we are not polluting original one
66
- openClass = dropdownConfig . openClass ,
67
- getIsOpen ,
68
- setIsOpen = angular . noop ,
69
- toggleInvoker = $attrs . onToggle ? $parse ( $attrs . onToggle ) : angular . noop ,
70
- appendToBody = false ;
65
+ scope = $scope . $new ( ) , // create a child scope so we are not polluting original one
66
+ openClass = dropdownConfig . openClass ,
67
+ getIsOpen ,
68
+ setIsOpen = angular . noop ,
69
+ toggleInvoker = $attrs . onToggle ? $parse ( $attrs . onToggle ) : angular . noop ,
70
+ appendToBody = false ,
71
+ selectedOption = null ;
71
72
72
73
this . init = function ( element ) {
73
74
self . $element = element ;
@@ -135,6 +136,7 @@ angular.module('ui.bootstrap.dropdown', ['ui.bootstrap.position'])
135
136
dropdownService . open ( scope ) ;
136
137
} else {
137
138
dropdownService . close ( scope ) ;
139
+ self . selectedOption = 0 ;
138
140
}
139
141
140
142
setIsOpen ( $scope , isOpen ) ;
@@ -174,6 +176,42 @@ angular.module('ui.bootstrap.dropdown', ['ui.bootstrap.position'])
174
176
} ;
175
177
} )
176
178
179
+ . directive ( 'keyboardNav' , function ( ) {
180
+ return {
181
+ restrict : 'A' ,
182
+ require : '?^dropdown' ,
183
+ link : function ( scope , element , attrs , dropdownCtrl ) {
184
+
185
+ element . bind ( 'keydown' , function ( e ) {
186
+
187
+ e . preventDefault ( ) ;
188
+ e . stopPropagation ( ) ;
189
+
190
+ var elems = angular . element ( element ) . find ( 'a' ) ;
191
+ switch ( e . keyCode ) {
192
+ case ( 40 ) : // Down
193
+ {
194
+
195
+ if ( ! angular . isNumber ( dropdownCtrl . selectedOption ) ) {
196
+ dropdownCtrl . selectedOption = 0 ;
197
+ } else {
198
+ dropdownCtrl . selectedOption = ( dropdownCtrl . selectedOption === elems . length - 1 ? dropdownCtrl . selectedOption : dropdownCtrl . selectedOption + 1 ) ;
199
+ }
200
+
201
+ }
202
+ break ;
203
+ case ( 38 ) : // Up
204
+ {
205
+ dropdownCtrl . selectedOption = ( dropdownCtrl . selectedOption === 0 ? 0 : dropdownCtrl . selectedOption - 1 ) ;
206
+ }
207
+ break ;
208
+ }
209
+ elems [ dropdownCtrl . selectedOption ] . focus ( ) ;
210
+ } ) ;
211
+ }
212
+ } ;
213
+ } )
214
+
177
215
. directive ( 'dropdownToggle' , function ( ) {
178
216
return {
179
217
require : '?^dropdown' ,
0 commit comments