@stemy/ngx-dynamic-form 12.0.0 → 13.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 (76) hide show
  1. package/esm2020/ngx-dynamic-form/common-types.mjs +97 -0
  2. package/esm2020/ngx-dynamic-form/components/base/dynamic-base-form-array.component.mjs +85 -0
  3. package/esm2020/ngx-dynamic-form/components/base/dynamic-base-form-control-container.component.mjs +109 -0
  4. package/esm2020/ngx-dynamic-form/components/base/dynamic-base-form-group.component.mjs +74 -0
  5. package/esm2020/ngx-dynamic-form/components/base/dynamic-base-form.component.mjs +158 -0
  6. package/esm2020/ngx-dynamic-form/directives/async-submit.directive.mjs +111 -0
  7. package/esm2020/ngx-dynamic-form/ngx-dynamic-form.imports.mjs +22 -0
  8. package/esm2020/ngx-dynamic-form/ngx-dynamic-form.module.mjs +115 -0
  9. package/esm2020/ngx-dynamic-form/services/dynamic-form.service.mjs +451 -0
  10. package/esm2020/ngx-dynamic-form/utils/dynamic-form-array.model.mjs +16 -0
  11. package/esm2020/ngx-dynamic-form/utils/form-select-subject.mjs +23 -0
  12. package/esm2020/ngx-dynamic-form/utils/form-subject.mjs +29 -0
  13. package/esm2020/ngx-dynamic-form/utils/misc.mjs +20 -0
  14. package/esm2020/ngx-dynamic-form/utils/validators.mjs +56 -0
  15. package/esm2020/public_api.mjs +14 -0
  16. package/esm2020/stemy-ngx-dynamic-form.mjs +5 -0
  17. package/fesm2015/stemy-ngx-dynamic-form.mjs +1341 -0
  18. package/fesm2015/stemy-ngx-dynamic-form.mjs.map +1 -0
  19. package/fesm2020/stemy-ngx-dynamic-form.mjs +1313 -0
  20. package/fesm2020/stemy-ngx-dynamic-form.mjs.map +1 -0
  21. package/ngx-dynamic-form/common-types.d.ts +42 -262
  22. package/ngx-dynamic-form/components/base/dynamic-base-form-array.component.d.ts +29 -0
  23. package/ngx-dynamic-form/components/base/dynamic-base-form-control-container.component.d.ts +41 -0
  24. package/ngx-dynamic-form/components/base/dynamic-base-form-group.component.d.ts +24 -0
  25. package/ngx-dynamic-form/components/base/dynamic-base-form.component.d.ts +41 -0
  26. package/ngx-dynamic-form/directives/async-submit.directive.d.ts +10 -3
  27. package/ngx-dynamic-form/ngx-dynamic-form.imports.d.ts +10 -0
  28. package/ngx-dynamic-form/ngx-dynamic-form.module.d.ts +14 -17
  29. package/ngx-dynamic-form/services/dynamic-form.service.d.ts +47 -10
  30. package/ngx-dynamic-form/utils/dynamic-form-array.model.d.ts +22 -0
  31. package/ngx-dynamic-form/utils/form-select-subject.d.ts +6 -0
  32. package/ngx-dynamic-form/utils/form-subject.d.ts +10 -0
  33. package/ngx-dynamic-form/utils/misc.d.ts +5 -0
  34. package/ngx-dynamic-form/utils/validators.d.ts +8 -0
  35. package/package.json +42 -22
  36. package/public_api.d.ts +10 -14
  37. package/stemy-ngx-dynamic-form.d.ts +1 -3
  38. package/bundles/stemy-ngx-dynamic-form.umd.js +0 -2344
  39. package/bundles/stemy-ngx-dynamic-form.umd.js.map +0 -1
  40. package/esm2015/ngx-dynamic-form/common-types.js +0 -590
  41. package/esm2015/ngx-dynamic-form/components/base/dynamic-form-base.component.js +0 -87
  42. package/esm2015/ngx-dynamic-form/components/dynamic-form/dynamic-form.component.js +0 -91
  43. package/esm2015/ngx-dynamic-form/components/dynamic-form-file/dynamic-form-file.component.js +0 -112
  44. package/esm2015/ngx-dynamic-form/components/dynamic-form-group/dynamic-form-group.component.js +0 -19
  45. package/esm2015/ngx-dynamic-form/components/dynamic-form-input/dynamic-form-input.component.js +0 -69
  46. package/esm2015/ngx-dynamic-form/components/dynamic-form-model/dynamic-form-model.component.js +0 -23
  47. package/esm2015/ngx-dynamic-form/components/dynamic-form-select/dynamic-form-select.component.js +0 -73
  48. package/esm2015/ngx-dynamic-form/components/dynamic-form-static/dynamic-form-static.component.js +0 -20
  49. package/esm2015/ngx-dynamic-form/components/dynamic-forms/dynamic-forms.component.js +0 -134
  50. package/esm2015/ngx-dynamic-form/directives/async-submit.directive.js +0 -89
  51. package/esm2015/ngx-dynamic-form/directives/dynamic-form-control.directive.js +0 -32
  52. package/esm2015/ngx-dynamic-form/directives/dynamic-form-group.directive.js +0 -40
  53. package/esm2015/ngx-dynamic-form/directives/dynamic-form-template.directive.js +0 -38
  54. package/esm2015/ngx-dynamic-form/ngx-dynamic-form.module.js +0 -83
  55. package/esm2015/ngx-dynamic-form/services/dynamic-form.service.js +0 -48
  56. package/esm2015/ngx-dynamic-form/services/form-utilities.js +0 -108
  57. package/esm2015/ngx-dynamic-form/services/open-api.service.js +0 -130
  58. package/esm2015/public_api.js +0 -18
  59. package/esm2015/stemy-ngx-dynamic-form.js +0 -8
  60. package/fesm2015/stemy-ngx-dynamic-form.js +0 -1731
  61. package/fesm2015/stemy-ngx-dynamic-form.js.map +0 -1
  62. package/ngx-dynamic-form/components/base/dynamic-form-base.component.d.ts +0 -44
  63. package/ngx-dynamic-form/components/dynamic-form/dynamic-form.component.d.ts +0 -21
  64. package/ngx-dynamic-form/components/dynamic-form-file/dynamic-form-file.component.d.ts +0 -16
  65. package/ngx-dynamic-form/components/dynamic-form-group/dynamic-form-group.component.d.ts +0 -6
  66. package/ngx-dynamic-form/components/dynamic-form-input/dynamic-form-input.component.d.ts +0 -12
  67. package/ngx-dynamic-form/components/dynamic-form-model/dynamic-form-model.component.d.ts +0 -6
  68. package/ngx-dynamic-form/components/dynamic-form-select/dynamic-form-select.component.d.ts +0 -9
  69. package/ngx-dynamic-form/components/dynamic-form-static/dynamic-form-static.component.d.ts +0 -5
  70. package/ngx-dynamic-form/components/dynamic-forms/dynamic-forms.component.d.ts +0 -26
  71. package/ngx-dynamic-form/directives/dynamic-form-control.directive.d.ts +0 -12
  72. package/ngx-dynamic-form/directives/dynamic-form-group.directive.d.ts +0 -14
  73. package/ngx-dynamic-form/directives/dynamic-form-template.directive.d.ts +0 -16
  74. package/ngx-dynamic-form/services/form-utilities.d.ts +0 -19
  75. package/ngx-dynamic-form/services/open-api.service.d.ts +0 -37
  76. package/stemy-ngx-dynamic-form.metadata.json +0 -1
@@ -0,0 +1,158 @@
1
+ import { ChangeDetectionStrategy, Component, ContentChildren, EventEmitter, Inject, Input, Output, QueryList, ViewChild, ViewChildren } from "@angular/core";
2
+ import { NgForm } from "@angular/forms";
3
+ import { Subscription } from "rxjs";
4
+ import { first } from "rxjs/operators";
5
+ import { DynamicFormComponent, DynamicFormGroupModel, DynamicTemplateDirective } from "@ng-dynamic-forms/core";
6
+ import { EventsService, ObservableUtils } from "@stemy/ngx-utils";
7
+ import { DynamicFormService } from "../../services/dynamic-form.service";
8
+ import { collectPathAble } from "../../utils/misc";
9
+ import * as i0 from "@angular/core";
10
+ import * as i1 from "@ng-dynamic-forms/core";
11
+ import * as i2 from "../../services/dynamic-form.service";
12
+ import * as i3 from "@stemy/ngx-utils";
13
+ export class DynamicBaseFormComponent extends DynamicFormComponent {
14
+ constructor(formService, events, changeDetectorRef, componentService) {
15
+ super(changeDetectorRef, componentService);
16
+ this.formService = formService;
17
+ this.events = events;
18
+ this.blur = new EventEmitter();
19
+ this.change = new EventEmitter();
20
+ this.focus = new EventEmitter();
21
+ this.onValueChange = new EventEmitter();
22
+ this.onStatusChange = new EventEmitter();
23
+ this.onSubmit = new EventEmitter();
24
+ this.templates = new QueryList();
25
+ this.subscription = new Subscription();
26
+ this.groupSubscription = new Subscription();
27
+ this.labelPrefix = "label";
28
+ }
29
+ get status() {
30
+ return !this.group ? null : this.group.status;
31
+ }
32
+ ngOnChanges(changes) {
33
+ this.groupSubscription.unsubscribe();
34
+ if (this.group) {
35
+ this.groupSubscription = ObservableUtils.multiSubscription(this.group.statusChanges.subscribe(() => {
36
+ this.onStatusChange.emit(this);
37
+ }), this.group.valueChanges.subscribe(() => {
38
+ this.formService.notifyChanges(this.model, this.group, this.model);
39
+ }), this.change.subscribe(ev => {
40
+ this.onValueChange.emit({ ...ev, form: this });
41
+ }));
42
+ }
43
+ }
44
+ ngAfterViewInit() {
45
+ this.subscription = ObservableUtils.multiSubscription(ObservableUtils.subscribe({
46
+ subjects: [this.contentTemplates.changes, this.viewTemplates.changes],
47
+ cb: () => {
48
+ const templates = this.contentTemplates.toArray().concat(this.viewTemplates.toArray());
49
+ this.templates.reset(templates);
50
+ }
51
+ }), this.events.languageChanged.subscribe(() => {
52
+ this.formService.detectChanges(this);
53
+ }), this.ngForm.ngSubmit.subscribe(() => {
54
+ this.onSubmit.emit(this);
55
+ }));
56
+ }
57
+ ngOnDestroy() {
58
+ super.ngOnDestroy();
59
+ this.subscription.unsubscribe();
60
+ this.groupSubscription.unsubscribe();
61
+ }
62
+ insertFormArrayGroup(index, formArray, formArrayModel) {
63
+ this.formService.insertFormArrayGroup(index, formArray, formArrayModel);
64
+ this.changeDetectorRef.detectChanges();
65
+ }
66
+ removeFormArrayGroup(index, formArray, formArrayModel) {
67
+ this.formService.removeFormArrayGroup(index, formArray, formArrayModel);
68
+ this.changeDetectorRef.detectChanges();
69
+ }
70
+ moveFormArrayGroup(index, step, formArray, formArrayModel) {
71
+ this.formService.moveFormArrayGroup(index, step, formArray, formArrayModel);
72
+ this.changeDetectorRef.detectChanges();
73
+ }
74
+ clearFormArray(formArray, formArrayModel) {
75
+ this.formService.clearFormArray(formArray, formArrayModel);
76
+ this.changeDetectorRef.detectChanges();
77
+ }
78
+ getClass(model) {
79
+ const parts = collectPathAble(model, p => p.id);
80
+ if (parts.length == 0)
81
+ return "";
82
+ if (model instanceof DynamicFormGroupModel) {
83
+ return `form-group-${parts.join("-")}`;
84
+ }
85
+ return `form-control-${parts.join("-")}`;
86
+ }
87
+ validate(showErrors = true) {
88
+ if (!this.group)
89
+ return Promise.resolve();
90
+ return new Promise((resolve, reject) => {
91
+ this.group.statusChanges.pipe(first(status => status == "VALID" || status == "INVALID")).subscribe(status => {
92
+ if (showErrors) {
93
+ this.formService.showErrors(this);
94
+ }
95
+ if (status == "VALID") {
96
+ resolve(null);
97
+ return;
98
+ }
99
+ reject(null);
100
+ });
101
+ this.group.updateValueAndValidity();
102
+ });
103
+ }
104
+ async serialize(validate) {
105
+ if (!this.group)
106
+ return null;
107
+ if (validate) {
108
+ await this.validate();
109
+ }
110
+ return await this.formService.serialize(this.model, this.group);
111
+ }
112
+ }
113
+ DynamicBaseFormComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.8", ngImport: i0, type: DynamicBaseFormComponent, deps: [{ token: DynamicFormService }, { token: EventsService }, { token: i0.ChangeDetectorRef }, { token: i1.DynamicFormComponentService }], target: i0.ɵɵFactoryTarget.Component });
114
+ DynamicBaseFormComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.8", type: DynamicBaseFormComponent, selector: "dynamic-base-form", inputs: { group: "group", model: "model", layout: "layout", labelPrefix: "labelPrefix" }, outputs: { blur: "blur", change: "change", focus: "focus", onValueChange: "onValueChange", onStatusChange: "onStatusChange", onSubmit: "onSubmit" }, queries: [{ propertyName: "contentTemplates", predicate: DynamicTemplateDirective }], viewQueries: [{ propertyName: "ngForm", first: true, predicate: NgForm, descendants: true }, { propertyName: "viewTemplates", predicate: DynamicTemplateDirective, descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "", isInline: true, changeDetection: i0.ChangeDetectionStrategy.Default });
115
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.8", ngImport: i0, type: DynamicBaseFormComponent, decorators: [{
116
+ type: Component,
117
+ args: [{
118
+ selector: "dynamic-base-form",
119
+ template: "",
120
+ changeDetection: ChangeDetectionStrategy.Default
121
+ }]
122
+ }], ctorParameters: function () { return [{ type: i2.DynamicFormService, decorators: [{
123
+ type: Inject,
124
+ args: [DynamicFormService]
125
+ }] }, { type: i3.EventsService, decorators: [{
126
+ type: Inject,
127
+ args: [EventsService]
128
+ }] }, { type: i0.ChangeDetectorRef }, { type: i1.DynamicFormComponentService }]; }, propDecorators: { group: [{
129
+ type: Input
130
+ }], model: [{
131
+ type: Input
132
+ }], layout: [{
133
+ type: Input
134
+ }], labelPrefix: [{
135
+ type: Input
136
+ }], blur: [{
137
+ type: Output
138
+ }], change: [{
139
+ type: Output
140
+ }], focus: [{
141
+ type: Output
142
+ }], contentTemplates: [{
143
+ type: ContentChildren,
144
+ args: [DynamicTemplateDirective]
145
+ }], viewTemplates: [{
146
+ type: ViewChildren,
147
+ args: [DynamicTemplateDirective]
148
+ }], onValueChange: [{
149
+ type: Output
150
+ }], onStatusChange: [{
151
+ type: Output
152
+ }], onSubmit: [{
153
+ type: Output
154
+ }], ngForm: [{
155
+ type: ViewChild,
156
+ args: [NgForm]
157
+ }] } });
158
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy1iYXNlLWZvcm0uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL25neC1keW5hbWljLWZvcm0vY29tcG9uZW50cy9iYXNlL2R5bmFtaWMtYmFzZS1mb3JtLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUgsdUJBQXVCLEVBRXZCLFNBQVMsRUFDVCxlQUFlLEVBQ2YsWUFBWSxFQUNaLE1BQU0sRUFDTixLQUFLLEVBRUwsTUFBTSxFQUNOLFNBQVMsRUFFVCxTQUFTLEVBQ1QsWUFBWSxFQUNmLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBdUIsTUFBTSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDNUQsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUNsQyxPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDckMsT0FBTyxFQUVILG9CQUFvQixFQUlwQixxQkFBcUIsRUFHckIsd0JBQXdCLEVBQzNCLE1BQU0sd0JBQXdCLENBQUM7QUFDaEMsT0FBTyxFQUFDLGFBQWEsRUFBRSxlQUFlLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUVoRSxPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSxxQ0FBcUMsQ0FBQztBQUN2RSxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sa0JBQWtCLENBQUM7Ozs7O0FBT2pELE1BQU0sT0FBTyx3QkFBeUIsU0FBUSxvQkFBb0I7SUEyQjlELFlBQWlELFdBQStCLEVBQ3BDLE1BQXFCLEVBQ3JELGlCQUFvQyxFQUNwQyxnQkFBNkM7UUFDckQsS0FBSyxDQUFDLGlCQUFpQixFQUFFLGdCQUFnQixDQUFDLENBQUM7UUFKRSxnQkFBVyxHQUFYLFdBQVcsQ0FBb0I7UUFDcEMsV0FBTSxHQUFOLE1BQU0sQ0FBZTtRQUk3RCxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksWUFBWSxFQUEyQixD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QUFDO1FBQzdCLElBQUksUUFBUSxFQUFFO1lBQ1YsTUFBTSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7U0FDekI7UUFDRCxPQUFPLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDcEUsQ0FBQzs7cUhBM0lRLHdCQUF3QixrQkEyQmIsa0JBQWtCLGFBQ2xCLGFBQWE7eUdBNUJ4Qix3QkFBd0IseVVBV2hCLHdCQUF3QixxRUFXOUIsTUFBTSxtRUFWSCx3QkFBd0IsNEZBZjVCLEVBQUU7MkZBR0gsd0JBQXdCO2tCQUxwQyxTQUFTO21CQUFDO29CQUNQLFFBQVEsRUFBRSxtQkFBbUI7b0JBQzdCLFFBQVEsRUFBRSxFQUFFO29CQUNaLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxPQUFPO2lCQUNuRDs7MEJBNEJnQixNQUFNOzJCQUFDLGtCQUFrQjs7MEJBQ3pCLE1BQU07MkJBQUMsYUFBYTtzSEExQnhCLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBRUksSUFBSTtzQkFBYixNQUFNO2dCQUNHLE1BQU07c0JBQWYsTUFBTTtnQkFDRyxLQUFLO3NCQUFkLE1BQU07Z0JBRW9DLGdCQUFnQjtzQkFBMUQsZUFBZTt1QkFBQyx3QkFBd0I7Z0JBQ0QsYUFBYTtzQkFBcEQsWUFBWTt1QkFBQyx3QkFBd0I7Z0JBTW5CLGFBQWE7c0JBQS9CLE1BQU07Z0JBQ1ksY0FBYztzQkFBaEMsTUFBTTtnQkFDWSxRQUFRO3NCQUExQixNQUFNO2dCQUdHLE1BQU07c0JBRGYsU0FBUzt1QkFBQyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICAgIEFmdGVyVmlld0luaXQsXHJcbiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcclxuICAgIENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgQ29tcG9uZW50LFxyXG4gICAgQ29udGVudENoaWxkcmVuLFxyXG4gICAgRXZlbnRFbWl0dGVyLFxyXG4gICAgSW5qZWN0LFxyXG4gICAgSW5wdXQsXHJcbiAgICBPbkNoYW5nZXMsXHJcbiAgICBPdXRwdXQsXHJcbiAgICBRdWVyeUxpc3QsXHJcbiAgICBTaW1wbGVDaGFuZ2VzLFxyXG4gICAgVmlld0NoaWxkLFxyXG4gICAgVmlld0NoaWxkcmVuXHJcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHtGb3JtQXJyYXksIEZvcm1Hcm91cCwgTmdGb3JtfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcclxuaW1wb3J0IHtTdWJzY3JpcHRpb259IGZyb20gXCJyeGpzXCI7XHJcbmltcG9ydCB7Zmlyc3R9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xyXG5pbXBvcnQge1xyXG4gICAgRHluYW1pY0Zvcm1BcnJheU1vZGVsLFxyXG4gICAgRHluYW1pY0Zvcm1Db21wb25lbnQsXHJcbiAgICBEeW5hbWljRm9ybUNvbXBvbmVudFNlcnZpY2UsXHJcbiAgICBEeW5hbWljRm9ybUNvbnRyb2xFdmVudCxcclxuICAgIER5bmFtaWNGb3JtQ29udHJvbE1vZGVsLFxyXG4gICAgRHluYW1pY0Zvcm1Hcm91cE1vZGVsLFxyXG4gICAgRHluYW1pY0Zvcm1MYXlvdXQsXHJcbiAgICBEeW5hbWljRm9ybU1vZGVsLFxyXG4gICAgRHluYW1pY1RlbXBsYXRlRGlyZWN0aXZlXHJcbn0gZnJvbSBcIkBuZy1keW5hbWljLWZvcm1zL2NvcmVcIjtcclxuaW1wb3J0IHtFdmVudHNTZXJ2aWNlLCBPYnNlcnZhYmxlVXRpbHN9IGZyb20gXCJAc3RlbXkvbmd4LXV0aWxzXCI7XHJcbmltcG9ydCB7RHluYW1pY0Zvcm1TdGF0ZSwgSUR5bmFtaWNGb3JtLCBJRHluYW1pY0Zvcm1FdmVudH0gZnJvbSBcIi4uLy4uL2NvbW1vbi10eXBlc1wiO1xyXG5pbXBvcnQge0R5bmFtaWNGb3JtU2VydmljZX0gZnJvbSBcIi4uLy4uL3NlcnZpY2VzL2R5bmFtaWMtZm9ybS5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7Y29sbGVjdFBhdGhBYmxlfSBmcm9tIFwiLi4vLi4vdXRpbHMvbWlzY1wiO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogXCJkeW5hbWljLWJhc2UtZm9ybVwiLFxyXG4gICAgdGVtcGxhdGU6IFwiXCIsXHJcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LkRlZmF1bHRcclxufSlcclxuZXhwb3J0IGNsYXNzIER5bmFtaWNCYXNlRm9ybUNvbXBvbmVudCBleHRlbmRzIER5bmFtaWNGb3JtQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0LCBJRHluYW1pY0Zvcm0ge1xyXG5cclxuICAgIEBJbnB1dCgpIGdyb3VwOiBGb3JtR3JvdXA7XHJcbiAgICBASW5wdXQoKSBtb2RlbDogRHluYW1pY0Zvcm1Nb2RlbDtcclxuICAgIEBJbnB1dCgpIGxheW91dDogRHluYW1pY0Zvcm1MYXlvdXQ7XHJcbiAgICBASW5wdXQoKSBsYWJlbFByZWZpeDogc3RyaW5nO1xyXG5cclxuICAgIEBPdXRwdXQoKSBibHVyOiBFdmVudEVtaXR0ZXI8RHluYW1pY0Zvcm1Db250cm9sRXZlbnQ+O1xyXG4gICAgQE91dHB1dCgpIGNoYW5nZTogRXZlbnRFbWl0dGVyPER5bmFtaWNGb3JtQ29udHJvbEV2ZW50PjtcclxuICAgIEBPdXRwdXQoKSBmb2N1czogRXZlbnRFbWl0dGVyPER5bmFtaWNGb3JtQ29udHJvbEV2ZW50PjtcclxuXHJcbiAgICBAQ29udGVudENoaWxkcmVuKER5bmFtaWNUZW1wbGF0ZURpcmVjdGl2ZSkgY29udGVudFRlbXBsYXRlczogUXVlcnlMaXN0PER5bmFtaWNUZW1wbGF0ZURpcmVjdGl2ZT47XHJcbiAgICBAVmlld0NoaWxkcmVuKER5bmFtaWNUZW1wbGF0ZURpcmVjdGl2ZSkgdmlld1RlbXBsYXRlczogUXVlcnlMaXN0PER5bmFtaWNUZW1wbGF0ZURpcmVjdGl2ZT47XHJcblxyXG4gICAgZ2V0IHN0YXR1cygpOiBEeW5hbWljRm9ybVN0YXRlIHtcclxuICAgICAgICByZXR1cm4gIXRoaXMuZ3JvdXAgPyBudWxsIDogdGhpcy5ncm91cC5zdGF0dXMgYXMgRHluYW1pY0Zvcm1TdGF0ZTtcclxuICAgIH1cclxuXHJcbiAgICBAT3V0cHV0KCkgcmVhZG9ubHkgb25WYWx1ZUNoYW5nZTogRXZlbnRFbWl0dGVyPElEeW5hbWljRm9ybUV2ZW50PjtcclxuICAgIEBPdXRwdXQoKSByZWFkb25seSBvblN0YXR1c0NoYW5nZTogRXZlbnRFbWl0dGVyPElEeW5hbWljRm9ybT47XHJcbiAgICBAT3V0cHV0KCkgcmVhZG9ubHkgb25TdWJtaXQ6IEV2ZW50RW1pdHRlcjxJRHluYW1pY0Zvcm0+O1xyXG5cclxuICAgIEBWaWV3Q2hpbGQoTmdGb3JtKVxyXG4gICAgcHJvdGVjdGVkIG5nRm9ybTogTmdGb3JtO1xyXG4gICAgcHJvdGVjdGVkIHN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xyXG4gICAgcHJvdGVjdGVkIGdyb3VwU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XHJcblxyXG4gICAgY29uc3RydWN0b3IoQEluamVjdChEeW5hbWljRm9ybVNlcnZpY2UpIHJlYWRvbmx5IGZvcm1TZXJ2aWNlOiBEeW5hbWljRm9ybVNlcnZpY2UsXHJcbiAgICAgICAgICAgICAgICBASW5qZWN0KEV2ZW50c1NlcnZpY2UpIHJlYWRvbmx5IGV2ZW50czogRXZlbnRzU2VydmljZSxcclxuICAgICAgICAgICAgICAgIGNoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgICAgICAgICAgICAgIGNvbXBvbmVudFNlcnZpY2U6IER5bmFtaWNGb3JtQ29tcG9uZW50U2VydmljZSwpIHtcclxuICAgICAgICBzdXBlcihjaGFuZ2VEZXRlY3RvclJlZiwgY29tcG9uZW50U2VydmljZSk7XHJcbiAgICAgICAgdGhpcy5ibHVyID0gbmV3IEV2ZW50RW1pdHRlcjxEeW5hbWljRm9ybUNvbnRyb2xFdmVudD4oKTtcclxuICAgICAgICB0aGlzLmNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8RHluYW1pY0Zvcm1Db250cm9sRXZlbnQ+KCk7XHJcbiAgICAgICAgdGhpcy5mb2N1cyA9IG5ldyBFdmVudEVtaXR0ZXI8RHluYW1pY0Zvcm1Db250cm9sRXZlbnQ+KCk7XHJcbiAgICAgICAgdGhpcy5vblZhbHVlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxJRHluYW1pY0Zvcm1FdmVudD4oKTtcclxuICAgICAgICB0aGlzLm9uU3RhdHVzQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxJRHluYW1pY0Zvcm0+KCk7XHJcbiAgICAgICAgdGhpcy5vblN1Ym1pdCA9IG5ldyBFdmVudEVtaXR0ZXI8SUR5bmFtaWNGb3JtPigpO1xyXG4gICAgICAgIHRoaXMudGVtcGxhdGVzID0gbmV3IFF1ZXJ5TGlzdDxEeW5hbWljVGVtcGxhdGVEaXJlY3RpdmU+KCk7XHJcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7XHJcbiAgICAgICAgdGhpcy5ncm91cFN1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcclxuICAgICAgICB0aGlzLmxhYmVsUHJlZml4ID0gXCJsYWJlbFwiO1xyXG4gICAgfVxyXG5cclxuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmdyb3VwU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgICAgICAgaWYgKHRoaXMuZ3JvdXApIHtcclxuICAgICAgICAgICAgdGhpcy5ncm91cFN1YnNjcmlwdGlvbiA9IE9ic2VydmFibGVVdGlscy5tdWx0aVN1YnNjcmlwdGlvbihcclxuICAgICAgICAgICAgICAgIHRoaXMuZ3JvdXAuc3RhdHVzQ2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub25TdGF0dXNDaGFuZ2UuZW1pdCh0aGlzKTtcclxuICAgICAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICAgICAgdGhpcy5ncm91cC52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZvcm1TZXJ2aWNlLm5vdGlmeUNoYW5nZXModGhpcy5tb2RlbCwgdGhpcy5ncm91cCwgdGhpcy5tb2RlbCk7XHJcbiAgICAgICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlLnN1YnNjcmliZShldiA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vblZhbHVlQ2hhbmdlLmVtaXQoey4uLmV2LCBmb3JtOiB0aGlzfSk7XHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb24gPSBPYnNlcnZhYmxlVXRpbHMubXVsdGlTdWJzY3JpcHRpb24oXHJcbiAgICAgICAgICAgIE9ic2VydmFibGVVdGlscy5zdWJzY3JpYmUoXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgc3ViamVjdHM6IFt0aGlzLmNvbnRlbnRUZW1wbGF0ZXMuY2hhbmdlcywgdGhpcy52aWV3VGVtcGxhdGVzLmNoYW5nZXNdLFxyXG4gICAgICAgICAgICAgICAgICAgIGNiOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRlbXBsYXRlcyA9IHRoaXMuY29udGVudFRlbXBsYXRlcy50b0FycmF5KCkuY29uY2F0KHRoaXMudmlld1RlbXBsYXRlcy50b0FycmF5KCkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRlbXBsYXRlcy5yZXNldCh0ZW1wbGF0ZXMpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgdGhpcy5ldmVudHMubGFuZ3VhZ2VDaGFuZ2VkLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZvcm1TZXJ2aWNlLmRldGVjdENoYW5nZXModGhpcylcclxuICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgIHRoaXMubmdGb3JtLm5nU3VibWl0LnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9uU3VibWl0LmVtaXQodGhpcyk7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgICAgICBzdXBlci5uZ09uRGVzdHJveSgpO1xyXG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgICAgICAgdGhpcy5ncm91cFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGluc2VydEZvcm1BcnJheUdyb3VwKGluZGV4OiBudW1iZXIsIGZvcm1BcnJheTogRm9ybUFycmF5LCBmb3JtQXJyYXlNb2RlbDogRHluYW1pY0Zvcm1BcnJheU1vZGVsKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5mb3JtU2VydmljZS5pbnNlcnRGb3JtQXJyYXlHcm91cChpbmRleCwgZm9ybUFycmF5LCBmb3JtQXJyYXlNb2RlbCk7XHJcbiAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVtb3ZlRm9ybUFycmF5R3JvdXAoaW5kZXg6IG51bWJlciwgZm9ybUFycmF5OiBGb3JtQXJyYXksIGZvcm1BcnJheU1vZGVsOiBEeW5hbWljRm9ybUFycmF5TW9kZWwpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmZvcm1TZXJ2aWNlLnJlbW92ZUZvcm1BcnJheUdyb3VwKGluZGV4LCBmb3JtQXJyYXksIGZvcm1BcnJheU1vZGVsKTtcclxuICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcclxuICAgIH1cclxuXHJcbiAgICBtb3ZlRm9ybUFycmF5R3JvdXAoaW5kZXg6IG51bWJlciwgc3RlcDogbnVtYmVyLCBmb3JtQXJyYXk6IEZvcm1BcnJheSwgZm9ybUFycmF5TW9kZWw6IER5bmFtaWNGb3JtQXJyYXlNb2RlbCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuZm9ybVNlcnZpY2UubW92ZUZvcm1BcnJheUdyb3VwKGluZGV4LCBzdGVwLCBmb3JtQXJyYXksIGZvcm1BcnJheU1vZGVsKTtcclxuICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcclxuICAgIH1cclxuXHJcbiAgICBjbGVhckZvcm1BcnJheShmb3JtQXJyYXk6IEZvcm1BcnJheSwgZm9ybUFycmF5TW9kZWw6IER5bmFtaWNGb3JtQXJyYXlNb2RlbCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuZm9ybVNlcnZpY2UuY2xlYXJGb3JtQXJyYXkoZm9ybUFycmF5LCBmb3JtQXJyYXlNb2RlbCk7XHJcbiAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0Q2xhc3MobW9kZWw/OiBEeW5hbWljRm9ybUNvbnRyb2xNb2RlbCk6IHN0cmluZyB7XHJcbiAgICAgICAgY29uc3QgcGFydHMgPSBjb2xsZWN0UGF0aEFibGUobW9kZWwsIHAgPT4gcC5pZCk7XHJcbiAgICAgICAgaWYgKHBhcnRzLmxlbmd0aCA9PSAwKSByZXR1cm4gXCJcIjtcclxuICAgICAgICBpZiAobW9kZWwgaW5zdGFuY2VvZiBEeW5hbWljRm9ybUdyb3VwTW9kZWwpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGBmb3JtLWdyb3VwLSR7cGFydHMuam9pbihcIi1cIil9YDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGBmb3JtLWNvbnRyb2wtJHtwYXJ0cy5qb2luKFwiLVwiKX1gO1xyXG4gICAgfVxyXG5cclxuICAgIHZhbGlkYXRlKHNob3dFcnJvcnM6IGJvb2xlYW4gPSB0cnVlKTogUHJvbWlzZTxhbnk+IHtcclxuICAgICAgICBpZiAoIXRoaXMuZ3JvdXApIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8YW55PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuZ3JvdXAuc3RhdHVzQ2hhbmdlcy5waXBlKGZpcnN0KHN0YXR1cyA9PiBzdGF0dXMgPT0gXCJWQUxJRFwiIHx8IHN0YXR1cyA9PSBcIklOVkFMSURcIikpLnN1YnNjcmliZShzdGF0dXMgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHNob3dFcnJvcnMpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZvcm1TZXJ2aWNlLnNob3dFcnJvcnModGhpcyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFwiVkFMSURcIikge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUobnVsbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmVqZWN0KG51bGwpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgdGhpcy5ncm91cC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgc2VyaWFsaXplKHZhbGlkYXRlPzogYm9vbGVhbik6IFByb21pc2U8YW55PiB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmdyb3VwKSByZXR1cm4gbnVsbDtcclxuICAgICAgICBpZiAodmFsaWRhdGUpIHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy52YWxpZGF0ZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5mb3JtU2VydmljZS5zZXJpYWxpemUodGhpcy5tb2RlbCwgdGhpcy5ncm91cCk7XHJcbiAgICB9XHJcbn1cclxuIl19
@@ -0,0 +1,111 @@
1
+ import { Directive, EventEmitter, HostBinding, HostListener, Inject, Input, Output } from "@angular/core";
2
+ import { TOASTER_SERVICE } from "@stemy/ngx-utils";
3
+ import * as i0 from "@angular/core";
4
+ export class AsyncSubmitDirective {
5
+ constructor(toaster, cdr, elem, renderer) {
6
+ this.toaster = toaster;
7
+ this.cdr = cdr;
8
+ this.elem = elem;
9
+ this.renderer = renderer;
10
+ this.onSuccess = new EventEmitter();
11
+ this.onError = new EventEmitter();
12
+ if (elem.nativeElement.tagName !== "BUTTON")
13
+ return;
14
+ renderer.setAttribute(elem.nativeElement, "type", "button");
15
+ }
16
+ get isDisabled() {
17
+ return this.disabled;
18
+ }
19
+ set isDisabled(value) {
20
+ this.disabled = value;
21
+ if (value) {
22
+ this.renderer.setAttribute(this.elem.nativeElement, "disabled", "disabled");
23
+ return;
24
+ }
25
+ this.renderer.removeAttribute(this.elem.nativeElement, "disabled");
26
+ }
27
+ get isLoading() {
28
+ return this.loading;
29
+ }
30
+ ngOnInit() {
31
+ if (!this.form)
32
+ return;
33
+ this.isDisabled = this.form.status !== "VALID";
34
+ this.cdr.detectChanges();
35
+ this.onStatusChange = this.form.onStatusChange.subscribe(() => {
36
+ this.isDisabled = this.form.status !== "VALID";
37
+ this.cdr.detectChanges();
38
+ if (!this.callback || this.form.status == "PENDING")
39
+ return;
40
+ if (!this.disabled) {
41
+ this.callback();
42
+ }
43
+ this.callback = null;
44
+ });
45
+ this.onSubmit = this.form.onSubmit.subscribe(() => this.callMethod());
46
+ }
47
+ ngOnDestroy() {
48
+ if (this.onStatusChange)
49
+ this.onStatusChange.unsubscribe();
50
+ if (this.onSubmit)
51
+ this.onSubmit.unsubscribe();
52
+ }
53
+ click() {
54
+ this.callback = () => this.callMethod();
55
+ if (this.form.status !== "VALID" && this.form.status !== "INVALID")
56
+ return;
57
+ this.callback();
58
+ this.callback = null;
59
+ }
60
+ callMethod() {
61
+ if (this.loading)
62
+ return;
63
+ this.loading = true;
64
+ this.method(this.form, this.context).then(result => {
65
+ this.loading = false;
66
+ if (result) {
67
+ this.onSuccess.emit(result);
68
+ this.toaster.success(result.message, result.context);
69
+ }
70
+ }, reason => {
71
+ if (!reason || !reason.message)
72
+ throw new Error("Reason must implement IAsyncMessage interface");
73
+ this.loading = false;
74
+ this.onError.emit(reason);
75
+ this.toaster.error(reason.message, reason.context);
76
+ });
77
+ }
78
+ }
79
+ AsyncSubmitDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.8", ngImport: i0, type: AsyncSubmitDirective, deps: [{ token: TOASTER_SERVICE }, { token: i0.ChangeDetectorRef }, { token: i0.ElementRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Directive });
80
+ AsyncSubmitDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.3.8", type: AsyncSubmitDirective, selector: "[async-submit]", inputs: { method: ["async-submit", "method"], form: "form", context: "context" }, outputs: { onSuccess: "onSuccess", onError: "onError" }, host: { listeners: { "click": "click()" }, properties: { "class.disabled": "this.isDisabled", "class.loading": "this.isLoading" } }, exportAs: ["async-submit"], ngImport: i0 });
81
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.8", ngImport: i0, type: AsyncSubmitDirective, decorators: [{
82
+ type: Directive,
83
+ args: [{
84
+ selector: "[async-submit]",
85
+ exportAs: "async-submit"
86
+ }]
87
+ }], ctorParameters: function () { return [{ type: undefined, decorators: [{
88
+ type: Inject,
89
+ args: [TOASTER_SERVICE]
90
+ }] }, { type: i0.ChangeDetectorRef }, { type: i0.ElementRef }, { type: i0.Renderer2 }]; }, propDecorators: { method: [{
91
+ type: Input,
92
+ args: ["async-submit"]
93
+ }], form: [{
94
+ type: Input
95
+ }], context: [{
96
+ type: Input
97
+ }], onSuccess: [{
98
+ type: Output
99
+ }], onError: [{
100
+ type: Output
101
+ }], isDisabled: [{
102
+ type: HostBinding,
103
+ args: ["class.disabled"]
104
+ }], isLoading: [{
105
+ type: HostBinding,
106
+ args: ["class.loading"]
107
+ }], click: [{
108
+ type: HostListener,
109
+ args: ["click"]
110
+ }] } });
111
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXN5bmMtc3VibWl0LmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9uZ3gtZHluYW1pYy1mb3JtL2RpcmVjdGl2ZXMvYXN5bmMtc3VibWl0LmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUgsU0FBUyxFQUVULFlBQVksRUFDWixXQUFXLEVBQ1gsWUFBWSxFQUNaLE1BQU0sRUFDTixLQUFLLEVBR0wsTUFBTSxFQUVULE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBaUMsZUFBZSxFQUFDLE1BQU0sa0JBQWtCLENBQUM7O0FBT2pGLE1BQU0sT0FBTyxvQkFBb0I7SUFrQzdCLFlBQTZDLE9BQXdCLEVBQ2hELEdBQXNCLEVBQ3RCLElBQWdCLEVBQ2hCLFFBQW1CO1FBSEssWUFBTyxHQUFQLE9BQU8sQ0FBaUI7UUFDaEQsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFDdEIsU0FBSSxHQUFKLElBQUksQ0FBWTtRQUNoQixhQUFRLEdBQVIsUUFBUSxDQUFXO1FBQ3BDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxZQUFZLEVBQWlCLENBQUM7UUFDbkQsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLFlBQVksRUFBaUIsQ0FBQztRQUNqRCxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxLQUFLLFFBQVE7WUFBRSxPQUFPO1FBQ3BELFFBQVEsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDaEUsQ0FBQztJQTNCRCxJQUNJLFVBQVU7UUFDVixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDekIsQ0FBQztJQUVELElBQUksVUFBVSxDQUFDLEtBQWM7UUFDekIsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7UUFDdEIsSUFBSSxLQUFLLEVBQUU7WUFDUCxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVks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Q0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1lBQ3JCLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzFCLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3ZELENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQzs7aUhBekZRLG9CQUFvQixrQkFrQ1QsZUFBZTtxR0FsQzFCLG9CQUFvQjsyRkFBcEIsb0JBQW9CO2tCQUpoQyxTQUFTO21CQUFDO29CQUNQLFFBQVEsRUFBRSxnQkFBZ0I7b0JBQzFCLFFBQVEsRUFBRSxjQUFjO2lCQUMzQjs7MEJBbUNnQixNQUFNOzJCQUFDLGVBQWU7NkhBaENaLE1BQU07c0JBQTVCLEtBQUs7dUJBQUMsY0FBYztnQkFDWixJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUVJLFNBQVM7c0JBQWxCLE1BQU07Z0JBQ0csT0FBTztzQkFBaEIsTUFBTTtnQkFTSCxVQUFVO3NCQURiLFdBQVc7dUJBQUMsZ0JBQWdCO2dCQWV6QixTQUFTO3NCQURaLFdBQVc7dUJBQUMsZUFBZTtnQkFxQzVCLEtBQUs7c0JBREosWUFBWTt1QkFBQyxPQUFPIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICAgIENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgRGlyZWN0aXZlLFxyXG4gICAgRWxlbWVudFJlZixcclxuICAgIEV2ZW50RW1pdHRlcixcclxuICAgIEhvc3RCaW5kaW5nLFxyXG4gICAgSG9zdExpc3RlbmVyLFxyXG4gICAgSW5qZWN0LFxyXG4gICAgSW5wdXQsXHJcbiAgICBPbkRlc3Ryb3ksXHJcbiAgICBPbkluaXQsXHJcbiAgICBPdXRwdXQsXHJcbiAgICBSZW5kZXJlcjJcclxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQge1N1YnNjcmlwdGlvbn0gZnJvbSBcInJ4anNcIjtcclxuaW1wb3J0IHtJQXN5bmNNZXNzYWdlLCBJVG9hc3RlclNlcnZpY2UsIFRPQVNURVJfU0VSVklDRX0gZnJvbSBcIkBzdGVteS9uZ3gtdXRpbHNcIjtcclxuaW1wb3J0IHtBc3luY1N1Ym1pdE1ldGhvZCwgSUR5bmFtaWNGb3JtfSBmcm9tIFwiLi4vY29tbW9uLXR5cGVzXCI7XHJcblxyXG5ARGlyZWN0aXZlKHtcclxuICAgIHNlbGVjdG9yOiBcIlthc3luYy1zdWJtaXRdXCIsXHJcbiAgICBleHBvcnRBczogXCJhc3luYy1zdWJtaXRcIlxyXG59KVxyXG5leHBvcnQgY2xhc3MgQXN5bmNTdWJtaXREaXJlY3RpdmUgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XHJcblxyXG4gICAgQElucHV0KFwiYXN5bmMtc3VibWl0XCIpIG1ldGhvZDogQXN5bmNTdWJtaXRNZXRob2Q7XHJcbiAgICBASW5wdXQoKSBmb3JtOiBJRHluYW1pY0Zvcm07XHJcbiAgICBASW5wdXQoKSBjb250ZXh0OiBhbnk7XHJcblxyXG4gICAgQE91dHB1dCgpIG9uU3VjY2VzczogRXZlbnRFbWl0dGVyPElBc3luY01lc3NhZ2U+O1xyXG4gICAgQE91dHB1dCgpIG9uRXJyb3I6IEV2ZW50RW1pdHRlcjxJQXN5bmNNZXNzYWdlPjtcclxuXHJcbiAgICBwcml2YXRlIGxvYWRpbmc6IGJvb2xlYW47XHJcbiAgICBwcml2YXRlIGRpc2FibGVkOiBib29sZWFuO1xyXG4gICAgcHJpdmF0ZSBjYWxsYmFjazogRnVuY3Rpb247XHJcbiAgICBwcml2YXRlIG9uU3RhdHVzQ2hhbmdlOiBTdWJzY3JpcHRpb247XHJcbiAgICBwcml2YXRlIG9uU3VibWl0OiBTdWJzY3JpcHRpb247XHJcblxyXG4gICAgQEhvc3RCaW5kaW5nKFwiY2xhc3MuZGlzYWJsZWRcIilcclxuICAgIGdldCBpc0Rpc2FibGVkKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRpc2FibGVkO1xyXG4gICAgfVxyXG5cclxuICAgIHNldCBpc0Rpc2FibGVkKHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICAgICAgdGhpcy5kaXNhYmxlZCA9IHZhbHVlO1xyXG4gICAgICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldEF0dHJpYnV0ZSh0aGlzLmVsZW0ubmF0aXZlRWxlbWVudCwgXCJkaXNhYmxlZFwiLCBcImRpc2FibGVkXCIpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQXR0cmlidXRlKHRoaXMuZWxlbS5uYXRpdmVFbGVtZW50LCBcImRpc2FibGVkXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIEBIb3N0QmluZGluZyhcImNsYXNzLmxvYWRpbmdcIilcclxuICAgIGdldCBpc0xvYWRpbmcoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubG9hZGluZztcclxuICAgIH1cclxuXHJcbiAgICBjb25zdHJ1Y3RvcihASW5qZWN0KFRPQVNURVJfU0VSVklDRSkgcHJpdmF0ZSB0b2FzdGVyOiBJVG9hc3RlclNlcnZpY2UsXHJcbiAgICAgICAgICAgICAgICByZWFkb25seSBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgICAgICAgICAgICAgcmVhZG9ubHkgZWxlbTogRWxlbWVudFJlZixcclxuICAgICAgICAgICAgICAgIHJlYWRvbmx5IHJlbmRlcmVyOiBSZW5kZXJlcjIpIHtcclxuICAgICAgICB0aGlzLm9uU3VjY2VzcyA9IG5ldyBFdmVudEVtaXR0ZXI8SUFzeW5jTWVzc2FnZT4oKTtcclxuICAgICAgICB0aGlzLm9uRXJyb3IgPSBuZXcgRXZlbnRFbWl0dGVyPElBc3luY01lc3NhZ2U+KCk7XHJcbiAgICAgICAgaWYgKGVsZW0ubmF0aXZlRWxlbWVudC50YWdOYW1lICE9PSBcIkJVVFRPTlwiKSByZXR1cm47XHJcbiAgICAgICAgcmVuZGVyZXIuc2V0QXR0cmlidXRlKGVsZW0ubmF0aXZlRWxlbWVudCwgXCJ0eXBlXCIsIFwiYnV0dG9uXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgICAgIGlmICghdGhpcy5mb3JtKSByZXR1cm47XHJcbiAgICAgICAgdGhpcy5pc0Rpc2FibGVkID0gdGhpcy5mb3JtLnN0YXR1cyAhPT0gXCJWQUxJRFwiO1xyXG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICB0aGlzLm9uU3RhdHVzQ2hhbmdlID0gdGhpcy5mb3JtLm9uU3RhdHVzQ2hhbmdlLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuaXNEaXNhYmxlZCA9IHRoaXMuZm9ybS5zdGF0dXMgIT09IFwiVkFMSURcIjtcclxuICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuY2FsbGJhY2sgfHwgdGhpcy5mb3JtLnN0YXR1cyA9PSBcIlBFTkRJTkdcIikgcmV0dXJuO1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuZGlzYWJsZWQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2FsbGJhY2soKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmNhbGxiYWNrID0gbnVsbDtcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLm9uU3VibWl0ID0gdGhpcy5mb3JtLm9uU3VibWl0LnN1YnNjcmliZSgoKSA9PiB0aGlzLmNhbGxNZXRob2QoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMub25TdGF0dXNDaGFuZ2UpIHRoaXMub25TdGF0dXNDaGFuZ2UudW5zdWJzY3JpYmUoKTtcclxuICAgICAgICBpZiAodGhpcy5vblN1Ym1pdCkgdGhpcy5vblN1Ym1pdC51bnN1YnNjcmliZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIEBIb3N0TGlzdGVuZXIoXCJjbGlja1wiKVxyXG4gICAgY2xpY2soKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5jYWxsYmFjayA9ICgpID0+IHRoaXMuY2FsbE1ldGhvZCgpO1xyXG4gICAgICAgIGlmICh0aGlzLmZvcm0uc3RhdHVzICE9PSBcIlZBTElEXCIgJiYgdGhpcy5mb3JtLnN0YXR1cyAhPT0gXCJJTlZBTElEXCIpIHJldHVybjtcclxuICAgICAgICB0aGlzLmNhbGxiYWNrKCk7XHJcbiAgICAgICAgdGhpcy5jYWxsYmFjayA9IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgY2FsbE1ldGhvZCgpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5sb2FkaW5nKSByZXR1cm47XHJcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLm1ldGhvZCh0aGlzLmZvcm0sIHRoaXMuY29udGV4dCkudGhlbihyZXN1bHQgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vblN1Y2Nlc3MuZW1pdChyZXN1bHQpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy50b2FzdGVyLnN1Y2Nlc3MocmVzdWx0Lm1lc3NhZ2UsIHJlc3VsdC5jb250ZXh0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sIHJlYXNvbiA9PiB7XHJcbiAgICAgICAgICAgIGlmICghcmVhc29uIHx8ICFyZWFzb24ubWVzc2FnZSlcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlJlYXNvbiBtdXN0IGltcGxlbWVudCBJQXN5bmNNZXNzYWdlIGludGVyZmFjZVwiKTtcclxuICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMub25FcnJvci5lbWl0KHJlYXNvbik7XHJcbiAgICAgICAgICAgIHRoaXMudG9hc3Rlci5lcnJvcihyZWFzb24ubWVzc2FnZSwgcmVhc29uLmNvbnRleHQpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59XHJcbiJdfQ==
@@ -0,0 +1,22 @@
1
+ import { AsyncSubmitDirective } from "./directives/async-submit.directive";
2
+ import { DynamicBaseFormComponent } from "./components/base/dynamic-base-form.component";
3
+ import { DynamicBaseFormArrayComponent } from "./components/base/dynamic-base-form-array.component";
4
+ import { DynamicBaseFormControlContainerComponent } from "./components/base/dynamic-base-form-control-container.component";
5
+ import { DynamicBaseFormGroupComponent } from "./components/base/dynamic-base-form-group.component";
6
+ // --- Components ---
7
+ export const components = [
8
+ DynamicBaseFormComponent,
9
+ DynamicBaseFormArrayComponent,
10
+ DynamicBaseFormControlContainerComponent,
11
+ DynamicBaseFormGroupComponent
12
+ ];
13
+ // --- Directives ---
14
+ export const directives = [
15
+ AsyncSubmitDirective,
16
+ ];
17
+ // --- Pipes ---
18
+ export const pipes = [];
19
+ export function defaultFormControlProvider() {
20
+ return () => null;
21
+ }
22
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWR5bmFtaWMtZm9ybS5pbXBvcnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL25neC1keW5hbWljLWZvcm0vbmd4LWR5bmFtaWMtZm9ybS5pbXBvcnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLHFDQUFxQyxDQUFDO0FBRXpFLE9BQU8sRUFBQyx3QkFBd0IsRUFBQyxNQUFNLCtDQUErQyxDQUFDO0FBQ3ZGLE9BQU8sRUFBQyw2QkFBNkIsRUFBQyxNQUFNLHFEQUFxRCxDQUFDO0FBQ2xHLE9BQU8sRUFDSCx3Q0FBd0MsRUFDM0MsTUFBTSxpRUFBaUUsQ0FBQztBQUN6RSxPQUFPLEVBQUMsNkJBQTZCLEVBQUMsTUFBTSxxREFBcUQsQ0FBQztBQUdsRyxxQkFBcUI7QUFDckIsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3RCLHdCQUF3QjtJQUN4Qiw2QkFBNkI7SUFDN0Isd0NBQXdDO0lBQ3hDLDZCQUE2QjtDQUNoQyxDQUFDO0FBRUYscUJBQXFCO0FBQ3JCLE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRztJQUN0QixvQkFBb0I7Q0FDdkIsQ0FBQztBQUVGLGdCQUFnQjtBQUNoQixNQUFNLENBQUMsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDO0FBRXhCLE1BQU0sVUFBVSwwQkFBMEI7SUFDdEMsT0FBTyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUM7QUFDdEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7QXN5bmNTdWJtaXREaXJlY3RpdmV9IGZyb20gXCIuL2RpcmVjdGl2ZXMvYXN5bmMtc3VibWl0LmRpcmVjdGl2ZVwiO1xyXG5cclxuaW1wb3J0IHtEeW5hbWljQmFzZUZvcm1Db21wb25lbnR9IGZyb20gXCIuL2NvbXBvbmVudHMvYmFzZS9keW5hbWljLWJhc2UtZm9ybS5jb21wb25lbnRcIjtcclxuaW1wb3J0IHtEeW5hbWljQmFzZUZvcm1BcnJheUNvbXBvbmVudH0gZnJvbSBcIi4vY29tcG9uZW50cy9iYXNlL2R5bmFtaWMtYmFzZS1mb3JtLWFycmF5LmNvbXBvbmVudFwiO1xyXG5pbXBvcnQge1xyXG4gICAgRHluYW1pY0Jhc2VGb3JtQ29udHJvbENvbnRhaW5lckNvbXBvbmVudFxyXG59IGZyb20gXCIuL2NvbXBvbmVudHMvYmFzZS9keW5hbWljLWJhc2UtZm9ybS1jb250cm9sLWNvbnRhaW5lci5jb21wb25lbnRcIjtcclxuaW1wb3J0IHtEeW5hbWljQmFzZUZvcm1Hcm91cENvbXBvbmVudH0gZnJvbSBcIi4vY29tcG9uZW50cy9iYXNlL2R5bmFtaWMtYmFzZS1mb3JtLWdyb3VwLmNvbXBvbmVudFwiO1xyXG5pbXBvcnQge0R5bmFtaWNGb3JtQ29udHJvbE1hcEZufSBmcm9tIFwiQG5nLWR5bmFtaWMtZm9ybXMvY29yZS9saWIvc2VydmljZS9keW5hbWljLWZvcm0tY29tcG9uZW50LnNlcnZpY2VcIjtcclxuXHJcbi8vIC0tLSBDb21wb25lbnRzIC0tLVxyXG5leHBvcnQgY29uc3QgY29tcG9uZW50cyA9IFtcclxuICAgIER5bmFtaWNCYXNlRm9ybUNvbXBvbmVudCxcclxuICAgIER5bmFtaWNCYXNlRm9ybUFycmF5Q29tcG9uZW50LFxyXG4gICAgRHluYW1pY0Jhc2VGb3JtQ29udHJvbENvbnRhaW5lckNvbXBvbmVudCxcclxuICAgIER5bmFtaWNCYXNlRm9ybUdyb3VwQ29tcG9uZW50XHJcbl07XHJcblxyXG4vLyAtLS0gRGlyZWN0aXZlcyAtLS1cclxuZXhwb3J0IGNvbnN0IGRpcmVjdGl2ZXMgPSBbXHJcbiAgICBBc3luY1N1Ym1pdERpcmVjdGl2ZSxcclxuXTtcclxuXHJcbi8vIC0tLSBQaXBlcyAtLS1cclxuZXhwb3J0IGNvbnN0IHBpcGVzID0gW107XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZGVmYXVsdEZvcm1Db250cm9sUHJvdmlkZXIoKTogRHluYW1pY0Zvcm1Db250cm9sTWFwRm4ge1xyXG4gICAgcmV0dXJuICgpID0+IG51bGw7XHJcbn1cclxuIl19
@@ -0,0 +1,115 @@
1
+ import { Injector, NgModule } from "@angular/core";
2
+ import { CommonModule } from "@angular/common";
3
+ import { FormsModule, NG_VALIDATORS, ReactiveFormsModule } from "@angular/forms";
4
+ import { DYNAMIC_FORM_CONTROL_MAP_FN, DYNAMIC_VALIDATORS, DynamicFormService as BaseDynamicFormService } from "@ng-dynamic-forms/core";
5
+ import { NgxUtilsModule } from "@stemy/ngx-utils";
6
+ import { validateItemsMaxLength, validateItemsMaxValue, validateItemsMinLength, validateItemsMinValue, validateJSON, validatePhone, validateRequiredTranslation } from "./utils/validators";
7
+ import { DynamicFormService } from "./services/dynamic-form.service";
8
+ import { components, defaultFormControlProvider, directives, pipes } from "./ngx-dynamic-form.imports";
9
+ import * as i0 from "@angular/core";
10
+ import * as i1 from "./components/base/dynamic-base-form.component";
11
+ import * as i2 from "./components/base/dynamic-base-form-array.component";
12
+ import * as i3 from "./components/base/dynamic-base-form-control-container.component";
13
+ import * as i4 from "./components/base/dynamic-base-form-group.component";
14
+ import * as i5 from "./directives/async-submit.directive";
15
+ export class NgxDynamicFormModule {
16
+ static forRoot(config) {
17
+ return {
18
+ ngModule: NgxDynamicFormModule,
19
+ providers: [
20
+ DynamicFormService,
21
+ {
22
+ provide: BaseDynamicFormService,
23
+ useExisting: DynamicFormService
24
+ },
25
+ {
26
+ provide: DYNAMIC_FORM_CONTROL_MAP_FN,
27
+ useFactory: (config?.controlProvider || defaultFormControlProvider),
28
+ deps: [Injector]
29
+ }
30
+ ]
31
+ };
32
+ }
33
+ }
34
+ NgxDynamicFormModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.8", ngImport: i0, type: NgxDynamicFormModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
35
+ NgxDynamicFormModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.3.8", ngImport: i0, type: NgxDynamicFormModule, declarations: [i1.DynamicBaseFormComponent, i2.DynamicBaseFormArrayComponent, i3.DynamicBaseFormControlContainerComponent, i4.DynamicBaseFormGroupComponent, i5.AsyncSubmitDirective], imports: [CommonModule,
36
+ FormsModule,
37
+ ReactiveFormsModule,
38
+ NgxUtilsModule], exports: [i1.DynamicBaseFormComponent, i2.DynamicBaseFormArrayComponent, i3.DynamicBaseFormControlContainerComponent, i4.DynamicBaseFormGroupComponent, i5.AsyncSubmitDirective, FormsModule,
39
+ ReactiveFormsModule,
40
+ NgxUtilsModule] });
41
+ NgxDynamicFormModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.3.8", ngImport: i0, type: NgxDynamicFormModule, providers: [
42
+ ...pipes,
43
+ { provide: NG_VALIDATORS, useValue: validateJSON, multi: true },
44
+ { provide: NG_VALIDATORS, useValue: validateRequiredTranslation, multi: true },
45
+ { provide: NG_VALIDATORS, useValue: validateItemsMinLength, multi: true },
46
+ { provide: NG_VALIDATORS, useValue: validateItemsMaxLength, multi: true },
47
+ { provide: NG_VALIDATORS, useValue: validateItemsMinValue, multi: true },
48
+ { provide: NG_VALIDATORS, useValue: validateItemsMaxValue, multi: true },
49
+ {
50
+ provide: DYNAMIC_VALIDATORS,
51
+ useValue: new Map([
52
+ ["json", validateJSON],
53
+ ["requiredTranslation", validateRequiredTranslation],
54
+ ["phone", validatePhone],
55
+ ["itemsMinLength", validateItemsMinLength],
56
+ ["itemsMaxLength", validateItemsMaxLength],
57
+ ["itemsMinValue", validateItemsMinValue],
58
+ ["itemsMaxValue", validateItemsMaxValue],
59
+ ])
60
+ }
61
+ ], imports: [[
62
+ CommonModule,
63
+ FormsModule,
64
+ ReactiveFormsModule,
65
+ NgxUtilsModule
66
+ ], FormsModule,
67
+ ReactiveFormsModule,
68
+ NgxUtilsModule] });
69
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.8", ngImport: i0, type: NgxDynamicFormModule, decorators: [{
70
+ type: NgModule,
71
+ args: [{
72
+ declarations: [
73
+ ...components,
74
+ ...directives,
75
+ ...pipes
76
+ ],
77
+ imports: [
78
+ CommonModule,
79
+ FormsModule,
80
+ ReactiveFormsModule,
81
+ NgxUtilsModule
82
+ ],
83
+ exports: [
84
+ ...components,
85
+ ...directives,
86
+ ...pipes,
87
+ FormsModule,
88
+ ReactiveFormsModule,
89
+ NgxUtilsModule
90
+ ],
91
+ entryComponents: components,
92
+ providers: [
93
+ ...pipes,
94
+ { provide: NG_VALIDATORS, useValue: validateJSON, multi: true },
95
+ { provide: NG_VALIDATORS, useValue: validateRequiredTranslation, multi: true },
96
+ { provide: NG_VALIDATORS, useValue: validateItemsMinLength, multi: true },
97
+ { provide: NG_VALIDATORS, useValue: validateItemsMaxLength, multi: true },
98
+ { provide: NG_VALIDATORS, useValue: validateItemsMinValue, multi: true },
99
+ { provide: NG_VALIDATORS, useValue: validateItemsMaxValue, multi: true },
100
+ {
101
+ provide: DYNAMIC_VALIDATORS,
102
+ useValue: new Map([
103
+ ["json", validateJSON],
104
+ ["requiredTranslation", validateRequiredTranslation],
105
+ ["phone", validatePhone],
106
+ ["itemsMinLength", validateItemsMinLength],
107
+ ["itemsMaxLength", validateItemsMaxLength],
108
+ ["itemsMinValue", validateItemsMinValue],
109
+ ["itemsMaxValue", validateItemsMaxValue],
110
+ ])
111
+ }
112
+ ]
113
+ }]
114
+ }] });
115
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWR5bmFtaWMtZm9ybS5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbmd4LWR5bmFtaWMtZm9ybS9uZ3gtZHluYW1pYy1mb3JtLm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsUUFBUSxFQUF1QixRQUFRLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDdEUsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQzdDLE9BQU8sRUFBQyxXQUFXLEVBQUUsYUFBYSxFQUFFLG1CQUFtQixFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDL0UsT0FBTyxFQUNILDJCQUEyQixFQUMzQixrQkFBa0IsRUFDbEIsa0JBQWtCLElBQUksc0JBQXNCLEVBRy9DLE1BQU0sd0JBQXdCLENBQUM7QUFDaEMsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBRWhELE9BQU8sRUFDSCxzQkFBc0IsRUFDdEIscUJBQXFCLEVBQ3JCLHNCQUFzQixFQUN0QixxQkFBcUIsRUFDckIsWUFBWSxFQUNaLGFBQWEsRUFDYiwyQkFBMkIsRUFDOUIsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSxpQ0FBaUMsQ0FBQztBQUNuRSxPQUFPLEVBQUMsVUFBVSxFQUFFLDBCQUEwQixFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQzs7Ozs7OztBQThDckcsTUFBTSxPQUFPLG9CQUFvQjtJQUU3QixNQUFNLENBQUMsT0FBTyxDQUFDLE1BQWlDO1FBQzVDLE9BQU87WUFDSCxRQUFRLEVBQUUsb0JBQW9CO1lBQzlCLFNBQVMsRUFBRTtnQkFDUCxrQkFBa0I7Z0JBQ2xCO29CQUNJLE9BQU8sRUFBRSxzQkFBc0I7b0JBQy9CLFdBQVcsRUFBRSxrQkFBa0I7aUJBQ2xDO2dCQUNEO29CQUNJLE9BQU8sRUFBRSwyQkFBMkI7b0JB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RUFBQzt3QkFDdEUsRUFBQyxPQUFPLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxxQkFBcUIsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFDO3dCQUN0RTs0QkFDSSxPQUFPLEVBQUUsa0JBQWtCOzRCQUMzQixRQUFRLEVBQUUsSUFBSSxHQUFHLENBQXVDO2dDQUNwRCxDQUFDLE1BQU0sRUFBRSxZQUFZLENBQUM7Z0NBQ3RCLENBQUMscUJBQXFCLEVBQUUsMkJBQTJCLENBQUM7Z0NBQ3BELENBQUMsT0FBTyxFQUFFLGFBQWEsQ0FBQztnQ0FDeEIsQ0FBQyxnQkFBZ0IsRUFBRSxzQkFBc0IsQ0FBQztnQ0FDMUMsQ0FBQyxnQkFBZ0IsRUFBRSxzQkFBc0IsQ0FBQztnQ0FDMUMsQ0FBQyxlQUFlLEVBQUUscUJBQXFCLENBQUM7Z0NBQ3hDLENBQUMsZUFBZSxFQUFFLHFCQUFxQixDQUFDOzZCQUMzQyxDQUFDO3lCQUNMO3FCQUNKO2lCQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtJbmplY3RvciwgTW9kdWxlV2l0aFByb3ZpZGVycywgTmdNb2R1bGV9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7Q29tbW9uTW9kdWxlfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uXCI7XHJcbmltcG9ydCB7Rm9ybXNNb2R1bGUsIE5HX1ZBTElEQVRPUlMsIFJlYWN0aXZlRm9ybXNNb2R1bGV9IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xyXG5pbXBvcnQge1xyXG4gICAgRFlOQU1JQ19GT1JNX0NPTlRST0xfTUFQX0ZOLFxyXG4gICAgRFlOQU1JQ19WQUxJREFUT1JTLFxyXG4gICAgRHluYW1pY0Zvcm1TZXJ2aWNlIGFzIEJhc2VEeW5hbWljRm9ybVNlcnZpY2UsXHJcbiAgICBWYWxpZGF0b3IsXHJcbiAgICBWYWxpZGF0b3JGYWN0b3J5XHJcbn0gZnJvbSBcIkBuZy1keW5hbWljLWZvcm1zL2NvcmVcIjtcclxuaW1wb3J0IHtOZ3hVdGlsc01vZHVsZX0gZnJvbSBcIkBzdGVteS9uZ3gtdXRpbHNcIjtcclxuXHJcbmltcG9ydCB7XHJcbiAgICB2YWxpZGF0ZUl0ZW1zTWF4TGVuZ3RoLFxyXG4gICAgdmFsaWRhdGVJdGVtc01heFZhbHVlLFxyXG4gICAgdmFsaWRhdGVJdGVtc01pbkxlbmd0aCxcclxuICAgIHZhbGlkYXRlSXRlbXNNaW5WYWx1ZSxcclxuICAgIHZhbGlkYXRlSlNPTixcclxuICAgIHZhbGlkYXRlUGhvbmUsXHJcbiAgICB2YWxpZGF0ZVJlcXVpcmVkVHJhbnNsYXRpb25cclxufSBmcm9tIFwiLi91dGlscy92YWxpZGF0b3JzXCI7XHJcbmltcG9ydCB7RHluYW1pY0Zvcm1TZXJ2aWNlfSBmcm9tIFwiLi9zZXJ2aWNlcy9keW5hbWljLWZvcm0uc2VydmljZVwiO1xyXG5pbXBvcnQge2NvbXBvbmVudHMsIGRlZmF1bHRGb3JtQ29udHJvbFByb3ZpZGVyLCBkaXJlY3RpdmVzLCBwaXBlc30gZnJvbSBcIi4vbmd4LWR5bmFtaWMtZm9ybS5pbXBvcnRzXCI7XHJcbmltcG9ydCB7SUR5bmFtaWNGb3JtTW9kdWxlQ29uZmlnfSBmcm9tIFwiLi9jb21tb24tdHlwZXNcIjtcclxuXHJcbkBOZ01vZHVsZSh7XHJcbiAgICBkZWNsYXJhdGlvbnM6IFtcclxuICAgICAgICAuLi5jb21wb25lbnRzLFxyXG4gICAgICAgIC4uLmRpcmVjdGl2ZXMsXHJcbiAgICAgICAgLi4ucGlwZXNcclxuICAgIF0sXHJcbiAgICBpbXBvcnRzOiBbXHJcbiAgICAgICAgQ29tbW9uTW9kdWxlLFxyXG4gICAgICAgIEZvcm1zTW9kdWxlLFxyXG4gICAgICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXHJcbiAgICAgICAgTmd4VXRpbHNNb2R1bGVcclxuICAgIF0sXHJcbiAgICBleHBvcnRzOiBbXHJcbiAgICAgICAgLi4uY29tcG9uZW50cyxcclxuICAgICAgICAuLi5kaXJlY3RpdmVzLFxyXG4gICAgICAgIC4uLnBpcGVzLFxyXG4gICAgICAgIEZvcm1zTW9kdWxlLFxyXG4gICAgICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXHJcbiAgICAgICAgTmd4VXRpbHNNb2R1bGVcclxuICAgIF0sXHJcbiAgICBlbnRyeUNvbXBvbmVudHM6IGNvbXBvbmVudHMsXHJcbiAgICBwcm92aWRlcnM6IFtcclxuICAgICAgICAuLi5waXBlcyxcclxuICAgICAgICB7cHJvdmlkZTogTkdfVkFMSURBVE9SUywgdXNlVmFsdWU6IHZhbGlkYXRlSlNPTiwgbXVsdGk6IHRydWV9LFxyXG4gICAgICAgIHtwcm92aWRlOiBOR19WQUxJREFUT1JTLCB1c2VWYWx1ZTogdmFsaWRhdGVSZXF1aXJlZFRyYW5zbGF0aW9uLCBtdWx0aTogdHJ1ZX0sXHJcbiAgICAgICAge3Byb3ZpZGU6IE5HX1ZBTElEQVRPUlMsIHVzZVZhbHVlOiB2YWxpZGF0ZUl0ZW1zTWluTGVuZ3RoLCBtdWx0aTogdHJ1ZX0sXHJcbiAgICAgICAge3Byb3ZpZGU6IE5HX1ZBTElEQVRPUlMsIHVzZVZhbHVlOiB2YWxpZGF0ZUl0ZW1zTWF4TGVuZ3RoLCBtdWx0aTogdHJ1ZX0sXHJcbiAgICAgICAge3Byb3ZpZGU6IE5HX1ZBTElEQVRPUlMsIHVzZVZhbHVlOiB2YWxpZGF0ZUl0ZW1zTWluVmFsdWUsIG11bHRpOiB0cnVlfSxcclxuICAgICAgICB7cHJvdmlkZTogTkdfVkFMSURBVE9SUywgdXNlVmFsdWU6IHZhbGlkYXRlSXRlbXNNYXhWYWx1ZSwgbXVsdGk6IHRydWV9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcHJvdmlkZTogRFlOQU1JQ19WQUxJREFUT1JTLFxyXG4gICAgICAgICAgICB1c2VWYWx1ZTogbmV3IE1hcDxzdHJpbmcsIFZhbGlkYXRvciB8IFZhbGlkYXRvckZhY3Rvcnk+KFtcclxuICAgICAgICAgICAgICAgIFtcImpzb25cIiwgdmFsaWRhdGVKU09OXSxcclxuICAgICAgICAgICAgICAgIFtcInJlcXVpcmVkVHJhbnNsYXRpb25cIiwgdmFsaWRhdGVSZXF1aXJlZFRyYW5zbGF0aW9uXSxcclxuICAgICAgICAgICAgICAgIFtcInBob25lXCIsIHZhbGlkYXRlUGhvbmVdLFxyXG4gICAgICAgICAgICAgICAgW1wiaXRlbXNNaW5MZW5ndGhcIiwgdmFsaWRhdGVJdGVtc01pbkxlbmd0aF0sXHJcbiAgICAgICAgICAgICAgICBbXCJpdGVtc01heExlbmd0aFwiLCB2YWxpZGF0ZUl0ZW1zTWF4TGVuZ3RoXSxcclxuICAgICAgICAgICAgICAgIFtcIml0ZW1zTWluVmFsdWVcIiwgdmFsaWRhdGVJdGVtc01pblZhbHVlXSxcclxuICAgICAgICAgICAgICAgIFtcIml0ZW1zTWF4VmFsdWVcIiwgdmFsaWRhdGVJdGVtc01heFZhbHVlXSxcclxuICAgICAgICAgICAgXSlcclxuICAgICAgICB9XHJcbiAgICBdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBOZ3hEeW5hbWljRm9ybU1vZHVsZSB7XHJcblxyXG4gICAgc3RhdGljIGZvclJvb3QoY29uZmlnPzogSUR5bmFtaWNGb3JtTW9kdWxlQ29uZmlnKTogTW9kdWxlV2l0aFByb3ZpZGVyczxOZ3hEeW5hbWljRm9ybU1vZHVsZT4ge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIG5nTW9kdWxlOiBOZ3hEeW5hbWljRm9ybU1vZHVsZSxcclxuICAgICAgICAgICAgcHJvdmlkZXJzOiBbXHJcbiAgICAgICAgICAgICAgICBEeW5hbWljRm9ybVNlcnZpY2UsXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJvdmlkZTogQmFzZUR5bmFtaWNGb3JtU2VydmljZSxcclxuICAgICAgICAgICAgICAgICAgICB1c2VFeGlzdGluZzogRHluYW1pY0Zvcm1TZXJ2aWNlXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHByb3ZpZGU6IERZTkFNSUNfRk9STV9DT05UUk9MX01BUF9GTixcclxuICAgICAgICAgICAgICAgICAgICB1c2VGYWN0b3J5OiAoY29uZmlnPy5jb250cm9sUHJvdmlkZXIgfHwgZGVmYXVsdEZvcm1Db250cm9sUHJvdmlkZXIpLFxyXG4gICAgICAgICAgICAgICAgICAgIGRlcHM6IFtJbmplY3Rvcl1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgXVxyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG4iXX0=