1- import { Directive , HostBinding , ContentChild , forwardRef , Renderer , ElementRef , AfterContentInit , ContentChildren , QueryList , Input , HostListener } from '@angular/core' ;
1+ import { Directive , HostBinding , ContentChild , forwardRef , Renderer , ElementRef , AfterContentInit , ContentChildren , QueryList , Input , HostListener , ChangeDetectorRef } from '@angular/core' ;
22import { SuiTransition , Transition } from '../transition/transition' ;
33import { DropdownService , DropdownAutoCloseType } from './dropdown.service' ;
44import { TransitionController } from '../transition/transition-controller' ;
5- import { KeyCode } from '../util/util' ;
5+ import { KeyCode , AugmentedElement , HandledMouseEvent } from '../util/util' ;
66// Polyfill for IE
77import "element-closest" ;
88
9- interface AugmentedElement extends Element {
10- closest ( selector :string ) :AugmentedElement ;
11- }
12-
139@Directive ( {
1410 // We must attach to every '.item' as Angular doesn't support > selectors.
1511 selector : '.item'
@@ -122,8 +118,8 @@ export class SuiDropdownMenu extends SuiTransition implements AfterContentInit {
122118 @Input ( )
123119 public menuSelectedItemClass :string ;
124120
125- constructor ( renderer :Renderer , public element :ElementRef ) {
126- super ( renderer , element ) ;
121+ constructor ( renderer :Renderer , public element :ElementRef , changeDetector : ChangeDetectorRef ) {
122+ super ( renderer , element , changeDetector ) ;
127123
128124 // Initialise transition functionality.
129125 this . _transitionController = new TransitionController ( false ) ;
@@ -139,14 +135,16 @@ export class SuiDropdownMenu extends SuiTransition implements AfterContentInit {
139135 }
140136
141137 @HostListener ( "click" , [ "$event" ] )
142- public onClick ( e :MouseEvent ) {
143- e . stopPropagation ( ) ;
144-
145- if ( this . _service . autoCloseMode == DropdownAutoCloseType . ItemClick ) {
146- const target = e . target as AugmentedElement ;
147- if ( this . element . nativeElement . contains ( target . closest ( ".item" ) ) && ! / i n p u t | t e x t a r e a / i. test ( target . tagName ) ) {
148- // Once an item is selected, we can close the entire dropdown.
149- this . _service . setOpenState ( false , true ) ;
138+ public onClick ( e :HandledMouseEvent ) {
139+ if ( ! e . eventHandled ) {
140+ e . eventHandled = true ;
141+
142+ if ( this . _service . autoCloseMode == DropdownAutoCloseType . ItemClick ) {
143+ const target = e . target as AugmentedElement ;
144+ if ( this . element . nativeElement . contains ( target . closest ( ".item" ) ) && ! / i n p u t | t e x t a r e a / i. test ( target . tagName ) ) {
145+ // Once an item is selected, we can close the entire dropdown.
146+ this . _service . setOpenState ( false , true ) ;
147+ }
150148 }
151149 }
152150 }
@@ -157,22 +155,13 @@ export class SuiDropdownMenu extends SuiTransition implements AfterContentInit {
157155 this . _isOpenOnMousedown = this . _service . isOpen ;
158156 }
159157
160- @HostListener ( "document:click" , [ "$event" ] )
161- public onDocumentClick ( e :MouseEvent ) {
162- if ( this . _isOpenOnMousedown ) {
163- if ( this . _service . autoCloseMode == DropdownAutoCloseType . ItemClick || this . _service . autoCloseMode == DropdownAutoCloseType . OutsideClick ) {
164- // No need to reflect in parent since they are also bound to document.
165- this . _service . setOpenState ( false ) ;
166- }
167- }
168- }
169-
170158 @HostListener ( "document:keydown" , [ "$event" ] )
171159 public onDocumentKeydown ( e :KeyboardEvent ) {
172160 // Only the root dropdown (i.e. not nested dropdowns) is responsible for keeping track of the currently selected item.
173161 if ( this . _service . isOpen && ! this . _service . isNested ) {
174162 // Stop document events like scrolling while open.
175- if ( ( e . target as Element ) . tagName != "INPUT" || e . keyCode == KeyCode . Enter ) {
163+ const target = e . target as Element ;
164+ if ( ! / i n p u t / i. test ( target . tagName ) || e . keyCode == KeyCode . Enter ) {
176165 e . preventDefault ( ) ;
177166 }
178167
0 commit comments