@eqproject/eqp-dynamic-module 0.0.12 → 1.0.0

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 (162) hide show
  1. package/esm2020/eqproject-eqp-dynamic-module.mjs +5 -0
  2. package/esm2020/lib/components/exported/eqp-dynamic-module/eqp-dynamic-module.component.mjs +249 -0
  3. package/esm2020/lib/components/exported/eqp-dynamic-module-configurator/eqp-dynamic-module-configurator.component.mjs +659 -0
  4. package/esm2020/lib/components/private/add-form-field/add-form-field.component.mjs +585 -0
  5. package/esm2020/lib/components/private/dynamic-module-field/dynamic-module-field.component.mjs +130 -0
  6. package/esm2020/lib/components/private/dynamic-module-field-fix/dynamic-module-field.component.mjs +127 -0
  7. package/esm2020/lib/components/private/field-templates/attachment-field-template/attachment-field-template.component.mjs +163 -0
  8. package/esm2020/lib/components/private/field-templates/boolean-field-template/boolean-field-template.component.mjs +57 -0
  9. package/esm2020/lib/components/private/field-templates/date-field-template/date-field-template.component.mjs +67 -0
  10. package/esm2020/lib/components/private/field-templates/image-field-template/image-field-template.component.mjs +188 -0
  11. package/esm2020/lib/components/private/field-templates/list-value-field-template/list-value-field-template.component.mjs +117 -0
  12. package/esm2020/lib/components/private/field-templates/numeric-field-template/numeric-field-template.component.mjs +70 -0
  13. package/esm2020/lib/components/private/field-templates/text-field-template/text-field-template.component.mjs +65 -0
  14. package/esm2020/lib/components/private/field-templates/textarea-field-template/textarea-field-template.component.mjs +49 -0
  15. package/esm2020/lib/components/private/form-records/add-form-record/add-form-record.component.mjs +126 -0
  16. package/esm2020/lib/components/private/form-records/list-form-record/list-form-record.component.mjs +212 -0
  17. package/esm2020/lib/components/private/spinner/spinner.component.mjs +19 -0
  18. package/esm2020/lib/eqp-dynamic-module.module.mjs +110 -0
  19. package/esm2020/lib/interfaces/iBaseFieldComponent.interface.mjs +2 -0
  20. package/esm2020/lib/interfaces/iRootObject.interface.mjs +2 -0
  21. package/esm2020/lib/models/baseField.model.mjs +36 -0
  22. package/esm2020/lib/models/baseObj.model.mjs +9 -0
  23. package/esm2020/lib/models/context.model.mjs +8 -0
  24. package/esm2020/lib/models/endPointConfiguration.model.mjs +23 -0
  25. package/esm2020/lib/models/entity.model.mjs +7 -0
  26. package/esm2020/lib/models/fields/attachmentField.model.mjs +22 -0
  27. package/esm2020/lib/models/fields/booleanField.model.mjs +12 -0
  28. package/esm2020/lib/models/fields/dateField.model.mjs +11 -0
  29. package/esm2020/lib/models/fields/imageField.model.mjs +8 -0
  30. package/esm2020/lib/models/fields/listValueField.model.mjs +14 -0
  31. package/esm2020/lib/models/fields/lookupField.model.mjs +5 -0
  32. package/esm2020/lib/models/fields/numericField.model.mjs +5 -0
  33. package/esm2020/lib/models/fields/textField.model.mjs +14 -0
  34. package/esm2020/lib/models/fields/textareaField.model.mjs +4 -0
  35. package/esm2020/lib/models/form.model.mjs +24 -0
  36. package/esm2020/lib/models/record.model.mjs +8 -0
  37. package/esm2020/lib/modules/material.module.mjs +231 -0
  38. package/esm2020/lib/services/custom-form-validators.service.mjs +19 -0
  39. package/esm2020/lib/services/eqp-dynamic-module-dialog.service.mjs +112 -0
  40. package/esm2020/lib/services/spinner.service.mjs +43 -0
  41. package/esm2020/lib/services/utilityHelper.services.mjs +379 -0
  42. package/esm2020/public-api.mjs +41 -0
  43. package/fesm2015/eqproject-eqp-dynamic-module.mjs +3783 -0
  44. package/fesm2015/eqproject-eqp-dynamic-module.mjs.map +1 -0
  45. package/fesm2020/eqproject-eqp-dynamic-module.mjs +3779 -0
  46. package/fesm2020/eqproject-eqp-dynamic-module.mjs.map +1 -0
  47. package/index.d.ts +5 -0
  48. package/lib/components/exported/eqp-dynamic-module/eqp-dynamic-module.component.d.ts +3 -0
  49. package/lib/components/exported/eqp-dynamic-module-configurator/eqp-dynamic-module-configurator.component.d.ts +12 -4
  50. package/lib/components/private/add-form-field/add-form-field.component.d.ts +8 -3
  51. package/lib/components/private/dynamic-module-field/dynamic-module-field.component.d.ts +3 -0
  52. package/lib/components/private/dynamic-module-field-fix/dynamic-module-field.component.d.ts +58 -0
  53. package/lib/components/private/field-templates/attachment-field-template/attachment-field-template.component.d.ts +5 -2
  54. package/lib/components/private/field-templates/boolean-field-template/boolean-field-template.component.d.ts +3 -0
  55. package/lib/components/private/field-templates/date-field-template/date-field-template.component.d.ts +3 -0
  56. package/lib/components/private/field-templates/image-field-template/image-field-template.component.d.ts +5 -2
  57. package/lib/components/private/field-templates/list-value-field-template/list-value-field-template.component.d.ts +3 -0
  58. package/lib/components/private/field-templates/numeric-field-template/numeric-field-template.component.d.ts +3 -0
  59. package/lib/components/private/field-templates/text-field-template/text-field-template.component.d.ts +4 -1
  60. package/lib/components/private/field-templates/textarea-field-template/textarea-field-template.component.d.ts +3 -0
  61. package/lib/components/private/form-records/add-form-record/add-form-record.component.d.ts +7 -4
  62. package/lib/components/private/form-records/list-form-record/list-form-record.component.d.ts +3 -0
  63. package/lib/components/private/spinner/spinner.component.d.ts +3 -0
  64. package/lib/eqp-dynamic-module.module.d.ts +30 -0
  65. package/lib/models/baseField.model.d.ts +2 -2
  66. package/lib/modules/material.module.d.ts +35 -0
  67. package/lib/services/eqp-dynamic-module-dialog.service.d.ts +3 -0
  68. package/lib/services/spinner.service.d.ts +3 -0
  69. package/lib/services/utilityHelper.services.d.ts +6 -3
  70. package/package.json +37 -26
  71. package/bundles/eqproject-eqp-dynamic-module.umd.js +0 -3997
  72. package/bundles/eqproject-eqp-dynamic-module.umd.js.map +0 -1
  73. package/bundles/eqproject-eqp-dynamic-module.umd.min.js +0 -17
  74. package/bundles/eqproject-eqp-dynamic-module.umd.min.js.map +0 -1
  75. package/eqproject-eqp-dynamic-module.d.ts +0 -6
  76. package/eqproject-eqp-dynamic-module.metadata.json +0 -1
  77. package/esm2015/eqproject-eqp-dynamic-module.js +0 -7
  78. package/esm2015/lib/components/exported/eqp-dynamic-module/eqp-dynamic-module.component.js +0 -265
  79. package/esm2015/lib/components/exported/eqp-dynamic-module-configurator/eqp-dynamic-module-configurator.component.js +0 -652
  80. package/esm2015/lib/components/private/add-form-field/add-form-field.component.js +0 -577
  81. package/esm2015/lib/components/private/dynamic-module-field/dynamic-module-field.component.js +0 -127
  82. package/esm2015/lib/components/private/field-templates/attachment-field-template/attachment-field-template.component.js +0 -170
  83. package/esm2015/lib/components/private/field-templates/boolean-field-template/boolean-field-template.component.js +0 -56
  84. package/esm2015/lib/components/private/field-templates/date-field-template/date-field-template.component.js +0 -71
  85. package/esm2015/lib/components/private/field-templates/image-field-template/image-field-template.component.js +0 -196
  86. package/esm2015/lib/components/private/field-templates/list-value-field-template/list-value-field-template.component.js +0 -115
  87. package/esm2015/lib/components/private/field-templates/numeric-field-template/numeric-field-template.component.js +0 -71
  88. package/esm2015/lib/components/private/field-templates/text-field-template/text-field-template.component.js +0 -67
  89. package/esm2015/lib/components/private/field-templates/textarea-field-template/textarea-field-template.component.js +0 -51
  90. package/esm2015/lib/components/private/form-records/add-form-record/add-form-record.component.js +0 -130
  91. package/esm2015/lib/components/private/form-records/list-form-record/list-form-record.component.js +0 -216
  92. package/esm2015/lib/components/private/spinner/spinner.component.js +0 -23
  93. package/esm2015/lib/eqp-dynamic-module.module.js +0 -69
  94. package/esm2015/lib/interfaces/iBaseFieldComponent.interface.js +0 -1
  95. package/esm2015/lib/interfaces/iRootObject.interface.js +0 -1
  96. package/esm2015/lib/models/baseField.model.js +0 -36
  97. package/esm2015/lib/models/baseObj.model.js +0 -9
  98. package/esm2015/lib/models/context.model.js +0 -8
  99. package/esm2015/lib/models/endPointConfiguration.model.js +0 -23
  100. package/esm2015/lib/models/entity.model.js +0 -7
  101. package/esm2015/lib/models/fields/attachmentField.model.js +0 -22
  102. package/esm2015/lib/models/fields/booleanField.model.js +0 -12
  103. package/esm2015/lib/models/fields/dateField.model.js +0 -11
  104. package/esm2015/lib/models/fields/imageField.model.js +0 -8
  105. package/esm2015/lib/models/fields/listValueField.model.js +0 -14
  106. package/esm2015/lib/models/fields/lookupField.model.js +0 -5
  107. package/esm2015/lib/models/fields/numericField.model.js +0 -5
  108. package/esm2015/lib/models/fields/textField.model.js +0 -14
  109. package/esm2015/lib/models/fields/textareaField.model.js +0 -4
  110. package/esm2015/lib/models/form.model.js +0 -24
  111. package/esm2015/lib/models/record.model.js +0 -8
  112. package/esm2015/lib/modules/material.module.js +0 -108
  113. package/esm2015/lib/services/custom-form-validators.service.js +0 -19
  114. package/esm2015/lib/services/eqp-dynamic-module-dialog.service.js +0 -113
  115. package/esm2015/lib/services/spinner.service.js +0 -43
  116. package/esm2015/lib/services/utilityHelper.services.js +0 -387
  117. package/esm2015/public-api.js +0 -39
  118. package/esm5/eqproject-eqp-dynamic-module.js +0 -7
  119. package/esm5/lib/components/exported/eqp-dynamic-module/eqp-dynamic-module.component.js +0 -272
  120. package/esm5/lib/components/exported/eqp-dynamic-module-configurator/eqp-dynamic-module-configurator.component.js +0 -667
  121. package/esm5/lib/components/private/add-form-field/add-form-field.component.js +0 -588
  122. package/esm5/lib/components/private/dynamic-module-field/dynamic-module-field.component.js +0 -128
  123. package/esm5/lib/components/private/field-templates/attachment-field-template/attachment-field-template.component.js +0 -173
  124. package/esm5/lib/components/private/field-templates/boolean-field-template/boolean-field-template.component.js +0 -57
  125. package/esm5/lib/components/private/field-templates/date-field-template/date-field-template.component.js +0 -72
  126. package/esm5/lib/components/private/field-templates/image-field-template/image-field-template.component.js +0 -206
  127. package/esm5/lib/components/private/field-templates/list-value-field-template/list-value-field-template.component.js +0 -119
  128. package/esm5/lib/components/private/field-templates/numeric-field-template/numeric-field-template.component.js +0 -72
  129. package/esm5/lib/components/private/field-templates/text-field-template/text-field-template.component.js +0 -68
  130. package/esm5/lib/components/private/field-templates/textarea-field-template/textarea-field-template.component.js +0 -52
  131. package/esm5/lib/components/private/form-records/add-form-record/add-form-record.component.js +0 -133
  132. package/esm5/lib/components/private/form-records/list-form-record/list-form-record.component.js +0 -220
  133. package/esm5/lib/components/private/spinner/spinner.component.js +0 -24
  134. package/esm5/lib/eqp-dynamic-module.module.js +0 -72
  135. package/esm5/lib/interfaces/iBaseFieldComponent.interface.js +0 -1
  136. package/esm5/lib/interfaces/iRootObject.interface.js +0 -1
  137. package/esm5/lib/models/baseField.model.js +0 -43
  138. package/esm5/lib/models/baseObj.model.js +0 -13
  139. package/esm5/lib/models/context.model.js +0 -14
  140. package/esm5/lib/models/endPointConfiguration.model.js +0 -33
  141. package/esm5/lib/models/entity.model.js +0 -14
  142. package/esm5/lib/models/fields/attachmentField.model.js +0 -29
  143. package/esm5/lib/models/fields/booleanField.model.js +0 -19
  144. package/esm5/lib/models/fields/dateField.model.js +0 -18
  145. package/esm5/lib/models/fields/imageField.model.js +0 -19
  146. package/esm5/lib/models/fields/listValueField.model.js +0 -25
  147. package/esm5/lib/models/fields/lookupField.model.js +0 -12
  148. package/esm5/lib/models/fields/numericField.model.js +0 -12
  149. package/esm5/lib/models/fields/textField.model.js +0 -21
  150. package/esm5/lib/models/fields/textareaField.model.js +0 -11
  151. package/esm5/lib/models/form.model.js +0 -39
  152. package/esm5/lib/models/record.model.js +0 -14
  153. package/esm5/lib/modules/material.module.js +0 -111
  154. package/esm5/lib/services/custom-form-validators.service.js +0 -23
  155. package/esm5/lib/services/eqp-dynamic-module-dialog.service.js +0 -123
  156. package/esm5/lib/services/spinner.service.js +0 -46
  157. package/esm5/lib/services/utilityHelper.services.js +0 -396
  158. package/esm5/public-api.js +0 -39
  159. package/fesm2015/eqproject-eqp-dynamic-module.js +0 -3586
  160. package/fesm2015/eqproject-eqp-dynamic-module.js.map +0 -1
  161. package/fesm5/eqproject-eqp-dynamic-module.js +0 -3772
  162. package/fesm5/eqproject-eqp-dynamic-module.js.map +0 -1
@@ -0,0 +1,70 @@
1
+ import { Component, EventEmitter, Input, Output } from '@angular/core';
2
+ import { EqpNumericInputMode } from '@eqproject/eqp-numeric';
3
+ import { UtilityHelperService } from '../../../../services/utilityHelper.services';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "@angular/material/form-field";
6
+ import * as i2 from "@angular/material/input";
7
+ import * as i3 from "@angular/forms";
8
+ import * as i4 from "@eqproject/eqp-numeric";
9
+ export class NumericFieldTemplateComponent {
10
+ constructor() {
11
+ this.recordChange = new EventEmitter();
12
+ this.eqpNumericOptions = {};
13
+ }
14
+ ngOnInit() {
15
+ this.configureEqpNumericOptions();
16
+ }
17
+ ngOnChanges(changes) {
18
+ // Se viene modificato il valore di "ngModelInput" allora aggiorna l'input
19
+ if (changes['record'] != undefined && changes['record'].firstChange == false && JSON.stringify(changes['record'].currentValue) != JSON.stringify(changes['record'].previousValue)) {
20
+ this.record = changes['record'].currentValue;
21
+ this.updateField();
22
+ }
23
+ }
24
+ /**
25
+ * Metodo per aggiornare il valore del campo quando questo è rappresentato da una formula.
26
+ */
27
+ updateField() {
28
+ if (this.field.Formula) {
29
+ this.record[this.field.Name] = UtilityHelperService.EvaluateFieldFormula(this.field.Formula, this.record, null);
30
+ }
31
+ }
32
+ /**
33
+ * Metodo per emettere l'evento che il valore del record è cambiato.
34
+ */
35
+ onRecordValueChange() {
36
+ if (!this.field.Formula) {
37
+ this.recordChange.emit(this.record);
38
+ }
39
+ }
40
+ /**
41
+ * Metodo per configurare eqp-numeric
42
+ */
43
+ configureEqpNumericOptions() {
44
+ this.eqpNumericOptions.prefix = this.field.CurrencySymbol ? this.field.CurrencySymbol : "";
45
+ this.eqpNumericOptions.inputMode = this.field.CurrencySymbol ? EqpNumericInputMode.FINANCIAL : EqpNumericInputMode.NATURAL;
46
+ if (this.field.MinValue != null && this.field.MinValue != undefined)
47
+ this.eqpNumericOptions.min = this.field.MinValue;
48
+ if (this.field.MaxValue != null && this.field.MaxValue != undefined)
49
+ this.eqpNumericOptions.max = this.field.MaxValue;
50
+ if (this.field.DecimalSeparator != null && this.field.DecimalSeparator != undefined)
51
+ this.eqpNumericOptions.decimal = this.field.DecimalSeparator;
52
+ if (this.field.ThousandsSeparator != null && this.field.ThousandsSeparator != undefined)
53
+ this.eqpNumericOptions.thousands = this.field.ThousandsSeparator;
54
+ if (this.field.DecimalPrecision != null && this.field.DecimalPrecision != undefined)
55
+ this.eqpNumericOptions.precision = this.field.DecimalPrecision;
56
+ }
57
+ }
58
+ NumericFieldTemplateComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.8", ngImport: i0, type: NumericFieldTemplateComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
59
+ NumericFieldTemplateComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.8", type: NumericFieldTemplateComponent, selector: "numeric-field-template", inputs: { field: "field", record: "record" }, outputs: { recordChange: "recordChange" }, usesOnChanges: true, ngImport: i0, template: "<mat-form-field [formGroup]=\"field.FormFormGroup\">\r\n <mat-label> {{field.Label}} </mat-label>\r\n <input matInput eqpNumericMask [formControlName]=\"field.Name\" [disabled]=\"field.FormFormGroup.disabled\"\r\n [required]=\"field.Required\" [(ngModel)]=\"record[field.Name]\" [options]=\"eqpNumericOptions\"\r\n [step]=\"field.IsInteger ? 1 : null\" (ngModelChange)=\"onRecordValueChange()\" />\r\n</mat-form-field>", styles: [""], dependencies: [{ kind: "component", type: i1.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i1.MatLabel, selector: "mat-label" }, { kind: "directive", type: i2.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i4.EqpNumericDirective, selector: "[eqpNumericMask]", inputs: ["options"] }] });
60
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.8", ngImport: i0, type: NumericFieldTemplateComponent, decorators: [{
61
+ type: Component,
62
+ args: [{ selector: 'numeric-field-template', template: "<mat-form-field [formGroup]=\"field.FormFormGroup\">\r\n <mat-label> {{field.Label}} </mat-label>\r\n <input matInput eqpNumericMask [formControlName]=\"field.Name\" [disabled]=\"field.FormFormGroup.disabled\"\r\n [required]=\"field.Required\" [(ngModel)]=\"record[field.Name]\" [options]=\"eqpNumericOptions\"\r\n [step]=\"field.IsInteger ? 1 : null\" (ngModelChange)=\"onRecordValueChange()\" />\r\n</mat-form-field>" }]
63
+ }], ctorParameters: function () { return []; }, propDecorators: { field: [{
64
+ type: Input
65
+ }], record: [{
66
+ type: Input
67
+ }], recordChange: [{
68
+ type: Output
69
+ }] } });
70
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnVtZXJpYy1maWVsZC10ZW1wbGF0ZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9lcXAtZHluYW1pYy1tb2R1bGUvc3JjL2xpYi9jb21wb25lbnRzL3ByaXZhdGUvZmllbGQtdGVtcGxhdGVzL251bWVyaWMtZmllbGQtdGVtcGxhdGUvbnVtZXJpYy1maWVsZC10ZW1wbGF0ZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9lcXAtZHluYW1pYy1tb2R1bGUvc3JjL2xpYi9jb21wb25lbnRzL3ByaXZhdGUvZmllbGQtdGVtcGxhdGVzL251bWVyaWMtZmllbGQtdGVtcGxhdGUvbnVtZXJpYy1maWVsZC10ZW1wbGF0ZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQXFCLE1BQU0sRUFBaUIsTUFBTSxlQUFlLENBQUM7QUFDekcsT0FBTyxFQUFFLG1CQUFtQixFQUFxQixNQUFNLHdCQUF3QixDQUFDO0FBQ2hGLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDZDQUE2QyxDQUFDOzs7Ozs7QUFVbkYsTUFBTSxPQUFPLDZCQUE2QjtJQVF4QztRQUpVLGlCQUFZLEdBQXlCLElBQUksWUFBWSxFQUFVLENBQUM7UUFFMUUsc0JBQWlCLEdBQStCLEVBQUUsQ0FBQztJQUVuQyxDQUFDO0lBRWpCLFFBQVE7UUFDTixJQUFJLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztJQUNwQyxDQUFDO0lBRUQsV0FBVyxDQUFDLE9BQXNCO1FBQ2hDLDBFQUEwRTtRQUMxRSxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxTQUFTLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLFdBQVcsSUFBSSxLQUFLLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFP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ckIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25DaGFuZ2VzLCBPbkluaXQsIE91dHB1dCwgU2ltcGxlQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBFcXBOdW1lcmljSW5wdXRNb2RlLCBOdW1lcmljTWFza0NvbmZpZyB9IGZyb20gJ0BlcXByb2plY3QvZXFwLW51bWVyaWMnO1xyXG5pbXBvcnQgeyBVdGlsaXR5SGVscGVyU2VydmljZSB9IGZyb20gJy4uLy4uLy4uLy4uL3NlcnZpY2VzL3V0aWxpdHlIZWxwZXIuc2VydmljZXMnO1xyXG5pbXBvcnQgeyBSZWNvcmQgfSBmcm9tICcuLi8uLi8uLi8uLi9tb2RlbHMvcmVjb3JkLm1vZGVsJztcclxuaW1wb3J0IHsgTnVtZXJpY0ZpZWxkIH0gZnJvbSAnLi4vLi4vLi4vLi4vbW9kZWxzL2ZpZWxkcy9udW1lcmljRmllbGQubW9kZWwnO1xyXG5pbXBvcnQgeyBJQmFzZUZpZWxkQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vLi4vaW50ZXJmYWNlcy9pQmFzZUZpZWxkQ29tcG9uZW50LmludGVyZmFjZSc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ251bWVyaWMtZmllbGQtdGVtcGxhdGUnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9udW1lcmljLWZpZWxkLXRlbXBsYXRlLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9udW1lcmljLWZpZWxkLXRlbXBsYXRlLmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIE51bWVyaWNGaWVsZFRlbXBsYXRlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIElCYXNlRmllbGRDb21wb25lbnQge1xyXG5cclxuICBASW5wdXQoKSBmaWVsZDogTnVtZXJpY0ZpZWxkO1xyXG4gIEBJbnB1dCgpIHJlY29yZDogUmVjb3JkO1xyXG4gIEBPdXRwdXQoKSByZWNvcmRDaGFuZ2U6IEV2ZW50RW1pdHRlcjxSZWNvcmQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxSZWNvcmQ+KCk7XHJcblxyXG4gIGVxcE51bWVyaWNPcHRpb25zOiBQYXJ0aWFsPE51bWVyaWNNYXNrQ29uZmlnPiA9IHt9O1xyXG5cclxuICBjb25zdHJ1Y3RvcigpIHsgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuY29uZmlndXJlRXFwTnVtZXJpY09wdGlvbnMoKTtcclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcclxuICAgIC8vIFNlIHZpZW5lIG1vZGlmaWNhdG8gaWwgdmFsb3JlIGRpIFwibmdNb2RlbElucHV0XCIgYWxsb3JhIGFnZ2lvcm5hIGwnaW5wdXRcclxuICAgIGlmIChjaGFuZ2VzWydyZWNvcmQnXSAhPSB1bmRlZmluZWQgJiYgY2hhbmdlc1sncmVjb3JkJ10uZmlyc3RDaGFuZ2UgPT0gZmFsc2UgJiYgSlNPTi5zdHJpbmdpZnkoY2hhbmdlc1sncmVjb3JkJ10uY3VycmVudFZhbHVlKSAhPSBKU09OLnN0cmluZ2lmeShjaGFuZ2VzWydyZWNvcmQnXS5wcmV2aW91c1ZhbHVlKSkge1xyXG4gICAgICB0aGlzLnJlY29yZCA9IGNoYW5nZXNbJ3JlY29yZCddLmN1cnJlbnRWYWx1ZTtcclxuICAgICAgdGhpcy51cGRhdGVGaWVsZCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTWV0b2RvIHBlciBhZ2dpb3JuYXJlIGlsIHZhbG9yZSBkZWwgY2FtcG8gcXVhbmRvIHF1ZXN0byDDqCByYXBwcmVzZW50YXRvIGRhIHVuYSBmb3JtdWxhLlxyXG4gICAqL1xyXG4gIHVwZGF0ZUZpZWxkKCkge1xyXG4gICAgaWYgKHRoaXMuZmllbGQuRm9ybXVsYSkge1xyXG4gICAgICB0aGlzLnJlY29yZFt0aGlzLmZpZWxkLk5hbWVdID0gVXRpbGl0eUhlbHBlclNlcnZpY2UuRXZhbHVhdGVGaWVsZEZvcm11bGEodGhpcy5maWVsZC5Gb3JtdWxhLCB0aGlzLnJlY29yZCwgbnVsbCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBNZXRvZG8gcGVyIGVtZXR0ZXJlIGwnZXZlbnRvIGNoZSBpbCB2YWxvcmUgZGVsIHJlY29yZCDDqCBjYW1iaWF0by5cclxuICAgKi9cclxuICBvblJlY29yZFZhbHVlQ2hhbmdlKCkge1xyXG4gICAgaWYgKCF0aGlzLmZpZWxkLkZvcm11bGEpIHtcclxuICAgICAgdGhpcy5yZWNvcmRDaGFuZ2UuZW1pdCh0aGlzLnJlY29yZCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBNZXRvZG8gcGVyIGNvbmZpZ3VyYXJlIGVxcC1udW1lcmljXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBjb25maWd1cmVFcXBOdW1lcmljT3B0aW9ucygpIHtcclxuICAgIHRoaXMuZXFwTnVtZXJpY09wdGlvbnMucHJlZml4ID0gdGhpcy5maWVsZC5DdXJyZW5jeVN5bWJvbCA/IHRoaXMuZmllbGQuQ3VycmVuY3lTeW1ib2wgOiBcIlwiO1xyXG4gICAgdGhpcy5lcXBOdW1lcmljT3B0aW9ucy5pbnB1dE1vZGUgPSB0aGlzLmZpZWxkLkN1cnJlbmN5U3ltYm9sID8gRXFwTnVtZXJpY0lucHV0TW9kZS5GSU5BTkNJQUwgOiBFcXBOdW1lcmljSW5wdXRNb2RlLk5BVFVSQUw7XHJcbiAgICBpZiAodGhpcy5maWVsZC5NaW5WYWx1ZSAhPSBudWxsICYmIHRoaXMuZmllbGQuTWluVmFsdWUgIT0gdW5kZWZpbmVkKVxyXG4gICAgICB0aGlzLmVxcE51bWVyaWNPcHRpb25zLm1pbiA9IHRoaXMuZmllbGQuTWluVmFsdWU7XHJcbiAgICBpZiAodGhpcy5maWVsZC5NYXhWYWx1ZSAhPSBudWxsICYmIHRoaXMuZmllbGQuTWF4VmFsdWUgIT0gdW5kZWZpbmVkKVxyXG4gICAgICB0aGlzLmVxcE51bWVyaWNPcHRpb25zLm1heCA9IHRoaXMuZmllbGQuTWF4VmFsdWU7XHJcbiAgICBpZiAodGhpcy5maWVsZC5EZWNpbWFsU2VwYXJhdG9yICE9IG51bGwgJiYgdGhpcy5maWVsZC5EZWNpbWFsU2VwYXJhdG9yICE9IHVuZGVmaW5lZClcclxuICAgICAgdGhpcy5lcXBOdW1lcmljT3B0aW9ucy5kZWNpbWFsID0gdGhpcy5maWVsZC5EZWNpbWFsU2VwYXJhdG9yO1xyXG4gICAgaWYgKHRoaXMuZmllbGQuVGhvdXNhbmRzU2VwYXJhdG9yICE9IG51bGwgJiYgdGhpcy5maWVsZC5UaG91c2FuZHNTZXBhcmF0b3IgIT0gdW5kZWZpbmVkKVxyXG4gICAgICB0aGlzLmVxcE51bWVyaWNPcHRpb25zLnRob3VzYW5kcyA9IHRoaXMuZmllbGQuVGhvdXNhbmRzU2VwYXJhdG9yO1xyXG4gICAgaWYgKHRoaXMuZmllbGQuRGVjaW1hbFByZWNpc2lvbiAhPSBudWxsICYmIHRoaXMuZmllbGQuRGVjaW1hbFByZWNpc2lvbiAhPSB1bmRlZmluZWQpXHJcbiAgICAgIHRoaXMuZXFwTnVtZXJpY09wdGlvbnMucHJlY2lzaW9uID0gdGhpcy5maWVsZC5EZWNpbWFsUHJlY2lzaW9uO1xyXG4gIH1cclxufVxyXG4iLCI8bWF0LWZvcm0tZmllbGQgW2Zvcm1Hcm91cF09XCJmaWVsZC5Gb3JtRm9ybUdyb3VwXCI+XHJcbiAgICA8bWF0LWxhYmVsPiB7e2ZpZWxkLkxhYmVsfX0gPC9tYXQtbGFiZWw+XHJcbiAgICA8aW5wdXQgbWF0SW5wdXQgZXFwTnVtZXJpY01hc2sgW2Zvcm1Db250cm9sTmFtZV09XCJmaWVsZC5OYW1lXCIgW2Rpc2FibGVkXT1cImZpZWxkLkZvcm1Gb3JtR3JvdXAuZGlzYWJsZWRcIlxyXG4gICAgICAgIFtyZXF1aXJlZF09XCJmaWVsZC5SZXF1aXJlZFwiIFsobmdNb2RlbCldPVwicmVjb3JkW2ZpZWxkLk5hbWVdXCIgW29wdGlvbnNdPVwiZXFwTnVtZXJpY09wdGlvbnNcIlxyXG4gICAgICAgIFtzdGVwXT1cImZpZWxkLklzSW50ZWdlciA/IDEgOiBudWxsXCIgKG5nTW9kZWxDaGFuZ2UpPVwib25SZWNvcmRWYWx1ZUNoYW5nZSgpXCIgLz5cclxuPC9tYXQtZm9ybS1maWVsZD4iXX0=
@@ -0,0 +1,65 @@
1
+ import { Component, EventEmitter, Input, Output } from '@angular/core';
2
+ import { TextMaskEnum } from '../../../../models/fields/textField.model';
3
+ import { UtilityHelperService } from '../../../../services/utilityHelper.services';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "@angular/material/form-field";
6
+ import * as i2 from "@angular/material/input";
7
+ import * as i3 from "@angular/forms";
8
+ export class TextFieldTemplateComponent {
9
+ constructor() {
10
+ this.recordChange = new EventEmitter();
11
+ this.InputMaskEnum = TextMaskEnum;
12
+ }
13
+ ngOnInit() {
14
+ }
15
+ ngOnChanges(changes) {
16
+ // Se viene modificato il valore di "ngModelInput" allora aggiorna l'input
17
+ if (changes['record'] != undefined && changes['record'].firstChange == false && JSON.stringify(changes['record'].currentValue) != JSON.stringify(changes['record'].previousValue)) {
18
+ this.record = changes['record'].currentValue;
19
+ this.updateField();
20
+ }
21
+ }
22
+ getInputType() {
23
+ switch (this.field.TextMask) {
24
+ case TextMaskEnum.Email:
25
+ return 'email';
26
+ case TextMaskEnum.Password:
27
+ return 'password';
28
+ case TextMaskEnum.Telefono:
29
+ return 'tel';
30
+ case TextMaskEnum.Url:
31
+ return 'url';
32
+ default:
33
+ return 'text';
34
+ }
35
+ }
36
+ /**
37
+ * Metodo per aggiornare il valore del campo quando questo è rappresentato da una formula.
38
+ */
39
+ updateField() {
40
+ if (this.field.Formula) {
41
+ this.record[this.field.Name] = UtilityHelperService.EvaluateFieldFormula(this.field.Formula, this.record, null);
42
+ }
43
+ }
44
+ /**
45
+ * Metodo per emettere l'evento che il valore del record è cambiato.
46
+ */
47
+ onRecordValueChange() {
48
+ if (!this.field.Formula) {
49
+ this.recordChange.emit(this.record);
50
+ }
51
+ }
52
+ }
53
+ TextFieldTemplateComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.8", ngImport: i0, type: TextFieldTemplateComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
54
+ TextFieldTemplateComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.8", type: TextFieldTemplateComponent, selector: "text-field-template", inputs: { field: "field", record: "record" }, outputs: { recordChange: "recordChange" }, usesOnChanges: true, ngImport: i0, template: "<mat-form-field [formGroup]=\"field.FormFormGroup\">\r\n <mat-label> {{field.Label}} </mat-label>\r\n <input matInput [type]=\"getInputType()\" [formControlName]=\"field.Name\" [disabled]=\"field.FormFormGroup.disabled\"\r\n [required]=\"field.Required\" [(ngModel)]=\"record[field.Name]\" (ngModelChange)=\"onRecordValueChange()\">\r\n</mat-form-field>", styles: [""], dependencies: [{ kind: "component", type: i1.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i1.MatLabel, selector: "mat-label" }, { kind: "directive", type: i2.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }] });
55
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.8", ngImport: i0, type: TextFieldTemplateComponent, decorators: [{
56
+ type: Component,
57
+ args: [{ selector: 'text-field-template', template: "<mat-form-field [formGroup]=\"field.FormFormGroup\">\r\n <mat-label> {{field.Label}} </mat-label>\r\n <input matInput [type]=\"getInputType()\" [formControlName]=\"field.Name\" [disabled]=\"field.FormFormGroup.disabled\"\r\n [required]=\"field.Required\" [(ngModel)]=\"record[field.Name]\" (ngModelChange)=\"onRecordValueChange()\">\r\n</mat-form-field>" }]
58
+ }], ctorParameters: function () { return []; }, propDecorators: { field: [{
59
+ type: Input
60
+ }], record: [{
61
+ type: Input
62
+ }], recordChange: [{
63
+ type: Output
64
+ }] } });
65
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dC1maWVsZC10ZW1wbGF0ZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9lcXAtZHluYW1pYy1tb2R1bGUvc3JjL2xpYi9jb21wb25lbnRzL3ByaXZhdGUvZmllbGQtdGVtcGxhdGVzL3RleHQtZmllbGQtdGVtcGxhdGUvdGV4dC1maWVsZC10ZW1wbGF0ZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9lcXAtZHluYW1pYy1tb2R1bGUvc3JjL2xpYi9jb21wb25lbnRzL3ByaXZhdGUvZmllbGQtdGVtcGxhdGVzL3RleHQtZmllbGQtdGVtcGxhdGUvdGV4dC1maWVsZC10ZW1wbGF0ZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQXFCLE1BQU0sRUFBaUIsTUFBTSxlQUFlLENBQUM7QUFFekcsT0FBTyxFQUFFLFlBQVksRUFBYSxNQUFNLDJDQUEyQyxDQUFDO0FBRXBGLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDZDQUE2QyxDQUFDOzs7OztBQU9uRixNQUFNLE9BQU8sMEJBQTBCO0lBUXJDO1FBSlUsaUJBQVksR0FBeUIsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUUxRSxrQkFBYSxHQUFHLFlBQVksQ0FBQztJQUViLENBQUM7SUFFakIsUUFBUTtJQUNSLENBQUM7SUFFRCxXQUFXLENBQUMsT0FBc0I7UUFDaEMsMEVBQTBFO1FBQzFFLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLFNBQVMsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsV0FBVyxJQUFJLEtBQUssSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxZQUFZLENBQUMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxhQUFhLENBQUMsRUFBRTtZQUNqTCxJQUFJLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxZQUFZLENBQUM7WUFDN0MsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1NBQ3BCO0lBQ0gsQ0FBQztJQUVELFlBQVk7UUFDVixRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFO1lBQzNCLEtBQUssWUFBWSxDQUFDLEtBQUs7Z0JBQ3JCLE9BQU8sT0FBTyxDQUFDO1lBQ2pCLEtBQUssWUFBWSxDQUFDLFFBQVE7Z0JBQ3hCLE9BQU8sVUFBVSxDQUFDO1lBQ3BCLEtBQUssWUFBWSxDQUFDLFFBQVE7Z0JBQ3hCLE9BQU8sS0FBSyxDQUFDO1lBQ2YsS0FBSyxZQUFZLENBQUMsR0FBRztnQkFDbkIsT0FBTyxLQUFLLENBQUE7WUFDZDtnQkFDRSxPQUFPLE1BQU0sQ0FBQztTQUNqQjtJQUNILENBQUM7SUFFRDs7T0FFRztJQUNILFdBQVc7UUFDVCxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFO1lBQ3RCLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxvQkFBb0IsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQ2pIO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0gsbUJBQW1CO1FBQ2pCLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRTtZQUN2QixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDckM7SUFDSCxDQUFDOzt1SEFwRFUsMEJBQTBCOzJHQUExQiwwQkFBMEIseUtDWHZDLGdYQUlpQjsyRkRPSiwwQkFBMEI7a0JBTHRDLFNBQVM7K0JBQ0UscUJBQXFCOzBFQU10QixLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUNJLFlBQVk7c0JBQXJCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uQ2hhbmdlcywgT25Jbml0LCBPdXRwdXQsIFNpbXBsZUNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgUmVjb3JkIH0gZnJvbSAnLi4vLi4vLi4vLi4vbW9kZWxzL3JlY29yZC5tb2RlbCc7XHJcbmltcG9ydCB7IFRleHRNYXNrRW51bSwgVGV4dEZpZWxkIH0gZnJvbSAnLi4vLi4vLi4vLi4vbW9kZWxzL2ZpZWxkcy90ZXh0RmllbGQubW9kZWwnO1xyXG5pbXBvcnQgeyBJQmFzZUZpZWxkQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vLi4vaW50ZXJmYWNlcy9pQmFzZUZpZWxkQ29tcG9uZW50LmludGVyZmFjZSc7XHJcbmltcG9ydCB7IFV0aWxpdHlIZWxwZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vLi4vc2VydmljZXMvdXRpbGl0eUhlbHBlci5zZXJ2aWNlcyc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ3RleHQtZmllbGQtdGVtcGxhdGUnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi90ZXh0LWZpZWxkLXRlbXBsYXRlLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi90ZXh0LWZpZWxkLXRlbXBsYXRlLmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIFRleHRGaWVsZFRlbXBsYXRlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIElCYXNlRmllbGRDb21wb25lbnQge1xyXG5cclxuICBASW5wdXQoKSBmaWVsZDogVGV4dEZpZWxkO1xyXG4gIEBJbnB1dCgpIHJlY29yZDogUmVjb3JkO1xyXG4gIEBPdXRwdXQoKSByZWNvcmRDaGFuZ2U6IEV2ZW50RW1pdHRlcjxSZWNvcmQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxSZWNvcmQ+KCk7XHJcblxyXG4gIElucHV0TWFza0VudW0gPSBUZXh0TWFza0VudW07XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkgeyB9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gIH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xyXG4gICAgLy8gU2UgdmllbmUgbW9kaWZpY2F0byBpbCB2YWxvcmUgZGkgXCJuZ01vZGVsSW5wdXRcIiBhbGxvcmEgYWdnaW9ybmEgbCdpbnB1dFxyXG4gICAgaWYgKGNoYW5nZXNbJ3JlY29yZCddICE9IHVuZGVmaW5lZCAmJiBjaGFuZ2VzWydyZWNvcmQnXS5maXJzdENoYW5nZSA9PSBmYWxzZSAmJiBKU09OLnN0cmluZ2lmeShjaGFuZ2VzWydyZWNvcmQnXS5jdXJyZW50VmFsdWUpICE9IEpTT04uc3RyaW5naWZ5KGNoYW5nZXNbJ3JlY29yZCddLnByZXZpb3VzVmFsdWUpKSB7XHJcbiAgICAgIHRoaXMucmVjb3JkID0gY2hhbmdlc1sncmVjb3JkJ10uY3VycmVudFZhbHVlO1xyXG4gICAgICB0aGlzLnVwZGF0ZUZpZWxkKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRJbnB1dFR5cGUoKSB7XHJcbiAgICBzd2l0Y2ggKHRoaXMuZmllbGQuVGV4dE1hc2spIHtcclxuICAgICAgY2FzZSBUZXh0TWFza0VudW0uRW1haWw6XHJcbiAgICAgICAgcmV0dXJuICdlbWFpbCc7XHJcbiAgICAgIGNhc2UgVGV4dE1hc2tFbnVtLlBhc3N3b3JkOlxyXG4gICAgICAgIHJldHVybiAncGFzc3dvcmQnO1xyXG4gICAgICBjYXNlIFRleHRNYXNrRW51bS5UZWxlZm9ubzpcclxuICAgICAgICByZXR1cm4gJ3RlbCc7XHJcbiAgICAgIGNhc2UgVGV4dE1hc2tFbnVtLlVybDpcclxuICAgICAgICByZXR1cm4gJ3VybCdcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICByZXR1cm4gJ3RleHQnO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTWV0b2RvIHBlciBhZ2dpb3JuYXJlIGlsIHZhbG9yZSBkZWwgY2FtcG8gcXVhbmRvIHF1ZXN0byDDqCByYXBwcmVzZW50YXRvIGRhIHVuYSBmb3JtdWxhLlxyXG4gICAqL1xyXG4gIHVwZGF0ZUZpZWxkKCkge1xyXG4gICAgaWYgKHRoaXMuZmllbGQuRm9ybXVsYSkge1xyXG4gICAgICB0aGlzLnJlY29yZFt0aGlzLmZpZWxkLk5hbWVdID0gVXRpbGl0eUhlbHBlclNlcnZpY2UuRXZhbHVhdGVGaWVsZEZvcm11bGEodGhpcy5maWVsZC5Gb3JtdWxhLCB0aGlzLnJlY29yZCwgbnVsbCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBNZXRvZG8gcGVyIGVtZXR0ZXJlIGwnZXZlbnRvIGNoZSBpbCB2YWxvcmUgZGVsIHJlY29yZCDDqCBjYW1iaWF0by5cclxuICAgKi9cclxuICBvblJlY29yZFZhbHVlQ2hhbmdlKCkge1xyXG4gICAgaWYgKCF0aGlzLmZpZWxkLkZvcm11bGEpIHtcclxuICAgICAgdGhpcy5yZWNvcmRDaGFuZ2UuZW1pdCh0aGlzLnJlY29yZCk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsIjxtYXQtZm9ybS1maWVsZCBbZm9ybUdyb3VwXT1cImZpZWxkLkZvcm1Gb3JtR3JvdXBcIj5cclxuICAgIDxtYXQtbGFiZWw+IHt7ZmllbGQuTGFiZWx9fSA8L21hdC1sYWJlbD5cclxuICAgIDxpbnB1dCBtYXRJbnB1dCBbdHlwZV09XCJnZXRJbnB1dFR5cGUoKVwiIFtmb3JtQ29udHJvbE5hbWVdPVwiZmllbGQuTmFtZVwiIFtkaXNhYmxlZF09XCJmaWVsZC5Gb3JtRm9ybUdyb3VwLmRpc2FibGVkXCJcclxuICAgICAgICBbcmVxdWlyZWRdPVwiZmllbGQuUmVxdWlyZWRcIiBbKG5nTW9kZWwpXT1cInJlY29yZFtmaWVsZC5OYW1lXVwiIChuZ01vZGVsQ2hhbmdlKT1cIm9uUmVjb3JkVmFsdWVDaGFuZ2UoKVwiPlxyXG48L21hdC1mb3JtLWZpZWxkPiJdfQ==
@@ -0,0 +1,49 @@
1
+ import { Component, EventEmitter, Input, Output } from '@angular/core';
2
+ import { UtilityHelperService } from '../../../../services/utilityHelper.services';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "@angular/material/form-field";
5
+ import * as i2 from "@angular/material/input";
6
+ import * as i3 from "@angular/forms";
7
+ export class TextareaFieldTemplateComponent {
8
+ constructor() {
9
+ this.recordChange = new EventEmitter();
10
+ }
11
+ ngOnInit() {
12
+ }
13
+ ngOnChanges(changes) {
14
+ // Se viene modificato il valore di "ngModelInput" allora aggiorna l'input
15
+ if (changes['record'] != undefined && changes['record'].firstChange == false && JSON.stringify(changes['record'].currentValue) != JSON.stringify(changes['record'].previousValue)) {
16
+ this.record = changes['record'].currentValue;
17
+ this.updateField();
18
+ }
19
+ }
20
+ /**
21
+ * Metodo per aggiornare il valore del campo quando questo è rappresentato da una formula.
22
+ */
23
+ updateField() {
24
+ if (this.field.Formula) {
25
+ this.record[this.field.Name] = UtilityHelperService.EvaluateFieldFormula(this.field.Formula, this.record, null);
26
+ }
27
+ }
28
+ /**
29
+ * Metodo per emettere l'evento che il valore del record è cambiato.
30
+ */
31
+ onRecordValueChange() {
32
+ if (!this.field.Formula) {
33
+ this.recordChange.emit(this.record);
34
+ }
35
+ }
36
+ }
37
+ TextareaFieldTemplateComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.8", ngImport: i0, type: TextareaFieldTemplateComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
38
+ TextareaFieldTemplateComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.8", type: TextareaFieldTemplateComponent, selector: "textarea-field-template", inputs: { field: "field", record: "record" }, outputs: { recordChange: "recordChange" }, usesOnChanges: true, ngImport: i0, template: "<mat-form-field [formGroup]=\"field.FormFormGroup\">\r\n <textarea matInput [placeholder]=\"field.Label\" [rows]=\"field.Rows\" [formControlName]=\"field.Name\"\r\n [disabled]=\"field.FormFormGroup.disabled\" [required]=\"field.Required\" [(ngModel)]=\"record[field.Name]\"\r\n (ngModelChange)=\"onRecordValueChange()\"></textarea>\r\n</mat-form-field>", styles: [""], dependencies: [{ kind: "component", type: i1.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i2.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }] });
39
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.8", ngImport: i0, type: TextareaFieldTemplateComponent, decorators: [{
40
+ type: Component,
41
+ args: [{ selector: 'textarea-field-template', template: "<mat-form-field [formGroup]=\"field.FormFormGroup\">\r\n <textarea matInput [placeholder]=\"field.Label\" [rows]=\"field.Rows\" [formControlName]=\"field.Name\"\r\n [disabled]=\"field.FormFormGroup.disabled\" [required]=\"field.Required\" [(ngModel)]=\"record[field.Name]\"\r\n (ngModelChange)=\"onRecordValueChange()\"></textarea>\r\n</mat-form-field>" }]
42
+ }], ctorParameters: function () { return []; }, propDecorators: { field: [{
43
+ type: Input
44
+ }], record: [{
45
+ type: Input
46
+ }], recordChange: [{
47
+ type: Output
48
+ }] } });
49
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dGFyZWEtZmllbGQtdGVtcGxhdGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZXFwLWR5bmFtaWMtbW9kdWxlL3NyYy9saWIvY29tcG9uZW50cy9wcml2YXRlL2ZpZWxkLXRlbXBsYXRlcy90ZXh0YXJlYS1maWVsZC10ZW1wbGF0ZS90ZXh0YXJlYS1maWVsZC10ZW1wbGF0ZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9lcXAtZHluYW1pYy1tb2R1bGUvc3JjL2xpYi9jb21wb25lbnRzL3ByaXZhdGUvZmllbGQtdGVtcGxhdGVzL3RleHRhcmVhLWZpZWxkLXRlbXBsYXRlL3RleHRhcmVhLWZpZWxkLXRlbXBsYXRlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBcUIsTUFBTSxFQUFpQixNQUFNLGVBQWUsQ0FBQztBQUV6RyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQzs7Ozs7QUFTbkYsTUFBTSxPQUFPLDhCQUE4QjtJQU16QztRQUZVLGlCQUFZLEdBQXlCLElBQUksWUFBWSxFQUFVLENBQUM7SUFFMUQsQ0FBQztJQUVqQixRQUFRO0lBQ1IsQ0FBQztJQUVELFdBQVcsQ0FBQyxPQUFzQjtRQUNoQywwRUFBMEU7UUFDMUUsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksU0FBUyxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxXQUFXLElBQUksS0FBSyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLFlBQVksQ0FBQyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxFQUFFO1lBQ2pMLElBQUksQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLFlBQVksQ0FBQztZQUM3QyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7U0FDcEI7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxXQUFXO1FBQ1QsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRTtZQUN0QixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsb0JBQW9CLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztTQUNqSDtJQUNILENBQUM7SUFFRDs7T0FFRztJQUNILG1CQUFtQjtRQUNqQixJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUU7WUFDdkIsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQ3JDO0lBQ0gsQ0FBQzs7MkhBbkNVLDhCQUE4QjsrR0FBOUIsOEJBQThCLDZLQ1gzQyxtWEFJaUI7MkZET0osOEJBQThCO2tCQUwxQyxTQUFTOytCQUNFLHlCQUF5QjswRUFNMUIsS0FBSztzQkFBYixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDSSxZQUFZO3NCQUFyQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkNoYW5nZXMsIE9uSW5pdCwgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IElCYXNlRmllbGRDb21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi8uLi9pbnRlcmZhY2VzL2lCYXNlRmllbGRDb21wb25lbnQuaW50ZXJmYWNlJztcclxuaW1wb3J0IHsgVXRpbGl0eUhlbHBlclNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi8uLi9zZXJ2aWNlcy91dGlsaXR5SGVscGVyLnNlcnZpY2VzJztcclxuaW1wb3J0IHsgUmVjb3JkIH0gZnJvbSAnLi4vLi4vLi4vLi4vbW9kZWxzL3JlY29yZC5tb2RlbCc7XHJcbmltcG9ydCB7IFRleHRhcmVhRmllbGQgfSBmcm9tICcuLi8uLi8uLi8uLi9tb2RlbHMvZmllbGRzL3RleHRhcmVhRmllbGQubW9kZWwnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICd0ZXh0YXJlYS1maWVsZC10ZW1wbGF0ZScsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3RleHRhcmVhLWZpZWxkLXRlbXBsYXRlLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi90ZXh0YXJlYS1maWVsZC10ZW1wbGF0ZS5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBUZXh0YXJlYUZpZWxkVGVtcGxhdGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgSUJhc2VGaWVsZENvbXBvbmVudCB7XHJcblxyXG4gIEBJbnB1dCgpIGZpZWxkOiBUZXh0YXJlYUZpZWxkO1xyXG4gIEBJbnB1dCgpIHJlY29yZDogUmVjb3JkO1xyXG4gIEBPdXRwdXQoKSByZWNvcmRDaGFuZ2U6IEV2ZW50RW1pdHRlcjxSZWNvcmQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxSZWNvcmQ+KCk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkgeyB9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gIH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xyXG4gICAgLy8gU2UgdmllbmUgbW9kaWZpY2F0byBpbCB2YWxvcmUgZGkgXCJuZ01vZGVsSW5wdXRcIiBhbGxvcmEgYWdnaW9ybmEgbCdpbnB1dFxyXG4gICAgaWYgKGNoYW5nZXNbJ3JlY29yZCddICE9IHVuZGVmaW5lZCAmJiBjaGFuZ2VzWydyZWNvcmQnXS5maXJzdENoYW5nZSA9PSBmYWxzZSAmJiBKU09OLnN0cmluZ2lmeShjaGFuZ2VzWydyZWNvcmQnXS5jdXJyZW50VmFsdWUpICE9IEpTT04uc3RyaW5naWZ5KGNoYW5nZXNbJ3JlY29yZCddLnByZXZpb3VzVmFsdWUpKSB7XHJcbiAgICAgIHRoaXMucmVjb3JkID0gY2hhbmdlc1sncmVjb3JkJ10uY3VycmVudFZhbHVlO1xyXG4gICAgICB0aGlzLnVwZGF0ZUZpZWxkKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBNZXRvZG8gcGVyIGFnZ2lvcm5hcmUgaWwgdmFsb3JlIGRlbCBjYW1wbyBxdWFuZG8gcXVlc3RvIMOoIHJhcHByZXNlbnRhdG8gZGEgdW5hIGZvcm11bGEuXHJcbiAgICovXHJcbiAgdXBkYXRlRmllbGQoKSB7XHJcbiAgICBpZiAodGhpcy5maWVsZC5Gb3JtdWxhKSB7XHJcbiAgICAgIHRoaXMucmVjb3JkW3RoaXMuZmllbGQuTmFtZV0gPSBVdGlsaXR5SGVscGVyU2VydmljZS5FdmFsdWF0ZUZpZWxkRm9ybXVsYSh0aGlzLmZpZWxkLkZvcm11bGEsIHRoaXMucmVjb3JkLCBudWxsKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE1ldG9kbyBwZXIgZW1ldHRlcmUgbCdldmVudG8gY2hlIGlsIHZhbG9yZSBkZWwgcmVjb3JkIMOoIGNhbWJpYXRvLlxyXG4gICAqL1xyXG4gIG9uUmVjb3JkVmFsdWVDaGFuZ2UoKSB7XHJcbiAgICBpZiAoIXRoaXMuZmllbGQuRm9ybXVsYSkge1xyXG4gICAgICB0aGlzLnJlY29yZENoYW5nZS5lbWl0KHRoaXMucmVjb3JkKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwiPG1hdC1mb3JtLWZpZWxkIFtmb3JtR3JvdXBdPVwiZmllbGQuRm9ybUZvcm1Hcm91cFwiPlxyXG4gICAgPHRleHRhcmVhIG1hdElucHV0IFtwbGFjZWhvbGRlcl09XCJmaWVsZC5MYWJlbFwiIFtyb3dzXT1cImZpZWxkLlJvd3NcIiBbZm9ybUNvbnRyb2xOYW1lXT1cImZpZWxkLk5hbWVcIlxyXG4gICAgICAgIFtkaXNhYmxlZF09XCJmaWVsZC5Gb3JtRm9ybUdyb3VwLmRpc2FibGVkXCIgW3JlcXVpcmVkXT1cImZpZWxkLlJlcXVpcmVkXCIgWyhuZ01vZGVsKV09XCJyZWNvcmRbZmllbGQuTmFtZV1cIlxyXG4gICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uUmVjb3JkVmFsdWVDaGFuZ2UoKVwiPjwvdGV4dGFyZWE+XHJcbjwvbWF0LWZvcm0tZmllbGQ+Il19
@@ -0,0 +1,126 @@
1
+ import { Component, EventEmitter, Input, Output, ViewChildren } from '@angular/core';
2
+ import { FieldTypeEnum } from '../../../../models/baseField.model';
3
+ import { Form, FormScalarTypeEnum } from '../../../../models/form.model';
4
+ import { Record } from '../../../../models/record.model';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "../../../../services/utilityHelper.services";
7
+ import * as i2 from "@angular/material/button";
8
+ import * as i3 from "@angular/material/stepper";
9
+ import * as i4 from "@angular/material/tabs";
10
+ import * as i5 from "@angular/material/expansion";
11
+ import * as i6 from "@angular/forms";
12
+ import * as i7 from "@angular/common";
13
+ import * as i8 from "../../dynamic-module-field-fix/dynamic-module-field.component";
14
+ // import { DynamicModuleFieldComponent } from '../../dynamic-module-field/dynamic-module-field.component';
15
+ export class AddFormRecordComponent {
16
+ constructor(cdr, utilityService) {
17
+ this.cdr = cdr;
18
+ this.utilityService = utilityService;
19
+ this.showTitle = true;
20
+ this.showButtons = true;
21
+ this.form = new Form();
22
+ this.fieldGroups = {};
23
+ this.FormScalarTypeEnum = FormScalarTypeEnum;
24
+ this.FieldTypeEnum = FieldTypeEnum;
25
+ this.saveRecordEvent = new EventEmitter();
26
+ }
27
+ ngOnInit() {
28
+ if (this.record == null) {
29
+ this.record = new Record();
30
+ }
31
+ this.createRecordProperties();
32
+ this.reorderFormFields();
33
+ this.createFormGroup();
34
+ if (this.form.FormScalarType != FormScalarTypeEnum.Semplice) {
35
+ this.createFieldGroups();
36
+ }
37
+ this.cdr.detectChanges();
38
+ }
39
+ /**
40
+ * Metodo invocato al cambio del valore di ogni proprietà dell'oggetto record.
41
+ * Serve ad aggiornare il valore di tutti i campi che hanno una formula.
42
+ */
43
+ onRecordChange() {
44
+ if (this.fieldTemplate && this.fieldTemplate.length > 0) {
45
+ this.fieldTemplate.forEach(f => f.updateField());
46
+ }
47
+ }
48
+ /**
49
+ * Metodo per salvare i dati inseriti dall'utente una volta conclusa la compilazione della form.
50
+ */
51
+ saveOrExitForm(exit) {
52
+ if (exit) {
53
+ this.saveRecordEvent.emit(null);
54
+ }
55
+ else {
56
+ this.saveRecordEvent.emit(this.record);
57
+ }
58
+ }
59
+ /**
60
+ * Metodo per creare nell'oggetto Record le proprietà mancanti rispetto ai campi che compongono la form.
61
+ */
62
+ createRecordProperties() {
63
+ const recordProperties = Object.keys(this.record);
64
+ this.form.Fields.forEach(field => {
65
+ if (!recordProperties.find(p => p === field.Name)) {
66
+ this.record[field.Name] = null;
67
+ }
68
+ });
69
+ if (this.form.InnerForms && this.form.InnerForms.length > 0) {
70
+ this.form.InnerForms.forEach(form => {
71
+ const arrayName = form.Name.split(" ").join("_");
72
+ if (!recordProperties.find(p => p === arrayName)) {
73
+ this.record[arrayName] = [];
74
+ }
75
+ });
76
+ }
77
+ }
78
+ /**
79
+ * Metodo per riordinare i campi che compongono la form.
80
+ */
81
+ reorderFormFields() {
82
+ if (this.form.Fields && this.form.Fields.length > 0) {
83
+ this.form.Fields.sort((a, b) => (a.OrdinalPosition > b.OrdinalPosition) ? 1 : ((b.OrdinalPosition > a.OrdinalPosition) ? -1 : 0));
84
+ }
85
+ }
86
+ /**
87
+ * Metodo per creare il FormGroup che rappresenta la form.
88
+ */
89
+ createFormGroup() {
90
+ this.formForm = this.utilityService.CreateFormFormGroup(this.form.Fields, this.record, this.onlyView);
91
+ }
92
+ /**
93
+ * Metodo per creare i gruppi in cui raggruppare i campi della form in base
94
+ * a come è stata configurata dall'utente.
95
+ */
96
+ createFieldGroups() {
97
+ this.form.FormFieldsGroups
98
+ .sort((a, b) => (a.OrdinalPosition > b.OrdinalPosition) ? 1 : ((b.OrdinalPosition > a.OrdinalPosition) ? -1 : 0))
99
+ .map(g => g.Name)
100
+ .forEach(groupName => {
101
+ this.fieldGroups[groupName] = this.form.Fields.filter(f => f.FieldGroup == groupName);
102
+ });
103
+ }
104
+ }
105
+ AddFormRecordComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.8", ngImport: i0, type: AddFormRecordComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.UtilityHelperService }], target: i0.ɵɵFactoryTarget.Component });
106
+ AddFormRecordComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.8", type: AddFormRecordComponent, selector: "add-form-record", inputs: { showTitle: "showTitle", showButtons: "showButtons", form: "form", record: "record", onlyView: "onlyView" }, outputs: { saveRecordEvent: "saveRecordEvent" }, viewQueries: [{ propertyName: "fieldTemplate", predicate: ["fieldTemplate"], descendants: true }], ngImport: i0, template: "<div class=\"row eqp-dynamic-module-title\" *ngIf=\"showTitle\">\r\n <div class=\"col-md-12\">\r\n <h4><b>{{form.Name}}</b></h4>\r\n </div>\r\n</div>\r\n\r\n<form [formGroup]=\"formForm\">\r\n\r\n <!-- VISUALIZZAZIONE SEMPLICE -->\r\n <ng-container *ngIf=\"form.FormScalarType == FormScalarTypeEnum.Semplice\" [ngTemplateOutlet]=\"fieldTemplates\"\r\n [ngTemplateOutletContext]=\"{ fields: form.Fields }\">\r\n </ng-container>\r\n\r\n <!-- VISUALIZZAZIONE A STEPPER -->\r\n <mat-horizontal-stepper linear *ngIf=\"form.FormScalarType == FormScalarTypeEnum['A step']\">\r\n <mat-step *ngFor=\"let group of form.FormFieldsGroups\">\r\n <ng-template matStepLabel>\r\n {{group.Name}}\r\n </ng-template>\r\n\r\n <ng-container [ngTemplateOutlet]=\"fieldTemplates\"\r\n [ngTemplateOutletContext]=\"{ fields: fieldGroups[group.Name] }\">\r\n </ng-container>\r\n </mat-step>\r\n </mat-horizontal-stepper>\r\n\r\n <!-- VISUALIZZAZIONE A TAB -->\r\n <mat-tab-group *ngIf=\"form.FormScalarType == FormScalarTypeEnum['In tab']\">\r\n <mat-tab *ngFor=\"let group of form.FormFieldsGroups\" [label]=\"group.Name\">\r\n <div class=\"mt-3\">\r\n <ng-container [ngTemplateOutlet]=\"fieldTemplates\"\r\n [ngTemplateOutletContext]=\"{ fields: fieldGroups[group.Name] }\">\r\n </ng-container>\r\n </div>\r\n </mat-tab>\r\n </mat-tab-group>\r\n\r\n <!-- VISUALIZZAZIONE AD ACCORDION -->\r\n <mat-accordion multi *ngIf=\"form.FormScalarType == FormScalarTypeEnum['In accordion']\">\r\n <mat-expansion-panel *ngFor=\"let group of form.FormFieldsGroups\">\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>\r\n {{group.Name}}\r\n </mat-panel-title>\r\n </mat-expansion-panel-header>\r\n\r\n <ng-container [ngTemplateOutlet]=\"fieldTemplates\"\r\n [ngTemplateOutletContext]=\"{ fields: fieldGroups[group.Name] }\">\r\n </ng-container>\r\n </mat-expansion-panel>\r\n </mat-accordion>\r\n</form>\r\n\r\n<div class=\"row mt-2\" *ngIf=\"showButtons\">\r\n <div class=\"col-sm-12 text-right\">\r\n <button class=\"mr-2\" mat-raised-button (click)=\"saveOrExitForm(true)\" type=\"button\">\r\n Annulla\r\n </button>\r\n <button class=\"mr-2\" mat-raised-button color=\"primary\" (click)=\"saveOrExitForm(false)\"\r\n [disabled]=\"formForm.invalid || formForm.disabled\" type=\"button\">\r\n Salva\r\n </button>\r\n </div>\r\n</div>\r\n\r\n<!-- TEMPLATE PER LA VISUALIZZAZIONE DEI CAMPI DELLA FORM -->\r\n<ng-template #fieldTemplates let-fields='fields'>\r\n <div class=\"row\">\r\n <div class=\"mt-2\" *ngFor=\"let field of fields\" [ngClass]=\"utilityService.getFieldSyleClass(field)\">\r\n <dynamic-module-field-fix #fieldTemplate [field]=\"field\" [form]=\"form\" [record]=\"record\"\r\n (recordChange)=\"onRecordChange()\"></dynamic-module-field-fix>\r\n </div>\r\n </div>\r\n</ng-template>", styles: [""], dependencies: [{ kind: "component", type: i2.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i3.MatStep, selector: "mat-step", inputs: ["color"], exportAs: ["matStep"] }, { kind: "directive", type: i3.MatStepLabel, selector: "[matStepLabel]" }, { kind: "component", type: i3.MatStepper, selector: "mat-stepper, mat-vertical-stepper, mat-horizontal-stepper, [matStepper]", inputs: ["selectedIndex", "disableRipple", "color", "labelPosition", "headerPosition", "animationDuration"], outputs: ["animationDone"], exportAs: ["matStepper", "matVerticalStepper", "matHorizontalStepper"] }, { kind: "component", type: i4.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "disableRipple"], exportAs: ["matTabGroup"] }, { kind: "component", type: i4.MatTab, selector: "mat-tab", inputs: ["disabled", "label", "aria-label", "aria-labelledby", "labelClass", "bodyClass"], exportAs: ["matTab"] }, { kind: "directive", type: i5.MatAccordion, selector: "mat-accordion", inputs: ["multi", "hideToggle", "displayMode", "togglePosition"], exportAs: ["matAccordion"] }, { kind: "component", type: i5.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["disabled", "expanded", "hideToggle", "togglePosition"], outputs: ["opened", "closed", "expandedChange", "afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "component", type: i5.MatExpansionPanelHeader, selector: "mat-expansion-panel-header", inputs: ["tabIndex", "expandedHeight", "collapsedHeight"] }, { kind: "directive", type: i5.MatExpansionPanelTitle, selector: "mat-panel-title" }, { kind: "directive", type: i6.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i6.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i7.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i6.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i8.DynamicModuleFieldFixComponent, selector: "dynamic-module-field-fix", inputs: ["field", "form", "record"], outputs: ["recordChange"] }] });
107
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.8", ngImport: i0, type: AddFormRecordComponent, decorators: [{
108
+ type: Component,
109
+ args: [{ selector: 'add-form-record', template: "<div class=\"row eqp-dynamic-module-title\" *ngIf=\"showTitle\">\r\n <div class=\"col-md-12\">\r\n <h4><b>{{form.Name}}</b></h4>\r\n </div>\r\n</div>\r\n\r\n<form [formGroup]=\"formForm\">\r\n\r\n <!-- VISUALIZZAZIONE SEMPLICE -->\r\n <ng-container *ngIf=\"form.FormScalarType == FormScalarTypeEnum.Semplice\" [ngTemplateOutlet]=\"fieldTemplates\"\r\n [ngTemplateOutletContext]=\"{ fields: form.Fields }\">\r\n </ng-container>\r\n\r\n <!-- VISUALIZZAZIONE A STEPPER -->\r\n <mat-horizontal-stepper linear *ngIf=\"form.FormScalarType == FormScalarTypeEnum['A step']\">\r\n <mat-step *ngFor=\"let group of form.FormFieldsGroups\">\r\n <ng-template matStepLabel>\r\n {{group.Name}}\r\n </ng-template>\r\n\r\n <ng-container [ngTemplateOutlet]=\"fieldTemplates\"\r\n [ngTemplateOutletContext]=\"{ fields: fieldGroups[group.Name] }\">\r\n </ng-container>\r\n </mat-step>\r\n </mat-horizontal-stepper>\r\n\r\n <!-- VISUALIZZAZIONE A TAB -->\r\n <mat-tab-group *ngIf=\"form.FormScalarType == FormScalarTypeEnum['In tab']\">\r\n <mat-tab *ngFor=\"let group of form.FormFieldsGroups\" [label]=\"group.Name\">\r\n <div class=\"mt-3\">\r\n <ng-container [ngTemplateOutlet]=\"fieldTemplates\"\r\n [ngTemplateOutletContext]=\"{ fields: fieldGroups[group.Name] }\">\r\n </ng-container>\r\n </div>\r\n </mat-tab>\r\n </mat-tab-group>\r\n\r\n <!-- VISUALIZZAZIONE AD ACCORDION -->\r\n <mat-accordion multi *ngIf=\"form.FormScalarType == FormScalarTypeEnum['In accordion']\">\r\n <mat-expansion-panel *ngFor=\"let group of form.FormFieldsGroups\">\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>\r\n {{group.Name}}\r\n </mat-panel-title>\r\n </mat-expansion-panel-header>\r\n\r\n <ng-container [ngTemplateOutlet]=\"fieldTemplates\"\r\n [ngTemplateOutletContext]=\"{ fields: fieldGroups[group.Name] }\">\r\n </ng-container>\r\n </mat-expansion-panel>\r\n </mat-accordion>\r\n</form>\r\n\r\n<div class=\"row mt-2\" *ngIf=\"showButtons\">\r\n <div class=\"col-sm-12 text-right\">\r\n <button class=\"mr-2\" mat-raised-button (click)=\"saveOrExitForm(true)\" type=\"button\">\r\n Annulla\r\n </button>\r\n <button class=\"mr-2\" mat-raised-button color=\"primary\" (click)=\"saveOrExitForm(false)\"\r\n [disabled]=\"formForm.invalid || formForm.disabled\" type=\"button\">\r\n Salva\r\n </button>\r\n </div>\r\n</div>\r\n\r\n<!-- TEMPLATE PER LA VISUALIZZAZIONE DEI CAMPI DELLA FORM -->\r\n<ng-template #fieldTemplates let-fields='fields'>\r\n <div class=\"row\">\r\n <div class=\"mt-2\" *ngFor=\"let field of fields\" [ngClass]=\"utilityService.getFieldSyleClass(field)\">\r\n <dynamic-module-field-fix #fieldTemplate [field]=\"field\" [form]=\"form\" [record]=\"record\"\r\n (recordChange)=\"onRecordChange()\"></dynamic-module-field-fix>\r\n </div>\r\n </div>\r\n</ng-template>" }]
110
+ }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i1.UtilityHelperService }]; }, propDecorators: { showTitle: [{
111
+ type: Input
112
+ }], showButtons: [{
113
+ type: Input
114
+ }], form: [{
115
+ type: Input
116
+ }], record: [{
117
+ type: Input
118
+ }], onlyView: [{
119
+ type: Input
120
+ }], saveRecordEvent: [{
121
+ type: Output
122
+ }], fieldTemplate: [{
123
+ type: ViewChildren,
124
+ args: ["fieldTemplate"]
125
+ }] } });
126
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkLWZvcm0tcmVjb3JkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2VxcC1keW5hbWljLW1vZHVsZS9zcmMvbGliL2NvbXBvbmVudHMvcHJpdmF0ZS9mb3JtLXJlY29yZHMvYWRkLWZvcm0tcmVjb3JkL2FkZC1mb3JtLXJlY29yZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9lcXAtZHluYW1pYy1tb2R1bGUvc3JjL2xpYi9jb21wb25lbnRzL3ByaXZhdGUvZm9ybS1yZWNvcmRzL2FkZC1mb3JtLXJlY29yZC9hZGQtZm9ybS1yZWNvcmQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFxQixTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQWEsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTNILE9BQU8sRUFBYSxhQUFhLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUM5RSxPQUFPLEVBQUUsSUFBSSxFQUFFLGtCQUFrQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDekUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGlDQUFpQyxDQUFDOzs7Ozs7Ozs7O0FBR3pELDJHQUEyRztBQU8zRyxNQUFNLE9BQU8sc0JBQXNCO0lBZ0JqQyxZQUNVLEdBQXNCLEVBQ3ZCLGNBQW9DO1FBRG5DLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBQ3ZCLG1CQUFjLEdBQWQsY0FBYyxDQUFzQjtRQWhCcEMsY0FBUyxHQUFHLElBQUksQ0FBQztRQUNqQixnQkFBVyxHQUFHLElBQUksQ0FBQztRQUNuQixTQUFJLEdBQVMsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUlqQyxnQkFBVyxHQUF3QyxFQUFFLENBQUM7UUFDdEQsdUJBQWtCLEdBQUcsa0JBQWtCLENBQUM7UUFDeEMsa0JBQWEsR0FBRyxh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eUVjOzJGRDNERCxzQkFBc0I7a0JBTGxDLFNBQVM7K0JBQ0UsaUJBQWlCOzJJQU1sQixTQUFTO3NCQUFqQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQU1JLGVBQWU7c0JBQXhCLE1BQU07Z0JBRXdCLGFBQWE7c0JBQTNDLFlBQVk7dUJBQUMsZUFBZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0LCBRdWVyeUxpc3QsIFZpZXdDaGlsZHJlbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBVbnR5cGVkRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBCYXNlRmllbGQsIEZpZWxkVHlwZUVudW0gfSBmcm9tICcuLi8uLi8uLi8uLi9tb2RlbHMvYmFzZUZpZWxkLm1vZGVsJztcclxuaW1wb3J0IHsgRm9ybSwgRm9ybVNjYWxhclR5cGVFbnVtIH0gZnJvbSAnLi4vLi4vLi4vLi4vbW9kZWxzL2Zvcm0ubW9kZWwnO1xyXG5pbXBvcnQgeyBSZWNvcmQgfSBmcm9tICcuLi8uLi8uLi8uLi9tb2RlbHMvcmVjb3JkLm1vZGVsJztcclxuaW1wb3J0IHsgVXRpbGl0eUhlbHBlclNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi8uLi9zZXJ2aWNlcy91dGlsaXR5SGVscGVyLnNlcnZpY2VzJztcclxuaW1wb3J0IHsgRHluYW1pY01vZHVsZUZpZWxkRml4Q29tcG9uZW50IH0gZnJvbSAnLi4vLi4vZHluYW1pYy1tb2R1bGUtZmllbGQtZml4L2R5bmFtaWMtbW9kdWxlLWZpZWxkLmNvbXBvbmVudCc7XHJcbi8vIGltcG9ydCB7IER5bmFtaWNNb2R1bGVGaWVsZENvbXBvbmVudCB9IGZyb20gJy4uLy4uL2R5bmFtaWMtbW9kdWxlLWZpZWxkL2R5bmFtaWMtbW9kdWxlLWZpZWxkLmNvbXBvbmVudCc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2FkZC1mb3JtLXJlY29yZCcsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2FkZC1mb3JtLXJlY29yZC5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vYWRkLWZvcm0tcmVjb3JkLmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIEFkZEZvcm1SZWNvcmRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG5cclxuICBASW5wdXQoKSBzaG93VGl0bGUgPSB0cnVlO1xyXG4gIEBJbnB1dCgpIHNob3dCdXR0b25zID0gdHJ1ZTtcclxuICBASW5wdXQoKSBmb3JtOiBGb3JtID0gbmV3IEZvcm0oKTtcclxuICBASW5wdXQoKSByZWNvcmQ6IFJlY29yZDtcclxuICBASW5wdXQoKSBvbmx5VmlldzogYm9vbGVhbjtcclxuICBmb3JtRm9ybTogVW50eXBlZEZvcm1Hcm91cDtcclxuICBmaWVsZEdyb3VwczogeyBba2V5OiBzdHJpbmddOiBBcnJheTxCYXNlRmllbGQ+IH0gPSB7fTtcclxuICBGb3JtU2NhbGFyVHlwZUVudW0gPSBGb3JtU2NhbGFyVHlwZUVudW07XHJcbiAgRmllbGRUeXBlRW51bSA9IEZpZWxkVHlwZUVudW07XHJcblxyXG4gIEBPdXRwdXQoKSBzYXZlUmVjb3JkRXZlbnQ6IEV2ZW50RW1pdHRlcjxSZWNvcmQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxSZWNvcmQ+KCk7XHJcblxyXG4gIEBWaWV3Q2hpbGRyZW4oXCJmaWVsZFRlbXBsYXRlXCIpIGZpZWxkVGVtcGxhdGU6IFF1ZXJ5TGlzdDxEeW5hbWljTW9kdWxlRmllbGRGaXhDb21wb25lbnQ+O1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgIHB1YmxpYyB1dGlsaXR5U2VydmljZTogVXRpbGl0eUhlbHBlclNlcnZpY2VcclxuICApIHsgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnJlY29yZCA9PSBudWxsKSB7XHJcbiAgICAgIHRoaXMucmVjb3JkID0gbmV3IFJlY29yZCgpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jcmVhdGVSZWNvcmRQcm9wZXJ0aWVzKCk7XHJcbiAgICB0aGlzLnJlb3JkZXJGb3JtRmllbGRzKCk7XHJcbiAgICB0aGlzLmNyZWF0ZUZvcm1Hcm91cCgpO1xyXG4gICAgaWYgKHRoaXMuZm9ybS5Gb3JtU2NhbGFyVHlwZSAhPSBGb3JtU2NhbGFyVHlwZUVudW0uU2VtcGxpY2UpIHtcclxuICAgICAgdGhpcy5jcmVhdGVGaWVsZEdyb3VwcygpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTWV0b2RvIGludm9jYXRvIGFsIGNhbWJpbyBkZWwgdmFsb3JlIGRpIG9nbmkgcHJvcHJpZXTDoCBkZWxsJ29nZ2V0dG8gcmVjb3JkLlxyXG4gICAqIFNlcnZlIGFkIGFnZ2lvcm5hcmUgaWwgdmFsb3JlIGRpIHR1dHRpIGkgY2FtcGkgY2hlIGhhbm5vIHVuYSBmb3JtdWxhLlxyXG4gICAqL1xyXG4gIG9uUmVjb3JkQ2hhbmdlKCkge1xyXG4gICAgaWYgKHRoaXMuZmllbGRUZW1wbGF0ZSAmJiB0aGlzLmZpZWxkVGVtcGxhdGUubGVuZ3RoID4gMCkge1xyXG4gICAgICB0aGlzLmZpZWxkVGVtcGxhdGUuZm9yRWFjaChmID0+IGYudXBkYXRlRmllbGQoKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBNZXRvZG8gcGVyIHNhbHZhcmUgaSBkYXRpIGluc2VyaXRpIGRhbGwndXRlbnRlIHVuYSB2b2x0YSBjb25jbHVzYSBsYSBjb21waWxhemlvbmUgZGVsbGEgZm9ybS5cclxuICAgKi9cclxuICBzYXZlT3JFeGl0Rm9ybShleGl0OiBib29sZWFuKSB7XHJcbiAgICBpZiAoZXhpdCkge1xyXG4gICAgICB0aGlzLnNhdmVSZWNvcmRFdmVudC5lbWl0KG51bGwpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5zYXZlUmVjb3JkRXZlbnQuZW1pdCh0aGlzLnJlY29yZCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBNZXRvZG8gcGVyIGNyZWFyZSBuZWxsJ29nZ2V0dG8gUmVjb3JkIGxlIHByb3ByaWV0w6AgbWFuY2FudGkgcmlzcGV0dG8gYWkgY2FtcGkgY2hlIGNvbXBvbmdvbm8gbGEgZm9ybS5cclxuICAgKi9cclxuICBwcml2YXRlIGNyZWF0ZVJlY29yZFByb3BlcnRpZXMoKSB7XHJcbiAgICBjb25zdCByZWNvcmRQcm9wZXJ0aWVzOiBBcnJheTxzdHJpbmc+ID0gT2JqZWN0LmtleXModGhpcy5yZWNvcmQpO1xyXG4gICAgdGhpcy5mb3JtLkZpZWxkcy5mb3JFYWNoKGZpZWxkID0+IHtcclxuICAgICAgaWYgKCFyZWNvcmRQcm9wZXJ0aWVzLmZpbmQocCA9PiBwID09PSBmaWVsZC5OYW1lKSkge1xyXG4gICAgICAgIHRoaXMucmVjb3JkW2ZpZWxkLk5hbWVdID0gbnVsbDtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICBpZiAodGhpcy5mb3JtLklubmVyRm9ybXMgJiYgdGhpcy5mb3JtLklubmVyRm9ybXMubGVuZ3RoID4gMCkge1xyXG4gICAgICB0aGlzLmZvcm0uSW5uZXJGb3Jtcy5mb3JFYWNoKGZvcm0gPT4ge1xyXG4gICAgICAgIGNvbnN0IGFycmF5TmFtZTogc3RyaW5nID0gZm9ybS5OYW1lLnNwbGl0KFwiIFwiKS5qb2luKFwiX1wiKTtcclxuICAgICAgICBpZiAoIXJlY29yZFByb3BlcnRpZXMuZmluZChwID0+IHAgPT09IGFycmF5TmFtZSkpIHtcclxuICAgICAgICAgIHRoaXMucmVjb3JkW2FycmF5TmFtZV0gPSBbXTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTWV0b2RvIHBlciByaW9yZGluYXJlIGkgY2FtcGkgY2hlIGNvbXBvbmdvbm8gbGEgZm9ybS5cclxuICAgKi9cclxuICBwcml2YXRlIHJlb3JkZXJGb3JtRmllbGRzKCkge1xyXG4gICAgaWYgKHRoaXMuZm9ybS5GaWVsZHMgJiYgdGhpcy5mb3JtLkZpZWxkcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHRoaXMuZm9ybS5GaWVsZHMuc29ydCgoYSwgYikgPT4gKGEuT3JkaW5hbFBvc2l0aW9uID4gYi5PcmRpbmFsUG9zaXRpb24pID8gMSA6ICgoYi5PcmRpbmFsUG9zaXRpb24gPiBhLk9yZGluYWxQb3NpdGlvbikgPyAtMSA6IDApKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE1ldG9kbyBwZXIgY3JlYXJlIGlsIEZvcm1Hcm91cCBjaGUgcmFwcHJlc2VudGEgbGEgZm9ybS5cclxuICAgKi9cclxuICBwcml2YXRlIGNyZWF0ZUZvcm1Hcm91cCgpIHtcclxuICAgIHRoaXMuZm9ybUZvcm0gPSB0aGlzLnV0aWxpdHlTZXJ2aWNlLkNyZWF0ZUZvcm1Gb3JtR3JvdXAodGhpcy5mb3JtLkZpZWxkcywgdGhpcy5yZWNvcmQsIHRoaXMub25seVZpZXcpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTWV0b2RvIHBlciBjcmVhcmUgaSBncnVwcGkgaW4gY3VpIHJhZ2dydXBwYXJlIGkgY2FtcGkgZGVsbGEgZm9ybSBpbiBiYXNlIFxyXG4gICAqIGEgY29tZSDDqCBzdGF0YSBjb25maWd1cmF0YSBkYWxsJ3V0ZW50ZS5cclxuICAgKi9cclxuICBwcml2YXRlIGNyZWF0ZUZpZWxkR3JvdXBzKCkge1xyXG4gICAgdGhpcy5mb3JtLkZvcm1GaWVsZHNHcm91cHNcclxuICAgICAgLnNvcnQoKGEsIGIpID0+IChhLk9yZGluYWxQb3NpdGlvbiA+IGIuT3JkaW5hbFBvc2l0aW9uKSA/IDEgOiAoKGIuT3JkaW5hbFBvc2l0aW9uID4gYS5PcmRpbmFsUG9zaXRpb24pID8gLTEgOiAwKSlcclxuICAgICAgLm1hcChnID0+IGcuTmFtZSlcclxuICAgICAgLmZvckVhY2goZ3JvdXBOYW1lID0+IHtcclxuICAgICAgICB0aGlzLmZpZWxkR3JvdXBzW2dyb3VwTmFtZV0gPSB0aGlzLmZvcm0uRmllbGRzLmZpbHRlcihmID0+IGYuRmllbGRHcm91cCA9PSBncm91cE5hbWUpO1xyXG4gICAgICB9KTtcclxuICB9XHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cInJvdyBlcXAtZHluYW1pYy1tb2R1bGUtdGl0bGVcIiAqbmdJZj1cInNob3dUaXRsZVwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMlwiPlxyXG4gICAgICAgIDxoND48Yj57e2Zvcm0uTmFtZX19PC9iPjwvaDQ+XHJcbiAgICA8L2Rpdj5cclxuPC9kaXY+XHJcblxyXG48Zm9ybSBbZm9ybUdyb3VwXT1cImZvcm1Gb3JtXCI+XHJcblxyXG4gICAgPCEtLSBWSVNVQUxJWlpBWklPTkUgU0VNUExJQ0UgLS0+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZm9ybS5Gb3JtU2NhbGFyVHlwZSA9PSBGb3JtU2NhbGFyVHlwZUVudW0uU2VtcGxpY2VcIiBbbmdUZW1wbGF0ZU91dGxldF09XCJmaWVsZFRlbXBsYXRlc1wiXHJcbiAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgZmllbGRzOiBmb3JtLkZpZWxkcyB9XCI+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICA8IS0tIFZJU1VBTElaWkFaSU9ORSBBIFNURVBQRVIgLS0+XHJcbiAgICA8bWF0LWhvcml6b250YWwtc3RlcHBlciBsaW5lYXIgKm5nSWY9XCJmb3JtLkZvcm1TY2FsYXJUeXBlID09IEZvcm1TY2FsYXJUeXBlRW51bVsnQSBzdGVwJ11cIj5cclxuICAgICAgICA8bWF0LXN0ZXAgKm5nRm9yPVwibGV0IGdyb3VwIG9mIGZvcm0uRm9ybUZpZWxkc0dyb3Vwc1wiPlxyXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgbWF0U3RlcExhYmVsPlxyXG4gICAgICAgICAgICAgICAge3tncm91cC5OYW1lfX1cclxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwiZmllbGRUZW1wbGF0ZXNcIlxyXG4gICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgZmllbGRzOiBmaWVsZEdyb3Vwc1tncm91cC5OYW1lXSB9XCI+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvbWF0LXN0ZXA+XHJcbiAgICA8L21hdC1ob3Jpem9udGFsLXN0ZXBwZXI+XHJcblxyXG4gICAgPCEtLSBWSVNVQUxJWlpBWklPTkUgQSBUQUIgLS0+XHJcbiAgICA8bWF0LXRhYi1ncm91cCAqbmdJZj1cImZvcm0uRm9ybVNjYWxhclR5cGUgPT0gRm9ybVNjYWxhclR5cGVFbnVtWydJbiB0YWInXVwiPlxyXG4gICAgICAgIDxtYXQtdGFiICpuZ0Zvcj1cImxldCBncm91cCBvZiBmb3JtLkZvcm1GaWVsZHNHcm91cHNcIiBbbGFiZWxdPVwiZ3JvdXAuTmFtZVwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtM1wiPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJmaWVsZFRlbXBsYXRlc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgZmllbGRzOiBmaWVsZEdyb3Vwc1tncm91cC5OYW1lXSB9XCI+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9tYXQtdGFiPlxyXG4gICAgPC9tYXQtdGFiLWdyb3VwPlxyXG5cclxuICAgIDwhLS0gVklTVUFMSVpaQVpJT05FIEFEIEFDQ09SRElPTiAtLT5cclxuICAgIDxtYXQtYWNjb3JkaW9uIG11bHRpICpuZ0lmPVwiZm9ybS5Gb3JtU2NhbGFyVHlwZSA9PSBGb3JtU2NhbGFyVHlwZUVudW1bJ0luIGFjY29yZGlvbiddXCI+XHJcbiAgICAgICAgPG1hdC1leHBhbnNpb24tcGFuZWwgKm5nRm9yPVwibGV0IGdyb3VwIG9mIGZvcm0uRm9ybUZpZWxkc0dyb3Vwc1wiPlxyXG4gICAgICAgICAgICA8bWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI+XHJcbiAgICAgICAgICAgICAgICA8bWF0LXBhbmVsLXRpdGxlPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7Z3JvdXAuTmFtZX19XHJcbiAgICAgICAgICAgICAgICA8L21hdC1wYW5lbC10aXRsZT5cclxuICAgICAgICAgICAgPC9tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcj5cclxuXHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwiZmllbGRUZW1wbGF0ZXNcIlxyXG4gICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgZmllbGRzOiBmaWVsZEdyb3Vwc1tncm91cC5OYW1lXSB9XCI+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvbWF0LWV4cGFuc2lvbi1wYW5lbD5cclxuICAgIDwvbWF0LWFjY29yZGlvbj5cclxuPC9mb3JtPlxyXG5cclxuPGRpdiBjbGFzcz1cInJvdyBtdC0yXCIgKm5nSWY9XCJzaG93QnV0dG9uc1wiPlxyXG4gICAgPGRpdiBjbGFzcz1cImNvbC1zbS0xMiB0ZXh0LXJpZ2h0XCI+XHJcbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cIm1yLTJcIiBtYXQtcmFpc2VkLWJ1dHRvbiAoY2xpY2spPVwic2F2ZU9yRXhpdEZvcm0odHJ1ZSlcIiB0eXBlPVwiYnV0dG9uXCI+XHJcbiAgICAgICAgICAgIEFubnVsbGFcclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwibXItMlwiIG1hdC1yYWlzZWQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIChjbGljayk9XCJzYXZlT3JFeGl0Rm9ybShmYWxzZSlcIlxyXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiZm9ybUZvcm0uaW52YWxpZCB8fCBmb3JtRm9ybS5kaXNhYmxlZFwiIHR5cGU9XCJidXR0b25cIj5cclxuICAgICAgICAgICAgU2FsdmFcclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG48L2Rpdj5cclxuXHJcbjwhLS0gVEVNUExBVEUgUEVSIExBIFZJU1VBTElaWkFaSU9ORSBERUkgQ0FNUEkgREVMTEEgRk9STSAtLT5cclxuPG5nLXRlbXBsYXRlICNmaWVsZFRlbXBsYXRlcyBsZXQtZmllbGRzPSdmaWVsZHMnPlxyXG4gICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtdC0yXCIgKm5nRm9yPVwibGV0IGZpZWxkIG9mIGZpZWxkc1wiIFtuZ0NsYXNzXT1cInV0aWxpdHlTZXJ2aWNlLmdldEZpZWxkU3lsZUNsYXNzKGZpZWxkKVwiPlxyXG4gICAgICAgICAgICA8ZHluYW1pYy1tb2R1bGUtZmllbGQtZml4ICNmaWVsZFRlbXBsYXRlIFtmaWVsZF09XCJmaWVsZFwiIFtmb3JtXT1cImZvcm1cIiBbcmVjb3JkXT1cInJlY29yZFwiXHJcbiAgICAgICAgICAgICAgICAocmVjb3JkQ2hhbmdlKT1cIm9uUmVjb3JkQ2hhbmdlKClcIj48L2R5bmFtaWMtbW9kdWxlLWZpZWxkLWZpeD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG48L25nLXRlbXBsYXRlPiJdfQ==