Skip to content

Commit 17cc20e

Browse files
committed
fix(DropdownItem): add autoClose prop, refactor tabIndex, aria-disabled
1 parent 824085e commit 17cc20e

File tree

2 files changed

+35
-35
lines changed

2 files changed

+35
-35
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,11 @@
1-
import { ElementRef, Renderer2 } from '@angular/core';
21
import { DropdownService } from '../dropdown.service';
32
import { DropdownItemDirective } from './dropdown-item.directive';
43

54
describe('DropdownItemDirective', () => {
6-
let renderer: Renderer2;
7-
let hostElement: ElementRef;
85

96
it('should create an instance', () => {
107
const dropdownService = new DropdownService();
11-
const directive = new DropdownItemDirective(renderer, hostElement, dropdownService);
8+
const directive = new DropdownItemDirective(dropdownService);
129
expect(directive).toBeTruthy();
1310
});
1411
});
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,32 @@
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';
132
import { DropdownService } from '../dropdown.service';
143
import { 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

Comments
 (0)