{"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, Provider } 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\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\n/**\n * Provides default options for the `MatSelectSearchComponent`. e.g.\n *\n * ```typescript\n * providers: [\n *   provideMatSelectSearchOptions({\n *     closeIcon: 'delete',\n *     noEntriesFoundLabel: 'No options found'\n *   })\n * ]\n * ```\n *\n * See the corresponding inputs of `MatSelectSearchComponent` for documentation.\n */\nexport function provideMatSelectSearchOptions(options: MatSelectSearchOptions): Provider {\n  return {\n     provide: MAT_SELECTSEARCH_DEFAULT_OPTIONS,\n     useValue: options\n   }\n}\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  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  /** Removes the panel-level keydown listener registered while the panel is open. */\n  private _removePanelKeydownListener?: () => void;\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        (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          this._installPanelKeydownListener();\n        } else {\n          this._removePanelKeydownListener?.();\n          this._removePanelKeydownListener = undefined;\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._removePanelKeydownListener?.();\n    this._removePanelKeydownListener = undefined;\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   * Angular Material v21 inlines the select panel into the mat-select host element via a\n   * popover (cdkConnectedOverlayUsePopover=\"inline\"). As a result, keydown events on the\n   * panel bubble up to mat-select's host (keydown) listener, which calls _handleKeydown a\n   * second time after the panel's template (keydown) already handled it — causing arrow\n   * navigation to skip items and Enter to double-fire. We stop propagation at the panel\n   * after its template handler runs, leaving popover behavior intact.\n   *\n   * Escape is intentionally excluded: mat-select closes the panel on Escape via the CDK\n   * overlay's body-level keydown dispatcher (overlayKeydown -> _handleOverlayKeydown), so\n   * the event must be allowed to bubble out of the panel. See #594.\n   */\n  private _installPanelKeydownListener() {\n    this._removePanelKeydownListener?.();\n    this._removePanelKeydownListener = undefined;\n\n    const panel = this.matSelect.panel?.nativeElement as HTMLElement | undefined;\n    if (!panel) {\n      return;\n    }\n\n    const handler = (event: KeyboardEvent) => {\n      if (event.key === 'Escape') {\n        return;\n      }\n      event.stopPropagation();\n    };\n    panel.addEventListener('keydown', handler);\n    this._removePanelKeydownListener = () => panel.removeEventListener('keydown', handler);\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: any) => 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 = '9.0.0';\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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"}