@olafvv/ngx-dynamic-form 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +55 -0
- package/esm2022/lib/components/dynamic-form/dynamic-form.component.mjs +59 -0
- package/esm2022/lib/components/dynamic-form-field/dynamic-form-field.component.mjs +129 -0
- package/esm2022/lib/controls/button/dynamic-button.component.mjs +22 -0
- package/esm2022/lib/controls/button/dynamic-button.model.mjs +12 -0
- package/esm2022/lib/controls/checkbox/dynamic-checkbox.component.mjs +32 -0
- package/esm2022/lib/controls/checkbox/dynamic-checkbox.model.mjs +21 -0
- package/esm2022/lib/controls/index.mjs +7 -0
- package/esm2022/lib/controls/input/dynamic-input.component.mjs +51 -0
- package/esm2022/lib/controls/input/dynamic-input.model.mjs +18 -0
- package/esm2022/lib/controls/readonly/dynamic-readonly.component.mjs +18 -0
- package/esm2022/lib/controls/readonly/dynamic-readonly.model.mjs +9 -0
- package/esm2022/lib/controls/select/dynamic-select.component.mjs +42 -0
- package/esm2022/lib/controls/select/dynamic-select.model.mjs +11 -0
- package/esm2022/lib/controls/textarea/dynamic-textarea.component.mjs +45 -0
- package/esm2022/lib/controls/textarea/dynamic-textarea.model.mjs +15 -0
- package/esm2022/lib/models/classes/dynamic-form-field-base-component.mjs +34 -0
- package/esm2022/lib/models/classes/dynamic-form-field-model.mjs +24 -0
- package/esm2022/lib/models/classes/dynamic-form-field-option-model.mjs +48 -0
- package/esm2022/lib/models/classes/dynamic-form-field-value-model.mjs +24 -0
- package/esm2022/lib/models/classes/dynamic-form-validators.mjs +73 -0
- package/esm2022/lib/models/constants/dynamic-relations.const.mjs +47 -0
- package/esm2022/lib/models/index.mjs +11 -0
- package/esm2022/lib/models/interfaces/dynamic-form-field-config.interface.mjs +2 -0
- package/esm2022/lib/models/interfaces/dynamic-form-validator.interface.mjs +2 -0
- package/esm2022/lib/models/tokens/dynamic-form-field-map-fn.token.mjs +3 -0
- package/esm2022/lib/models/types/dynamic-form-config.type.mjs +2 -0
- package/esm2022/lib/models/types/dynamic-form-hook.type.mjs +2 -0
- package/esm2022/lib/models/types/related-form-controls.type.mjs +2 -0
- package/esm2022/lib/services/dynamic-form-relations.service.mjs +103 -0
- package/esm2022/lib/services/dynamic-form.service.mjs +77 -0
- package/esm2022/lib/services/dynamic-validations.service.mjs +37 -0
- package/esm2022/olafvv-ngx-dynamic-form.mjs +5 -0
- package/esm2022/public-api.mjs +8 -0
- package/fesm2022/olafvv-ngx-dynamic-form.mjs +873 -0
- package/fesm2022/olafvv-ngx-dynamic-form.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/components/dynamic-form/dynamic-form.component.d.ts +32 -0
- package/lib/components/dynamic-form-field/dynamic-form-field.component.d.ts +44 -0
- package/lib/controls/button/dynamic-button.component.d.ts +11 -0
- package/lib/controls/button/dynamic-button.model.d.ts +15 -0
- package/lib/controls/checkbox/dynamic-checkbox.component.d.ts +15 -0
- package/lib/controls/checkbox/dynamic-checkbox.model.d.ts +15 -0
- package/lib/controls/index.d.ts +6 -0
- package/lib/controls/input/dynamic-input.component.d.ts +19 -0
- package/lib/controls/input/dynamic-input.model.d.ts +27 -0
- package/lib/controls/readonly/dynamic-readonly.component.d.ts +10 -0
- package/lib/controls/readonly/dynamic-readonly.model.d.ts +9 -0
- package/lib/controls/select/dynamic-select.component.d.ts +16 -0
- package/lib/controls/select/dynamic-select.model.d.ts +12 -0
- package/lib/controls/textarea/dynamic-textarea.component.d.ts +18 -0
- package/lib/controls/textarea/dynamic-textarea.model.d.ts +21 -0
- package/lib/models/classes/dynamic-form-field-base-component.d.ts +26 -0
- package/lib/models/classes/dynamic-form-field-model.d.ts +22 -0
- package/lib/models/classes/dynamic-form-field-option-model.d.ts +41 -0
- package/lib/models/classes/dynamic-form-field-value-model.d.ts +18 -0
- package/lib/models/classes/dynamic-form-validators.d.ts +48 -0
- package/lib/models/constants/dynamic-relations.const.d.ts +30 -0
- package/lib/models/index.d.ts +10 -0
- package/lib/models/interfaces/dynamic-form-field-config.interface.d.ts +60 -0
- package/lib/models/interfaces/dynamic-form-validator.interface.d.ts +6 -0
- package/lib/models/tokens/dynamic-form-field-map-fn.token.d.ts +2 -0
- package/lib/models/types/dynamic-form-config.type.d.ts +2 -0
- package/lib/models/types/dynamic-form-hook.type.d.ts +1 -0
- package/lib/models/types/related-form-controls.type.d.ts +4 -0
- package/lib/services/dynamic-form-relations.service.d.ts +26 -0
- package/lib/services/dynamic-form.service.d.ts +42 -0
- package/lib/services/dynamic-validations.service.d.ts +20 -0
- package/package.json +28 -0
- package/public-api.d.ts +4 -0
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { inject, Injectable, Injector } from '@angular/core';
|
|
2
|
+
import { distinctUntilChanged, startWith } from 'rxjs';
|
|
3
|
+
import { RELATION_ACTIONS, RelationOperator } from '../models/constants/dynamic-relations.const';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
export class DynamicFormRelationsService {
|
|
6
|
+
constructor() {
|
|
7
|
+
this._injector = inject(Injector);
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Get an object with all FormField the provided model has a relation with
|
|
11
|
+
* @param model
|
|
12
|
+
* @param group
|
|
13
|
+
* @returns
|
|
14
|
+
*/
|
|
15
|
+
findRelatedFormField(model, group) {
|
|
16
|
+
const conditionReducer = (controls, condition) => {
|
|
17
|
+
const control = group.get(condition.fieldName);
|
|
18
|
+
if (!control) {
|
|
19
|
+
console.warn(`No related form control with the name ${condition.fieldName} found`);
|
|
20
|
+
return controls;
|
|
21
|
+
}
|
|
22
|
+
controls[condition.fieldName] = control;
|
|
23
|
+
return controls;
|
|
24
|
+
};
|
|
25
|
+
const relationsReducer = (controls, relation) => {
|
|
26
|
+
return relation.conditions.reduce(conditionReducer, controls);
|
|
27
|
+
};
|
|
28
|
+
return model.relations.reduce(relationsReducer, {});
|
|
29
|
+
}
|
|
30
|
+
getRelationSubscriptions(relatedFormControls, model, control) {
|
|
31
|
+
const subs = [];
|
|
32
|
+
// Subscribe to value changes of all FormControls, provide the current value inside the startWith
|
|
33
|
+
Object.values(relatedFormControls).forEach((relatedControl) => {
|
|
34
|
+
subs.push(relatedControl.valueChanges.pipe(startWith(relatedControl.value), distinctUntilChanged()).subscribe(() => {
|
|
35
|
+
model.relations.forEach((relation) => {
|
|
36
|
+
// Find the RelationAction object based on the actionType passed inside the DynamicFormConfig
|
|
37
|
+
const action = RELATION_ACTIONS.find((action) => relation.actionType === action.type || relation.actionType === action.reversedType);
|
|
38
|
+
if (action) {
|
|
39
|
+
const shouldTrigger = this.checkRelationCondition(relation, relatedFormControls, action);
|
|
40
|
+
action.change(shouldTrigger, model, control, this._injector);
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
}));
|
|
44
|
+
});
|
|
45
|
+
return subs;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Check the conditions inside the relations
|
|
49
|
+
* @param relation
|
|
50
|
+
* @param relatedControl
|
|
51
|
+
* @param action
|
|
52
|
+
* @returns
|
|
53
|
+
*/
|
|
54
|
+
checkRelationCondition(relation, relatedControls, action) {
|
|
55
|
+
// Default operator is AND, meaning all conditions should return true before the provided action is triggered.
|
|
56
|
+
// In the case of a reversed type, the return value whould be false.
|
|
57
|
+
const operator = relation.operator ?? RelationOperator.AND;
|
|
58
|
+
// Use a reducer to map all conditions to a single boolean value to decide if we want to trigger the provided action type
|
|
59
|
+
const reducer = (isMatch, condition, index) => {
|
|
60
|
+
// Find the FormControl of the related field
|
|
61
|
+
let relatedControl;
|
|
62
|
+
for (const [fieldName, control] of Object.entries(relatedControls)) {
|
|
63
|
+
if (fieldName === condition.fieldName) {
|
|
64
|
+
relatedControl = control;
|
|
65
|
+
break;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
if (!relatedControl)
|
|
69
|
+
return false;
|
|
70
|
+
// Using the 'normal' type should return true when the condition matches
|
|
71
|
+
if (relation.actionType === action.type) {
|
|
72
|
+
// Shortcut to false when a previous condition check was resolved as false
|
|
73
|
+
if (index > 0 && operator === RelationOperator.AND && !isMatch)
|
|
74
|
+
return false;
|
|
75
|
+
// Shortcut to true when a previous condition check was resolved as true
|
|
76
|
+
if (index > 0 && operator === RelationOperator.OR && isMatch)
|
|
77
|
+
return true;
|
|
78
|
+
return condition.value(relatedControl.value);
|
|
79
|
+
}
|
|
80
|
+
// Using the reversed type should return false when the condition matches, because we want to the opposite of the configured change Function
|
|
81
|
+
if (relation.actionType === action.reversedType) {
|
|
82
|
+
// Shortcut to true when a previous condition check was resolved as true
|
|
83
|
+
if (index > 0 && operator === RelationOperator.AND && isMatch)
|
|
84
|
+
return true;
|
|
85
|
+
// Shortcut to false when a previous condition check was resolved as false
|
|
86
|
+
if (index > 0 && operator === RelationOperator.OR && !isMatch)
|
|
87
|
+
return false;
|
|
88
|
+
return !condition.value(relatedControl.value);
|
|
89
|
+
}
|
|
90
|
+
return false;
|
|
91
|
+
};
|
|
92
|
+
return relation.conditions.reduce(reducer, false);
|
|
93
|
+
}
|
|
94
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DynamicFormRelationsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
95
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DynamicFormRelationsService, providedIn: 'root' }); }
|
|
96
|
+
}
|
|
97
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DynamicFormRelationsService, decorators: [{
|
|
98
|
+
type: Injectable,
|
|
99
|
+
args: [{
|
|
100
|
+
providedIn: 'root'
|
|
101
|
+
}]
|
|
102
|
+
}] });
|
|
103
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy1mb3JtLXJlbGF0aW9ucy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWR5bmFtaWMtZm9ybS9zcmMvbGliL3NlcnZpY2VzL2R5bmFtaWMtZm9ybS1yZWxhdGlvbnMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFN0QsT0FBTyxFQUFFLG9CQUFvQixFQUFFLFNBQVMsRUFBZ0IsTUFBTSxNQUFNLENBQUM7QUFFckUsT0FBTyxFQUdMLGdCQUFnQixFQUVoQixnQkFBZ0IsRUFDakIsTUFBTSw2Q0FBNkMsQ0FBQzs7QUFNckQsTUFBTSxPQUFPLDJCQUEyQjtJQUh4QztRQUlVLGNBQVMsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7S0FrSHRDO0lBakhDOzs7OztPQUtHO0lBQ0ksb0JBQW9CLENBQUMsS0FBNEIsRUFBRSxLQUFnQjtRQUN4RSxNQUFNLGdCQUFnQixHQUFHLENBQUMsUUFBNkIsRUFBRSxTQUE0QixFQUFFLEVBQUU7WUFDdkYsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUF1QixDQUFDO1lBRXJFLElBQUksQ0FBQyxPQUFPLEVBQUU7Z0JBQ1osT0FBTyxDQUFDLElBQUksQ0FBQyx5Q0FBeUMsU0FBUyxDQUFDLFNBQVMsUUFBUSxDQUFDLENBQUM7Z0JBQ25GLE9BQU8sUUFBUSxDQUFDO2FBQ2pCO1lBRUQsUUFBUSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsR0FBRyxPQUFPLENBQUM7WUFDeEMsT0FBTyxRQUFRLENBQUM7UUFDbEIsQ0FBQyxDQUFDO1FBRUYsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLFFBQTZCLEVBQUUsUUFBa0MsRUFBRSxFQUFFO1lBQzdGLE9BQU8sUUFBUSxDQUFD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Q0FBQyxVQUFVLEtBQUssTUFBTSxDQUFDLFlBQVksRUFBRTtnQkFDL0Msd0VBQXdFO2dCQUN4RSxJQUFJLEtBQUssR0FBRyxDQUFDLElBQUksUUFBUSxLQUFLLGdCQUFnQixDQUFDLEdBQUcsSUFBSSxPQUFPO29CQUFFLE9BQU8sSUFBSSxDQUFDO2dCQUUzRSwwRUFBMEU7Z0JBQzFFLElBQUksS0FBSyxHQUFHLENBQUMsSUFBSSxRQUFRLEtBQUssZ0JBQWdCLENBQUMsRUFBRSxJQUFJLENBQUMsT0FBTztvQkFBRSxPQUFPLEtBQUssQ0FBQztnQkFFNUUsT0FBTyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQy9DO1lBRUQsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDLENBQUM7UUFFRixPQUFPLFFBQVEsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNwRCxDQUFDOytHQWxIVSwyQkFBMkI7bUhBQTNCLDJCQUEyQixjQUYxQixNQUFNOzs0RkFFUCwyQkFBMkI7a0JBSHZDLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaW5qZWN0LCBJbmplY3RhYmxlLCBJbmplY3RvciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCwgVW50eXBlZEZvcm1Db250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgZGlzdGluY3RVbnRpbENoYW5nZWQsIHN0YXJ0V2l0aCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBEeW5hbWljRm9ybUZpZWxkTW9kZWwgfSBmcm9tICcuLi9tb2RlbHMvY2xhc3Nlcy9keW5hbWljLWZvcm0tZmllbGQtbW9kZWwnO1xuaW1wb3J0IHtcbiAgRHluYW1pY0Zvcm1GaWVsZFJlbGF0aW9uLFxuICBEeW5hbWljUmVsYXRpb25BY3Rpb24sXG4gIFJFTEFUSU9OX0FDVElPTlMsXG4gIFJlbGF0aW9uQ29uZGl0aW9uLFxuICBSZWxhdGlvbk9wZXJhdG9yXG59IGZyb20gJy4uL21vZGVscy9jb25zdGFudHMvZHluYW1pYy1yZWxhdGlvbnMuY29uc3QnO1xuaW1wb3J0IHsgUmVsYXRlZEZvcm1Db250cm9scyB9IGZyb20gJy4uL21vZGVscy90eXBlcy9yZWxhdGVkLWZvcm0tY29udHJvbHMudHlwZSc7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIER5bmFtaWNGb3JtUmVsYXRpb25zU2VydmljZSB7XG4gIHByaXZhdGUgX2luamVjdG9yID0gaW5qZWN0KEluamVjdG9yKTtcbiAgLyoqXG4gICAqIEdldCBhbiBvYmplY3Qgd2l0aCBhbGwgRm9ybUZpZWxkIHRoZSBwcm92aWRlZCBtb2RlbCBoYXMgYSByZWxhdGlvbiB3aXRoXG4gICAqIEBwYXJhbSBtb2RlbFxuICAgKiBAcGFyYW0gZ3JvdXBcbiAgICogQHJldHVybnNcbiAgICovXG4gIHB1YmxpYyBmaW5kUmVsYXRlZEZvcm1GaWVsZChtb2RlbDogRHluYW1pY0Zvcm1GaWVsZE1vZGVsLCBncm91cDogRm9ybUdyb3VwKTogUmVsYXRlZEZvcm1Db250cm9scyB7XG4gICAgY29uc3QgY29uZGl0aW9uUmVkdWNlciA9IChjb250cm9sczogUmVsYXRlZEZvcm1Db250cm9scywgY29uZGl0aW9uOiBSZWxhdGlvbkNvbmRpdGlvbikgPT4ge1xuICAgICAgY29uc3QgY29udHJvbCA9IGdyb3VwLmdldChjb25kaXRpb24uZmllbGROYW1lKSBhcyBVbnR5cGVkRm9ybUNvbnRyb2w7XG5cbiAgICAgIGlmICghY29udHJvbCkge1xuICAgICAgICBjb25zb2xlLndhcm4oYE5vIHJlbGF0ZWQgZm9ybSBjb250cm9sIHdpdGggdGhlIG5hbWUgJHtjb25kaXRpb24uZmllbGROYW1lfSBmb3VuZGApO1xuICAgICAgICByZXR1cm4gY29udHJvbHM7XG4gICAgICB9XG5cbiAgICAgIGNvbnRyb2xzW2NvbmRpdGlvbi5maWVsZE5hbWVdID0gY29udHJvbDtcbiAgICAgIHJldHVybiBjb250cm9scztcbiAgICB9O1xuXG4gICAgY29uc3QgcmVsYXRpb25zUmVkdWNlciA9IChjb250cm9sczogUmVsYXRlZEZvcm1Db250cm9scywgcmVsYXRpb246IER5bmFtaWNGb3JtRmllbGRSZWxhdGlvbikgPT4ge1xuICAgICAgcmV0dXJuIHJlbGF0aW9uLmNvbmRpdGlvbnMucmVkdWNlKGNvbmRpdGlvblJlZHVjZXIsIGNvbnRyb2xzKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIG1vZGVsLnJlbGF0aW9ucyEucmVkdWNlKHJlbGF0aW9uc1JlZHVjZXIsIHt9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRSZWxhdGlvblN1YnNjcmlwdGlvbnMoXG4gICAgcmVsYXRlZEZvcm1Db250cm9sczogUmVsYXRlZEZvcm1Db250cm9scyxcbiAgICBtb2RlbDogRHluYW1pY0Zvcm1GaWVsZE1vZGVsLFxuICAgIGNvbnRyb2w6IEZvcm1Db250cm9sXG4gICk6IFN1YnNjcmlwdGlvbltdIHtcbiAgICBjb25zdCBzdWJzOiBTdWJzY3JpcHRpb25bXSA9IFtdO1xuXG4gICAgLy8gU3Vic2NyaWJlIHRvIHZhbHVlIGNoYW5nZXMgb2YgYWxsIEZvcm1Db250cm9scywgcHJvdmlkZSB0aGUgY3VycmVudCB2YWx1ZSBpbnNpZGUgdGhlIHN0YXJ0V2l0aFxuICAgIE9iamVjdC52YWx1ZXMocmVsYXRlZEZvcm1Db250cm9scykuZm9yRWFjaCgocmVsYXRlZENvbnRyb2wpID0+IHtcbiAgICAgIHN1YnMucHVzaChcbiAgICAgICAgcmVsYXRlZENvbnRyb2wudmFsdWVDaGFuZ2VzLnBpcGUoc3RhcnRXaXRoKHJlbGF0ZWRDb250cm9sLnZhbHVlKSwgZGlzdGluY3RVbnRpbENoYW5nZWQoKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICBtb2RlbC5yZWxhdGlvbnMhLmZvckVhY2goKHJlbGF0aW9uKSA9PiB7XG4gICAgICAgICAgICAvLyBGaW5kIHRoZSBSZWxhdGlvbkFjdGlvbiBvYmplY3QgYmFzZWQgb24gdGhlIGFjdGlvblR5cGUgcGFzc2VkIGluc2lkZSB0aGUgRHluYW1pY0Zvcm1Db25maWdcbiAgICAgICAgICAgIGNvbnN0IGFjdGlvbiA9IFJFTEFUSU9OX0FDVElPTlMuZmluZChcbiAgICAgICAgICAgICAgKGFjdGlvbikgPT4gcmVsYXRpb24uYWN0aW9uVHlwZSA9PT0gYWN0aW9uLnR5cGUgfHwgcmVsYXRpb24uYWN0aW9uVHlwZSA9PT0gYWN0aW9uLnJldmVyc2VkVHlwZVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgaWYgKGFjdGlvbikge1xuICAgICAgICAgICAgICBjb25zdCBzaG91bGRUcmlnZ2VyID0gdGhpcy5jaGVja1JlbGF0aW9uQ29uZGl0aW9uKHJlbGF0aW9uLCByZWxhdGVkRm9ybUNvbnRyb2xzLCBhY3Rpb24pO1xuXG4gICAgICAgICAgICAgIGFjdGlvbi5jaGFuZ2Uoc2hvdWxkVHJpZ2dlciwgbW9kZWwsIGNvbnRyb2wsIHRoaXMuX2luamVjdG9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gc3VicztcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayB0aGUgY29uZGl0aW9ucyBpbnNpZGUgdGhlIHJlbGF0aW9uc1xuICAgKiBAcGFyYW0gcmVsYXRpb25cbiAgICogQHBhcmFtIHJlbGF0ZWRDb250cm9sXG4gICAqIEBwYXJhbSBhY3Rpb25cbiAgICogQHJldHVybnNcbiAgICovXG4gIHByaXZhdGUgY2hlY2tSZWxhdGlvbkNvbmRpdGlvbihcbiAgICByZWxhdGlvbjogRHluYW1pY0Zvcm1GaWVsZFJlbGF0aW9uLFxuICAgIHJlbGF0ZWRDb250cm9sczogUmVsYXRlZEZvcm1Db250cm9scyxcbiAgICBhY3Rpb246IER5bmFtaWNSZWxhdGlvbkFjdGlvblxuICApOiBib29sZWFuIHtcbiAgICAvLyBEZWZhdWx0IG9wZXJhdG9yIGlzIEFORCwgbWVhbmluZyBhbGwgY29uZGl0aW9ucyBzaG91bGQgcmV0dXJuIHRydWUgYmVmb3JlIHRoZSBwcm92aWRlZCBhY3Rpb24gaXMgdHJpZ2dlcmVkLlxuICAgIC8vIEluIHRoZSBjYXNlIG9mIGEgcmV2ZXJzZWQgdHlwZSwgdGhlIHJldHVybiB2YWx1ZSB3aG91bGQgYmUgZmFsc2UuXG4gICAgY29uc3Qgb3BlcmF0b3IgPSByZWxhdGlvbi5vcGVyYXRvciA/PyBSZWxhdGlvbk9wZXJhdG9yLkFORDtcblxuICAgIC8vIFVzZSBhIHJlZHVjZXIgdG8gbWFwIGFsbCBjb25kaXRpb25zIHRvIGEgc2luZ2xlIGJvb2xlYW4gdmFsdWUgdG8gZGVjaWRlIGlmIHdlIHdhbnQgdG8gdHJpZ2dlciB0aGUgcHJvdmlkZWQgYWN0aW9uIHR5cGVcbiAgICBjb25zdCByZWR1Y2VyID0gKGlzTWF0Y2g6IGJvb2xlYW4sIGNvbmRpdGlvbjogUmVsYXRpb25Db25kaXRpb24sIGluZGV4OiBudW1iZXIpOiBib29sZWFuID0+IHtcbiAgICAgIC8vIEZpbmQgdGhlIEZvcm1Db250cm9sIG9mIHRoZSByZWxhdGVkIGZpZWxkXG4gICAgICBsZXQgcmVsYXRlZENvbnRyb2w6IFVudHlwZWRGb3JtQ29udHJvbCB8IHVuZGVmaW5lZDtcblxuICAgICAgZm9yIChjb25zdCBbZmllbGROYW1lLCBjb250cm9sXSBvZiBPYmplY3QuZW50cmllcyhyZWxhdGVkQ29udHJvbHMpKSB7XG4gICAgICAgIGlmIChmaWVsZE5hbWUgPT09IGNvbmRpdGlvbi5maWVsZE5hbWUpIHtcbiAgICAgICAgICByZWxhdGVkQ29udHJvbCA9IGNvbnRyb2w7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCFyZWxhdGVkQ29udHJvbCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAvLyBVc2luZyB0aGUgJ25vcm1hbCcgdHlwZSBzaG91bGQgcmV0dXJuIHRydWUgd2hlbiB0aGUgY29uZGl0aW9uIG1hdGNoZXNcbiAgICAgIGlmIChyZWxhdGlvbi5hY3Rpb25UeXBlID09PSBhY3Rpb24udHlwZSkge1xuICAgICAgICAvLyBTaG9ydGN1dCB0byBmYWxzZSB3aGVuIGEgcHJldmlvdXMgY29uZGl0aW9uIGNoZWNrIHdhcyByZXNvbHZlZCBhcyBmYWxzZVxuICAgICAgICBpZiAoaW5kZXggPiAwICYmIG9wZXJhdG9yID09PSBSZWxhdGlvbk9wZXJhdG9yLkFORCAmJiAhaXNNYXRjaCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIC8vIFNob3J0Y3V0IHRvIHRydWUgd2hlbiBhIHByZXZpb3VzIGNvbmRpdGlvbiBjaGVjayB3YXMgcmVzb2x2ZWQgYXMgdHJ1ZVxuICAgICAgICBpZiAoaW5kZXggPiAwICYmIG9wZXJhdG9yID09PSBSZWxhdGlvbk9wZXJhdG9yLk9SICYmIGlzTWF0Y2gpIHJldHVybiB0cnVlO1xuXG4gICAgICAgIHJldHVybiBjb25kaXRpb24udmFsdWUocmVsYXRlZENvbnRyb2wudmFsdWUpO1xuICAgICAgfVxuXG4gICAgICAvLyBVc2luZyB0aGUgcmV2ZXJzZWQgdHlwZSBzaG91bGQgcmV0dXJuIGZhbHNlIHdoZW4gdGhlIGNvbmRpdGlvbiBtYXRjaGVzLCBiZWNhdXNlIHdlIHdhbnQgdG8gdGhlIG9wcG9zaXRlIG9mIHRoZSBjb25maWd1cmVkIGNoYW5nZSBGdW5jdGlvblxuICAgICAgaWYgKHJlbGF0aW9uLmFjdGlvblR5cGUgPT09IGFjdGlvbi5yZXZlcnNlZFR5cGUpIHtcbiAgICAgICAgLy8gU2hvcnRjdXQgdG8gdHJ1ZSB3aGVuIGEgcHJldmlvdXMgY29uZGl0aW9uIGNoZWNrIHdhcyByZXNvbHZlZCBhcyB0cnVlXG4gICAgICAgIGlmIChpbmRleCA+IDAgJiYgb3BlcmF0b3IgPT09IFJlbGF0aW9uT3BlcmF0b3IuQU5EICYmIGlzTWF0Y2gpIHJldHVybiB0cnVlO1xuXG4gICAgICAgIC8vIFNob3J0Y3V0IHRvIGZhbHNlIHdoZW4gYSBwcmV2aW91cyBjb25kaXRpb24gY2hlY2sgd2FzIHJlc29sdmVkIGFzIGZhbHNlXG4gICAgICAgIGlmIChpbmRleCA+IDAgJiYgb3BlcmF0b3IgPT09IFJlbGF0aW9uT3BlcmF0b3IuT1IgJiYgIWlzTWF0Y2gpIHJldHVybiBmYWxzZTtcblxuICAgICAgICByZXR1cm4gIWNvbmRpdGlvbi52YWx1ZShyZWxhdGVkQ29udHJvbC52YWx1ZSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIHJlbGF0aW9uLmNvbmRpdGlvbnMucmVkdWNlKHJlZHVjZXIsIGZhbHNlKTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { Inject, Injectable, Optional } from '@angular/core';
|
|
2
|
+
import { UntypedFormControl } from '@angular/forms';
|
|
3
|
+
import { map } from 'rxjs';
|
|
4
|
+
import { DYNAMIC_FORM_FIELD_MAP_FN } from '../models/tokens/dynamic-form-field-map-fn.token';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
import * as i1 from "@angular/forms";
|
|
7
|
+
import * as i2 from "./dynamic-validations.service";
|
|
8
|
+
export class DynamicFormService {
|
|
9
|
+
constructor(DYNAMIC_FORM_FIELD_MAP_FN, fb, validatorsService) {
|
|
10
|
+
this.DYNAMIC_FORM_FIELD_MAP_FN = DYNAMIC_FORM_FIELD_MAP_FN;
|
|
11
|
+
this.fb = fb;
|
|
12
|
+
this.validatorsService = validatorsService;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Check if there is a function provided to use custom form controls
|
|
16
|
+
* @param model
|
|
17
|
+
* @returns
|
|
18
|
+
*/
|
|
19
|
+
getCustomControlComponentType(model) {
|
|
20
|
+
return typeof this.DYNAMIC_FORM_FIELD_MAP_FN === 'function' ? this.DYNAMIC_FORM_FIELD_MAP_FN(model) : null;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Create a FormGroup from the provided form configuration.
|
|
24
|
+
* Returns a FormGroup.
|
|
25
|
+
* @param config
|
|
26
|
+
* @returns
|
|
27
|
+
*/
|
|
28
|
+
createFormGroup(config) {
|
|
29
|
+
const group = this.fb.group({});
|
|
30
|
+
config.forEach((row) => {
|
|
31
|
+
row.forEach((controlConfig) => {
|
|
32
|
+
const controlValueConfig = controlConfig;
|
|
33
|
+
const controlOptions = {
|
|
34
|
+
updateOn: controlConfig.updateOn,
|
|
35
|
+
validators: this.validatorsService.getValidatorFns(controlConfig.validators)
|
|
36
|
+
};
|
|
37
|
+
const control = new UntypedFormControl({ value: controlValueConfig.value ?? controlValueConfig.defaultValue, disabled: controlValueConfig.disabled }, controlOptions);
|
|
38
|
+
group.addControl(controlConfig.name, control);
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
return group;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Transform any list (Observable) to a list of DynamicFormFieldOption which is used in any Dynamic Form Field with options (e.g. DynamicSelect).
|
|
45
|
+
* Generic types:
|
|
46
|
+
* T = The type of the items in the provided list
|
|
47
|
+
* K = The type of the value inside an DynamicFormFieldOption
|
|
48
|
+
* @param listObs
|
|
49
|
+
* @param labelCb
|
|
50
|
+
* @param valueCb
|
|
51
|
+
* @returns
|
|
52
|
+
*/
|
|
53
|
+
toDynamicOptionListObs(listObs, labelCb, valueCb) {
|
|
54
|
+
return listObs.pipe(map((list) => {
|
|
55
|
+
return list.map((item) => {
|
|
56
|
+
return {
|
|
57
|
+
label: labelCb(item),
|
|
58
|
+
value: valueCb(item)
|
|
59
|
+
};
|
|
60
|
+
});
|
|
61
|
+
}));
|
|
62
|
+
}
|
|
63
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DynamicFormService, deps: [{ token: DYNAMIC_FORM_FIELD_MAP_FN, optional: true }, { token: i1.FormBuilder }, { token: i2.DynamicFormValidationsService }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
64
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DynamicFormService, providedIn: 'root' }); }
|
|
65
|
+
}
|
|
66
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DynamicFormService, decorators: [{
|
|
67
|
+
type: Injectable,
|
|
68
|
+
args: [{
|
|
69
|
+
providedIn: 'root'
|
|
70
|
+
}]
|
|
71
|
+
}], ctorParameters: function () { return [{ type: undefined, decorators: [{
|
|
72
|
+
type: Inject,
|
|
73
|
+
args: [DYNAMIC_FORM_FIELD_MAP_FN]
|
|
74
|
+
}, {
|
|
75
|
+
type: Optional
|
|
76
|
+
}] }, { type: i1.FormBuilder }, { type: i2.DynamicFormValidationsService }]; } });
|
|
77
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy1mb3JtLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtZHluYW1pYy1mb3JtL3NyYy9saWIvc2VydmljZXMvZHluYW1pYy1mb3JtLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFRLE1BQU0sZUFBZSxDQUFDO0FBQ25FLE9BQU8sRUFBbUMsa0JBQWtCLEVBQW9CLE1BQU0sZ0JBQWdCLENBQUM7QUFDdkcsT0FBTyxFQUFFLEdBQUcsRUFBYyxNQUFNLE1BQU0sQ0FBQztBQUt2QyxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxrREFBa0QsQ0FBQzs7OztBQVM3RixNQUFNLE9BQU8sa0JBQWtCO0lBQzdCLFlBQ3lELHlCQUFvRCxFQUNuRyxFQUFlLEVBQ2YsaUJBQWdEO1FBRkQsOEJBQXlCLEdBQXpCLHlCQUF5QixDQUEyQjtRQUNuRyxPQUFFLEdBQUYsRUFBRSxDQUFhO1FBQ2Ysc0JBQWlCLEdBQWpCLGlCQUFpQixDQUErQjtJQUN2RCxDQUFDO0lBRUo7Ozs7T0FJRztJQUNJLDZCQUE2QixDQUFDLEtBQTRCO1FBQy9ELE9BQU8sT0FBTyxJQUFJLENBQUMseUJBQXlCLEtBQUssVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMseUJBQXlCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUM3RyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxlQUFlLENBQUMsTUFBeUI7UUFDOUMsTUFBTSxLQUFLLEdBQXFCLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRWxELE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUNyQixHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsYUFBYSxFQUFFLEVBQUU7Z0JBQzVCLE1BQU0sa0JBQWtCLEdBQUcsYUFBcUQsQ0FBQztnQkFDakYsTUFBTSxjQUFjLEdBQXVCO29CQUN6QyxRQUFRLEVBQUUsYUFBYSxDQUFDLFFBQVE7b0JBQ2hDLFVBQVUsRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUM7aUJBQzdFLENBQUM7Z0JBRUYsTUFBTSxPQUFPLEdBQUcsSUFBSSxrQkFBa0IsQ0FDcEMsRUFBRSxLQUFLLEVBQUUsa0JBQWtCLENBQUMsS0FBSyxJQUFJLGtCQUFrQixDQUFDLFlBQVksRUFBRSxRQUFRLEVBQUUsa0JBQWtCLENBQUMsUUFBUSxFQUFFLEVBQzdHLGNBQWMsQ0FDZixDQUFDO2dCQUVGLEtBQUssQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztZQUNoRCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0ksc0JBQXNCLENBQzNCLE9BQXdCLEVBQ3hCLE9BQTRCLEVBQzVCLE9BQXVCO1FBRXZCLE9BQU8sT0FBTyxDQUFDLElBQUksQ0FDakIsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDWCxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFDdkIsT0FBTztvQkFDTCxLQUFLLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQztvQkFDcEIsS0FBSyxFQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUM7aUJBQ3JCLENBQUM7WUFDSixDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDOytHQXRFVSxrQkFBa0Isa0JBRW5CLHlCQUF5QjttSEFGeEIsa0JBQWtCLGNBRmpCLE1BQU07OzRGQUVQLGtCQUFrQjtrQkFIOUIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkI7OzBCQUdJLE1BQU07MkJBQUMseUJBQXlCOzswQkFBRyxRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBPcHRpb25hbCwgVHlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUJ1aWxkZXIsIEZvcm1Db250cm9sT3B0aW9ucywgVW50eXBlZEZvcm1Db250cm9sLCBVbnR5cGVkRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgbWFwLCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBEeW5hbWljRm9ybUZpZWxkIH0gZnJvbSAnLi4vbW9kZWxzL2NsYXNzZXMvZHluYW1pYy1mb3JtLWZpZWxkLWJhc2UtY29tcG9uZW50JztcbmltcG9ydCB7IER5bmFtaWNGb3JtRmllbGRNb2RlbCB9IGZyb20gJy4uL21vZGVscy9jbGFzc2VzL2R5bmFtaWMtZm9ybS1maWVsZC1tb2RlbCc7XG5pbXBvcnQgeyBEeW5hbWljRm9ybUZpZWxkT3B0aW9uIH0gZnJvbSAnLi4vbW9kZWxzL2NsYXNzZXMvZHluYW1pYy1mb3JtLWZpZWxkLW9wdGlvbi1tb2RlbCc7XG5pbXBvcnQgeyBEeW5hbWljRm9ybUZpZWxkVmFsdWVDb25maWcgfSBmcm9tICcuLi9tb2RlbHMvY2xhc3Nlcy9keW5hbWljLWZvcm0tZmllbGQtdmFsdWUtbW9kZWwnO1xuaW1wb3J0IHsgRFlOQU1JQ19GT1JNX0ZJRUxEX01BUF9GTiB9IGZyb20gJy4uL21vZGVscy90b2tlbnMvZHluYW1pYy1mb3JtLWZpZWxkLW1hcC1mbi50b2tlbic7XG5pbXBvcnQgeyBEeW5hbWljRm9ybUNvbmZpZyB9IGZyb20gJy4uL21vZGVscy90eXBlcy9keW5hbWljLWZvcm0tY29uZmlnLnR5cGUnO1xuaW1wb3J0IHsgRHluYW1pY0Zvcm1WYWxpZGF0aW9uc1NlcnZpY2UgfSBmcm9tICcuL2R5bmFtaWMtdmFsaWRhdGlvbnMuc2VydmljZSc7XG5cbmV4cG9ydCB0eXBlIER5bmFtaWNGb3JtRmllbGRUeXBlTWFwRm4gPSAoZmllbGQ6IER5bmFtaWNGb3JtRmllbGRNb2RlbCkgPT4gVHlwZTxEeW5hbWljRm9ybUZpZWxkPiB8IG51bGw7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIER5bmFtaWNGb3JtU2VydmljZSB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3QoRFlOQU1JQ19GT1JNX0ZJRUxEX01BUF9GTikgQE9wdGlvbmFsKCkgcHJpdmF0ZSBEWU5BTUlDX0ZPUk1fRklFTERfTUFQX0ZOOiBEeW5hbWljRm9ybUZpZWxkVHlwZU1hcEZuLFxuICAgIHByaXZhdGUgZmI6IEZvcm1CdWlsZGVyLFxuICAgIHByaXZhdGUgdmFsaWRhdG9yc1NlcnZpY2U6IER5bmFtaWNGb3JtVmFsaWRhdGlvbnNTZXJ2aWNlXG4gICkge31cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdGhlcmUgaXMgYSBmdW5jdGlvbiBwcm92aWRlZCB0byB1c2UgY3VzdG9tIGZvcm0gY29udHJvbHNcbiAgICogQHBhcmFtIG1vZGVsXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBwdWJsaWMgZ2V0Q3VzdG9tQ29udHJvbENvbXBvbmVudFR5cGUobW9kZWw6IER5bmFtaWNGb3JtRmllbGRNb2RlbCk6IFR5cGU8RHluYW1pY0Zvcm1GaWVsZD4gfCBudWxsIHtcbiAgICByZXR1cm4gdHlwZW9mIHRoaXMuRFlOQU1JQ19GT1JNX0ZJRUxEX01BUF9GTiA9PT0gJ2Z1bmN0aW9uJyA/IHRoaXMuRFlOQU1JQ19GT1JNX0ZJRUxEX01BUF9GTihtb2RlbCkgOiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIEZvcm1Hcm91cCBmcm9tIHRoZSBwcm92aWRlZCBmb3JtIGNvbmZpZ3VyYXRpb24uXG4gICAqIFJldHVybnMgYSBGb3JtR3JvdXAuXG4gICAqIEBwYXJhbSBjb25maWdcbiAgICogQHJldHVybnNcbiAgICovXG4gIHB1YmxpYyBjcmVhdGVGb3JtR3JvdXAoY29uZmlnOiBEeW5hbWljRm9ybUNvbmZpZyk6IFVudHlwZWRGb3JtR3JvdXAge1xuICAgIGNvbnN0IGdyb3VwOiBVbnR5cGVkRm9ybUdyb3VwID0gdGhpcy5mYi5ncm91cCh7fSk7XG5cbiAgICBjb25maWcuZm9yRWFjaCgocm93KSA9PiB7XG4gICAgICByb3cuZm9yRWFjaCgoY29udHJvbENvbmZpZykgPT4ge1xuICAgICAgICBjb25zdCBjb250cm9sVmFsdWVDb25maWcgPSBjb250cm9sQ29uZmlnIGFzIER5bmFtaWNGb3JtRmllbGRWYWx1ZUNvbmZpZzx1bmtub3duPjtcbiAgICAgICAgY29uc3QgY29udHJvbE9wdGlvbnM6IEZvcm1Db250cm9sT3B0aW9ucyA9IHtcbiAgICAgICAgICB1cGRhdGVPbjogY29udHJvbENvbmZpZy51cGRhdGVPbixcbiAgICAgICAgICB2YWxpZGF0b3JzOiB0aGlzLnZhbGlkYXRvcnNTZXJ2aWNlLmdldFZhbGlkYXRvckZucyhjb250cm9sQ29uZmlnLnZhbGlkYXRvcnMpXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgY29udHJvbCA9IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woXG4gICAgICAgICAgeyB2YWx1ZTogY29udHJvbFZhbHVlQ29uZmlnLnZhbHVlID8/IGNvbnRyb2xWYWx1ZUNvbmZpZy5kZWZhdWx0VmFsdWUsIGRpc2FibGVkOiBjb250cm9sVmFsdWVDb25maWcuZGlzYWJsZWQgfSxcbiAgICAgICAgICBjb250cm9sT3B0aW9uc1xuICAgICAgICApO1xuXG4gICAgICAgIGdyb3VwLmFkZENvbnRyb2woY29udHJvbENvbmZpZy5uYW1lLCBjb250cm9sKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGdyb3VwO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyYW5zZm9ybSBhbnkgbGlzdCAoT2JzZXJ2YWJsZSkgdG8gYSBsaXN0IG9mIER5bmFtaWNGb3JtRmllbGRPcHRpb24gd2hpY2ggaXMgdXNlZCBpbiBhbnkgRHluYW1pYyBGb3JtIEZpZWxkIHdpdGggb3B0aW9ucyAoZS5nLiBEeW5hbWljU2VsZWN0KS5cbiAgICogR2VuZXJpYyB0eXBlczpcbiAgICogVCA9IFRoZSB0eXBlIG9mIHRoZSBpdGVtcyBpbiB0aGUgcHJvdmlkZWQgbGlzdFxuICAgKiBLID0gVGhlIHR5cGUgb2YgdGhlIHZhbHVlIGluc2lkZSBhbiBEeW5hbWljRm9ybUZpZWxkT3B0aW9uXG4gICAqIEBwYXJhbSBsaXN0T2JzXG4gICAqIEBwYXJhbSBsYWJlbENiXG4gICAqIEBwYXJhbSB2YWx1ZUNiXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBwdWJsaWMgdG9EeW5hbWljT3B0aW9uTGlzdE9iczxULCBLID0gc3RyaW5nPihcbiAgICBsaXN0T2JzOiBPYnNlcnZhYmxlPFRbXT4sXG4gICAgbGFiZWxDYjogKGl0ZW06IFQpID0+IHN0cmluZyxcbiAgICB2YWx1ZUNiOiAoaXRlbTogVCkgPT4gS1xuICApOiBPYnNlcnZhYmxlPER5bmFtaWNGb3JtRmllbGRPcHRpb248Sz5bXT4ge1xuICAgIHJldHVybiBsaXN0T2JzLnBpcGUoXG4gICAgICBtYXAoKGxpc3QpID0+IHtcbiAgICAgICAgcmV0dXJuIGxpc3QubWFwKChpdGVtKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGxhYmVsOiBsYWJlbENiKGl0ZW0pLFxuICAgICAgICAgICAgdmFsdWU6IHZhbHVlQ2IoaXRlbSlcbiAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export class DynamicFormValidationsService {
|
|
4
|
+
/**
|
|
5
|
+
* Get all Validator Functions from the validator configuration
|
|
6
|
+
* @param validatorConfig
|
|
7
|
+
* @returns
|
|
8
|
+
*/
|
|
9
|
+
getValidatorFns(validatorConfig) {
|
|
10
|
+
return validatorConfig.map((v) => v.validator);
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Update the validators on a FormControl based on the provided validator configuration.
|
|
14
|
+
* This will replace any existing validators on the control or removes all validators when none provided
|
|
15
|
+
* @param validatorConfig
|
|
16
|
+
* @param control
|
|
17
|
+
*/
|
|
18
|
+
updateValidators(validatorConfig, control) {
|
|
19
|
+
if (!validatorConfig || validatorConfig.length === 0) {
|
|
20
|
+
control.clearValidators();
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
const validatorFns = this.getValidatorFns(validatorConfig);
|
|
24
|
+
control.setValidators(validatorFns);
|
|
25
|
+
}
|
|
26
|
+
control.updateValueAndValidity();
|
|
27
|
+
}
|
|
28
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DynamicFormValidationsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
29
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DynamicFormValidationsService, providedIn: 'root' }); }
|
|
30
|
+
}
|
|
31
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DynamicFormValidationsService, decorators: [{
|
|
32
|
+
type: Injectable,
|
|
33
|
+
args: [{
|
|
34
|
+
providedIn: 'root'
|
|
35
|
+
}]
|
|
36
|
+
}] });
|
|
37
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy12YWxpZGF0aW9ucy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWR5bmFtaWMtZm9ybS9zcmMvbGliL3NlcnZpY2VzL2R5bmFtaWMtdmFsaWRhdGlvbnMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQU8zQyxNQUFNLE9BQU8sNkJBQTZCO0lBQ3hDOzs7O09BSUc7SUFDSSxlQUFlLENBQUMsZUFBdUM7UUFDNUQsT0FBTyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDakQsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksZ0JBQWdCLENBQUMsZUFBdUMsRUFBRSxPQUFvQjtRQUNuRixJQUFJLENBQUMsZUFBZSxJQUFJLGVBQWUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ3BELE9BQU8sQ0FBQyxlQUFlLEVBQUUsQ0FBQztTQUMzQjthQUFNO1lBQ0wsTUFBTSxZQUFZLEdBQWtCLElBQUksQ0FBQyxlQUFlLENBQUMsZUFBZSxDQUFDLENBQUM7WUFDMUUsT0FBTyxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsQ0FBQztTQUNyQztRQUVELE9BQU8sQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO0lBQ25DLENBQUM7K0dBekJVLDZCQUE2QjttSEFBN0IsNkJBQTZCLGNBRjVCLE1BQU07OzRGQUVQLDZCQUE2QjtrQkFIekMsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQ29udHJvbCwgVmFsaWRhdG9yRm4gfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBEeW5hbWljRm9ybVZhbGlkYXRvciB9IGZyb20gJy4uL21vZGVscy9pbnRlcmZhY2VzL2R5bmFtaWMtZm9ybS12YWxpZGF0b3IuaW50ZXJmYWNlJztcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgRHluYW1pY0Zvcm1WYWxpZGF0aW9uc1NlcnZpY2Uge1xuICAvKipcbiAgICogR2V0IGFsbCBWYWxpZGF0b3IgRnVuY3Rpb25zIGZyb20gdGhlIHZhbGlkYXRvciBjb25maWd1cmF0aW9uXG4gICAqIEBwYXJhbSB2YWxpZGF0b3JDb25maWdcbiAgICogQHJldHVybnNcbiAgICovXG4gIHB1YmxpYyBnZXRWYWxpZGF0b3JGbnModmFsaWRhdG9yQ29uZmlnOiBEeW5hbWljRm9ybVZhbGlkYXRvcltdKTogVmFsaWRhdG9yRm5bXSB7XG4gICAgcmV0dXJuIHZhbGlkYXRvckNvbmZpZy5tYXAoKHYpID0+IHYudmFsaWRhdG9yKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgdGhlIHZhbGlkYXRvcnMgb24gYSBGb3JtQ29udHJvbCBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgdmFsaWRhdG9yIGNvbmZpZ3VyYXRpb24uXG4gICAqIFRoaXMgd2lsbCByZXBsYWNlIGFueSBleGlzdGluZyB2YWxpZGF0b3JzIG9uIHRoZSBjb250cm9sIG9yIHJlbW92ZXMgYWxsIHZhbGlkYXRvcnMgd2hlbiBub25lIHByb3ZpZGVkXG4gICAqIEBwYXJhbSB2YWxpZGF0b3JDb25maWdcbiAgICogQHBhcmFtIGNvbnRyb2xcbiAgICovXG4gIHB1YmxpYyB1cGRhdGVWYWxpZGF0b3JzKHZhbGlkYXRvckNvbmZpZzogRHluYW1pY0Zvcm1WYWxpZGF0b3JbXSwgY29udHJvbDogRm9ybUNvbnRyb2wpOiB2b2lkIHtcbiAgICBpZiAoIXZhbGlkYXRvckNvbmZpZyB8fCB2YWxpZGF0b3JDb25maWcubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb250cm9sLmNsZWFyVmFsaWRhdG9ycygpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB2YWxpZGF0b3JGbnM6IFZhbGlkYXRvckZuW10gPSB0aGlzLmdldFZhbGlkYXRvckZucyh2YWxpZGF0b3JDb25maWcpO1xuICAgICAgY29udHJvbC5zZXRWYWxpZGF0b3JzKHZhbGlkYXRvckZucyk7XG4gICAgfVxuXG4gICAgY29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generated bundle index. Do not edit.
|
|
3
|
+
*/
|
|
4
|
+
export * from './public-api';
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2xhZnZ2LW5neC1keW5hbWljLWZvcm0uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9wcm9qZWN0cy9uZ3gtZHluYW1pYy1mb3JtL3NyYy9vbGFmdnYtbmd4LWR5bmFtaWMtZm9ybS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsY0FBYyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL3B1YmxpYy1hcGknO1xuIl19
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Public API Surface of ngx-dynamic-form
|
|
3
|
+
*/
|
|
4
|
+
export * from './lib/components/dynamic-form/dynamic-form.component';
|
|
5
|
+
export * from './lib/controls';
|
|
6
|
+
export * from './lib/models';
|
|
7
|
+
export * from './lib/services/dynamic-form.service';
|
|
8
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL25neC1keW5hbWljLWZvcm0vc3JjL3B1YmxpYy1hcGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFDSCxjQUFjLHNEQUFzRCxDQUFDO0FBRXJFLGNBQWMsZ0JBQWdCLENBQUM7QUFDL0IsY0FBYyxjQUFjLENBQUM7QUFFN0IsY0FBYyxxQ0FBcUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBQdWJsaWMgQVBJIFN1cmZhY2Ugb2Ygbmd4LWR5bmFtaWMtZm9ybVxuICovXG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb21wb25lbnRzL2R5bmFtaWMtZm9ybS9keW5hbWljLWZvcm0uY29tcG9uZW50JztcblxuZXhwb3J0ICogZnJvbSAnLi9saWIvY29udHJvbHMnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvbW9kZWxzJztcblxuZXhwb3J0ICogZnJvbSAnLi9saWIvc2VydmljZXMvZHluYW1pYy1mb3JtLnNlcnZpY2UnO1xuIl19
|