import { AfterViewInit, Component, ContentChildren, ElementRef, EventEmitter, forwardRef, Input, Output, QueryList, ViewChild } from "@angular/core"; let autoComplete=require('js-autocomplete/auto-complete'); import 'js-autocomplete/auto-complete.css'; import {AutoCompleteItem} from "./AutoCompleteItem"; import {ControlValueAccessor, NG_VALUE_ACCESSOR} from "@angular/forms"; @Component({ selector:'autocomplete', providers:[{ provide:NG_VALUE_ACCESSOR, useExisting: forwardRef(() => AutoComplete), multi:true }], template:'' }) export class AutoComplete implements AfterViewInit,ControlValueAccessor { @Input() class:string; @ViewChild('input') element:ElementRef; @ContentChildren(AutoCompleteItem) items: QueryList; @Output() public ItemSelected = new EventEmitter<{Text:string,Value:any}>(); private _onChange:any; private lastSelectedItem:{Text:string,Value:any}=null; ngAfterViewInit(): void { new autoComplete({ selector:this.element.nativeElement, delay:0, minChars:0, source:(term,response)=>{ term=term.toLowerCase().trim(); let result=this.items.toArray().filter(x=>{ let label=x.Label.toLowerCase().trim(); return label.startsWith(term)&&label.length!=term.length;}).map(x=>x.Label); response(result); }, onSelect:(event,term,item)=> { let selectedItem=this.items.find(x=>x.Label==term); this.lastSelectedItem={Text:term,Value:selectedItem.Value}; if(selectedItem!=null) this.ItemSelected.emit(this.lastSelectedItem); if(this._onChange!=null) this._onChange(term); } }); } TextChanged(event) { if(this.lastSelectedItem!=null&&this.lastSelectedItem.Text==this.element.nativeElement.value) return; if(this._onChange!=null) this._onChange(this.element.nativeElement.value); let Value=this.items.find(x=>x.Label.toLowerCase()==this.element.nativeElement.value); if(Value!=null) Value=Value.Value; this.lastSelectedItem={ Text:this.element.nativeElement.value, Value:Value }; this.ItemSelected.emit(this.lastSelectedItem); } registerOnChange(fn: any): void { this._onChange=fn; } registerOnTouched(fn: any): void { } setDisabledState(isDisabled: boolean): void { } writeValue(obj: any): void { if(this.element!=null) this.element.nativeElement.value=obj; } } declare let require:any;