UNPKG

ngx-vest-forms

Version:

Opinionated template-driven forms library for Angular

85 lines 12.7 kB
import { Directive, input } from '@angular/core'; import { NG_ASYNC_VALIDATORS, } from '@angular/forms'; import { debounceTime, Observable, of, ReplaySubject, Subject, switchMap, take, takeUntil, } from 'rxjs'; import { cloneDeep, set } from '../utils/form-utils'; import * as i0 from "@angular/core"; export class ValidateRootFormDirective { constructor() { this.validationOptions = input({ debounceTime: 0 }); this.destroy$$ = new Subject(); this.formValue = input(null); this.suite = input(null); /** * Whether the root form should be validated or not * This will use the field rootForm */ this.validateRootForm = input(false); /** * Used to debounce formValues to make sure vest isn't triggered all the time */ this.formValueCache = {}; } validate(control) { if (!this.suite() || !this.formValue()) { return of(null); } return this.createAsyncValidator('rootForm', this.validationOptions())(control.getRawValue()); } createAsyncValidator(field, validationOptions) { if (!this.suite()) { return () => of(null); } return (value) => { if (!this.formValue()) { return of(null); } const mod = cloneDeep(value); set(mod, field, value); // Update the property with path if (!this.formValueCache[field]) { this.formValueCache[field] = { sub$$: new ReplaySubject(1), // Keep track of the last model }; this.formValueCache[field].debounced = this.formValueCache[field].sub$$.pipe(debounceTime(validationOptions.debounceTime)); } // Next the latest model in the cache for a certain field this.formValueCache[field].sub$$.next(mod); return this.formValueCache[field].debounced.pipe( // When debounced, take the latest value and perform the asynchronous vest validation take(1), switchMap(() => { return new Observable((observer) => { this.suite()(mod, field).done((result) => { const errors = result.getErrors()[field]; observer.next(errors ? { error: errors[0], errors } : null); observer.complete(); }); }); }), takeUntil(this.destroy$$)); }; } ngOnDestroy() { this.destroy$$.next(); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: ValidateRootFormDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); } static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.0.1", type: ValidateRootFormDirective, isStandalone: true, selector: "form[validateRootForm][formValue][suite]", inputs: { validationOptions: { classPropertyName: "validationOptions", publicName: "validationOptions", isSignal: true, isRequired: false, transformFunction: null }, formValue: { classPropertyName: "formValue", publicName: "formValue", isSignal: true, isRequired: false, transformFunction: null }, suite: { classPropertyName: "suite", publicName: "suite", isSignal: true, isRequired: false, transformFunction: null }, validateRootForm: { classPropertyName: "validateRootForm", publicName: "validateRootForm", isSignal: true, isRequired: false, transformFunction: null } }, providers: [ { provide: NG_ASYNC_VALIDATORS, useExisting: ValidateRootFormDirective, multi: true, }, ], ngImport: i0 }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: ValidateRootFormDirective, decorators: [{ type: Directive, args: [{ selector: 'form[validateRootForm][formValue][suite]', standalone: true, providers: [ { provide: NG_ASYNC_VALIDATORS, useExisting: ValidateRootFormDirective, multi: true, }, ], }] }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGUtcm9vdC1mb3JtLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC12ZXN0LWZvcm1zL3NyYy9saWIvZGlyZWN0aXZlcy92YWxpZGF0ZS1yb290LWZvcm0uZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFhLE1BQU0sZUFBZSxDQUFDO0FBQzVELE9BQU8sRUFJTCxtQkFBbUIsR0FFcEIsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQ0wsWUFBWSxFQUNaLFVBQVUsRUFDVixFQUFFLEVBQ0YsYUFBYSxFQUNiLE9BQU8sRUFDUCxTQUFTLEVBQ1QsSUFBSSxFQUNKLFNBQVMsR0FDVixNQUFNLE1BQU0sQ0FBQztBQUVkLE9BQU8sRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0scUJBQXFCLENBQUM7O0FBY3JELE1BQU0sT0FBTyx5QkFBeUI7SUFYdEM7UUFZUyxzQkFBaUIsR0FBRyxLQUFLLENBQW9CLEVBQUUsWUFBWSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDeEQsY0FBUyxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7UUFFakMsY0FBUyxHQUFHLEtBQUssQ0FBVyxJQUFJLENBQUMsQ0FBQztRQUNsQyxVQUFLLEdBQUcsS0FBSyxDQUluQixJQUFJLENBQUMsQ0FBQztRQUVoQjs7O1dBR0c7UUFDYSxxQkFBZ0IsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFaEQ7O1dBRUc7UUFDYyxtQkFBYyxHQUszQixFQUFFLENBQUM7S0FzRFI7SUFwRFEsUUFBUSxDQUNiLE9BQWtDO1FBRWxDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQztZQUN2QyxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FB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RTt3QkFDVDs0QkFDRSxPQUFPLEVBQUUsbUJBQW1COzRCQUM1QixXQUFXLDJCQUEyQjs0QkFDdEMsS0FBSyxFQUFFLElBQUk7eUJBQ1o7cUJBQ0Y7aUJBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaXJlY3RpdmUsIGlucHV0LCBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIEFic3RyYWN0Q29udHJvbCxcbiAgQXN5bmNWYWxpZGF0b3IsXG4gIEFzeW5jVmFsaWRhdG9yRm4sXG4gIE5HX0FTWU5DX1ZBTElEQVRPUlMsXG4gIFZhbGlkYXRpb25FcnJvcnMsXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7XG4gIGRlYm91bmNlVGltZSxcbiAgT2JzZXJ2YWJsZSxcbiAgb2YsXG4gIFJlcGxheVN1YmplY3QsXG4gIFN1YmplY3QsXG4gIHN3aXRjaE1hcCxcbiAgdGFrZSxcbiAgdGFrZVVudGlsLFxufSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFN0YXRpY1N1aXRlIH0gZnJvbSAndmVzdCc7XG5pbXBvcnQgeyBjbG9uZURlZXAsIHNldCB9IGZyb20gJy4uL3V0aWxzL2Zvcm0tdXRpbHMnO1xuaW1wb3J0IHsgVmFsaWRhdGlvbk9wdGlvbnMgfSBmcm9tICcuL3ZhbGlkYXRpb24tb3B0aW9ucyc7XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ2Zvcm1bdmFsaWRhdGVSb290Rm9ybV1bZm9ybVZhbHVlXVtzdWl0ZV0nLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19BU1lOQ19WQUxJREFUT1JTLFxuICAgICAgdXNlRXhpc3Rpbmc6IFZhbGlkYXRlUm9vdEZvcm1EaXJlY3RpdmUsXG4gICAgICBtdWx0aTogdHJ1ZSxcbiAgICB9LFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBWYWxpZGF0ZVJvb3RGb3JtRGlyZWN0aXZlPFQ+IGltcGxlbWVudHMgQXN5bmNWYWxpZGF0b3IsIE9uRGVzdHJveSB7XG4gIHB1YmxpYyB2YWxpZGF0aW9uT3B0aW9ucyA9IGlucHV0PFZhbGlkYXRpb25PcHRpb25zPih7IGRlYm91bmNlVGltZTogMCB9KTtcbiAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95JCQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIHB1YmxpYyByZWFkb25seSBmb3JtVmFsdWUgPSBpbnB1dDxUIHwgbnVsbD4obnVsbCk7XG4gIHB1YmxpYyByZWFkb25seSBzdWl0ZSA9IGlucHV0PFN0YXRpY1N1aXRlPFxuICAgIHN0cmluZyxcbiAgICBzdHJpbmcsXG4gICAgKG1vZGVsOiBULCBmaWVsZDogc3RyaW5nKSA9PiB2b2lkXG4gID4gfCBudWxsPihudWxsKTtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgcm9vdCBmb3JtIHNob3VsZCBiZSB2YWxpZGF0ZWQgb3Igbm90XG4gICAqIFRoaXMgd2lsbCB1c2UgdGhlIGZpZWxkIHJvb3RGb3JtXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdmFsaWRhdGVSb290Rm9ybSA9IGlucHV0KGZhbHNlKTtcblxuICAvKipcbiAgICogVXNlZCB0byBkZWJvdW5jZSBmb3JtVmFsdWVzIHRvIG1ha2Ugc3VyZSB2ZXN0IGlzbid0IHRyaWdnZXJlZCBhbGwgdGhlIHRpbWVcbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgZm9ybVZhbHVlQ2FjaGU6IHtcbiAgICBbZmllbGQ6IHN0cmluZ106IFBhcnRpYWw8e1xuICAgICAgc3ViJCQ6IFJlcGxheVN1YmplY3Q8dW5rbm93bj47XG4gICAgICBkZWJvdW5jZWQ6IE9ic2VydmFibGU8YW55PjtcbiAgICB9PjtcbiAgfSA9IHt9O1xuXG4gIHB1YmxpYyB2YWxpZGF0ZShcbiAgICBjb250cm9sOiBBYnN0cmFjdENvbnRyb2w8YW55LCBhbnk+XG4gICk6IE9ic2VydmFibGU8VmFsaWRhdGlvbkVycm9ycyB8IG51bGw+IHtcbiAgICBpZiAoIXRoaXMuc3VpdGUoKSB8fCAhdGhpcy5mb3JtVmFsdWUoKSkge1xuICAgICAgcmV0dXJuIG9mKG51bGwpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jcmVhdGVBc3luY1ZhbGlkYXRvcigncm9vdEZvcm0nLCB0aGlzLnZhbGlkYXRpb25PcHRpb25zKCkpKFxuICAgICAgY29udHJvbC5nZXRSYXdWYWx1ZSgpXG4gICAgKSBhcyBPYnNlcnZhYmxlPFZhbGlkYXRpb25FcnJvcnMgfCBudWxsPjtcbiAgfVxuXG4gIHB1YmxpYyBjcmVhdGVBc3luY1ZhbGlkYXRvcihmaWVsZDogc3RyaW5nLCB2YWxpZGF0aW9uT3B0aW9uczogVmFsaWRhdGlvbk9wdGlvbnMpOiBBc3luY1ZhbGlkYXRvckZuIHtcbiAgICBpZiAoIXRoaXMuc3VpdGUoKSkge1xuICAgICAgcmV0dXJuICgpID0+IG9mKG51bGwpO1xuICAgIH1cbiAgICByZXR1cm4gKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgIGlmICghdGhpcy5mb3JtVmFsdWUoKSkge1xuICAgICAgICByZXR1cm4gb2YobnVsbCk7XG4gICAgICB9XG4gICAgICBjb25zdCBtb2QgPSBjbG9uZURlZXAodmFsdWUgYXMgVCk7XG4gICAgICBzZXQobW9kIGFzIG9iamVjdCwgZmllbGQsIHZhbHVlKTsgLy8gVXBkYXRlIHRoZSBwcm9wZXJ0eSB3aXRoIHBhdGhcbiAgICAgIGlmICghdGhpcy5mb3JtVmFsdWVDYWNoZVtmaWVsZF0pIHtcbiAgICAgICAgdGhpcy5mb3JtVmFsdWVDYWNoZVtmaWVsZF0gPSB7XG4gICAgICAgICAgc3ViJCQ6IG5ldyBSZXBsYXlTdWJqZWN0KDEpLCAvLyBLZWVwIHRyYWNrIG9mIHRoZSBsYXN0IG1vZGVsXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuZm9ybVZhbHVlQ2FjaGVbZmllbGRdLmRlYm91bmNlZCA9IHRoaXMuZm9ybVZhbHVlQ2FjaGVbXG4gICAgICAgICAgZmllbGRcbiAgICAgICAgICBdLnN1YiQkIS5waXBlKGRlYm91bmNlVGltZSh2YWxpZGF0aW9uT3B0aW9ucy5kZWJvdW5jZVRpbWUpKTtcbiAgICAgIH1cbiAgICAgIC8vIE5leHQgdGhlIGxhdGVzdCBtb2RlbCBpbiB0aGUgY2FjaGUgZm9yIGEgY2VydGFpbiBmaWVsZFxuICAgICAgdGhpcy5mb3JtVmFsdWVDYWNoZVtmaWVsZF0uc3ViJCQhLm5leHQobW9kKTtcblxuICAgICAgcmV0dXJuIHRoaXMuZm9ybVZhbHVlQ2FjaGVbZmllbGRdLmRlYm91bmNlZCEucGlwZShcbiAgICAgICAgLy8gV2hlbiBkZWJvdW5jZWQsIHRha2UgdGhlIGxhdGVzdCB2YWx1ZSBhbmQgcGVyZm9ybSB0aGUgYXN5bmNocm9ub3VzIHZlc3QgdmFsaWRhdGlvblxuICAgICAgICB0YWtlKDEpLFxuICAgICAgICBzd2l0Y2hNYXAoKCkgPT4ge1xuICAgICAgICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZSgob2JzZXJ2ZXIpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc3VpdGUoKSEobW9kLCBmaWVsZCkuZG9uZSgocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IGVycm9ycyA9IHJlc3VsdC5nZXRFcnJvcnMoKVtmaWVsZF07XG4gICAgICAgICAgICAgIG9ic2VydmVyLm5leHQoZXJyb3JzID8geyBlcnJvcjogZXJyb3JzWzBdLCBlcnJvcnMgfSA6IG51bGwpO1xuICAgICAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSkgYXMgT2JzZXJ2YWJsZTxWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbD47XG4gICAgICAgIH0pLFxuICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JCQpXG4gICAgICApO1xuICAgIH07XG4gIH1cblxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5kZXN0cm95JCQubmV4dCgpO1xuICB9XG59XG4iXX0=