UNPKG

@ohayojp/form

Version:
167 lines 15.9 kB
/** * @fileoverview added by tsickle * Generated from: src/widgets/autocomplete/autocomplete.widget.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Component, ViewChild, ViewEncapsulation } from '@angular/core'; import { NgModel } from '@angular/forms'; import { of } from 'rxjs'; import { debounceTime, map, mergeMap, startWith } from 'rxjs/operators'; import { getCopyEnum, getEnum, toBool } from '../../utils'; import { ControlUIWidget } from '../../widget'; export class AutoCompleteWidget extends ControlUIWidget { constructor() { super(...arguments); this.i = {}; this.typing = ''; this.isAsync = false; this.fixData = []; } /** * @param {?} item * @return {?} */ updateValue(item) { this.typing = (/** @type {?} */ (item.nzLabel)); /** @type {?} */ const data = item.nzValue; this.setValue(data.value); if (this.ui.change) { this.ui.change(item, data); } } /** * @param {?} item * @return {?} */ _setValue(item) { /** @type {?} */ let val = item.toString(); if (typeof item !== 'string') { val = item.value; } this.setValue(val); } /** * @return {?} */ afterViewInit() { const { backfill, defaultActiveFirstOption, nzWidth, filterOption, asyncData } = this.ui; this.i = { backfill: toBool(backfill, false), defaultActiveFirstOption: toBool(defaultActiveFirstOption, true), width: nzWidth || undefined, }; /** @type {?} */ let filterOptionValue = filterOption == null ? true : filterOption; if (typeof filterOptionValue === 'boolean') { filterOptionValue = (/** * @param {?} input * @param {?} option * @return {?} */ (input, option) => option.label.toLowerCase().indexOf((input || '').toLowerCase()) > -1); } this.filterOption = filterOptionValue; this.isAsync = !!asyncData; /** @type {?} */ const orgTime = +(this.ui.debounceTime || 0); /** @type {?} */ const time = Math.max(0, this.isAsync ? Math.max(50, orgTime) : orgTime); this.list = (/** @type {?} */ (this.ngModel.valueChanges)).pipe(debounceTime(time), startWith(''), mergeMap((/** * @param {?} input * @return {?} */ input => (this.isAsync ? (/** @type {?} */ (asyncData))(input) : this.filterData(input)))), map((/** * @param {?} res * @return {?} */ res => getEnum(res, null, (/** @type {?} */ (this.schema.readOnly)))))); } /** * @param {?} value * @return {?} */ reset(value) { this.typing = this.value; if (this.isAsync) return; switch (this.ui.type) { case 'email': this.fixData = getCopyEnum((/** @type {?} */ (this.schema.enum)) || this.formProperty.options.uiEmailSuffixes, null, (/** @type {?} */ (this.schema.readOnly))); break; default: this.fixData = getCopyEnum((/** @type {?} */ (this.schema.enum)), value, (/** @type {?} */ (this.schema.readOnly))); break; } } /** * @private * @param {?} input * @return {?} */ filterData(input) { switch (this.ui.type) { case 'email': return this.addEmailSuffix(input); default: return of(this.fixData.filter((/** * @param {?} option * @return {?} */ option => this.filterOption(input, option)))); } } /** * @private * @param {?} value * @return {?} */ addEmailSuffix(value) { return of(!value || ~value.indexOf('@') ? [] : this.fixData.map((/** * @param {?} domain * @return {?} */ domain => `${value}@${domain.label}`))); } } AutoCompleteWidget.decorators = [ { type: Component, args: [{ selector: 'sf-autocomplete', template: "<sf-item-wrap [id]=\"id\" [schema]=\"schema\" [ui]=\"ui\" [showError]=\"showError\" [error]=\"error\" [showTitle]=\"schema.title\">\n <input\n nz-input\n [nzAutocomplete]=\"auto\"\n [attr.id]=\"id\"\n [disabled]=\"disabled\"\n [attr.disabled]=\"disabled\"\n [nzSize]=\"ui.size\"\n [(ngModel)]=\"typing\"\n (ngModelChange)=\"_setValue($event)\"\n [attr.maxLength]=\"schema.maxLength || null\"\n [attr.placeholder]=\"ui.placeholder\"\n autocomplete=\"off\"\n />\n <nz-autocomplete\n #auto\n [nzBackfill]=\"i.backfill\"\n [nzDefaultActiveFirstOption]=\"i.defaultActiveFirstOption\"\n [nzWidth]=\"i.width\"\n (selectionChange)=\"updateValue($event)\"\n >\n <nz-auto-option *ngFor=\"let i of list | async\" [nzValue]=\"i\" [nzLabel]=\"i.label\">\n {{i.label}}\n </nz-auto-option>\n </nz-autocomplete>\n</sf-item-wrap>\n", preserveWhitespaces: false, encapsulation: ViewEncapsulation.None }] } ]; AutoCompleteWidget.propDecorators = { ngModel: [{ type: ViewChild, args: [NgModel, { static: false },] }] }; if (false) { /** @type {?} */ AutoCompleteWidget.prototype.i; /** @type {?} */ AutoCompleteWidget.prototype.list; /** @type {?} */ AutoCompleteWidget.prototype.typing; /** * @type {?} * @private */ AutoCompleteWidget.prototype.ngModel; /** * @type {?} * @private */ AutoCompleteWidget.prototype.filterOption; /** * @type {?} * @private */ AutoCompleteWidget.prototype.isAsync; /** * @type {?} * @private */ AutoCompleteWidget.prototype.fixData; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0b2NvbXBsZXRlLndpZGdldC5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLi8uLi9wYWNrYWdlcy9mb3JtLyIsInNvdXJjZXMiOlsic3JjL3dpZGdldHMvYXV0b2NvbXBsZXRlL2F1dG9jb21wbGV0ZS53aWRnZXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN4RSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFekMsT0FBTyxFQUFjLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN0QyxPQUFPLEVBQUUsWUFBWSxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHeEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzNELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFTL0MsTUFBTSxPQUFPLGtCQUFtQixTQUFRLGVBQTJDO0lBTm5GOztRQU9FLE1BQUMsR0FBUSxFQUFFLENBQUM7UUFFWixXQUFNLEdBQVcsRUFBRSxDQUFDO1FBR1osWUFBTyxHQUFHLEtBQUssQ0FBQztRQUNoQixZQUFPLEdBQW1CLEVBQUUsQ0FBQztJQXNFdkMsQ0FBQzs7Ozs7SUFwRUMsV0FBVyxDQUFDLElBQW1DO1FBQzdDLElBQUksQ0FBQyxNQUFNLEdBQUcsbUJBQUEsSUFBSSxDQUFDLE9BQU8sRUFBQyxDQUFDOztjQUN0QixJQUFJLEdBQWlCLElBQUksQ0FBQyxPQUFPO1FBQ3ZDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzFCLElBQUksSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUU7WUFDbEIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFB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OztJQUhyQywrQkFBWTs7SUFDWixrQ0FBaUM7O0lBQ2pDLG9DQUFvQjs7Ozs7SUFDcEIscUNBQWdFOzs7OztJQUNoRSwwQ0FBdUU7Ozs7O0lBQ3ZFLHFDQUF3Qjs7Ozs7SUFDeEIscUNBQXFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBWaWV3Q2hpbGQsIFZpZXdFbmNhcHN1bGF0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOZ01vZGVsIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTnpBdXRvY29tcGxldGVPcHRpb25Db21wb25lbnQgfSBmcm9tICduZy16b3Jyby1hbnRkL2F1dG8tY29tcGxldGUnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgbWFwLCBtZXJnZU1hcCwgc3RhcnRXaXRoIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgU0ZWYWx1ZSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZSc7XG5pbXBvcnQgeyBTRlNjaGVtYUVudW0gfSBmcm9tICcuLi8uLi9zY2hlbWEnO1xuaW1wb3J0IHsgZ2V0Q29weUVudW0sIGdldEVudW0sIHRvQm9vbCB9IGZyb20gJy4uLy4uL3V0aWxzJztcbmltcG9ydCB7IENvbnRyb2xVSVdpZGdldCB9IGZyb20gJy4uLy4uL3dpZGdldCc7XG5pbXBvcnQgeyBTRkF1dG9Db21wbGV0ZVdpZGdldFNjaGVtYSB9IGZyb20gJy4vc2NoZW1hJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc2YtYXV0b2NvbXBsZXRlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2F1dG9jb21wbGV0ZS53aWRnZXQuaHRtbCcsXG4gIHByZXNlcnZlV2hpdGVzcGFjZXM6IGZhbHNlLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxufSlcbmV4cG9ydCBjbGFzcyBBdXRvQ29tcGxldGVXaWRnZXQgZXh0ZW5kcyBDb250cm9sVUlXaWRnZXQ8U0ZBdXRvQ29tcGxldGVXaWRnZXRTY2hlbWE+IHtcbiAgaTogYW55ID0ge307XG4gIGxpc3Q6IE9ic2VydmFibGU8U0ZTY2hlbWFFbnVtW10+O1xuICB0eXBpbmc6IHN0cmluZyA9ICcnO1xuICBAVmlld0NoaWxkKE5nTW9kZWwsIHsgc3RhdGljOiBmYWxzZSB9KSBwcml2YXRlIG5nTW9kZWw6IE5nTW9kZWw7XG4gIHByaXZhdGUgZmlsdGVyT3B0aW9uOiAoaW5wdXQ6IHN0cmluZywgb3B0aW9uOiBTRlNjaGVtYUVudW0pID0+IGJvb2xlYW47XG4gIHByaXZhdGUgaXNBc3luYyA9IGZhbHNlO1xuICBwcml2YXRlIGZpeERhdGE6IFNGU2NoZW1hRW51bVtdID0gW107XG5cbiAgdXBkYXRlVmFsdWUoaXRlbTogTnpBdXRvY29tcGxldGVPcHRpb25Db21wb25lbnQpOiB2b2lkIHtcbiAgICB0aGlzLnR5cGluZyA9IGl0ZW0ubnpMYWJlbCE7XG4gICAgY29uc3QgZGF0YTogU0ZTY2hlbWFFbnVtID0gaXRlbS5uelZhbHVlO1xuICAgIHRoaXMuc2V0VmFsdWUoZGF0YS52YWx1ZSk7XG4gICAgaWYgKHRoaXMudWkuY2hhbmdlKSB7XG4gICAgICB0aGlzLnVpLmNoYW5nZShpdGVtLCBkYXRhKTtcbiAgICB9XG4gIH1cblxuICBfc2V0VmFsdWUoaXRlbTogU0ZTY2hlbWFFbnVtKTogdm9pZCB7XG4gICAgbGV0IHZhbCA9IGl0ZW0udG9TdHJpbmcoKTtcbiAgICBpZiAodHlwZW9mIGl0ZW0gIT09ICdzdHJpbmcnKSB7XG4gICAgICB2YWwgPSBpdGVtLnZhbHVlO1xuICAgIH1cbiAgICB0aGlzLnNldFZhbHVlKHZhbCk7XG4gIH1cblxuICBhZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIGNvbnN0IHsgYmFja2ZpbGwsIGRlZmF1bHRBY3RpdmVGaXJzdE9wdGlvbiwgbnpXaWR0aCwgZmlsdGVyT3B0aW9uLCBhc3luY0RhdGEgfSA9IHRoaXMudWk7XG4gICAgdGhpcy5pID0ge1xuICAgICAgYmFja2ZpbGw6IHRvQm9vbChiYWNrZmlsbCwgZmFsc2UpLFxuICAgICAgZGVmYXVsdEFjdGl2ZUZpcnN0T3B0aW9uOiB0b0Jvb2woZGVmYXVsdEFjdGl2ZUZpcnN0T3B0aW9uLCB0cnVlKSxcbiAgICAgIHdpZHRoOiBueldpZHRoIHx8IHVuZGVmaW5lZCxcbiAgICB9O1xuXG4gICAgbGV0IGZpbHRlck9wdGlvblZhbHVlID0gZmlsdGVyT3B0aW9uID09IG51bGwgPyB0cnVlIDogZmlsdGVyT3B0aW9uO1xuICAgIGlmICh0eXBlb2YgZmlsdGVyT3B0aW9uVmFsdWUgPT09ICdib29sZWFuJykge1xuICAgICAgZmlsdGVyT3B0aW9uVmFsdWUgPSAoaW5wdXQ6IHN0cmluZywgb3B0aW9uOiBTRlNjaGVtYUVudW0pID0+IG9wdGlvbi5sYWJlbC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoKGlucHV0IHx8ICcnKS50b0xvd2VyQ2FzZSgpKSA+IC0xO1xuICAgIH1cbiAgICB0aGlzLmZpbHRlck9wdGlvbiA9IGZpbHRlck9wdGlvblZhbHVlO1xuXG4gICAgdGhpcy5pc0FzeW5jID0gISFhc3luY0RhdGE7XG4gICAgY29uc3Qgb3JnVGltZSA9ICsodGhpcy51aS5kZWJvdW5jZVRpbWUgfHwgMCk7XG4gICAgY29uc3QgdGltZSA9IE1hdGgubWF4KDAsIHRoaXMuaXNBc3luYyA/IE1hdGgubWF4KDUwLCBvcmdUaW1lKSA6IG9yZ1RpbWUpO1xuXG4gICAgdGhpcy5saXN0ID0gdGhpcy5uZ01vZGVsLnZhbHVlQ2hhbmdlcyEucGlwZShcbiAgICAgIGRlYm91bmNlVGltZSh0aW1lKSxcbiAgICAgIHN0YXJ0V2l0aCgnJyksXG4gICAgICBtZXJnZU1hcChpbnB1dCA9PiAodGhpcy5pc0FzeW5jID8gYXN5bmNEYXRhIShpbnB1dCkgOiB0aGlzLmZpbHRlckRhdGEoaW5wdXQpKSksXG4gICAgICBtYXAocmVzID0+IGdldEVudW0ocmVzLCBudWxsLCB0aGlzLnNjaGVtYS5yZWFkT25seSEpKSxcbiAgICApO1xuICB9XG5cbiAgcmVzZXQodmFsdWU6IFNGVmFsdWUpOiB2b2lkIHtcbiAgICB0aGlzLnR5cGluZyA9IHRoaXMudmFsdWU7XG4gICAgaWYgKHRoaXMuaXNBc3luYykgcmV0dXJuO1xuICAgIHN3aXRjaCAodGhpcy51aS50eXBlKSB7XG4gICAgICBjYXNlICdlbWFpbCc6XG4gICAgICAgIHRoaXMuZml4RGF0YSA9IGdldENvcHlFbnVtKHRoaXMuc2NoZW1hLmVudW0hIHx8IHRoaXMuZm9ybVByb3BlcnR5Lm9wdGlvbnMudWlFbWFpbFN1ZmZpeGVzLCBudWxsLCB0aGlzLnNjaGVtYS5yZWFkT25seSEpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRoaXMuZml4RGF0YSA9IGdldENvcHlFbnVtKHRoaXMuc2NoZW1hLmVudW0hLCB2YWx1ZSwgdGhpcy5zY2hlbWEucmVhZE9ubHkhKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBmaWx0ZXJEYXRhKGlucHV0OiBzdHJpbmcpOiBPYnNlcnZhYmxlPFNGU2NoZW1hRW51bVtdPiB8IE9ic2VydmFibGU8c3RyaW5nW10+IHtcbiAgICBzd2l0Y2ggKHRoaXMudWkudHlwZSkge1xuICAgICAgY2FzZSAnZW1haWwnOlxuICAgICAgICByZXR1cm4gdGhpcy5hZGRFbWFpbFN1ZmZpeChpbnB1dCk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gb2YodGhpcy5maXhEYXRhLmZpbHRlcihvcHRpb24gPT4gdGhpcy5maWx0ZXJPcHRpb24oaW5wdXQsIG9wdGlvbikpKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFkZEVtYWlsU3VmZml4KHZhbHVlOiBzdHJpbmcpOiBPYnNlcnZhYmxlPHN0cmluZ1tdPiB7XG4gICAgcmV0dXJuIG9mKCF2YWx1ZSB8fCB+dmFsdWUuaW5kZXhPZignQCcpID8gW10gOiB0aGlzLmZpeERhdGEubWFwKGRvbWFpbiA9PiBgJHt2YWx1ZX1AJHtkb21haW4ubGFiZWx9YCkpO1xuICB9XG59XG4iXX0=