1- import {
2- AfterContentInit ,
3- Directive ,
4- ElementRef ,
5- HostBinding ,
6- HostListener ,
7- Input ,
8- OnChanges ,
9- Optional ,
10- Renderer2 ,
11- SimpleChanges
12- } from '@angular/core' ;
1+ import { Directive , HostBinding , HostListener , Input , Optional } from '@angular/core' ;
132import { DropdownService } from '../dropdown.service' ;
143import { DropdownComponent } from '../dropdown/dropdown.component' ;
154
165@Directive ( {
176 selector : '[cDropdownItem]' ,
187 exportAs : 'cDropdownItem'
198} )
20- export class DropdownItemDirective implements AfterContentInit , OnChanges {
9+ export class DropdownItemDirective {
2110 /**
2211 * Set active state to a dropdown-item.
12+ * @type boolean
13+ * @default undefined
2314 */
2415 @Input ( ) active ?: boolean ;
16+ /**
17+ * Configure dropdown-item close dropdown behavior.
18+ * @type boolean
19+ * @default true
20+ */
21+ @Input ( ) autoClose : boolean = true ;
2522 /**
2623 * Disables a dropdown-item.
24+ * @type boolean
25+ * @default undefined
2726 */
2827 @Input ( ) disabled ?: boolean ;
2928
3029 constructor (
31- private renderer : Renderer2 ,
32- private hostElement : ElementRef ,
3330 private dropdownService : DropdownService ,
3431 @Optional ( ) public dropdown ?: DropdownComponent
3532 ) {
@@ -45,32 +42,38 @@ export class DropdownItemDirective implements AfterContentInit, OnChanges {
4542 return {
4643 'dropdown-item' : true ,
4744 active : this . active ,
48- disabled : this . disabled ,
45+ disabled : this . disabled
4946 } ;
5047 }
5148
52- @HostListener ( 'click' , [ '$event' ] )
53- public onClick ( $event : MouseEvent ) : void {
54- this . dropdownService . toggle ( { visible : 'toggle' , dropdown : this . dropdown } ) ;
49+ @HostBinding ( 'attr.tabindex' )
50+ @Input ( )
51+ set tabIndex ( value : string | number | null ) {
52+ this . _tabIndex = value ;
5553 }
54+ get tabIndex ( ) {
55+ return this . disabled ? '-1' : this . _tabIndex ;
56+ }
57+ private _tabIndex : string | number | null = null ;
5658
57- ngAfterContentInit ( ) : void {
58- this . setAttributes ( this . hostElement ) ;
59+ @HostBinding ( 'attr.aria-disabled' )
60+ get isDisabled ( ) : boolean | null {
61+ return this . disabled || null ;
5962 }
6063
61- ngOnChanges ( changes : SimpleChanges ) : void {
62- if ( changes [ 'disabled' ] ) {
63- this . setAttributes ( this . hostElement ) ;
64+ @HostListener ( 'click' , [ '$event' ] )
65+ private onClick ( $event : MouseEvent ) : void {
66+ if ( this . autoClose ) {
67+ this . dropdownService . toggle ( { visible : 'toggle' , dropdown : this . dropdown } ) ;
6468 }
6569 }
6670
67- setAttributes ( element : any ) : void {
68- if ( this . disabled ) {
69- this . renderer . setAttribute ( element . nativeElement , 'aria-disabled' , 'true' ) ;
70- this . renderer . setAttribute ( element . nativeElement , 'tabindex' , '-1' ) ;
71- } else {
72- this . renderer . removeAttribute ( element . nativeElement , 'aria-disabled' ) ;
73- this . renderer . removeAttribute ( element . nativeElement , 'tabindex' ) ;
71+ @HostListener ( 'keyup' , [ '$event' ] )
72+ private onKeyUp ( $event : KeyboardEvent ) : void {
73+ if ( $event . key === 'Enter' ) {
74+ if ( this . autoClose ) {
75+ this . dropdownService . toggle ( { visible : false , dropdown : this . dropdown } ) ;
76+ }
7477 }
7578 }
7679}
0 commit comments