UNPKG

@asi-ngtools/lib

Version:

This project is a little components library, simple to use, which will help you to simplify your project.

209 lines (208 loc) 17.3 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ import { Component, Input, forwardRef, ContentChild, Renderer2, ElementRef, ViewChild } from '@angular/core'; import { DefaultControlValueAccessor } from './../../common/default-control-value-accessor'; import { NG_VALUE_ACCESSOR, FormControl } from '@angular/forms'; import { AsiComponentTemplateOptionDef, AsiComponentTemplateSelectedDef } from './../../common/asi-component-template'; import { debounceTime, switchMap, tap } from 'rxjs/operators'; import * as nh from '../../../native-helper'; import { AsiDropDown } from '../../asi-dropdown/asi-dropdown.component'; /** * asi-autocomplete component */ export class AsiAutoCompleteComponent extends DefaultControlValueAccessor { /** * @param {?} renderer * @param {?} elementRef */ constructor(renderer, elementRef) { super(); this.renderer = renderer; this.elementRef = elementRef; /** * Label position */ this.labelPosition = 'top'; /** * Delay between the moment you stop typing and onRequestData is called */ this.delay = 500; /** * A placeholder if needed */ this.placeholder = ''; this.autoCompleteControl = new FormControl(); this.open = false; // Var used to manage component initialization this.firstRequestDone = null; this.init = false; this.currentValue = null; } /** * @return {?} */ checkInput() { if (null == this.onRequestData) { throw new Error('AsiAutoCompleteComponent : @Input \'onRequestData\' is required'); } } /** * @return {?} */ ngOnInit() { this.checkInput(); this.renderer.addClass(this.elementRef.nativeElement, 'label-' + this.labelPosition); this.autoCompleteControl.valueChanges.pipe(debounceTime(this.delay), tap(value => this.currentValue = value), switchMap((value) => nh.observe(this.onRequestData(value, !this.firstRequestDone)))) .subscribe((data) => { this.data = data; if (this.firstRequestDone && data && data.length > 0) { this.open = true; } this.firstRequestDone = true; }); } /** * @return {?} */ onDropdownClose() { this.open = false; } /** * @return {?} */ ngOnChanges() { if (this.init) { this.open = true; } else { if (this.firstRequestDone) { this.init = true; } } } /** * @param {?} data * @return {?} */ selectValue(data) { this.value = data; this.open = false; } /** * @return {?} */ clearValue() { this.value = null; this.autoCompleteControl.setValue(this.currentValue, { emitEvent: false }); setTimeout(() => { this.open = true; }); } /** * @param {?} value * @return {?} */ writeValue(value) { this._value = value; if (this.init === false) { this.autoCompleteControl.setValue(this.currentValue); } else { this.currentValue = value; if (this.value == null) { this.autoCompleteControl.setValue(this.currentValue, { emitEvent: false }); } } } } AsiAutoCompleteComponent.decorators = [ { type: Component, args: [{ selector: 'asi-autocomplete', template: "<label class=\"input-label\" *ngIf=\"label != null\">{{label | translate}}</label>\n\n<div class=\"autocomplete\">\n\n <!-- typehead input -->\n <input [attr.id]=\"id\" [attr.name]=\"name\" [attr.disabled]=\"disabled ? '' : null\" class=\"asi-focus-error\"\n [placeholder]=\"placeholder\" *ngIf=\"value == null\" [formControl]=\"autoCompleteControl\" />\n\n <!-- data to display -->\n <div class=\" autocomplete-header\" *ngIf=\"value != null\">\n <button [disabled]=\"disabled\" type=\"button\" class=\"clean-a\">\n <div class=\"select-value\">\n <ng-template [ngTemplateOutlet]=\"selectedDef.template\" [ngTemplateOutletContext]=\"{$implicit : value}\">\n </ng-template>\n </div>\n </button>\n <button [disabled]=\"disabled\" class=\"remove-icon-container\" (click)=\"clearValue()\">\n <span class=\"remove-icon\" [innerHTML]=\"'&#10005;'\"></span>\n </button>\n </div>\n\n <asi-dropdown [open]=\"open\" (onClose)=\"onDropdownClose()\" dropDownClass=\"asi-autocomplete-dropdown\" #dropDown>\n <div class=\"drop-down-autocomplete\">\n <div class=\"drop-down-panel\">\n <button [id]=\"'asi-acddi-'+ id\" type=\"button\" class=\"drop-down-item\" (click)=\"selectValue(aData)\"\n *ngFor=\"let aData of data, let id = index\">\n <div class=\"option\">\n <span class=\"item\">\n <ng-template *ngIf=\"aData != null\" [ngTemplateOutlet]=\"optionDef.template\"\n [ngTemplateOutletContext]=\"{$implicit : aData}\"></ng-template>\n </span>\n </div>\n </button>\n </div>\n </div>\n </asi-dropdown>\n</div>\n", host: { 'class': 'asi-component asi-autocomplete' }, providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => AsiAutoCompleteComponent), multi: true } ] }] } ]; /** @nocollapse */ AsiAutoCompleteComponent.ctorParameters = () => [ { type: Renderer2 }, { type: ElementRef } ]; AsiAutoCompleteComponent.propDecorators = { id: [{ type: Input }], name: [{ type: Input }], label: [{ type: Input }], labelPosition: [{ type: Input }], delay: [{ type: Input }], placeholder: [{ type: Input }], onRequestData: [{ type: Input }], optionDef: [{ type: ContentChild, args: [AsiComponentTemplateOptionDef,] }], selectedDef: [{ type: ContentChild, args: [AsiComponentTemplateSelectedDef,] }], asiDropDown: [{ type: ViewChild, args: ['dropDown',] }] }; if (false) { /** * html id * @type {?} */ AsiAutoCompleteComponent.prototype.id; /** * html name * @type {?} */ AsiAutoCompleteComponent.prototype.name; /** * Label to display (is translated) * @type {?} */ AsiAutoCompleteComponent.prototype.label; /** * Label position * @type {?} */ AsiAutoCompleteComponent.prototype.labelPosition; /** * Delay between the moment you stop typing and onRequestData is called * @type {?} */ AsiAutoCompleteComponent.prototype.delay; /** * A placeholder if needed * @type {?} */ AsiAutoCompleteComponent.prototype.placeholder; /** * Function called to request new data (can return Observable/Promise/Object): Throw error if null * @type {?} */ AsiAutoCompleteComponent.prototype.onRequestData; /** @type {?} */ AsiAutoCompleteComponent.prototype.optionDef; /** @type {?} */ AsiAutoCompleteComponent.prototype.selectedDef; /** @type {?} */ AsiAutoCompleteComponent.prototype.asiDropDown; /** @type {?} */ AsiAutoCompleteComponent.prototype.autoCompleteControl; /** @type {?} */ AsiAutoCompleteComponent.prototype.open; /** @type {?} */ AsiAutoCompleteComponent.prototype.data; /** @type {?} */ AsiAutoCompleteComponent.prototype.firstRequestDone; /** @type {?} */ AsiAutoCompleteComponent.prototype.init; /** @type {?} */ AsiAutoCompleteComponent.prototype.currentValue; /** @type {?} */ AsiAutoCompleteComponent.prototype.renderer; /** @type {?} */ AsiAutoCompleteComponent.prototype.elementRef; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNpLWF1dG9jb21wbGV0ZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AYXNpLW5ndG9vbHMvbGliLyIsInNvdXJjZXMiOlsibGliL2NvbXBvbmVudHMvYXNpLWF1dG9jb21wbGV0ZS9zaW1wbGUvYXNpLWF1dG9jb21wbGV0ZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQXFCLFNBQVMsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUNoRyxNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUM1RixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFaEUsT0FBTyxFQUFFLDZCQUE2QixFQUFFLCtCQUErQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDdkgsT0FBTyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUQsT0FBTyxLQUFLLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQTtBQUM1QyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMkNBQTJDLENBQUM7Ozs7QUFpQnhFLE1BQU0sK0JBQWdDLFNBQVEsMkJBQTJCOzs7OztJQXVDdkUsWUFBb0IsUUFBbUIsRUFBVSxVQUFzQjtRQUNyRSxLQUFLLEVBQUUsQ0FBQztRQURVLGFBQVEsR0FBUixRQUFRLENBQVc7UUFBVSxlQUFVLEdBQVYsVUFBVSxDQUFZOzs7OzZCQTVCd0IsS0FBSzs7OztxQkFHbkYsR0FBRzs7OzsyQkFHRyxFQUFFO21DQVVILElBQUksV0FBVyxFQUFFO29CQUVoQyxLQUFLOztnQ0FLZ0IsSUFBSTtvQkFDekIsS0FBSzs0QkFFZ0IsSUFBSTtLQUkvQjs7OztJQUVPLFVBQVU7UUFDaEIsRUFBRSxDQUFDLENBQUMsSUFB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WUFoSEYsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSxrQkFBa0I7Z0JBQzVCLG1vREFBOEM7Z0JBQzlDLElBQUksRUFBRSxFQUFFLE9BQU8sRUFBRSxnQ0FBZ0MsRUFBRTtnQkFDbkQsU0FBUyxFQUFFO29CQUNUO3dCQUNFLE9BQU8sRUFBRSxpQkFBaUI7d0JBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsd0JBQXdCLENBQUM7d0JBQ3ZELEtBQUssRUFBRSxJQUFJO3FCQUNaO2lCQUNGO2FBQ0Y7Ozs7WUF6QmdFLFNBQVM7WUFBRSxVQUFVOzs7aUJBNkJuRixLQUFLO21CQUVMLEtBQUs7b0JBR0wsS0FBSzs0QkFHTCxLQUFLO29CQUdMLEtBQUs7MEJBR0wsS0FBSzs0QkFHTCxLQUFLO3dCQUVMLFlBQVksU0FBQyw2QkFBNkI7MEJBQzFDLFlBQVksU0FBQywrQkFBK0I7MEJBRTVDLFNBQVMsU0FBQyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LCBJbnB1dCwgZm9yd2FyZFJlZiwgQ29udGVudENoaWxkLCBPbkluaXQsIE9uQ2hhbmdlcywgUmVuZGVyZXIyLCBFbGVtZW50UmVmLCBWaWV3Q2hpbGRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IERlZmF1bHRDb250cm9sVmFsdWVBY2Nlc3NvciB9IGZyb20gJy4vLi4vLi4vY29tbW9uL2RlZmF1bHQtY29udHJvbC12YWx1ZS1hY2Nlc3Nvcic7XG5pbXBvcnQgeyBOR19WQUxVRV9BQ0NFU1NPUiwgRm9ybUNvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbmltcG9ydCB7IEFzaUNvbXBvbmVudFRlbXBsYXRlT3B0aW9uRGVmLCBBc2lDb21wb25lbnRUZW1wbGF0ZVNlbGVjdGVkRGVmIH0gZnJvbSAnLi8uLi8uLi9jb21tb24vYXNpLWNvbXBvbmVudC10ZW1wbGF0ZSc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIHN3aXRjaE1hcCwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0ICogYXMgbmggZnJvbSAnLi4vLi4vLi4vbmF0aXZlLWhlbHBlcidcbmltcG9ydCB7IEFzaURyb3BEb3duIH0gZnJvbSAnLi4vLi4vYXNpLWRyb3Bkb3duL2FzaS1kcm9wZG93bi5jb21wb25lbnQnO1xuXG4vKipcbiAqIGFzaS1hdXRvY29tcGxldGUgY29tcG9uZW50XG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FzaS1hdXRvY29tcGxldGUnLFxuICB0ZW1wbGF0ZVVybDogJ2FzaS1hdXRvY29tcGxldGUuY29tcG9uZW50Lmh0bWwnLFxuICBob3N0OiB7ICdjbGFzcyc6ICdhc2ktY29tcG9uZW50IGFzaS1hdXRvY29tcGxldGUnIH0sXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gQXNpQXV0b0NvbXBsZXRlQ29tcG9uZW50KSxcbiAgICAgIG11bHRpOiB0cnVlXG4gICAgfVxuICBdXG59KVxuZXhwb3J0IGNsYXNzIEFzaUF1dG9Db21wbGV0ZUNvbXBvbmVudCBleHRlbmRzIERlZmF1bHRDb250cm9sVmFsdWVBY2Nlc3NvciBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcblxuICAvKiogaHRtbCBpZCAqL1xuICBASW5wdXQoKSBpZDogc3RyaW5nO1xuICAvKiogaHRtbCBuYW1lICovXG4gIEBJbnB1dCgpIG5hbWU6IHN0cmluZztcblxuICAvKiogTGFiZWwgdG8gZGlzcGxheSAoaXMgdHJhbnNsYXRlZCkgKi9cbiAgQElucHV0KCkgbGFiZWw6IHN0cmluZztcblxuICAvKiogTGFiZWwgcG9zaXRpb24gKi9cbiAgQElucHV0KCkgbGFiZWxQb3NpdGlvbjogJ3RvcCcgfCAnbGVmdCcgfCAncmlnaHQnIHwgJ2JvdHRvbScgfCAnYm90dG9tLWNlbnRlcicgfCAndG9wLWNlbnRlcicgPSAndG9wJztcblxuICAvKiogRGVsYXkgYmV0d2VlbiB0aGUgbW9tZW50IHlvdSBzdG9wIHR5cGluZyBhbmQgb25SZXF1ZXN0RGF0YSBpcyBjYWxsZWQgKi9cbiAgQElucHV0KCkgZGVsYXkgPSA1MDA7XG5cbiAgLyoqIEEgcGxhY2Vob2xkZXIgaWYgbmVlZGVkICovXG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyID0gJyc7XG5cbiAgLyoqIEZ1bmN0aW9uIGNhbGxlZCB0byByZXF1ZXN0IG5ldyBkYXRhIChjYW4gcmV0dXJuIE9ic2VydmFibGUvUHJvbWlzZS9PYmplY3QpOiBUaHJvdyBlcnJvciBpZiBudWxsICovXG4gIEBJbnB1dCgpIG9uUmVxdWVzdERhdGE6IEZ1bmN0aW9uO1xuXG4gIEBDb250ZW50Q2hpbGQoQXNpQ29tcG9uZW50VGVtcGxhdGVPcHRpb25EZWYpIG9wdGlvbkRlZjogQXNpQ29tcG9uZW50VGVtcGxhdGVPcHRpb25EZWY7XG4gIEBDb250ZW50Q2hpbGQoQXNpQ29tcG9uZW50VGVtcGxhdGVTZWxlY3RlZERlZikgc2VsZWN0ZWREZWY6IEFzaUNvbXBvbmVudFRlbXBsYXRlU2VsZWN0ZWREZWY7XG5cbiAgQFZpZXdDaGlsZCgnZHJvcERvd24nKSBhc2lEcm9wRG93bjogQXNpRHJvcERvd247XG5cbiAgYXV0b0NvbXBsZXRlQ29udHJvbCA9IG5ldyBGb3JtQ29udHJvbCgpO1xuXG4gIG9wZW4gPSBmYWxzZTtcblxuICBkYXRhOiBBcnJheTxhbnk+O1xuXG4gIC8vIFZhciB1c2VkIHRvIG1hbmFnZSBjb21wb25lbnQgaW5pdGlhbGl6YXRpb25cbiAgZmlyc3RSZXF1ZXN0RG9uZTogQm9vbGVhbiA9IG51bGw7XG4gIGluaXQgPSBmYWxzZTtcblxuICBwcml2YXRlIGN1cnJlbnRWYWx1ZTogYW55ID0gbnVsbDtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsIHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZikge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBwcml2YXRlIGNoZWNrSW5wdXQoKSB7XG4gICAgaWYgKG51bGwgPT0gdGhpcy5vblJlcXVlc3REYXRhKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FzaUF1dG9Db21wbGV0ZUNvbXBvbmVudCA6IEBJbnB1dCBcXCdvblJlcXVlc3REYXRhXFwnIGlzIHJlcXVpcmVkJyk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5jaGVja0lucHV0KCk7XG4gICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ2xhYmVsLScgKyB0aGlzLmxhYmVsUG9zaXRpb24pO1xuXG4gICAgdGhpcy5hdXRvQ29tcGxldGVDb250cm9sLnZhbHVlQ2hhbmdlcy5waXBlKGRlYm91bmNlVGltZSh0aGlzLmRlbGF5KSxcbiAgICAgIHRhcCh2YWx1ZSA9PiB0aGlzLmN1cnJlbnRWYWx1ZSA9IHZhbHVlKSxcbiAgICAgIHN3aXRjaE1hcCgodmFsdWUpID0+IG5oLm9ic2VydmUodGhpcy5vblJlcXVlc3REYXRhKHZhbHVlLCAhdGhpcy5maXJzdFJlcXVlc3REb25lKSkpKVxuICAgICAgLnN1YnNjcmliZSgoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgICAgIGlmICh0aGlzLmZpcnN0UmVxdWVzdERvbmUgJiYgZGF0YSAmJiBkYXRhLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICB0aGlzLm9wZW4gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZmlyc3RSZXF1ZXN0RG9uZSA9IHRydWU7XG4gICAgICB9KTtcbiAgfVxuXG4gIG9uRHJvcGRvd25DbG9zZSgpIHtcbiAgICB0aGlzLm9wZW4gPSBmYWxzZTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKCkge1xuICAgIGlmICh0aGlzLmluaXQpIHtcbiAgICAgIHRoaXMub3BlbiA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLmZpcnN0UmVxdWVzdERvbmUpIHtcbiAgICAgICAgdGhpcy5pbml0ID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzZWxlY3RWYWx1ZShkYXRhOiBhbnkpIHtcbiAgICB0aGlzLnZhbHVlID0gZGF0YTtcbiAgICB0aGlzLm9wZW4gPSBmYWxzZTtcbiAgfVxuXG4gIGNsZWFyVmFsdWUoKSB7XG4gICAgdGhpcy52YWx1ZSA9IG51bGw7XG4gICAgdGhpcy5hdXRvQ29tcGxldGVDb250cm9sLnNldFZhbHVlKHRoaXMuY3VycmVudFZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7IHRoaXMub3BlbiA9IHRydWUgfSk7XG4gIH1cblxuICB3cml0ZVZhbHVlKHZhbHVlOiBhbnkpIHtcbiAgICB0aGlzLl92YWx1ZSA9IHZhbHVlO1xuICAgIGlmICh0aGlzLmluaXQgPT09IGZhbHNlKSB7XG4gICAgICB0aGlzLmF1dG9Db21wbGV0ZUNvbnRyb2wuc2V0VmFsdWUodGhpcy5jdXJyZW50VmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmN1cnJlbnRWYWx1ZSA9IHZhbHVlO1xuICAgICAgaWYgKHRoaXMudmFsdWUgPT0gbnVsbCkge1xuICAgICAgICB0aGlzLmF1dG9Db21wbGV0ZUNvbnRyb2wuc2V0VmFsdWUodGhpcy5jdXJyZW50VmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiJdfQ==