@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
JavaScript
/**
* @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]=\"'✕'\"></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==