diff --git a/libs/components/src/multi-select/multi-select.component.html b/libs/components/src/multi-select/multi-select.component.html index 84f7235217..d66a06e9e5 100644 --- a/libs/components/src/multi-select/multi-select.component.html +++ b/libs/components/src/multi-select/multi-select.component.html @@ -17,6 +17,7 @@ [disabled]="disabled" [clearSearchOnAdd]="true" [labelForId]="labelForId" + [keyDownFn]="keyDown" appendTo="body" > diff --git a/libs/components/src/multi-select/multi-select.component.ts b/libs/components/src/multi-select/multi-select.component.ts index 81b815ed0d..acc5cd1586 100644 --- a/libs/components/src/multi-select/multi-select.component.ts +++ b/libs/components/src/multi-select/multi-select.component.ts @@ -1,3 +1,4 @@ +import { hasModifierKey } from "@angular/cdk/keycodes"; import { Component, Input, @@ -67,6 +68,29 @@ export class MultiSelectComponent implements OnInit, BitFormFieldControl, Contro this.loadingText = this.i18nService.t("multiSelectLoading"); } + /** Function for customizing keyboard navigation */ + /** Needs to be arrow function to retain `this` scope. */ + keyDown = (event: KeyboardEvent) => { + if (!this.select.isOpen && event.key === "Enter" && !hasModifierKey(event)) { + return false; + } + + if (this.select.isOpen && event.key === "Enter" && !hasModifierKey(event)) { + this.select.close(); + event.preventDefault(); + return false; + } + + if (this.select.isOpen && event.key === "Escape" && !hasModifierKey(event)) { + this.selectedItems = []; + this.select.close(); + event.stopPropagation(); + return false; + } + + return true; + }; + /** Helper method for showing selected state in custom template */ isSelected(item: any): boolean { return this.selectedItems?.find((selected) => selected.id === item.id) != undefined;