11import { EventEmitter , ElementRef } from '@angular/core' ;
2+ import { SuiTransition } from "../transition/transition" ;
23
3- const DISABLED = 'disabled' ;
4- const OUTSIDECLICK = 'outsideClick' ;
4+ const Disabled = 'disabled' ;
5+ const OutsideClick = 'outsideClick' ;
56
6- export const KEYCODE = {
7- LEFT : 37 ,
8- UP : 38 ,
9- RIGHT : 39 ,
10- DOWN : 40 ,
7+ export const KeyCode = {
8+ Left : 37 ,
9+ Up : 38 ,
10+ Right : 39 ,
11+ Down : 40 ,
1112
12- ESCAPE : 27 ,
13- ENTER : 13 ,
13+ Escape : 27 ,
14+ Enter : 13 ,
1415
15- BACKSPACE : 8
16+ Space : 32 ,
17+ Backspace : 8
1618} ;
1719
1820export class SuiDropdownService {
@@ -41,14 +43,28 @@ export class SuiDropdownService {
4143 public itemSelectedClass = "selected" ;
4244 public itemDisabledClass = "disabled" ;
4345
46+ // Transitions
47+ public transition :SuiTransition ;
48+ public isVisible :boolean ;
49+
4450 public get isOpen ( ) :boolean {
4551 return this . _isOpen ;
4652 }
4753
4854 public set isOpen ( value :boolean ) {
55+ if ( value == this . _isOpen ) { return ; }
4956 if ( this . isDisabled ) { value = false ; }
5057
5158 this . _isOpen = value ;
59+ if ( this . transition ) {
60+ this . isVisible = true ;
61+ this . transition . stopAll ( ) ;
62+ this . transition . animate ( {
63+ name : "slide down" ,
64+ duration : 200 ,
65+ callback : ( ) => this . isVisible = this . isOpen
66+ } ) ;
67+ }
5268
5369 if ( this . isOpen ) {
5470 this . bindDocumentEvents ( ) ;
@@ -84,7 +100,7 @@ export class SuiDropdownService {
84100
85101 private closeDropdown ( event :MouseEvent ) :void {
86102 //Never close the dropdown if autoClose is disabled
87- if ( event && this . autoClose === DISABLED ) {
103+ if ( event && this . autoClose === Disabled ) {
88104 return ;
89105 }
90106
@@ -108,7 +124,7 @@ export class SuiDropdownService {
108124 }
109125
110126 //Don't close the dropdown when clicking inside if autoClose is outsideClick
111- if ( event && this . autoClose === OUTSIDECLICK &&
127+ if ( event && this . autoClose === OutsideClick &&
112128 this . menuElement &&
113129 this . menuElement . nativeElement . contains ( event . target ) ) {
114130 return ;
@@ -119,14 +135,14 @@ export class SuiDropdownService {
119135 }
120136
121137 private keybindFilter ( event :KeyboardEvent ) :void {
122- if ( event . which === KEYCODE . ESCAPE ) {
138+ if ( event . which === KeyCode . Escape ) {
123139 this . isOpen = false ;
124140 return ;
125141 }
126142
127143 //noinspection TypeScriptUnresolvedFunction
128144 if ( this . isOpen &&
129- ( [ KEYCODE . ENTER , KEYCODE . UP , KEYCODE . RIGHT , KEYCODE . DOWN , KEYCODE . LEFT ]
145+ ( [ KeyCode . Enter , KeyCode . Up , KeyCode . Right , KeyCode . Down , KeyCode . Left ]
130146 . find ( keyCode => event . which == keyCode ) ) ) {
131147 event . preventDefault ( ) ;
132148 event . stopPropagation ( ) ;
@@ -150,26 +166,26 @@ export class SuiDropdownService {
150166 public keyPress ( keyCode :number ) :void {
151167 //noinspection FallThroughInSwitchStatementJS
152168 switch ( keyCode ) {
153- case KEYCODE . DOWN :
169+ case KeyCode . Down :
154170 this . selectNextItem ( ) ;
155171 break ;
156- case KEYCODE . UP :
172+ case KeyCode . Up :
157173 this . selectPreviousItem ( ) ;
158174 break ;
159- case KEYCODE . ENTER :
175+ case KeyCode . Enter :
160176 if ( this . selectedItem && ! this . selectedItem . hasAttribute ( "suiDropdown" ) ) {
161177 ( < HTMLElement > this . selectedItem ) . click ( ) ;
162178 this . selectedItem = null ;
163179 break ;
164180 }
165181 //Fall through on purpose! (So enter on a nested dropdown acts as right arrow)
166- case KEYCODE . RIGHT :
182+ case KeyCode . Right :
167183 if ( this . selectedItem && this . selectedItem . hasAttribute ( "suiDropdown" ) ) {
168184 ( < HTMLElement > this . selectedItem ) . click ( ) ;
169185 this . selectedItem = this . selectedItem . querySelector ( `.${ this . itemClass } :not(.${ this . itemDisabledClass } )` ) ;
170186 }
171187 break ;
172- case KEYCODE . LEFT :
188+ case KeyCode . Left :
173189 if ( this . selectedItem . parentElement != this . menuElement . nativeElement ) {
174190 ( < HTMLElement > this . selectedItem . parentElement . parentElement ) . click ( ) ;
175191 this . selectedItem = this . selectedItem . parentElement . parentElement ;
@@ -193,12 +209,16 @@ export class SuiDropdownService {
193209 }
194210
195211 public selectPreviousItem ( ) :void {
196- var previousItem = this . selectedItem . previousElementSibling ;
197- if ( previousItem ) {
198- this . selectedItem = previousItem ;
199- if ( this . selectedItem . classList . contains ( this . itemDisabledClass ) ) {
200- this . selectPreviousItem ( ) ;
212+ if ( this . selectedItem ) {
213+ var previousItem = this . selectedItem . previousElementSibling ;
214+ if ( previousItem ) {
215+ this . selectedItem = previousItem ;
216+ if ( this . selectedItem . classList . contains ( this . itemDisabledClass ) ) {
217+ this . selectPreviousItem ( ) ;
218+ }
201219 }
220+ return ;
202221 }
222+ this . selectNextItem ( ) ;
203223 }
204224}
0 commit comments