Skip to content

Commit d751ad0

Browse files
committed
feat(combo): make 'clear selection' button focusable
1 parent e3f83b3 commit d751ad0

File tree

7 files changed

+74
-12
lines changed

7 files changed

+74
-12
lines changed

projects/igniteui-angular/src/lib/combo/combo.component.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
<ng-content select="igx-suffix"></ng-content>
1919
</ng-container>
2020
<igx-suffix *ngIf="displayValue" [attr.aria-label]="resourceStrings.igx_combo_clearItems_placeholder" class="igx-combo__clear-button"
21-
(click)="handleClearItems($event)">
21+
(click)="handleClearItems($event)" (keydown)="handleClearKeyDown($event)" [tabindex]="disabled ? -1 : 0" role="button">
2222
<ng-container *ngIf="clearIconTemplate">
2323
<ng-container *ngTemplateOutlet="clearIconTemplate"></ng-container>
2424
</ng-container>

projects/igniteui-angular/src/lib/combo/combo.component.spec.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2269,6 +2269,21 @@ describe('igxCombo', () => {
22692269
cancel: false
22702270
});
22712271
});
2272+
it('should clear the selection on Enter of the focused clear icon', () => {
2273+
const selectedItem_1 = combo.dropdown.items[1];
2274+
combo.toggle();
2275+
fixture.detectChanges();
2276+
simulateComboItemClick(1);
2277+
expect(combo.selection[0]).toEqual(selectedItem_1.value);
2278+
expect(combo.value[0]).toEqual(selectedItem_1.value[combo.valueKey]);
2279+
2280+
const clearBtn = fixture.debugElement.query(By.css(`.${CSS_CLASS_CLEARBUTTON}`));
2281+
UIInteractions.triggerEventHandlerKeyDown('Enter', clearBtn);
2282+
fixture.detectChanges();
2283+
expect(input.nativeElement.value).toEqual('');
2284+
expect(combo.selection.length).toEqual(0);
2285+
expect(combo.value.length).toEqual(0);
2286+
});
22722287
it('should not be able to select group header', () => {
22732288
spyOn(combo.selectionChanging, 'emit').and.callThrough();
22742289
combo.toggle();

projects/igniteui-angular/src/lib/combo/combo.component.ts

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -278,10 +278,7 @@ export class IgxComboComponent extends IgxComboBaseDirective implements AfterVie
278278
/**
279279
* @hidden @internal
280280
*/
281-
public handleClearItems(event: Event): void {
282-
if (this.disabled) {
283-
return;
284-
}
281+
public clearInput(event: Event): void {
285282
this.deselectAllItems(true, event);
286283
if (this.collapsed) {
287284
this.getEditElement().focus();
@@ -291,6 +288,26 @@ export class IgxComboComponent extends IgxComboBaseDirective implements AfterVie
291288
event.stopPropagation();
292289
}
293290

291+
/**
292+
* @hidden @internal
293+
*/
294+
public handleClearItems(event: Event): void {
295+
if (this.disabled) {
296+
return;
297+
}
298+
this.clearInput(event);
299+
}
300+
301+
/**
302+
* @hidden @internal
303+
*/
304+
public handleClearKeyDown(eventArgs: KeyboardEvent) {
305+
if (eventArgs.key === 'Enter' || eventArgs.key === ' ') {
306+
eventArgs.preventDefault();
307+
this.clearInput(eventArgs);
308+
}
309+
}
310+
294311
/**
295312
* Select defined items
296313
*

projects/igniteui-angular/src/lib/core/styles/components/combo/_combo-theme.scss

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -270,6 +270,10 @@
270270
%igx-combo__clear-button {
271271
color: var-get($theme, 'clear-button-foreground-focus');
272272
background: var-get($theme, 'clear-button-background-focus');
273+
274+
&:focus {
275+
color: color($color: 'secondary');
276+
}
273277
}
274278
}
275279

projects/igniteui-angular/src/lib/simple-combo/simple-combo.component.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
</ng-container>
2626

2727
<igx-suffix *ngIf="hasSelectedItem" [attr.aria-label]="resourceStrings.igx_combo_clearItems_placeholder" class="igx-combo__clear-button"
28-
(click)="handleClear($event)">
28+
(click)="handleClear($event)" (keydown)="handleClearKeyDown($event)" [tabindex]="disabled ? -1 : 0" role="button">
2929
<ng-container *ngIf="clearIconTemplate">
3030
<ng-container *ngTemplateOutlet="clearIconTemplate"></ng-container>
3131
</ng-container>

projects/igniteui-angular/src/lib/simple-combo/simple-combo.component.spec.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1234,6 +1234,19 @@ describe('IgxSimpleCombo', () => {
12341234
expect(combo.displayValue).toEqual('Wisconsin');
12351235
});
12361236

1237+
it('should clear the selection on Enter of the focused clear icon', () => {
1238+
combo.select(combo.data[2][combo.valueKey]);
1239+
fixture.detectChanges();
1240+
expect(combo.selection).toBeDefined()
1241+
expect(input.nativeElement.value).toEqual('Massachusetts');
1242+
1243+
const clearBtn = fixture.debugElement.query(By.css(`.${CSS_CLASS_CLEARBUTTON}`));
1244+
UIInteractions.triggerEventHandlerKeyDown('Enter', clearBtn);
1245+
fixture.detectChanges();
1246+
expect(input.nativeElement.value.length).toEqual(0);
1247+
expect(combo.selection).not.toBeDefined();
1248+
});
1249+
12371250
it('should display the AddItem button when allowCustomValues is true and there is a partial match', fakeAsync(() => {
12381251
fixture.componentInstance.allowCustomValues = true;
12391252
fixture.detectChanges();

projects/igniteui-angular/src/lib/simple-combo/simple-combo.component.ts

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -425,15 +425,11 @@ export class IgxSimpleComboComponent extends IgxComboBaseDirective implements Co
425425
}
426426

427427
/** @hidden @internal */
428-
public handleClear(event: Event): void {
429-
if (this.disabled) {
430-
return;
431-
}
432-
428+
public clearInput(event: Event): void {
433429
const oldSelection = this.selection;
434430
this.clearSelection(true);
435431

436-
if(!this.collapsed){
432+
if (!this.collapsed) {
437433
this.focusSearchInput(true);
438434
}
439435
event.stopPropagation();
@@ -447,6 +443,23 @@ export class IgxSimpleComboComponent extends IgxComboBaseDirective implements Co
447443
this.comboInput.focus();
448444
}
449445

446+
/** @hidden @internal */
447+
public handleClear(event: Event): void {
448+
if (this.disabled) {
449+
return;
450+
}
451+
452+
this.clearInput(event);
453+
}
454+
455+
/** @hidden @internal */
456+
public handleClearKeyDown(event: KeyboardEvent): void {
457+
if (event.key === 'Enter' || event.key === ' ') {
458+
event.preventDefault();
459+
this.clearInput(event);
460+
}
461+
}
462+
450463
/** @hidden @internal */
451464
public handleOpened(): void {
452465
this.triggerCheck();

0 commit comments

Comments
 (0)