@engie-group/fluid-design-system-angular
Version:
Fluid Design System Angular
521 lines (518 loc) • 71 kB
JavaScript
import { CommonModule, DOCUMENT } from '@angular/common';
import { ChangeDetectionStrategy, Component, ContentChildren, forwardRef, Inject, Input, ViewChild, ViewChildren, ViewEncapsulation, } from '@angular/core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
import { fromEvent, race, Subject, takeUntil } from 'rxjs';
import { selectAnimations } from '../../shared/animations';
import { FormFieldDirective } from '../form-field/form-field.directive';
import { FormItemComponent } from '../form-item/form-item.component';
import { ListGroupComponent } from '../list-group/list-group.component';
import { ListItemComponent } from '../list-item/list-item.component';
import { TagComponent } from '../tag/tag.component';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
export class MultiSelectComponent extends FormItemComponent {
static { this.ESCAPE_CODE = 'Escape'; }
static { this.ENTER_CODE = 'Enter'; }
static { this.UP_CODE = 'ArrowUp'; }
static { this.DOWN_CODE = 'ArrowDown'; }
/*
Regex matching every alpha-numeric characters.
\d : every digits
\p{Letter} : every letters in the latin alphabet including letters with diacritics
The "u" flag enables unicode mode required to use `\p{Letter}`.
See :
- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions/Unicode_Property_Escapes#general_categories
- https://unicode.org/reports/tr18/#General_Category_Property
*/
static { this.ALPHA_NUMERIC_REGEX = /^[\d\p{Letter}]$/u; }
constructor(element, cdr, document) {
super();
this.element = element;
this.cdr = cdr;
this.document = document;
/**
* @ignore
*/
this._onChange = (_) => {
};
/**
* @ignore
*/
this._onTouched = () => {
};
/**
* Notifier used to stop items click event subscription.
* @ignore
*/
this.unsubscribe = new Subject();
this.childOptionsChange = new Subject();
/**
* @ignore
*/
this.isOpen = false;
/**
* @ignore
*/
this.selectedIndexes = new Set();
/**
* @ignore
*/
this.selectedValues = new Set();
/**
* Icon name
*/
this.iconName = 'keyboard_arrow_down';
/**
* Whether or no to display selected items. When set to `false` and number of selected > 1,
* instead of displaying each selected item as tags it only display one tag `X selected`
*/
this.displaySelectedItems = true;
/**
* Selected text when `displaySelectedItems = false`:
* @example '5 selected`
*/
this.selectedText = 'selected';
/**
* Selected options tag color. Can only be grey or brand
*/
this.tagColor = 'grey';
/**
* Tag close label for accessibility, default is `Deselect` and it will be followed by the tag label. So focusing the close icon will read `Remove tag label`.
* Make sure to set a meaningful value and a translated one
*/
this.tagCloseLabel = 'Deselect';
/**
* Tag close label for accessibility, default is `Deselect all`. So focusing the close icon will read `Deselect all`.
* Make sure to set a meaningful value and a translated one
*/
this.tagResetSelectionLabel = 'Deselect all';
}
ngOnInit() {
fromEvent(this.document, 'click')
.pipe(takeUntil(this.unsubscribe))
.subscribe((e) => this.handleOutsideClick(e));
}
ngAfterViewInit() {
this.setInputsAndListenersOnOptions();
this.updateSelectedIndexes();
this.cdr.detectChanges();
this.selectOptions?.changes
.pipe(takeUntil(this.unsubscribe))
.subscribe(() => {
setTimeout(() => {
this.setInputsAndListenersOnOptions();
this.updateSelectedIndexes();
this.cdr.detectChanges();
});
});
}
ngOnDestroy() {
this.unsubscribe.next();
this.unsubscribe.complete();
}
setInputsAndListenersOnOptions() {
this.childOptionsChange.next();
const unsubscribeCond$ = race(this.unsubscribe, this.childOptionsChange);
this.selectOptions?.forEach((item, index) => {
item.role = 'option';
item.updateSelected(this.selectedIndexes.has(index));
item.isCheckboxContent = true;
item.checkboxContentId = this.getOptionId(index);
item.itemClick
.pipe(takeUntil(unsubscribeCond$))
.subscribe(() => {
this.toggleItem(item, index);
});
});
}
updateSelectedIndexes() {
const selectOptionsArr = this.selectOptions?.toArray();
if (selectOptionsArr) {
this.selectedValues = new Set([...this.selectedValues].filter(value => selectOptionsArr.some(opt => {
return opt?.getValue() === value;
})));
this.selectedIndexes = new Set(selectOptionsArr
.map((opt, index) => {
return this.selectedValues.has(opt.getValue()) ? index : -1;
})
.filter(index => index >= 0));
}
else {
this.selectedIndexes.clear();
this.selectedValues.clear();
}
this.updateOptionsActive();
}
/**
* @ignore
*/
toggleByIndex(e, index, tagIndex) {
e?.stopPropagation();
const item = this.selectOptions.get(index);
this.toggleItem(item, index);
// When clicking with a mouse e.detail counts the number of clicks, however when using keyboard it is always 0
const isEventTriggeredWithKeyboard = e?.detail === 0;
if (!isEventTriggeredWithKeyboard) {
this.buttonEl?.nativeElement?.focus();
return;
}
// We use a set timeout to make sure the focus is done after is re-rendered
setTimeout(() => {
if (this.tags.length) {
const indexToFocus = tagIndex === this.tags.length ? tagIndex - 1 : tagIndex;
this.tags.get(indexToFocus)?.focusIconButton();
}
else {
this.buttonEl?.nativeElement?.focus();
}
});
}
/**
* @ignore
*/
resetSelection(e) {
e.stopPropagation();
this.buttonEl.nativeElement.focus();
this.selectedIndexes.clear();
this.selectedValues.clear();
this.updateOptionsActive();
this._onChange(Array.from(this.selectedValues));
}
toggleItem(item, index) {
if (!item) {
return;
}
this.toggleValueInSelectedValue(item?.getValue());
this.toggleIndexInSelected(index);
this.updateOptionsActive();
this.cdr.markForCheck();
this._onChange(Array.from(this.selectedValues));
}
toggleValueInSelectedValue(value) {
if (this.selectedValues.has(value)) {
this.selectedValues.delete(value);
}
else {
this.selectedValues.add(value);
}
}
toggleIndexInSelected(index) {
if (this.selectedIndexes.has(index)) {
this.selectedIndexes.delete(index);
}
else {
this.selectedIndexes.add(index);
}
}
openList() {
this.isOpen = true;
this.focusedIndex = this.selectedIndexes.size ? Array.from(this.selectedIndexes)[this.selectedIndexes.size - 1] : 0;
this.selectOptions?.toArray().forEach((el, i) => {
if (!el) {
return;
}
el.isActive = this.selectedIndexes.has(i);
});
setTimeout(() => {
if (!this.selectedIndexes?.size) {
// Focus the `ul` element
this.listEl?.rootEl.nativeElement.focus();
// The scrolling element is not the `ul` node but the `nj-list-group`
this.listEl?.element.nativeElement.scrollTo({ top: 0 });
}
});
}
closeList() {
this.isOpen = false;
this.cdr.markForCheck();
}
/**
* @ignore
*/
toggleIsOpen() {
if (this.isOpen) {
this.closeList();
}
else {
this.openList();
}
}
/**
* @ignore
*/
handleListKeydown(e) {
// Escape key closes the list and focuses the button
if (e.code === MultiSelectComponent.ESCAPE_CODE) {
this.closeList();
setTimeout(() => {
this.buttonEl?.nativeElement.focus();
});
}
// Navigate between options and set `focusedIndex`
if (e.code === MultiSelectComponent.UP_CODE) {
e.preventDefault();
// Don't loop back to the end of the list
if (this.focusedIndex > 0) {
this.focusedIndex -= 1;
}
}
if (e.code === MultiSelectComponent.DOWN_CODE) {
e.preventDefault();
// Don't loop back to the begining of the list
if (this.focusedIndex < this.selectOptions?.length - 1) {
this.focusedIndex += 1;
}
}
// Select the current `focusedIndex` option
if (e.code === MultiSelectComponent.ENTER_CODE) {
e.preventDefault();
if (this.focusedIndex !== -1) {
this.toggleItem(this.selectOptions?.get(this.focusedIndex), this.focusedIndex);
this._onChange(Array.from(this.selectedValues));
}
}
// Jump to first option matching first letter
if (MultiSelectComponent.ALPHA_NUMERIC_REGEX.test(e.key)) {
const goToIndex = this.selectOptions
?.toArray()
.findIndex((item) => item.getValue()[0].toLowerCase() === e.key.toLowerCase());
if (goToIndex !== -1) {
this.focusedIndex = goToIndex;
}
}
}
/**
* @ignore
*/
handleFocusOut(e) {
const relatedTarget = e?.relatedTarget;
if (!relatedTarget) {
return;
}
if (!this.element?.nativeElement?.contains(relatedTarget)) {
this.closeList();
if (this._onTouched) {
this._onTouched();
}
}
}
/**
* @ignore
*/
handleOutsideClick(e) {
if (!this.element?.nativeElement?.contains(e.target)) {
this.closeList();
if (this._onTouched) {
this._onTouched();
}
}
}
/**
* Implemented as part of ControlValueAccessor.
* @ignore
*/
registerOnChange(fn) {
this._onChange = fn;
}
/**
* Implemented as part of ControlValueAccessor.
* @ignore
*/
registerOnTouched(fn) {
this._onTouched = fn;
}
/**
* Implemented as part of ControlValueAccessor.
* @ignore
*/
setDisabledState(isDisabled) {
this.isDisabled = isDisabled;
}
/**
* Implemented as part of ControlValueAccessor.
* @ignore
*/
writeValue(values) {
this.selectedValues.clear();
this.selectedIndexes.clear();
if (values?.length) {
for (const value of values) {
this.selectedValues.add(value);
const indexToAdd = this.selectOptions?.toArray()?.findIndex(item => item.getValue() === value);
if (indexToAdd >= 0) {
this.selectedIndexes.add(indexToAdd);
}
}
}
this.updateOptionsActive();
this.cdr.markForCheck();
}
updateOptionsActive() {
this.selectOptions?.forEach((item) => {
item.updateSelected(this.selectedValues.has(item.getValue()));
});
}
/**
* Label (≠ value) of selected option
* @ignore
*/
getLabelAtIndex(index) {
return this.selectOptions?.get(index)?.getLabel() ?? '';
}
/**
* Close aria Label of taf to close
* @param index
*/
getTagCloseLabel(index) {
return `${this.tagCloseLabel} ${this.getLabelAtIndex(index)}`;
}
/**
* Aria-label for the trigger button element.
* @ignore
*/
get buttonLabel() {
return `${this.fieldLabel} - ${this.buttonDefaultValueLabel}`;
}
/**
* @ignore
*/
get formattedInputValue() {
if (!this.selectedValues) {
return '';
}
return Array.from(this.selectedValues).join(',');
}
/**
* @ignore
*/
getAdditionalClass() {
return `nj-form-item--select nj-form-item--custom-list nj-form-item--multi-select${this.isOpen ? ' nj-form-item--open' : ''}`;
}
/**
* @ignore
*/
getSubscriptId() {
return `${this.inputId}-subscript`;
}
/**
* @ignore
*/
getInstructionsId() {
return `${this.inputId}-instructions`;
}
/**
* @ignore
*/
getDescriptionId() {
return `${this.getSubscriptId()} ${this.getInstructionsId()}`;
}
/**
* Index of the currently focused option.
*/
get focusedIndex() {
return this.selectOptions
?.toArray()
.findIndex((item) => this.document.activeElement === item.el.nativeElement);
}
set focusedIndex(value) {
this.selectOptions?.forEach((el, i) => {
el.ariaSelected = i === value;
});
setTimeout(() => {
if (value >= 0) {
this.selectOptions?.get(value)?.el?.nativeElement?.focus();
}
});
}
/**
* @ignore
*/
get selectedIndexesToShow() {
if (!this.selectedIndexes) {
return;
}
if (!this.maxTagsToDisplay) {
return [...this.selectedIndexes];
}
return [...this.selectedIndexes].splice(0, this.maxTagsToDisplay);
}
/**
* @ignore
*/
get tagSize() {
switch (this.size) {
case 'xlarge':
return 'md';
case 'small':
return 'xs';
default:
return 'sm';
}
}
/**
* @ignore
*/
get selectIndexAsArray() {
return [...this.selectedIndexes];
}
getOptionId(index) {
return `${this.inputId}_option-${index}`;
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: MultiSelectComponent, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: MultiSelectComponent, isStandalone: true, selector: "nj-multi-select", inputs: { iconName: "iconName", fieldLabel: "fieldLabel", listNavigationLabel: "listNavigationLabel", buttonDefaultValueLabel: "buttonDefaultValueLabel", maxTagsToDisplay: "maxTagsToDisplay", displaySelectedItems: "displaySelectedItems", selectedText: "selectedText", tagColor: "tagColor", tagCloseLabel: "tagCloseLabel", tagResetSelectionLabel: "tagResetSelectionLabel" }, providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => MultiSelectComponent),
multi: true,
},
], queries: [{ propertyName: "selectOptions", predicate: ListItemComponent, descendants: true }], viewQueries: [{ propertyName: "buttonEl", first: true, predicate: ["button"], descendants: true }, { propertyName: "input", first: true, predicate: ["input"], descendants: true }, { propertyName: "listEl", first: true, predicate: ListGroupComponent, descendants: true }, { propertyName: "tags", predicate: ["tags"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<nj-form-item\n [hasError]=\"hasError\"\n [hasSuccess]=\"hasSuccess\"\n [hasHint]=\"hasHint\"\n [isDisabled]=\"isDisabled\"\n [hasCustomIcon]=\"hasCustomIcon\"\n [isFloatingLabel]=\"isFloatingLabel\"\n [iconName]=\"iconName\"\n [size]=\"size\"\n [isSelect]=\"true\"\n [additionalClass]=\"getAdditionalClass()\"\n [inputId]=\"inputId\"\n (focusout)=\"handleFocusOut($event)\"\n>\n <input\n #input\n type=\"text\"\n readonly\n [value]=\"formattedInputValue\"\n [attr.id]=\"inputId\"\n [disabled]=\"isDisabled\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n njFormField\n />\n <ng-content njFormLabel select=\"[njFormLabel]\"></ng-content>\n <ng-content njFormSubscript select=\"[njFormSubscript]\"></ng-content>\n <ng-container njFormAdditionalContent>\n <p [id]=\"getInstructionsId()\" hidden>{{ listNavigationLabel }}</p>\n <button\n #button\n type=\"button\"\n class=\"nj-form-item__custom-list-button\"\n aria-haspopup=\"listbox\"\n [attr.aria-expanded]=\"isOpen\"\n role=\"combobox\"\n [attr.aria-label]=\"buttonLabel\"\n [attr.tabindex]=\"isOpen ? -1 : null\"\n [attr.aria-describedby]=\"getDescriptionId()\"\n (click)=\"toggleIsOpen()\">\n <span class=\"nj-sr-only\">{{buttonLabel}}</span>\n </button>\n <div class=\"nj-form-item__selected-tags\" (click)=\"toggleIsOpen()\">\n <ng-container *ngIf=\"selectIndexAsArray?.length as numOfSelected\">\n <ng-container *ngIf=\"displaySelectedItems\">\n <nj-tag *ngFor=\"let optionIndex of selectedIndexesToShow; let i = index\"\n #tags\n [variant]=\"tagColor\"\n [size]=\"tagSize\"\n [isClosable]=\"true\"\n [shouldAutoDestruct]=\"false\"\n [closeLabel]=\"getTagCloseLabel(optionIndex)\"\n (closeClick)=\"toggleByIndex($event, optionIndex, i)\">\n {{getLabelAtIndex(optionIndex)}}\n </nj-tag>\n <nj-tag *ngIf=\"maxTagsToDisplay && numOfSelected > maxTagsToDisplay\"\n [variant]=\"tagColor\"\n [size]=\"tagSize\">\n +{{numOfSelected - maxTagsToDisplay}}\n </nj-tag>\n </ng-container>\n <ng-container *ngIf=\"!displaySelectedItems\">\n <nj-tag\n *ngIf=\"numOfSelected === 1\"\n [variant]=\"tagColor\"\n [size]=\"tagSize\"\n [isClosable]=\"true\"\n [shouldAutoDestruct]=\"false\"\n [closeLabel]=\"getTagCloseLabel(selectIndexAsArray?.[0])\"\n (closeClick)=\"toggleByIndex($event, selectIndexAsArray?.[0], 0)\">\n {{getLabelAtIndex(selectIndexAsArray?.[0])}}\n </nj-tag>\n <nj-tag\n *ngIf=\"numOfSelected > 1\"\n [variant]=\"tagColor\"\n [isClosable]=\"true\"\n [shouldAutoDestruct]=\"false\"\n [size]=\"tagSize\"\n [closeLabel]=\"tagResetSelectionLabel\"\n (closeClick)=\"resetSelection($event)\">\n {{numOfSelected}} {{selectedText}}\n </nj-tag>\n </ng-container>\n </ng-container>\n </div>\n <nj-list-group\n class=\"nj-form-item__list nj-form-item__list--no-animate\"\n [hidden]=\"!isOpen\"\n [@transformList]=\"isOpen ? 'open': 'void'\"\n [isDense]=\"true\"\n [hasBorder]=\"false\"\n [isClickable]=\"true\"\n [isCustomSelectList]=\"true\"\n [isCheckboxList]=\"true\"\n tabindex=\"-1\"\n [ariaLabel]=\"fieldLabel\"\n (keydown)=\"handleListKeydown($event)\"\n >\n <ng-content select=\"[njSelectOptions]\"></ng-content>\n </nj-list-group>\n </ng-container>\n</nj-form-item>\n", styles: [":host{display:block;width:100%;height:100%}.nj-form-item__custom-list-button{outline:none}\n"], dependencies: [{ kind: "component", type: TagComponent, selector: "nj-tag", inputs: ["variant", "size", "iconName", "href", "target", "isClickable", "isClosable", "shouldAutoDestruct", "closeLabel", "isDisabled", "hasCustomIcon"], outputs: ["tagClick", "closeClick"] }, { kind: "component", type: FormItemComponent, selector: "nj-form-item", inputs: ["inputId", "size", "isFloatingLabel", "isDisabled", "isRequired", "hasSuccess", "hasError", "hasHint", "hasCustomIcon", "isIconClickable", "iconName", "additionalClass", "passwordButtonLabelShow", "passwordButtonLabelHide", "passwordNoticeIsVisible", "passwordNoticeIsHidden", "isSelect"], outputs: ["iconClick", "iconKeydown", "wrapperClick"] }, { kind: "directive", type: FormFieldDirective, selector: "input[njFormField], textarea[njFormField], select[njFormField], nj-select[njFormField], div[njFormField]", exportAs: ["njFormField"] }, { kind: "component", type: ListGroupComponent, selector: "nj-list-group", inputs: ["listId", "isClickable", "isCheckboxList", "hasBorder", "isDense", "isCustomSelectList", "ariaLabel", "isMultiSelect"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], animations: [selectAnimations.transformList], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: MultiSelectComponent, decorators: [{
type: Component,
args: [{ selector: 'nj-multi-select', changeDetection: ChangeDetectionStrategy.OnPush, providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => MultiSelectComponent),
multi: true,
},
], animations: [selectAnimations.transformList], encapsulation: ViewEncapsulation.None, standalone: true, imports: [TagComponent, FormItemComponent, FormFieldDirective, ListGroupComponent, CommonModule], template: "<nj-form-item\n [hasError]=\"hasError\"\n [hasSuccess]=\"hasSuccess\"\n [hasHint]=\"hasHint\"\n [isDisabled]=\"isDisabled\"\n [hasCustomIcon]=\"hasCustomIcon\"\n [isFloatingLabel]=\"isFloatingLabel\"\n [iconName]=\"iconName\"\n [size]=\"size\"\n [isSelect]=\"true\"\n [additionalClass]=\"getAdditionalClass()\"\n [inputId]=\"inputId\"\n (focusout)=\"handleFocusOut($event)\"\n>\n <input\n #input\n type=\"text\"\n readonly\n [value]=\"formattedInputValue\"\n [attr.id]=\"inputId\"\n [disabled]=\"isDisabled\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n njFormField\n />\n <ng-content njFormLabel select=\"[njFormLabel]\"></ng-content>\n <ng-content njFormSubscript select=\"[njFormSubscript]\"></ng-content>\n <ng-container njFormAdditionalContent>\n <p [id]=\"getInstructionsId()\" hidden>{{ listNavigationLabel }}</p>\n <button\n #button\n type=\"button\"\n class=\"nj-form-item__custom-list-button\"\n aria-haspopup=\"listbox\"\n [attr.aria-expanded]=\"isOpen\"\n role=\"combobox\"\n [attr.aria-label]=\"buttonLabel\"\n [attr.tabindex]=\"isOpen ? -1 : null\"\n [attr.aria-describedby]=\"getDescriptionId()\"\n (click)=\"toggleIsOpen()\">\n <span class=\"nj-sr-only\">{{buttonLabel}}</span>\n </button>\n <div class=\"nj-form-item__selected-tags\" (click)=\"toggleIsOpen()\">\n <ng-container *ngIf=\"selectIndexAsArray?.length as numOfSelected\">\n <ng-container *ngIf=\"displaySelectedItems\">\n <nj-tag *ngFor=\"let optionIndex of selectedIndexesToShow; let i = index\"\n #tags\n [variant]=\"tagColor\"\n [size]=\"tagSize\"\n [isClosable]=\"true\"\n [shouldAutoDestruct]=\"false\"\n [closeLabel]=\"getTagCloseLabel(optionIndex)\"\n (closeClick)=\"toggleByIndex($event, optionIndex, i)\">\n {{getLabelAtIndex(optionIndex)}}\n </nj-tag>\n <nj-tag *ngIf=\"maxTagsToDisplay && numOfSelected > maxTagsToDisplay\"\n [variant]=\"tagColor\"\n [size]=\"tagSize\">\n +{{numOfSelected - maxTagsToDisplay}}\n </nj-tag>\n </ng-container>\n <ng-container *ngIf=\"!displaySelectedItems\">\n <nj-tag\n *ngIf=\"numOfSelected === 1\"\n [variant]=\"tagColor\"\n [size]=\"tagSize\"\n [isClosable]=\"true\"\n [shouldAutoDestruct]=\"false\"\n [closeLabel]=\"getTagCloseLabel(selectIndexAsArray?.[0])\"\n (closeClick)=\"toggleByIndex($event, selectIndexAsArray?.[0], 0)\">\n {{getLabelAtIndex(selectIndexAsArray?.[0])}}\n </nj-tag>\n <nj-tag\n *ngIf=\"numOfSelected > 1\"\n [variant]=\"tagColor\"\n [isClosable]=\"true\"\n [shouldAutoDestruct]=\"false\"\n [size]=\"tagSize\"\n [closeLabel]=\"tagResetSelectionLabel\"\n (closeClick)=\"resetSelection($event)\">\n {{numOfSelected}} {{selectedText}}\n </nj-tag>\n </ng-container>\n </ng-container>\n </div>\n <nj-list-group\n class=\"nj-form-item__list nj-form-item__list--no-animate\"\n [hidden]=\"!isOpen\"\n [@transformList]=\"isOpen ? 'open': 'void'\"\n [isDense]=\"true\"\n [hasBorder]=\"false\"\n [isClickable]=\"true\"\n [isCustomSelectList]=\"true\"\n [isCheckboxList]=\"true\"\n tabindex=\"-1\"\n [ariaLabel]=\"fieldLabel\"\n (keydown)=\"handleListKeydown($event)\"\n >\n <ng-content select=\"[njSelectOptions]\"></ng-content>\n </nj-list-group>\n </ng-container>\n</nj-form-item>\n", styles: [":host{display:block;width:100%;height:100%}.nj-form-item__custom-list-button{outline:none}\n"] }]
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: undefined, decorators: [{
type: Inject,
args: [DOCUMENT]
}] }]; }, propDecorators: { iconName: [{
type: Input
}], fieldLabel: [{
type: Input
}], listNavigationLabel: [{
type: Input
}], buttonDefaultValueLabel: [{
type: Input
}], maxTagsToDisplay: [{
type: Input
}], displaySelectedItems: [{
type: Input
}], selectedText: [{
type: Input
}], tagColor: [{
type: Input
}], tagCloseLabel: [{
type: Input
}], tagResetSelectionLabel: [{
type: Input
}], buttonEl: [{
type: ViewChild,
args: ['button']
}], input: [{
type: ViewChild,
args: ['input']
}], listEl: [{
type: ViewChild,
args: [ListGroupComponent]
}], tags: [{
type: ViewChildren,
args: ['tags']
}], selectOptions: [{
type: ContentChildren,
args: [ListItemComponent, { descendants: true }]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGktc2VsZWN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL211bHRpLXNlbGVjdC9tdWx0aS1zZWxlY3QuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvbXVsdGktc2VsZWN0L211bHRpLXNlbGVjdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsWUFBWSxFQUFFLFFBQVEsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQ3ZELE9BQU8sRUFFTCx1QkFBdUIsRUFFdkIsU0FBUyxFQUNULGVBQWUsRUFFZixVQUFVLEVBQ1YsTUFBTSxFQUNOLEtBQUssRUFJTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLGlCQUFpQixHQUNsQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQXVCLGlCQUFpQixFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDdkUsT0FBTyxFQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUN6RCxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQztBQUN6RCxPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSxvQ0FBb0MsQ0FBQztBQUN0RSxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSxrQ0FBa0MsQ0FBQztBQUNuRSxPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSxvQ0FBb0MsQ0FBQztBQUN0RSxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSxrQ0FBa0MsQ0FBQztBQUNuRSxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sc0JBQXNCLENBQUM7OztBQW9CbEQsTUFBTSxPQUFPLG9CQUNYLFNBQVEsaUJBQWlCO2FBRUQsZ0JBQVcsR0FBRyxRQUFRLEFBQVgsQ0FBWTthQUN2QixlQUFVLEdBQUcsT0FBTyxBQUFWLENBQVc7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b21tb24nO1xuaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIENvbnRlbnRDaGlsZHJlbixcbiAgRWxlbWVudFJlZixcbiAgZm9yd2FyZFJlZixcbiAgSW5qZWN0LFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIFF1ZXJ5TGlzdCxcbiAgVmlld0NoaWxkLFxuICBWaWV3Q2hpbGRyZW4sXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7Q29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQge2Zyb21FdmVudCwgcmFjZSwgU3ViamVjdCwgdGFrZVVudGlsfSBmcm9tICdyeGpzJztcbmltcG9ydCB7c2VsZWN0QW5pbWF0aW9uc30gZnJvbSAnLi4vLi4vc2hhcmVkL2FuaW1hdGlvbnMnO1xuaW1wb3J0IHtGb3JtRmllbGREaXJlY3RpdmV9IGZyb20gJy4uL2Zvcm0tZmllbGQvZm9ybS1maWVsZC5kaXJlY3RpdmUnO1xuaW1wb3J0IHtGb3JtSXRlbUNvbXBvbmVudH0gZnJvbSAnLi4vZm9ybS1pdGVtL2Zvcm0taXRlbS5jb21wb25lbnQnO1xuaW1wb3J0IHtMaXN0R3JvdXBDb21wb25lbnR9IGZyb20gJy4uL2xpc3QtZ3JvdXAvbGlzdC1ncm91cC5jb21wb25lbnQnO1xuaW1wb3J0IHtMaXN0SXRlbUNvbXBvbmVudH0gZnJvbSAnLi4vbGlzdC1pdGVtL2xpc3QtaXRlbS5jb21wb25lbnQnO1xuaW1wb3J0IHtUYWdDb21wb25lbnR9IGZyb20gJy4uL3RhZy90YWcuY29tcG9uZW50JztcbmltcG9ydCB7VGFnU2l6ZX0gZnJvbSAnLi4vdGFnL3RhZy5tb2RlbCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ25qLW11bHRpLXNlbGVjdCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9tdWx0aS1zZWxlY3QuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9tdWx0aS1zZWxlY3QuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gTXVsdGlTZWxlY3RDb21wb25lbnQpLFxuICAgICAgbXVsdGk6IHRydWUsXG4gICAgfSxcbiAgXSxcbiAgYW5pbWF0aW9uczogW3NlbGVjdEFuaW1hdGlvbnMudHJhbnNmb3JtTGlzdF0sXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtUYWdDb21wb25lbnQsIEZvcm1JdGVtQ29tcG9uZW50LCBGb3JtRmllbGREaXJlY3RpdmUsIExpc3RHcm91cENvbXBvbmVudCwgQ29tbW9uTW9kdWxlXVxufSlcbmV4cG9ydCBjbGFzcyBNdWx0aVNlbGVjdENvbXBvbmVudFxuICBleHRlbmRzIEZvcm1JdGVtQ29tcG9uZW50XG4gIGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBDb250cm9sVmFsdWVBY2Nlc3NvciwgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgRVNDQVBFX0NPREUgPSAnRXNjYXBlJztcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgRU5URVJfQ09ERSA9ICdFbnRlcic7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFVQX0NPREUgPSAnQXJyb3dVcCc7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IERPV05fQ09ERSA9ICdBcnJvd0Rvd24nO1xuICAvKlxuICAgIFJlZ2V4IG1hdGNoaW5nIGV2ZXJ5IGFscGhhLW51bWVyaWMgY2hhcmFjdGVycy5cblxuICAgIFxcZCA6IGV2ZXJ5IGRpZ2l0c1xuICAgIFxccHtMZXR0ZXJ9IDogZXZlcnkgbGV0dGVycyBpbiB0aGUgbGF0aW4gYWxwaGFiZXQgaW5jbHVkaW5nIGxldHRlcnMgd2l0aCBkaWFjcml0aWNzXG5cbiAgICBUaGUgXCJ1XCIgZmxhZyBlbmFibGVzIHVuaWNvZGUgbW9kZSByZXF1aXJlZCB0byB1c2UgYFxccHtMZXR0ZXJ9YC5cblxuICAgIFNlZSA6XG4gICAgLSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L0d1aWRlL1JlZ3VsYXJfRXhwcmVzc2lvbnMvVW5pY29kZV9Qcm9wZXJ0eV9Fc2NhcGVzI2dlbmVyYWxfY2F0ZWdvcmllc1xuICAgIC0gaHR0cHM6Ly91bmljb2RlLm9yZy9yZXBvcnRzL3RyMTgvI0dlbmVyYWxfQ2F0ZWdvcnlfUHJvcGVydHlcbiAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgQUxQSEFfTlVNRVJJQ19SRUdFWCA9IC9eW1xcZFxccHtMZXR0ZXJ9XSQvdTtcblxuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgcHJpdmF0ZSBfb25DaGFuZ2UgPSAoXzogYW55KTogdm9pZCA9PiB7XG4gIH07XG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIHByaXZhdGUgX29uVG91Y2hlZCA9ICgpOiB2b2lkID0+IHtcbiAgfTtcblxuICAvKipcbiAgICogTm90aWZpZXIgdXNlZCB0byBzdG9wIGl0ZW1zIGNsaWNrIGV2ZW50IHN1YnNjcmlwdGlvbi5cbiAgICogQGlnbm9yZVxuICAgKi9cbiAgcHJpdmF0ZSB1bnN1YnNjcmliZSA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgcHJpdmF0ZSBjaGlsZE9wdGlvbnNDaGFuZ2UgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBpc09wZW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgc2VsZWN0ZWRJbmRleGVzOiBTZXQ8bnVtYmVyPiA9IG5ldyBTZXQ8bnVtYmVyPigpO1xuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBzZWxlY3RlZFZhbHVlczogU2V0PHN0cmluZz4gPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAvKipcbiAgICogSWNvbiBuYW1lXG4gICAqL1xuICBASW5wdXQoKSBpY29uTmFtZSA9ICdrZXlib2FyZF9hcnJvd19kb3duJztcblxuICAvKipcbiAgICogTGFiZWwgdXNlZCBmb3IgYWNjZXNzaWJpbGl0eSByZWxhdGVkIGF0dHJpYnV0ZXMgb24gYnV0dG9uIGFuZCBsaXN0LlxuICAgKiBTaG91bGQgYmUgdGhlIHNhbWUgdmFsdWUgKHRleHQgb25seSkgYXMgdGhlIGA8bGFiZWw+YCBlbGVtZW50XG4gICAqL1xuICBASW5wdXQoKSBmaWVsZExhYmVsOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEluc3RydWN0aW9ucyBvbiBob3cgdG8gbmF2aWdhdGUgdGhlIGxpc3QuIEl0IGlzIGFwcGVuZCBhZnRlciB0aGUgaW5wdXQgbGFiZWwuXG4gICAqIEBleGFtcGxlIFwiVXNlIHVwIGFuZCBkb3duIGFycm93cyBhbmQgRW50ZXIgdG8gc2VsZWN0IGEgdmFsdWVcIlxuICAgKi9cbiAgQElucHV0KCkgbGlzdE5hdmlnYXRpb25MYWJlbDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBCdXR0b24gZGVmYXVsdCBsYWJlbCB3aGVuIG5vIHZhbHVlIGlzIHNlbGVjdGVkLiBJdCBpcyBhcHBlbmRlZCBhZnRlciB0aGUgaW5wdXQgbGFiZWwuXG4gICAqIEBleGFtcGxlIFwiU2VsZWN0IGEgdmFsdWVcIlxuICAgKi9cbiAgQElucHV0KCkgYnV0dG9uRGVmYXVsdFZhbHVlTGFiZWw6IHN0cmluZztcblxuICAvKipcbiAgICogTWF4IHRhZ3MgdG8gZGlzcGxheVxuICAgKi9cbiAgQElucHV0KCkgbWF4VGFnc1RvRGlzcGxheTogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIG9yIG5vIHRvIGRpc3BsYXkgc2VsZWN0ZWQgaXRlbXMuIFdoZW4gc2V0IHRvIGBmYWxzZWAgYW5kIG51bWJlciBvZiBzZWxlY3RlZCA+IDEsXG4gICAqIGluc3RlYWQgb2YgZGlzcGxheWluZyBlYWNoIHNlbGVjdGVkIGl0ZW0gYXMgdGFncyBpdCBvbmx5IGRpc3BsYXkgb25lIHRhZyBgWCBzZWxlY3RlZGBcbiAgICovXG4gIEBJbnB1dCgpIGRpc3BsYXlTZWxlY3RlZEl0ZW1zID0gdHJ1ZTtcblxuICAvKipcbiAgICogU2VsZWN0ZWQgdGV4dCB3aGVuIGBkaXNwbGF5U2VsZWN0ZWRJdGVtcyA9IGZhbHNlYDpcbiAgICogQGV4YW1wbGUgJzUgc2VsZWN0ZWRgXG4gICAqL1xuICBASW5wdXQoKSBzZWxlY3RlZFRleHQ6IHN0cmluZyA9ICdzZWxlY3RlZCc7XG5cbiAgLyoqXG4gICAqIFNlbGVjdGVkIG9wdGlvbnMgdGFnIGNvbG9yLiBDYW4gb25seSBiZSBncmV5IG9yIGJyYW5kXG4gICAqL1xuICBASW5wdXQoKSB0YWdDb2xvcjogJ2JyYW5kJyB8ICdncmV5JyA9ICdncmV5JztcblxuICAvKipcbiAgICogVGFnIGNsb3NlIGxhYmVsIGZvciBhY2Nlc3NpYmlsaXR5LCBkZWZh