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' ;
13
2
import { DropdownService } from '../dropdown.service' ;
14
3
import { DropdownComponent } from '../dropdown/dropdown.component' ;
15
4
16
5
@Directive ( {
17
6
selector : '[cDropdownItem]' ,
18
7
exportAs : 'cDropdownItem'
19
8
} )
20
- export class DropdownItemDirective implements AfterContentInit , OnChanges {
9
+ export class DropdownItemDirective {
21
10
/**
22
11
* Set active state to a dropdown-item.
12
+ * @type boolean
13
+ * @default undefined
23
14
*/
24
15
@Input ( ) active ?: boolean ;
16
+ /**
17
+ * Configure dropdown-item close dropdown behavior.
18
+ * @type boolean
19
+ * @default true
20
+ */
21
+ @Input ( ) autoClose : boolean = true ;
25
22
/**
26
23
* Disables a dropdown-item.
24
+ * @type boolean
25
+ * @default undefined
27
26
*/
28
27
@Input ( ) disabled ?: boolean ;
29
28
30
29
constructor (
31
- private renderer : Renderer2 ,
32
- private hostElement : ElementRef ,
33
30
private dropdownService : DropdownService ,
34
31
@Optional ( ) public dropdown ?: DropdownComponent
35
32
) {
@@ -45,32 +42,38 @@ export class DropdownItemDirective implements AfterContentInit, OnChanges {
45
42
return {
46
43
'dropdown-item' : true ,
47
44
active : this . active ,
48
- disabled : this . disabled ,
45
+ disabled : this . disabled
49
46
} ;
50
47
}
51
48
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 ;
55
53
}
54
+ get tabIndex ( ) {
55
+ return this . disabled ? '-1' : this . _tabIndex ;
56
+ }
57
+ private _tabIndex : string | number | null = null ;
56
58
57
- ngAfterContentInit ( ) : void {
58
- this . setAttributes ( this . hostElement ) ;
59
+ @HostBinding ( 'attr.aria-disabled' )
60
+ get isDisabled ( ) : boolean | null {
61
+ return this . disabled || null ;
59
62
}
60
63
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 } ) ;
64
68
}
65
69
}
66
70
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
+ }
74
77
}
75
78
}
76
79
}
0 commit comments