kitsng-form-factory 0.4.34

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 (106) hide show
  1. package/README.md +24 -0
  2. package/esm2022/kitsng-form-factory.mjs +5 -0
  3. package/esm2022/lib/kitsng-form-factory/components/kitsng-form-array/kitsng-form-array.component.mjs +176 -0
  4. package/esm2022/lib/kitsng-form-factory/components/kitsng-form-element/kitsng-form-element.component.mjs +67 -0
  5. package/esm2022/lib/kitsng-form-factory/components/kitsng-form-factory/kitsng-form-factory.component.mjs +94 -0
  6. package/esm2022/lib/kitsng-form-factory/components/kitsng-form-factory-core/kitsng-form-factory-core.component.mjs +65 -0
  7. package/esm2022/lib/kitsng-form-factory/components/kitsng-form-fields/auto-complete/auto-complete.component.mjs +156 -0
  8. package/esm2022/lib/kitsng-form-factory/components/kitsng-form-fields/button/button.component.mjs +42 -0
  9. package/esm2022/lib/kitsng-form-factory/components/kitsng-form-fields/calendar-picker/calendar-picker.component.mjs +50 -0
  10. package/esm2022/lib/kitsng-form-factory/components/kitsng-form-fields/checkbox/checkbox.component.mjs +58 -0
  11. package/esm2022/lib/kitsng-form-factory/components/kitsng-form-fields/checkbox-group/checkbox-group.component.mjs +48 -0
  12. package/esm2022/lib/kitsng-form-factory/components/kitsng-form-fields/chips/chips.component.mjs +37 -0
  13. package/esm2022/lib/kitsng-form-factory/components/kitsng-form-fields/color-picker/color-picker.component.mjs +114 -0
  14. package/esm2022/lib/kitsng-form-factory/components/kitsng-form-fields/divider/divider.component.mjs +22 -0
  15. package/esm2022/lib/kitsng-form-factory/components/kitsng-form-fields/dropdown/dropdown.component.mjs +58 -0
  16. package/esm2022/lib/kitsng-form-factory/components/kitsng-form-fields/editor/editor.component.mjs +51 -0
  17. package/esm2022/lib/kitsng-form-factory/components/kitsng-form-fields/field-errors/field-errors.component.mjs +143 -0
  18. package/esm2022/lib/kitsng-form-factory/components/kitsng-form-fields/file-upload/file-type-url.pipe.mjs +18 -0
  19. package/esm2022/lib/kitsng-form-factory/components/kitsng-form-fields/file-upload/file-upload.component.mjs +120 -0
  20. package/esm2022/lib/kitsng-form-factory/components/kitsng-form-fields/form-element-layout/form-element-layout.component.mjs +179 -0
  21. package/esm2022/lib/kitsng-form-factory/components/kitsng-form-fields/google-map/google-map.component.mjs +113 -0
  22. package/esm2022/lib/kitsng-form-factory/components/kitsng-form-fields/icon-picker/icon-data.mjs +179 -0
  23. package/esm2022/lib/kitsng-form-factory/components/kitsng-form-fields/icon-picker/icon-picker.component.mjs +74 -0
  24. package/esm2022/lib/kitsng-form-factory/components/kitsng-form-fields/input/input.component.mjs +50 -0
  25. package/esm2022/lib/kitsng-form-factory/components/kitsng-form-fields/input-group/input-group.component.mjs +50 -0
  26. package/esm2022/lib/kitsng-form-factory/components/kitsng-form-fields/input-mask/input-mask.component.mjs +37 -0
  27. package/esm2022/lib/kitsng-form-factory/components/kitsng-form-fields/input-number/input-number.component.mjs +50 -0
  28. package/esm2022/lib/kitsng-form-factory/components/kitsng-form-fields/input-phone/input-phone.component.mjs +174 -0
  29. package/esm2022/lib/kitsng-form-factory/components/kitsng-form-fields/lookup-multi-select/lookup-multi-select.component.mjs +263 -0
  30. package/esm2022/lib/kitsng-form-factory/components/kitsng-form-fields/lookup-select/lookup-select.component.mjs +332 -0
  31. package/esm2022/lib/kitsng-form-factory/components/kitsng-form-fields/multi-select/multi-select.component.mjs +60 -0
  32. package/esm2022/lib/kitsng-form-factory/components/kitsng-form-fields/password/password.component.mjs +37 -0
  33. package/esm2022/lib/kitsng-form-factory/components/kitsng-form-fields/radio-button/radio-button.component.mjs +48 -0
  34. package/esm2022/lib/kitsng-form-factory/components/kitsng-form-fields/rating/rating.component.mjs +37 -0
  35. package/esm2022/lib/kitsng-form-factory/components/kitsng-form-fields/select-button/select-button.component.mjs +50 -0
  36. package/esm2022/lib/kitsng-form-factory/components/kitsng-form-fields/slider/slider.component.mjs +49 -0
  37. package/esm2022/lib/kitsng-form-factory/components/kitsng-form-fields/switch-button/switch-button.component.mjs +58 -0
  38. package/esm2022/lib/kitsng-form-factory/components/kitsng-form-fields/textarea/textarea.component.mjs +50 -0
  39. package/esm2022/lib/kitsng-form-factory/components/kitsng-form-fields/title/title.component.mjs +23 -0
  40. package/esm2022/lib/kitsng-form-factory/components/kitsng-form-fields/tree-select/tree-select.component.mjs +122 -0
  41. package/esm2022/lib/kitsng-form-factory/components/kitsng-form-group/kitsng-form-group.component.mjs +54 -0
  42. package/esm2022/lib/kitsng-form-factory/core/directives/kitsng-form-control-template.directive.mjs +19 -0
  43. package/esm2022/lib/kitsng-form-factory/core/models/kitsng-dynamic-field.mjs +2 -0
  44. package/esm2022/lib/kitsng-form-factory/core/models/kitsng-field-type.mjs +2 -0
  45. package/esm2022/lib/kitsng-form-factory/core/models/kitsng-form-factory.mjs +14 -0
  46. package/esm2022/lib/kitsng-form-factory/core/services/kitsng-form-control-template-registry.service.mjs +22 -0
  47. package/esm2022/lib/kitsng-form-factory/core/services/kitsng-form-factory.service.mjs +340 -0
  48. package/esm2022/lib/kitsng-form-factory/core/services/kitsng-form-helper.service.mjs +67 -0
  49. package/esm2022/lib/kitsng-form-factory/core/services/lookup-list.service.mjs +132 -0
  50. package/esm2022/lib/kitsng-form-factory/core/services/overlay.service.mjs +30 -0
  51. package/esm2022/lib/kitsng-form-factory/kitsng-form-factory.module.mjs +279 -0
  52. package/esm2022/public-api.mjs +15 -0
  53. package/fesm2022/kitsng-form-factory.mjs +3956 -0
  54. package/fesm2022/kitsng-form-factory.mjs.map +1 -0
  55. package/index.d.ts +5 -0
  56. package/lib/kitsng-form-factory/components/kitsng-form-array/kitsng-form-array.component.d.ts +31 -0
  57. package/lib/kitsng-form-factory/components/kitsng-form-element/kitsng-form-element.component.d.ts +38 -0
  58. package/lib/kitsng-form-factory/components/kitsng-form-factory/kitsng-form-factory.component.d.ts +31 -0
  59. package/lib/kitsng-form-factory/components/kitsng-form-factory-core/kitsng-form-factory-core.component.d.ts +29 -0
  60. package/lib/kitsng-form-factory/components/kitsng-form-fields/auto-complete/auto-complete.component.d.ts +49 -0
  61. package/lib/kitsng-form-factory/components/kitsng-form-fields/button/button.component.d.ts +14 -0
  62. package/lib/kitsng-form-factory/components/kitsng-form-fields/calendar-picker/calendar-picker.component.d.ts +31 -0
  63. package/lib/kitsng-form-factory/components/kitsng-form-fields/checkbox/checkbox.component.d.ts +34 -0
  64. package/lib/kitsng-form-factory/components/kitsng-form-fields/checkbox-group/checkbox-group.component.d.ts +30 -0
  65. package/lib/kitsng-form-factory/components/kitsng-form-fields/chips/chips.component.d.ts +13 -0
  66. package/lib/kitsng-form-factory/components/kitsng-form-fields/color-picker/color-picker.component.d.ts +40 -0
  67. package/lib/kitsng-form-factory/components/kitsng-form-fields/divider/divider.component.d.ts +9 -0
  68. package/lib/kitsng-form-factory/components/kitsng-form-fields/dropdown/dropdown.component.d.ts +35 -0
  69. package/lib/kitsng-form-factory/components/kitsng-form-fields/editor/editor.component.d.ts +30 -0
  70. package/lib/kitsng-form-factory/components/kitsng-form-fields/field-errors/field-errors.component.d.ts +22 -0
  71. package/lib/kitsng-form-factory/components/kitsng-form-fields/file-upload/file-type-url.pipe.d.ts +7 -0
  72. package/lib/kitsng-form-factory/components/kitsng-form-fields/file-upload/file-upload.component.d.ts +40 -0
  73. package/lib/kitsng-form-factory/components/kitsng-form-fields/form-element-layout/form-element-layout.component.d.ts +25 -0
  74. package/lib/kitsng-form-factory/components/kitsng-form-fields/google-map/google-map.component.d.ts +41 -0
  75. package/lib/kitsng-form-factory/components/kitsng-form-fields/icon-picker/icon-data.d.ts +1 -0
  76. package/lib/kitsng-form-factory/components/kitsng-form-fields/icon-picker/icon-picker.component.d.ts +41 -0
  77. package/lib/kitsng-form-factory/components/kitsng-form-fields/input/input.component.d.ts +31 -0
  78. package/lib/kitsng-form-factory/components/kitsng-form-fields/input-group/input-group.component.d.ts +30 -0
  79. package/lib/kitsng-form-factory/components/kitsng-form-fields/input-mask/input-mask.component.d.ts +13 -0
  80. package/lib/kitsng-form-factory/components/kitsng-form-fields/input-number/input-number.component.d.ts +30 -0
  81. package/lib/kitsng-form-factory/components/kitsng-form-fields/input-phone/input-phone.component.d.ts +48 -0
  82. package/lib/kitsng-form-factory/components/kitsng-form-fields/lookup-multi-select/lookup-multi-select.component.d.ts +66 -0
  83. package/lib/kitsng-form-factory/components/kitsng-form-fields/lookup-select/lookup-select.component.d.ts +71 -0
  84. package/lib/kitsng-form-factory/components/kitsng-form-fields/multi-select/multi-select.component.d.ts +35 -0
  85. package/lib/kitsng-form-factory/components/kitsng-form-fields/password/password.component.d.ts +13 -0
  86. package/lib/kitsng-form-factory/components/kitsng-form-fields/radio-button/radio-button.component.d.ts +30 -0
  87. package/lib/kitsng-form-factory/components/kitsng-form-fields/rating/rating.component.d.ts +13 -0
  88. package/lib/kitsng-form-factory/components/kitsng-form-fields/select-button/select-button.component.d.ts +30 -0
  89. package/lib/kitsng-form-factory/components/kitsng-form-fields/slider/slider.component.d.ts +30 -0
  90. package/lib/kitsng-form-factory/components/kitsng-form-fields/switch-button/switch-button.component.d.ts +34 -0
  91. package/lib/kitsng-form-factory/components/kitsng-form-fields/textarea/textarea.component.d.ts +30 -0
  92. package/lib/kitsng-form-factory/components/kitsng-form-fields/title/title.component.d.ts +9 -0
  93. package/lib/kitsng-form-factory/components/kitsng-form-fields/tree-select/tree-select.component.d.ts +43 -0
  94. package/lib/kitsng-form-factory/components/kitsng-form-group/kitsng-form-group.component.d.ts +18 -0
  95. package/lib/kitsng-form-factory/core/directives/kitsng-form-control-template.directive.d.ts +9 -0
  96. package/lib/kitsng-form-factory/core/models/kitsng-dynamic-field.d.ts +5 -0
  97. package/lib/kitsng-form-factory/core/models/kitsng-field-type.d.ts +7 -0
  98. package/lib/kitsng-form-factory/core/models/kitsng-form-factory.d.ts +339 -0
  99. package/lib/kitsng-form-factory/core/services/kitsng-form-control-template-registry.service.d.ts +9 -0
  100. package/lib/kitsng-form-factory/core/services/kitsng-form-factory.service.d.ts +23 -0
  101. package/lib/kitsng-form-factory/core/services/kitsng-form-helper.service.d.ts +16 -0
  102. package/lib/kitsng-form-factory/core/services/lookup-list.service.d.ts +23 -0
  103. package/lib/kitsng-form-factory/core/services/overlay.service.d.ts +7 -0
  104. package/lib/kitsng-form-factory/kitsng-form-factory.module.d.ts +79 -0
  105. package/package.json +32 -0
  106. package/public-api.d.ts +8 -0
package/README.md ADDED
@@ -0,0 +1,24 @@
1
+ # KitsngFormFactory
2
+
3
+ This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 16.2.0.
4
+
5
+ ## Code scaffolding
6
+
7
+ Run `ng generate component component-name --project kitsng-form-factory` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module --project kitsng-form-factory`.
8
+ > Note: Don't forget to add `--project kitsng-form-factory` or else it will be added to the default project in your `angular.json` file.
9
+
10
+ ## Build
11
+
12
+ Run `ng build kitsng-form-factory` to build the project. The build artifacts will be stored in the `dist/` directory.
13
+
14
+ ## Publishing
15
+
16
+ After building your library with `ng build kitsng-form-factory`, go to the dist folder `cd dist/kitsng-form-factory` and run `npm publish`.
17
+
18
+ ## Running unit tests
19
+
20
+ Run `ng test kitsng-form-factory` to execute the unit tests via [Karma](https://karma-runner.github.io).
21
+
22
+ ## Further help
23
+
24
+ To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI Overview and Command Reference](https://angular.io/cli) page.
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './public-api';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2l0c25nLWZvcm0tZmFjdG9yeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL2tpdHNuZy1mb3JtLWZhY3Rvcnkvc3JjL2tpdHNuZy1mb3JtLWZhY3RvcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9wdWJsaWMtYXBpJztcbiJdfQ==
@@ -0,0 +1,176 @@
1
+ import { Component, Input, Optional, SkipSelf } from '@angular/core';
2
+ import { ControlContainer, FormControl, FormGroup, FormGroupDirective, Validators } from '@angular/forms';
3
+ import { cloneDeep } from 'lodash';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "@angular/forms";
6
+ import * as i2 from "../../core/services/kitsng-form-control-template-registry.service";
7
+ import * as i3 from "@angular/common";
8
+ import * as i4 from "primeng/api";
9
+ import * as i5 from "primeng/button";
10
+ import * as i6 from "primeng/table";
11
+ import * as i7 from "../kitsng-form-factory-core/kitsng-form-factory-core.component";
12
+ import * as i8 from "@ngx-translate/core";
13
+ export class KitsngFormArrayComponent {
14
+ constructor(controlContainer, templateRegistry, parentRegistry) {
15
+ this.controlContainer = controlContainer;
16
+ this.templateRegistry = templateRegistry;
17
+ this.parentRegistry = parentRegistry;
18
+ }
19
+ ngOnInit() {
20
+ this.formGroup = this.controlContainer.control;
21
+ this._formControl = this.formGroup.controls[this.field?.options?.formControlName];
22
+ const controlName = this.field.options?.formControlName;
23
+ this.customTemplate = this.templateRegistry.getTemplate(controlName) || this.parentRegistry?.getTemplate(controlName);
24
+ }
25
+ getFormGroupFromArray(arrayName, index) {
26
+ const array = this.getArrayControl(arrayName);
27
+ return array.at(index);
28
+ }
29
+ addNewGroup() {
30
+ const arrayForm = this.getArrayControl(this.field?.options?.formControlName);
31
+ const index = this.getArrayIndex(this.field?.options?.formControlName);
32
+ let defaultField = cloneDeep(this.field?.options?.defaultArrayGroup ?? this.field.array[0]);
33
+ this.fields[index].array.push(defaultField);
34
+ this.fields = this.updateFieldsWithParents(this.fields);
35
+ const item = defaultField;
36
+ arrayForm.push(this.createFormGroup(defaultField));
37
+ if (this.fields[index]?.options?.showClientPaginator) {
38
+ const targetPage = Math.floor((this.fields[index].array.length - 1) / this.fields[index]?.options?.pageSize);
39
+ this.fields[index].options.first = targetPage * this.fields[index]?.options?.pageSize;
40
+ }
41
+ if (this.fields[index]?.options?.onAddArrayItem) {
42
+ this.fields[index]?.options?.onAddArrayItem(this.field, item, arrayForm);
43
+ }
44
+ }
45
+ getArrayControl(arrayName) {
46
+ return this.formGroup.get(arrayName);
47
+ }
48
+ getArrayIndex(arrayName) {
49
+ return this.fields.findIndex((f) => f?.options?.formControlName == arrayName);
50
+ }
51
+ createFormGroup(field) {
52
+ const groupForm = new FormGroup({});
53
+ field.group?.forEach((field) => {
54
+ groupForm.addControl(field.options?.formControlName, this.createControl(field));
55
+ });
56
+ return groupForm;
57
+ }
58
+ createControl(field) {
59
+ let validators = [];
60
+ const newControl = new FormControl({
61
+ value: field.options?.value ?? "",
62
+ disabled: field.options?.disabled && true,
63
+ });
64
+ // Add validators to control
65
+ if (field.options?.validators?.pattern) {
66
+ validators.push(Validators.pattern(field.options?.validators?.pattern));
67
+ }
68
+ if (field.options?.validators?.required) {
69
+ validators.push(Validators.required);
70
+ }
71
+ if (field.options?.validators?.maxLength) {
72
+ validators.push(Validators.maxLength(field.options?.validators?.maxLength));
73
+ }
74
+ if (field.options?.validators?.minLength) {
75
+ validators.push(Validators.minLength(field.options?.validators?.minLength));
76
+ }
77
+ if (field.options?.validators?.min) {
78
+ validators.push(Validators.min(field.options?.validators?.min));
79
+ }
80
+ if (field.options?.validators?.max) {
81
+ validators.push(Validators.max(field.options?.validators?.max));
82
+ }
83
+ if (field.options?.validators?.email) {
84
+ validators.push(Validators.email);
85
+ }
86
+ if (field.options?.validators?.nullValidator) {
87
+ validators.push(Validators.nullValidator);
88
+ }
89
+ if (field.options?.validators?.requiredTrue) {
90
+ validators.push(Validators.requiredTrue);
91
+ }
92
+ if (field.options?.validators?.customValidators?.length > 0) {
93
+ const custom = field.options.validators.customValidators;
94
+ validators.push(...custom);
95
+ }
96
+ // Set validators
97
+ newControl.setValidators(validators);
98
+ return newControl;
99
+ }
100
+ removeGroup(index) {
101
+ const arrayForm = this.getArrayControl(this.field?.options?.formControlName);
102
+ const arrayIndex = this.getArrayIndex(this.field?.options?.formControlName);
103
+ const item = this.fields[arrayIndex].array[index];
104
+ this.fields[arrayIndex].array.splice(index, 1);
105
+ arrayForm.removeAt(index);
106
+ if (this.fields[index]?.options?.showClientPaginator) {
107
+ const targetPage = Math.floor((this.fields[index].array.length - 1) / this.fields[index]?.options?.pageSize);
108
+ const lastPage = targetPage * this.fields[index]?.options?.pageSize;
109
+ if (this.fields[index].options.first > lastPage) {
110
+ this.fields[index].options.first = lastPage;
111
+ }
112
+ }
113
+ if (this.fields[arrayIndex]?.options?.onRemoveArrayItem) {
114
+ this.fields[arrayIndex]?.options?.onRemoveArrayItem(this.field, item, index, arrayForm);
115
+ }
116
+ }
117
+ getArrayTableColumns() {
118
+ let columns = this.field?.options?.arrayTableColumns ?? [];
119
+ if (columns.length <= 0) {
120
+ const defaultField = this.field?.options?.defaultArrayGroup ?? this.field.array[0];
121
+ columns = defaultField?.group?.map((field) => {
122
+ const label = field?.options?.label ?? field?.options?.formControlName;
123
+ if (field?.options?.label && field.controlType != "title") {
124
+ delete field.options.label;
125
+ }
126
+ return {
127
+ field: field?.options?.formControlName ?? label,
128
+ header: label,
129
+ };
130
+ });
131
+ }
132
+ return columns;
133
+ }
134
+ updateFieldsWithParents(formFields) {
135
+ const updateFieldWithParent = (field, parent = undefined) => {
136
+ field.parent = parent;
137
+ // If the field has nested fields in a group, recursively update each child field
138
+ if (field.group && Array.isArray(field.group)) {
139
+ field.group.forEach((childField) => updateFieldWithParent(childField, field));
140
+ }
141
+ // If the field has nested fields in an array, recursively update each child field
142
+ if (field.array && Array.isArray(field.array)) {
143
+ field.array.forEach((childField) => updateFieldWithParent(childField, field));
144
+ }
145
+ };
146
+ formFields.forEach((field) => updateFieldWithParent(field));
147
+ return formFields;
148
+ }
149
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: KitsngFormArrayComponent, deps: [{ token: i1.ControlContainer }, { token: i2.KitsngFormControlTemplateRegistryService }, { token: i2.KitsngFormControlTemplateRegistryService, optional: true, skipSelf: true }], target: i0.ɵɵFactoryTarget.Component }); }
150
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.8", type: KitsngFormArrayComponent, selector: "kitsng-form-array", inputs: { field: "field", fields: "fields" }, ngImport: i0, template: "<ng-container *ngIf=\"customTemplate; else defaultArrayTemplate\">\n <ng-template\n [ngTemplateOutlet]=\"customTemplate\"\n [ngTemplateOutletContext]=\"{\n $implicit: field,\n formControl: _formControl,\n options: field?.options,\n formGroup: formGroup,\n defaultTemplate: defaultArrayTemplate\n }\">\n </ng-template>\n</ng-container>\n<ng-template #defaultArrayTemplate>\n <div class=\"w-full {{field?.options?.class ?? 'mb-2 px-3 py-2'}}\">\n <div class=\"flex d-flex mb-2 justify-content-between\" *ngIf=\"field?.options?.label || field?.options?.showArrayAddButton != false\">\n <div class=\"\">\n <h5 *ngIf=\"field?.options?.label\" class=\"\">{{ field.options.label| translate }}</h5>\n </div>\n <div class=\"\" *ngIf=\"field?.options?.showArrayAddButton != false\">\n <button pButton [icon]=\"field?.options?.addButtonIcon ?? 'pi pi-plus'\"\n class=\"{{field?.options?.addButtonClass ?? ''}}\"\n [label]=\"field?.options?.addButtonLabel ?? 'Add'\" (click)=\"addNewGroup()\"></button>\n </div>\n </div>\n <ng-container *ngIf=\"field?.options?.arrayLayout == 'table';else defaultTemplate\">\n <p-table [value]=\"field.array??[]\"\n [columns]=\"getArrayTableColumns()\"\n [rows]=\"field?.options?.pageSize\"\n [first]=\"field?.options?.first || 0\"\n [rowsPerPageOptions]=\"field?.options?.rowsPerPageOptions ?? [5, 10, 25, 50, 100]\"\n [paginator]=\"field?.options?.showClientPaginator ?? false\"\n [totalRecords]=\"field?.array?.length\"\n styleClass=\"{{field?.options?.arrayTableClass}}\"\n [tableStyle]=\"field?.options?.arrayTableStyle ?? {'min-width': '60rem'}\" dataKey=\"options.formControlName\" [formArrayName]=\"field?.options?.formControlName\">\n <ng-template pTemplate=\"header\" let-columns>\n <tr [class]=\"field?.options?.tableHeaderClass\">\n <ng-container *ngFor=\"let item of columns\">\n <th class=\"{{item?.cellClass}}\" [ngStyle]=\"item?.cellStyle?? {}\">\n {{(item.header||'')|translate}}\n </th>\n </ng-container>\n <th *ngIf=\"field?.options?.showArrayRemoveButton != false\">\n {{'Actions'|translate}}\n </th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\" let-item let-i=\"rowIndex\">\n <tr [formGroup]=\"getFormGroupFromArray(field?.options?.formControlName,i)\">\n <ng-container *ngFor=\"let element of item.group\">\n <td *ngIf=\"!element?.options?.isHidden\">\n <div class=\"w-full\" *ngIf=\"element?.options?.isVisible != false\">\n <kitsng-form-factory-core [field]=\"element\"></kitsng-form-factory-core>\n </div>\n </td>\n </ng-container>\n <td *ngIf=\"(i != 0 || field?.options?.defaultArrayGroup) && field?.options?.showArrayRemoveButton != false && item?.options?.showArrayRemoveButton != false\">\n <ng-container *ngTemplateOutlet=\"removeButtonTemplate; context: { $implicit: i, first: i == 0, item: item }\"></ng-container>\n </td>\n </tr>\n </ng-template>\n </p-table>\n\n </ng-container>\n <ng-template #defaultTemplate>\n <div class=\"p-fluid p-formgrid grid row grid-nogutter {{field?.options?.containerClass}}\" [formArrayName]=\"field?.options?.formControlName\">\n <ng-container *ngFor=\"let subfield of field.array; let i = index; let first = first\">\n <div [class]=\"subfield.colSize\" *ngIf=\"subfield?.options?.isVisible != false\">\n <div class=\"card w-full shadow-none {{subfield?.options?.class ?? 'mb-2'}}\">\n <!-- remove button -->\n <ng-container *ngIf=\"field?.options?.removeButtonPosition == 'top' || !field?.options?.removeButtonPosition\">\n <ng-container *ngTemplateOutlet=\"removeButtonTemplate; context: { $implicit: i, first: first, item: subfield }\"></ng-container>\n </ng-container>\n <!-- <h5 *ngIf=\"subfield?.options?.label\" class=\"\">{{ subfield.options.label }}</h5> -->\n <div class=\"p-fluid p-formgrid grid row grid-nogutter {{subfield?.options?.containerClass}}\" [formGroup]=\"getFormGroupFromArray(field?.options?.formControlName,i)\">\n <ng-container *ngIf=\"subfield.group; else nestedControlTemplate\">\n <!-- * Define column size -->\n <ng-container *ngFor=\"let subSubfield of subfield.group\">\n <!-- * Find and use type of control -->\n <div [class]=\"'py-2 '+subSubfield.colSize\" *ngIf=\"subSubfield?.options?.isVisible != false\">\n <kitsng-form-factory-core [field]=\"subSubfield\"></kitsng-form-factory-core>\n </div>\n </ng-container>\n </ng-container>\n <ng-template #nestedControlTemplate>\n <div [class]=\"subfield.colSize\" *ngIf=\"subfield?.options?.isVisible != false\">\n <kitsng-form-factory-core [field]=\"subfield\"></kitsng-form-factory-core>\n </div>\n </ng-template>\n <!-- remove button -->\n <ng-container *ngIf=\"field?.options?.removeButtonPosition == 'side' && (!first || field?.options?.defaultArrayGroup) && field?.options?.showArrayRemoveButton != false && subfield?.options?.showArrayRemoveButton != false\">\n <div class=\"{{field?.options?.removeButtonColSize ?? 'col-1'}}\">\n <ng-container *ngTemplateOutlet=\"removeButtonTemplate; context: { $implicit: i, first: first, item: subfield }\"></ng-container>\n </div>\n </ng-container>\n </div>\n <!-- remove button -->\n <ng-container *ngIf=\"field?.options?.removeButtonPosition == 'bottom'\">\n <ng-container *ngTemplateOutlet=\"removeButtonTemplate; context: { $implicit: i, first: first, item: subfield }\"></ng-container>\n </ng-container>\n </div>\n </div>\n </ng-container>\n </div>\n </ng-template>\n </div>\n\n <ng-template #removeButtonTemplate let-i let-first=\"first\" let-item=\"item\">\n <div class=\"flex d-flex justify-content-end\" *ngIf=\"(!first || field?.options?.defaultArrayGroup) && field?.options?.showArrayRemoveButton != false && item?.options?.showArrayRemoveButton != false\">\n <div>\n <button pButton [icon]=\"field?.options?.removeButtonIcon ?? 'pi pi-times'\"\n class=\"{{field?.options?.removeButtonClass ?? 'p-button-outlined p-button-danger'}}\"\n [label]=\"field?.options?.removeButtonLabel ?? 'Remove'\" (click)=\"removeGroup(i)\"></button>\n </div>\n </div>\n </ng-template>\n</ng-template>\n", dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i3.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "directive", type: i4.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "directive", type: i5.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading", "severity", "raised", "rounded", "text", "outlined", "size", "plain"] }, { kind: "component", type: i6.Table, selector: "p-table", inputs: ["frozenColumns", "frozenValue", "style", "styleClass", "tableStyle", "tableStyleClass", "paginator", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorStyleClass", "paginatorDropdownAppendTo", "paginatorDropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showJumpToPageInput", "showFirstLastIcon", "showPageLinks", "defaultSortOrder", "sortMode", "resetPageOnSort", "selectionMode", "selectionPageOnly", "contextMenuSelection", "contextMenuSelectionMode", "dataKey", "metaKeySelection", "rowSelectable", "rowTrackBy", "lazy", "lazyLoadOnInit", "compareSelectionBy", "csvSeparator", "exportFilename", "filters", "globalFilterFields", "filterDelay", "filterLocale", "expandedRowKeys", "editingRowKeys", "rowExpandMode", "scrollable", "scrollDirection", "rowGroupMode", "scrollHeight", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "virtualScrollDelay", "frozenWidth", "responsive", "contextMenu", "resizableColumns", "columnResizeMode", "reorderableColumns", "loading", "loadingIcon", "showLoader", "rowHover", "customSort", "showInitialSortBadge", "autoLayout", "exportFunction", "exportHeader", "stateKey", "stateStorage", "editMode", "groupRowsBy", "groupRowsByOrder", "responsiveLayout", "breakpoint", "paginatorLocale", "value", "columns", "first", "rows", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection", "selectAll", "virtualRowHeight"], outputs: ["contextMenuSelectionChange", "selectAllChange", "selectionChange", "onRowSelect", "onRowUnselect", "onPage", "onSort", "onFilter", "onLazyLoad", "onRowExpand", "onRowCollapse", "onContextMenuSelect", "onColResize", "onColReorder", "onRowReorder", "onEditInit", "onEditComplete", "onEditCancel", "onHeaderCheckboxToggle", "sortFunction", "firstChange", "rowsChange", "onStateSave", "onStateRestore"] }, { kind: "component", type: i7.KitsngFormFactoryCoreComponent, selector: "kitsng-form-factory-core", inputs: ["field"] }, { kind: "pipe", type: i8.TranslatePipe, name: "translate" }], viewProviders: [
151
+ {
152
+ provide: ControlContainer,
153
+ useExisting: FormGroupDirective,
154
+ },
155
+ ] }); }
156
+ }
157
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: KitsngFormArrayComponent, decorators: [{
158
+ type: Component,
159
+ args: [{ selector: 'kitsng-form-array', viewProviders: [
160
+ {
161
+ provide: ControlContainer,
162
+ useExisting: FormGroupDirective,
163
+ },
164
+ ], template: "<ng-container *ngIf=\"customTemplate; else defaultArrayTemplate\">\n <ng-template\n [ngTemplateOutlet]=\"customTemplate\"\n [ngTemplateOutletContext]=\"{\n $implicit: field,\n formControl: _formControl,\n options: field?.options,\n formGroup: formGroup,\n defaultTemplate: defaultArrayTemplate\n }\">\n </ng-template>\n</ng-container>\n<ng-template #defaultArrayTemplate>\n <div class=\"w-full {{field?.options?.class ?? 'mb-2 px-3 py-2'}}\">\n <div class=\"flex d-flex mb-2 justify-content-between\" *ngIf=\"field?.options?.label || field?.options?.showArrayAddButton != false\">\n <div class=\"\">\n <h5 *ngIf=\"field?.options?.label\" class=\"\">{{ field.options.label| translate }}</h5>\n </div>\n <div class=\"\" *ngIf=\"field?.options?.showArrayAddButton != false\">\n <button pButton [icon]=\"field?.options?.addButtonIcon ?? 'pi pi-plus'\"\n class=\"{{field?.options?.addButtonClass ?? ''}}\"\n [label]=\"field?.options?.addButtonLabel ?? 'Add'\" (click)=\"addNewGroup()\"></button>\n </div>\n </div>\n <ng-container *ngIf=\"field?.options?.arrayLayout == 'table';else defaultTemplate\">\n <p-table [value]=\"field.array??[]\"\n [columns]=\"getArrayTableColumns()\"\n [rows]=\"field?.options?.pageSize\"\n [first]=\"field?.options?.first || 0\"\n [rowsPerPageOptions]=\"field?.options?.rowsPerPageOptions ?? [5, 10, 25, 50, 100]\"\n [paginator]=\"field?.options?.showClientPaginator ?? false\"\n [totalRecords]=\"field?.array?.length\"\n styleClass=\"{{field?.options?.arrayTableClass}}\"\n [tableStyle]=\"field?.options?.arrayTableStyle ?? {'min-width': '60rem'}\" dataKey=\"options.formControlName\" [formArrayName]=\"field?.options?.formControlName\">\n <ng-template pTemplate=\"header\" let-columns>\n <tr [class]=\"field?.options?.tableHeaderClass\">\n <ng-container *ngFor=\"let item of columns\">\n <th class=\"{{item?.cellClass}}\" [ngStyle]=\"item?.cellStyle?? {}\">\n {{(item.header||'')|translate}}\n </th>\n </ng-container>\n <th *ngIf=\"field?.options?.showArrayRemoveButton != false\">\n {{'Actions'|translate}}\n </th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\" let-item let-i=\"rowIndex\">\n <tr [formGroup]=\"getFormGroupFromArray(field?.options?.formControlName,i)\">\n <ng-container *ngFor=\"let element of item.group\">\n <td *ngIf=\"!element?.options?.isHidden\">\n <div class=\"w-full\" *ngIf=\"element?.options?.isVisible != false\">\n <kitsng-form-factory-core [field]=\"element\"></kitsng-form-factory-core>\n </div>\n </td>\n </ng-container>\n <td *ngIf=\"(i != 0 || field?.options?.defaultArrayGroup) && field?.options?.showArrayRemoveButton != false && item?.options?.showArrayRemoveButton != false\">\n <ng-container *ngTemplateOutlet=\"removeButtonTemplate; context: { $implicit: i, first: i == 0, item: item }\"></ng-container>\n </td>\n </tr>\n </ng-template>\n </p-table>\n\n </ng-container>\n <ng-template #defaultTemplate>\n <div class=\"p-fluid p-formgrid grid row grid-nogutter {{field?.options?.containerClass}}\" [formArrayName]=\"field?.options?.formControlName\">\n <ng-container *ngFor=\"let subfield of field.array; let i = index; let first = first\">\n <div [class]=\"subfield.colSize\" *ngIf=\"subfield?.options?.isVisible != false\">\n <div class=\"card w-full shadow-none {{subfield?.options?.class ?? 'mb-2'}}\">\n <!-- remove button -->\n <ng-container *ngIf=\"field?.options?.removeButtonPosition == 'top' || !field?.options?.removeButtonPosition\">\n <ng-container *ngTemplateOutlet=\"removeButtonTemplate; context: { $implicit: i, first: first, item: subfield }\"></ng-container>\n </ng-container>\n <!-- <h5 *ngIf=\"subfield?.options?.label\" class=\"\">{{ subfield.options.label }}</h5> -->\n <div class=\"p-fluid p-formgrid grid row grid-nogutter {{subfield?.options?.containerClass}}\" [formGroup]=\"getFormGroupFromArray(field?.options?.formControlName,i)\">\n <ng-container *ngIf=\"subfield.group; else nestedControlTemplate\">\n <!-- * Define column size -->\n <ng-container *ngFor=\"let subSubfield of subfield.group\">\n <!-- * Find and use type of control -->\n <div [class]=\"'py-2 '+subSubfield.colSize\" *ngIf=\"subSubfield?.options?.isVisible != false\">\n <kitsng-form-factory-core [field]=\"subSubfield\"></kitsng-form-factory-core>\n </div>\n </ng-container>\n </ng-container>\n <ng-template #nestedControlTemplate>\n <div [class]=\"subfield.colSize\" *ngIf=\"subfield?.options?.isVisible != false\">\n <kitsng-form-factory-core [field]=\"subfield\"></kitsng-form-factory-core>\n </div>\n </ng-template>\n <!-- remove button -->\n <ng-container *ngIf=\"field?.options?.removeButtonPosition == 'side' && (!first || field?.options?.defaultArrayGroup) && field?.options?.showArrayRemoveButton != false && subfield?.options?.showArrayRemoveButton != false\">\n <div class=\"{{field?.options?.removeButtonColSize ?? 'col-1'}}\">\n <ng-container *ngTemplateOutlet=\"removeButtonTemplate; context: { $implicit: i, first: first, item: subfield }\"></ng-container>\n </div>\n </ng-container>\n </div>\n <!-- remove button -->\n <ng-container *ngIf=\"field?.options?.removeButtonPosition == 'bottom'\">\n <ng-container *ngTemplateOutlet=\"removeButtonTemplate; context: { $implicit: i, first: first, item: subfield }\"></ng-container>\n </ng-container>\n </div>\n </div>\n </ng-container>\n </div>\n </ng-template>\n </div>\n\n <ng-template #removeButtonTemplate let-i let-first=\"first\" let-item=\"item\">\n <div class=\"flex d-flex justify-content-end\" *ngIf=\"(!first || field?.options?.defaultArrayGroup) && field?.options?.showArrayRemoveButton != false && item?.options?.showArrayRemoveButton != false\">\n <div>\n <button pButton [icon]=\"field?.options?.removeButtonIcon ?? 'pi pi-times'\"\n class=\"{{field?.options?.removeButtonClass ?? 'p-button-outlined p-button-danger'}}\"\n [label]=\"field?.options?.removeButtonLabel ?? 'Remove'\" (click)=\"removeGroup(i)\"></button>\n </div>\n </div>\n </ng-template>\n</ng-template>\n" }]
165
+ }], ctorParameters: () => [{ type: i1.ControlContainer }, { type: i2.KitsngFormControlTemplateRegistryService }, { type: i2.KitsngFormControlTemplateRegistryService, decorators: [{
166
+ type: Optional
167
+ }, {
168
+ type: SkipSelf
169
+ }] }], propDecorators: { field: [{
170
+ type: Input,
171
+ args: [{ required: true }]
172
+ }], fields: [{
173
+ type: Input,
174
+ args: [{ required: true }]
175
+ }] } });
176
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2l0c25nLWZvcm0tYXJyYXkuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva2l0c25nLWZvcm0tZmFjdG9yeS9zcmMvbGliL2tpdHNuZy1mb3JtLWZhY3RvcnkvY29tcG9uZW50cy9raXRzbmctZm9ybS1hcnJheS9raXRzbmctZm9ybS1hcnJheS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9raXRzbmctZm9ybS1mYWN0b3J5L3NyYy9saWIva2l0c25nLWZvcm0tZmFjdG9yeS9jb21wb25lbnRzL2tpdHNuZy1mb3JtLWFycmF5L2tpdHNuZy1mb3JtLWFycmF5LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQWUsTUFBTSxlQUFlLENBQUM7QUFDbEYsT0FBTyxFQUFtQixnQkFBZ0IsRUFBYSxXQUFXLEVBQUUsU0FBUyxFQUFFLGtCQUFrQixFQUFlLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ25KLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxRQUFRLENBQUM7Ozs7Ozs7Ozs7QUFnQm5DLE1BQU0sT0FBTyx3QkFBd0I7SUFNakMsWUFDUyxnQkFBa0MsRUFDakMsZ0JBQTBELEVBQ2xDLGNBQXlEO1FBRmxGLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFDakMscUJBQWdCLEdBQWhCLGdCQUFnQixDQUEwQztRQUNsQyxtQkFBYyxHQUFkLGNBQWMsQ0FBMkM7SUFDM0YsQ0FBQztJQUNELFFBQVE7UUFDTixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFvQixDQUFDO1FBQzVELElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtB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LFVBQVUsRUFBRSxTQUFTLEVBQUUsQ0FBQztZQUN6QyxVQUFVLENBQUMsSUFBSSxDQUNiLFVBQVUsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxVQUFVLEVBQUUsU0FBUyxDQUFDLENBQzNELENBQUM7UUFDSixDQUFDO1FBQ0QsSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsQ0FBQztZQUNuQyxVQUFVLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxVQUFVLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNsRSxDQUFDO1FBQ0QsSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsQ0FBQztZQUNuQyxVQUFVLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxVQUFVLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNsRSxDQUFDO1FBQ0QsSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsQ0FBQztZQUNyQyxVQUFVLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNwQyxDQUFDO1FBQ0QsSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxhQUFhLEVBQUUsQ0FBQztZQUM3QyxVQUFVLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUM1QyxDQUFDO1FBQ0QsSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsQ0FBQztZQUM1QyxVQUFVLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUMzQyxDQUFDO1FBQ0QsSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLEdBQUMsQ0FBQyxFQUFFLENBQUM7WUFDMUQsTUFBTSxNQUFN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R2lCO1lBQ2I7Z0JBQ0UsT0FBTyxFQUFFLGdCQUFnQjtnQkFDekIsV0FBVyxFQUFFLGtCQUFrQjthQUNoQztTQUNGOzsyRkFFVSx3QkFBd0I7a0JBWnBDLFNBQVM7K0JBQ0UsbUJBQW1CLGlCQUlkO3dCQUNiOzRCQUNFLE9BQU8sRUFBRSxnQkFBZ0I7NEJBQ3pCLFdBQVcsRUFBRSxrQkFBa0I7eUJBQ2hDO3FCQUNGOzswQkFXSSxRQUFROzswQkFBSSxRQUFRO3lDQVJFLEtBQUs7c0JBQTdCLEtBQUs7dUJBQUMsRUFBQyxRQUFRLEVBQUUsSUFBSSxFQUFDO2dCQUNFLE1BQU07c0JBQTlCLEtBQUs7dUJBQUMsRUFBQyxRQUFRLEVBQUUsSUFBSSxFQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT3B0aW9uYWwsIFNraXBTZWxmLCBUZW1wbGF0ZVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWJzdHJhY3RDb250cm9sLCBDb250cm9sQ29udGFpbmVyLCBGb3JtQXJyYXksIEZvcm1Db250cm9sLCBGb3JtR3JvdXAsIEZvcm1Hcm91cERpcmVjdGl2ZSwgVmFsaWRhdG9yRm4sIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBjbG9uZURlZXAgfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgS2l0c25nRm9ybUZhY3RvcnlNb2RlbCB9IGZyb20gJy4uLy4uL2NvcmUvbW9kZWxzL2tpdHNuZy1mb3JtLWZhY3RvcnknO1xuaW1wb3J0IHsgS2l0c25nRm9ybUNvbnRyb2xUZW1wbGF0ZVJlZ2lzdHJ5U2VydmljZSB9IGZyb20gJy4uLy4uL2NvcmUvc2VydmljZXMva2l0c25nLWZvcm0tY29udHJvbC10ZW1wbGF0ZS1yZWdpc3RyeS5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAna2l0c25nLWZvcm0tYXJyYXknLFxuICB0ZW1wbGF0ZVVybDogJy4va2l0c25nLWZvcm0tYXJyYXkuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZXM6IFtcbiAgXSxcbiAgdmlld1Byb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IENvbnRyb2xDb250YWluZXIsXG4gICAgICB1c2VFeGlzdGluZzogRm9ybUdyb3VwRGlyZWN0aXZlLFxuICAgIH0sXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIEtpdHNuZ0Zvcm1BcnJheUNvbXBvbmVudCB7XG4gICAgQElucHV0KHtyZXF1aXJlZDogdHJ1ZX0pIGZpZWxkOiBhbnk7XG4gICAgQElucHV0KHtyZXF1aXJlZDogdHJ1ZX0pIGZpZWxkczogYW55O1xuICAgIF9mb3JtQ29udHJvbCE6IEFic3RyYWN0Q29udHJvbDxhbnksIGFueT47XG4gICAgZm9ybUdyb3VwITogRm9ybUdyb3VwO1xuICAgICAgY3VzdG9tVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gfCBudWxsIHwgdW5kZWZpbmVkO1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgcHVibGljIGNvbnRyb2xDb250YWluZXI6IENvbnRyb2xDb250YWluZXIsXG4gICAgICBwcml2YXRlIHRlbXBsYXRlUmVnaXN0cnk6IEtpdHNuZ0Zvcm1Db250cm9sVGVtcGxhdGVSZWdpc3RyeVNlcnZpY2UsXG4gICAgICBAT3B0aW9uYWwoKSBAU2tpcFNlbGYoKSBwcml2YXRlIHBhcmVudFJlZ2lzdHJ5PzogS2l0c25nRm9ybUNvbnRyb2xUZW1wbGF0ZVJlZ2lzdHJ5U2VydmljZSkge1xuICAgIH1cbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgIHRoaXMuZm9ybUdyb3VwID0gdGhpcy5jb250cm9sQ29udGFpbmVyLmNvbnRyb2wgYXMgRm9ybUdyb3VwO1xuICAgICAgdGhpcy5fZm9ybUNvbnRyb2wgPSB0aGlzLmZvcm1Hcm91cC5jb250cm9sc1t0aGlzLmZpZWxkPy5vcHRpb25zPy5mb3JtQ29udHJvbE5hbWVdO1xuICAgICAgY29uc3QgY29udHJvbE5hbWUgPSB0aGlzLmZpZWxkLm9wdGlvbnM/LmZvcm1Db250cm9sTmFtZTtcbiAgICAgIHRoaXMuY3VzdG9tVGVtcGxhdGUgPSB0aGlzLnRlbXBsYXRlUmVnaXN0cnkuZ2V0VGVtcGxhdGUoY29udHJvbE5hbWUpIHx8IHRoaXMucGFyZW50UmVnaXN0cnk/LmdldFRlbXBsYXRlKGNvbnRyb2xOYW1lKTtcbiAgICB9XG4gICAgZ2V0Rm9ybUdyb3VwRnJvbUFycmF5KGFycmF5TmFtZTogc3RyaW5nLCBpbmRleDogbnVtYmVyKXtcbiAgICAgIGNvbnN0IGFycmF5ID0gdGhpcy5nZXRBcnJheUNvbnRyb2woYXJyYXlOYW1lKTtcbiAgICAgIHJldHVybiBhcnJheS5hdChpbmRleCkgYXMgRm9ybUdyb3VwO1xuICAgIH1cbiAgICBhZGROZXdHcm91cCgpIHtcbiAgICAgIGNvbnN0IGFycmF5Rm9ybSA9IHRoaXMuZ2V0QXJyYXlDb250cm9sKHRoaXMuZmllbGQ/Lm9wdGlvbnM/LmZvcm1Db250cm9sTmFtZSk7XG4gICAgICBjb25zdCBpbmRleCA9IHRoaXMuZ2V0QXJyYXlJbmRleCh0aGlzLmZpZWxkPy5vcHRpb25zPy5mb3JtQ29udHJvbE5hbWUpO1xuICAgICAgbGV0IGRlZmF1bHRGaWVsZCA9IGNsb25lRGVlcCh0aGlzLmZpZWxkPy5vcHRpb25zPy5kZWZhdWx0QXJyYXlHcm91cCA/PyB0aGlzLmZpZWxkLmFycmF5WzBdKTtcbiAgICAgIHRoaXMuZmllbGRzW2luZGV4XS5hcnJheS5wdXNoKGRlZmF1bHRGaWVsZCk7XG4gICAgICB0aGlzLmZpZWxkcyA9IHRoaXMudXBkYXRlRmllbGRzV2l0aFBhcmVudHModGhpcy5maWVsZHMpO1xuICAgICAgY29uc3QgaXRlbSA9IGRlZmF1bHRGaWVsZDtcbiAgICAgIGFycmF5Rm9ybS5wdXNoKHRoaXMuY3JlYXRlRm9ybUdyb3VwKGRlZmF1bHRGaWVsZCkpO1xuICAgICAgaWYgKHRoaXMuZmllbGRzW2luZGV4XT8ub3B0aW9ucz8uc2hvd0NsaWVudFBhZ2luYXRvcikge1xuICAgICAgICBjb25zdCB0YXJnZXRQYWdlID0gTWF0aC5mbG9vcigodGhpcy5maWVsZHNbaW5kZXhdLmFycmF5Lmxlbmd0aCAtIDEpIC8gdGhpcy5maWVsZHNbaW5kZXhdPy5vcHRpb25zPy5wYWdlU2l6ZSk7XG4gICAgICAgIHRoaXMuZmllbGRzW2luZGV4XS5vcHRpb25zLmZpcnN0ID0gdGFyZ2V0UGFnZSAqIHRoaXMuZmllbGRzW2luZGV4XT8ub3B0aW9ucz8ucGFnZVNpemU7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5maWVsZHNbaW5kZXhdPy5vcHRpb25zPy5vbkFkZEFycmF5SXRlbSkge1xuICAgICAgICAgIHRoaXMuZmllbGRzW2luZGV4XT8ub3B0aW9ucz8ub25BZGRBcnJheUl0ZW0odGhpcy5maWVsZCwgaXRlbSwgYXJyYXlGb3JtKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZ2V0QXJyYXlDb250cm9sKGFycmF5TmFtZTogc3RyaW5nKXtcbiAgICAgIHJldHVybiB0aGlzLmZvcm1Hcm91cC5nZXQoXG4gICAgICAgICAgYXJyYXlOYW1lXG4gICAgICAgICkgYXMgRm9ybUFycmF5O1xuICAgIH1cbiAgICBnZXRBcnJheUluZGV4KGFycmF5TmFtZTogc3RyaW5nKXtcbiAgICAgIHJldHVybiB0aGlzLmZpZWxkcy5maW5kSW5kZXgoXG4gICAgICAgICAgKGY6IGFueSkgPT4gZj8ub3B0aW9ucz8uZm9ybUNvbnRyb2xOYW1lID09IGFycmF5TmFtZVxuICAgICAgICApO1xuICAgIH1cbiAgICBjcmVhdGVGb3JtR3JvdXAoZmllbGQ6IGFueSkge1xuICAgICAgY29uc3QgZ3JvdXBGb3JtID0gbmV3IEZvcm1Hcm91cCh7fSk7XG4gICAgICBmaWVsZC5ncm91cD8uZm9yRWFjaCgoZmllbGQ6IGFueSkgPT4ge1xuICAgICAgICBncm91cEZvcm0uYWRkQ29udHJvbChcbiAgICAgICAgICBmaWVsZC5vcHRpb25zPy5mb3JtQ29udHJvbE5hbWUsXG4gICAgICAgICAgdGhpcy5jcmVhdGVDb250cm9sKGZpZWxkKVxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gZ3JvdXBGb3JtO1xuICAgIH1cbiAgICBjcmVhdGVDb250cm9sKGZpZWxkOiBhbnkpIHtcbiAgICAgIGxldCB2YWxpZGF0b3JzID0gW107XG4gICAgICBjb25zdCBuZXdDb250cm9sID0gbmV3IEZvcm1Db250cm9sKHtcbiAgICAgICAgdmFsdWU6IGZpZWxkLm9wdGlvbnM/LnZhbHVlID8/IFwiXCIsXG4gICAgICAgIGRpc2FibGVkOiBmaWVsZC5vcHRpb25zPy5kaXNhYmxlZCAmJiB0cnVlLFxuICAgICAgfSk7XG4gICAgICAvLyBBZGQgdmFsaWRhdG9ycyB0byBjb250cm9sXG4gICAgICBpZiAoZmllbGQub3B0aW9ucz8udmFsaWRhdG9ycz8ucGF0dGVybikge1xuICAgICAgICB2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5wYXR0ZXJuKGZpZWxkLm9wdGlvbnM/LnZhbGlkYXRvcnM/LnBhdHRlcm4pKTtcbiAgICAgIH1cbiAgICAgIGlmIChmaWVsZC5vcHRpb25zPy52YWxpZGF0b3JzPy5yZXF1aXJlZCkge1xuICAgICAgICB2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5yZXF1aXJlZCk7XG4gICAgICB9XG4gICAgICBpZiAoZmllbGQub3B0aW9ucz8udmFsaWRhdG9ycz8ubWF4TGVuZ3RoKSB7XG4gICAgICAgIHZhbGlkYXRvcnMucHVzaChcbiAgICAgICAgICBWYWxpZGF0b3JzLm1heExlbmd0aChmaWVsZC5vcHRpb25zPy52YWxpZGF0b3JzPy5tYXhMZW5ndGgpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAoZmllbGQub3B0aW9ucz8udmFsaWRhdG9ycz8ubWluTGVuZ3RoKSB7XG4gICAgICAgIHZhbGlkYXRvcnMucHVzaChcbiAgICAgICAgICBWYWxpZGF0b3JzLm1pbkxlbmd0aChmaWVsZC5vcHRpb25zPy52YWxpZGF0b3JzPy5taW5MZW5ndGgpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAoZmllbGQub3B0aW9ucz8udmFsaWRhdG9ycz8ubWluKSB7XG4gICAgICAgIHZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLm1pbihmaWVsZC5vcHRpb25zPy52YWxpZGF0b3JzPy5taW4pKTtcbiAgICAgIH1cbiAgICAgIGlmIChmaWVsZC5vcHRpb25zPy52YWxpZGF0b3JzPy5tYXgpIHtcbiAgICAgICAgdmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMubWF4KGZpZWxkLm9wdGlvbnM/LnZhbGlkYXRvcnM/Lm1heCkpO1xuICAgICAgfVxuICAgICAgaWYgKGZpZWxkLm9wdGlvbnM/LnZhbGlkYXRvcnM/LmVtYWlsKSB7XG4gICAgICAgIHZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLmVtYWlsKTtcbiAgICAgIH1cbiAgICAgIGlmIChmaWVsZC5vcHRpb25zPy52YWxpZGF0b3JzPy5udWxsVmFsaWRhdG9yKSB7XG4gICAgICAgIHZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLm51bGxWYWxpZGF0b3IpO1xuICAgICAgfVxuICAgICAgaWYgKGZpZWxkLm9wdGlvbnM/LnZhbGlkYXRvcnM/LnJlcXVpcmVkVHJ1ZSkge1xuICAgICAgICB2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5yZXF1aXJlZFRydWUpO1xuICAgICAgfVxuICAgICAgaWYgKGZpZWxkLm9wdGlvbnM/LnZhbGlkYXRvcnM/LmN1c3RvbVZhbGlkYXRvcnM/Lmxlbmd0aD4wKSB7XG4gICAgICAgIGNvbnN0IGN1c3RvbSA6YW55W10gPSBmaWVsZC5vcHRpb25zLnZhbGlkYXRvcnMuY3VzdG9tVmFsaWRhdG9ycztcbiAgICAgICAgdmFsaWRhdG9ycy5wdXNoKC4uLmN1c3RvbSk7XG4gICAgICB9XG4gICAgICAvLyBTZXQgdmFsaWRhdG9yc1xuICAgICAgbmV3Q29udHJvbC5zZXRWYWxpZGF0b3JzKHZhbGlkYXRvcnMpO1xuICAgICAgcmV0dXJuIG5ld0NvbnRyb2w7XG4gICAgfVxuICAgIHJlbW92ZUdyb3VwKGluZGV4OiBudW1iZXIpe1xuICAgICAgY29uc3QgYXJyYXlGb3JtID0gdGhpcy5nZXRBcnJheUNvbnRyb2wodGhpcy5maWVsZD8ub3B0aW9ucz8uZm9ybUNvbnRyb2xOYW1lKTtcbiAgICAgIGNvbnN0IGFycmF5SW5kZXggPSB0aGlzLmdldEFycmF5SW5kZXgodGhpcy5maWVsZD8ub3B0aW9ucz8uZm9ybUNvbnRyb2xOYW1lKTtcbiAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLmZpZWxkc1thcnJheUluZGV4XS5hcnJheVtpbmRleF07XG4gICAgICB0aGlzLmZpZWxkc1thcnJheUluZGV4XS5hcnJheS5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgYXJyYXlGb3JtLnJlbW92ZUF0KGluZGV4KTtcbiAgICAgIGlmICh0aGlzLmZpZWxkc1tpbmRleF0/Lm9wdGlvbnM/LnNob3dDbGllbnRQYWdpbmF0b3IpIHtcbiAgICAgICAgY29uc3QgdGFyZ2V0UGFnZSA9IE1hdGguZmxvb3IoKHRoaXMuZmllbGRzW2luZGV4XS5hcnJheS5sZW5ndGggLSAxKSAvIHRoaXMuZmllbGRzW2luZGV4XT8ub3B0aW9ucz8ucGFnZVNpemUpO1xuICAgICAgICBjb25zdCBsYXN0UGFnZSA9IHRhcmdldFBhZ2UgKiB0aGlzLmZpZWxkc1tpbmRleF0/Lm9wdGlvbnM/LnBhZ2VTaXplO1xuICAgICAgICBpZiAodGhpcy5maWVsZHNbaW5kZXhdLm9wdGlvbnMuZmlyc3QgPiBsYXN0UGFnZSkge1xuICAgICAgICAgICAgdGhpcy5maWVsZHNbaW5kZXhdLm9wdGlvbnMuZmlyc3QgPSBsYXN0UGFnZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHRoaXMuZmllbGRzW2FycmF5SW5kZXhdPy5vcHRpb25zPy5vblJlbW92ZUFycmF5SXRlbSkge1xuICAgICAgICAgIHRoaXMuZmllbGRzW2FycmF5SW5kZXhdPy5vcHRpb25zPy5vblJlbW92ZUFycmF5SXRlbSh0aGlzLmZpZWxkLCBpdGVtLCBpbmRleCwgYXJyYXlGb3JtKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZ2V0QXJyYXlUYWJsZUNvbHVtbnMoKXtcbiAgICAgICAgbGV0IGNvbHVtbnM6IHtmaWVsZDogc3RyaW5nLCBoZWFkZXI6IHN0cmluZ31bXSA9IHRoaXMuZmllbGQ/Lm9wdGlvbnM/LmFycmF5VGFibGVDb2x1bW5zID8/IFtdO1xuICAgICAgICBpZiAoY29sdW1ucy5sZW5ndGggPD0gMCkge1xuICAgICAgICAgICAgY29uc3QgZGVmYXVsdEZpZWxkID0gdGhpcy5maWVsZD8ub3B0aW9ucz8uZGVmYXVsdEFycmF5R3JvdXAgPz8gdGhpcy5maWVsZC5hcnJheVswXTtcbiAgICAgICAgICAgIGNvbHVtbnMgPSBkZWZhdWx0RmllbGQ/Lmdyb3VwPy5tYXAoKGZpZWxkOmFueSk9PntcbiAgICAgICAgICAgICAgICBjb25zdCBsYWJlbCA9IGZpZWxkPy5vcHRpb25zPy5sYWJlbCA/PyBmaWVsZD8ub3B0aW9ucz8uZm9ybUNvbnRyb2xOYW1lO1xuICAgICAgICAgICAgICAgIGlmIChmaWVsZD8ub3B0aW9ucz8ubGFiZWwgJiYgZmllbGQuY29udHJvbFR5cGUgIT0gXCJ0aXRsZVwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBmaWVsZC5vcHRpb25zLmxhYmVsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBmaWVsZDogZmllbGQ/Lm9wdGlvbnM/LmZvcm1Db250cm9sTmFtZSA/PyBsYWJlbCxcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyOiBsYWJlbCxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbHVtbnM7XG4gICAgfVxuICAgIHVwZGF0ZUZpZWxkc1dpdGhQYXJlbnRzKGZvcm1GaWVsZHM6IEtpdHNuZ0Zvcm1GYWN0b3J5TW9kZWxbXSk6IEtpdHNuZ0Zvcm1GYWN0b3J5TW9kZWxbXSB7XG4gICAgICAgIGNvbnN0IHVwZGF0ZUZpZWxkV2l0aFBhcmVudCA9IChmaWVsZDogS2l0c25nRm9ybUZhY3RvcnlNb2RlbCwgcGFyZW50OiBLaXRzbmdGb3JtRmFjdG9yeU1vZGVsIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkKSA9PiB7XG4gICAgICAgICAgZmllbGQucGFyZW50ID0gcGFyZW50O1xuXG4gICAgICAgICAgLy8gSWYgdGhlIGZpZWxkIGhhcyBuZXN0ZWQgZmllbGRzIGluIGEgZ3JvdXAsIHJlY3Vyc2l2ZWx5IHVwZGF0ZSBlYWNoIGNoaWxkIGZpZWxkXG4gICAgICAgICAgaWYgKGZpZWxkLmdyb3VwICYmIEFycmF5LmlzQXJyYXkoZmllbGQuZ3JvdXApKSB7XG4gICAgICAgICAgICBmaWVsZC5ncm91cC5mb3JFYWNoKChjaGlsZEZpZWxkKSA9PiB1cGRhdGVGaWVsZFdpdGhQYXJlbnQoY2hpbGRGaWVsZCwgZmllbGQpKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBJZiB0aGUgZmllbGQgaGFzIG5lc3RlZCBmaWVsZHMgaW4gYW4gYXJyYXksIHJlY3Vyc2l2ZWx5IHVwZGF0ZSBlYWNoIGNoaWxkIGZpZWxkXG4gICAgICAgICAgaWYgKGZpZWxkLmFycmF5ICYmIEFycmF5LmlzQXJyYXkoZmllbGQuYXJyYXkpKSB7XG4gICAgICAgICAgICBmaWVsZC5hcnJheS5mb3JFYWNoKChjaGlsZEZpZWxkKSA9PiB1cGRhdGVGaWVsZFdpdGhQYXJlbnQoY2hpbGRGaWVsZCwgZmllbGQpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgZm9ybUZpZWxkcy5mb3JFYWNoKChmaWVsZCkgPT4gdXBkYXRlRmllbGRXaXRoUGFyZW50KGZpZWxkKSk7XG4gICAgICAgIHJldHVybiBmb3JtRmllbGRzO1xuICAgIH1cblxufVxuIiwiPG5nLWNvbnRhaW5lciAqbmdJZj1cImN1c3RvbVRlbXBsYXRlOyBlbHNlIGRlZmF1bHRBcnJheVRlbXBsYXRlXCI+XG4gICAgPG5nLXRlbXBsYXRlXG4gICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJjdXN0b21UZW1wbGF0ZVwiXG4gICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie1xuICAgICAgICAkaW1wbGljaXQ6IGZpZWxkLFxuICAgICAgICBmb3JtQ29udHJvbDogX2Zvcm1Db250cm9sLFxuICAgICAgICBvcHRpb25zOiBmaWVsZD8ub3B0aW9ucyxcbiAgICAgICAgZm9ybUdyb3VwOiBmb3JtR3JvdXAsXG4gICAgICAgIGRlZmF1bHRUZW1wbGF0ZTogZGVmYXVsdEFycmF5VGVtcGxhdGVcbiAgICAgIH1cIj5cbiAgICA8L25nLXRlbXBsYXRlPlxuPC9uZy1jb250YWluZXI+XG48bmctdGVtcGxhdGUgI2RlZmF1bHRBcnJheVRlbXBsYXRlPlxuICAgIDxkaXYgY2xhc3M9XCJ3LWZ1bGwgIHt7ZmllbGQ/Lm9wdGlvbnM/LmNsYXNzID8/ICdtYi0yIHB4LTMgcHktMid9fVwiPlxuICAgICAgPGRpdiBjbGFzcz1cImZsZXggZC1mbGV4IG1iLTIganVzdGlmeS1jb250ZW50LWJldHdlZW5cIiAqbmdJZj1cImZpZWxkPy5vcHRpb25zPy5sYWJlbCB8fCBmaWVsZD8ub3B0aW9ucz8uc2hvd0FycmF5QWRkQnV0dG9uICE9IGZhbHNlXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIlwiPlxuICAgICAgICAgICAgICA8aDUgICpuZ0lmPVwiZmllbGQ/Lm9wdGlvbnM/LmxhYmVsXCIgY2xhc3M9XCJcIj57eyBmaWVsZC5vcHRpb25zLmxhYmVsfCB0cmFuc2xhdGUgfX08L2g1PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJcIiAqbmdJZj1cImZpZWxkPy5vcHRpb25zPy5zaG93QXJyYXlBZGRCdXR0b24gIT0gZmFsc2VcIj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIFtpY29uXT1cImZpZWxkPy5vcHRpb25zPy5hZGRCdXR0b25JY29uID8/ICdwaSBwaS1wbHVzJ1wiXG4gICAgICAgICAgICAgIGNsYXNzPVwie3tmaWVsZD8ub3B0aW9ucz8uYWRkQnV0dG9uQ2xhc3MgPz8gJyd9fVwiXG4gICAgICAgICAgICAgIFtsYWJlbF09XCJmaWVsZD8ub3B0aW9ucz8uYWRkQnV0dG9uTGFiZWwgPz8gJ0FkZCdcIiAoY2xpY2spPVwiYWRkTmV3R3JvdXAoKVwiPjwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZmllbGQ/Lm9wdGlvbnM/LmFycmF5TGF5b3V0ID09ICd0YWJsZSc7ZWxzZSBkZWZhdWx0VGVtcGxhdGVcIj5cbiAgICAgICAgICA8cC10YWJsZSBbdmFsdWVdPVwiZmllbGQuYXJyYXk/P1tdXCJcbiAgICAgICAgICBbY29sdW1uc109XCJnZXRBcnJheVRhYmxlQ29sdW1ucygpXCJcbiAgICAgICAgICBbcm93c109XCJmaWVsZD8ub3B0aW9ucz8ucGFnZVNpemVcIlxuICAgICAgICAgIFtmaXJzdF09XCJmaWVsZD8ub3B0aW9ucz8uZmlyc3QgfHwgMFwiXG4gICAgICAgICAgW3Jvd3NQZXJQYWdlT3B0aW9uc109XCJmaWVsZD8ub3B0aW9ucz8ucm93c1BlclBhZ2VPcHRpb25zID8/IFs1LCAxMCwgMjUsIDUwLCAxMDBdXCJcbiAgICAgICAgICBbcGFnaW5hdG9yXT1cImZpZWxkPy5vcHRpb25zPy5zaG93Q2xpZW50UGFnaW5hdG9yID8/IGZhbHNlXCJcbiAgICAgICAgICBbdG90YWxSZWNvcmRzXT1cImZpZWxkPy5hcnJheT8ubGVuZ3RoXCJcbiAgICAgICAgICBzdHlsZUNsYXNzPVwie3tmaWVsZD8ub3B0aW9ucz8uYXJyYXlUYWJsZUNsYXNzfX1cIlxuICAgICAgICAgICAgICBbdGFibGVTdHlsZV09XCJmaWVsZD8ub3B0aW9ucz8uYXJyYXlUYWJsZVN0eWxlID8/IHsnbWluLXdpZHRoJzogJzYwcmVtJ31cIiBkYXRhS2V5PVwib3B0aW9ucy5mb3JtQ29udHJvbE5hbWVcIiAgW2Zvcm1BcnJheU5hbWVdPVwiZmllbGQ/Lm9wdGlvbnM/LmZvcm1Db250cm9sTmFtZVwiPlxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiaGVhZGVyXCIgbGV0LWNvbHVtbnM+XG4gICAgICAgICAgICAgICAgICA8dHIgW2NsYXNzXT1cImZpZWxkPy5vcHRpb25zPy50YWJsZUhlYWRlckNsYXNzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaXRlbSBvZiBjb2x1bW5zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJ7e2l0ZW0/LmNlbGxDbGFzc319XCIgW25nU3R5bGVdPVwiaXRlbT8uY2VsbFN0eWxlPz8ge31cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyhpdGVtLmhlYWRlcnx8JycpfHRyYW5zbGF0ZX19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgIDx0aCAqbmdJZj1cImZpZWxkPy5vcHRpb25zPy5zaG93QXJyYXlSZW1vdmVCdXR0b24gIT0gZmFsc2VcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge3snQWN0aW9ucyd8dHJhbnNsYXRlfX1cbiAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiYm9keVwiIGxldC1pdGVtIGxldC1pPVwicm93SW5kZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgPHRyIFtmb3JtR3JvdXBdPVwiZ2V0Rm9ybUdyb3VwRnJvbUFycmF5KGZpZWxkPy5vcHRpb25zPy5mb3JtQ29udHJvbE5hbWUsaSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBlbGVtZW50IG9mIGl0ZW0uZ3JvdXBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkICpuZ0lmPVwiIWVsZW1lbnQ/Lm9wdGlvbnM/LmlzSGlkZGVuXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy1mdWxsXCIgKm5nSWY9XCJlbGVtZW50Py5vcHRpb25zPy5pc1Zpc2libGUgIT0gZmFsc2VcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8a2l0c25nLWZvcm0tZmFjdG9yeS1jb3JlIFtmaWVsZF09XCJlbGVtZW50XCI+PC9raXRzbmctZm9ybS1mYWN0b3J5LWNvcmU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCIoaSAhPSAwIHx8IGZpZWxkPy5vcHRpb25zPy5kZWZhdWx0QXJyYXlHcm91cCkgJiYgZmllbGQ/Lm9wdGlvbnM/LnNob3dBcnJheVJlbW92ZUJ1dHRvbiAhPSBmYWxzZSAmJiBpdGVtPy5vcHRpb25zPy5zaG93QXJyYXlSZW1vdmVCdXR0b24gIT0gZmFsc2VcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInJlbW92ZUJ1dHRvblRlbXBsYXRlOyBjb250ZXh0OiB7ICRpbXBsaWNpdDogaSwgZmlyc3Q6IGkgPT0gMCwgaXRlbTogaXRlbSB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPC9wLXRhYmxlPlxuXG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdFRlbXBsYXRlPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLWZsdWlkIHAtZm9ybWdyaWQgZ3JpZCByb3cgZ3JpZC1ub2d1dHRlciB7e2ZpZWxkPy5vcHRpb25zPy5jb250YWluZXJDbGFzc319XCIgW2Zvcm1BcnJheU5hbWVdPVwiZmllbGQ/Lm9wdGlvbnM/LmZvcm1Db250cm9sTmFtZVwiPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBzdWJmaWVsZCBvZiBmaWVsZC5hcnJheTsgbGV0IGkgPSBpbmRleDsgbGV0IGZpcnN0ID0gZmlyc3RcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgW2NsYXNzXT1cInN1YmZpZWxkLmNvbFNpemVcIiAqbmdJZj1cInN1YmZpZWxkPy5vcHRpb25zPy5pc1Zpc2libGUgIT0gZmFsc2VcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZCB3LWZ1bGwgc2hhZG93LW5vbmUge3tzdWJmaWVsZD8ub3B0aW9ucz8uY2xhc3MgPz8gJ21iLTInfX1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSByZW1vdmUgYnV0dG9uIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImZpZWxkPy5vcHRpb25zPy5yZW1vdmVCdXR0b25Qb3NpdGlvbiA9PSAndG9wJyB8fCAhZmllbGQ/Lm9wdGlvbnM/LnJlbW92ZUJ1dHRvblBvc2l0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInJlbW92ZUJ1dHRvblRlbXBsYXRlOyBjb250ZXh0OiB7ICRpbXBsaWNpdDogaSwgZmlyc3Q6IGZpcnN0LCBpdGVtOiBzdWJmaWVsZCB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8aDUgICpuZ0lmPVwic3ViZmllbGQ/Lm9wdGlvbnM/LmxhYmVsXCIgY2xhc3M9XCJcIj57eyBzdWJmaWVsZC5vcHRpb25zLmxhYmVsIH19PC9oNT4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLWZsdWlkIHAtZm9ybWdyaWQgZ3JpZCByb3cgZ3JpZC1ub2d1dHRlciB7e3N1YmZpZWxkPy5vcHRpb25zPy5jb250YWluZXJDbGFzc319XCIgIFtmb3JtR3JvdXBdPVwiZ2V0Rm9ybUdyb3VwRnJvbUFycmF5KGZpZWxkPy5vcHRpb25zPy5mb3JtQ29udHJvbE5hbWUsaSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzdWJmaWVsZC5ncm91cDsgZWxzZSBuZXN0ZWRDb250cm9sVGVtcGxhdGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tICogRGVmaW5lIGNvbHVtbiBzaXplIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHN1YlN1YmZpZWxkIG9mIHN1YmZpZWxkLmdyb3VwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gKiBGaW5kIGFuZCB1c2UgdHlwZSBvZiBjb250cm9sIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IFtjbGFzc109XCIncHktMiAnK3N1YlN1YmZpZWxkLmNvbFNpemVcIiAqbmdJZj1cInN1YlN1YmZpZWxkPy5vcHRpb25zPy5pc1Zpc2libGUgIT0gZmFsc2VcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxraXRzbmctZm9ybS1mYWN0b3J5LWNvcmUgW2ZpZWxkXT1cInN1YlN1YmZpZWxkXCI+PC9raXRzbmctZm9ybS1mYWN0b3J5LWNvcmU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI25lc3RlZENvbnRyb2xUZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IFtjbGFzc109XCJzdWJmaWVsZC5jb2xTaXplXCIgKm5nSWY9XCJzdWJmaWVsZD8ub3B0aW9ucz8uaXNWaXNpYmxlICE9IGZhbHNlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGtpdHNuZy1mb3JtLWZhY3RvcnktY29yZSBbZmllbGRdPVwic3ViZmllbGRcIj48L2tpdHNuZy1mb3JtLWZhY3RvcnktY29yZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIHJlbW92ZSBidXR0b24gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZmllbGQ/Lm9wdGlvbnM/LnJlbW92ZUJ1dHRvblBvc2l0aW9uID09ICdzaWRlJyAmJiAoIWZpcnN0IHx8IGZpZWxkPy5vcHRpb25zPy5kZWZhdWx0QXJyYXlHcm91cCkgJiYgZmllbGQ/Lm9wdGlvbnM/LnNob3dBcnJheVJlbW92ZUJ1dHRvbiAhPSBmYWxzZSAmJiBzdWJmaWVsZD8ub3B0aW9ucz8uc2hvd0FycmF5UmVtb3ZlQnV0dG9uICE9IGZhbHNlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInt7ZmllbGQ/Lm9wdGlvbnM/LnJlbW92ZUJ1dHRvbkNvbFNpemUgPz8gJ2NvbC0xJ319XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJyZW1vdmVCdXR0b25UZW1wbGF0ZTsgY29udGV4dDogeyAkaW1wbGljaXQ6IGksIGZpcnN0OiBmaXJzdCwgaXRlbTogc3ViZmllbGQgfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIHJlbW92ZSBidXR0b24gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJmaWVsZD8ub3B0aW9ucz8ucmVtb3ZlQnV0dG9uUG9zaXRpb24gPT0gJ2JvdHRvbSdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJyZW1vdmVCdXR0b25UZW1wbGF0ZTsgY29udGV4dDogeyAkaW1wbGljaXQ6IGksIGZpcnN0OiBmaXJzdCwgaXRlbTogc3ViZmllbGQgfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPC9kaXY+XG5cbiAgICA8bmctdGVtcGxhdGUgI3JlbW92ZUJ1dHRvblRlbXBsYXRlIGxldC1pIGxldC1maXJzdD1cImZpcnN0XCIgbGV0LWl0ZW09XCJpdGVtXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZmxleCBkLWZsZXgganVzdGlmeS1jb250ZW50LWVuZFwiICpuZ0lmPVwiKCFmaXJzdCB8fCBmaWVsZD8ub3B0aW9ucz8uZGVmYXVsdEFycmF5R3JvdXApICYmIGZpZWxkPy5vcHRpb25zPy5zaG93QXJyYXlSZW1vdmVCdXR0b24gIT0gZmFsc2UgJiYgaXRlbT8ub3B0aW9ucz8uc2hvd0FycmF5UmVtb3ZlQnV0dG9uICE9IGZhbHNlXCI+XG4gICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIFtpY29uXT1cImZpZWxkPy5vcHRpb25zPy5yZW1vdmVCdXR0b25JY29uID8/ICdwaSBwaS10aW1lcydcIlxuICAgICAgICAgICAgICBjbGFzcz1cInt7ZmllbGQ/Lm9wdGlvbnM/LnJlbW92ZUJ1dHRvbkNsYXNzID8/ICdwLWJ1dHRvbi1vdXRsaW5lZCBwLWJ1dHRvbi1kYW5nZXInfX1cIlxuICAgICAgICAgICAgICBbbGFiZWxdPVwiZmllbGQ/Lm9wdGlvbnM/LnJlbW92ZUJ1dHRvbkxhYmVsID8/ICdSZW1vdmUnXCIgKGNsaWNrKT1cInJlbW92ZUdyb3VwKGkpXCI+PC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLXRlbXBsYXRlPlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
@@ -0,0 +1,67 @@
1
+ import { Component, ContentChildren, input, output, ViewChild, ViewContainerRef, } from '@angular/core';
2
+ import { KitsngFormControlTemplateRegistryService } from '../../core/services/kitsng-form-control-template-registry.service';
3
+ import { KitsngFormControlTemplateDirective } from '../../core/directives/kitsng-form-control-template.directive';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "../../core/services/kitsng-form-control-template-registry.service";
6
+ import * as i2 from "../../core/services/kitsng-form-factory.service";
7
+ export class KitsngFormFactoryElement {
8
+ set templateDirectives(directives) {
9
+ directives.forEach(d => {
10
+ this.templateRegistry.register(d.controlName, d.template);
11
+ });
12
+ }
13
+ constructor(templateRegistry, formFactoryService) {
14
+ this.templateRegistry = templateRegistry;
15
+ this.formFactoryService = formFactoryService;
16
+ /**
17
+ * Form field options
18
+ */
19
+ this.field = input.required();
20
+ this.control = input.required();
21
+ this.modelChange = output();
22
+ }
23
+ ngOnInit() {
24
+ this.loadComponent();
25
+ }
26
+ loadComponent() {
27
+ if (this.field().dummyFields) {
28
+ /**
29
+ * If field is dummy fields (Fields that don`t have UI), then
30
+ * don`t load component
31
+ */
32
+ return;
33
+ }
34
+ this.dynamicHost.clear();
35
+ const componentRef = this.dynamicHost?.createComponent(this.componentTypeFactory(this.field()?.controlType));
36
+ componentRef.setInput("field", this.field());
37
+ componentRef.setInput("options", this.field()?.options);
38
+ if (this.control()) {
39
+ componentRef.setInput("_formControl", this.control());
40
+ }
41
+ if (componentRef?.instance?.modelChange) {
42
+ componentRef.instance.modelChange = this.modelChange;
43
+ }
44
+ // componentRef.instance.options = this.field.options;
45
+ }
46
+ componentTypeFactory(type) {
47
+ const field = this.formFactoryService.fields.find((field) => field.type === type);
48
+ return field?.component ?? this.componentTypeFactory("undefined");
49
+ }
50
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: KitsngFormFactoryElement, deps: [{ token: i1.KitsngFormControlTemplateRegistryService }, { token: i2.KitsngFormFactoryService }], target: i0.ɵɵFactoryTarget.Component }); }
51
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.2.8", type: KitsngFormFactoryElement, selector: "kitsng-form-element", inputs: { field: { classPropertyName: "field", publicName: "field", isSignal: true, isRequired: true, transformFunction: null }, control: { classPropertyName: "control", publicName: "control", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { modelChange: "modelChange" }, providers: [KitsngFormControlTemplateRegistryService], queries: [{ propertyName: "templateDirectives", predicate: KitsngFormControlTemplateDirective }], viewQueries: [{ propertyName: "dynamicHost", first: true, predicate: ["appDynamic"], descendants: true, read: ViewContainerRef, static: true }], ngImport: i0, template: `<ng-template #appDynamic></ng-template>`, isInline: true }); }
52
+ }
53
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: KitsngFormFactoryElement, decorators: [{
54
+ type: Component,
55
+ args: [{
56
+ selector: 'kitsng-form-element',
57
+ template: `<ng-template #appDynamic></ng-template>`,
58
+ providers: [KitsngFormControlTemplateRegistryService]
59
+ }]
60
+ }], ctorParameters: () => [{ type: i1.KitsngFormControlTemplateRegistryService }, { type: i2.KitsngFormFactoryService }], propDecorators: { dynamicHost: [{
61
+ type: ViewChild,
62
+ args: ['appDynamic', { read: ViewContainerRef, static: true }]
63
+ }], templateDirectives: [{
64
+ type: ContentChildren,
65
+ args: [KitsngFormControlTemplateDirective]
66
+ }] } });
67
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2l0c25nLWZvcm0tZWxlbWVudC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9raXRzbmctZm9ybS1mYWN0b3J5L3NyYy9saWIva2l0c25nLWZvcm0tZmFjdG9yeS9jb21wb25lbnRzL2tpdHNuZy1mb3JtLWVsZW1lbnQva2l0c25nLWZvcm0tZWxlbWVudC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxlQUFlLEVBQ2YsS0FBSyxFQUVMLE1BQU0sRUFHTixTQUFTLEVBQ1QsZ0JBQWdCLEdBQ2pCLE1BQU0sZUFBZSxDQUFDO0FBSXZCLE9BQU8sRUFBRSx3Q0FBd0MsRUFBRSxNQUFNLG1FQUFtRSxDQUFDO0FBQzdILE9BQU8sRUFBRSxrQ0FBa0MsRUFBRSxNQUFNLDhEQUE4RCxDQUFDOzs7O0FBT2xILE1BQU0sT0FBTyx3QkFBd0I7SUFZbkMsSUFDSSxrQkFBa0IsQ0FBQyxVQUF5RDtRQUM5RSxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQ3JCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDNUQsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBT0QsWUFDVSxnQkFBMEQsRUFDMUQsa0JBQTRDO1FBRDVDLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBMEM7UUFDMUQsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUEwQjtRQVJ0RDs7V0FFRztRQUNILFVBQUssR0FBRyxLQUFLLENBQUMsUUFBUSxFQUEwQixDQUFDO1FBQ2pELFlBQU8sR0FBRyxLQUFLLENBQUMsUUFBUSxFQUFvQixDQUFDO1FBQzdDLGdCQUFXLEdBQUcsTUFBTSxFQUFnSSxDQUFDO0lBRzVGLENBQUM7SUFFMUQsUUFBUTtRQUNOLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUN2QixDQUFDO0lBRU8sYUFBYTtRQUNuQixJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUM3Qjs7O2VBR0c7WUFDSCxPQUFPO1FBQ1QsQ0FBQztRQUNELElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDekIsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxlQUFlLENBQ3BELElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEVBQUUsV0FBcUIsQ0FBQyxDQUMvRCxDQUFDO1FBQ0YsWUFBWSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDNUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3ZELElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUM7WUFDakIsWUFBWSxDQUFDLFFBQVEsQ0FBQyxjQUFjLEVBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDekQsQ0FBQztRQUNELElBQUksWUFBWSxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsQ0FBQztZQUN0QyxZQUFZLENBQUMsUUFBUSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQ3pELENBQUM7UUFDRCxzREFBc0Q7SUFDeEQsQ0FBQztJQUVPLG9CQUFvQixDQUFDLElBQVk7UUFDdkMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQy9DLENBQUMsS0FBMkIsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxJQUFJLENBQ3JELENBQUM7UUFDRixPQUFPLEtBQUssRUFBRSxTQUFTLElBQUUsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ2xFLENBQUM7OEdBNURVLHdCQUF3QjtrR0FBeEIsd0JBQXdCLHVWQUZ0QixDQUFDLHdDQUF3QyxDQUFDLDZEQWN0QyxrQ0FBa0MsbUhBRmxCLGdCQUFnQiwyQ0FidkMseUNBQXlDOzsyRkFHeEMsd0JBQXdCO2tCQUxwQyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxxQkFBcUI7b0JBQy9CLFFBQVEsRUFBRSx5Q0FBeUM7b0JBQ2pELFNBQVMsRUFBRSxDQUFDLHdDQUF3QyxDQUFDO2lCQUN4RDtvSkFZUyxXQUFXO3NCQURsQixTQUFTO3VCQUFDLFlBQVksRUFBRSxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUc3RCxrQkFBa0I7c0JBRHJCLGVBQWU7dUJBQUMsa0NBQWtDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgS2l0c25nRmllbGRUeXBlTW9kZWwgfSBmcm9tICcuLi8uLi9jb3JlL21vZGVscy9raXRzbmctZmllbGQtdHlwZSc7XG5pbXBvcnQgeyBLaXRzbmdEeW5hbWljRmllbGQgfSBmcm9tICcuLi8uLi9jb3JlL21vZGVscy9raXRzbmctZHluYW1pYy1maWVsZCc7XG5pbXBvcnQge1xuICBDb21wb25lbnQsXG4gIENvbnRlbnRDaGlsZHJlbixcbiAgaW5wdXQsXG4gIE9uSW5pdCxcbiAgb3V0cHV0LFxuICBRdWVyeUxpc3QsXG4gIFR5cGUsXG4gIFZpZXdDaGlsZCxcbiAgVmlld0NvbnRhaW5lclJlZixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBLaXRzbmdGb3JtRmFjdG9yeVNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb3JlL3NlcnZpY2VzL2tpdHNuZy1mb3JtLWZhY3Rvcnkuc2VydmljZSc7XG5pbXBvcnQgeyBGb3JtQXJyYXksIEZvcm1Db250cm9sLCBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBLaXRzbmdGb3JtRmFjdG9yeU1vZGVsIH0gZnJvbSAnLi4vLi4vY29yZS9tb2RlbHMva2l0c25nLWZvcm0tZmFjdG9yeSc7XG5pbXBvcnQgeyBLaXRzbmdGb3JtQ29udHJvbFRlbXBsYXRlUmVnaXN0cnlTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS9zZXJ2aWNlcy9raXRzbmctZm9ybS1jb250cm9sLXRlbXBsYXRlLXJlZ2lzdHJ5LnNlcnZpY2UnO1xuaW1wb3J0IHsgS2l0c25nRm9ybUNvbnRyb2xUZW1wbGF0ZURpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL2NvcmUvZGlyZWN0aXZlcy9raXRzbmctZm9ybS1jb250cm9sLXRlbXBsYXRlLmRpcmVjdGl2ZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2tpdHNuZy1mb3JtLWVsZW1lbnQnLFxuICB0ZW1wbGF0ZTogYDxuZy10ZW1wbGF0ZSAjYXBwRHluYW1pYz48L25nLXRlbXBsYXRlPmAsXG4gICAgcHJvdmlkZXJzOiBbS2l0c25nRm9ybUNvbnRyb2xUZW1wbGF0ZVJlZ2lzdHJ5U2VydmljZV1cbn0pXG5leHBvcnQgY2xhc3MgS2l0c25nRm9ybUZhY3RvcnlFbGVtZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBUaGlzIGNvbXBvbmVudCBkeW5hbWljYWxseSBjcmVhdGVzIGEgZm9ybSBmaWVsZFxuICAgKiBkZXBlbmRpbmcgb24gdGhlIGZpZWxkIHR5cGUgZGVmaW5lZCBpbiB0aGUgY29uZmlndXJhdGlvblxuICAgKi9cblxuICAvKipcbiAgICogRm9ybSBmaWVsZCBjb250YWluZXJcbiAgICovXG4gIEBWaWV3Q2hpbGQoJ2FwcER5bmFtaWMnLCB7IHJlYWQ6IFZpZXdDb250YWluZXJSZWYsIHN0YXRpYzogdHJ1ZSB9KVxuICBwcml2YXRlIGR5bmFtaWNIb3N0ITogVmlld0NvbnRhaW5lclJlZjtcbiAgQENvbnRlbnRDaGlsZHJlbihLaXRzbmdGb3JtQ29udHJvbFRlbXBsYXRlRGlyZWN0aXZlKVxuICBzZXQgdGVtcGxhdGVEaXJlY3RpdmVzKGRpcmVjdGl2ZXM6IFF1ZXJ5TGlzdDxLaXRzbmdGb3JtQ29udHJvbFRlbXBsYXRlRGlyZWN0aXZlPikge1xuICAgIGRpcmVjdGl2ZXMuZm9yRWFjaChkID0+IHtcbiAgICAgIHRoaXMudGVtcGxhdGVSZWdpc3RyeS5yZWdpc3RlcihkLmNvbnRyb2xOYW1lLCBkLnRlbXBsYXRlKTtcbiAgICB9KTtcbiAgfVxuICAvKipcbiAgICogRm9ybSBmaWVsZCBvcHRpb25zXG4gICAqL1xuICBmaWVsZCA9IGlucHV0LnJlcXVpcmVkPEtpdHNuZ0Zvcm1GYWN0b3J5TW9kZWw+KCk7XG4gIGNvbnRyb2wgPSBpbnB1dC5yZXF1aXJlZDxGb3JtQ29udHJvbDxhbnk+PigpO1xuICBtb2RlbENoYW5nZSA9IG91dHB1dDx7ZXZlbnQ6IGFueSwgcGFyZW50Rm9ybUdyb3VwPzogRm9ybUdyb3VwPGFueT4gfCBGb3JtQXJyYXk8YW55PiB8IG51bGwsIHNlbGVjdGVkT3B0aW9uPzogYW55LCBmaWVsZD86IEtpdHNuZ0Zvcm1GYWN0b3J5TW9kZWx9PigpO1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHRlbXBsYXRlUmVnaXN0cnk6IEtpdHNuZ0Zvcm1Db250cm9sVGVtcGxhdGVSZWdpc3RyeVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBmb3JtRmFjdG9yeVNlcnZpY2U6IEtpdHNuZ0Zvcm1GYWN0b3J5U2VydmljZSkge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmxvYWRDb21wb25lbnQoKTtcbiAgfVxuXG4gIHByaXZhdGUgbG9hZENvbXBvbmVudCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5maWVsZCgpLmR1bW15RmllbGRzKSB7XG4gICAgICAvKipcbiAgICAgICAqIElmIGZpZWxkIGlzIGR1bW15IGZpZWxkcyAoRmllbGRzIHRoYXQgZG9uYHQgaGF2ZSBVSSksIHRoZW5cbiAgICAgICAqIGRvbmB0IGxvYWQgY29tcG9uZW50XG4gICAgICAgKi9cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5keW5hbWljSG9zdC5jbGVhcigpO1xuICAgIGNvbnN0IGNvbXBvbmVudFJlZiA9IHRoaXMuZHluYW1pY0hvc3Q/LmNyZWF0ZUNvbXBvbmVudDxhbnk+KFxuICAgICAgdGhpcy5jb21wb25lbnRUeXBlRmFjdG9yeSh0aGlzLmZpZWxkKCk/LmNvbnRyb2xUeXBlIGFzIHN0cmluZylcbiAgICApO1xuICAgIGNvbXBvbmVudFJlZi5zZXRJbnB1dChcImZpZWxkXCIsdGhpcy5maWVsZCgpKTtcbiAgICBjb21wb25lbnRSZWYuc2V0SW5wdXQoXCJvcHRpb25zXCIsdGhpcy5maWVsZCgpPy5vcHRpb25zKTtcbiAgICBpZiAodGhpcy5jb250cm9sKCkpIHtcbiAgICAgICAgY29tcG9uZW50UmVmLnNldElucHV0KFwiX2Zvcm1Db250cm9sXCIsdGhpcy5jb250cm9sKCkpO1xuICAgIH1cbiAgICBpZiAoY29tcG9uZW50UmVmPy5pbnN0YW5jZT8ubW9kZWxDaGFuZ2UpIHtcbiAgICAgICAgY29tcG9uZW50UmVmLmluc3RhbmNlLm1vZGVsQ2hhbmdlID0gdGhpcy5tb2RlbENoYW5nZTtcbiAgICB9XG4gICAgLy8gY29tcG9uZW50UmVmLmluc3RhbmNlLm9wdGlvbnMgPSB0aGlzLmZpZWxkLm9wdGlvbnM7XG4gIH1cblxuICBwcml2YXRlIGNvbXBvbmVudFR5cGVGYWN0b3J5KHR5cGU6IHN0cmluZyk6IFR5cGU8S2l0c25nRHluYW1pY0ZpZWxkPiB7XG4gICAgY29uc3QgZmllbGQgPSB0aGlzLmZvcm1GYWN0b3J5U2VydmljZS5maWVsZHMuZmluZChcbiAgICAgIChmaWVsZDogS2l0c25nRmllbGRUeXBlTW9kZWwpID0+IGZpZWxkLnR5cGUgPT09IHR5cGVcbiAgICApO1xuICAgIHJldHVybiBmaWVsZD8uY29tcG9uZW50Pz90aGlzLmNvbXBvbmVudFR5cGVGYWN0b3J5KFwidW5kZWZpbmVkXCIpO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,94 @@
1
+ import { Component, ContentChildren, EventEmitter, Input, Output, ViewChild } from '@angular/core';
2
+ import { KitsngFormControlTemplateRegistryService } from '../../core/services/kitsng-form-control-template-registry.service';
3
+ import { KitsngFormControlTemplateDirective } from '../../core/directives/kitsng-form-control-template.directive';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "../../core/services/kitsng-form-control-template-registry.service";
6
+ import * as i2 from "@angular/common";
7
+ import * as i3 from "@angular/forms";
8
+ import * as i4 from "../kitsng-form-factory-core/kitsng-form-factory-core.component";
9
+ import * as i5 from "../kitsng-form-array/kitsng-form-array.component";
10
+ import * as i6 from "../kitsng-form-group/kitsng-form-group.component";
11
+ export class KitsngFormFactoryComponent {
12
+ set templateDirectives(directives) {
13
+ directives.forEach(d => {
14
+ this.templateRegistry.register(d.controlName, d.template);
15
+ });
16
+ }
17
+ constructor(templateRegistry) {
18
+ this.templateRegistry = templateRegistry;
19
+ this.submit = new EventEmitter();
20
+ }
21
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: KitsngFormFactoryComponent, deps: [{ token: i1.KitsngFormControlTemplateRegistryService }], target: i0.ɵɵFactoryTarget.Component }); }
22
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.8", type: KitsngFormFactoryComponent, selector: "kitsng-form-factory", inputs: { form: "form", fields: "fields", styleClass: "styleClass" }, outputs: { submit: "submit" }, providers: [KitsngFormControlTemplateRegistryService], queries: [{ propertyName: "templateDirectives", predicate: KitsngFormControlTemplateDirective }], viewQueries: [{ propertyName: "formRef", first: true, predicate: ["formRef"], descendants: true }], ngImport: i0, template: ` <!-- * MAIN FORM -->
23
+ <form class="grid row grid-gutter-2" [ngClass]="styleClass" [formGroup]="form" #formRef="ngForm" (ngSubmit)="submit.next()">
24
+ <ng-container *ngFor="let field of fields">
25
+ <!-- * IF - group of fields -->
26
+ <ng-container *ngIf="field.group; else elseTemplate">
27
+ <!-- * Define column size -->
28
+ <div [class]="field.colSize" *ngIf="field?.options?.isVisible != false">
29
+ <kitsng-form-group [field]="field"></kitsng-form-group>
30
+ </div>
31
+ </ng-container>
32
+ <!-- * IF - single field -->
33
+ <ng-template #elseTemplate>
34
+ <!-- * Define column size -->
35
+ <ng-container *ngIf="field.array;else formControlTemplate">
36
+ <div [class]="field.colSize" *ngIf="field?.options?.isVisible != false">
37
+ <kitsng-form-array [field]="field" [fields]="fields"></kitsng-form-array>
38
+ </div>
39
+ </ng-container>
40
+ <ng-template #formControlTemplate>
41
+ <div [class]="field.colSize" *ngIf="field?.options?.isVisible != false">
42
+ <kitsng-form-factory-core [field]="field"></kitsng-form-factory-core>
43
+ </div>
44
+ </ng-template>
45
+ </ng-template>
46
+ </ng-container>
47
+ <ng-content></ng-content>
48
+ </form>`, isInline: true, styles: ["::ng-deep app-form-builder{width:100%}::ng-deep .required:after{content:\"*\";color:#bf524d;font-size:1.2rem;display:inline;line-height:1;margin:0 2px}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i4.KitsngFormFactoryCoreComponent, selector: "kitsng-form-factory-core", inputs: ["field"] }, { kind: "component", type: i5.KitsngFormArrayComponent, selector: "kitsng-form-array", inputs: ["field", "fields"] }, { kind: "component", type: i6.KitsngFormGroupComponent, selector: "kitsng-form-group", inputs: ["field"] }] }); }
49
+ }
50
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: KitsngFormFactoryComponent, decorators: [{
51
+ type: Component,
52
+ args: [{ selector: 'kitsng-form-factory', template: ` <!-- * MAIN FORM -->
53
+ <form class="grid row grid-gutter-2" [ngClass]="styleClass" [formGroup]="form" #formRef="ngForm" (ngSubmit)="submit.next()">
54
+ <ng-container *ngFor="let field of fields">
55
+ <!-- * IF - group of fields -->
56
+ <ng-container *ngIf="field.group; else elseTemplate">
57
+ <!-- * Define column size -->
58
+ <div [class]="field.colSize" *ngIf="field?.options?.isVisible != false">
59
+ <kitsng-form-group [field]="field"></kitsng-form-group>
60
+ </div>
61
+ </ng-container>
62
+ <!-- * IF - single field -->
63
+ <ng-template #elseTemplate>
64
+ <!-- * Define column size -->
65
+ <ng-container *ngIf="field.array;else formControlTemplate">
66
+ <div [class]="field.colSize" *ngIf="field?.options?.isVisible != false">
67
+ <kitsng-form-array [field]="field" [fields]="fields"></kitsng-form-array>
68
+ </div>
69
+ </ng-container>
70
+ <ng-template #formControlTemplate>
71
+ <div [class]="field.colSize" *ngIf="field?.options?.isVisible != false">
72
+ <kitsng-form-factory-core [field]="field"></kitsng-form-factory-core>
73
+ </div>
74
+ </ng-template>
75
+ </ng-template>
76
+ </ng-container>
77
+ <ng-content></ng-content>
78
+ </form>`, providers: [KitsngFormControlTemplateRegistryService], styles: ["::ng-deep app-form-builder{width:100%}::ng-deep .required:after{content:\"*\";color:#bf524d;font-size:1.2rem;display:inline;line-height:1;margin:0 2px}\n"] }]
79
+ }], ctorParameters: () => [{ type: i1.KitsngFormControlTemplateRegistryService }], propDecorators: { form: [{
80
+ type: Input
81
+ }], fields: [{
82
+ type: Input
83
+ }], styleClass: [{
84
+ type: Input
85
+ }], submit: [{
86
+ type: Output
87
+ }], formRef: [{
88
+ type: ViewChild,
89
+ args: ['formRef', { static: false }]
90
+ }], templateDirectives: [{
91
+ type: ContentChildren,
92
+ args: [KitsngFormControlTemplateDirective]
93
+ }] } });
94
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2l0c25nLWZvcm0tZmFjdG9yeS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9raXRzbmctZm9ybS1mYWN0b3J5L3NyYy9saWIva2l0c25nLWZvcm0tZmFjdG9yeS9jb21wb25lbnRzL2tpdHNuZy1mb3JtLWZhY3Rvcnkva2l0c25nLWZvcm0tZmFjdG9yeS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxlQUFlLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQWEsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXRILE9BQU8sRUFBRSx3Q0FBd0MsRUFBRSxNQUFNLG1FQUFtRSxDQUFDO0FBQzdILE9BQU8sRUFBRSxrQ0FBa0MsRUFBRSxNQUFNLDhEQUE4RCxDQUFDOzs7Ozs7OztBQWlEbEgsTUFBTSxPQUFPLDBCQUEwQjtJQXFCckMsSUFDSSxrQkFBa0IsQ0FBQyxVQUF5RDtRQUM5RSxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQ3JCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDNUQsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBQ0QsWUFDVSxnQkFBMEQ7UUFBMUQscUJBQWdCLEdBQWhCLGdCQUFnQixDQUEwQztRQVQxRCxXQUFNLEdBQXVCLElBQUksWUFBWSxFQUFFLENBQUM7SUFZMUQsQ0FBQzs4R0EvQlUsMEJBQTBCO2tHQUExQiwwQkFBMEIsbUpBRjFCLENBQUMsd0NBQXdDLENBQUMsNkRBdUJwQyxrQ0FBa0MsaUlBbEV6Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7WUEwQkE7OzJGQW1CQywwQkFBMEI7a0JBL0N0QyxTQUFTOytCQUNFLHFCQUFxQixZQUNyQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7WUEwQkEsYUFpQkMsQ0FBQyx3Q0FBd0MsQ0FBQzs2R0FrQjVDLElBQUk7c0JBQVosS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDSSxNQUFNO3NCQUFmLE1BQU07Z0JBQ2tDLE9BQU87c0JBQS9DLFNBQVM7dUJBQUMsU0FBUyxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFFbkMsa0JBQWtCO3NCQURyQixlQUFlO3VCQUFDLGtDQUFrQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgQ29udGVudENoaWxkcmVuLCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkluaXQsIE91dHB1dCwgUXVlcnlMaXN0LCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1BcnJheSwgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCwgTmdGb3JtLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgS2l0c25nRm9ybUNvbnRyb2xUZW1wbGF0ZVJlZ2lzdHJ5U2VydmljZSB9IGZyb20gJy4uLy4uL2NvcmUvc2VydmljZXMva2l0c25nLWZvcm0tY29udHJvbC10ZW1wbGF0ZS1yZWdpc3RyeS5zZXJ2aWNlJztcbmltcG9ydCB7IEtpdHNuZ0Zvcm1Db250cm9sVGVtcGxhdGVEaXJlY3RpdmUgfSBmcm9tICcuLi8uLi9jb3JlL2RpcmVjdGl2ZXMva2l0c25nLWZvcm0tY29udHJvbC10ZW1wbGF0ZS5kaXJlY3RpdmUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdraXRzbmctZm9ybS1mYWN0b3J5JyxcbiAgdGVtcGxhdGU6IGAgPCEtLSAqIE1BSU4gRk9STSAtLT5cbiAgICA8Zm9ybSBjbGFzcz1cImdyaWQgcm93IGdyaWQtZ3V0dGVyLTJcIiBbbmdDbGFzc109XCJzdHlsZUNsYXNzXCIgW2Zvcm1Hcm91cF09XCJmb3JtXCIgI2Zvcm1SZWY9XCJuZ0Zvcm1cIiAobmdTdWJtaXQpPVwic3VibWl0Lm5leHQoKVwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZmllbGQgb2YgZmllbGRzXCI+XG4gICAgICAgIDwhLS0gKiBJRiAtIGdyb3VwIG9mIGZpZWxkcyAtLT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImZpZWxkLmdyb3VwOyBlbHNlIGVsc2VUZW1wbGF0ZVwiPlxuICAgICAgICAgICAgPCEtLSAqIERlZmluZSBjb2x1bW4gc2l6ZSAtLT5cbiAgICAgICAgICA8ZGl2IFtjbGFzc109XCJmaWVsZC5jb2xTaXplXCIgKm5nSWY9XCJmaWVsZD8ub3B0aW9ucz8uaXNWaXNpYmxlICE9IGZhbHNlXCI+XG4gICAgICAgICAgICA8a2l0c25nLWZvcm0tZ3JvdXAgW2ZpZWxkXT1cImZpZWxkXCI+PC9raXRzbmctZm9ybS1ncm91cD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwhLS0gKiBJRiAtIHNpbmdsZSBmaWVsZCAtLT5cbiAgICAgICAgPG5nLXRlbXBsYXRlICNlbHNlVGVtcGxhdGU+XG4gICAgICAgICAgPCEtLSAqIERlZmluZSBjb2x1bW4gc2l6ZSAtLT5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJmaWVsZC5hcnJheTtlbHNlIGZvcm1Db250cm9sVGVtcGxhdGVcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IFtjbGFzc109XCJmaWVsZC5jb2xTaXplXCIgKm5nSWY9XCJmaWVsZD8ub3B0aW9ucz8uaXNWaXNpYmxlICE9IGZhbHNlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxraXRzbmctZm9ybS1hcnJheSBbZmllbGRdPVwiZmllbGRcIiBbZmllbGRzXT1cImZpZWxkc1wiPjwva2l0c25nLWZvcm0tYXJyYXk+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZm9ybUNvbnRyb2xUZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8ZGl2IFtjbGFzc109XCJmaWVsZC5jb2xTaXplXCIgKm5nSWY9XCJmaWVsZD8ub3B0aW9ucz8uaXNWaXNpYmxlICE9IGZhbHNlXCI+XG4gICAgICAgICAgICAgICAgICA8a2l0c25nLWZvcm0tZmFjdG9yeS1jb3JlIFtmaWVsZF09XCJmaWVsZFwiPjwva2l0c25nLWZvcm0tZmFjdG9yeS1jb3JlPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICAgIDwvZm9ybT5gLFxuICBzdHlsZXM6IFtcbiAgICBgXG4gICAgICA6Om5nLWRlZXAgYXBwLWZvcm0tYnVpbGRlciB7XG4gICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgfVxuXG4gICAgICA6Om5nLWRlZXAgLnJlcXVpcmVkOmFmdGVyIHtcbiAgICAgICAgY29udGVudDogXCIqXCI7XG4gICAgICAgIGNvbG9yOiAjQkY1MjREO1xuICAgICAgICBmb250LXNpemU6IDEuMnJlbTtcbiAgICAgICAgZGlzcGxheTogaW5saW5lO1xuICAgICAgICBsaW5lLWhlaWdodDogMTtcbiAgICAgICAgbWFyZ2luOiAwIDJweDtcbiAgICAgICAgfVxuICAgIGAsXG4gIF0sXG4gIHByb3ZpZGVyczogW0tpdHNuZ0Zvcm1Db250cm9sVGVtcGxhdGVSZWdpc3RyeVNlcnZpY2VdXG59KVxuZXhwb3J0IGNsYXNzIEtpdHNuZ0Zvcm1GYWN0b3J5Q29tcG9uZW50IHtcbiAgLyoqXG4gICAqIEBkZWNyaXB0aW9uXG4gICAqIEZvcm0gZmFjdG9yeSBpcyBhIGNvbXBvbmVudCB0aGF0IHdvcmtzIGJ5IHBhc3NpbmcgaXQgdGhlIEpTT04gY29uZmlndXJhdGlvblxuICAgKiBmb3IgdGhlIGZvcm1hbmQgaXQgaXRzZWxmIGNyZWF0ZXMgdGhlIGVudGlyZSBsYXlvdXQgb2YgdGhlIGZvcm0gYW5kIGFsbCB0aGUgZmllbGRzLlxuICAgKiBNb3JlIGFib3V0IGZvcm0gZmFjdG9yeSBzeXN0ZW0geW91IGNhbiBmaW5kIGhlcmU6XG4gICAqIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXJ0aW5zdGVmYW5vdmljL2FuZ3VsYXItZHluYW1pYy1mb3Jtc1xuICAgKi9cblxuICAvKipcbiAgICogSW5wdXRzXG4gICAqXG4gICAqIEBmb3JtIFRoaXMgaXMgbWFpbiBGb3JtR3JvdXBcbiAgICogQGZpZWxkcyBBbGwgZm9ybSBmaWVsZHNcbiAgICogQHN0eWxlQ2xhc3MgQ1NTIGNsYXNzZXMgZm9yIG1haW4gZ3JpZCByb3cgY29udGFpbmVyXG4gICAqL1xuICBASW5wdXQoKSBmb3JtITogRm9ybUdyb3VwO1xuICBASW5wdXQoKSBmaWVsZHM6IGFueTtcbiAgQElucHV0KCkgc3R5bGVDbGFzcyE6IHN0cmluZztcbiAgQE91dHB1dCgpIHN1Ym1pdDogRXZlbnRFbWl0dGVyPHZvaWQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAVmlld0NoaWxkKCdmb3JtUmVmJywgeyBzdGF0aWM6IGZhbHNlIH0pIGZvcm1SZWYhOiBOZ0Zvcm07XG4gIEBDb250ZW50Q2hpbGRyZW4oS2l0c25nRm9ybUNvbnRyb2xUZW1wbGF0ZURpcmVjdGl2ZSlcbiAgc2V0IHRlbXBsYXRlRGlyZWN0aXZlcyhkaXJlY3RpdmVzOiBRdWVyeUxpc3Q8S2l0c25nRm9ybUNvbnRyb2xUZW1wbGF0ZURpcmVjdGl2ZT4pIHtcbiAgICBkaXJlY3RpdmVzLmZvckVhY2goZCA9PiB7XG4gICAgICB0aGlzLnRlbXBsYXRlUmVnaXN0cnkucmVnaXN0ZXIoZC5jb250cm9sTmFtZSwgZC50ZW1wbGF0ZSk7XG4gICAgfSk7XG4gIH1cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSB0ZW1wbGF0ZVJlZ2lzdHJ5OiBLaXRzbmdGb3JtQ29udHJvbFRlbXBsYXRlUmVnaXN0cnlTZXJ2aWNlXG4gICkge1xuXG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,65 @@
1
+ import { Component, Input, ViewChild, ViewContainerRef, } from '@angular/core';
2
+ import { ControlContainer, FormGroupDirective } from '@angular/forms';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "../../core/services/kitsng-form-factory.service";
5
+ import * as i2 from "@angular/forms";
6
+ export class KitsngFormFactoryCoreComponent {
7
+ constructor(formFactoryService, controlContainer) {
8
+ this.formFactoryService = formFactoryService;
9
+ this.controlContainer = controlContainer;
10
+ }
11
+ ngOnInit() {
12
+ if (this.field?.options?.formControlName) {
13
+ this.formGroup = this.controlContainer.control;
14
+ this._formControl = this.formGroup.controls[this.field.options.formControlName];
15
+ }
16
+ this.loadComponent();
17
+ }
18
+ loadComponent() {
19
+ if (this.field.dummyFields) {
20
+ /**
21
+ * If field is dummy fields (Fields that don`t have UI), then
22
+ * don`t load component
23
+ */
24
+ return;
25
+ }
26
+ this.dynamicHost.clear();
27
+ const componentRef = this.dynamicHost?.createComponent(this.componentTypeFactory(this.field.controlType));
28
+ componentRef.setInput("field", this.field);
29
+ componentRef.setInput("options", this.field.options);
30
+ if (this._formControl) {
31
+ componentRef.setInput("_formControl", this._formControl);
32
+ }
33
+ // componentRef.instance.options = this.field.options;
34
+ }
35
+ componentTypeFactory(type) {
36
+ const field = this.formFactoryService.fields.find((field) => field.type === type);
37
+ return field?.component ?? this.componentTypeFactory("undefined");
38
+ }
39
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: KitsngFormFactoryCoreComponent, deps: [{ token: i1.KitsngFormFactoryService }, { token: i2.ControlContainer }], target: i0.ɵɵFactoryTarget.Component }); }
40
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.8", type: KitsngFormFactoryCoreComponent, selector: "kitsng-form-factory-core", inputs: { field: "field" }, viewQueries: [{ propertyName: "dynamicHost", first: true, predicate: ["appDynamic"], descendants: true, read: ViewContainerRef, static: true }], ngImport: i0, template: `<ng-template #appDynamic></ng-template>`, isInline: true, viewProviders: [
41
+ {
42
+ provide: ControlContainer,
43
+ useExisting: FormGroupDirective,
44
+ },
45
+ ] }); }
46
+ }
47
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: KitsngFormFactoryCoreComponent, decorators: [{
48
+ type: Component,
49
+ args: [{
50
+ selector: 'kitsng-form-factory-core',
51
+ template: `<ng-template #appDynamic></ng-template>`,
52
+ viewProviders: [
53
+ {
54
+ provide: ControlContainer,
55
+ useExisting: FormGroupDirective,
56
+ },
57
+ ],
58
+ }]
59
+ }], ctorParameters: () => [{ type: i1.KitsngFormFactoryService }, { type: i2.ControlContainer }], propDecorators: { dynamicHost: [{
60
+ type: ViewChild,
61
+ args: ['appDynamic', { read: ViewContainerRef, static: true }]
62
+ }], field: [{
63
+ type: Input
64
+ }] } });
65
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2l0c25nLWZvcm0tZmFjdG9yeS1jb3JlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2tpdHNuZy1mb3JtLWZhY3Rvcnkvc3JjL2xpYi9raXRzbmctZm9ybS1mYWN0b3J5L2NvbXBvbmVudHMva2l0c25nLWZvcm0tZmFjdG9yeS1jb3JlL2tpdHNuZy1mb3JtLWZhY3RvcnktY29yZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBR0wsU0FBUyxFQUNULGdCQUFnQixHQUNqQixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQW1CLGdCQUFnQixFQUFhLGtCQUFrQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7QUFZbEcsTUFBTSxPQUFPLDhCQUE4QjtJQWtCekMsWUFBb0Isa0JBQTRDLEVBQVMsZ0JBQWtDO1FBQXZGLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBMEI7UUFBUyxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO0lBQUcsQ0FBQztJQUUvRyxRQUFRO1FBQ04sSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxlQUFlLEVBQUUsQ0FBQztZQUN2QyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFvQixDQUFDO1lBQzVELElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDcEYsQ0FBQztRQUNELElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUN2QixDQUFDO0lBRU8sYUFBYTtRQUNuQixJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDM0I7OztlQUdHO1lBQ0gsT0FBTztRQUNULENBQUM7UUFDRCxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3pCLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsZUFBZSxDQUNwRCxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FDbEQsQ0FBQztRQUNGLFlBQVksQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMxQyxZQUFZLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3BELElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3BCLFlBQVksQ0FBQyxRQUFRLENBQUMsY0FBYyxFQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUM1RCxDQUFDO1FBQ0Qsc0RBQXNEO0lBQ3hELENBQUM7SUFFTyxvQkFBb0IsQ0FBQyxJQUFZO1FBQ3ZDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUMvQyxDQUFDLEtBQTJCLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUNyRCxDQUFDO1FBQ0YsT0FBTyxLQUFLLEVBQUUsU0FBUyxJQUFFLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNsRSxDQUFDOzhHQXJEVSw4QkFBOEI7a0dBQTlCLDhCQUE4QixrTEFVUixnQkFBZ0IsMkNBbEJ2Qyx5Q0FBeUMsaUNBQ3BDO1lBQ2I7Z0JBQ0UsT0FBTyxFQUFFLGdCQUFnQjtnQkFDekIsV0FBVyxFQUFFLGtCQUFrQjthQUNoQztTQUNGOzsyRkFFVSw4QkFBOEI7a0JBVjFDLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLDBCQUEwQjtvQkFDcEMsUUFBUSxFQUFFLHlDQUF5QztvQkFDbkQsYUFBYSxFQUFFO3dCQUNiOzRCQUNFLE9BQU8sRUFBRSxnQkFBZ0I7NEJBQ3pCLFdBQVcsRUFBRSxrQkFBa0I7eUJBQ2hDO3FCQUNGO2lCQUNGOzRIQVlTLFdBQVc7c0JBRGxCLFNBQVM7dUJBQUMsWUFBWSxFQUFFLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBS3hELEtBQUs7c0JBQWIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEtpdHNuZ0ZpZWxkVHlwZU1vZGVsIH0gZnJvbSAnLi8uLi8uLi9jb3JlL21vZGVscy9raXRzbmctZmllbGQtdHlwZSc7XG5pbXBvcnQgeyBLaXRzbmdEeW5hbWljRmllbGQgfSBmcm9tICcuLy4uLy4uL2NvcmUvbW9kZWxzL2tpdHNuZy1keW5hbWljLWZpZWxkJztcbmltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgSW5wdXQsXG4gIE9uSW5pdCxcbiAgVHlwZSxcbiAgVmlld0NoaWxkLFxuICBWaWV3Q29udGFpbmVyUmVmLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEtpdHNuZ0Zvcm1GYWN0b3J5U2VydmljZSB9IGZyb20gJy4uLy4uL2NvcmUvc2VydmljZXMva2l0c25nLWZvcm0tZmFjdG9yeS5zZXJ2aWNlJztcbmltcG9ydCB7IEFic3RyYWN0Q29udHJvbCwgQ29udHJvbENvbnRhaW5lciwgRm9ybUdyb3VwLCBGb3JtR3JvdXBEaXJlY3RpdmUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2tpdHNuZy1mb3JtLWZhY3RvcnktY29yZScsXG4gIHRlbXBsYXRlOiBgPG5nLXRlbXBsYXRlICNhcHBEeW5hbWljPjwvbmctdGVtcGxhdGU+YCxcbiAgdmlld1Byb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IENvbnRyb2xDb250YWluZXIsXG4gICAgICB1c2VFeGlzdGluZzogRm9ybUdyb3VwRGlyZWN0aXZlLFxuICAgIH0sXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIEtpdHNuZ0Zvcm1GYWN0b3J5Q29yZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogVGhpcyBjb21wb25lbnQgZHluYW1pY2FsbHkgY3JlYXRlcyBhIGZvcm0gZmllbGRcbiAgICogZGVwZW5kaW5nIG9uIHRoZSBmaWVsZCB0eXBlIGRlZmluZWQgaW4gdGhlIGNvbmZpZ3VyYXRpb25cbiAgICovXG5cbiAgLyoqXG4gICAqIEZvcm0gZmllbGQgY29udGFpbmVyXG4gICAqL1xuICBAVmlld0NoaWxkKCdhcHBEeW5hbWljJywgeyByZWFkOiBWaWV3Q29udGFpbmVyUmVmLCBzdGF0aWM6IHRydWUgfSlcbiAgcHJpdmF0ZSBkeW5hbWljSG9zdCE6IFZpZXdDb250YWluZXJSZWY7XG4gIC8qKlxuICAgKiBGb3JtIGZpZWxkIG9wdGlvbnNcbiAgICovXG4gIEBJbnB1dCgpIGZpZWxkITogYW55O1xuICBfZm9ybUNvbnRyb2whOiBBYnN0cmFjdENvbnRyb2w8YW55LCBhbnk+O1xuICBmb3JtR3JvdXAhOiBGb3JtR3JvdXA7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZm9ybUZhY3RvcnlTZXJ2aWNlOiBLaXRzbmdGb3JtRmFjdG9yeVNlcnZpY2UsIHB1YmxpYyBjb250cm9sQ29udGFpbmVyOiBDb250cm9sQ29udGFpbmVyKSB7fVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmZpZWxkPy5vcHRpb25zPy5mb3JtQ29udHJvbE5hbWUpIHtcbiAgICAgICAgdGhpcy5mb3JtR3JvdXAgPSB0aGlzLmNvbnRyb2xDb250YWluZXIuY29udHJvbCBhcyBGb3JtR3JvdXA7XG4gICAgICAgIHRoaXMuX2Zvcm1Db250cm9sID0gdGhpcy5mb3JtR3JvdXAuY29udHJvbHNbdGhpcy5maWVsZC5vcHRpb25zLmZvcm1Db250cm9sTmFtZV07XG4gICAgfVxuICAgIHRoaXMubG9hZENvbXBvbmVudCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2FkQ29tcG9uZW50KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmZpZWxkLmR1bW15RmllbGRzKSB7XG4gICAgICAvKipcbiAgICAgICAqIElmIGZpZWxkIGlzIGR1bW15IGZpZWxkcyAoRmllbGRzIHRoYXQgZG9uYHQgaGF2ZSBVSSksIHRoZW5cbiAgICAgICAqIGRvbmB0IGxvYWQgY29tcG9uZW50XG4gICAgICAgKi9cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5keW5hbWljSG9zdC5jbGVhcigpO1xuICAgIGNvbnN0IGNvbXBvbmVudFJlZiA9IHRoaXMuZHluYW1pY0hvc3Q/LmNyZWF0ZUNvbXBvbmVudDxhbnk+KFxuICAgICAgdGhpcy5jb21wb25lbnRUeXBlRmFjdG9yeSh0aGlzLmZpZWxkLmNvbnRyb2xUeXBlKVxuICAgICk7XG4gICAgY29tcG9uZW50UmVmLnNldElucHV0KFwiZmllbGRcIix0aGlzLmZpZWxkKTtcbiAgICBjb21wb25lbnRSZWYuc2V0SW5wdXQoXCJvcHRpb25zXCIsdGhpcy5maWVsZC5vcHRpb25zKTtcbiAgICBpZiAodGhpcy5fZm9ybUNvbnRyb2wpIHtcbiAgICAgICAgY29tcG9uZW50UmVmLnNldElucHV0KFwiX2Zvcm1Db250cm9sXCIsdGhpcy5fZm9ybUNvbnRyb2wpO1xuICAgIH1cbiAgICAvLyBjb21wb25lbnRSZWYuaW5zdGFuY2Uub3B0aW9ucyA9IHRoaXMuZmllbGQub3B0aW9ucztcbiAgfVxuXG4gIHByaXZhdGUgY29tcG9uZW50VHlwZUZhY3RvcnkodHlwZTogc3RyaW5nKTogVHlwZTxLaXRzbmdEeW5hbWljRmllbGQ+IHtcbiAgICBjb25zdCBmaWVsZCA9IHRoaXMuZm9ybUZhY3RvcnlTZXJ2aWNlLmZpZWxkcy5maW5kKFxuICAgICAgKGZpZWxkOiBLaXRzbmdGaWVsZFR5cGVNb2RlbCkgPT4gZmllbGQudHlwZSA9PT0gdHlwZVxuICAgICk7XG4gICAgcmV0dXJuIGZpZWxkPy5jb21wb25lbnQ/P3RoaXMuY29tcG9uZW50VHlwZUZhY3RvcnkoXCJ1bmRlZmluZWRcIik7XG4gIH1cbn1cbiJdfQ==