{"version":3,"file":"novo-elements-elements-select-search.mjs","sources":["../../../projects/novo-elements/src/elements/select-search/select-search-clear.directive.ts","../../../projects/novo-elements/src/elements/select-search/select-search.component.ts","../../../projects/novo-elements/src/elements/select-search/select-search.component.html","../../../projects/novo-elements/src/elements/select-search/select-search.module.ts","../../../projects/novo-elements/src/elements/select-search/novo-elements-elements-select-search.ts"],"sourcesContent":["import { Directive } from '@angular/core';\n\n/**\n * Directive for providing a custom clear-icon.\n * e.g.\n * <novo-select-search [formControl]=\"bankFilterCtrl\">\n *   <novo-icon novoSelectSearchClear>x</novo-icon>\n * </novo-select-search>\n */\n@Directive({\n    selector: '[novoSelectSearchClear]',\n    standalone: false,\n})\nexport class NovoSelectSearchClearDirective {}\n","import { LiveAnnouncer } from '@angular/cdk/a11y';\nimport { ViewportRuler } from '@angular/cdk/scrolling';\nimport {\n  ChangeDetectionStrategy,\n  ChangeDetectorRef,\n  Component,\n  ContentChild,\n  ElementRef,\n  EventEmitter,\n  forwardRef,\n  HostBinding,\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 { BehaviorSubject, combineLatest, Observable, of, Subject } from 'rxjs';\nimport { debounceTime, delay, distinctUntilChanged, filter, map, startWith, switchMap, take, takeUntil, tap } from 'rxjs/operators';\nimport { BooleanInput, isAlphaNumeric, Key } from 'novo-elements/utils';\nimport { NovoOption, _countGroupLabelsBeforeOption } from 'novo-elements/elements/common';\nimport { NovoFieldElement } from 'novo-elements/elements/field';\nimport { NovoSelectElement } from 'novo-elements/elements/select';\nimport { NovoSelectSearchClearDirective } from './select-search-clear.directive';\n\n/** The max height of the select's overlay panel. */\nconst SELECT_PANEL_MAX_HEIGHT = 256;\nlet autoIncrement = 1;\n/**\n * Component providing an input field for searching NovoSelectElement 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 *     <novo-form-field>\n *       <novo-select [formControl]=\"bankCtrl\" placeholder=\"Bank\">\n *         <novo-option>\n *           <ngx-novo-select-search [formControl]=\"bankFilterCtrl\"></ngx-novo-select-search>\n *         </novo-option>\n *         <novo-option *ngFor=\"let bank of filteredBanks | async\" [value]=\"bank.id\">\n *           {{bank.name}}\n *         </novo-option>\n *       </novo-select>\n *     </novo-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 NovoSelectElement 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: 'novo-select-search',\n    templateUrl: './select-search.component.html',\n    styleUrls: ['./select-search.component.scss'],\n    providers: [\n        {\n            provide: NG_VALUE_ACCESSOR,\n            useExisting: forwardRef(() => NovoSelectSearchComponent),\n            multi: true,\n        },\n    ],\n    changeDetection: ChangeDetectionStrategy.OnPush,\n    standalone: false,\n})\nexport class NovoSelectSearchComponent implements OnInit, OnDestroy, ControlValueAccessor {\n  @Input() name = 'select-search-' + autoIncrement++;\n  /** Label of the search placeholder */\n  @Input() placeholderLabel = 'Search';\n\n  /** Type of the search input field */\n  @Input() type = 'text';\n\n  /** Label to be shown when no entries are found. Set to null if no message should be shown. */\n  @Input() noEntriesFoundLabel = 'No Records Found';\n\n  /**\n   *  Text that is appended to the currently active item label announced by screen readers,\n   *  informing the user of the current index, value and total options.\n   *  eg: Bank R (Germany) 1 of 6\n   */\n  @Input() indexAndLengthScreenReaderText = ' of ';\n\n  /**\n   * Whether or not the search field should be cleared after the dropdown menu is closed.\n   * Useful for server-side filtering.\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  /** Allow user to uncheck a value while filtering. */\n  @Input() @BooleanInput() allowDeselectDuringFilter = false;\n\n  /**\n   * Prevents home / end key being propagated to novo-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 novo-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() toogleAllCheckboxTooltipPosition: '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  /** 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(NovoSelectSearchClearDirective, { static: false }) clearIcon: NovoSelectSearchClearDirective;\n\n  @HostBinding('class.novo-select-search-inside-novo-option')\n  get isInsideNovoOption(): boolean {\n    return !!this.novoOption;\n  }\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  public _formControl: FormControl = new FormControl('');\n\n  /** Reference to the NovoSelectElement options */\n  public set _options(_options: QueryList<NovoOption>) {\n    this._options$.next(_options);\n  }\n  public get _options(): QueryList<NovoOption> {\n    return this._options$.getValue();\n  }\n  public _options$: BehaviorSubject<QueryList<NovoOption>> = new BehaviorSubject<QueryList<NovoOption>>(null);\n\n  private _filterFinishedRerender = this._formControl.valueChanges.pipe(debounceTime(1));\n\n  private optionsList$: Observable<NovoOption[]> = this._options$.pipe(\n    switchMap((_options) =>\n      _options\n        ? combineLatest([_options.changes, this._filterFinishedRerender]).pipe(\n            map(([options]) => options.toArray().filter(option => !(option._getHostElement()?.classList.contains('add-option') || option._getHostElement().hidden))),\n            startWith<NovoOption[]>(_options.toArray()),\n            distinctUntilChanged((optsA, optsB) => optsA.map(opt => opt.value).join(',') === optsB.map(opt => opt.value).join(',')),\n          )\n        : of(null),\n    ),\n  );\n\n  private optionsLength$: Observable<number> = this.optionsList$.pipe(map((options) => (options ? options.length : 0)));\n\n  /** Previously selected values when using <novo-select [multiple]=\"true\">*/\n  private previousSelectedValues: any[];\n\n  /** whether to show the no entries found message */\n  public _showNoEntriesFound$: Observable<boolean> = combineLatest([this._formControl.valueChanges, this.optionsLength$]).pipe(\n    map(([value, optionsLength]) => this.noEntriesFoundLabel && value && optionsLength === this.getOptionsLengthOffset()),\n  );\n\n  /** Subject that emits when the component has been destroyed. */\n  private _onDestroy = new Subject<void>();\n\n  constructor(\n    @Inject(NovoSelectElement) public novoSelect: NovoSelectElement,\n    public changeDetectorRef: ChangeDetectorRef,\n    private _viewportRuler: ViewportRuler,\n    @Optional() @Inject(NovoOption) public novoOption: NovoOption = null,\n    private liveAnnouncer: LiveAnnouncer,\n    @Optional() @Inject(NovoFieldElement) public matFormField: NovoFieldElement = null,\n  ) {\n    this.novoSelect.hideLegacyOptionsForSearch.set(true);\n  }\n\n  ngOnInit() {\n    // set custom novo-option class if the component was placed inside a novo-option\n    if (this.novoOption) {\n      this.novoOption.novoInert = true;\n      this.novoOption._getHostElement().classList.add('contains-novo-select-search');\n    } else {\n      console.error('<novo-select-search> must be placed inside a <novo-option> element');\n    }\n\n    // when the select dropdown panel is opened or closed\n    this.novoSelect.openedChange.pipe(delay(1), takeUntil(this._onDestroy)).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    // set the first item active after the options changed\n    this.novoSelect.openedChange\n      .pipe(take(1))\n      .pipe(takeUntil(this._onDestroy))\n      .subscribe(() => {\n        if (this.novoSelect._keyManager) {\n          this.novoSelect._keyManager.change\n            .pipe(takeUntil(this._onDestroy))\n            .subscribe(() => this.adjustScrollTopToFitActiveOptionIntoView());\n        } else {\n          console.warn('_keyManager was not initialized.');\n        }\n\n        this._options = this.novoSelect.contentOptions;\n\n        // Closure variable for tracking the most recent first option.\n        // In order to avoid 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        this._options.changes.pipe(takeUntil(this._onDestroy)).subscribe(() => {\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.novoSelect._keyManager;\n            if (keyManager && this.novoSelect.panelOpen) {\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 = !this.novoSelect.compareWith(previousFirstOption, currentFirstOption);\n\n              // CASE: The first option is different now.\n              // Indiciates we should set it as active and scroll to the top.\n              if (\n                firstOptionIsChanged ||\n                !keyManager.activeItem ||\n                !options.find((option) => this.novoSelect.compareWith(option, keyManager.activeItem))\n              ) {\n                keyManager.setFirstItemActive();\n              }\n\n              // wait for panel width changes\n              setTimeout(() => {\n                this.updateInputWidth();\n              });\n\n              if (!this.disableScrollToActiveOnOptionsChanged) {\n                this.adjustScrollTopToFitActiveOptionIntoView();\n              }\n            }\n\n            // Update our reference\n            previousFirstOption = currentFirstOption;\n          });\n        });\n      });\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(takeUntil(this._onDestroy)).subscribe((showNoEntriesFound) => {\n      // set no entries found class on mat option\n      if (this.novoOption) {\n        if (showNoEntriesFound) {\n          this.novoOption._getHostElement().classList.add('novo-select-search-no-entries-found');\n        } else {\n          this.novoOption._getHostElement().classList.remove('novo-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\n      .change()\n      .pipe(takeUntil(this._onDestroy))\n      .subscribe(() => {\n        if (this.novoSelect.panelOpen) {\n          this.updateInputWidth();\n        }\n      });\n\n    if (!this.allowDeselectDuringFilter) {\n      this.initMultipleHandling();\n    }\n\n    this.optionsList$.pipe(takeUntil(this._onDestroy)).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.novoSelect.multiple && this.showToggleAllCheckbox;\n  }\n\n  /**\n   * Handles the key down event with NovoSelectElement.\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    if (\n      (event.key && event.key.length === 1) ||\n      isAlphaNumeric(event.key) ||\n      event.key === Key.Space ||\n      (this.preventHomeEndKeyPropagation && (event.key === Key.Home || event.key === Key.End))\n    ) {\n      event.stopPropagation();\n    }\n\n    if (this.novoSelect.multiple && event.key && event.key === 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 === true && event.key === Key.Escape && this.value) {\n      this._reset(true);\n      event.stopPropagation();\n    }\n  }\n\n  /**\n   * Handles the key up event with NovoSelectElement.\n   * Allows e.g. the announcing of the currently activeDescendant by screen readers.\n   */\n  _handleKeyup(event: KeyboardEvent) {\n    if (event.key === Key.ArrowUp || event.key === Key.ArrowDown) {\n      const ariaActiveDescendantId = this.novoSelect._getAriaActiveDescendant();\n      const index = this._options.toArray().findIndex((item) => item.id === ariaActiveDescendantId);\n      if (index !== -1) {\n        const activeDescendant = this._options.toArray()[index];\n        this.liveAnnouncer.announce(\n          activeDescendant.viewValue + ' ' + this.getAriaIndex(index) + this.indexAndLengthScreenReaderText + this.getAriaLength(),\n        );\n      }\n    }\n  }\n\n  /**\n   * Calculate the index of the current option, taking the offset to length into account.\n   * examples:\n   *    Case 1 [Search, 1, 2, 3] will have offset of 1, due to search and will read index of total.\n   *    Case 2 [1, 2, 3] will have offset of 0 and will read index +1 of total.\n   */\n  getAriaIndex(optionIndex: number): number {\n    if (this.getOptionsLengthOffset() === 0) {\n      return optionIndex + 1;\n    }\n    return optionIndex;\n  }\n\n  /**\n   * Calculate the length of the options, taking the offset to length into account.\n   * examples:\n   *    Case 1 [Search, 1, 2, 3] will have length of options.length -1, due to search.\n   *    Case 2 [1, 2, 3] will have length of options.length.\n   */\n  getAriaLength(): number {\n    return this._options.toArray().length - this.getOptionsLengthOffset();\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.onTouched();\n  }\n\n  registerOnChange(fn: (value: string) => void) {\n    this._formControl.valueChanges\n      .pipe(\n        filter((value) => value !== this._lastExternalInputValue),\n        tap(() => (this._lastExternalInputValue = undefined)),\n        takeUntil(this._onDestroy),\n      )\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.novoSelect.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.novoSelect.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   * Initializes handling <novo-select [multiple]=\"true\">\n   * Note: to improve this code, novo-select should be extended to allow disabling resetting the selection while filtering.\n   */\n  private initMultipleHandling() {\n    if (!this.novoSelect.ngControl) {\n      if (this.novoSelect.multiple) {\n        // note: the access to novoSelect.ngControl (instead of novoSelect.value / novoSelect.valueChanges)\n        // is necessary to properly work in multi-selection mode.\n        console.error('the novo-select containing novo-select-search must have a ngModel or formControl directive when multiple=true');\n      }\n      return;\n    }\n    // if <novo-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.novoSelect.ngControl.value;\n\n    this.novoSelect.ngControl.valueChanges.pipe(takeUntil(this._onDestroy)).subscribe((values) => {\n      let restoreSelectedValues = false;\n      if (this.novoSelect.multiple) {\n        if (\n          (this.alwaysRestoreSelectedOptionsMulti || (this._formControl.value && this._formControl.value.length)) &&\n          this.previousSelectedValues &&\n          Array.isArray(this.previousSelectedValues)\n        ) {\n          if (!values || !Array.isArray(values)) {\n            values = [];\n          }\n          const optionValues = (this.novoSelect.options || []).map((option) => option.value);\n          this.previousSelectedValues.forEach((previousValue) => {\n            if (\n              !values.some((v) => this.novoSelect.compareWith(v, previousValue)) &&\n              !optionValues.some((v) => this.novoSelect.compareWith(v, previousValue))\n            ) {\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              values.push(previousValue);\n              restoreSelectedValues = true;\n            }\n          });\n        }\n      }\n      this.previousSelectedValues = values;\n\n      if (restoreSelectedValues) {\n        // TODO: Fix this\n        // this.novoSelect._onChange(values);\n      }\n    });\n  }\n\n  /**\n   * Scrolls the currently active option into the view if it is not yet visible.\n   */\n  private adjustScrollTopToFitActiveOptionIntoView(): void {\n    if (this.novoSelect.panel && this.novoSelect.contentOptions.length > 0) {\n      const novoOptionHeight = this.getNovoOptionHeight();\n      const activeOptionIndex = this.novoSelect._keyManager.activeItemIndex || 0;\n      const labelCount = _countGroupLabelsBeforeOption(activeOptionIndex, this.novoSelect.contentOptions, this.novoSelect.optionGroups);\n      // If the component is in a NovoOption, the activeItemIndex will be offset by one.\n      const indexOfOptionToFitIntoView = (this.novoOption ? -1 : 0) + labelCount + activeOptionIndex;\n      const currentScrollTop = this.novoSelect.panel.nativeElement.scrollTop;\n\n      const searchInputHeight = this.innerSelectSearch.nativeElement.offsetHeight;\n      const amountOfVisibleOptions = Math.floor((SELECT_PANEL_MAX_HEIGHT - searchInputHeight) / novoOptionHeight);\n\n      const indexOfFirstVisibleOption = Math.round((currentScrollTop + searchInputHeight) / novoOptionHeight) - 1;\n\n      if (indexOfFirstVisibleOption >= indexOfOptionToFitIntoView) {\n        this.novoSelect.panel.nativeElement.scrollTop = indexOfOptionToFitIntoView * novoOptionHeight;\n      } else if (indexOfFirstVisibleOption + amountOfVisibleOptions <= indexOfOptionToFitIntoView) {\n        this.novoSelect.panel.nativeElement.scrollTop =\n          (indexOfOptionToFitIntoView + 1) * novoOptionHeight - (SELECT_PANEL_MAX_HEIGHT - searchInputHeight);\n      }\n    }\n  }\n\n  /**\n   *  Set the width of the innerSelectSearch to fit even custom scrollbars\n   *  And support all Operation Systems\n   */\n  public updateInputWidth() {\n    if (!this.innerSelectSearch || !this.innerSelectSearch.nativeElement) {\n      return;\n    }\n    let element: HTMLElement = this.innerSelectSearch.nativeElement;\n    let panelElement: HTMLElement;\n    while ((element = element.parentElement)) {\n      if (element.classList.contains('novo-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  private getNovoOptionHeight(): number {\n    if (this.novoSelect.contentOptions.length > 0) {\n      return this.novoSelect.contentOptions.first._getHostElement().getBoundingClientRect().height;\n    }\n\n    return 0;\n  }\n\n  /**\n   * Determine the offset to length that can be caused by the optional novoOption used as a search input.\n   */\n  private getOptionsLengthOffset(): number {\n    if (this.novoOption) {\n      return 1;\n    } else {\n      return 0;\n    }\n  }\n}\n","<novo-field\n  #innerSelectSearch\n  class=\"novo-select-search-inner\"\n  [ngClass]=\"{'novo-select-search-inner-multiple': novoSelect.multiple, 'novo-select-search-inner-toggle-all': _isToggleAllCheckboxVisible() }\">\n\n  <novo-checkbox *ngIf=\"_isToggleAllCheckboxVisible()\"\n    novoPrefix\n    [color]=\"'primary'\"\n    class=\"novo-select-search-toggle-all-checkbox\"\n    [checked]=\"toggleAllCheckboxChecked\"\n    [indeterminate]=\"toggleAllCheckboxIndeterminate\"\n    [tooltip]=\"toggleAllCheckboxTooltipMessage\"\n    tooltipClass=\"ngx-novo-select-search-toggle-all-tooltip\"\n    [tooltipPosition]=\"toogleAllCheckboxTooltipPosition\"\n    (change)=\"_emitSelectAllBooleanToParent($event.checked)\"></novo-checkbox>\n\n  <novo-icon\n    novoPrefix\n    class=\"novo-select-search-icon\">search</novo-icon>\n\n  <input class=\"novo-select-search-input\"\n    #searchSelectInput\n    novoInput\n    [name]=\"name\"\n    autocomplete=\"off\"\n    [type]=\"type\"\n    [formControl]=\"_formControl\"\n    (keydown)=\"_handleKeydown($event)\"\n    (keyup)=\"_handleKeyup($event)\"\n    (blur)=\"onBlur()\"\n    [placeholder]=\"placeholderLabel\"\n    [attr.aria-label]=\"ariaLabel\" />\n\n  <novo-spinner *ngIf=\"searching\"\n    novoSuffix\n    class=\"novo-select-search-spinner\"\n    diameter=\"16\"></novo-spinner>\n\n  <novo-button\n    novoSuffix\n    *ngIf=\"!hideClearSearchButton && value && !searching\"\n    aria-label=\"Clear\"\n    (click)=\"_reset(true)\"\n    theme=\"icon\"\n    size=\"small\"\n    class=\"novo-select-search-clear\">\n    <ng-content *ngIf=\"clearIcon; else defaultIcon\" select=\"[novoSelectSearchClear]\"></ng-content>\n    <ng-template #defaultIcon>\n      <novo-icon>close</novo-icon>\n    </ng-template>\n  </novo-button>\n\n  <ng-content select=\".novo-select-search-custom-header-content\"></ng-content>\n\n</novo-field>\n\n<div *ngIf=\"_showNoEntriesFound$ | async\"\n  class=\"novo-select-search-no-entries-found\">\n  {{noEntriesFoundLabel}}\n</div>","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { NovoButtonModule } from 'novo-elements/elements/button';\nimport { NovoCheckboxModule } from 'novo-elements/elements/checkbox';\nimport { NovoCommonModule } from 'novo-elements/elements/common';\nimport { NovoFieldModule } from 'novo-elements/elements/field';\nimport { NovoIconModule } from 'novo-elements/elements/icon';\nimport { NovoLoadingModule } from 'novo-elements/elements/loading';\nimport { NovoTooltipModule } from 'novo-elements/elements/tooltip';\nimport { NovoSelectSearchClearDirective } from './select-search-clear.directive';\nimport { NovoSelectSearchComponent } from './select-search.component';\n\n@NgModule({\n  imports: [\n    CommonModule,\n    ReactiveFormsModule,\n    NovoCheckboxModule,\n    NovoButtonModule,\n    NovoCommonModule,\n    NovoIconModule,\n    NovoLoadingModule,\n    NovoTooltipModule,\n    NovoFieldModule,\n  ],\n  declarations: [NovoSelectSearchComponent, NovoSelectSearchClearDirective],\n  exports: [NovoSelectSearchComponent, NovoSelectSearchClearDirective],\n})\nexport class NovoSelectSearchModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}