primeng
Version: 
[](https://opensource.org/licenses/MIT) [](https://badge.fury.io/js/primeng) [
{"version":3,"file":"primeng-autocomplete.mjs","sources":["../../src/app/components/autocomplete/autocomplete.ts","../../src/app/components/autocomplete/primeng-autocomplete.ts"],"sourcesContent":["import {NgModule,Component,ViewChild,ElementRef,AfterViewChecked,AfterContentInit,OnDestroy,Input,Output,EventEmitter,ContentChildren,QueryList,TemplateRef,Renderer2,forwardRef,ChangeDetectorRef,IterableDiffers,ChangeDetectionStrategy, ViewEncapsulation} from '@angular/core';\nimport {CommonModule} from '@angular/common';\nimport {trigger,style,transition,animate,AnimationEvent} from '@angular/animations';\nimport {InputTextModule} from 'primeng/inputtext';\nimport {ButtonModule} from 'primeng/button';\nimport {RippleModule} from 'primeng/ripple';\nimport {SharedModule,PrimeTemplate, TranslationKeys, PrimeNGConfig, OverlayService} from 'primeng/api';\nimport {DomHandler, ConnectedOverlayScrollHandler} from 'primeng/dom';\nimport {ObjectUtils, UniqueComponentId, ZIndexUtils} from 'primeng/utils';\nimport {NG_VALUE_ACCESSOR, ControlValueAccessor} from '@angular/forms';\nimport {Scroller, ScrollerModule, ScrollerOptions} from 'primeng/scroller';\nimport {AutoFocusModule} from 'primeng/autofocus';\n\nexport const AUTOCOMPLETE_VALUE_ACCESSOR: any = {\n  provide: NG_VALUE_ACCESSOR,\n  useExisting: forwardRef(() => AutoComplete),\n  multi: true\n};\n\n@Component({\n    selector: 'p-autoComplete',\n    template: `\n        <span #container [ngClass]=\"{'p-autocomplete p-component':true,'p-autocomplete-dd':dropdown,'p-autocomplete-multiple':multiple}\" [ngStyle]=\"style\" [class]=\"styleClass\">\n            <input [pAutoFocus]=\"autofocus\" *ngIf=\"!multiple\" #in [attr.type]=\"type\" [attr.id]=\"inputId\" [ngStyle]=\"inputStyle\" [class]=\"inputStyleClass\" [autocomplete]=\"autocomplete\" [attr.required]=\"required\" [attr.name]=\"name\"\n            class=\"p-autocomplete-input p-inputtext p-component\" [ngClass]=\"{'p-autocomplete-dd-input':dropdown,'p-disabled': disabled}\" [value]=\"inputFieldValue\" aria-autocomplete=\"list\" role=\"searchbox\"\n            (click)=\"onInputClick($event)\" (input)=\"onInput($event)\" (keydown)=\"onKeydown($event)\" (keyup)=\"onKeyup($event)\" (focus)=\"onInputFocus($event)\" (blur)=\"onInputBlur($event)\" (change)=\"onInputChange($event)\" (paste)=\"onInputPaste($event)\"\n            [attr.placeholder]=\"placeholder\" [attr.size]=\"size\" [attr.maxlength]=\"maxlength\" [attr.tabindex]=\"tabindex\" [readonly]=\"readonly\" [disabled]=\"disabled\" [attr.aria-label]=\"ariaLabel\" [attr.aria-labelledby]=\"ariaLabelledBy\" [attr.aria-required]=\"required\">\n            <i *ngIf=\"!multiple && filled && !disabled && showClear\" class=\"p-autocomplete-clear-icon pi pi-times\" (click)=\"clear()\"></i>\n            <i *ngIf=\"multiple && filled && !disabled && showClear\" class=\"p-autocomplete-clear-icon pi pi-times\" (click)=\"clear()\"></i>\n            <ul *ngIf=\"multiple\" #multiContainer class=\"p-autocomplete-multiple-container p-component p-inputtext\" [ngClass]=\"{'p-disabled':disabled,'p-focus':focus}\" (click)=\"multiIn.focus()\">\n                <li #token *ngFor=\"let val of value\" class=\"p-autocomplete-token\">\n                    <ng-container *ngTemplateOutlet=\"selectedItemTemplate; context: {$implicit: val}\"></ng-container>\n                    <span *ngIf=\"!selectedItemTemplate\" class=\"p-autocomplete-token-label\">{{resolveFieldData(val)}}</span>\n                    <span  class=\"p-autocomplete-token-icon pi pi-times-circle\" (click)=\"removeItem(token)\" *ngIf=\"!disabled && !readonly\"></span>\n                </li>\n                <li class=\"p-autocomplete-input-token\">\n                    <input [pAutoFocus]=\"autofocus\" #multiIn [attr.type]=\"type\" [attr.id]=\"inputId\" [disabled]=\"disabled\" [attr.placeholder]=\"(value&&value.length ? null : placeholder)\" [attr.tabindex]=\"tabindex\" [attr.maxlength]=\"maxlength\" (input)=\"onInput($event)\"  (click)=\"onInputClick($event)\"\n                            (keydown)=\"onKeydown($event)\" [readonly]=\"readonly\" (keyup)=\"onKeyup($event)\" (focus)=\"onInputFocus($event)\" (blur)=\"onInputBlur($event)\" (change)=\"onInputChange($event)\" (paste)=\"onInputPaste($event)\" [autocomplete]=\"autocomplete\"\n                            [ngStyle]=\"inputStyle\" [class]=\"inputStyleClass\" [attr.aria-label]=\"ariaLabel\" [attr.aria-labelledby]=\"ariaLabelledBy\" [attr.aria-required]=\"required\"\n                            aria-autocomplete=\"list\" [attr.aria-controls]=\"listId\" role=\"searchbox\" [attr.aria-expanded]=\"overlayVisible\" aria-haspopup=\"true\" [attr.aria-activedescendant]=\"'p-highlighted-option'\">\n                </li>\n            </ul>\n            <i *ngIf=\"loading\" class=\"p-autocomplete-loader pi pi-spinner pi-spin\"></i><button #ddBtn type=\"button\" pButton [icon]=\"dropdownIcon\" [attr.aria-label]=\"dropdownAriaLabel\" class=\"p-autocomplete-dropdown\" [disabled]=\"disabled\" pRipple\n                (click)=\"handleDropdownClick($event)\" *ngIf=\"dropdown\" [attr.tabindex]=\"tabindex\"></button>\n            <div #panel *ngIf=\"overlayVisible\" (click)=\"onOverlayClick($event)\" [ngClass]=\"['p-autocomplete-panel p-component']\" [style.max-height]=\"virtualScroll ? 'auto' : scrollHeight\" [ngStyle]=\"panelStyle\" [class]=\"panelStyleClass\"\n                [@overlayAnimation]=\"{value: 'visible', params: {showTransitionParams: showTransitionOptions, hideTransitionParams: hideTransitionOptions}}\" (@overlayAnimation.start)=\"onOverlayAnimationStart($event)\" (@overlayAnimation.done)=\"onOverlayAnimationEnd($event)\">\n                <ng-container *ngTemplateOutlet=\"headerTemplate\"></ng-container>\n                <p-scroller *ngIf=\"virtualScroll\" #scroller [items]=\"suggestions\" [style]=\"{'height': scrollHeight}\" [itemSize]=\"virtualScrollItemSize||_itemSize\" [autoSize]=\"true\"\n                    [lazy]=\"lazy\" (onLazyLoad)=\"onLazyLoad.emit($event)\" [options]=\"virtualScrollOptions\">\n                    <ng-template pTemplate=\"content\" let-items let-scrollerOptions=\"options\">\n                        <ng-container *ngTemplateOutlet=\"buildInItems; context: {$implicit: items, options: scrollerOptions}\"></ng-container>\n                    </ng-template>\n                    <ng-container *ngIf=\"loaderTemplate\">\n                        <ng-template pTemplate=\"loader\" let-scrollerOptions=\"options\">\n                            <ng-container *ngTemplateOutlet=\"loaderTemplate; context: {options: scrollerOptions}\"></ng-container>\n                        </ng-template>\n                    </ng-container>\n                </p-scroller>\n                <ng-container *ngIf=\"!virtualScroll\">\n                    <ng-container *ngTemplateOutlet=\"buildInItems; context: {$implicit: suggestions, options: {}}\"></ng-container>\n                </ng-container>\n\n                <ng-template #buildInItems let-items let-scrollerOptions=\"options\">\n                    <ul #items role=\"listbox\" [attr.id]=\"listId\" class=\"p-autocomplete-items\" [ngClass]=\"scrollerOptions.contentStyleClass\" [style]=\"scrollerOptions.contentStyle\">\n                        <ng-container *ngIf=\"group\">\n                            <ng-template ngFor let-optgroup [ngForOf]=\"items\">\n                                <li class=\"p-autocomplete-item-group\" [ngStyle]=\"{'height': scrollerOptions.itemSize + 'px'}\">\n                                    <span *ngIf=\"!groupTemplate\">{{getOptionGroupLabel(optgroup)||'empty'}}</span>\n                                    <ng-container *ngTemplateOutlet=\"groupTemplate; context: {$implicit: optgroup}\"></ng-container>\n                                </li>\n                                <ng-container *ngTemplateOutlet=\"itemslist; context: {$implicit: getOptionGroupChildren(optgroup)}\"></ng-container>\n                            </ng-template>\n                        </ng-container>\n                        <ng-container *ngIf=\"!group\">\n                            <ng-container *ngTemplateOutlet=\"itemslist; context: {$implicit: items}\"></ng-container>\n                        </ng-container>\n                        <ng-template #itemslist let-suggestionsToDisplay>\n                            <li role=\"option\" *ngFor=\"let option of suggestionsToDisplay; let idx = index\" class=\"p-autocomplete-item\" pRipple [ngStyle]=\"{'height': scrollerOptions.itemSize + 'px'}\" [ngClass]=\"{'p-highlight': (option === highlightOption)}\" [id]=\"highlightOption == option ? 'p-highlighted-option':''\" (click)=\"selectItem(option)\">\n                                <span *ngIf=\"!itemTemplate\">{{resolveFieldData(option)}}</span>\n                                <ng-container *ngTemplateOutlet=\"itemTemplate; context: {$implicit: option, index: scrollerOptions.getOptions ? scrollerOptions.getOptions(idx) : idx}\"></ng-container>\n                            </li>\n                        </ng-template>\n                        <li *ngIf=\"noResults && showEmptyMessage\" class=\"p-autocomplete-empty-message\" [ngStyle]=\"{'height': scrollerOptions.itemSize + 'px'}\">\n                            <ng-container *ngIf=\"!emptyTemplate; else empty\">\n                                {{emptyMessageLabel}}\n                            </ng-container>\n                            <ng-container #empty *ngTemplateOutlet=\"emptyTemplate\"></ng-container>\n                        </li>\n                    </ul>\n                </ng-template>\n                <ng-container *ngTemplateOutlet=\"footerTemplate\"></ng-container>\n            </div>\n        </span>\n    `,\n    animations: [\n        trigger('overlayAnimation', [\n            transition(':enter', [\n                style({opacity: 0, transform: 'scaleY(0.8)'}),\n                animate('{{showTransitionParams}}')\n              ]),\n              transition(':leave', [\n                animate('{{hideTransitionParams}}', style({ opacity: 0 }))\n              ])\n        ])\n    ],\n    host: {\n        'class': 'p-element p-inputwrapper',\n        '[class.p-inputwrapper-filled]': 'filled',\n        '[class.p-inputwrapper-focus]': '((focus && !disabled) || autofocus) || overlayVisible',\n        '[class.p-autocomplete-clearable]': 'showClear && !disabled'\n    },\n    providers: [AUTOCOMPLETE_VALUE_ACCESSOR],\n    changeDetection: ChangeDetectionStrategy.OnPush,\n    encapsulation: ViewEncapsulation.None,\n    styleUrls: ['./autocomplete.css']\n})\nexport class AutoComplete implements AfterViewChecked,AfterContentInit,OnDestroy,ControlValueAccessor {\n\n    @Input() minLength: number = 1;\n\n    @Input() delay: number = 300;\n\n    @Input() style: any;\n\n    @Input() panelStyle: any;\n\n    @Input() styleClass: string;\n\n    @Input() panelStyleClass: string;\n\n    @Input() inputStyle: any;\n\n    @Input() inputId: string;\n\n    @Input() inputStyleClass: string;\n\n    @Input() placeholder: string;\n\n    @Input() readonly: boolean;\n\n    @Input() disabled: boolean;\n\n    @Input() scrollHeight: string = '200px';\n\n    @Input() lazy: boolean = false;\n\n    @Input() virtualScroll: boolean;\n\n    @Input() virtualScrollItemSize: number;\n\n    @Input() virtualScrollOptions: ScrollerOptions;\n\n    @Input() maxlength: number;\n\n    @Input() name: string;\n\n    @Input() required: boolean;\n\n    @Input() size: number;\n\n    @Input() appendTo: any;\n\n    @Input() autoHighlight: boolean;\n\n    @Input() forceSelection: boolean;\n\n    @Input() type: string = 'text';\n\n    @Input() autoZIndex: boolean = true;\n\n    @Input() baseZIndex: number = 0;\n\n    @Input() ariaLabel: string;\n\n    @Input() dropdownAriaLabel: string;\n\n    @Input() ariaLabelledBy: string;\n\n    @Input() dropdownIcon: string = \"pi pi-chevron-down\";\n\n    @Input() unique: boolean = true;\n\n    @Input() group: boolean;\n\n    @Input() completeOnFocus: boolean = false;\n\n    @Input() showClear: boolean = false;\n\n    @Input() field: string;\n\n    @Input() dropdown: boolean;\n\n    @Input() showEmptyMessage: boolean;\n\n    @Input() dropdownMode: string = 'blank';\n\n    @Input() multiple: boolean;\n\n    @Input() tabindex: number;\n\n    @Input() dataKey: string;\n\n    @Input() emptyMessage: string;\n\n    @Input() showTransitionOptions: string = '.12s cubic-bezier(0, 0, 0.2, 1)';\n\n    @Input() hideTransitionOptions: string = '.1s linear';\n\n    @Input() autofocus: boolean;\n\n    @Input() autocomplete: string = 'off';\n\n    @Input() optionGroupChildren: string;\n\n    @Input() optionGroupLabel: string;\n\n    @ViewChild('container') containerEL: ElementRef;\n\n    @ViewChild('in') inputEL: ElementRef;\n\n    @ViewChild('multiIn') multiInputEL: ElementRef;\n\n    @ViewChild('multiContainer') multiContainerEL: ElementRef;\n\n    @ViewChild('ddBtn') dropdownButton: ElementRef;\n\n    @ViewChild('items') itemsViewChild: ElementRef;\n\n    @ViewChild('scroller') scroller: Scroller;\n\n    @ContentChildren(PrimeTemplate) templates: QueryList<any>;\n\n    @Output() completeMethod: EventEmitter<any> = new EventEmitter();\n\n    @Output() onSelect: EventEmitter<any> = new EventEmitter();\n\n    @Output() onUnselect: EventEmitter<any> = new EventEmitter();\n\n    @Output() onFocus: EventEmitter<any> = new EventEmitter();\n\n    @Output() onBlur: EventEmitter<any> = new EventEmitter();\n\n    @Output() onDropdownClick: EventEmitter<any> = new EventEmitter();\n\n\t@Output() onClear: EventEmitter<any> = new EventEmitter();\n\n    @Output() onKeyUp: EventEmitter<any> = new EventEmitter();\n\n    @Output() onShow: EventEmitter<any> = new EventEmitter();\n\n    @Output() onHide: EventEmitter<any> = new EventEmitter();\n\n    @Output() onLazyLoad: EventEmitter<any> = new EventEmitter();\n\n    /* @deprecated */\n    _itemSize: number;\n    @Input() get itemSize(): number {\n        return this._itemSize;\n    }\n    set itemSize(val: number) {\n        this._itemSize = val;\n        console.warn(\"The itemSize property is deprecated, use virtualScrollItemSize property instead.\");\n    }\n\n    overlay: HTMLDivElement;\n\n    itemsWrapper: HTMLDivElement;\n\n    itemTemplate: TemplateRef<any>;\n\n    emptyTemplate: TemplateRef<any>;\n\n    headerTemplate: TemplateRef<any>;\n\n    footerTemplate: TemplateRef<any>;\n\n    selectedItemTemplate: TemplateRef<any>;\n\n    groupTemplate: TemplateRef<any>;\n\n    loaderTemplate: TemplateRef<any>;\n\n    value: any;\n\n    _suggestions: any[];\n\n    onModelChange: Function = () => {};\n\n    onModelTouched: Function = () => {};\n\n    timeout: any;\n\n    overlayVisible: boolean = false;\n\n    documentClickListener: any;\n\n    suggestionsUpdated: boolean;\n\n    highlightOption: any;\n\n    highlightOptionChanged: boolean;\n\n    focus: boolean = false;\n\n    filled: boolean;\n\n    inputClick: boolean;\n\n    inputKeyDown: boolean;\n\n    noResults: boolean;\n\n    differ: any;\n\n    inputFieldValue: string = null;\n\n    loading: boolean;\n\n    scrollHandler: any;\n\n    documentResizeListener: any;\n\n    forceSelectionUpdateModelTimeout: any;\n\n    listId: string;\n\n    itemClicked: boolean;\n\n    inputValue: string = null;\n\n    constructor(public el: ElementRef, public renderer: Renderer2, public cd: ChangeDetectorRef, public differs: IterableDiffers, public config: PrimeNGConfig, public overlayService: OverlayService) {\n        this.differ = differs.find([]).create(null);\n        this.listId = UniqueComponentId() + '_list';\n    }\n\n    @Input() get suggestions(): any[] {\n        return this._suggestions;\n    }\n\n    set suggestions(val:any[]) {\n        this._suggestions = val;\n        this.handleSuggestionsChange();\n    }\n\n    ngAfterViewChecked() {\n        //Use timeouts as since Angular 4.2, AfterViewChecked is broken and not called after panel is updated\n        if (this.suggestionsUpdated && this.overlay && this.overlay.offsetParent) {\n            setTimeout(() => {\n                if (this.overlay) {\n                    this.alignOverlay();\n                }\n            }, 1);\n            this.suggestionsUpdated = false;\n        }\n\n        if (this.highlightOptionChanged) {\n            setTimeout(() => {\n                if (this.overlay && this.itemsWrapper) {\n                    let listItem = DomHandler.findSingle(this.overlay, 'li.p-highlight');\n\n                    if (listItem) {\n                        DomHandler.scrollInView(this.itemsWrapper, listItem);\n                    }\n                }\n            }, 1);\n            this.highlightOptionChanged = false;\n        }\n    }\n\n    handleSuggestionsChange() {\n        if (this._suggestions != null && this.loading) {\n            this.highlightOption = null;\n            if (this._suggestions.length) {\n                this.noResults = false;\n                this.show();\n                this.suggestionsUpdated = true;\n\n                if (this.autoHighlight) {\n                    this.highlightOption = this._suggestions[0];\n                }\n            }\n            else {\n                this.noResults = true;\n\n                if (this.showEmptyMessage) {\n                    this.show();\n                    this.suggestionsUpdated = true;\n                }\n                else {\n                    this.hide();\n                }\n            }\n\n            this.loading = false;\n        }\n    }\n\n    ngAfterContentInit() {\n        this.templates.forEach((item) => {\n            switch(item.getType()) {\n                case 'item':\n                    this.itemTemplate = item.template;\n                break;\n\n                case 'group':\n                    this.groupTemplate = item.template;\n                break;\n\n                case 'selectedItem':\n                    this.selectedItemTemplate = item.template;\n                break;\n\n                case 'header':\n                    this.headerTemplate = item.template;\n                break;\n\n                case 'empty':\n                    this.emptyTemplate = item.template;\n                break;\n\n                case 'footer':\n                    this.footerTemplate = item.template;\n                break;\n\n                case 'loader':\n                    this.loaderTemplate = item.template;\n                break;\n\n                default:\n                    this.itemTemplate = item.template;\n                break;\n            }\n        });\n    }\n\n    writeValue(value: any) : void {\n        this.value = value;\n        this.filled = this.value && this.value != '';\n        this.updateInputField();\n        this.cd.markForCheck();\n    }\n\n    getOptionGroupChildren(optionGroup: any) {\n        return this.optionGroupChildren ? ObjectUtils.resolveFieldData(optionGroup, this.optionGroupChildren) : optionGroup.items;\n    }\n\n    getOptionGroupLabel(optionGroup: any) {\n        return this.optionGroupLabel ? ObjectUtils.resolveFieldData(optionGroup, this.optionGroupLabel) : (optionGroup.label != undefined ? optionGroup.label : optionGroup);\n    }\n\n    registerOnChange(fn: Function): void {\n        this.onModelChange = fn;\n    }\n\n    registerOnTouched(fn: Function): void {\n        this.onModelTouched = fn;\n    }\n\n    setDisabledState(val: boolean): void {\n        this.disabled = val;\n        this.cd.markForCheck();\n    }\n\n    onInput(event: Event) {\n        // When an input element with a placeholder is clicked, the onInput event is invoked in IE.\n        if (!this.inputKeyDown && DomHandler.isIE()) {\n            return;\n        }\n\n        if (this.timeout) {\n            clearTimeout(this.timeout);\n        }\n\n        let value = (<HTMLInputElement> event.target).value;\n        this.inputValue = value;\n        if (!this.multiple && !this.forceSelection) {\n            this.onModelChange(value);\n        }\n\n        if (value.length === 0 && !this.multiple) {\n            this.hide();\n            this.onClear.emit(event);\n\t        this.onModelChange(value);\n        }\n\n        if (value.length >= this.minLength) {\n            this.timeout = setTimeout(() => {\n                this.search(event, value);\n            }, this.delay);\n        }\n        else {\n            this.hide();\n        }\n        this.updateFilledState();\n        this.inputKeyDown = false;\n    }\n\n    onInputClick(event: MouseEvent) {\n        if (this.documentClickListener) {\n            this.inputClick = true;\n        }\n    }\n\n    search(event: any, query: string) {\n        //allow empty string but not undefined or null\n       if (query === undefined || query === null) {\n           return;\n       }\n\n       this.loading = true;\n\n       this.completeMethod.emit({\n           originalEvent: event,\n           query: query\n       });\n    }\n\n    selectItem(option: any, focus: boolean = true) {\n        if (this.forceSelectionUpdateModelTimeout) {\n            clearTimeout(this.forceSelectionUpdateModelTimeout);\n            this.forceSelectionUpdateModelTimeout = null;\n        }\n\n        if (this.multiple) {\n            this.multiInputEL.nativeElement.value = '';\n            this.value = this.value||[];\n            if (!this.isSelected(option) || !this.unique) {\n                this.value = [...this.value,option];\n                this.onModelChange(this.value);\n            }\n        }\n        else {\n            this.inputEL.nativeElement.value =  this.resolveFieldData(option);\n            this.value = option;\n            this.onModelChange(this.value);\n        }\n\n        this.onSelect.emit(option);\n        this.updateFilledState();\n\n        if (focus) {\n            this.itemClicked = true;\n            this.focusInput();\n        }\n    }\n\n    show() {\n        if (this.multiInputEL || this.inputEL) {\n            let hasFocus = this.multiple ?\n                this.multiInputEL.nativeElement.ownerDocument.activeElement == this.multiInputEL.nativeElement :\n                this.inputEL.nativeElement.ownerDocument.activeElement == this.inputEL.nativeElement;\n\n            if (!this.overlayVisible && hasFocus) {\n                this.overlayVisible = true;\n            }\n        }\n    }\n\n    clear() {\n        if(this.multiple) {\n            this.value = null;\n\n        } else {\n            this.inputValue = null;\n            this.inputEL.nativeElement.value = '';\n        }\n\n        this.updateFilledState();\n        this.onModelChange(this.value);\n        this.onClear.emit();\n    }\n\n    onOverlayAnimationStart(event: AnimationEvent) {\n        switch (event.toState) {\n            case 'visible':\n                this.overlay = event.element;\n                this.itemsWrapper = this.virtualScroll ? DomHandler.findSingle(this.overlay, '.p-scroller') : this.overlay;\n                this.virtualScroll && this.scroller?.setContentEl(this.itemsViewChild.nativeElement);\n                this.appendOverlay();\n\n                if (this.autoZIndex) {\n                    ZIndexUtils.set('overlay', this.overlay, this.baseZIndex + this.config.zIndex.overlay);\n                }\n\n                this.alignOverlay();\n                this.bindDocumentClickListener();\n                this.bindDocumentResizeListener();\n                this.bindScrollListener();\n                this.onShow.emit(event);\n            break;\n\n            case 'void':\n                this.onOverlayHide();\n            break;\n        }\n    }\n\n    onOverlayAnimationEnd(event: AnimationEvent) {\n        switch(event.toState) {\n            case 'void':\n                if (this.autoZIndex) {\n                    ZIndexUtils.clear(event.element);\n                }\n            break;\n        }\n    }\n\n    onOverlayClick(event) {\n        this.overlayService.add({\n            originalEvent: event,\n            target: this.el.nativeElement\n        });\n    }\n\n    appendOverlay() {\n        if (this.appendTo) {\n            if (this.appendTo === 'body')\n                document.body.appendChild(this.overlay);\n            else\n                DomHandler.appendChild(this.overlay, this.appendTo);\n\n            if (!this.overlay.style.minWidth) {\n                this.overlay.style.minWidth = DomHandler.getWidth(this.el.nativeElement.children[0]) + 'px';\n            }\n        }\n    }\n\n    resolveFieldData(value) {\n        let data = this.field ? ObjectUtils.resolveFieldData(value, this.field) : value;\n        return data !== (null || undefined) ? data : '';\n    }\n\n    restoreOverlayAppend() {\n        if (this.overlay && this.appendTo) {\n            this.el.nativeElement.appendChild(this.overlay);\n        }\n    }\n\n    alignOverlay() {\n        if (this.appendTo)\n            DomHandler.absolutePosition(this.overlay, (this.multiple ? this.multiContainerEL.nativeElement : this.inputEL.nativeElement));\n        else\n            DomHandler.relativePosition(this.overlay, (this.multiple ? this.multiContainerEL.nativeElement : this.inputEL.nativeElement));\n    }\n\n    hide() {\n        this.overlayVisible = false;\n        this.cd.markForCheck();\n    }\n\n    handleDropdownClick(event) {\n        if (!this.overlayVisible) {\n            this.focusInput();\n            let queryValue = this.multiple ? this.multiInputEL.nativeElement.value : this.inputEL.nativeElement.value;\n\n            if (this.dropdownMode === 'blank')\n                this.search(event, '');\n            else if (this.dropdownMode === 'current')\n                this.search(event, queryValue);\n\n            this.onDropdownClick.emit({\n                originalEvent: event,\n                query: queryValue\n            });\n        }\n        else {\n            this.hide();\n        }\n    }\n\n    focusInput() {\n        if (this.multiple)\n            this.multiInputEL.nativeElement.focus();\n        else\n            this.inputEL.nativeElement.focus();\n    }\n\n    get emptyMessageLabel(): string {\n        return this.emptyMessage || this.config.getTranslation(TranslationKeys.EMPTY_MESSAGE);\n    }\n\n    removeItem(item: any) {\n        let itemIndex = DomHandler.index(item);\n        let removedValue = this.value[itemIndex];\n        this.value = this.value.filter((val, i) => i!=itemIndex);\n        this.onModelChange(this.value);\n        this.updateFilledState();\n        this.onUnselect.emit(removedValue);\n    }\n\n    onKeydown(event) {\n        if (this.overlayVisible) {\n            switch(event.which) {\n                //down\n                case 40:\n                    if (this.group) {\n                        let highlightItemIndex = this.findOptionGroupIndex(this.highlightOption, this.suggestions);\n\n                        if (highlightItemIndex !== -1) {\n                            let nextItemIndex = highlightItemIndex.itemIndex + 1;\n                            if (nextItemIndex < (this.getOptionGroupChildren(this.suggestions[highlightItemIndex.groupIndex]).length)) {\n                                this.highlightOption = this.getOptionGroupChildren(this.suggestions[highlightItemIndex.groupIndex])[nextItemIndex];\n                                this.highlightOptionChanged = true;\n                            }\n                            else if (this.suggestions[highlightItemIndex.groupIndex + 1]) {\n                                this.highlightOption = this.getOptionGroupChildren(this.suggestions[highlightItemIndex.groupIndex + 1])[0];\n                                this.highlightOptionChanged = true;\n                            }\n                        }\n                        else {\n                            this.highlightOption = this.getOptionGroupChildren(this.suggestions[0])[0];\n                        }\n                    }\n                    else {\n                        let highlightItemIndex = this.findOptionIndex(this.highlightOption, this.suggestions);\n\n                        if (highlightItemIndex != -1) {\n                            var nextItemIndex = highlightItemIndex + 1;\n                            if (nextItemIndex != (this.suggestions.length)) {\n                                this.highlightOption = this.suggestions[nextItemIndex];\n                                this.highlightOptionChanged = true;\n                            }\n                        }\n                        else {\n                            this.highlightOption = this.suggestions[0];\n                        }\n                    }\n\n                    event.preventDefault();\n                break;\n\n                //up\n                case 38:\n                    if (this.group) {\n                        let highlightItemIndex = this.findOptionGroupIndex(this.highlightOption, this.suggestions);\n                        if (highlightItemIndex !== -1) {\n                            let prevItemIndex = highlightItemIndex.itemIndex - 1;\n                            if (prevItemIndex >= 0) {\n                                this.highlightOption = this.getOptionGroupChildren(this.suggestions[highlightItemIndex.groupIndex])[prevItemIndex];\n                                this.highlightOptionChanged = true;\n                            }\n                            else if (prevItemIndex < 0) {\n                                let prevGroup = this.suggestions[highlightItemIndex.groupIndex - 1];\n                                if (prevGroup) {\n                                    this.highlightOption = this.getOptionGroupChildren(prevGroup)[this.getOptionGroupChildren(prevGroup).length - 1];\n                                    this.highlightOptionChanged = true;\n                                }\n                            }\n                        }\n                    }\n                    else {\n                        let highlightItemIndex = this.findOptionIndex(this.highlightOption, this.suggestions);\n\n                        if (highlightItemIndex > 0) {\n                            let prevItemIndex = highlightItemIndex - 1;\n                            this.highlightOption = this.suggestions[prevItemIndex];\n                            this.highlightOptionChanged = true;\n                        }\n                    }\n\n                    event.preventDefault();\n                break;\n\n                //enter\n                case 13:\n                    if (this.highlightOption) {\n                        this.selectItem(this.highlightOption);\n                        this.hide();\n                    }\n                    event.preventDefault();\n                break;\n\n                //escape\n                case 27:\n                    this.hide();\n                    event.preventDefault();\n                break;\n\n\n                //tab\n                case 9:\n                    if (this.highlightOption) {\n                        this.selectItem(this.highlightOption);\n                    }\n                    this.hide();\n                break;\n            }\n        } else {\n            if (event.which === 40 && this.suggestions) {\n                this.search(event,event.target.value);\n            } else if((event.ctrlKey && event.key === 'z') && !this.multiple) {\n                this.inputEL.nativeElement.value =  this.resolveFieldData(null);\n                this.value = '';\n                this.onModelChange(this.value);\n            } else if ((event.ctrlKey && event.key === 'z') && this.multiple) {\n                this.value.pop();\n                this.onModelChange(this.value);\n                this.updateFilledState();\n            }\n        }\n\n        if (this.multiple) {\n            switch(event.which) {\n                //backspace\n                case 8:\n                    if (this.value && this.value.length && !this.multiInputEL.nativeElement.value) {\n                        this.value = [...this.value];\n                        const removedValue = this.value.pop();\n                        this.onModelChange(this.value);\n                        this.updateFilledState();\n                        this.onUnselect.emit(removedValue);\n                    }\n                break;\n            }\n        }\n\n        this.inputKeyDown = true;\n    }\n\n    onKeyup(event) {\n        this.onKeyUp.emit(event);\n    }\n\n    onInputFocus(event) {\n        if (!this.itemClicked && this.completeOnFocus ) {\n            let queryValue = this.multiple ? this.multiInputEL.nativeElement.value : this.inputEL.nativeElement.value;\n            this.search(event, queryValue);\n        }\n\n        this.focus = true;\n        this.onFocus.emit(event);\n        this.itemClicked = false;\n    }\n\n    onInputBlur(event) {\n        this.focus = false;\n        this.onModelTouched();\n        this.onBlur.emit(event);\n    }\n\n    onInputChange(event) {\n        if (this.forceSelection) {\n            let valid = false;\n            let inputValue = event.target.value.trim();\n\n            if (this.suggestions)  {\n                for (let suggestion of this.suggestions) {\n                    let itemValue = this.field ? ObjectUtils.resolveFieldData(suggestion, this.field) : suggestion;\n                    if (itemValue && inputValue === itemValue.trim()) {\n                        valid = true;\n                        this.forceSelectionUpdateModelTimeout = setTimeout(() => {\n                            this.selectItem(suggestion, false);\n                        }, 250);\n                        break;\n                    }\n                }\n            }\n\n            if (!valid) {\n                if (this.multiple) {\n                    this.multiInputEL.nativeElement.value = '';\n                }\n                else {\n                    this.value = null;\n                    this.inputEL.nativeElement.value = '';\n                }\n\n                this.onClear.emit(event);\n                this.onModelChange(this.value);\n                this.updateFilledState();\n            }\n        }\n    }\n\n    onInputPaste(event: ClipboardEvent) {\n        this.onKeydown(event);\n    }\n\n    isSelected(val: any): boolean {\n        let selected: boolean = false;\n        if (this.value && this.value.length) {\n            for (let i = 0; i < this.value.length; i++) {\n                if (ObjectUtils.equals(this.value[i], val, this.dataKey)) {\n                    selected = true;\n                    break;\n                }\n            }\n        }\n        return selected;\n    }\n\n    findOptionIndex(option, suggestions): number {\n        let index: number = -1;\n        if (suggestions) {\n            for (let i = 0; i < suggestions.length; i++) {\n                if (ObjectUtils.equals(option, suggestions[i])) {\n                    index = i;\n                    break;\n                }\n            }\n        }\n\n        return index;\n    }\n\n    findOptionGroupIndex(val: any, opts: any[]): any {\n        let groupIndex, itemIndex;\n\n        if (opts) {\n            for (let i = 0; i < opts.length; i++) {\n                groupIndex = i;\n                itemIndex = this.findOptionIndex(val, this.getOptionGroupChildren(opts[i]));\n\n                if (itemIndex !== -1) {\n                    break;\n                }\n            }\n        }\n\n        if (itemIndex !== -1) {\n            return {groupIndex: groupIndex, itemIndex: itemIndex};\n        }\n        else {\n            return -1;\n        }\n    }\n\n    updateFilledState() {\n        if (this.multiple)\n            this.filled = (this.value && this.value.length) || (this.multiInputEL && this.multiInputEL.nativeElement && this.multiInputEL.nativeElement.value != '');\n        else\n            this.filled = (this.inputFieldValue && this.inputFieldValue != '') || (this.inputEL && this.inputEL.nativeElement && this.inputEL.nativeElement.value != '');\n    }\n\n    updateInputField() {\n        let formattedValue = this.resolveFieldData(this.value);\n        this.inputFieldValue = formattedValue;\n\n        if (this.inputEL && this.inputEL.nativeElement) {\n            this.inputEL.nativeElement.value = formattedValue;\n        }\n\n        this.updateFilledState();\n    }\n\n    bindDocumentClickListener() {\n        if (!this.documentClickListener) {\n            const documentTarget: any = this.el ? this.el.nativeElement.ownerDocument : 'document';\n\n            this.documentClickListener = this.renderer.listen(documentTarget, 'click', (event) => {\n                if (event.which === 3) {\n                    return;\n                }\n\n                if (!this.inputClick && !this.isDropdownClick(event)) {\n                    this.hide();\n                }\n\n                this.inputClick = false;\n                this.cd.markForCheck();\n            });\n        }\n    }\n\n    isDropdownClick(event) {\n        if (this.dropdown) {\n            let target = event.target;\n            return (target === this.dropdownButton.nativeElement || target.parentNode === this.dropdownButton.nativeElement);\n        }\n        else {\n            return false;\n        }\n    }\n\n    unbindDocumentClickListener() {\n        if (this.documentClickListener) {\n            this.documentClickListener();\n            this.documentClickListener = null;\n        }\n    }\n\n    bindDocumentResizeListener() {\n        this.documentResizeListener = this.onWindowResize.bind(this);\n        window.addEventListener('resize', this.documentResizeListener);\n    }\n\n    unbindDocumentResizeListener() {\n        if (this.documentResizeListener) {\n            window.removeEventListener('resize', this.documentResizeListener);\n            this.documentResizeListener = null;\n        }\n    }\n\n    onWindowResize() {\n        if (this.overlayVisible && !DomHandler.isTouchDevice()) {\n            this.hide();\n        }\n    }\n\n    bindScrollListener() {\n        if (!this.scrollHandler) {\n            this.scrollHandler = new ConnectedOverlayScrollHandler(this.containerEL.nativeElement, () => {\n                if (this.overlayVisible) {\n                    this.hide();\n                }\n            });\n        }\n\n        this.scrollHandler.bindScrollListener();\n    }\n\n    unbindScrollListener() {\n        if (this.scrollHandler) {\n            this.scrollHandler.unbindScrollListener();\n        }\n    }\n\n    onOverlayHide() {\n        this.unbindDocumentClickListener();\n        this.unbindDocumentResizeListener();\n        this.unbindScrollListener();\n        if (this.overlay) {\n            this.overlay = null;\n            this.onHide.emit();\n        }\n    }\n\n    ngOnDestroy() {\n        if (this.forceSelectionUpdateModelTimeout) {\n            clearTimeout(this.forceSelectionUpdateModelTimeout);\n            this.forceSelectionUpdateModelTimeout = null;\n        }\n\n        if (this.scrollHandler) {\n            this.scrollHandler.destroy();\n            this.scrollHandler = null;\n        }\n\n        if (this.overlay) {\n            ZIndexUtils.clear(this.overlay);\n        }\n\n        this.restoreOverlayAppend();\n        this.onOverlayHide();\n    }\n}\n\n@NgModule({\n    imports: [CommonModule,InputTextModule,ButtonModule,SharedModule,RippleModule,ScrollerModule,AutoFocusModule],\n    exports: [AutoComplete,SharedModule,ScrollerModule],\n    declarations: [AutoComplete]\n})\nexport class AutoCompleteModule { }\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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