UNPKG

ngx-mat-dynamic-form-builder

Version:

Build dynamic forms in Angular Material using Reactive forms.

104 lines 13.7 kB
import { Component, Input, Output, EventEmitter } from '@angular/core'; import { FormControl, Validators } from '@angular/forms'; import { startWith, map } from 'rxjs/operators'; import { isString } from 'lodash'; export class AutoCompleteComponent { constructor() { this.options = []; this.hint = ''; this.appearance = 'standard'; this.disabled = false; this.autoClear = false; this.output = new EventEmitter(); } ngOnInit() { this.setupValidators(); } ngOnChanges(changes) { if (changes.options && this.options) { if (!this.stateCtrl) this.setupValidators(); this.filteredOptions = this.stateCtrl.valueChanges .pipe(startWith(''), map(state => state ? this._filterOptions(state) : this.options.slice())); if (this.defaultOption && this.defaultOptionKey) { this.stateCtrl.setValue(this.options.find(o => o[this.defaultOptionKey] === this.defaultOption)); } } } setupValidators() { if (this.stateCtrl) return; if (this.validators) { let isRequired = false; this.validators.forEach(vd => { if (vd.name === 'required') isRequired = true; }); if (isRequired) { this.stateCtrl = new FormControl(null, [Validators.required, this.valueSelected()]); } else { this.stateCtrl = new FormControl(null, [this.valueSelected()]); } } else { this.stateCtrl = new FormControl(null, [this.valueSelected()]); } } displayFn(value) { if (value) return value[this.displayKey]; } setValue(event) { this.output.emit(event.option.value); if (this.autoClear) { this.stateCtrl.reset(); } } clearValue() { this.output.emit(undefined); this.stateCtrl.reset(); } _filterOptions(value) { if (isString(value) && value.length >= 1) { const filterValue = value.toLowerCase(); return this.options.filter(state => state[this.filterKey ? this.filterKey : this.displayKey].toLowerCase().includes(filterValue)); } return this.options; } valueSelected() { return (c) => { // if value is set and it is not an object, valid option not selected if (c.value && typeof c.value !== 'object') { return { match: true }; } else { return null; } }; } } AutoCompleteComponent.decorators = [ { type: Component, args: [{ selector: 'ngx-mat-auto-complete', template: "<mat-form-field [appearance]=\"appearance\" fxFlex>\r\n <mat-label>{{label}}</mat-label>\r\n <input matInput [placeholder]=\"placeholder\" [readonly]=\"disabled\" aria-label=\"AutoComplete\" [matAutocomplete]=\"auto\"\r\n [formControl]=\"stateCtrl\">\r\n <mat-autocomplete #auto=\"matAutocomplete\" autoActiveFirstOption (optionSelected)=\"setValue($event)\"\r\n [displayWith]=\"displayFn.bind(this)\">\r\n <mat-option *ngFor=\"let option of filteredOptions | async\" [value]=\"option\">\r\n <span>{{option[displayKey]}}</span>\r\n </mat-option>\r\n </mat-autocomplete>\r\n <button mat-button *ngIf=\"stateCtrl.value && !disabled\" matSuffix mat-icon-button aria-label=\"Clear\"\r\n (click)=\"clearValue()\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n <mat-hint>{{hint}}</mat-hint>\r\n <mat-error *ngIf=\"!stateCtrl.valid && stateCtrl.touched\">Select valid option</mat-error>\r\n</mat-form-field>", styles: [""] },] } ]; AutoCompleteComponent.ctorParameters = () => []; AutoCompleteComponent.propDecorators = { options: [{ type: Input }], defaultOption: [{ type: Input }], defaultOptionKey: [{ type: Input }], label: [{ type: Input }], placeholder: [{ type: Input }], displayKey: [{ type: Input }], filterKey: [{ type: Input }], hint: [{ type: Input }], appearance: [{ type: Input }], disabled: [{ type: Input }], autoClear: [{ type: Input }], validators: [{ type: Input }], output: [{ type: Output }] }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0by1jb21wbGV0ZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtbWF0LWR5bmFtaWMtZm9ybS1idWlsZGVyL3NyYy9saWIvY29tcG9uZW50cy9hdXRvLWNvbXBsZXRlL2F1dG8tY29tcGxldGUuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQW9DLE1BQU0sZUFBZSxDQUFDO0FBQ3pHLE9BQU8sRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFnQyxNQUFNLGdCQUFnQixDQUFDO0FBRXZGLE9BQU8sRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDaEQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQVFsQyxNQUFNLE9BQU8scUJBQXFCO0lBdUJoQztRQXJCUyxZQUFPLEdBQVUsRUFBRSxDQUFDO1FBU3BCLFNBQUksR0FBVyxFQUFFLENBQUM7UUFDbEIsZUFBVSxHQUFXLFVBQVUsQ0FBQztRQUNoQyxhQUFRLEdBQVksS0FBSyxDQUFDO1FBQzFCLGNBQVMsR0FBWSxLQUFLLENBQUM7UUFJMUIsV0FBTSxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7SUFLM0IsQ0FBQztJQUVqQixRQUFRO1FBQ04sSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFFRCxXQUFXLENBQUMsT0FBc0I7UUFDaEMsSUFBSSxPQUFPLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFFbkMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTO2dCQUNqQixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7WUFFekIsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVk7aUJBQy9DLElBQUksQ0FDSCxT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Qy9ELHFFQUFxRTtZQUNyRSxJQUFJLENBQUMsQ0FBQyxLQUFLLElBQUksT0FBTyxDQUFDLENBQUMsS0FBSyxLQUFLLFFBQVEsRUFBRTtnQkFDMUMsT0FBTyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQzthQUN4QjtpQkFBTTtnQkFDTCxPQUFPLElBQUksQ0FBQzthQUNiO1FBQ0gsQ0FBQyxDQUFDO0lBQ0osQ0FBQzs7O1lBeEdGLFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUsdUJBQXVCO2dCQUNqQyxnK0JBQTZDOzthQUU5Qzs7OztzQkFHRSxLQUFLOzRCQUVMLEtBQUs7K0JBQ0wsS0FBSztvQkFDTCxLQUFLOzBCQUNMLEtBQUs7eUJBQ0wsS0FBSzt3QkFFTCxLQUFLO21CQUNMLEtBQUs7eUJBQ0wsS0FBSzt1QkFDTCxLQUFLO3dCQUNMLEtBQUs7eUJBRUwsS0FBSztxQkFFTCxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIE9uQ2hhbmdlcywgU2ltcGxlQ2hhbmdlcywgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEZvcm1Db250cm9sLCBWYWxpZGF0b3JzLCBWYWxpZGF0b3JGbiwgQWJzdHJhY3RDb250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IHN0YXJ0V2l0aCwgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBpc1N0cmluZyB9IGZyb20gJ2xvZGFzaCc7XHJcbmltcG9ydCB7IE1hdEF1dG9jb21wbGV0ZVNlbGVjdGVkRXZlbnQgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9hdXRvY29tcGxldGUnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICduZ3gtbWF0LWF1dG8tY29tcGxldGUnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9hdXRvLWNvbXBsZXRlLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9hdXRvLWNvbXBsZXRlLmNvbXBvbmVudC5jc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgQXV0b0NvbXBsZXRlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xyXG5cclxuICBASW5wdXQoKSBvcHRpb25zOiBhbnlbXSA9IFtdO1xyXG4gIC8vIERlZmF1bHQgc2VsZWN0ZWQgb3B0aW9ucyAoYXJyYXkgb2Ygc2VsZWN0aW9uIGtleXMpXHJcbiAgQElucHV0KCkgZGVmYXVsdE9wdGlvbjogYW55W107XHJcbiAgQElucHV0KCkgZGVmYXVsdE9wdGlvbktleTogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIGxhYmVsOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgcGxhY2Vob2xkZXI6IHN0cmluZztcclxuICBASW5wdXQoKSBkaXNwbGF5S2V5OiBzdHJpbmc7XHJcbiAgLy8gSWYgZmlsdGVyS2V5IG5vdCBzcGVjaWZpZWQgZGVmYXVsdHMgdG8gZGlzcGxheUtleSB2YWx1ZVxyXG4gIEBJbnB1dCgpIGZpbHRlcktleTogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIGhpbnQ6IHN0cmluZyA9ICcnO1xyXG4gIEBJbnB1dCgpIGFwcGVhcmFuY2U6IHN0cmluZyA9ICdzdGFuZGFyZCc7XHJcbiAgQElucHV0KCkgZGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBASW5wdXQoKSBhdXRvQ2xlYXI6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgQElucHV0KCkgdmFsaWRhdG9yczogVmFsaWRhdG9yRm5bXTtcclxuXHJcbiAgQE91dHB1dCgpIG91dHB1dCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuICBzdGF0ZUN0cmw6IEZvcm1Db250cm9sO1xyXG4gIGZpbHRlcmVkT3B0aW9uczogT2JzZXJ2YWJsZTxhbnlbXT47XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkgeyB9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5zZXR1cFZhbGlkYXRvcnMoKTtcclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcclxuICAgIGlmIChjaGFuZ2VzLm9wdGlvbnMgJiYgdGhpcy5vcHRpb25zKSB7XHJcblxyXG4gICAgICBpZiAoIXRoaXMuc3RhdGVDdHJsKVxyXG4gICAgICAgIHRoaXMuc2V0dXBWYWxpZGF0b3JzKCk7XHJcblxyXG4gICAgICB0aGlzLmZpbHRlcmVkT3B0aW9ucyA9IHRoaXMuc3RhdGVDdHJsLnZhbHVlQ2hhbmdlc1xyXG4gICAgICAgIC5waXBlKFxyXG4gICAgICAgICAgc3RhcnRXaXRoKCcnKSxcclxuICAgICAgICAgIG1hcChzdGF0ZSA9PiBzdGF0ZSA/IHRoaXMuX2ZpbHRlck9wdGlvbnMoc3RhdGUpIDogdGhpcy5vcHRpb25zLnNsaWNlKCkpXHJcbiAgICAgICAgKTtcclxuICAgICAgaWYgKHRoaXMuZGVmYXVsdE9wdGlvbiAmJiB0aGlzLmRlZmF1bHRPcHRpb25LZXkpIHtcclxuICAgICAgICB0aGlzLnN0YXRlQ3RybC5zZXRWYWx1ZSh0aGlzLm9wdGlvbnMuZmluZChvID0+IG9bdGhpcy5kZWZhdWx0T3B0aW9uS2V5XSA9PT0gdGhpcy5kZWZhdWx0T3B0aW9uKSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNldHVwVmFsaWRhdG9ycygpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnN0YXRlQ3RybClcclxuICAgICAgcmV0dXJuO1xyXG5cclxuICAgIGlmICh0aGlzLnZhbGlkYXRvcnMpIHtcclxuICAgICAgbGV0IGlzUmVxdWlyZWQgPSBmYWxzZTtcclxuICAgICAgdGhpcy52YWxpZGF0b3JzLmZvckVhY2godmQgPT4ge1xyXG4gICAgICAgIGlmICh2ZC5uYW1lID09PSAncmVxdWlyZWQnKVxyXG4gICAgICAgICAgaXNSZXF1aXJlZCA9IHRydWU7XHJcbiAgICAgIH0pO1xyXG4gICAgICBpZiAoaXNSZXF1aXJlZCkge1xyXG4gICAgICAgIHRoaXMuc3RhdGVDdHJsID0gbmV3IEZvcm1Db250cm9sKG51bGwsIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCB0aGlzLnZhbHVlU2VsZWN0ZWQoKV0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuc3RhdGVDdHJsID0gbmV3IEZvcm1Db250cm9sKG51bGwsIFt0aGlzLnZhbHVlU2VsZWN0ZWQoKV0pO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnN0YXRlQ3RybCA9IG5ldyBGb3JtQ29udHJvbChudWxsLCBbdGhpcy52YWx1ZVNlbGVjdGVkKCldKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGRpc3BsYXlGbih2YWx1ZTogYW55KTogYW55IHtcclxuICAgIGlmICh2YWx1ZSkgcmV0dXJuIHZhbHVlW3RoaXMuZGlzcGxheUtleV07XHJcbiAgfVxyXG5cclxuICBzZXRWYWx1ZShldmVudDogTWF0QXV0b2NvbXBsZXRlU2VsZWN0ZWRFdmVudCk6IHZvaWQge1xyXG4gICAgdGhpcy5vdXRwdXQuZW1pdChldmVudC5vcHRpb24udmFsdWUpO1xyXG4gICAgaWYgKHRoaXMuYXV0b0NsZWFyKSB7XHJcbiAgICAgIHRoaXMuc3RhdGVDdHJsLnJlc2V0KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjbGVhclZhbHVlKCk6IHZvaWQge1xyXG4gICAgdGhpcy5vdXRwdXQuZW1pdCh1bmRlZmluZWQpO1xyXG4gICAgdGhpcy5zdGF0ZUN0cmwucmVzZXQoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2ZpbHRlck9wdGlvbnModmFsdWU6IHN0cmluZyk6IGFueVtdIHtcclxuICAgIGlmIChpc1N0cmluZyh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoID49IDEpIHtcclxuICAgICAgY29uc3QgZmlsdGVyVmFsdWUgPSB2YWx1ZS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICByZXR1cm4gdGhpcy5vcHRpb25zLmZpbHRlcihzdGF0ZSA9PiBzdGF0ZVt0aGlzLmZpbHRlcktleSA/IHRoaXMuZmlsdGVyS2V5IDogdGhpcy5kaXNwbGF5S2V5XS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGZpbHRlclZhbHVlKSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB2YWx1ZVNlbGVjdGVkKCk6IFZhbGlkYXRvckZuIHtcclxuICAgIHJldHVybiAoYzogQWJzdHJhY3RDb250cm9sKTogeyBba2V5OiBzdHJpbmddOiBib29sZWFuIH0gfCBudWxsID0+IHtcclxuICAgICAgLy8gaWYgdmFsdWUgaXMgc2V0IGFuZCBpdCBpcyBub3QgYW4gb2JqZWN0LCB2YWxpZCBvcHRpb24gbm90IHNlbGVjdGVkXHJcbiAgICAgIGlmIChjLnZhbHVlICYmIHR5cGVvZiBjLnZhbHVlICE9PSAnb2JqZWN0Jykge1xyXG4gICAgICAgIHJldHVybiB7IG1hdGNoOiB0cnVlIH07XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgfVxyXG5cclxufVxyXG4iXX0=