@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.
Files changed (70) hide show
  1. package/README.md +55 -0
  2. package/esm2022/lib/components/dynamic-form/dynamic-form.component.mjs +59 -0
  3. package/esm2022/lib/components/dynamic-form-field/dynamic-form-field.component.mjs +129 -0
  4. package/esm2022/lib/controls/button/dynamic-button.component.mjs +22 -0
  5. package/esm2022/lib/controls/button/dynamic-button.model.mjs +12 -0
  6. package/esm2022/lib/controls/checkbox/dynamic-checkbox.component.mjs +32 -0
  7. package/esm2022/lib/controls/checkbox/dynamic-checkbox.model.mjs +21 -0
  8. package/esm2022/lib/controls/index.mjs +7 -0
  9. package/esm2022/lib/controls/input/dynamic-input.component.mjs +51 -0
  10. package/esm2022/lib/controls/input/dynamic-input.model.mjs +18 -0
  11. package/esm2022/lib/controls/readonly/dynamic-readonly.component.mjs +18 -0
  12. package/esm2022/lib/controls/readonly/dynamic-readonly.model.mjs +9 -0
  13. package/esm2022/lib/controls/select/dynamic-select.component.mjs +42 -0
  14. package/esm2022/lib/controls/select/dynamic-select.model.mjs +11 -0
  15. package/esm2022/lib/controls/textarea/dynamic-textarea.component.mjs +45 -0
  16. package/esm2022/lib/controls/textarea/dynamic-textarea.model.mjs +15 -0
  17. package/esm2022/lib/models/classes/dynamic-form-field-base-component.mjs +34 -0
  18. package/esm2022/lib/models/classes/dynamic-form-field-model.mjs +24 -0
  19. package/esm2022/lib/models/classes/dynamic-form-field-option-model.mjs +48 -0
  20. package/esm2022/lib/models/classes/dynamic-form-field-value-model.mjs +24 -0
  21. package/esm2022/lib/models/classes/dynamic-form-validators.mjs +73 -0
  22. package/esm2022/lib/models/constants/dynamic-relations.const.mjs +47 -0
  23. package/esm2022/lib/models/index.mjs +11 -0
  24. package/esm2022/lib/models/interfaces/dynamic-form-field-config.interface.mjs +2 -0
  25. package/esm2022/lib/models/interfaces/dynamic-form-validator.interface.mjs +2 -0
  26. package/esm2022/lib/models/tokens/dynamic-form-field-map-fn.token.mjs +3 -0
  27. package/esm2022/lib/models/types/dynamic-form-config.type.mjs +2 -0
  28. package/esm2022/lib/models/types/dynamic-form-hook.type.mjs +2 -0
  29. package/esm2022/lib/models/types/related-form-controls.type.mjs +2 -0
  30. package/esm2022/lib/services/dynamic-form-relations.service.mjs +103 -0
  31. package/esm2022/lib/services/dynamic-form.service.mjs +77 -0
  32. package/esm2022/lib/services/dynamic-validations.service.mjs +37 -0
  33. package/esm2022/olafvv-ngx-dynamic-form.mjs +5 -0
  34. package/esm2022/public-api.mjs +8 -0
  35. package/fesm2022/olafvv-ngx-dynamic-form.mjs +873 -0
  36. package/fesm2022/olafvv-ngx-dynamic-form.mjs.map +1 -0
  37. package/index.d.ts +5 -0
  38. package/lib/components/dynamic-form/dynamic-form.component.d.ts +32 -0
  39. package/lib/components/dynamic-form-field/dynamic-form-field.component.d.ts +44 -0
  40. package/lib/controls/button/dynamic-button.component.d.ts +11 -0
  41. package/lib/controls/button/dynamic-button.model.d.ts +15 -0
  42. package/lib/controls/checkbox/dynamic-checkbox.component.d.ts +15 -0
  43. package/lib/controls/checkbox/dynamic-checkbox.model.d.ts +15 -0
  44. package/lib/controls/index.d.ts +6 -0
  45. package/lib/controls/input/dynamic-input.component.d.ts +19 -0
  46. package/lib/controls/input/dynamic-input.model.d.ts +27 -0
  47. package/lib/controls/readonly/dynamic-readonly.component.d.ts +10 -0
  48. package/lib/controls/readonly/dynamic-readonly.model.d.ts +9 -0
  49. package/lib/controls/select/dynamic-select.component.d.ts +16 -0
  50. package/lib/controls/select/dynamic-select.model.d.ts +12 -0
  51. package/lib/controls/textarea/dynamic-textarea.component.d.ts +18 -0
  52. package/lib/controls/textarea/dynamic-textarea.model.d.ts +21 -0
  53. package/lib/models/classes/dynamic-form-field-base-component.d.ts +26 -0
  54. package/lib/models/classes/dynamic-form-field-model.d.ts +22 -0
  55. package/lib/models/classes/dynamic-form-field-option-model.d.ts +41 -0
  56. package/lib/models/classes/dynamic-form-field-value-model.d.ts +18 -0
  57. package/lib/models/classes/dynamic-form-validators.d.ts +48 -0
  58. package/lib/models/constants/dynamic-relations.const.d.ts +30 -0
  59. package/lib/models/index.d.ts +10 -0
  60. package/lib/models/interfaces/dynamic-form-field-config.interface.d.ts +60 -0
  61. package/lib/models/interfaces/dynamic-form-validator.interface.d.ts +6 -0
  62. package/lib/models/tokens/dynamic-form-field-map-fn.token.d.ts +2 -0
  63. package/lib/models/types/dynamic-form-config.type.d.ts +2 -0
  64. package/lib/models/types/dynamic-form-hook.type.d.ts +1 -0
  65. package/lib/models/types/related-form-controls.type.d.ts +4 -0
  66. package/lib/services/dynamic-form-relations.service.d.ts +26 -0
  67. package/lib/services/dynamic-form.service.d.ts +42 -0
  68. package/lib/services/dynamic-validations.service.d.ts +20 -0
  69. package/package.json +28 -0
  70. 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