@ng-dynamic-forms/core
Version:
A rapid form development library for Angular
93 lines • 17.1 kB
JavaScript
import { Inject, Injectable, Optional } from "@angular/core";
import { UntypedFormControl } from "@angular/forms";
import { AND_OPERATOR, DYNAMIC_MATCHERS, OR_OPERATOR } from "./dynamic-form-relation-matchers";
import { distinctUntilChanged, startWith } from "rxjs/operators";
import { merge } from "rxjs";
import { isString } from "../utils/core.utils";
import * as i0 from "@angular/core";
export class DynamicFormRelationService {
constructor(MATCHERS, injector) {
this.MATCHERS = MATCHERS;
this.injector = injector;
}
getRelatedFormControls(model, group) {
const conditionReducer = (controls, condition) => {
const path = condition.rootPath ?? condition.id;
if (isString(path) && !controls.hasOwnProperty(path)) {
const control = condition.rootPath ? group.root.get(condition.rootPath) : group.get(condition.id);
control instanceof UntypedFormControl ?
controls[path] = control : console.warn(`No related form control with id ${condition.id} could be found`);
}
return controls;
};
const relationReducer = (controls, relation) => relation.when.reduce(conditionReducer, controls);
return model.relations.reduce(relationReducer, {});
}
findRelationByMatcher(relations, matcher) {
return relations.find(relation => [matcher.match, matcher.opposingMatch].includes(relation.match));
}
matchesCondition(relation, relatedFormControls, matcher) {
const operator = relation.operator ?? OR_OPERATOR;
return relation.when.reduce((hasMatched, condition, index) => {
const path = condition.rootPath ?? condition.id;
let relatedFormControl;
for (const [key, control] of Object.entries(relatedFormControls)) {
if (key === path) {
relatedFormControl = control;
break;
}
}
if (relatedFormControl && relation.match === matcher.match) {
if (index > 0 && operator === AND_OPERATOR && !hasMatched) {
return false;
}
if (index > 0 && operator === OR_OPERATOR && hasMatched) {
return true;
}
return condition.value === relatedFormControl.value || condition.status === relatedFormControl.status;
}
if (relatedFormControl && relation.match === matcher.opposingMatch) {
if (index > 0 && operator === AND_OPERATOR && hasMatched) {
return true;
}
if (index > 0 && operator === OR_OPERATOR && !hasMatched) {
return false;
}
return !(condition.value === relatedFormControl.value || condition.status === relatedFormControl.status);
}
return false;
}, false);
}
subscribeRelations(model, group, control) {
const relatedFormControls = this.getRelatedFormControls(model, group);
const subscriptions = [];
Object.values(relatedFormControls).forEach(relatedControl => {
const valueChanges = relatedControl.valueChanges.pipe(startWith(relatedControl.value), distinctUntilChanged());
const statusChanges = relatedControl.statusChanges.pipe(startWith(relatedControl.status), distinctUntilChanged());
subscriptions.push(merge(valueChanges, statusChanges).subscribe(() => {
this.MATCHERS.forEach(matcher => {
const relation = this.findRelationByMatcher(model.relations, matcher);
if (relation !== undefined) {
const hasMatch = this.matchesCondition(relation, relatedFormControls, matcher);
matcher.onChange(hasMatch, model, control, this.injector);
}
});
}));
});
return subscriptions;
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.3", ngImport: i0, type: DynamicFormRelationService, deps: [{ token: DYNAMIC_MATCHERS, optional: true }, { token: i0.Injector }], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.3", ngImport: i0, type: DynamicFormRelationService, providedIn: "root" }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.3", ngImport: i0, type: DynamicFormRelationService, decorators: [{
type: Injectable,
args: [{
providedIn: "root"
}]
}], ctorParameters: function () { return [{ type: undefined, decorators: [{
type: Optional
}, {
type: Inject,
args: [DYNAMIC_MATCHERS]
}] }, { type: i0.Injector }]; } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy1mb3JtLXJlbGF0aW9uLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1keW5hbWljLWZvcm1zL2NvcmUvc3JjL2xpYi9zZXJ2aWNlL2R5bmFtaWMtZm9ybS1yZWxhdGlvbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFZLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN2RSxPQUFPLEVBQUUsa0JBQWtCLEVBQW9CLE1BQU0sZ0JBQWdCLENBQUM7QUFFdEUsT0FBTyxFQUNILFlBQVksRUFDWixnQkFBZ0IsRUFFaEIsV0FBVyxFQUNkLE1BQU0sa0NBQWtDLENBQUM7QUFFMUMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxLQUFLLEVBQWdCLE1BQU0sTUFBTSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7QUFPL0MsTUFBTSxPQUFPLDBCQUEwQjtJQUVuQyxZQUEwRCxRQUFxQyxFQUFVLFFBQWtCO1FBQWpFLGFBQVEsR0FBUixRQUFRLENBQTZCO1FBQVUsYUFBUSxHQUFSLFFBQVEsQ0FBVTtJQUMzSCxDQUFDO0lBRUQsc0JBQXNCLENBQUMsS0FBOEIsRUFBRSxLQUF1QjtRQUMxRSxNQUFNLGdCQUFnQixHQUFHLENBQUMsUUFBb0MsRUFBRSxTQUFzQyxFQUFFLEVBQUU7WUFDdEcsTUFBTSxJQUFJLEdBQUcsU0FBUyxDQUFDLFFBQVEsSUFBSSxTQUFTLENBQUMsRUFBRSxDQUFDO1lBRWhELElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDbEQsTUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FB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QUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO3FCQUM3RDtnQkFDTCxDQUFDLENBQUMsQ0FBQztZQUNQLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDUixDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sYUFBYSxDQUFDO0lBQ3pCLENBQUM7OEdBL0ZRLDBCQUEwQixrQkFFSCxnQkFBZ0I7a0hBRnZDLDBCQUEwQixjQUZ2QixNQUFNOzsyRkFFVCwwQkFBMEI7a0JBSHRDLFVBQVU7bUJBQUM7b0JBQ1IsVUFBVSxFQUFFLE1BQU07aUJBQ3JCOzswQkFHZ0IsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxnQkFBZ0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUsIEluamVjdG9yLCBPcHRpb25hbCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBVbnR5cGVkRm9ybUNvbnRyb2wsIFVudHlwZWRGb3JtR3JvdXAgfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcbmltcG9ydCB7IER5bmFtaWNGb3JtQ29udHJvbE1vZGVsIH0gZnJvbSBcIi4uL21vZGVsL2R5bmFtaWMtZm9ybS1jb250cm9sLm1vZGVsXCI7XG5pbXBvcnQge1xuICAgIEFORF9PUEVSQVRPUixcbiAgICBEWU5BTUlDX01BVENIRVJTLFxuICAgIER5bmFtaWNGb3JtQ29udHJvbE1hdGNoZXIsXG4gICAgT1JfT1BFUkFUT1Jcbn0gZnJvbSBcIi4vZHluYW1pYy1mb3JtLXJlbGF0aW9uLW1hdGNoZXJzXCI7XG5pbXBvcnQgeyBEeW5hbWljRm9ybUNvbnRyb2xDb25kaXRpb24sIER5bmFtaWNGb3JtQ29udHJvbFJlbGF0aW9uIH0gZnJvbSBcIi4uL21vZGVsL21pc2MvZHluYW1pYy1mb3JtLWNvbnRyb2wtcmVsYXRpb24ubW9kZWxcIjtcbmltcG9ydCB7IGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBzdGFydFdpdGggfSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcbmltcG9ydCB7IG1lcmdlLCBTdWJzY3JpcHRpb24gfSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHsgaXNTdHJpbmcgfSBmcm9tIFwiLi4vdXRpbHMvY29yZS51dGlsc1wiO1xuXG5leHBvcnQgdHlwZSBEeW5hbWljUmVsYXRlZEZvcm1Db250cm9scyA9IHsgW3BhdGg6IHN0cmluZ106IFVudHlwZWRGb3JtQ29udHJvbCB9O1xuXG5ASW5qZWN0YWJsZSh7XG4gICAgcHJvdmlkZWRJbjogXCJyb290XCJcbn0pXG5leHBvcnQgY2xhc3MgRHluYW1pY0Zvcm1SZWxhdGlvblNlcnZpY2Uge1xuXG4gICAgY29uc3RydWN0b3IoQE9wdGlvbmFsKCkgQEluamVjdChEWU5BTUlDX01BVENIRVJTKSBwcml2YXRlIE1BVENIRVJTOiBEeW5hbWljRm9ybUNvbnRyb2xNYXRjaGVyW10sIHByaXZhdGUgaW5qZWN0b3I6IEluamVjdG9yKSB7XG4gICAgfVxuXG4gICAgZ2V0UmVsYXRlZEZvcm1Db250cm9scyhtb2RlbDogRHluYW1pY0Zvcm1Db250cm9sTW9kZWwsIGdyb3VwOiBVbnR5cGVkRm9ybUdyb3VwKTogRHluYW1pY1JlbGF0ZWRGb3JtQ29udHJvbHMge1xuICAgICAgICBjb25zdCBjb25kaXRpb25SZWR1Y2VyID0gKGNvbnRyb2xzOiBEeW5hbWljUmVsYXRlZEZvcm1Db250cm9scywgY29uZGl0aW9uOiBEeW5hbWljRm9ybUNvbnRyb2xDb25kaXRpb24pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHBhdGggPSBjb25kaXRpb24ucm9vdFBhdGggPz8gY29uZGl0aW9uLmlkO1xuXG4gICAgICAgICAgICBpZiAoaXNTdHJpbmcocGF0aCkgJiYgIWNvbnRyb2xzLmhhc093blByb3BlcnR5KHBhdGgpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29udHJvbCA9IGNvbmRpdGlvbi5yb290UGF0aCA/IGdyb3VwLnJvb3QuZ2V0KGNvbmRpdGlvbi5yb290UGF0aCkgOiBncm91cC5nZXQoY29uZGl0aW9uLmlkISk7XG4gICAgICAgICAgICAgICAgY29udHJvbCBpbnN0YW5jZW9mIFVudHlwZWRGb3JtQ29udHJvbCA/XG4gICAgICAgICAgICAgICAgICAgIGNvbnRyb2xzW3BhdGhdID0gY29udHJvbCA6IGNvbnNvbGUud2FybihgTm8gcmVsYXRlZCBmb3JtIGNvbnRyb2wgd2l0aCBpZCAke2NvbmRpdGlvbi5pZH0gY291bGQgYmUgZm91bmRgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGNvbnRyb2xzO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IHJlbGF0aW9uUmVkdWNlciA9IChjb250cm9sczogRHluYW1pY1JlbGF0ZWRGb3JtQ29udHJvbHMsIHJlbGF0aW9uOiBEeW5hbWljRm9ybUNvbnRyb2xSZWxhdGlvbikgPT5cbiAgICAgICAgICAgIHJlbGF0aW9uLndoZW4ucmVkdWNlKGNvbmRpdGlvblJlZHVjZXIsIGNvbnRyb2xzKTtcblxuICAgICAgICByZXR1cm4gbW9kZWwucmVsYXRpb25zLnJlZHVjZShyZWxhdGlvblJlZHVjZXIsIHt9KTtcbiAgICB9XG5cbiAgICBmaW5kUmVsYXRpb25CeU1hdGNoZXIocmVsYXRpb25zOiBEeW5hbWljRm9ybUNvbnRyb2xSZWxhdGlvbltdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVyOiBEeW5hbWljRm9ybUNvbnRyb2xNYXRjaGVyKTogRHluYW1pY0Zvcm1Db250cm9sUmVsYXRpb24gfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gcmVsYXRpb25zLmZpbmQocmVsYXRpb24gPT4gW21hdGNoZXIubWF0Y2gsIG1hdGNoZXIub3Bwb3NpbmdNYXRjaF0uaW5jbHVkZXMocmVsYXRpb24ubWF0Y2gpKTtcbiAgICB9XG5cbiAgICBtYXRjaGVzQ29uZGl0aW9uKHJlbGF0aW9uOiBEeW5hbWljRm9ybUNvbnRyb2xSZWxhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgIHJlbGF0ZWRGb3JtQ29udHJvbHM6IER5bmFtaWNSZWxhdGVkRm9ybUNvbnRyb2xzLFxuICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlcjogRHluYW1pY0Zvcm1Db250cm9sTWF0Y2hlcik6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBvcGVyYXRvciA9IHJlbGF0aW9uLm9wZXJhdG9yID8/IE9SX09QRVJBVE9SO1xuXG4gICAgICAgIHJldHVybiByZWxhdGlvbi53aGVuLnJlZHVjZTxib29sZWFuPigoaGFzTWF0Y2hlZCwgY29uZGl0aW9uLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcGF0aCA9IGNvbmRpdGlvbi5yb290UGF0aCA/PyBjb25kaXRpb24uaWQ7XG4gICAgICAgICAgICBsZXQgcmVsYXRlZEZvcm1Db250cm9sO1xuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIGNvbnRyb2xdIG9mIE9iamVjdC5lbnRyaWVzKHJlbGF0ZWRGb3JtQ29udHJvbHMpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGtleSA9PT0gcGF0aCkge1xuICAgICAgICAgICAgICAgICAgICByZWxhdGVkRm9ybUNvbnRyb2wgPSBjb250cm9sO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChyZWxhdGVkRm9ybUNvbnRyb2wgJiYgcmVsYXRpb24ubWF0Y2ggPT09IG1hdGNoZXIubWF0Y2gpIHtcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggPiAwICYmIG9wZXJhdG9yID09PSBBTkRfT1BFUkFUT1IgJiYgIWhhc01hdGNoZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChpbmRleCA+IDAgJiYgb3BlcmF0b3IgPT09IE9SX09QRVJBVE9SICYmIGhhc01hdGNoZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbmRpdGlvbi52YWx1ZSA9PT0gcmVsYXRlZEZvcm1Db250cm9sLnZhbHVlIHx8IGNvbmRpdGlvbi5zdGF0dXMgPT09IHJlbGF0ZWRGb3JtQ29udHJvbC5zdGF0dXM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChyZWxhdGVkRm9ybUNvbnRyb2wgJiYgcmVsYXRpb24ubWF0Y2ggPT09IG1hdGNoZXIub3Bwb3NpbmdNYXRjaCkge1xuICAgICAgICAgICAgICAgIGlmIChpbmRleCA+IDAgJiYgb3BlcmF0b3IgPT09IEFORF9PUEVSQVRPUiAmJiBoYXNNYXRjaGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChpbmRleCA+IDAgJiYgb3BlcmF0b3IgPT09IE9SX09QRVJBVE9SICYmICFoYXNNYXRjaGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gIShjb25kaXRpb24udmFsdWUgPT09IHJlbGF0ZWRGb3JtQ29udHJvbC52YWx1ZSB8fCBjb25kaXRpb24uc3RhdHVzID09PSByZWxhdGVkRm9ybUNvbnRyb2wuc3RhdHVzKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIH0sIGZhbHNlKTtcbiAgICB9XG5cbiAgICBzdWJzY3JpYmVSZWxhdGlvbnMobW9kZWw6IER5bmFtaWNGb3JtQ29udHJvbE1vZGVsLCBncm91cDogVW50eXBlZEZvcm1Hcm91cCwgY29udHJvbDogVW50eXBlZEZvcm1Db250cm9sKTogU3Vic2NyaXB0aW9uW10ge1xuICAgICAgICBjb25zdCByZWxhdGVkRm9ybUNvbnRyb2xzID0gdGhpcy5nZXRSZWxhdGVkRm9ybUNvbnRyb2xzKG1vZGVsLCBncm91cCk7XG4gICAgICAgIGNvbnN0IHN1YnNjcmlwdGlvbnM6IFN1YnNjcmlwdGlvbltdID0gW107XG5cbiAgICAgICAgT2JqZWN0LnZhbHVlcyhyZWxhdGVkRm9ybUNvbnRyb2xzKS5mb3JFYWNoKHJlbGF0ZWRDb250cm9sID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlQ2hhbmdlcyA9IHJlbGF0ZWRDb250cm9sLnZhbHVlQ2hhbmdlcy5waXBlKHN0YXJ0V2l0aChyZWxhdGVkQ29udHJvbC52YWx1ZSksIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkpO1xuICAgICAgICAgICAgY29uc3Qgc3RhdHVzQ2hhbmdlcyA9IHJlbGF0ZWRDb250cm9sLnN0YXR1c0NoYW5nZXMucGlwZShzdGFydFdpdGgocmVsYXRlZENvbnRyb2wuc3RhdHVzKSwgZGlzdGluY3RVbnRpbENoYW5nZWQoKSk7XG5cbiAgICAgICAgICAgIHN1YnNjcmlwdGlvbnMucHVzaChtZXJnZSh2YWx1ZUNoYW5nZXMsIHN0YXR1c0NoYW5nZXMpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5NQVRDSEVSUy5mb3JFYWNoKG1hdGNoZXIgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZWxhdGlvbiA9IHRoaXMuZmluZFJlbGF0aW9uQnlNYXRjaGVyKG1vZGVsLnJlbGF0aW9ucywgbWF0Y2hlcik7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlbGF0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhhc01hdGNoID0gdGhpcy5tYXRjaGVzQ29uZGl0aW9uKHJlbGF0aW9uLCByZWxhdGVkRm9ybUNvbnRyb2xzLCBtYXRjaGVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZXIub25DaGFuZ2UoaGFzTWF0Y2gsIG1vZGVsLCBjb250cm9sLCB0aGlzLmluamVjdG9yKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gc3Vic2NyaXB0aW9ucztcbiAgICB9XG59XG4iXX0=