ngx-forms-typed
Version:
Angular Forms Typed provides types and helper functions fully compatible with original Angular forms
97 lines • 13.4 kB
JavaScript
import { Validators } from '@angular/forms';
/**
* Does an aggregate action on a form's controls.
*
* @param form the form to whose controls we want to influence
*
* For example we want to call `markAsTouched` on each control in a form, for visualizing validation purposes.
* @example
* const form = new FormGroup({name: ..., email: ..., address: ..., ...});
*
* forEachControlIn(form).call('markAsTouched') - will iterate over all controls and call that method
*/
export function forEachControlIn(form) {
const controls = form != null && form.controls != null
? Array.isArray(form.controls)
? form.controls
: Object.getOwnPropertyNames(form.controls).map(name => form.controls[name])
: [];
const composer = {
/**
* Enumerate which methods to call.
* @param methods which methods to call - as typed string enum
*
* @example
*
* forEachControlIn(form).call('markAsPristine', 'markAsTouched', 'disable')
*/
call(...methods) {
if (controls != null && Array.isArray(controls)) {
controls.forEach(c => {
methods.forEach(m => {
if (c[m] && typeof c[m] === 'function') {
c[m]();
}
});
// catch the case where we have a control that is form array/group - so for each of the children call methods
if (c.controls != null) {
forEachControlIn(c).call(...methods);
}
});
}
return composer;
},
markAsDirtySimultaneouslyWith(c) {
if (c != null) {
const markAsDirtyOriginal = c.markAsDirty.bind(c);
c.markAsDirty = () => {
markAsDirtyOriginal();
composer.call('markAsDirty');
};
const markAsPristineOriginal = c.markAsPristine.bind(c);
c.markAsPristine = () => {
markAsPristineOriginal();
composer.call('markAsPristine');
};
}
return composer;
},
markAsTouchedSimultaneouslyWith(c, touchIsChildInitiated) {
if (c != null) {
const markAsTouchedOriginal = c.markAsTouched.bind(c);
c.markAsTouched = () => {
markAsTouchedOriginal();
if (!touchIsChildInitiated || !touchIsChildInitiated()) {
composer.call('markAsTouched');
}
};
const markAsUntouchedOriginal = c.markAsUntouched.bind(c);
c.markAsUntouched = () => {
markAsUntouchedOriginal();
composer.call('markAsUntouched');
};
}
return composer;
},
/**
* Get the errors in the controls from our form and append their errors to the `form` (in forEachControlIn(form) form)
* @param parentControl the control that should be invalid if on of our controls is
*/
addValidatorsTo(parentControl) {
if (parentControl != null) {
parentControl.validator = Validators.compose([
parentControl.validator,
() => {
// could overwrite some errors - but we only need it to communicate to the "parent" form that
// these controls here are valid or not
const errors = controls.reduce((e, next) => ({ ...e, ...next.errors }), {});
return controls.some(c => c.errors != null) ? errors : null;
}
]);
}
return composer;
}
};
return composer;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybXMtdXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2Zvcm1zL3NyYy9saWIvZm9ybXMtdXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQTZFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBbUJ2SDs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBTSxVQUFVLGdCQUFnQixDQUFDLElBQXlDO0lBQ3hFLE1BQU0sUUFBUSxHQUNaLElBQUksSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJO1FBQ25DLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7WUFDNUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRO1lBQ2YsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUUsSUFBc0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDakcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUVULE1BQU0sUUFBUSxHQUFHO1FBQ2Y7Ozs7Ozs7V0FPRztRQUNILElBQUksQ0FBQyxHQUFHLE9BQWtCO1lBQ3hCLElBQUksUUFBUSxJQUFJLElBQUksSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFO2dCQUMvQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO29CQUNuQixPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO3dCQUNsQixJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxVQUFVLEVBQUU7NEJBQ3JDLENBQUMsQ0FBQyxDQUFDLENBQVMsRUFBRSxDQUFDO3lCQUNqQjtvQkFDSCxDQUFDLENBQUMsQ0FBQztvQkFF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eSwgRm9ybUdyb3VwLCBVbnR5cGVkRm9ybUFycmF5LCBVbnR5cGVkRm9ybUdyb3VwLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBUeXBlZEZvcm1Hcm91cCwgVHlwZWRGb3JtQXJyYXkgfSBmcm9tICcuL2Zvcm1zLXR5cGVkJztcclxuXHJcbmV4cG9ydCB0eXBlIE1ldGhvZHMgPSBrZXlvZiBQaWNrPFxyXG4gIEFic3RyYWN0Q29udHJvbCxcclxuICB8ICdtYXJrQXNEaXJ0eSdcclxuICB8ICdtYXJrQXNUb3VjaGVkJ1xyXG4gIHwgJ3VwZGF0ZVZhbHVlQW5kVmFsaWRpdHknXHJcbiAgfCAnZGlzYWJsZSdcclxuICB8ICdlbmFibGUnXHJcbiAgfCAnbWFya0FzVW50b3VjaGVkJ1xyXG4gIHwgJ21hcmtBc1ByaXN0aW5lJ1xyXG4gIHwgJ21hcmtBc1BlbmRpbmcnXHJcbj47XHJcblxyXG5pbnRlcmZhY2UgRm9ybUdyb3VwTGlrZSB7XHJcbiAgY29udHJvbHM6IHsgW2tleTogc3RyaW5nXTogQWJzdHJhY3RDb250cm9sIH07XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBEb2VzIGFuIGFnZ3JlZ2F0ZSBhY3Rpb24gb24gYSBmb3JtJ3MgY29udHJvbHMuXHJcbiAqXHJcbiAqIEBwYXJhbSBmb3JtIHRoZSBmb3JtIHRvIHdob3NlIGNvbnRyb2xzIHdlIHdhbnQgdG8gaW5mbHVlbmNlXHJcbiAqXHJcbiAqIEZvciBleGFtcGxlIHdlIHdhbnQgdG8gY2FsbCBgbWFya0FzVG91Y2hlZGAgb24gZWFjaCBjb250cm9sIGluIGEgZm9ybSwgZm9yIHZpc3VhbGl6aW5nIHZhbGlkYXRpb24gcHVycG9zZXMuXHJcbiAqIEBleGFtcGxlXHJcbiAqIGNvbnN0IGZvcm0gPSBuZXcgRm9ybUdyb3VwKHtuYW1lOiAuLi4sIGVtYWlsOiAuLi4sIGFkZHJlc3M6IC4uLiwgLi4ufSk7XHJcbiAqXHJcbiAqIGZvckVhY2hDb250cm9sSW4oZm9ybSkuY2FsbCgnbWFya0FzVG91Y2hlZCcpIC0gd2lsbCBpdGVyYXRlIG92ZXIgYWxsIGNvbnRyb2xzIGFuZCBjYWxsIHRoYXQgbWV0aG9kXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZm9yRWFjaENvbnRyb2xJbihmb3JtOiBVbnR5cGVkRm9ybUdyb3VwIHwgVW50eXBlZEZvcm1BcnJheSkge1xyXG4gIGNvbnN0IGNvbnRyb2xzOiBBYnN0cmFjdENvbnRyb2xbXSA9XHJcbiAgICBmb3JtICE9IG51bGwgJiYgZm9ybS5jb250cm9scyAhPSBudWxsXHJcbiAgICAgID8gQXJyYXkuaXNBcnJheShmb3JtLmNvbnRyb2xzKVxyXG4gICAgICAgID8gZm9ybS5jb250cm9sc1xyXG4gICAgICAgIDogT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZm9ybS5jb250cm9scykubWFwKG5hbWUgPT4gKGZvcm0gYXMgRm9ybUdyb3VwTGlrZSkuY29udHJvbHNbbmFtZV0pXHJcbiAgICAgIDogW107XHJcblxyXG4gIGNvbnN0IGNvbXBvc2VyID0ge1xyXG4gICAgLyoqXHJcbiAgICAgKiBFbnVtZXJhdGUgd2hpY2ggbWV0aG9kcyB0byBjYWxsLlxyXG4gICAgICogQHBhcmFtIG1ldGhvZHMgd2hpY2ggbWV0aG9kcyB0byBjYWxsIC0gYXMgdHlwZWQgc3RyaW5nIGVudW1cclxuICAgICAqXHJcbiAgICAgKiBAZXhhbXBsZVxyXG4gICAgICpcclxuICAgICAqIGZvckVhY2hDb250cm9sSW4oZm9ybSkuY2FsbCgnbWFya0FzUHJpc3RpbmUnLCAnbWFya0FzVG91Y2hlZCcsICdkaXNhYmxlJylcclxuICAgICAqL1xyXG4gICAgY2FsbCguLi5tZXRob2RzOiBNZXRob2RzW10pIHtcclxuICAgICAgaWYgKGNvbnRyb2xzICE9IG51bGwgJiYgQXJyYXkuaXNBcnJheShjb250cm9scykpIHtcclxuICAgICAgICBjb250cm9scy5mb3JFYWNoKGMgPT4ge1xyXG4gICAgICAgICAgbWV0aG9kcy5mb3JFYWNoKG0gPT4ge1xyXG4gICAgICAgICAgICBpZiAoY1ttXSAmJiB0eXBlb2YgY1ttXSA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICAgIChjW21dIGFzIGFueSkoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgLy8gY2F0Y2ggdGhlIGNhc2Ugd2hlcmUgd2UgaGF2ZSBhIGNvbnRyb2wgdGhhdCBpcyBmb3JtIGFycmF5L2dyb3VwIC0gc28gZm9yIGVhY2ggb2YgdGhlIGNoaWxkcmVuIGNhbGwgbWV0aG9kc1xyXG4gICAgICAgICAgaWYgKChjIGFzIGFueSkuY29udHJvbHMgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBmb3JFYWNoQ29udHJvbEluKGMgYXMgRm9ybUFycmF5IHwgRm9ybUdyb3VwIHwgVHlwZWRGb3JtR3JvdXA8YW55PiB8IFR5cGVkRm9ybUFycmF5PGFueT4pLmNhbGwoLi4ubWV0aG9kcyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGNvbXBvc2VyO1xyXG4gICAgfSxcclxuICAgIG1hcmtBc0RpcnR5U2ltdWx0YW5lb3VzbHlXaXRoKGM6IEFic3RyYWN0Q29udHJvbCkge1xyXG4gICAgICBpZiAoYyAhPSBudWxsKSB7XHJcbiAgICAgICAgY29uc3QgbWFya0FzRGlydHlPcmlnaW5hbCA9IGMubWFya0FzRGlydHkuYmluZChjKTtcclxuICAgICAgICBjLm1hcmtBc0RpcnR5ID0gKCkgPT4ge1xyXG4gICAgICAgICAgbWFya0FzRGlydHlPcmlnaW5hbCgpO1xyXG4gICAgICAgICAgY29tcG9zZXIuY2FsbCgnbWFya0FzRGlydHknKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIGNvbnN0IG1hcmtBc1ByaXN0aW5lT3JpZ2luYWwgPSBjLm1hcmtBc1ByaXN0aW5lLmJpbmQoYyk7XHJcbiAgICAgICAgYy5tYXJrQXNQcmlzdGluZSA9ICgpID0+IHtcclxuICAgICAgICAgIG1hcmtBc1ByaXN0aW5lT3JpZ2luYWwoKTtcclxuICAgICAgICAgIGNvbXBvc2VyLmNhbGwoJ21hcmtBc1ByaXN0aW5lJyk7XHJcbiAgICAgICAgfTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gY29tcG9zZXI7XHJcbiAgICB9LFxyXG4gICAgbWFya0FzVG91Y2hlZFNpbXVsdGFuZW91c2x5V2l0aChjOiBBYnN0cmFjdENvbnRyb2wsIHRvdWNoSXNDaGlsZEluaXRpYXRlZD86ICgpID0+IGJvb2xlYW4pIHtcclxuICAgICAgaWYgKGMgIT0gbnVsbCkge1xyXG4gICAgICAgIGNvbnN0IG1hcmtBc1RvdWNoZWRPcmlnaW5hbCA9IGMubWFya0FzVG91Y2hlZC5iaW5kKGMpO1xyXG4gICAgICAgIGMubWFya0FzVG91Y2hlZCA9ICgpID0+IHtcclxuICAgICAgICAgIG1hcmtBc1RvdWNoZWRPcmlnaW5hbCgpO1xyXG4gICAgICAgICAgaWYgKCF0b3VjaElzQ2hpbGRJbml0aWF0ZWQgfHwgIXRvdWNoSXNDaGlsZEluaXRpYXRlZCgpKSB7XHJcbiAgICAgICAgICAgIGNvbXBvc2VyLmNhbGwoJ21hcmtBc1RvdWNoZWQnKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgICAgIGNvbnN0IG1hcmtBc1VudG91Y2hlZE9yaWdpbmFsID0gYy5tYXJrQXNVbnRvdWNoZWQuYmluZChjKTtcclxuICAgICAgICBjLm1hcmtBc1VudG91Y2hlZCA9ICgpID0+IHtcclxuICAgICAgICAgIG1hcmtBc1VudG91Y2hlZE9yaWdpbmFsKCk7XHJcbiAgICAgICAgICBjb21wb3Nlci5jYWxsKCdtYXJrQXNVbnRvdWNoZWQnKTtcclxuICAgICAgICB9O1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBjb21wb3NlcjtcclxuICAgIH0sXHJcbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgZXJyb3JzIGluIHRoZSBjb250cm9scyBmcm9tIG91ciBmb3JtIGFuZCBhcHBlbmQgdGhlaXIgZXJyb3JzIHRvIHRoZSBgZm9ybWAgKGluIGZvckVhY2hDb250cm9sSW4oZm9ybSkgZm9ybSlcclxuICAgICAqIEBwYXJhbSBwYXJlbnRDb250cm9sIHRoZSBjb250cm9sIHRoYXQgc2hvdWxkIGJlIGludmFsaWQgaWYgb24gb2Ygb3VyIGNvbnRyb2xzIGlzXHJcbiAgICAgKi9cclxuICAgIGFkZFZhbGlkYXRvcnNUbyhwYXJlbnRDb250cm9sOiBBYnN0cmFjdENvbnRyb2wpIHtcclxuICAgICAgaWYgKHBhcmVudENvbnRyb2wgIT0gbnVsbCkge1xyXG4gICAgICAgIHBhcmVudENvbnRyb2wudmFsaWRhdG9yID0gVmFsaWRhdG9ycy5jb21wb3NlKFtcclxuICAgICAgICAgIHBhcmVudENvbnRyb2wudmFsaWRhdG9yLFxyXG4gICAgICAgICAgKCkgPT4ge1xyXG4gICAgICAgICAgICAvLyBjb3VsZCBvdmVyd3JpdGUgc29tZSBlcnJvcnMgLSBidXQgd2Ugb25seSBuZWVkIGl0IHRvIGNvbW11bmljYXRlIHRvIHRoZSBcInBhcmVudFwiIGZvcm0gdGhhdFxyXG4gICAgICAgICAgICAvLyB0aGVzZSBjb250cm9scyBoZXJlIGFyZSB2YWxpZCBvciBub3RcclxuICAgICAgICAgICAgY29uc3QgZXJyb3JzID0gY29udHJvbHMucmVkdWNlKChlLCBuZXh0KSA9PiAoeyAuLi5lLCAuLi5uZXh0LmVycm9ycyB9KSwge30pO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIGNvbnRyb2xzLnNvbWUoYyA9PiBjLmVycm9ycyAhPSBudWxsKSA/IGVycm9ycyA6IG51bGw7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgXSk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGNvbXBvc2VyO1xyXG4gICAgfVxyXG4gIH07XHJcblxyXG4gIHJldHVybiBjb21wb3NlcjtcclxufVxyXG4iXX0=