UNPKG

@asi-ngtools/lib

Version:

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

222 lines (221 loc) 18.1 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ import { Component, Input, forwardRef, ElementRef, ContentChild, ViewChild, Renderer2 } from '@angular/core'; import { NG_VALUE_ACCESSOR, FormControl } from '@angular/forms'; import { DefaultControlValueAccessor } from './../../common/default-control-value-accessor'; import { AsiComponentTemplateOptionDef, AsiComponentTemplateTagDef } from './../../common/asi-component-template'; import { debounceTime, switchMap, tap } from 'rxjs/operators'; import * as nh from '../../../native-helper'; /** * asi-autocomplete-multiple component */ export class AsiAutoCompleteMultipleComponent extends DefaultControlValueAccessor { /** * @param {?} renderer */ constructor(renderer) { super(); this.renderer = renderer; /** * Label position */ this.labelPosition = 'top'; /** * Placeholder if needed */ this.placeholder = ''; /** * Delay between the moment you stop typing and onRequestData is called */ this.delay = 500; /** * Option to keep the list open once an item is selected */ this.closeAfterSelect = false; 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('AsiAutoCompleteMultipleComponent : @Input \'onRequestData\' is required'); } } /** * @return {?} */ ngOnInit() { this.checkInput(); this.renderer.addClass(this.container.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 {?} */ addValue(data) { if (this.value == null) { this.value = []; } this.value.push(data); if (this.closeAfterSelect) { this.open = false; } } /** * @param {?} data * @return {?} */ removeValue(data) { nh.remove(this.value, (value) => { return data === value; }); if (nh.isEmpty(this.value)) { this.value = null; } } /** * @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 }); } } } } AsiAutoCompleteMultipleComponent.decorators = [ { type: Component, args: [{ selector: 'asi-autocomplete-multiple', template: "<div class=\"tag-container\">\r\n <div class=\"tag\" *ngFor=\"let aValue of value\">\r\n <span>\r\n <ng-template [ngTemplateOutlet]=\"tagDef.template\" [ngTemplateOutletContext]=\"{$implicit : aValue}\"></ng-template>\r\n </span>\r\n <button type=\"button\" [disabled]=\"disabled\" class=\"remove-icon-container\" (click)=\"removeValue(aValue)\">\r\n <span class=\"remove-icon\" [innerHTML]=\"'&#10005;'\"></span>\r\n </button>\r\n </div>\r\n</div>\r\n<div class=\"autocomplete-container\" #container>\r\n <label class=\"input-label\" *ngIf=\"label != null\">{{label | translate}}</label>\r\n <div class=\"autocomplete\">\r\n <input [attr.id]=\"id\" [attr.name]=\"name\"\r\n [attr.disabled]=\"disabled ? '' : null\" class=\"asi-focus-error\"\r\n [placeholder]=\"placeholder\" [formControl]=\"autoCompleteControl\"/>\r\n\r\n <asi-dropdown [open]=\"open\" (onClose)=\"onDropdownClose()\" dropDownClass=\"asi-autocomplete-multiple-dropdown\">\r\n <div class=\"drop-down-autocomplete-multiple\">\r\n <div class=\"drop-down-panel\" [ngClass]=\"{'open' : open }\">\r\n <button [id]=\"'asi-acmddi-'+ id\" type=\"button\" class=\"drop-down-item\" (click)=\"addValue(aData)\" *ngFor=\"let aData of data\">\r\n <div class=\"option\">\r\n <span class=\"item\">\r\n <ng-template *ngIf=\"aData != null\" [ngTemplateOutlet]=\"optionDef.template\" [ngTemplateOutletContext]=\"{$implicit : aData}\"></ng-template>\r\n </span>\r\n </div>\r\n </button>\r\n </div>\r\n </div>\r\n </asi-dropdown>\r\n\r\n </div>\r\n</div>\r\n", host: { 'class': 'asi-component asi-autocomplete-multiple' }, providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => AsiAutoCompleteMultipleComponent), multi: true } ] }] } ]; /** @nocollapse */ AsiAutoCompleteMultipleComponent.ctorParameters = () => [ { type: Renderer2 } ]; AsiAutoCompleteMultipleComponent.propDecorators = { id: [{ type: Input }], name: [{ type: Input }], label: [{ type: Input }], labelPosition: [{ type: Input }], placeholder: [{ type: Input }], delay: [{ type: Input }], closeAfterSelect: [{ type: Input }], onRequestData: [{ type: Input }], optionDef: [{ type: ContentChild, args: [AsiComponentTemplateOptionDef,] }], tagDef: [{ type: ContentChild, args: [AsiComponentTemplateTagDef,] }], container: [{ type: ViewChild, args: ['container',] }] }; if (false) { /** * html id * @type {?} */ AsiAutoCompleteMultipleComponent.prototype.id; /** * html name * @type {?} */ AsiAutoCompleteMultipleComponent.prototype.name; /** * Label to display (is translated) * @type {?} */ AsiAutoCompleteMultipleComponent.prototype.label; /** * Label position * @type {?} */ AsiAutoCompleteMultipleComponent.prototype.labelPosition; /** * Placeholder if needed * @type {?} */ AsiAutoCompleteMultipleComponent.prototype.placeholder; /** * Delay between the moment you stop typing and onRequestData is called * @type {?} */ AsiAutoCompleteMultipleComponent.prototype.delay; /** * Option to keep the list open once an item is selected * @type {?} */ AsiAutoCompleteMultipleComponent.prototype.closeAfterSelect; /** * Function called to request new data (can return Observable/Promise/Object) : Throw error if null * @type {?} */ AsiAutoCompleteMultipleComponent.prototype.onRequestData; /** @type {?} */ AsiAutoCompleteMultipleComponent.prototype.optionDef; /** @type {?} */ AsiAutoCompleteMultipleComponent.prototype.tagDef; /** @type {?} */ AsiAutoCompleteMultipleComponent.prototype.container; /** @type {?} */ AsiAutoCompleteMultipleComponent.prototype.data; /** @type {?} */ AsiAutoCompleteMultipleComponent.prototype.autoCompleteControl; /** @type {?} */ AsiAutoCompleteMultipleComponent.prototype.open; /** @type {?} */ AsiAutoCompleteMultipleComponent.prototype.firstRequestDone; /** @type {?} */ AsiAutoCompleteMultipleComponent.prototype.init; /** @type {?} */ AsiAutoCompleteMultipleComponent.prototype.currentValue; /** @type {?} */ AsiAutoCompleteMultipleComponent.prototype.renderer; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNpLWF1dG9jb21wbGV0ZS1tdWx0aXBsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AYXNpLW5ndG9vbHMvbGliLyIsInNvdXJjZXMiOlsibGliL2NvbXBvbmVudHMvYXNpLWF1dG9jb21wbGV0ZS9tdWx0aXBsZS9hc2ktYXV0b2NvbXBsZXRlLW11bHRpcGxlLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUNMLFNBQVMsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFVLFVBQVUsRUFBRSxZQUFZLEVBQzlELFNBQVMsRUFBYSxTQUFTLEVBQ2hDLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNoRSxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUM1RixPQUFPLEVBQUUsNkJBQTZCLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUNsSCxPQUFPLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5RCxPQUFPLEtBQUssRUFBRSxNQUFNLHdCQUF3QixDQUFBOzs7O0FBZ0I1QyxNQUFNLHVDQUF3QyxTQUFRLDJCQUEyQjs7OztJQXlDL0UsWUFBb0IsUUFBbUI7UUFDckMsS0FBSyxFQUFFLENBQUM7UUFEVSxhQUFRLEdBQVIsUUFBUSxDQUFXOzs7OzZCQTlCd0QsS0FBSzs7OzsyQkFHN0UsRUFBRTs7OztxQkFHUixHQUFHOzs7O2dDQUdRLEtBQUs7bUNBWVgsSUFBSSxXQUFXLEVBQUU7b0JBQ2hDLEtBQUs7O2dDQUdnQixJQUFJO29CQUN6QixLQUFLOzRCQUVRLElBQUk7S0FJdkI7Ozs7SUFFTyxVQUFVO1FBQ2hCLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztZQUMvQixNQUFN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QixFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUM7Z0JBQ3ZCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO2FBQzVFO1NBQ0Y7S0FDRjs7O1lBM0hGLFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUsMkJBQTJCO2dCQUNyQyx3b0RBQXVEO2dCQUN2RCxJQUFJLEVBQUUsRUFBRSxPQUFPLEVBQUUseUNBQXlDLEVBQUU7Z0JBQzVELFNBQVMsRUFBRTtvQkFDVDt3QkFDRSxPQUFPLEVBQUUsaUJBQWlCO3dCQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLGdDQUFnQyxDQUFDO3dCQUMvRCxLQUFLLEVBQUUsSUFBSTtxQkFDWjtpQkFDRjthQUNGOzs7O1lBckJ1QixTQUFTOzs7aUJBeUI5QixLQUFLO21CQUVMLEtBQUs7b0JBR0wsS0FBSzs0QkFHTCxLQUFLOzBCQUdMLEtBQUs7b0JBR0wsS0FBSzsrQkFHTCxLQUFLOzRCQUdMLEtBQUs7d0JBRUwsWUFBWSxTQUFDLDZCQUE2QjtxQkFDMUMsWUFBWSxTQUFDLDBCQUEwQjt3QkFFdkMsU0FBUyxTQUFDLFdBQVciLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsIElucHV0LCBmb3J3YXJkUmVmLCBPbkluaXQsIEVsZW1lbnRSZWYsIENvbnRlbnRDaGlsZCxcbiAgVmlld0NoaWxkLCBPbkNoYW5nZXMsIFJlbmRlcmVyMlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5HX1ZBTFVFX0FDQ0VTU09SLCBGb3JtQ29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IERlZmF1bHRDb250cm9sVmFsdWVBY2Nlc3NvciB9IGZyb20gJy4vLi4vLi4vY29tbW9uL2RlZmF1bHQtY29udHJvbC12YWx1ZS1hY2Nlc3Nvcic7XG5pbXBvcnQgeyBBc2lDb21wb25lbnRUZW1wbGF0ZU9wdGlvbkRlZiwgQXNpQ29tcG9uZW50VGVtcGxhdGVUYWdEZWYgfSBmcm9tICcuLy4uLy4uL2NvbW1vbi9hc2ktY29tcG9uZW50LXRlbXBsYXRlJztcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgc3dpdGNoTWFwLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgKiBhcyBuaCBmcm9tICcuLi8uLi8uLi9uYXRpdmUtaGVscGVyJ1xuLyoqXG4gKiBhc2ktYXV0b2NvbXBsZXRlLW11bHRpcGxlIGNvbXBvbmVudFxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhc2ktYXV0b2NvbXBsZXRlLW11bHRpcGxlJyxcbiAgdGVtcGxhdGVVcmw6ICdhc2ktYXV0b2NvbXBsZXRlLW11bHRpcGxlLmNvbXBvbmVudC5odG1sJyxcbiAgaG9zdDogeyAnY2xhc3MnOiAnYXNpLWNvbXBvbmVudCBhc2ktYXV0b2NvbXBsZXRlLW11bHRpcGxlJyB9LFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IEFzaUF1dG9Db21wbGV0ZU11bHRpcGxlQ29tcG9uZW50KSxcbiAgICAgIG11bHRpOiB0cnVlXG4gICAgfVxuICBdXG59KVxuZXhwb3J0IGNsYXNzIEFzaUF1dG9Db21wbGV0ZU11bHRpcGxlQ29tcG9uZW50IGV4dGVuZHMgRGVmYXVsdENvbnRyb2xWYWx1ZUFjY2Vzc29yIGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xuXG4gIC8qKiBodG1sIGlkICovXG4gIEBJbnB1dCgpIGlkOiBzdHJpbmc7XG4gIC8qKiBodG1sIG5hbWUgKi9cbiAgQElucHV0KCkgbmFtZTogc3RyaW5nO1xuXG4gIC8qKiBMYWJlbCB0byBkaXNwbGF5IChpcyB0cmFuc2xhdGVkKSAqL1xuICBASW5wdXQoKSBsYWJlbDogc3RyaW5nO1xuXG4gIC8qKiBMYWJlbCBwb3NpdGlvbiAqL1xuICBASW5wdXQoKSBsYWJlbFBvc2l0aW9uOiAndG9wJyB8ICdsZWZ0JyB8ICdyaWdodCcgfCAnYm90dG9tJyB8ICdib3R0b20tY2VudGVyJyB8ICd0b3AtY2VudGVyJyA9ICd0b3AnO1xuXG4gIC8qKiBQbGFjZWhvbGRlciBpZiBuZWVkZWQgKi9cbiAgQElucHV0KCkgcGxhY2Vob2xkZXIgPSAnJztcblxuICAvKiogRGVsYXkgYmV0d2VlbiB0aGUgbW9tZW50IHlvdSBzdG9wIHR5cGluZyBhbmQgb25SZXF1ZXN0RGF0YSBpcyBjYWxsZWQgKi9cbiAgQElucHV0KCkgZGVsYXkgPSA1MDA7XG5cbiAgLyoqIE9wdGlvbiB0byBrZWVwIHRoZSBsaXN0IG9wZW4gb25jZSBhbiBpdGVtIGlzIHNlbGVjdGVkICovXG4gIEBJbnB1dCgpIGNsb3NlQWZ0ZXJTZWxlY3QgPSBmYWxzZTtcblxuICAvKiogRnVuY3Rpb24gY2FsbGVkIHRvIHJlcXVlc3QgbmV3IGRhdGEgKGNhbiByZXR1cm4gT2JzZXJ2YWJsZS9Qcm9taXNlL09iamVjdCkgOiBUaHJvdyBlcnJvciBpZiBudWxsICovXG4gIEBJbnB1dCgpIG9uUmVxdWVzdERhdGE6IEZ1bmN0aW9uO1xuXG4gIEBDb250ZW50Q2hpbGQoQXNpQ29tcG9uZW50VGVtcGxhdGVPcHRpb25EZWYpIG9wdGlvbkRlZjogQXNpQ29tcG9uZW50VGVtcGxhdGVPcHRpb25EZWY7XG4gIEBDb250ZW50Q2hpbGQoQXNpQ29tcG9uZW50VGVtcGxhdGVUYWdEZWYpIHRhZ0RlZjogQXNpQ29tcG9uZW50VGVtcGxhdGVUYWdEZWY7XG5cbiAgQFZpZXdDaGlsZCgnY29udGFpbmVyJykgY29udGFpbmVyOiBFbGVtZW50UmVmO1xuXG4gIGRhdGE6IEFycmF5PGFueT47XG5cbiAgYXV0b0NvbXBsZXRlQ29udHJvbCA9IG5ldyBGb3JtQ29udHJvbCgpO1xuICBvcGVuID0gZmFsc2U7XG5cbiAgLy8gVmFyIHVzZWQgdG8gbWFuYWdlIGNvbXBvbmVudCBpbml0aWFsaXphdGlvblxuICBmaXJzdFJlcXVlc3REb25lOiBCb29sZWFuID0gbnVsbDtcbiAgaW5pdCA9IGZhbHNlO1xuXG4gIGN1cnJlbnRWYWx1ZTogYW55ID0gbnVsbDtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgcHJpdmF0ZSBjaGVja0lucHV0KCkge1xuICAgIGlmIChudWxsID09IHRoaXMub25SZXF1ZXN0RGF0YSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBc2lBdXRvQ29tcGxldGVNdWx0aXBsZUNvbXBvbmVudCA6IEBJbnB1dCBcXCdvblJlcXVlc3REYXRhXFwnIGlzIHJlcXVpcmVkJyk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5jaGVja0lucHV0KCk7XG4gICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLmNvbnRhaW5lci5uYXRpdmVFbGVtZW50LCAnbGFiZWwtJyArIHRoaXMubGFiZWxQb3NpdGlvbik7XG5cbiAgICB0aGlzLmF1dG9Db21wbGV0ZUNvbnRyb2wudmFsdWVDaGFuZ2VzLnBpcGUoZGVib3VuY2VUaW1lKHRoaXMuZGVsYXkpLFxuICAgICAgdGFwKHZhbHVlID0+IHRoaXMuY3VycmVudFZhbHVlID0gdmFsdWUpLFxuICAgICAgc3dpdGNoTWFwKCh2YWx1ZSkgPT4gbmgub2JzZXJ2ZSh0aGlzLm9uUmVxdWVzdERhdGEodmFsdWUsICF0aGlzLmZpcnN0UmVxdWVzdERvbmUpKSkpXG4gICAgICAuc3Vic2NyaWJlKChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcbiAgICAgICAgaWYgKHRoaXMuZmlyc3RSZXF1ZXN0RG9uZSAmJiBkYXRhICYmIGRhdGEubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHRoaXMub3BlbiA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5maXJzdFJlcXVlc3REb25lID0gdHJ1ZTtcbiAgICAgIH0pO1xuICB9XG5cbiAgb25Ecm9wZG93bkNsb3NlKCkge1xuICAgIHRoaXMub3BlbiA9IGZhbHNlO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoKSB7XG4gICAgaWYgKHRoaXMuaW5pdCkge1xuICAgICAgdGhpcy5vcGVuID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMuZmlyc3RSZXF1ZXN0RG9uZSkge1xuICAgICAgICB0aGlzLmluaXQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFkZFZhbHVlKGRhdGE6IGFueSkge1xuICAgIGlmICh0aGlzLnZhbHVlID09IG51bGwpIHtcbiAgICAgIHRoaXMudmFsdWUgPSBbXTtcbiAgICB9XG4gICAgdGhpcy52YWx1ZS5wdXNoKGRhdGEpO1xuICAgIGlmICh0aGlzLmNsb3NlQWZ0ZXJTZWxlY3QpIHtcbiAgICAgIHRoaXMub3BlbiA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJlbW92ZVZhbHVlKGRhdGE6IGFueSkge1xuICAgIG5oLnJlbW92ZSh0aGlzLnZhbHVlLCAodmFsdWUpID0+IHtcbiAgICAgIHJldHVybiBkYXRhID09PSB2YWx1ZTtcbiAgICB9KTtcblxuICAgIGlmIChuaC5pc0VtcHR5KHRoaXMudmFsdWUpKSB7XG4gICAgICB0aGlzLnZhbHVlID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICB3cml0ZVZhbHVlKHZhbHVlOiBhbnkpIHtcbiAgICB0aGlzLl92YWx1ZSA9IHZhbHVlO1xuICAgIGlmICh0aGlzLmluaXQgPT09IGZhbHNlKSB7XG4gICAgICB0aGlzLmF1dG9Db21wbGV0ZUNvbnRyb2wuc2V0VmFsdWUodGhpcy5jdXJyZW50VmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmN1cnJlbnRWYWx1ZSA9IHZhbHVlO1xuICAgICAgaWYgKHRoaXMudmFsdWUgPT0gbnVsbCkge1xuICAgICAgICB0aGlzLmF1dG9Db21wbGV0ZUNvbnRyb2wuc2V0VmFsdWUodGhpcy5jdXJyZW50VmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiJdfQ==