UNPKG

@ngspot/ngx-errors

Version:

<p align="center"> <img width="20%" height="20%" src="https://github.com/DmitryEfimenko/ngspot/blob/main/packages/ngx-errors/package/assets/logo.png?raw=true"> </p>

84 lines 13.1 kB
import { Injectable, signal } from '@angular/core'; import { NEVER, ReplaySubject, asapScheduler, auditTime, filter, merge, of, share, switchMap, take, timer, } from 'rxjs'; import { extractTouchedChanges, extractDirtyChanges, } from './extract-control-changes'; import { InvalidShowWhenError } from './ngx-errors'; import * as i0 from "@angular/core"; export class AllErrorsStateService { constructor() { this.state = signal(new Map()); } registerControl(control, parentForm) { const alreadyRegisteredControl = this.state().get(control); if (alreadyRegisteredControl) { alreadyRegisteredControl.registeredInstancesCount++; return; } const watchedEvents$ = eventsTriggeringVisibilityChange$(control, parentForm); this.state.update((map) => { map.set(control, { control, parentForm, watchedEvents$, registeredInstancesCount: 1, errors: signal({}), }); return new Map(map); }); } unregisterControl(control) { const alreadyRegisteredControl = this.state().get(control); if (!alreadyRegisteredControl) { return; } alreadyRegisteredControl.registeredInstancesCount--; if (alreadyRegisteredControl.registeredInstancesCount === 0) { this.state.update((map) => { map.delete(control); return new Map(map); }); } } getControlState(control) { return this.state().get(control); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.7", ngImport: i0, type: AllErrorsStateService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); } static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.7", ngImport: i0, type: AllErrorsStateService, providedIn: 'root' }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.7", ngImport: i0, type: AllErrorsStateService, decorators: [{ type: Injectable, args: [{ providedIn: 'root' }] }] }); export function getErrorStateMatcher(errorStateMatchers, showWhen) { const errorStateMatcher = errorStateMatchers.get(showWhen); if (!errorStateMatcher) { throw new InvalidShowWhenError(showWhen, errorStateMatchers.validKeys()); } return errorStateMatcher; } function eventsTriggeringVisibilityChange$(control, form) { const ngSubmit$ = form ? form.ngSubmit.asObservable() : NEVER; const $ = merge(control.valueChanges, control.statusChanges, ngSubmit$, extractTouchedChanges(control), extractDirtyChanges(control), asyncBugWorkaround$(control), of(null)).pipe( // using auditTime due to the fact that even though touch event // might fire, the control.touched won't be updated at the time // when ErrorStateMatcher check it auditTime(0, asapScheduler), share({ connector: () => new ReplaySubject(1), resetOnComplete: true, resetOnError: true, resetOnRefCountZero: true, })); return $; } /** * control.statusChanges do not emit when there's async validator * https://github.com/angular/angular/issues/41519 * ugly workaround: */ function asyncBugWorkaround$(control) { let $ = NEVER; if (control.asyncValidator && control.status === 'PENDING') { $ = timer(0, 50).pipe(switchMap(() => of(control.status)), filter((x) => x !== 'PENDING'), take(1)); } return $; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxsLWVycm9ycy1zdGF0ZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvbmd4LWVycm9ycy9wYWNrYWdlL3NyYy9saWIvYWxsLWVycm9ycy1zdGF0ZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQWtCLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQVFuRSxPQUFPLEVBQ0wsS0FBSyxFQUVMLGFBQWEsRUFDYixhQUFhLEVBQ2IsU0FBUyxFQUNULE1BQU0sRUFDTixLQUFLLEVBQ0wsRUFBRSxFQUNGLEtBQUssRUFDTCxTQUFTLEVBQ1QsSUFBSSxFQUNKLEtBQUssR0FDTixNQUFNLE1BQU0sQ0FBQztBQUdkLE9BQU8sRUFDTCxxQkFBcUIsRUFDckIsbUJBQW1CLEdBQ3BCLE1BQU0sMkJBQTJCLENBQUM7QUFFbkMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sY0FBYyxDQUFDOztBQWlCcEQsTUFBTSxPQUFPLHFCQUFxQjtJQURsQztRQUVVLFVBQUssR0FBRyxNQUFNLENBQWEsSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0tBZ0QvQztJQTlDQyxlQUFlLENBQUMsT0FBd0IsRUFBRSxVQUEyQjtRQUNuRSxNQUFNLHdCQUF3QixHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFM0QsSUFBSSx3QkFBd0IsRUFBRSxDQUFDO1lBQzdCLHdCQUF3QixDQUFDLHdCQUF3QixFQUFFLENBQUM7WUFDcEQsT0FBTztRQUNULENBQUM7UUFFRCxNQUFNLGNBQWMsR0FBRyxpQ0FBaUMsQ0FDdEQsT0FBTyxFQUNQLFVBQVUsQ0FDWCxDQUFDO1FBRUYsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUN4QixHQUFHLENBQUMsR0FBRyxDQUFDLE9BQU8s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LEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUNuQixTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUNuQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxTQUFTLENBQUMsRUFDOUIsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUNSLENBQUM7SUFDSixDQUFDO0lBQ0QsT0FBTyxDQUFDLENBQUM7QUFDWCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgV3JpdGFibGVTaWduYWwsIHNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge1xyXG4gIEFic3RyYWN0Q29udHJvbCxcclxuICBGb3JtQ29udHJvbFN0YXR1cyxcclxuICBGb3JtR3JvdXBEaXJlY3RpdmUsXHJcbiAgTmdGb3JtLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuXHJcbmltcG9ydCB7XHJcbiAgTkVWRVIsXHJcbiAgT2JzZXJ2YWJsZSxcclxuICBSZXBsYXlTdWJqZWN0LFxyXG4gIGFzYXBTY2hlZHVsZXIsXHJcbiAgYXVkaXRUaW1lLFxyXG4gIGZpbHRlcixcclxuICBtZXJnZSxcclxuICBvZixcclxuICBzaGFyZSxcclxuICBzd2l0Y2hNYXAsXHJcbiAgdGFrZSxcclxuICB0aW1lcixcclxufSBmcm9tICdyeGpzJztcclxuXHJcbmltcG9ydCB7IEVycm9yU3RhdGVNYXRjaGVycyB9IGZyb20gJy4vZXJyb3Itc3RhdGUtbWF0Y2hlcnMuc2VydmljZSc7XHJcbmltcG9ydCB7XHJcbiAgZXh0cmFjdFRvdWNoZWRDaGFuZ2VzLFxyXG4gIGV4dHJhY3REaXJ0eUNoYW5nZXMsXHJcbn0gZnJvbSAnLi9leHRyYWN0LWNvbnRyb2wtY2hhbmdlcyc7XHJcbmltcG9ydCB7IE1heWJlUGFyZW50Rm9ybSB9IGZyb20gJy4vZm9ybS5kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBJbnZhbGlkU2hvd1doZW5FcnJvciB9IGZyb20gJy4vbmd4LWVycm9ycyc7XHJcblxyXG50eXBlIEhhc0Vycm9yID0gYm9vbGVhbjtcclxudHlwZSBEaXJlY3RpdmVJZCA9IG51bWJlcjtcclxuXHJcbnR5cGUgRXJyb3JTdGF0ZSA9IE1hcDxcclxuICBBYnN0cmFjdENvbnRyb2wsXHJcbiAge1xyXG4gICAgY29udHJvbDogQWJzdHJhY3RDb250cm9sO1xyXG4gICAgcGFyZW50Rm9ybTogRm9ybUdyb3VwRGlyZWN0aXZlIHwgTmdGb3JtIHwgbnVsbDtcclxuICAgIHdhdGNoZWRFdmVudHMkOiBPYnNlcnZhYmxlPGFueT47XHJcbiAgICByZWdpc3RlcmVkSW5zdGFuY2VzQ291bnQ6IG51bWJlcjtcclxuICAgIGVycm9yczogV3JpdGFibGVTaWduYWw8UmVjb3JkPERpcmVjdGl2ZUlkLCBIYXNFcnJvcj4+O1xyXG4gIH1cclxuPjtcclxuXHJcbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXHJcbmV4cG9ydCBjbGFzcyBBbGxFcnJvcnNTdGF0ZVNlcnZpY2Uge1xyXG4gIHByaXZhdGUgc3RhdGUgPSBzaWduYWw8RXJyb3JTdGF0ZT4obmV3IE1hcCgpKTtcclxuXHJcbiAgcmVnaXN0ZXJDb250cm9sKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCwgcGFyZW50Rm9ybTogTWF5YmVQYXJlbnRGb3JtKSB7XHJcbiAgICBjb25zdCBhbHJlYWR5UmVnaXN0ZXJlZENvbnRyb2wgPSB0aGlzLnN0YXRlKCkuZ2V0KGNvbnRyb2wpO1xyXG5cclxuICAgIGlmIChhbHJlYWR5UmVnaXN0ZXJlZENvbnRyb2wpIHtcclxuICAgICAgYWxyZWFkeVJlZ2lzdGVyZWRDb250cm9sLnJlZ2lzdGVyZWRJbnN0YW5jZXNDb3VudCsrO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qgd2F0Y2hlZEV2ZW50cyQgPSBldmVudHNUcmlnZ2VyaW5nVmlzaWJpbGl0eUNoYW5nZSQoXHJcbiAgICAgIGNvbnRyb2wsXHJcbiAgICAgIHBhcmVudEZvcm0sXHJcbiAgICApO1xyXG5cclxuICAgIHRoaXMuc3RhdGUudXBkYXRlKChtYXApID0+IHtcclxuICAgICAgbWFwLnNldChjb250cm9sLCB7XHJcbiAgICAgICAgY29udHJvbCxcclxuICAgICAgICBwYXJlbnRGb3JtLFxyXG4gICAgICAgIHdhdGNoZWRFdmVudHMkLFxyXG4gICAgICAgIHJlZ2lzdGVyZWRJbnN0YW5jZXNDb3VudDogMSxcclxuICAgICAgICBlcnJvcnM6IHNpZ25hbCh7fSksXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgcmV0dXJuIG5ldyBNYXAobWFwKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgdW5yZWdpc3RlckNvbnRyb2woY29udHJvbDogQWJzdHJhY3RDb250cm9sKSB7XHJcbiAgICBjb25zdCBhbHJlYWR5UmVnaXN0ZXJlZENvbnRyb2wgPSB0aGlzLnN0YXRlKCkuZ2V0KGNvbnRyb2wpO1xyXG5cclxuICAgIGlmICghYWxyZWFkeVJlZ2lzdGVyZWRDb250cm9sKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBhbHJlYWR5UmVnaXN0ZXJlZENvbnRyb2wucmVnaXN0ZXJlZEluc3RhbmNlc0NvdW50LS07XHJcblxyXG4gICAgaWYgKGFscmVhZHlSZWdpc3RlcmVkQ29udHJvbC5yZWdpc3RlcmVkSW5zdGFuY2VzQ291bnQgPT09IDApIHtcclxuICAgICAgdGhpcy5zdGF0ZS51cGRhdGUoKG1hcCkgPT4ge1xyXG4gICAgICAgIG1hcC5kZWxldGUoY29udHJvbCk7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBNYXAobWFwKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRDb250cm9sU3RhdGUoY29udHJvbDogQWJzdHJhY3RDb250cm9sKSB7XHJcbiAgICByZXR1cm4gdGhpcy5zdGF0ZSgpLmdldChjb250cm9sKTtcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRFcnJvclN0YXRlTWF0Y2hlcihcclxuICBlcnJvclN0YXRlTWF0Y2hlcnM6IEVycm9yU3RhdGVNYXRjaGVycyxcclxuICBzaG93V2hlbjogc3RyaW5nLFxyXG4pIHtcclxuICBjb25zdCBlcnJvclN0YXRlTWF0Y2hlciA9IGVycm9yU3RhdGVNYXRjaGVycy5nZXQoc2hvd1doZW4pO1xyXG5cclxuICBpZiAoIWVycm9yU3RhdGVNYXRjaGVyKSB7XHJcbiAgICB0aHJvdyBuZXcgSW52YWxpZFNob3dXaGVuRXJyb3Ioc2hvd1doZW4sIGVycm9yU3RhdGVNYXRjaGVycy52YWxpZEtleXMoKSk7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gZXJyb3JTdGF0ZU1hdGNoZXI7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGV2ZW50c1RyaWdnZXJpbmdWaXNpYmlsaXR5Q2hhbmdlJChcclxuICBjb250cm9sOiBBYnN0cmFjdENvbnRyb2wsXHJcbiAgZm9ybTogRm9ybUdyb3VwRGlyZWN0aXZlIHwgTmdGb3JtIHwgbnVsbCxcclxuKSB7XHJcbiAgY29uc3QgbmdTdWJtaXQkID0gZm9ybSA/IGZvcm0ubmdTdWJtaXQuYXNPYnNlcnZhYmxlKCkgOiBORVZFUjtcclxuXHJcbiAgY29uc3QgJCA9IG1lcmdlKFxyXG4gICAgY29udHJvbC52YWx1ZUNoYW5nZXMsXHJcbiAgICBjb250cm9sLnN0YXR1c0NoYW5nZXMsXHJcbiAgICBuZ1N1Ym1pdCQsXHJcbiAgICBleHRyYWN0VG91Y2hlZENoYW5nZXMoY29udHJvbCksXHJcbiAgICBleHRyYWN0RGlydHlDaGFuZ2VzKGNvbnRyb2wpLFxyXG4gICAgYXN5bmNCdWdXb3JrYXJvdW5kJChjb250cm9sKSxcclxuICAgIG9mKG51bGwpLFxyXG4gICkucGlwZShcclxuICAgIC8vIHVzaW5nIGF1ZGl0VGltZSBkdWUgdG8gdGhlIGZhY3QgdGhhdCBldmVuIHRob3VnaCB0b3VjaCBldmVudFxyXG4gICAgLy8gbWlnaHQgZmlyZSwgdGhlIGNvbnRyb2wudG91Y2hlZCB3b24ndCBiZSB1cGRhdGVkIGF0IHRoZSB0aW1lXHJcbiAgICAvLyB3aGVuIEVycm9yU3RhdGVNYXRjaGVyIGNoZWNrIGl0XHJcbiAgICBhdWRpdFRpbWUoMCwgYXNhcFNjaGVkdWxlciksXHJcbiAgICBzaGFyZSh7XHJcbiAgICAgIGNvbm5lY3RvcjogKCkgPT4gbmV3IFJlcGxheVN1YmplY3QoMSksXHJcbiAgICAgIHJlc2V0T25Db21wbGV0ZTogdHJ1ZSxcclxuICAgICAgcmVzZXRPbkVycm9yOiB0cnVlLFxyXG4gICAgICByZXNldE9uUmVmQ291bnRaZXJvOiB0cnVlLFxyXG4gICAgfSksXHJcbiAgKTtcclxuXHJcbiAgcmV0dXJuICQ7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBjb250cm9sLnN0YXR1c0NoYW5nZXMgZG8gbm90IGVtaXQgd2hlbiB0aGVyZSdzIGFzeW5jIHZhbGlkYXRvclxyXG4gKiBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2lzc3Vlcy80MTUxOVxyXG4gKiB1Z2x5IHdvcmthcm91bmQ6XHJcbiAqL1xyXG5mdW5jdGlvbiBhc3luY0J1Z1dvcmthcm91bmQkKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCkge1xyXG4gIGxldCAkOiBPYnNlcnZhYmxlPEZvcm1Db250cm9sU3RhdHVzIHwgbmV2ZXI+ID0gTkVWRVI7XHJcbiAgaWYgKGNvbnRyb2wuYXN5bmNWYWxpZGF0b3IgJiYgY29udHJvbC5zdGF0dXMgPT09ICdQRU5ESU5HJykge1xyXG4gICAgJCA9IHRpbWVyKDAsIDUwKS5waXBlKFxyXG4gICAgICBzd2l0Y2hNYXAoKCkgPT4gb2YoY29udHJvbC5zdGF0dXMpKSxcclxuICAgICAgZmlsdGVyKCh4KSA9PiB4ICE9PSAnUEVORElORycpLFxyXG4gICAgICB0YWtlKDEpLFxyXG4gICAgKTtcclxuICB9XHJcbiAgcmV0dXJuICQ7XHJcbn1cclxuIl19