ngx-mat-select-search
Version:
Angular component providing an input field for searching / filtering MatSelect options of the Angular Material library.
1 lines • 46 kB
Source Map (JSON)
{"version":3,"file":"ngx-mat-select-search.mjs","sources":["../../src/app/mat-select-search/mat-select-search-clear.directive.ts","../../src/app/mat-select-search/default-options.ts","../../src/app/mat-select-search/mat-select-no-entries-found.directive.ts","../../src/app/mat-select-search/mat-select-search.component.ts","../../src/app/mat-select-search/mat-select-search.component.html","../../src/app/mat-select-search/ngx-mat-select-search.module.ts","../../src/app/mat-select-search/ngx-mat-select-search.ts"],"sourcesContent":["import { Directive } from '@angular/core';\n\n/**\n * Directive for providing a custom clear-icon.\n * e.g.\n * <ngx-mat-select-search [formControl]=\"bankFilterCtrl\">\n * <mat-icon ngxMatSelectSearchClear>delete</mat-icon>\n * </ngx-mat-select-search>\n */\n@Directive({\n selector: '[ngxMatSelectSearchClear]',\n standalone: false\n})\nexport class MatSelectSearchClearDirective {}\n","import { InjectionToken } from '@angular/core';\nimport { MatSelectSearchComponent } from './mat-select-search.component';\n\n/** List of inputs of NgxMatSelectSearchComponent that can be configured with a global default. */\nexport const configurableDefaultOptions = [\n 'ariaLabel',\n 'clearSearchInput',\n 'closeIcon',\n 'closeSvgIcon',\n 'disableInitialFocus',\n 'disableScrollToActiveOnOptionsChanged',\n 'enableClearOnEscapePressed',\n 'hideClearSearchButton',\n 'noEntriesFoundLabel',\n 'placeholderLabel',\n 'preventHomeEndKeyPropagation',\n 'searching',\n] as const;\n\nexport type ConfigurableDefaultOptions = typeof configurableDefaultOptions[number];\n\n/**\n * InjectionToken that can be used to specify global options. e.g.\n *\n * ```typescript\n * providers: [\n * {\n * provide: MAT_SELECTSEARCH_DEFAULT_OPTIONS,\n * useValue: <MatSelectSearchOptions>{\n * closeIcon: 'delete',\n * noEntriesFoundLabel: 'No options found'\n * }\n * }\n * ]\n * ```\n *\n * See the corresponding inputs of `MatSelectSearchComponent` for documentation.\n */\nexport const MAT_SELECTSEARCH_DEFAULT_OPTIONS = new InjectionToken<MatSelectSearchOptions>('mat-selectsearch-default-options');\n\n/** Global configurable options for MatSelectSearch. */\nexport type MatSelectSearchOptions = Readonly<Partial<Pick<MatSelectSearchComponent, ConfigurableDefaultOptions>>>;\n","import { Directive } from '@angular/core';\n\n/**\n * Directive for providing a custom no entries found element.\n * e.g.\n * <ngx-mat-select-search [formControl]=\"bankFilterCtrl\">\n * <span ngxMatSelectNoEntriesFound>\n * No entries found <button>Add</button>\n * </span>\n * </ngx-mat-select-search>\n */\n@Directive({\n selector: '[ngxMatSelectNoEntriesFound]',\n standalone: false\n})\nexport class MatSelectNoEntriesFoundDirective {}\n","/**\n * Copyright (c) 2018 Bithost GmbH All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport { ViewportRuler } from '@angular/cdk/scrolling';\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ContentChild,\n ElementRef,\n EventEmitter,\n forwardRef,\n Inject,\n Input,\n OnDestroy,\n OnInit,\n Optional,\n Output,\n QueryList,\n ViewChild\n} from '@angular/core';\nimport { ControlValueAccessor, FormControl, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { MatOption } from '@angular/material/core';\nimport { MatFormField } from '@angular/material/form-field';\nimport { MatSelect } from '@angular/material/select';\nimport { BehaviorSubject, combineLatest, Observable, of, Subject } from 'rxjs';\nimport { delay, filter, map, startWith, switchMap, take, takeUntil, tap } from 'rxjs/operators';\nimport { MatSelectSearchClearDirective } from './mat-select-search-clear.directive';\nimport { configurableDefaultOptions, MAT_SELECTSEARCH_DEFAULT_OPTIONS, MatSelectSearchOptions } from './default-options';\nimport { MatSelectNoEntriesFoundDirective } from './mat-select-no-entries-found.directive';\n\n/* tslint:disable:member-ordering component-selector */\n/**\n * Component providing an input field for searching MatSelect options.\n *\n * Example usage:\n *\n * interface Bank {\n * id: string;\n * name: string;\n * }\n *\n * @Component({\n * selector: 'my-app-data-selection',\n * template: `\n * <mat-form-field>\n * <mat-select [formControl]=\"bankCtrl\" placeholder=\"Bank\">\n * <mat-option>\n * <ngx-mat-select-search [formControl]=\"bankFilterCtrl\"></ngx-mat-select-search>\n * </mat-option>\n * <mat-option *ngFor=\"let bank of filteredBanks | async\" [value]=\"bank.id\">\n * {{bank.name}}\n * </mat-option>\n * </mat-select>\n * </mat-form-field>\n * `\n * })\n * export class DataSelectionComponent implements OnInit, OnDestroy {\n *\n * // control for the selected bank\n * public bankCtrl: FormControl = new FormControl();\n * // control for the MatSelect filter keyword\n * public bankFilterCtrl: FormControl = new FormControl();\n *\n * // list of banks\n * private banks: Bank[] = [{name: 'Bank A', id: 'A'}, {name: 'Bank B', id: 'B'}, {name: 'Bank C', id: 'C'}];\n * // list of banks filtered by search keyword\n * public filteredBanks: ReplaySubject<Bank[]> = new ReplaySubject<Bank[]>(1);\n *\n * // Subject that emits when the component has been destroyed.\n * private _onDestroy = new Subject<void>();\n *\n *\n * ngOnInit() {\n * // load the initial bank list\n * this.filteredBanks.next(this.banks.slice());\n * // listen for search field value changes\n * this.bankFilterCtrl.valueChanges\n * .pipe(takeUntil(this._onDestroy))\n * .subscribe(() => {\n * this.filterBanks();\n * });\n * }\n *\n * ngOnDestroy() {\n * this._onDestroy.next();\n * this._onDestroy.complete();\n * }\n *\n * private filterBanks() {\n * if (!this.banks) {\n * return;\n * }\n *\n * // get the search keyword\n * let search = this.bankFilterCtrl.value;\n * if (!search) {\n * this.filteredBanks.next(this.banks.slice());\n * return;\n * } else {\n * search = search.toLowerCase();\n * }\n *\n * // filter the banks\n * this.filteredBanks.next(\n * this.banks.filter(bank => bank.name.toLowerCase().indexOf(search) > -1)\n * );\n * }\n * }\n */\n@Component({\n selector: 'ngx-mat-select-search',\n standalone: false,\n templateUrl: './mat-select-search.component.html',\n styleUrls: ['./mat-select-search.component.scss'],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => MatSelectSearchComponent),\n multi: true\n }\n ],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class MatSelectSearchComponent implements OnInit, OnDestroy, ControlValueAccessor {\n\n /** Label of the search placeholder */\n @Input() placeholderLabel = 'Suche';\n\n /** Type of the search input field */\n @Input() type = 'text';\n\n /** Font-based icon used for displaying Close-Icon */\n @Input() closeIcon = 'close';\n\n /** SVG-based icon used for displaying Close-Icon. If set, closeIcon is overridden */\n @Input() closeSvgIcon?: string;\n\n /** Label to be shown when no entries are found. Set to null if no message should be shown. */\n @Input() noEntriesFoundLabel = 'Keine Optionen gefunden';\n\n /**\n * Whether the search field should be cleared after the dropdown menu is closed.\n * Useful for server-side filtering. See [#3](https://github.com/bithost-gmbh/ngx-mat-select-search/issues/3)\n */\n @Input() clearSearchInput = true;\n\n /** Whether to show the search-in-progress indicator */\n @Input() searching = false;\n\n /** Disables initial focusing of the input field */\n @Input() disableInitialFocus = false;\n\n /** Enable clear input on escape pressed */\n @Input() enableClearOnEscapePressed = false;\n\n /**\n * Prevents home / end key being propagated to mat-select,\n * allowing to move the cursor within the search input instead of navigating the options\n */\n @Input() preventHomeEndKeyPropagation = false;\n\n /** Disables scrolling to active options when option list changes. Useful for server-side search */\n @Input() disableScrollToActiveOnOptionsChanged = false;\n\n /** Adds 508 screen reader support for search box */\n @Input() ariaLabel = 'dropdown search';\n\n /** Whether to show Select All Checkbox (for mat-select[multi=true]) */\n @Input() showToggleAllCheckbox = false;\n\n /** Select all checkbox checked state */\n @Input() toggleAllCheckboxChecked = false;\n\n /** select all checkbox indeterminate state */\n @Input() toggleAllCheckboxIndeterminate = false;\n\n /** Display a message in a tooltip on the toggle-all checkbox */\n @Input() toggleAllCheckboxTooltipMessage = '';\n\n /** Define the position of the tooltip on the toggle-all checkbox. */\n @Input() toggleAllCheckboxTooltipPosition: 'left' | 'right' | 'above' | 'below' | 'before' | 'after' = 'below';\n\n /** Show/Hide the search clear button of the search input */\n @Input() hideClearSearchButton = false;\n\n /**\n * Always restore selected options on selectionChange for mode multi (e.g. for lazy loading/infinity scrolling).\n * Defaults to false, so selected options are only restored while filtering is active.\n */\n @Input() alwaysRestoreSelectedOptionsMulti = false;\n\n /**\n * Recreate array of selected values for multi-selects.\n *\n * This is useful if the selected values are stored in an immutable data structure.\n */\n @Input() recreateValuesArray = false;\n\n /** Output emitter to send to parent component with the toggle all boolean */\n @Output() toggleAll = new EventEmitter<boolean>();\n\n /** Reference to the search input field */\n @ViewChild('searchSelectInput', { read: ElementRef, static: true }) searchSelectInput: ElementRef;\n\n /** Reference to the search input field */\n @ViewChild('innerSelectSearch', { read: ElementRef, static: true }) innerSelectSearch: ElementRef;\n\n /** Reference to custom search input clear icon */\n @ContentChild(MatSelectSearchClearDirective) clearIcon: MatSelectSearchClearDirective;\n\n /** Reference to custom no entries found element */\n @ContentChild(MatSelectNoEntriesFoundDirective) noEntriesFound: MatSelectNoEntriesFoundDirective;\n\n /** Current search value */\n get value(): string {\n return this._formControl.value;\n }\n private _lastExternalInputValue?: string;\n\n onTouched: Function = (_: any) => { };\n\n /** Reference to the MatSelect options */\n public set _options(_options: QueryList<MatOption>) {\n this._options$.next(_options);\n }\n public get _options(): QueryList<MatOption> {\n return this._options$.getValue();\n }\n public _options$: BehaviorSubject<QueryList<MatOption>> = new BehaviorSubject<QueryList<MatOption>>(null as any);\n\n private optionsList$: Observable<MatOption[] | null> = this._options$.pipe(\n switchMap(_options => _options ?\n _options.changes.pipe(\n map(options => options.toArray()),\n startWith<MatOption[]>(_options.toArray()),\n ) : of(null)\n )\n );\n\n private optionsLength$: Observable<number> = this.optionsList$.pipe(\n map(options => options ? options.length : 0)\n );\n\n /** Previously selected values when using <mat-select [multiple]=\"true\">*/\n private previousSelectedValues: any[];\n\n public _formControl: FormControl<string> = new FormControl<string>('', {nonNullable: true});\n\n /** Whether to show the no entries found message */\n public _showNoEntriesFound$: Observable<boolean> = combineLatest([\n this._formControl.valueChanges,\n this.optionsLength$\n ]).pipe(\n map(([value, optionsLength]) => !!(this.noEntriesFoundLabel && value\n && optionsLength === this.getOptionsLengthOffset()))\n );\n\n /** Subject that emits when the component has been destroyed. */\n private _onDestroy = new Subject<void>();\n\n /** Reference to active descendant for ARIA Support. */\n private activeDescendant: HTMLElement;\n\n constructor(@Inject(MatSelect) public matSelect: MatSelect,\n public changeDetectorRef: ChangeDetectorRef,\n private _viewportRuler: ViewportRuler,\n @Optional() @Inject(MatOption) public matOption: MatOption,\n @Optional() @Inject(MatFormField) public matFormField: MatFormField,\n @Optional() @Inject(MAT_SELECTSEARCH_DEFAULT_OPTIONS) defaultOptions?: MatSelectSearchOptions\n ) {\n this.applyDefaultOptions(defaultOptions);\n }\n\n private applyDefaultOptions(defaultOptions?: MatSelectSearchOptions) {\n if (!defaultOptions) {\n return;\n }\n for (const key of configurableDefaultOptions) {\n if (defaultOptions.hasOwnProperty(key)) {\n (this[key] as any) = defaultOptions[key];\n }\n }\n }\n\n ngOnInit() {\n // set custom mat-option class if the component was placed inside a mat-option\n if (this.matOption) {\n this.matOption.disabled = true;\n this.matOption._getHostElement().classList.add('contains-mat-select-search');\n this.matOption._getHostElement().setAttribute('role', 'presentation');\n } else {\n console.error('<ngx-mat-select-search> must be placed inside a <mat-option> element');\n }\n\n // when the select dropdown panel is opened or closed\n this.matSelect.openedChange\n .pipe(\n delay(1),\n takeUntil(this._onDestroy)\n )\n .subscribe((opened) => {\n if (opened) {\n this.updateInputWidth();\n // focus the search field when opening\n if (!this.disableInitialFocus) {\n this._focus();\n }\n } else {\n // clear it when closing\n if (this.clearSearchInput) {\n this._reset();\n }\n }\n });\n\n\n\n // set the first item active after the options changed\n this.matSelect.openedChange\n .pipe(\n take(1),\n switchMap((_) => {\n this._options = this.matSelect.options;\n\n // Closure variable for tracking the most recent first option.\n // In order to avoid causing the list to\n // scroll to the top when options are added to the bottom of\n // the list (eg: infinite scroll), we compare only\n // the changes to the first options to determine if we\n // should set the first item as active.\n // This prevents unnecessary scrolling to the top of the list\n // when options are appended, but allows the first item\n // in the list to be set as active by default when there\n // is no active selection\n let previousFirstOption = this._options.toArray()[this.getOptionsLengthOffset()];\n\n return this._options.changes\n .pipe(tap(() => {\n // avoid \"expression has been changed\" error\n setTimeout(() => {\n // Convert the QueryList to an array\n const options = this._options.toArray();\n\n // The true first item is offset by 1\n const currentFirstOption = options[this.getOptionsLengthOffset()];\n\n const keyManager = this.matSelect._keyManager;\n if (keyManager && this.matSelect.panelOpen && currentFirstOption) {\n\n // set first item active and input width\n\n // Check to see if the first option in these changes is different from the previous.\n const firstOptionIsChanged = !previousFirstOption\n || !this.matSelect.compareWith(previousFirstOption.value, currentFirstOption.value);\n\n // CASE: The first option is different now.\n // Indicates we should set it as active and scroll to the top.\n if (firstOptionIsChanged\n || !keyManager.activeItem\n || !options.find(option => this.matSelect.compareWith(option.value, keyManager.activeItem?.value))) {\n keyManager.setActiveItem(this.getOptionsLengthOffset());\n }\n\n // wait for panel width changes\n setTimeout(() => {\n this.updateInputWidth();\n });\n }\n\n // Update our reference\n previousFirstOption = currentFirstOption;\n });\n }));\n })\n )\n .pipe(takeUntil(this._onDestroy))\n .subscribe();\n\n // add or remove css class depending on whether to show the no entries found message\n // note: this is hacky\n this._showNoEntriesFound$.pipe(\n takeUntil(this._onDestroy)\n ).subscribe(showNoEntriesFound => {\n // set no entries found class on mat option\n if (this.matOption) {\n if (showNoEntriesFound) {\n this.matOption._getHostElement().classList.add('mat-select-search-no-entries-found');\n } else {\n this.matOption._getHostElement().classList.remove('mat-select-search-no-entries-found');\n }\n }\n });\n\n // resize the input width when the viewport is resized, i.e. the trigger width could potentially be resized\n this._viewportRuler.change()\n .pipe(takeUntil(this._onDestroy))\n .subscribe(() => {\n if (this.matSelect.panelOpen) {\n this.updateInputWidth();\n }\n });\n\n this.initMultipleHandling();\n\n this.optionsList$.pipe(\n takeUntil(this._onDestroy)\n ).subscribe(() => {\n // update view when available options change\n this.changeDetectorRef.markForCheck();\n });\n }\n\n _emitSelectAllBooleanToParent(state: boolean) {\n this.toggleAll.emit(state);\n }\n\n ngOnDestroy() {\n this._onDestroy.next();\n this._onDestroy.complete();\n }\n\n _isToggleAllCheckboxVisible(): boolean {\n return this.matSelect.multiple && this.showToggleAllCheckbox;\n }\n\n /**\n * Handles the key down event with MatSelect.\n * Allows e.g. selecting with enter key, navigation with arrow keys, etc.\n * @param event\n */\n _handleKeydown(event: KeyboardEvent) {\n // Prevent propagation for all alphanumeric characters in order to avoid selection issues\n\n // tslint:disable-next-line:max-line-length\n // Needed to avoid handling in https://github.com/angular/components/blob/5439460d1fe166f8ec34ab7d48f05e0dd7f6a946/src/material/select/select.ts#L965\n if ((event.key && event.key.length === 1)\n || (this.preventHomeEndKeyPropagation && (event.key === 'Home' || event.key === 'End'))\n ) {\n event.stopPropagation();\n }\n\n if (this.matSelect.multiple && event.key && event.key === 'Enter') {\n // Regain focus after multiselect, so we can further type\n setTimeout(() => this._focus());\n }\n\n // Special case if click Escape, if input is empty, close the dropdown, if not, empty out the search field\n if (this.enableClearOnEscapePressed && event.key === 'Escape' && this.value) {\n this._reset(true);\n event.stopPropagation();\n }\n }\n\n /**\n * Handles the key up event with MatSelect.\n * Allows e.g. the announcing of the currently activeDescendant by screen readers.\n */\n _handleKeyup(event: KeyboardEvent) {\n if (event.key === 'ArrowUp' || event.key === 'ArrowDown') {\n const ariaActiveDescendantId = this.matSelect._getAriaActiveDescendant();\n const index = this._options.toArray().findIndex(item => item.id === ariaActiveDescendantId);\n if (index !== -1) {\n this.unselectActiveDescendant();\n this.activeDescendant = this._options.toArray()[index]._getHostElement();\n this.activeDescendant.setAttribute('aria-selected', 'true');\n this.searchSelectInput.nativeElement.setAttribute('aria-activedescendant', ariaActiveDescendantId);\n }\n }\n }\n\n writeValue(value: string) {\n this._lastExternalInputValue = value;\n this._formControl.setValue(value);\n this.changeDetectorRef.markForCheck();\n }\n\n onBlur() {\n this.unselectActiveDescendant();\n this.onTouched();\n }\n\n registerOnChange(fn: (value: string) => void) {\n this._formControl.valueChanges.pipe(\n filter(value => value !== this._lastExternalInputValue),\n tap(() => this._lastExternalInputValue = undefined),\n takeUntil(this._onDestroy)\n ).subscribe(fn);\n }\n\n registerOnTouched(fn: Function) {\n this.onTouched = fn;\n }\n\n /**\n * Focuses the search input field\n */\n public _focus() {\n if (!this.searchSelectInput || !this.matSelect.panel) {\n return;\n }\n // save and restore scrollTop of panel, since it will be reset by focus()\n // note: this is hacky\n const panel = this.matSelect.panel.nativeElement;\n const scrollTop = panel.scrollTop;\n\n // focus\n this.searchSelectInput.nativeElement.focus();\n\n panel.scrollTop = scrollTop;\n }\n\n /**\n * Resets the current search value\n * @param focus whether to focus after resetting\n */\n public _reset(focus?: boolean) {\n this._formControl.setValue('');\n if (focus) {\n this._focus();\n }\n }\n\n\n /**\n * Initializes handling <mat-select [multiple]=\"true\">\n * Note: to improve this code, mat-select should be extended to allow disabling resetting the selection while filtering.\n */\n private initMultipleHandling() {\n if (!this.matSelect.ngControl) {\n if (this.matSelect.multiple) {\n // note: the access to matSelect.ngControl (instead of matSelect.value / matSelect.valueChanges)\n // is necessary to properly work in multi-selection mode.\n console.error('the mat-select containing ngx-mat-select-search must have a ngModel or formControl directive when multiple=true');\n }\n return;\n }\n // if <mat-select [multiple]=\"true\">\n // store previously selected values and restore them when they are deselected\n // because the option is not available while we are currently filtering\n this.previousSelectedValues = this.matSelect.ngControl.value;\n\n if (!this.matSelect.ngControl.valueChanges) {\n return;\n }\n\n this.matSelect.ngControl.valueChanges\n .pipe(takeUntil(this._onDestroy))\n .subscribe((values) => {\n let restoreSelectedValues = false;\n if (this.matSelect.multiple) {\n if ((this.alwaysRestoreSelectedOptionsMulti || (this._formControl.value && this._formControl.value.length))\n && this.previousSelectedValues && Array.isArray(this.previousSelectedValues)) {\n if (!values || !Array.isArray(values)) {\n values = [];\n }\n const optionValues = this.matSelect.options.map(option => option.value);\n this.previousSelectedValues.forEach(previousValue => {\n if (!values.some(v => this.matSelect.compareWith(v, previousValue))\n && !optionValues.some(v => this.matSelect.compareWith(v, previousValue))) {\n // if a value that was selected before is deselected and not found in the options, it was deselected\n // due to the filtering, so we restore it.\n if (this.recreateValuesArray) {\n values = [...values, previousValue];\n } else {\n values.push(previousValue);\n }\n restoreSelectedValues = true;\n }\n });\n }\n }\n this.previousSelectedValues = values;\n\n if (restoreSelectedValues) {\n this.matSelect._onChange(values);\n }\n });\n }\n\n /**\n * Set the width of the innerSelectSearch to fit even custom scrollbars\n * And support all Operating Systems\n */\n public updateInputWidth() {\n if (!this.innerSelectSearch || !this.innerSelectSearch.nativeElement) {\n return;\n }\n let element: HTMLElement | null = this.innerSelectSearch.nativeElement;\n let panelElement: HTMLElement | null = null;\n while (element && element.parentElement) {\n element = element.parentElement;\n if (element.classList.contains('mat-select-panel')) {\n panelElement = element;\n break;\n }\n }\n if (panelElement) {\n this.innerSelectSearch.nativeElement.style.width = panelElement.clientWidth + 'px';\n }\n }\n\n /**\n * Determine the offset to length that can be caused by the optional matOption used as a search input.\n */\n private getOptionsLengthOffset(): number {\n if (this.matOption) {\n return 1;\n } else {\n return 0;\n }\n }\n\n private unselectActiveDescendant() {\n this.activeDescendant?.removeAttribute('aria-selected');\n this.searchSelectInput.nativeElement.removeAttribute('aria-activedescendant');\n }\n\n}\n","<!--\nCopyright (c) 2018 Bithost GmbH All Rights Reserved.\n\nUse of this source code is governed by an MIT-style license that can be\nfound in the LICENSE file at https://angular.io/license\n-->\n<!-- Placeholder to adjust vertical offset of the mat-option elements -->\n<input matInput class=\"mat-select-search-input mat-select-search-hidden\"/>\n\n<!-- Note: the mat-datepicker-content mat-tab-header are needed to inherit the material theme colors, see PR #22 -->\n<div\n #innerSelectSearch\n class=\"mat-select-search-inner mat-typography mat-datepicker-content mat-tab-header\"\n [ngClass]=\"{'mat-select-search-inner-multiple': matSelect.multiple, 'mat-select-search-inner-toggle-all': _isToggleAllCheckboxVisible() }\">\n\n <div class=\"mat-select-search-inner-row\">\n <mat-checkbox *ngIf=\"_isToggleAllCheckboxVisible()\"\n [color]=\"matFormField?.color\"\n class=\"mat-select-search-toggle-all-checkbox\"\n [checked]=\"toggleAllCheckboxChecked\"\n [indeterminate]=\"toggleAllCheckboxIndeterminate\"\n [matTooltip]=\"toggleAllCheckboxTooltipMessage\"\n matTooltipClass=\"ngx-mat-select-search-toggle-all-tooltip\"\n [matTooltipPosition]=\"toggleAllCheckboxTooltipPosition\"\n (change)=\"_emitSelectAllBooleanToParent($event.checked)\"\n ></mat-checkbox>\n\n <input class=\"mat-select-search-input\"\n autocomplete=\"off\"\n [type]=\"type\"\n [formControl]=\"_formControl\"\n #searchSelectInput\n (keydown)=\"_handleKeydown($event)\"\n (keyup)=\"_handleKeyup($event)\"\n (blur)=\"onBlur()\"\n [placeholder]=\"placeholderLabel\"\n [attr.aria-label]=\"ariaLabel\"\n />\n <mat-spinner *ngIf=\"searching\"\n class=\"mat-select-search-spinner\"\n diameter=\"16\"></mat-spinner>\n\n <button *ngIf=\"!hideClearSearchButton && value && !searching\"\n mat-icon-button\n aria-label=\"Clear\"\n (click)=\"_reset(true)\"\n class=\"mat-select-search-clear\">\n <ng-content *ngIf=\"clearIcon; else defaultIcon\" select=\"[ngxMatSelectSearchClear]\"></ng-content>\n <ng-template #defaultIcon>\n <mat-icon [svgIcon]=\"closeSvgIcon\">\n {{!closeSvgIcon ? closeIcon : null}}\n </mat-icon>\n </ng-template>\n </button>\n\n <ng-content select=\".mat-select-search-custom-header-content\"></ng-content>\n </div>\n\n <mat-divider></mat-divider>\n</div>\n\n<div *ngIf=\"_showNoEntriesFound$ | async\"\n class=\"mat-select-search-no-entries-found\">\n <ng-content *ngIf=\"noEntriesFound; else defaultNoEntriesFound\"\n select=\"[ngxMatSelectNoEntriesFound]\"></ng-content>\n <ng-template #defaultNoEntriesFound>{{noEntriesFoundLabel}}</ng-template>\n</div>\n\n","/**\n * Copyright (c) 2018 Bithost GmbH All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport { NgModule } from '@angular/core';\nimport { MatSelectSearchComponent } from './mat-select-search.component';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { CommonModule } from '@angular/common';\n\nimport { MatSelectSearchClearDirective } from './mat-select-search-clear.directive';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { MatSelectNoEntriesFoundDirective } from './mat-select-no-entries-found.directive';\nimport { MatDividerModule } from '@angular/material/divider';\n\nexport const MatSelectSearchVersion = '8.0.0';\nexport { MatSelectSearchClearDirective };\nexport { MatSelectNoEntriesFoundDirective };\n\n@NgModule({\n imports: [\n CommonModule,\n ReactiveFormsModule,\n MatButtonModule,\n MatCheckboxModule,\n MatIconModule,\n MatProgressSpinnerModule,\n MatTooltipModule,\n MatDividerModule,\n ],\n declarations: [\n MatSelectSearchComponent,\n MatSelectSearchClearDirective,\n MatSelectNoEntriesFoundDirective\n ],\n exports: [\n MatSelectSearchComponent,\n MatSelectSearchClearDirective,\n MatSelectNoEntriesFoundDirective\n ]\n})\nexport class NgxMatSelectSearchModule {\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}