{"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})\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})\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, ReactiveFormsModule } 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';\nimport { MatCheckbox } from '@angular/material/checkbox';\nimport { MatDivider } from '@angular/material/divider';\nimport { AsyncPipe } from '@angular/common';\nimport { MatTooltip } from '@angular/material/tooltip';\nimport { MatProgressSpinner } from '@angular/material/progress-spinner';\nimport { MatIcon } from '@angular/material/icon';\nimport { MatButtonModule } from '@angular/material/button';\n\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  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  imports: [\n    AsyncPipe,\n    ReactiveFormsModule,\n    MatCheckbox,\n    MatDivider,\n    MatTooltip,\n    MatProgressSpinner,\n    MatIcon,\n    MatButtonModule\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: () => void = ()  => {\n    // do nothing.\n  };\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\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\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  // eslint-disable-next-line @typescript-eslint/no-explicit-any\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 (Object.prototype.hasOwnProperty.call(defaultOptions, key)) {\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\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    // 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: () => void) {\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      [class.mat-select-search-inner-multiple]=\"matSelect.multiple\"\n      [class.mat-select-search-inner-toggle-all]=\"_isToggleAllCheckboxVisible()\">\n\n  <div class=\"mat-select-search-inner-row\">\n    @if(_isToggleAllCheckboxVisible())\n    {\n      <mat-checkbox [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    }\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    @if(searching)\n    {\n      <mat-spinner class=\"mat-select-search-spinner\"\n                   diameter=\"16\" />\n    }\n\n    @if(!hideClearSearchButton && value && !searching)\n    {\n      <button mat-icon-button\n              aria-label=\"Clear\"\n              (click)=\"_reset(true)\"\n              class=\"mat-select-search-clear\">\n        @if(clearIcon)\n        {\n          <ng-content select=\"[ngxMatSelectSearchClear]\" />\n        }\n        @else if(closeSvgIcon)\n        {\n          <mat-icon [svgIcon]=\"closeSvgIcon\" />\n        }\n        @else\n        {\n          <mat-icon>\n            {{closeIcon}}\n          </mat-icon>\n        }\n      </button>\n    }\n\n\n    <ng-content select=\".mat-select-search-custom-header-content\" />\n  </div>\n\n  <mat-divider />\n</div>\n\n@if(_showNoEntriesFound$ | async)\n{\n  <div class=\"mat-select-search-no-entries-found\">\n    @if(noEntriesFound)\n    {\n      <ng-content select=\"[ngxMatSelectNoEntriesFound]\" />\n    }\n    @else\n    {\n      {{noEntriesFoundLabel}}\n    }\n  </div>\n}\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';\n\nimport { MatSelectSearchClearDirective } from './mat-select-search-clear.directive';\nimport { MatSelectNoEntriesFoundDirective } from './mat-select-no-entries-found.directive';\n\nexport const MatSelectSearchVersion = '8.0.2';\nexport { MatSelectSearchClearDirective };\nexport { MatSelectNoEntriesFoundDirective };\n\n@NgModule({\n  imports: [\n    MatSelectSearchComponent,\n    MatSelectSearchClearDirective,\n    MatSelectNoEntriesFoundDirective\n  ],\n  exports: [\n    MatSelectSearchComponent,\n    MatSelectSearchClearDirective,\n    MatSelectNoEntriesFoundDirective\n  ]\n})\nexport class NgxMatSelectSearchModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}