UNPKG

novo-elements

Version:

1 lines 46.9 kB
{"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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"}