ngx-formcontrol-errors-async
Version:
Handle your form control errors like a champ. Async is the way!!!
51 lines • 10.1 kB
JavaScript
import { Subject } from 'rxjs';
import { map, takeUntil } from 'rxjs/operators';
const OBSERVABLE_FORM_ERROR_PROPNAME = {
OBSERVABLE_STORE: '__formcontrol_observables',
OBSERVABLE_KILL_NOTIFY: '__formcontrol_observableKill',
};
export function prepareFormErrorObservables() {
return (_type) => {
((type) => {
type.prototype[OBSERVABLE_FORM_ERROR_PROPNAME.OBSERVABLE_STORE] = {};
type.prototype[OBSERVABLE_FORM_ERROR_PROPNAME.OBSERVABLE_KILL_NOTIFY] = new Subject();
type.prototype.ngOnDestroy = (function (ngOnDestroy) {
return function () {
ngOnDestroy && ngOnDestroy.call(this);
const destroyNotify = type.prototype[OBSERVABLE_FORM_ERROR_PROPNAME.OBSERVABLE_KILL_NOTIFY];
destroyNotify.next();
destroyNotify.complete();
type.prototype[OBSERVABLE_FORM_ERROR_PROPNAME.OBSERVABLE_STORE] = {};
};
})(type.prototype.ngOnDestroy);
})(_type);
};
}
export function useFormErrorObservable(instance) {
ensureClassIsDecorated(instance, Object.values(OBSERVABLE_FORM_ERROR_PROPNAME));
return (keyName, func, translations) => {
if (instance[OBSERVABLE_FORM_ERROR_PROPNAME.OBSERVABLE_STORE][keyName])
return instance[OBSERVABLE_FORM_ERROR_PROPNAME.OBSERVABLE_STORE][keyName];
return (instance[OBSERVABLE_FORM_ERROR_PROPNAME.OBSERVABLE_STORE][keyName] = createErrorObservable(func, translations).pipe(takeUntil(instance[OBSERVABLE_FORM_ERROR_PROPNAME.OBSERVABLE_KILL_NOTIFY])));
};
}
export function createErrorObservable(func, translations) {
const control = func();
return control.statusChanges.pipe(map(() => control.errors), map((x) => {
if (!x)
return null;
const [key, translateByKey] = Object.entries(translations).find(([_key]) => !!x[_key]);
return translateByKey(x[key], control);
}));
}
function ensureClassIsDecorated(instance, properties) {
const prototype = Object.getPrototypeOf(instance);
const missingDecorator = !properties.every((prop) => prop in prototype);
if (missingDecorator) {
throw new Error('this operator cannot be used inside components' +
' that are not decorated with ' +
properties.join(', ') +
' decorator');
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtZm9ybWNvbnRyb2wtZXJyb3JzLWFzeW5jL3NyYy9saWIvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMzQyxPQUFPLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRWhELE1BQU0sOEJBQThCLEdBQUc7SUFDckMsZ0JBQWdCLEVBQUUsMkJBQTJCO0lBQzdDLHNCQUFzQixFQUFFLDhCQUE4QjtDQUN2RCxDQUFDO0FBQ0YsTUFBTSxVQUFVLDJCQUEyQjtJQUN6QyxPQUFPLENBQUMsS0FBVSxFQUFFLEVBQUU7UUFDcEIsQ0FBQyxDQUFJLElBQXNCLEVBQVEsRUFBRTtZQUNuQyxJQUFJLENBQUMsU0FBUyxDQUFDLDhCQUE4QixDQUFDLGdCQUFnQixDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ3JFLElBQUksQ0FBQyxTQUFTLENBQ1osOEJBQThCLENBQUMsc0JBQXNCLENBQ3RELEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztZQUN4QixJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsR0FBRyxDQUFDLFVBQzVCLFdBQTRDO2dCQUU1QyxPQUFPO29CQUNMLFdBQVcsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUN0QyxNQUFNLGFBQWEsR0FDakIsSUFBSSxDQUFDLFNBQVMsQ0FDWiw4QkFBOEIsQ0FBQyxzQkFBc0IsQ0FDdEQsQ0FBQztvQkFDSixhQUFhLENBQUMsSUFBSSxFQUFFLENBQUM7b0JBQ3JCLGFBQWEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztvQkFDekIsSUFBSSxDQUFDLFNBQVMsQ0FBQyw4QkFBOEIsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLEVBQUUsQ0FBQztnQkFDdkUsQ0FBQyxDQUFDO1lBQ0osQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNqQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNaLENBQUMsQ0FBQztBQUNKLENBQUM7QUFDRCxNQUFNLFVBQVUsc0JBQXNCLENBQUksUUFBVztJQUNuRCxzQkFBc0IsQ0FDcEIsUUFBUSxFQUNSLE1BQU0sQ0FBQyxNQUFNLENBQUMsOEJBQThCLENBQUMsQ0FDOUMsQ0FBQztJQUNGLE9BQU8sQ0FDTCxPQUFlLEVBQ2YsSUFBMkIsRUFDM0IsWUFFQyxFQUM0QixFQUFFO1FBQy9CLElBQUksUUFBUSxDQUFDLDhCQUE4QixDQUFDLGdCQUFnQixDQUFDLENBQUMsT0FBTyxDQUFDO1lBQ3BFLE9BQU8sUUFBUSxDQUFDLDhCQUE4QixDQUFDLGdCQUFnQixDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDNUUsT0FBTyxDQUFDLFFBQVEsQ0FBQyw4QkFBOEIsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUMvRCxPQUFPLENBQ1IsR0FBRyxxQkFBcUIsQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUNoRCxTQUFTLENBQUMsUUFBUSxDQUFDLDhCQUE4QixDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FDM0UsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDO0FBQ0osQ0FBQztBQUNELE1BQU0sVUFBVSxxQkFBcUIsQ0FDbkMsSUFBMkIsRUFDM0IsWUFFQztJQUVELE1BQU0sT0FBTyxHQUFHLElBQUksRUFBRSxDQUFDO0lBQ3ZCLE9BQU8sT0FBTyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQy9CLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQ3pCLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO1FBQ1IsSUFBSSxDQUFDLENBQUM7WUFBRSxPQUFPLElBQUksQ0FBQztRQUNwQixNQUFNLENBQUMsR0FBRyxFQUFFLGNBQWMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUM3RCxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQ3RCLENBQUM7UUFDRixPQUFPLGNBQWMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDekMsQ0FBQyxDQUFDLENBQ0gsQ0FBQztBQUNKLENBQUM7QUFFRCxTQUFTLHNCQUFzQixDQUM3QixRQUEyQixFQUMzQixVQUFvQjtJQUVwQixNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2xELE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLElBQUksU0FBUyxDQUFDLENBQUM7SUFFeEUsSUFBSSxnQkFBZ0IsRUFBRTtRQUNwQixNQUFNLElBQUksS0FBSyxDQUNiLGdEQUFnRDtZQUM5QywrQkFBK0I7WUFDL0IsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDckIsWUFBWSxDQUNmLENBQUM7S0FDSDtBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyDJtUNvbXBvbmVudFR5cGUgYXMgQ29tcG9uZW50VHlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBBYnN0cmFjdENvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgbWFwLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcblxyXG5jb25zdCBPQlNFUlZBQkxFX0ZPUk1fRVJST1JfUFJPUE5BTUUgPSB7XHJcbiAgT0JTRVJWQUJMRV9TVE9SRTogJ19fZm9ybWNvbnRyb2xfb2JzZXJ2YWJsZXMnLFxyXG4gIE9CU0VSVkFCTEVfS0lMTF9OT1RJRlk6ICdfX2Zvcm1jb250cm9sX29ic2VydmFibGVLaWxsJyxcclxufTtcclxuZXhwb3J0IGZ1bmN0aW9uIHByZXBhcmVGb3JtRXJyb3JPYnNlcnZhYmxlcygpOiBDbGFzc0RlY29yYXRvciB7XHJcbiAgcmV0dXJuIChfdHlwZTogYW55KSA9PiB7XHJcbiAgICAoPFQ+KHR5cGU6IENvbXBvbmVudFR5cGU8VD4pOiB2b2lkID0+IHtcclxuICAgICAgdHlwZS5wcm90b3R5cGVbT0JTRVJWQUJMRV9GT1JNX0VSUk9SX1BST1BOQU1FLk9CU0VSVkFCTEVfU1RPUkVdID0ge307XHJcbiAgICAgIHR5cGUucHJvdG90eXBlW1xyXG4gICAgICAgIE9CU0VSVkFCTEVfRk9STV9FUlJPUl9QUk9QTkFNRS5PQlNFUlZBQkxFX0tJTExfTk9USUZZXHJcbiAgICAgIF0gPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG4gICAgICB0eXBlLnByb3RvdHlwZS5uZ09uRGVzdHJveSA9IChmdW5jdGlvbiAoXHJcbiAgICAgICAgbmdPbkRlc3Ryb3k6ICgoKSA9PiB2b2lkKSB8IG51bGwgfCB1bmRlZmluZWRcclxuICAgICAgKSB7XHJcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICh0aGlzOiBhbnkpIHtcclxuICAgICAgICAgIG5nT25EZXN0cm95ICYmIG5nT25EZXN0cm95LmNhbGwodGhpcyk7XHJcbiAgICAgICAgICBjb25zdCBkZXN0cm95Tm90aWZ5OiBTdWJqZWN0PHZvaWQ+ID1cclxuICAgICAgICAgICAgdHlwZS5wcm90b3R5cGVbXHJcbiAgICAgICAgICAgICAgT0JTRVJWQUJMRV9GT1JNX0VSUk9SX1BST1BOQU1FLk9CU0VSVkFCTEVfS0lMTF9OT1RJRllcclxuICAgICAgICAgICAgXTtcclxuICAgICAgICAgIGRlc3Ryb3lOb3RpZnkubmV4dCgpO1xyXG4gICAgICAgICAgZGVzdHJveU5vdGlmeS5jb21wbGV0ZSgpO1xyXG4gICAgICAgICAgdHlwZS5wcm90b3R5cGVbT0JTRVJWQUJMRV9GT1JNX0VSUk9SX1BST1BOQU1FLk9CU0VSVkFCTEVfU1RPUkVdID0ge307XHJcbiAgICAgICAgfTtcclxuICAgICAgfSkodHlwZS5wcm90b3R5cGUubmdPbkRlc3Ryb3kpO1xyXG4gICAgfSkoX3R5cGUpO1xyXG4gIH07XHJcbn1cclxuZXhwb3J0IGZ1bmN0aW9uIHVzZUZvcm1FcnJvck9ic2VydmFibGU8VD4oaW5zdGFuY2U6IFQpIHtcclxuICBlbnN1cmVDbGFzc0lzRGVjb3JhdGVkKFxyXG4gICAgaW5zdGFuY2UsXHJcbiAgICBPYmplY3QudmFsdWVzKE9CU0VSVkFCTEVfRk9STV9FUlJPUl9QUk9QTkFNRSlcclxuICApO1xyXG4gIHJldHVybiAoXHJcbiAgICBrZXlOYW1lOiBzdHJpbmcsXHJcbiAgICBmdW5jOiAoKSA9PiBBYnN0cmFjdENvbnRyb2wsXHJcbiAgICB0cmFuc2xhdGlvbnM6IHtcclxuICAgICAgW2tleTogc3RyaW5nXTogKGVycm9yczogYW55LCBjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpID0+IENvbnRyb2xFcnJvckJhZztcclxuICAgIH1cclxuICApOiBPYnNlcnZhYmxlPENvbnRyb2xFcnJvckJhZz4gPT4ge1xyXG4gICAgaWYgKGluc3RhbmNlW09CU0VSVkFCTEVfRk9STV9FUlJPUl9QUk9QTkFNRS5PQlNFUlZBQkxFX1NUT1JFXVtrZXlOYW1lXSlcclxuICAgICAgcmV0dXJuIGluc3RhbmNlW09CU0VSVkFCTEVfRk9STV9FUlJPUl9QUk9QTkFNRS5PQlNFUlZBQkxFX1NUT1JFXVtrZXlOYW1lXTtcclxuICAgIHJldHVybiAoaW5zdGFuY2VbT0JTRVJWQUJMRV9GT1JNX0VSUk9SX1BST1BOQU1FLk9CU0VSVkFCTEVfU1RPUkVdW1xyXG4gICAgICBrZXlOYW1lXHJcbiAgICBdID0gY3JlYXRlRXJyb3JPYnNlcnZhYmxlKGZ1bmMsIHRyYW5zbGF0aW9ucykucGlwZShcclxuICAgICAgdGFrZVVudGlsKGluc3RhbmNlW09CU0VSVkFCTEVfRk9STV9FUlJPUl9QUk9QTkFNRS5PQlNFUlZBQkxFX0tJTExfTk9USUZZXSlcclxuICAgICkpO1xyXG4gIH07XHJcbn1cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUVycm9yT2JzZXJ2YWJsZShcclxuICBmdW5jOiAoKSA9PiBBYnN0cmFjdENvbnRyb2wsXHJcbiAgdHJhbnNsYXRpb25zOiB7XHJcbiAgICBba2V5OiBzdHJpbmddOiAoZXJyb3JzOiBhbnksIGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCkgPT4gQ29udHJvbEVycm9yQmFnO1xyXG4gIH1cclxuKTogT2JzZXJ2YWJsZTxDb250cm9sRXJyb3JCYWc+IHtcclxuICBjb25zdCBjb250cm9sID0gZnVuYygpO1xyXG4gIHJldHVybiBjb250cm9sLnN0YXR1c0NoYW5nZXMucGlwZShcclxuICAgIG1hcCgoKSA9PiBjb250cm9sLmVycm9ycyksXHJcbiAgICBtYXAoKHgpID0+IHtcclxuICAgICAgaWYgKCF4KSByZXR1cm4gbnVsbDtcclxuICAgICAgY29uc3QgW2tleSwgdHJhbnNsYXRlQnlLZXldID0gT2JqZWN0LmVudHJpZXModHJhbnNsYXRpb25zKS5maW5kKFxyXG4gICAgICAgIChbX2tleV0pID0+ICEheFtfa2V5XVxyXG4gICAgICApO1xyXG4gICAgICByZXR1cm4gdHJhbnNsYXRlQnlLZXkoeFtrZXldLCBjb250cm9sKTtcclxuICAgIH0pXHJcbiAgKTtcclxufVxyXG5cclxuZnVuY3Rpb24gZW5zdXJlQ2xhc3NJc0RlY29yYXRlZChcclxuICBpbnN0YW5jZTogSW5zdGFuY2VUeXBlPGFueT4sXHJcbiAgcHJvcGVydGllczogc3RyaW5nW11cclxuKTogbmV2ZXIgfCB2b2lkIHtcclxuICBjb25zdCBwcm90b3R5cGUgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoaW5zdGFuY2UpO1xyXG4gIGNvbnN0IG1pc3NpbmdEZWNvcmF0b3IgPSAhcHJvcGVydGllcy5ldmVyeSgocHJvcCkgPT4gcHJvcCBpbiBwcm90b3R5cGUpO1xyXG5cclxuICBpZiAobWlzc2luZ0RlY29yYXRvcikge1xyXG4gICAgdGhyb3cgbmV3IEVycm9yKFxyXG4gICAgICAndGhpcyBvcGVyYXRvciBjYW5ub3QgYmUgdXNlZCBpbnNpZGUgY29tcG9uZW50cycgK1xyXG4gICAgICAgICcgdGhhdCBhcmUgbm90IGRlY29yYXRlZCB3aXRoICcgK1xyXG4gICAgICAgIHByb3BlcnRpZXMuam9pbignLCAnKSArXHJcbiAgICAgICAgJyBkZWNvcmF0b3InXHJcbiAgICApO1xyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBDb250cm9sRXJyb3JCYWcge1xyXG4gIGNvbnRlbnQ6IHN0cmluZztcclxuICBhcmdzPzoge1xyXG4gICAgW2tleTogc3RyaW5nXTogYW55O1xyXG4gIH07XHJcbn1cclxuIl19