@seniorsistemas/data-seniorx-core 3.0.0 → 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (180) hide show
  1. package/core/constants/editable-overlay.const.d.ts +4 -0
  2. package/core/constants/help-popover.const.d.ts +7 -0
  3. package/core/constants/input-mask.const.d.ts +5 -0
  4. package/core/constants/navigation-button.const.d.ts +3 -0
  5. package/core/constants/object-card.const.d.ts +21 -0
  6. package/core/constants/thumbnail.const.d.ts +6 -0
  7. package/core/constants/thumbnails.const.d.ts +4 -0
  8. package/core/constants/token-list.const.d.ts +3 -0
  9. package/core/types/button.type.d.ts +1 -1
  10. package/core/types/datepicker.type.d.ts +28 -0
  11. package/core/types/dynamic-form.type.d.ts +29 -0
  12. package/core/types/editable-overlay.type.d.ts +15 -0
  13. package/core/types/help-popover.type.d.ts +2 -0
  14. package/core/types/input-mask.type.d.ts +6 -0
  15. package/core/types/lookup.type.d.ts +45 -0
  16. package/core/types/navigation-button.type.d.ts +9 -0
  17. package/core/types/row-card.type.d.ts +5 -0
  18. package/core/types/semantics.type.d.ts +1 -1
  19. package/core/types/table-options.type.d.ts +1 -0
  20. package/core/types/thumbnail.type.d.ts +1 -0
  21. package/core/types/thumbnails.type.d.ts +20 -0
  22. package/core/types/token-list.type.d.ts +6 -0
  23. package/core/utils/emoji-support.util.d.ts +12 -0
  24. package/core/utils/overlay-dismiss.util.d.ts +25 -0
  25. package/esm2022/core/config/row-card.type.config.mjs +3 -1
  26. package/esm2022/core/constants/country-phone-picker.const.mjs +6 -6
  27. package/esm2022/core/constants/editable-overlay.const.mjs +5 -0
  28. package/esm2022/core/constants/help-popover.const.mjs +7 -0
  29. package/esm2022/core/constants/input-mask.const.mjs +6 -0
  30. package/esm2022/core/constants/navigation-button.const.mjs +4 -0
  31. package/esm2022/core/constants/object-card.const.mjs +23 -0
  32. package/esm2022/core/constants/thumbnail.const.mjs +14 -0
  33. package/esm2022/core/constants/thumbnails.const.mjs +5 -0
  34. package/esm2022/core/constants/token-list.const.mjs +4 -0
  35. package/esm2022/core/types/button.type.mjs +1 -1
  36. package/esm2022/core/types/datepicker.type.mjs +2 -0
  37. package/esm2022/core/types/dynamic-form.type.mjs +2 -0
  38. package/esm2022/core/types/editable-overlay.type.mjs +2 -0
  39. package/esm2022/core/types/help-popover.type.mjs +2 -0
  40. package/esm2022/core/types/input-mask.type.mjs +2 -0
  41. package/esm2022/core/types/lookup.type.mjs +2 -0
  42. package/esm2022/core/types/navigation-button.type.mjs +2 -0
  43. package/esm2022/core/types/row-card.type.mjs +1 -1
  44. package/esm2022/core/types/semantics.type.mjs +1 -1
  45. package/esm2022/core/types/table-options.type.mjs +1 -1
  46. package/esm2022/core/types/thumbnail.type.mjs +2 -0
  47. package/esm2022/core/types/thumbnails.type.mjs +2 -0
  48. package/esm2022/core/types/token-list.type.mjs +2 -0
  49. package/esm2022/core/utils/emoji-support.util.mjs +48 -0
  50. package/esm2022/core/utils/mask.util.mjs +2 -2
  51. package/esm2022/core/utils/overlay-dismiss.util.mjs +38 -0
  52. package/esm2022/features/alert/alert.component.mjs +5 -2
  53. package/esm2022/features/autocomplete/autocomplete.component.mjs +30 -8
  54. package/esm2022/features/bignumber-input/bignumber-input.component.mjs +1 -1
  55. package/esm2022/features/button/button.component.mjs +13 -5
  56. package/esm2022/features/card-list/card/card.component.mjs +2 -2
  57. package/esm2022/features/card-list/card-list.component.mjs +2 -2
  58. package/esm2022/features/checkbox-list/checkbox-list.component.mjs +25 -5
  59. package/esm2022/features/chips/chips.component.mjs +3 -3
  60. package/esm2022/features/code-editor/code-editor.component.mjs +12 -3
  61. package/esm2022/features/combobox/combobox.component.mjs +3 -3
  62. package/esm2022/features/confirm/confirm.component.mjs +2 -2
  63. package/esm2022/features/context-selector/context-selector.component.mjs +1 -1
  64. package/esm2022/features/country-phone-picker/country-phone-picker.component.mjs +22 -18
  65. package/esm2022/features/currency/currency.component.mjs +3 -3
  66. package/esm2022/features/datepicker/datepicker.component.mjs +814 -0
  67. package/esm2022/features/dynamic-form/dynamic-form-field.directive.mjs +178 -0
  68. package/esm2022/features/dynamic-form/dynamic-form.component.mjs +60 -0
  69. package/esm2022/features/dynamic-form/dynamic-form.registry.mjs +13 -0
  70. package/esm2022/features/editable-overlay/editable-overlay-editor.directive.mjs +31 -0
  71. package/esm2022/features/editable-overlay/editable-overlay.component.mjs +217 -0
  72. package/esm2022/features/editor/editor.component.mjs +173 -0
  73. package/esm2022/features/empty-state/empty-state.component.mjs +3 -3
  74. package/esm2022/features/fileupload/fileupload.component.mjs +3 -3
  75. package/esm2022/features/help-popover/help-popover.component.mjs +204 -0
  76. package/esm2022/features/hyperlink/hyperlink.component.mjs +3 -3
  77. package/esm2022/features/icon-picker/icon-picker.component.mjs +4 -4
  78. package/esm2022/features/image-cropper/image-cropper.component.mjs +2 -2
  79. package/esm2022/features/info-sign/info-sign.component.mjs +6 -3
  80. package/esm2022/features/inline-edit/components/fields/inline-edit-number/inline-edit-number.component.mjs +1 -1
  81. package/esm2022/features/inline-edit/components/inline-edit-item/inline-edit-item.component.mjs +2 -2
  82. package/esm2022/features/input-mask/input-mask.directive.mjs +510 -0
  83. package/esm2022/features/list/list.component.mjs +2 -2
  84. package/esm2022/features/localized-number-input/localized-number-input.component.mjs +3 -3
  85. package/esm2022/features/lookup/lookup.component.mjs +351 -0
  86. package/esm2022/features/modal/modal.component.mjs +6 -3
  87. package/esm2022/features/modalc/modalc.component.mjs +6 -3
  88. package/esm2022/features/navigation-button/navigation-button.component.mjs +172 -0
  89. package/esm2022/features/number-input/number-input.component.mjs +10 -4
  90. package/esm2022/features/object-card/components/object-card-field/object-card-field.component.mjs +89 -0
  91. package/esm2022/features/object-card/components/object-card-main/object-card-main.component.mjs +114 -0
  92. package/esm2022/features/object-card/object-card.component.mjs +199 -0
  93. package/esm2022/features/password-strength/password-strength.component.mjs +3 -3
  94. package/esm2022/features/pin-code-field/pin-code-field.component.mjs +14 -4
  95. package/esm2022/features/popover/popover.component.mjs +29 -3
  96. package/esm2022/features/profile-picture-picker/profile-picture-picker.component.mjs +13 -4
  97. package/esm2022/features/rating-scale/rating-scale.component.mjs +24 -4
  98. package/esm2022/features/row-card-list/row-card/row-card.component.mjs +19 -4
  99. package/esm2022/features/row-card-list/row-card-list.component.mjs +12 -3
  100. package/esm2022/features/scaffold/scaffold.component.mjs +3 -3
  101. package/esm2022/features/searchbox/searchbox.component.mjs +2 -2
  102. package/esm2022/features/select-button/select-button.component.mjs +26 -4
  103. package/esm2022/features/slider/slider.component.mjs +3 -3
  104. package/esm2022/features/split-button/split-button.component.mjs +1 -1
  105. package/esm2022/features/spotlight/components/spotlight-overlay/spotlight-overlay.component.mjs +15 -18
  106. package/esm2022/features/spotlight/spotlight.component.mjs +2 -2
  107. package/esm2022/features/star-rating/star-rating.component.mjs +25 -4
  108. package/esm2022/features/table/components/table-cell-content.component.mjs +2 -2
  109. package/esm2022/features/table/table.component.mjs +30 -9
  110. package/esm2022/features/textarea/textarea.component.mjs +3 -3
  111. package/esm2022/features/thumbnail/thumbnail.component.mjs +86 -0
  112. package/esm2022/features/thumbnails/components/thumbnail-item/thumbnail-item.component.mjs +59 -0
  113. package/esm2022/features/thumbnails/components/thumbnail-item-image/thumbnail-item-image.component.mjs +25 -0
  114. package/esm2022/features/thumbnails/components/thumbnail-item-video/thumbnail-item-video.component.mjs +50 -0
  115. package/esm2022/features/thumbnails/thumbnails.component.mjs +76 -0
  116. package/esm2022/features/tiered-menu/directives/tiered-menu.directive.mjs +13 -1
  117. package/esm2022/features/token-list/token-list.component.mjs +64 -0
  118. package/esm2022/features/visual-sql-editor/visual-sql-editor.component.mjs +2 -2
  119. package/esm2022/locales/en.json +409 -1
  120. package/esm2022/locales/es-CO.json +423 -2
  121. package/esm2022/locales/pt.json +1037 -630
  122. package/esm2022/providers/features.provider.mjs +20 -2
  123. package/esm2022/providers/primeng-config.provider.mjs +14 -128
  124. package/esm2022/providers/translate.provider.mjs +2 -2
  125. package/esm2022/public-api.mjs +31 -1
  126. package/features/alert/alert.component.d.ts +1 -0
  127. package/features/autocomplete/autocomplete.component.d.ts +9 -3
  128. package/features/button/button.component.d.ts +3 -1
  129. package/features/checkbox-list/checkbox-list.component.d.ts +8 -1
  130. package/features/code-editor/code-editor.component.d.ts +5 -1
  131. package/features/country-phone-picker/country-phone-picker.component.d.ts +3 -0
  132. package/features/datepicker/datepicker.component.d.ts +118 -0
  133. package/features/dynamic-form/dynamic-form-field.directive.d.ts +26 -0
  134. package/features/dynamic-form/dynamic-form.component.d.ts +15 -0
  135. package/features/dynamic-form/dynamic-form.registry.d.ts +11 -0
  136. package/features/editable-overlay/editable-overlay-editor.directive.d.ts +22 -0
  137. package/features/editable-overlay/editable-overlay.component.d.ts +60 -0
  138. package/features/editor/editor.component.d.ts +47 -0
  139. package/features/help-popover/help-popover.component.d.ts +81 -0
  140. package/features/info-sign/info-sign.component.d.ts +2 -1
  141. package/features/input-mask/input-mask.directive.d.ts +117 -0
  142. package/features/lookup/lookup.component.d.ts +104 -0
  143. package/features/modal/modal.component.d.ts +2 -1
  144. package/features/modalc/modalc.component.d.ts +2 -1
  145. package/features/navigation-button/navigation-button.component.d.ts +58 -0
  146. package/features/number-input/number-input.component.d.ts +3 -1
  147. package/features/object-card/components/object-card-field/object-card-field.component.d.ts +48 -0
  148. package/features/object-card/components/object-card-main/object-card-main.component.d.ts +57 -0
  149. package/features/object-card/object-card.component.d.ts +70 -0
  150. package/features/pin-code-field/pin-code-field.component.d.ts +6 -1
  151. package/features/popover/popover.component.d.ts +4 -1
  152. package/features/profile-picture-picker/profile-picture-picker.component.d.ts +5 -1
  153. package/features/rating-scale/rating-scale.component.d.ts +9 -1
  154. package/features/row-card-list/row-card/row-card.component.d.ts +6 -1
  155. package/features/row-card-list/row-card-list.component.d.ts +4 -1
  156. package/features/select-button/select-button.component.d.ts +9 -1
  157. package/features/star-rating/star-rating.component.d.ts +9 -1
  158. package/features/table/table.component.d.ts +2 -1
  159. package/features/thumbnail/thumbnail.component.d.ts +48 -0
  160. package/features/thumbnails/components/thumbnail-item/thumbnail-item.component.d.ts +29 -0
  161. package/features/thumbnails/components/thumbnail-item-image/thumbnail-item-image.component.d.ts +13 -0
  162. package/features/thumbnails/components/thumbnail-item-video/thumbnail-item-video.component.d.ts +19 -0
  163. package/features/thumbnails/thumbnails.component.d.ts +46 -0
  164. package/features/tiered-menu/directives/tiered-menu.directive.d.ts +2 -0
  165. package/features/token-list/token-list.component.d.ts +31 -0
  166. package/fesm2022/seniorsistemas-data-seniorx-core.mjs +11288 -6613
  167. package/fesm2022/seniorsistemas-data-seniorx-core.mjs.map +1 -1
  168. package/package.json +12 -3
  169. package/providers/primeng-config.provider.d.ts +12 -0
  170. package/public-api.d.ts +38 -0
  171. package/src/locales/en.json +409 -1
  172. package/src/locales/es-CO.json +423 -2
  173. package/src/locales/pt.json +1037 -630
  174. package/styles/sdc-global-variables.scss +38 -0
  175. package/styles.css +132 -0
  176. package/styles.scss +2 -0
  177. package/esm2022/providers/custom/button.mjs +0 -93
  178. package/esm2022/providers/custom/toast.mjs +0 -75
  179. package/providers/custom/button.d.ts +0 -16
  180. package/providers/custom/toast.d.ts +0 -14
@@ -0,0 +1,178 @@
1
+ import { Directive, inject, Input, ViewContainerRef } from '@angular/core';
2
+ import { DynamicFormRegistry } from './dynamic-form.registry';
3
+ import * as i0 from "@angular/core";
4
+ export class DynamicFormFieldDirective {
5
+ viewContainer = inject(ViewContainerRef);
6
+ componentRef = null;
7
+ field;
8
+ formGroup;
9
+ ngOnChanges(changes) {
10
+ if (changes['field'] && this.field) {
11
+ this.renderField();
12
+ }
13
+ if (changes['formGroup'] && this.componentRef) {
14
+ this.updateFormControl();
15
+ }
16
+ }
17
+ ngOnDestroy() {
18
+ this.componentRef?.destroy();
19
+ }
20
+ renderField() {
21
+ this.componentRef?.destroy();
22
+ this.viewContainer.clear();
23
+ const component = DynamicFormRegistry.resolveField(this.field.type);
24
+ if (!component) {
25
+ return;
26
+ }
27
+ this.componentRef = this.viewContainer.createComponent(component);
28
+ this.applyFieldConfig();
29
+ this.updateFormControl();
30
+ }
31
+ applyFieldConfig() {
32
+ if (!this.componentRef) {
33
+ return;
34
+ }
35
+ const instance = this.componentRef.instance;
36
+ this.mapCommonInputs(instance);
37
+ this.mapRequiredAndDisabled(instance);
38
+ this.mapOptionsAndRange(instance);
39
+ this.mapExtraInputs(instance);
40
+ }
41
+ // Map common field config properties to component inputs. Not every registered component
42
+ // declares all of these (e.g. sdc-button has no `placeholder`/`required`, sdc-autocomplete has
43
+ // no `label`) — `ComponentRef.setInput()` throws NG0303 for an input the component doesn't
44
+ // declare, so each one is gated on the instance actually having that property. The `'x' in
45
+ // instance` check alone isn't perfectly reliable (a component can have a plain, non-`@Input()`
46
+ // class property of the same name), so `trySetInput` also swallows the NG0303 as a last resort.
47
+ mapCommonInputs(instance) {
48
+ if (this.field.label !== undefined && 'label' in instance) {
49
+ this.trySetInput('label', this.field.label);
50
+ }
51
+ if (this.field.placeholder !== undefined && 'placeholder' in instance) {
52
+ this.trySetInput('placeholder', this.field.placeholder);
53
+ }
54
+ if (this.field.width !== undefined && 'width' in instance) {
55
+ this.trySetInput('width', this.field.width);
56
+ }
57
+ if (this.field.maxlength !== undefined && 'maxlength' in instance) {
58
+ this.trySetInput('maxlength', this.field.maxlength);
59
+ }
60
+ }
61
+ mapRequiredAndDisabled(instance) {
62
+ const required = typeof this.field.required === 'function' ? this.field.required() : (this.field.required ?? false);
63
+ const disabled = typeof this.field.disabled === 'function' ? this.field.disabled() : (this.field.disabled ?? false);
64
+ if ('required' in instance) {
65
+ this.trySetInput('required', required);
66
+ }
67
+ if ('disabled' in instance) {
68
+ this.trySetInput('disabled', disabled);
69
+ }
70
+ }
71
+ // Pass options for select-like fields and min/max for number/date fields
72
+ mapOptionsAndRange(instance) {
73
+ this.mapOptions(instance);
74
+ this.mapRange(instance);
75
+ }
76
+ // Pass options for select-like fields
77
+ mapOptions(instance) {
78
+ if (!this.field.options) {
79
+ return;
80
+ }
81
+ if ('options' in instance) {
82
+ this.trySetInput('options', this.field.options);
83
+ }
84
+ else if ('suggestions' in instance) {
85
+ // List-driven fields that don't use the generic `options` contract (e.g.
86
+ // sdc-autocomplete's `suggestions`/`suggestionLabel`/`suggestionValue`) still accept
87
+ // the standard `{ text, value }[]` shape authored on `DynamicFieldConfig.options` —
88
+ // without this, every consumer had to duplicate its option list via a component-specific
89
+ // extra input just to populate the field.
90
+ this.trySetInput('suggestions', this.field.options);
91
+ if ('suggestionLabel' in instance) {
92
+ this.trySetInput('suggestionLabel', 'text');
93
+ }
94
+ if ('suggestionValue' in instance) {
95
+ this.trySetInput('suggestionValue', 'value');
96
+ }
97
+ }
98
+ else {
99
+ // Component has no `options`/`suggestions`-like input declared — nothing to map.
100
+ }
101
+ }
102
+ // Pass min/max for number/date fields
103
+ mapRange(instance) {
104
+ if (this.field.min !== undefined && 'min' in instance) {
105
+ this.trySetInput('min', this.field.min);
106
+ }
107
+ if (this.field.max !== undefined && 'max' in instance) {
108
+ this.trySetInput('max', this.field.max);
109
+ }
110
+ }
111
+ // Pass any extra config properties that match component inputs
112
+ mapExtraInputs(instance) {
113
+ const reservedKeys = new Set(['type', 'name', 'label', 'placeholder', 'required', 'disabled', 'hidden', 'width', 'gridColumn', 'options', 'min', 'max', 'maxlength']);
114
+ for (const [key, val] of Object.entries(this.field)) {
115
+ if (!reservedKeys.has(key) && key in instance) {
116
+ this.trySetInput(key, val);
117
+ }
118
+ }
119
+ }
120
+ trySetInput(key, value) {
121
+ try {
122
+ this.componentRef?.setInput(key, value);
123
+ }
124
+ catch {
125
+ // Property exists on the instance but isn't a declared @Input() — skip it.
126
+ }
127
+ }
128
+ updateFormControl() {
129
+ if (!this.componentRef || !this.formGroup || !this.field?.name) {
130
+ return;
131
+ }
132
+ const control = this.formGroup.get(this.field.name);
133
+ if (!control) {
134
+ return;
135
+ }
136
+ const instance = this.componentRef.instance;
137
+ this.writeValueToInstance(instance, control.value);
138
+ this.bindInstanceCallbacksToControl(instance, control);
139
+ // Subscribe to form control value changes to push back to CVA
140
+ control.valueChanges.subscribe((value) => {
141
+ this.writeValueToInstance(instance, value);
142
+ });
143
+ }
144
+ // If the component has writeValue (CVA), push the value into it
145
+ writeValueToInstance(instance, value) {
146
+ if ('writeValue' in instance && typeof instance['writeValue'] === 'function') {
147
+ instance['writeValue'](value);
148
+ }
149
+ }
150
+ bindInstanceCallbacksToControl(instance, control) {
151
+ if ('registerOnChange' in instance && typeof instance['registerOnChange'] === 'function') {
152
+ instance['registerOnChange']((value) => {
153
+ control.setValue(value, { emitEvent: true });
154
+ control.markAsDirty();
155
+ });
156
+ }
157
+ if ('registerOnTouched' in instance && typeof instance['registerOnTouched'] === 'function') {
158
+ instance['registerOnTouched'](() => {
159
+ control.markAsTouched();
160
+ });
161
+ }
162
+ }
163
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DynamicFormFieldDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
164
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.14", type: DynamicFormFieldDirective, isStandalone: true, selector: "[sdcDynamicFormField]", inputs: { field: ["sdcDynamicFormField", "field"], formGroup: "formGroup" }, usesOnChanges: true, ngImport: i0 });
165
+ }
166
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DynamicFormFieldDirective, decorators: [{
167
+ type: Directive,
168
+ args: [{
169
+ selector: '[sdcDynamicFormField]',
170
+ standalone: true
171
+ }]
172
+ }], propDecorators: { field: [{
173
+ type: Input,
174
+ args: ['sdcDynamicFormField']
175
+ }], formGroup: [{
176
+ type: Input
177
+ }] } });
178
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy1mb3JtLWZpZWxkLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYi9zcmMvZmVhdHVyZXMvZHluYW1pYy1mb3JtL2R5bmFtaWMtZm9ybS1maWVsZC5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFnQixTQUFTLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBdUMsZ0JBQWdCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFOUgsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0seUJBQXlCLENBQUM7O0FBTzlELE1BQU0sT0FBTyx5QkFBeUI7SUFDakIsYUFBYSxHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQ2xELFlBQVksR0FBaUMsSUFBSSxDQUFDO0lBRTVCLEtBQUssQ0FBc0I7SUFDaEQsU0FBUyxDQUFhO0lBRS9CLFdBQVcsQ0FBQyxPQUFzQjtRQUM5QixJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDakMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3ZCLENBQUM7UUFDRCxJQUFJLE9BQU8sQ0FBQyxXQUFXLENBQUMsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDNUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDN0IsQ0FBQztJQUNMLENBQUM7SUFFRCxXQUFXO1FBQ1AsSUFBSSxDQUFDLFlBQVksRUFBRSxPQUFPLEVBQUUsQ0FBQztJQUNqQyxDQUFDO0lBRU8sV0FBVztRQUNmLElBQUksQ0FBQyxZQUFZLEVBQUUsT0FBTyxFQUFFLENBQUM7UUFDN0IsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUUzQixNQUFNLFNBQVMsR0FBRyxtQkFBbUIsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztR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LENBQXdDLENBQUMsQ0FBQyxLQUFjLEVBQUUsRUFBRTtnQkFDcEYsT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztnQkFDN0MsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQzFCLENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQztRQUNELElBQUksbUJBQW1CLElBQUksUUFBUSxJQUFJLE9BQU8sUUFBUSxDQUFDLG1CQUFtQixDQUFDLEtBQUssVUFBVSxFQUFFLENBQUM7WUFDeEYsUUFBUSxDQUFDLG1CQUFtQixDQUE4QixDQUFDLEdBQUcsRUFBRTtnQkFDN0QsT0FBTyxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQzVCLENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQztJQUNMLENBQUM7d0dBbkxRLHlCQUF5Qjs0RkFBekIseUJBQXlCOzs0RkFBekIseUJBQXlCO2tCQUpyQyxTQUFTO21CQUFDO29CQUNQLFFBQVEsRUFBRSx1QkFBdUI7b0JBQ2pDLFVBQVUsRUFBRSxJQUFJO2lCQUNuQjs4QkFLaUMsS0FBSztzQkFBbEMsS0FBSzt1QkFBQyxxQkFBcUI7Z0JBQ25CLFNBQVM7c0JBQWpCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnRSZWYsIERpcmVjdGl2ZSwgaW5qZWN0LCBJbnB1dCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIFNpbXBsZUNoYW5nZXMsIFZpZXdDb250YWluZXJSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFic3RyYWN0Q29udHJvbCwgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgRHluYW1pY0Zvcm1SZWdpc3RyeSB9IGZyb20gJy4vZHluYW1pYy1mb3JtLnJlZ2lzdHJ5JztcbmltcG9ydCB0eXBlIHsgRHluYW1pY0ZpZWxkQ29uZmlnIH0gZnJvbSAnLi4vLi4vY29yZS90eXBlcy9keW5hbWljLWZvcm0udHlwZSc7XG5cbkBEaXJlY3RpdmUoe1xuICAgIHNlbGVjdG9yOiAnW3NkY0R5bmFtaWNGb3JtRmllbGRdJyxcbiAgICBzdGFuZGFsb25lOiB0cnVlXG59KVxuZXhwb3J0IGNsYXNzIER5bmFtaWNGb3JtRmllbGREaXJlY3RpdmUgaW1wbGVtZW50cyBPbkNoYW5nZXMsIE9uRGVzdHJveSB7XG4gICAgcHJpdmF0ZSByZWFkb25seSB2aWV3Q29udGFpbmVyID0gaW5qZWN0KFZpZXdDb250YWluZXJSZWYpO1xuICAgIHByaXZhdGUgY29tcG9uZW50UmVmOiBDb21wb25lbnRSZWY8dW5rbm93bj4gfCBudWxsID0gbnVsbDtcblxuICAgIEBJbnB1dCgnc2RjRHluYW1pY0Zvcm1GaWVsZCcpIGZpZWxkITogRHluYW1pY0ZpZWxkQ29uZmlnO1xuICAgIEBJbnB1dCgpIGZvcm1Hcm91cCE6IEZvcm1Hcm91cDtcblxuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAgICAgaWYgKGNoYW5nZXNbJ2ZpZWxkJ10gJiYgdGhpcy5maWVsZCkge1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJGaWVsZCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGFuZ2VzWydmb3JtR3JvdXAnXSAmJiB0aGlzLmNvbXBvbmVudFJlZikge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVGb3JtQ29udHJvbCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY29tcG9uZW50UmVmPy5kZXN0cm95KCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZW5kZXJGaWVsZCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jb21wb25lbnRSZWY/LmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy52aWV3Q29udGFpbmVyLmNsZWFyKCk7XG5cbiAgICAgICAgY29uc3QgY29tcG9uZW50ID0gRHluYW1pY0Zvcm1SZWdpc3RyeS5yZXNvbHZlRmllbGQodGhpcy5maWVsZC50eXBlKTtcbiAgICAgICAgaWYgKCFjb21wb25lbnQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29tcG9uZW50UmVmID0gdGhpcy52aWV3Q29udGFpbmVyLmNyZWF0ZUNvbXBvbmVudChjb21wb25lbnQpO1xuICAgICAgICB0aGlzLmFwcGx5RmllbGRDb25maWcoKTtcbiAgICAgICAgdGhpcy51cGRhdGVGb3JtQ29udHJvbCgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXBwbHlGaWVsZENvbmZpZygpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbXBvbmVudFJlZikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaW5zdGFuY2UgPSB0aGlzLmNvbXBvbmVudFJlZi5pbnN0YW5jZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICAgICAgICB0aGlzLm1hcENvbW1vbklucHV0cyhpbnN0YW5jZSk7XG4gICAgICAgIHRoaXMubWFwUmVxdWlyZWRBbmREaXNhYmxlZChpbnN0YW5jZSk7XG4gICAgICAgIHRoaXMubWFwT3B0aW9uc0FuZFJhbmdlKGluc3RhbmNlKTtcbiAgICAgICAgdGhpcy5tYXBFeHRyYUlucHV0cyhpbnN0YW5jZSk7XG4gICAgfVxuXG4gICAgLy8gTWFwIGNvbW1vbiBmaWVsZCBjb25maWcgcHJvcGVydGllcyB0byBjb21wb25lbnQgaW5wdXRzLiBOb3QgZXZlcnkgcmVnaXN0ZXJlZCBjb21wb25lbnRcbiAgICAvLyBkZWNsYXJlcyBhbGwgb2YgdGhlc2UgKGUuZy4gc2RjLWJ1dHRvbiBoYXMgbm8gYHBsYWNlaG9sZGVyYC9gcmVxdWlyZWRgLCBzZGMtYXV0b2NvbXBsZXRlIGhhc1xuICAgIC8vIG5vIGBsYWJlbGApIOKAlCBgQ29tcG9uZW50UmVmLnNldElucHV0KClgIHRocm93cyBORzAzMDMgZm9yIGFuIGlucHV0IHRoZSBjb21wb25lbnQgZG9lc24ndFxuICAgIC8vIGRlY2xhcmUsIHNvIGVhY2ggb25lIGlzIGdhdGVkIG9uIHRoZSBpbnN0YW5jZSBhY3R1YWxseSBoYXZpbmcgdGhhdCBwcm9wZXJ0eS4gVGhlIGAneCcgaW5cbiAgICAvLyBpbnN0YW5jZWAgY2hlY2sgYWxvbmUgaXNuJ3QgcGVyZmVjdGx5IHJlbGlhYmxlIChhIGNvbXBvbmVudCBjYW4gaGF2ZSBhIHBsYWluLCBub24tYEBJbnB1dCgpYFxuICAgIC8vIGNsYXNzIHByb3BlcnR5IG9mIHRoZSBzYW1lIG5hbWUpLCBzbyBgdHJ5U2V0SW5wdXRgIGFsc28gc3dhbGxvd3MgdGhlIE5HMDMwMyBhcyBhIGxhc3QgcmVzb3J0LlxuICAgIHByaXZhdGUgbWFwQ29tbW9uSW5wdXRzKGluc3RhbmNlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5maWVsZC5sYWJlbCAhPT0gdW5kZWZpbmVkICYmICdsYWJlbCcgaW4gaW5zdGFuY2UpIHtcbiAgICAgICAgICAgIHRoaXMudHJ5U2V0SW5wdXQoJ2xhYmVsJywgdGhpcy5maWVsZC5sYWJlbCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZmllbGQucGxhY2Vob2xkZXIgIT09IHVuZGVmaW5lZCAmJiAncGxhY2Vob2xkZXInIGluIGluc3RhbmNlKSB7XG4gICAgICAgICAgICB0aGlzLnRyeVNldElucHV0KCdwbGFjZWhvbGRlcicsIHRoaXMuZmllbGQucGxhY2Vob2xkZXIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmZpZWxkLndpZHRoICE9PSB1bmRlZmluZWQgJiYgJ3dpZHRoJyBpbiBpbnN0YW5jZSkge1xuICAgICAgICAgICAgdGhpcy50cnlTZXRJbnB1dCgnd2lkdGgnLCB0aGlzLmZpZWxkLndpZHRoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5maWVsZC5tYXhsZW5ndGggIT09IHVuZGVmaW5lZCAmJiAnbWF4bGVuZ3RoJyBpbiBpbnN0YW5jZSkge1xuICAgICAgICAgICAgdGhpcy50cnlTZXRJbnB1dCgnbWF4bGVuZ3RoJywgdGhpcy5maWVsZC5tYXhsZW5ndGgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBtYXBSZXF1aXJlZEFuZERpc2FibGVkKGluc3RhbmNlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHZvaWQge1xuICAgICAgICBjb25zdCByZXF1aXJlZCA9IHR5cGVvZiB0aGlzLmZpZWxkLnJlcXVpcmVkID09PSAnZnVuY3Rpb24nID8gdGhpcy5maWVsZC5yZXF1aXJlZCgpIDogKHRoaXMuZmllbGQucmVxdWlyZWQgPz8gZmFsc2UpO1xuICAgICAgICBjb25zdCBkaXNhYmxlZCA9IHR5cGVvZiB0aGlzLmZpZWxkLmRpc2FibGVkID09PSAnZnVuY3Rpb24nID8gdGhpcy5maWVsZC5kaXNhYmxlZCgpIDogKHRoaXMuZmllbGQuZGlzYWJsZWQgPz8gZmFsc2UpO1xuICAgICAgICBpZiAoJ3JlcXVpcmVkJyBpbiBpbnN0YW5jZSkge1xuICAgICAgICAgICAgdGhpcy50cnlTZXRJbnB1dCgncmVxdWlyZWQnLCByZXF1aXJlZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCdkaXNhYmxlZCcgaW4gaW5zdGFuY2UpIHtcbiAgICAgICAgICAgIHRoaXMudHJ5U2V0SW5wdXQoJ2Rpc2FibGVkJywgZGlzYWJsZWQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gUGFzcyBvcHRpb25zIGZvciBzZWxlY3QtbGlrZSBmaWVsZHMgYW5kIG1pbi9tYXggZm9yIG51bWJlci9kYXRlIGZpZWxkc1xuICAgIHByaXZhdGUgbWFwT3B0aW9uc0FuZFJhbmdlKGluc3RhbmNlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHZvaWQge1xuICAgICAgICB0aGlzLm1hcE9wdGlvbnMoaW5zdGFuY2UpO1xuICAgICAgICB0aGlzLm1hcFJhbmdlKGluc3RhbmNlKTtcbiAgICB9XG5cbiAgICAvLyBQYXNzIG9wdGlvbnMgZm9yIHNlbGVjdC1saWtlIGZpZWxkc1xuICAgIHByaXZhdGUgbWFwT3B0aW9ucyhpbnN0YW5jZTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLmZpZWxkLm9wdGlvbnMpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgnb3B0aW9ucycgaW4gaW5zdGFuY2UpIHtcbiAgICAgICAgICAgIHRoaXMudHJ5U2V0SW5wdXQoJ29wdGlvbnMnLCB0aGlzLmZpZWxkLm9wdGlvbnMpO1xuICAgICAgICB9IGVsc2UgaWYgKCdzdWdnZXN0aW9ucycgaW4gaW5zdGFuY2UpIHtcbiAgICAgICAgICAgIC8vIExpc3QtZHJpdmVuIGZpZWxkcyB0aGF0IGRvbid0IHVzZSB0aGUgZ2VuZXJpYyBgb3B0aW9uc2AgY29udHJhY3QgKGUuZy5cbiAgICAgICAgICAgIC8vIHNkYy1hdXRvY29tcGxldGUncyBgc3VnZ2VzdGlvbnNgL2BzdWdnZXN0aW9uTGFiZWxgL2BzdWdnZXN0aW9uVmFsdWVgKSBzdGlsbCBhY2NlcHRcbiAgICAgICAgICAgIC8vIHRoZSBzdGFuZGFyZCBgeyB0ZXh0LCB2YWx1ZSB9W11gIHNoYXBlIGF1dGhvcmVkIG9uIGBEeW5hbWljRmllbGRDb25maWcub3B0aW9uc2Ag4oCUXG4gICAgICAgICAgICAvLyB3aXRob3V0IHRoaXMsIGV2ZXJ5IGNvbnN1bWVyIGhhZCB0byBkdXBsaWNhdGUgaXRzIG9wdGlvbiBsaXN0IHZpYSBhIGNvbXBvbmVudC1zcGVjaWZpY1xuICAgICAgICAgICAgLy8gZXh0cmEgaW5wdXQganVzdCB0byBwb3B1bGF0ZSB0aGUgZmllbGQuXG4gICAgICAgICAgICB0aGlzLnRyeVNldElucHV0KCdzdWdnZXN0aW9ucycsIHRoaXMuZmllbGQub3B0aW9ucyk7XG4gICAgICAgICAgICBpZiAoJ3N1Z2dlc3Rpb25MYWJlbCcgaW4gaW5zdGFuY2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRyeVNldElucHV0KCdzdWdnZXN0aW9uTGFiZWwnLCAndGV4dCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCdzdWdnZXN0aW9uVmFsdWUnIGluIGluc3RhbmNlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50cnlTZXRJbnB1dCgnc3VnZ2VzdGlvblZhbHVlJywgJ3ZhbHVlJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBDb21wb25lbnQgaGFzIG5vIGBvcHRpb25zYC9gc3VnZ2VzdGlvbnNgLWxpa2UgaW5wdXQgZGVjbGFyZWQg4oCUIG5vdGhpbmcgdG8gbWFwLlxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gUGFzcyBtaW4vbWF4IGZvciBudW1iZXIvZGF0ZSBmaWVsZHNcbiAgICBwcml2YXRlIG1hcFJhbmdlKGluc3RhbmNlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5maWVsZC5taW4gIT09IHVuZGVmaW5lZCAmJiAnbWluJyBpbiBpbnN0YW5jZSkge1xuICAgICAgICAgICAgdGhpcy50cnlTZXRJbnB1dCgnbWluJywgdGhpcy5maWVsZC5taW4pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmZpZWxkLm1heCAhPT0gdW5kZWZpbmVkICYmICdtYXgnIGluIGluc3RhbmNlKSB7XG4gICAgICAgICAgICB0aGlzLnRyeVNldElucHV0KCdtYXgnLCB0aGlzLmZpZWxkLm1heCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBQYXNzIGFueSBleHRyYSBjb25maWcgcHJvcGVydGllcyB0aGF0IG1hdGNoIGNvbXBvbmVudCBpbnB1dHNcbiAgICBwcml2YXRlIG1hcEV4dHJhSW5wdXRzKGluc3RhbmNlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHZvaWQge1xuICAgICAgICBjb25zdCByZXNlcnZlZEtleXMgPSBuZXcgU2V0KFsndHlwZScsICduYW1lJywgJ2xhYmVsJywgJ3BsYWNlaG9sZGVyJywgJ3JlcXVpcmVkJywgJ2Rpc2FibGVkJywgJ2hpZGRlbicsICd3aWR0aCcsICdncmlkQ29sdW1uJywgJ29wdGlvbnMnLCAnbWluJywgJ21heCcsICdtYXhsZW5ndGgnXSk7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLmZpZWxkKSkge1xuICAgICAgICAgICAgaWYgKCFyZXNlcnZlZEtleXMuaGFzKGtleSkgJiYga2V5IGluIGluc3RhbmNlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50cnlTZXRJbnB1dChrZXksIHZhbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHRyeVNldElucHV0KGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IHZvaWQge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5jb21wb25lbnRSZWY/LnNldElucHV0KGtleSwgdmFsdWUpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIC8vIFByb3BlcnR5IGV4aXN0cyBvbiB0aGUgaW5zdGFuY2UgYnV0IGlzbid0IGEgZGVjbGFyZWQgQElucHV0KCkg4oCUIHNraXAgaXQuXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZUZvcm1Db250cm9sKCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuY29tcG9uZW50UmVmIHx8ICF0aGlzLmZvcm1Hcm91cCB8fCAhdGhpcy5maWVsZD8ubmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY29udHJvbCA9IHRoaXMuZm9ybUdyb3VwLmdldCh0aGlzLmZpZWxkLm5hbWUpO1xuICAgICAgICBpZiAoIWNvbnRyb2wpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGluc3RhbmNlID0gdGhpcy5jb21wb25lbnRSZWYuaW5zdGFuY2UgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbiAgICAgICAgdGhpcy53cml0ZVZhbHVlVG9JbnN0YW5jZShpbnN0YW5jZSwgY29udHJvbC52YWx1ZSk7XG4gICAgICAgIHRoaXMuYmluZEluc3RhbmNlQ2FsbGJhY2tzVG9Db250cm9sKGluc3RhbmNlLCBjb250cm9sKTtcblxuICAgICAgICAvLyBTdWJzY3JpYmUgdG8gZm9ybSBjb250cm9sIHZhbHVlIGNoYW5nZXMgdG8gcHVzaCBiYWNrIHRvIENWQVxuICAgICAgICBjb250cm9sLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKHZhbHVlOiB1bmtub3duKSA9PiB7XG4gICAgICAgICAgICB0aGlzLndyaXRlVmFsdWVUb0luc3RhbmNlKGluc3RhbmNlLCB2YWx1ZSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIElmIHRoZSBjb21wb25lbnQgaGFzIHdyaXRlVmFsdWUgKENWQSksIHB1c2ggdGhlIHZhbHVlIGludG8gaXRcbiAgICBwcml2YXRlIHdyaXRlVmFsdWVUb0luc3RhbmNlKGluc3RhbmNlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgdmFsdWU6IHVua25vd24pOiB2b2lkIHtcbiAgICAgICAgaWYgKCd3cml0ZVZhbHVlJyBpbiBpbnN0YW5jZSAmJiB0eXBlb2YgaW5zdGFuY2VbJ3dyaXRlVmFsdWUnXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgKGluc3RhbmNlWyd3cml0ZVZhbHVlJ10gYXMgKHY6IHVua25vd24pID0+IHZvaWQpKHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYmluZEluc3RhbmNlQ2FsbGJhY2tzVG9Db250cm9sKGluc3RhbmNlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogdm9pZCB7XG4gICAgICAgIGlmICgncmVnaXN0ZXJPbkNoYW5nZScgaW4gaW5zdGFuY2UgJiYgdHlwZW9mIGluc3RhbmNlWydyZWdpc3Rlck9uQ2hhbmdlJ10gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIChpbnN0YW5jZVsncmVnaXN0ZXJPbkNoYW5nZSddIGFzIChmbjogKHY6IHVua25vd24pID0+IHZvaWQpID0+IHZvaWQpKCh2YWx1ZTogdW5rbm93bikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnRyb2wuc2V0VmFsdWUodmFsdWUsIHsgZW1pdEV2ZW50OiB0cnVlIH0pO1xuICAgICAgICAgICAgICAgIGNvbnRyb2wubWFya0FzRGlydHkoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICgncmVnaXN0ZXJPblRvdWNoZWQnIGluIGluc3RhbmNlICYmIHR5cGVvZiBpbnN0YW5jZVsncmVnaXN0ZXJPblRvdWNoZWQnXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgKGluc3RhbmNlWydyZWdpc3Rlck9uVG91Y2hlZCddIGFzIChmbjogKCkgPT4gdm9pZCkgPT4gdm9pZCkoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnRyb2wubWFya0FzVG91Y2hlZCgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iXX0=
@@ -0,0 +1,60 @@
1
+ import { CommonModule } from '@angular/common';
2
+ import { Component, ChangeDetectionStrategy, Input, ViewEncapsulation } from '@angular/core';
3
+ import { ReactiveFormsModule } from '@angular/forms';
4
+ import { DynamicFormFieldDirective } from './dynamic-form-field.directive';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "@angular/common";
7
+ import * as i2 from "@angular/forms";
8
+ export class DynamicFormComponent {
9
+ form;
10
+ fields = [];
11
+ isStructure(item) {
12
+ return item.type === 'row' || item.type === 'grid';
13
+ }
14
+ isField(item) {
15
+ return !this.isStructure(item);
16
+ }
17
+ isFieldVisible(field) {
18
+ if (field.hidden === undefined) {
19
+ return true;
20
+ }
21
+ return typeof field.hidden === 'function' ? !field.hidden() : !field.hidden;
22
+ }
23
+ getGridStyle(structure) {
24
+ if (structure.type === 'grid') {
25
+ return {
26
+ display: 'grid',
27
+ 'grid-template-columns': `repeat(${structure.columns ?? 2}, 1fr)`,
28
+ gap: structure.gap ?? '1rem'
29
+ };
30
+ }
31
+ return {};
32
+ }
33
+ getFieldStyle(field) {
34
+ const style = {};
35
+ if (field.gridColumn) {
36
+ style['grid-column'] = field.gridColumn;
37
+ }
38
+ return style;
39
+ }
40
+ // Tracks by the field's own `name` (a `DynamicStructureConfig` has no `name`, so it falls
41
+ // back to its position). Consumers commonly rebuild `fields` with `.map(f => ({ ...f, ... }))`
42
+ // to toggle a shared property (disabled/required/etc.) across every field — tracking by
43
+ // object identity (`track item`) would treat every one of those as a brand new item and
44
+ // destroy + recreate the whole rendered field list on every such update.
45
+ trackItem(index, item) {
46
+ return this.isField(item) ? item.name : `structure-${index}`;
47
+ }
48
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DynamicFormComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
49
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: DynamicFormComponent, isStandalone: true, selector: "sdc-dynamic-form", inputs: { form: "form", fields: "fields" }, ngImport: i0, template: "<div class=\"sdc-dynamic-form\">\n @for (item of fields; track trackItem($index, item)) {\n @if (isStructure(item)) {\n <div class=\"sdc-dynamic-form__structure\" [ngStyle]=\"getGridStyle(item)\">\n @for (child of item.fields; track trackItem($index, child)) {\n @if (isField(child) && isFieldVisible(child)) {\n <div class=\"sdc-dynamic-form__field\" [ngStyle]=\"getFieldStyle(child)\">\n <ng-container [sdcDynamicFormField]=\"child\" [formGroup]=\"form\"></ng-container>\n </div>\n } @else if (isStructure(child)) {\n <!-- Nested structure -->\n <div class=\"sdc-dynamic-form__structure\" [ngStyle]=\"getGridStyle(child)\">\n @for (nested of child.fields; track trackItem($index, nested)) {\n @if (isField(nested) && isFieldVisible(nested)) {\n <div class=\"sdc-dynamic-form__field\" [ngStyle]=\"getFieldStyle(nested)\">\n <ng-container [sdcDynamicFormField]=\"nested\" [formGroup]=\"form\"></ng-container>\n </div>\n }\n }\n </div>\n }\n }\n </div>\n } @else if (isFieldVisible(item)) {\n <div class=\"sdc-dynamic-form__field\" [ngStyle]=\"getFieldStyle(item)\">\n <ng-container [sdcDynamicFormField]=\"item\" [formGroup]=\"form\"></ng-container>\n </div>\n }\n }\n</div>\n", styles: [":host{display:block}.sdc-dynamic-form{display:flex;flex-direction:column;gap:var(--sdc-dynamic-form-gap, 1rem)}.sdc-dynamic-form__structure{display:flex;flex-wrap:wrap;gap:var(--sdc-dynamic-form-structure-gap, 1rem)}.sdc-dynamic-form__field{min-width:0}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: DynamicFormFieldDirective, selector: "[sdcDynamicFormField]", inputs: ["sdcDynamicFormField", "formGroup"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
50
+ }
51
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DynamicFormComponent, decorators: [{
52
+ type: Component,
53
+ args: [{ selector: 'sdc-dynamic-form', standalone: true, imports: [CommonModule, ReactiveFormsModule, DynamicFormFieldDirective], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.Emulated, template: "<div class=\"sdc-dynamic-form\">\n @for (item of fields; track trackItem($index, item)) {\n @if (isStructure(item)) {\n <div class=\"sdc-dynamic-form__structure\" [ngStyle]=\"getGridStyle(item)\">\n @for (child of item.fields; track trackItem($index, child)) {\n @if (isField(child) && isFieldVisible(child)) {\n <div class=\"sdc-dynamic-form__field\" [ngStyle]=\"getFieldStyle(child)\">\n <ng-container [sdcDynamicFormField]=\"child\" [formGroup]=\"form\"></ng-container>\n </div>\n } @else if (isStructure(child)) {\n <!-- Nested structure -->\n <div class=\"sdc-dynamic-form__structure\" [ngStyle]=\"getGridStyle(child)\">\n @for (nested of child.fields; track trackItem($index, nested)) {\n @if (isField(nested) && isFieldVisible(nested)) {\n <div class=\"sdc-dynamic-form__field\" [ngStyle]=\"getFieldStyle(nested)\">\n <ng-container [sdcDynamicFormField]=\"nested\" [formGroup]=\"form\"></ng-container>\n </div>\n }\n }\n </div>\n }\n }\n </div>\n } @else if (isFieldVisible(item)) {\n <div class=\"sdc-dynamic-form__field\" [ngStyle]=\"getFieldStyle(item)\">\n <ng-container [sdcDynamicFormField]=\"item\" [formGroup]=\"form\"></ng-container>\n </div>\n }\n }\n</div>\n", styles: [":host{display:block}.sdc-dynamic-form{display:flex;flex-direction:column;gap:var(--sdc-dynamic-form-gap, 1rem)}.sdc-dynamic-form__structure{display:flex;flex-wrap:wrap;gap:var(--sdc-dynamic-form-structure-gap, 1rem)}.sdc-dynamic-form__field{min-width:0}\n"] }]
54
+ }], propDecorators: { form: [{
55
+ type: Input,
56
+ args: [{ required: true }]
57
+ }], fields: [{
58
+ type: Input
59
+ }] } });
60
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy1mb3JtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYi9zcmMvZmVhdHVyZXMvZHluYW1pYy1mb3JtL2R5bmFtaWMtZm9ybS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9saWIvc3JjL2ZlYXR1cmVzL2R5bmFtaWMtZm9ybS9keW5hbWljLWZvcm0uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxTQUFTLEVBQUUsdUJBQXVCLEVBQUUsS0FBSyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdGLE9BQU8sRUFBYSxtQkFBbUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRWhFLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDOzs7O0FBWTNFLE1BQU0sT0FBTyxvQkFBb0I7SUFDRixJQUFJLENBQWE7SUFDbkMsTUFBTSxHQUFvRCxFQUFFLENBQUM7SUFFdEUsV0FBVyxDQUFDLElBQWlEO1FBQ3pELE9BQU8sSUFBSSxDQUFDLElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxNQUFNLENBQUM7SUFDdkQsQ0FBQztJQUVELE9BQU8sQ0FBQyxJQUFpRDtRQUNyRCxPQUFPLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRUQsY0FBYyxDQUFDLEtBQXlCO1FBQ3BDLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUM3QixPQUFPLElBQUksQ0FBQztRQUNoQixDQUFDO1FBQ0QsT0FBTyxPQUFPLEtBQUssQ0FBQyxNQUFNLEtBQUssVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDO0lBQ2hGLENBQUM7SUFFRCxZQUFZLENBQUMsU0FBaUM7UUFDMUMsSUFBSSxTQUFTLENBQUMsSUFBSSxLQUFLLE1BQU0sRUFBRSxDQUFDO1lBQzVCLE9BQU87Z0JBQ0gsT0FBTyxFQUFFLE1BQU07Z0JBQ2YsdUJBQXVCLEVBQUUsVUFBVSxTQUFTLENBQUMsT0FBTyxJQUFJLENBQUMsUUFBUTtnQkFDakUsR0FBRyxFQUFFLFNBQVMsQ0FBQyxHQUFHLElBQUksTUFBTTthQUMvQixDQUFDO1FBQ04sQ0FBQztRQUNELE9BQU8sRUFBRSxDQUFDO0lBQ2QsQ0FBQztJQUVELGFBQWEsQ0FBQyxLQUF5QjtRQUNuQyxNQUFNLEtBQUssR0FBMkIsRUFBRSxDQUFDO1FBQ3pDLElBQUksS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ25CLEtBQUssQ0FBQyxhQUFhLENBQUMsR0FBRyxLQUFLLENBQUMsVUFBVSxDQUFDO1FBQzVDLENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0lBRUQsMEZBQTBGO0lBQzFGLCtGQUErRjtJQUMvRix3RkFBd0Y7SUFDeEYsd0ZBQXdGO0lBQ3hGLHlFQUF5RTtJQUN6RSxTQUFTLENBQUMsS0FBYSxFQUFFLElBQWlEO1FBQ3RFLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsYUFBYSxLQUFLLEVBQUUsQ0FBQztJQUNqRSxDQUFDO3dHQTdDUSxvQkFBb0I7NEZBQXBCLG9CQUFvQix3SENoQmpDLDA1Q0E4QkEsd1REcEJjLFlBQVksbUhBQUUsbUJBQW1CLDRVQUFFLHlCQUF5Qjs7NEZBTTdELG9CQUFvQjtrQkFUaEMsU0FBUzsrQkFDSSxrQkFBa0IsY0FDaEIsSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLG1CQUFtQixFQUFFLHlCQUF5QixDQUFDLG1CQUd0RCx1QkFBdUIsQ0FBQyxNQUFNLGlCQUNoQyxpQkFBaUIsQ0FBQyxRQUFROzhCQUdkLElBQUk7c0JBQTlCLEtBQUs7dUJBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFO2dCQUNoQixNQUFNO3NCQUFkLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgSW5wdXQsIFZpZXdFbmNhcHN1bGF0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtR3JvdXAsIFJlYWN0aXZlRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbmltcG9ydCB7IER5bmFtaWNGb3JtRmllbGREaXJlY3RpdmUgfSBmcm9tICcuL2R5bmFtaWMtZm9ybS1maWVsZC5kaXJlY3RpdmUnO1xuaW1wb3J0IHR5cGUgeyBEeW5hbWljRmllbGRDb25maWcsIER5bmFtaWNTdHJ1Y3R1cmVDb25maWcgfSBmcm9tICcuLi8uLi9jb3JlL3R5cGVzL2R5bmFtaWMtZm9ybS50eXBlJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdzZGMtZHluYW1pYy1mb3JtJyxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIFJlYWN0aXZlRm9ybXNNb2R1bGUsIER5bmFtaWNGb3JtRmllbGREaXJlY3RpdmVdLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9keW5hbWljLWZvcm0uY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsOiAnLi9keW5hbWljLWZvcm0uY29tcG9uZW50LnNjc3MnLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICAgIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLkVtdWxhdGVkXG59KVxuZXhwb3J0IGNsYXNzIER5bmFtaWNGb3JtQ29tcG9uZW50IHtcbiAgICBASW5wdXQoeyByZXF1aXJlZDogdHJ1ZSB9KSBmb3JtITogRm9ybUdyb3VwO1xuICAgIEBJbnB1dCgpIGZpZWxkczogKER5bmFtaWNGaWVsZENvbmZpZyB8IER5bmFtaWNTdHJ1Y3R1cmVDb25maWcpW10gPSBbXTtcblxuICAgIGlzU3RydWN0dXJlKGl0ZW06IER5bmFtaWNGaWVsZENvbmZpZyB8IER5bmFtaWNTdHJ1Y3R1cmVDb25maWcpOiBpdGVtIGlzIER5bmFtaWNTdHJ1Y3R1cmVDb25maWcge1xuICAgICAgICByZXR1cm4gaXRlbS50eXBlID09PSAncm93JyB8fCBpdGVtLnR5cGUgPT09ICdncmlkJztcbiAgICB9XG5cbiAgICBpc0ZpZWxkKGl0ZW06IER5bmFtaWNGaWVsZENvbmZpZyB8IER5bmFtaWNTdHJ1Y3R1cmVDb25maWcpOiBpdGVtIGlzIER5bmFtaWNGaWVsZENvbmZpZyB7XG4gICAgICAgIHJldHVybiAhdGhpcy5pc1N0cnVjdHVyZShpdGVtKTtcbiAgICB9XG5cbiAgICBpc0ZpZWxkVmlzaWJsZShmaWVsZDogRHluYW1pY0ZpZWxkQ29uZmlnKTogYm9vbGVhbiB7XG4gICAgICAgIGlmIChmaWVsZC5oaWRkZW4gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHR5cGVvZiBmaWVsZC5oaWRkZW4gPT09ICdmdW5jdGlvbicgPyAhZmllbGQuaGlkZGVuKCkgOiAhZmllbGQuaGlkZGVuO1xuICAgIH1cblxuICAgIGdldEdyaWRTdHlsZShzdHJ1Y3R1cmU6IER5bmFtaWNTdHJ1Y3R1cmVDb25maWcpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgICAgICAgaWYgKHN0cnVjdHVyZS50eXBlID09PSAnZ3JpZCcpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZGlzcGxheTogJ2dyaWQnLFxuICAgICAgICAgICAgICAgICdncmlkLXRlbXBsYXRlLWNvbHVtbnMnOiBgcmVwZWF0KCR7c3RydWN0dXJlLmNvbHVtbnMgPz8gMn0sIDFmcilgLFxuICAgICAgICAgICAgICAgIGdhcDogc3RydWN0dXJlLmdhcCA/PyAnMXJlbSdcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHt9O1xuICAgIH1cblxuICAgIGdldEZpZWxkU3R5bGUoZmllbGQ6IER5bmFtaWNGaWVsZENvbmZpZyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICAgICAgICBjb25zdCBzdHlsZTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICAgICAgICBpZiAoZmllbGQuZ3JpZENvbHVtbikge1xuICAgICAgICAgICAgc3R5bGVbJ2dyaWQtY29sdW1uJ10gPSBmaWVsZC5ncmlkQ29sdW1uO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdHlsZTtcbiAgICB9XG5cbiAgICAvLyBUcmFja3MgYnkgdGhlIGZpZWxkJ3Mgb3duIGBuYW1lYCAoYSBgRHluYW1pY1N0cnVjdHVyZUNvbmZpZ2AgaGFzIG5vIGBuYW1lYCwgc28gaXQgZmFsbHNcbiAgICAvLyBiYWNrIHRvIGl0cyBwb3NpdGlvbikuIENvbnN1bWVycyBjb21tb25seSByZWJ1aWxkIGBmaWVsZHNgIHdpdGggYC5tYXAoZiA9PiAoeyAuLi5mLCAuLi4gfSkpYFxuICAgIC8vIHRvIHRvZ2dsZSBhIHNoYXJlZCBwcm9wZXJ0eSAoZGlzYWJsZWQvcmVxdWlyZWQvZXRjLikgYWNyb3NzIGV2ZXJ5IGZpZWxkIOKAlCB0cmFja2luZyBieVxuICAgIC8vIG9iamVjdCBpZGVudGl0eSAoYHRyYWNrIGl0ZW1gKSB3b3VsZCB0cmVhdCBldmVyeSBvbmUgb2YgdGhvc2UgYXMgYSBicmFuZCBuZXcgaXRlbSBhbmRcbiAgICAvLyBkZXN0cm95ICsgcmVjcmVhdGUgdGhlIHdob2xlIHJlbmRlcmVkIGZpZWxkIGxpc3Qgb24gZXZlcnkgc3VjaCB1cGRhdGUuXG4gICAgdHJhY2tJdGVtKGluZGV4OiBudW1iZXIsIGl0ZW06IER5bmFtaWNGaWVsZENvbmZpZyB8IER5bmFtaWNTdHJ1Y3R1cmVDb25maWcpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5pc0ZpZWxkKGl0ZW0pID8gaXRlbS5uYW1lIDogYHN0cnVjdHVyZS0ke2luZGV4fWA7XG4gICAgfVxufVxuIiwiPGRpdiBjbGFzcz1cInNkYy1keW5hbWljLWZvcm1cIj5cbiAgQGZvciAoaXRlbSBvZiBmaWVsZHM7IHRyYWNrIHRyYWNrSXRlbSgkaW5kZXgsIGl0ZW0pKSB7XG4gICAgQGlmIChpc1N0cnVjdHVyZShpdGVtKSkge1xuICAgICAgPGRpdiBjbGFzcz1cInNkYy1keW5hbWljLWZvcm1fX3N0cnVjdHVyZVwiIFtuZ1N0eWxlXT1cImdldEdyaWRTdHlsZShpdGVtKVwiPlxuICAgICAgICBAZm9yIChjaGlsZCBvZiBpdGVtLmZpZWxkczsgdHJhY2sgdHJhY2tJdGVtKCRpbmRleCwgY2hpbGQpKSB7XG4gICAgICAgICAgQGlmIChpc0ZpZWxkKGNoaWxkKSAmJiBpc0ZpZWxkVmlzaWJsZShjaGlsZCkpIHtcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZGMtZHluYW1pYy1mb3JtX19maWVsZFwiIFtuZ1N0eWxlXT1cImdldEZpZWxkU3R5bGUoY2hpbGQpXCI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW3NkY0R5bmFtaWNGb3JtRmllbGRdPVwiY2hpbGRcIiBbZm9ybUdyb3VwXT1cImZvcm1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH0gQGVsc2UgaWYgKGlzU3RydWN0dXJlKGNoaWxkKSkge1xuICAgICAgICAgICAgPCEtLSBOZXN0ZWQgc3RydWN0dXJlIC0tPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNkYy1keW5hbWljLWZvcm1fX3N0cnVjdHVyZVwiIFtuZ1N0eWxlXT1cImdldEdyaWRTdHlsZShjaGlsZClcIj5cbiAgICAgICAgICAgICAgQGZvciAobmVzdGVkIG9mIGNoaWxkLmZpZWxkczsgdHJhY2sgdHJhY2tJdGVtKCRpbmRleCwgbmVzdGVkKSkge1xuICAgICAgICAgICAgICAgIEBpZiAoaXNGaWVsZChuZXN0ZWQpICYmIGlzRmllbGRWaXNpYmxlKG5lc3RlZCkpIHtcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZGMtZHluYW1pYy1mb3JtX19maWVsZFwiIFtuZ1N0eWxlXT1cImdldEZpZWxkU3R5bGUobmVzdGVkKVwiPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtzZGNEeW5hbWljRm9ybUZpZWxkXT1cIm5lc3RlZFwiIFtmb3JtR3JvdXBdPVwiZm9ybVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuICAgIH0gQGVsc2UgaWYgKGlzRmllbGRWaXNpYmxlKGl0ZW0pKSB7XG4gICAgICA8ZGl2IGNsYXNzPVwic2RjLWR5bmFtaWMtZm9ybV9fZmllbGRcIiBbbmdTdHlsZV09XCJnZXRGaWVsZFN0eWxlKGl0ZW0pXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgW3NkY0R5bmFtaWNGb3JtRmllbGRdPVwiaXRlbVwiIFtmb3JtR3JvdXBdPVwiZm9ybVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgPC9kaXY+XG4gICAgfVxuICB9XG48L2Rpdj5cbiJdfQ==
@@ -0,0 +1,13 @@
1
+ export class DynamicFormRegistry {
2
+ static fields = new Map();
3
+ static registerField(type, component) {
4
+ this.fields.set(type, component);
5
+ }
6
+ static resolveField(type) {
7
+ return this.fields.get(type);
8
+ }
9
+ static registerMany(mappings) {
10
+ mappings.forEach(({ type, component }) => this.registerField(type, component));
11
+ }
12
+ }
13
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy1mb3JtLnJlZ2lzdHJ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGliL3NyYy9mZWF0dXJlcy9keW5hbWljLWZvcm0vZHluYW1pYy1mb3JtLnJlZ2lzdHJ5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUdBLE1BQU0sT0FBTyxtQkFBbUI7SUFDcEIsTUFBTSxDQUFVLE1BQU0sR0FBRyxJQUFJLEdBQUcsRUFBeUIsQ0FBQztJQUVsRSxNQUFNLENBQUMsYUFBYSxDQUFDLElBQXNCLEVBQUUsU0FBd0I7UUFDakUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFRCxNQUFNLENBQUMsWUFBWSxDQUFDLElBQVk7UUFDNUIsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRUQsTUFBTSxDQUFDLFlBQVksQ0FBQyxRQUFxRTtRQUNyRixRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUM7SUFDbkYsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFR5cGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB0eXBlIHsgRHluYW1pY0ZpZWxkVHlwZSB9IGZyb20gJy4uLy4uL2NvcmUvdHlwZXMvZHluYW1pYy1mb3JtLnR5cGUnO1xuXG5leHBvcnQgY2xhc3MgRHluYW1pY0Zvcm1SZWdpc3RyeSB7XG4gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgZmllbGRzID0gbmV3IE1hcDxzdHJpbmcsIFR5cGU8dW5rbm93bj4+KCk7XG5cbiAgICBzdGF0aWMgcmVnaXN0ZXJGaWVsZCh0eXBlOiBEeW5hbWljRmllbGRUeXBlLCBjb21wb25lbnQ6IFR5cGU8dW5rbm93bj4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5maWVsZHMuc2V0KHR5cGUsIGNvbXBvbmVudCk7XG4gICAgfVxuXG4gICAgc3RhdGljIHJlc29sdmVGaWVsZCh0eXBlOiBzdHJpbmcpOiBUeXBlPHVua25vd24+IHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmllbGRzLmdldCh0eXBlKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgcmVnaXN0ZXJNYW55KG1hcHBpbmdzOiBBcnJheTx7IHR5cGU6IER5bmFtaWNGaWVsZFR5cGU7IGNvbXBvbmVudDogVHlwZTx1bmtub3duPiB9Pik6IHZvaWQge1xuICAgICAgICBtYXBwaW5ncy5mb3JFYWNoKCh7IHR5cGUsIGNvbXBvbmVudCB9KSA9PiB0aGlzLnJlZ2lzdGVyRmllbGQodHlwZSwgY29tcG9uZW50KSk7XG4gICAgfVxufVxuIl19
@@ -0,0 +1,31 @@
1
+ import { Directive } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ /**
4
+ * Structural directive used to project a custom editor inside `sdc-editable-overlay`:
5
+ *
6
+ * ```html
7
+ * <sdc-editable-overlay [formControl]="control">
8
+ * <ng-template sdcEditableOverlayEditor let-value let-commit="commit">
9
+ * <sdc-textarea [value]="value" (valueChange)="commit($event)"></sdc-textarea>
10
+ * </ng-template>
11
+ * </sdc-editable-overlay>
12
+ * ```
13
+ *
14
+ * See `EditableOverlayEditorContext` for the full shape available to the template.
15
+ */
16
+ export class EditableOverlayEditorDirective {
17
+ template;
18
+ constructor(template) {
19
+ this.template = template;
20
+ }
21
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: EditableOverlayEditorDirective, deps: [{ token: i0.TemplateRef }], target: i0.ɵɵFactoryTarget.Directive });
22
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.14", type: EditableOverlayEditorDirective, isStandalone: true, selector: "ng-template[sdcEditableOverlayEditor]", ngImport: i0 });
23
+ }
24
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: EditableOverlayEditorDirective, decorators: [{
25
+ type: Directive,
26
+ args: [{
27
+ selector: 'ng-template[sdcEditableOverlayEditor]',
28
+ standalone: true
29
+ }]
30
+ }], ctorParameters: () => [{ type: i0.TemplateRef }] });
31
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRpdGFibGUtb3ZlcmxheS1lZGl0b3IuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGliL3NyYy9mZWF0dXJlcy9lZGl0YWJsZS1vdmVybGF5L2VkaXRhYmxlLW92ZXJsYXktZWRpdG9yLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFlLE1BQU0sZUFBZSxDQUFDOztBQUl2RDs7Ozs7Ozs7Ozs7O0dBWUc7QUFLSCxNQUFNLE9BQU8sOEJBQThCO0lBQ2I7SUFBNUIsWUFBNEIsUUFBc0Q7UUFBdEQsYUFBUSxHQUFSLFFBQVEsQ0FBOEM7SUFBRyxDQUFDO3dHQUQzRSw4QkFBOEI7NEZBQTlCLDhCQUE4Qjs7NEZBQTlCLDhCQUE4QjtrQkFKMUMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsdUNBQXVDO29CQUNqRCxVQUFVLEVBQUUsSUFBSTtpQkFDakIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaXJlY3RpdmUsIFRlbXBsYXRlUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB0eXBlIHsgRWRpdGFibGVPdmVybGF5RWRpdG9yQ29udGV4dCB9IGZyb20gJy4uLy4uL2NvcmUvdHlwZXMvZWRpdGFibGUtb3ZlcmxheS50eXBlJztcblxuLyoqXG4gKiBTdHJ1Y3R1cmFsIGRpcmVjdGl2ZSB1c2VkIHRvIHByb2plY3QgYSBjdXN0b20gZWRpdG9yIGluc2lkZSBgc2RjLWVkaXRhYmxlLW92ZXJsYXlgOlxuICpcbiAqIGBgYGh0bWxcbiAqIDxzZGMtZWRpdGFibGUtb3ZlcmxheSBbZm9ybUNvbnRyb2xdPVwiY29udHJvbFwiPlxuICogICA8bmctdGVtcGxhdGUgc2RjRWRpdGFibGVPdmVybGF5RWRpdG9yIGxldC12YWx1ZSBsZXQtY29tbWl0PVwiY29tbWl0XCI+XG4gKiAgICAgPHNkYy10ZXh0YXJlYSBbdmFsdWVdPVwidmFsdWVcIiAodmFsdWVDaGFuZ2UpPVwiY29tbWl0KCRldmVudClcIj48L3NkYy10ZXh0YXJlYT5cbiAqICAgPC9uZy10ZW1wbGF0ZT5cbiAqIDwvc2RjLWVkaXRhYmxlLW92ZXJsYXk+XG4gKiBgYGBcbiAqXG4gKiBTZWUgYEVkaXRhYmxlT3ZlcmxheUVkaXRvckNvbnRleHRgIGZvciB0aGUgZnVsbCBzaGFwZSBhdmFpbGFibGUgdG8gdGhlIHRlbXBsYXRlLlxuICovXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICduZy10ZW1wbGF0ZVtzZGNFZGl0YWJsZU92ZXJsYXlFZGl0b3JdJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZVxufSlcbmV4cG9ydCBjbGFzcyBFZGl0YWJsZU92ZXJsYXlFZGl0b3JEaXJlY3RpdmU8VCA9IHVua25vd24+IHtcbiAgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IHRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxFZGl0YWJsZU92ZXJsYXlFZGl0b3JDb250ZXh0PFQ+Pikge31cbn1cbiJdfQ==