@aquera/ngx-smart-table 0.0.2-alpha

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 (169) hide show
  1. package/README.md +152 -0
  2. package/aquera-ngx-smart-table.d.ts +5 -0
  3. package/esm2020/aquera-ngx-smart-table.mjs +5 -0
  4. package/esm2020/lib/builder/components/builder-preview/builder-preview.component.mjs +63 -0
  5. package/esm2020/lib/builder/components/builder-toolbar/builder-toolbar.component.mjs +115 -0
  6. package/esm2020/lib/builder/components/column-editor/column-editor.component.mjs +206 -0
  7. package/esm2020/lib/builder/components/column-list/column-list.component.mjs +125 -0
  8. package/esm2020/lib/builder/components/definition-builder/definition-builder.component.mjs +105 -0
  9. package/esm2020/lib/builder/components/table-config-editor/table-config-editor.component.mjs +132 -0
  10. package/esm2020/lib/builder/definition-builder.module.mjs +70 -0
  11. package/esm2020/lib/builder/models/builder-state.interface.mjs +5 -0
  12. package/esm2020/lib/builder/services/definition-builder.service.mjs +251 -0
  13. package/esm2020/lib/builder/services/definition-export.service.mjs +167 -0
  14. package/esm2020/lib/builder/services/definition-import.service.mjs +193 -0
  15. package/esm2020/lib/builder/services/sample-data-generator.service.mjs +126 -0
  16. package/esm2020/lib/builder/utils/config-validator.util.mjs +165 -0
  17. package/esm2020/lib/builder/utils/typescript-generator.util.mjs +206 -0
  18. package/esm2020/lib/editors/index.mjs +9 -0
  19. package/esm2020/lib/editors/nile-autocomplete-editor.mjs +228 -0
  20. package/esm2020/lib/editors/nile-calendar-editor.mjs +214 -0
  21. package/esm2020/lib/editors/nile-date-picker-editor.mjs +227 -0
  22. package/esm2020/lib/editors/nile-input-editor.mjs +235 -0
  23. package/esm2020/lib/editors/nile-select-editor.mjs +317 -0
  24. package/esm2020/lib/factories/column-config.factory.mjs +231 -0
  25. package/esm2020/lib/models/autosave-config.interface.mjs +8 -0
  26. package/esm2020/lib/models/base-column-config.class.mjs +253 -0
  27. package/esm2020/lib/models/cell-strategies.interface.mjs +6 -0
  28. package/esm2020/lib/models/cell-types.mjs +147 -0
  29. package/esm2020/lib/models/column-action.interface.mjs +6 -0
  30. package/esm2020/lib/models/column-config.interface.mjs +43 -0
  31. package/esm2020/lib/models/column-config.utils.mjs +101 -0
  32. package/esm2020/lib/models/row-action.interface.mjs +5 -0
  33. package/esm2020/lib/models/row-validator.interface.mjs +2 -0
  34. package/esm2020/lib/models/schema-validation.interface.mjs +2 -0
  35. package/esm2020/lib/models/sheet-action.interface.mjs +5 -0
  36. package/esm2020/lib/models/sheet-config.interface.mjs +5 -0
  37. package/esm2020/lib/models/table-config.interface.mjs +106 -0
  38. package/esm2020/lib/models/table-validator.interface.mjs +2 -0
  39. package/esm2020/lib/models/workbook-action.interface.mjs +5 -0
  40. package/esm2020/lib/models/workbook-config.interface.mjs +5 -0
  41. package/esm2020/lib/renderer/components/st-add-column-button/st-add-column-button.component.mjs +24 -0
  42. package/esm2020/lib/renderer/components/st-cell/st-cell.component.mjs +391 -0
  43. package/esm2020/lib/renderer/components/st-column-editor-modal/st-column-editor-modal.component.mjs +103 -0
  44. package/esm2020/lib/renderer/components/st-column-filter/st-column-filter.component.mjs +383 -0
  45. package/esm2020/lib/renderer/components/st-column-menu/st-column-menu.component.mjs +232 -0
  46. package/esm2020/lib/renderer/components/st-column-visibility/st-column-visibility.component.mjs +97 -0
  47. package/esm2020/lib/renderer/components/st-header/st-header.component.mjs +157 -0
  48. package/esm2020/lib/renderer/components/st-pagination/st-pagination.component.mjs +87 -0
  49. package/esm2020/lib/renderer/components/st-row-actions-dropdown/st-row-actions-dropdown.component.mjs +167 -0
  50. package/esm2020/lib/renderer/components/st-sheet/st-sheet.component.mjs +165 -0
  51. package/esm2020/lib/renderer/components/st-sheet-actions/st-sheet-actions.component.mjs +112 -0
  52. package/esm2020/lib/renderer/components/st-table/st-table.component.mjs +1246 -0
  53. package/esm2020/lib/renderer/components/st-table-actions/st-table-actions.component.mjs +171 -0
  54. package/esm2020/lib/renderer/components/st-workbook/st-workbook.component.mjs +489 -0
  55. package/esm2020/lib/renderer/directives/click-outside.directive.mjs +28 -0
  56. package/esm2020/lib/renderer/directives/st-column-resize.directive.mjs +108 -0
  57. package/esm2020/lib/renderer/directives/st-keyboard-navigation.directive.mjs +73 -0
  58. package/esm2020/lib/renderer/models/cell-state.interface.mjs +66 -0
  59. package/esm2020/lib/renderer/models/cell.class.mjs +389 -0
  60. package/esm2020/lib/renderer/models/row-validation-state.interface.mjs +7 -0
  61. package/esm2020/lib/renderer/models/sheet-state.class.mjs +90 -0
  62. package/esm2020/lib/renderer/models/sheet-state.interface.mjs +5 -0
  63. package/esm2020/lib/renderer/models/table-state.class.mjs +841 -0
  64. package/esm2020/lib/renderer/models/table-state.interface.mjs +5 -0
  65. package/esm2020/lib/renderer/models/table-types.mjs +29 -0
  66. package/esm2020/lib/renderer/models/table-validation-state.interface.mjs +7 -0
  67. package/esm2020/lib/renderer/models/workbook-state.class.mjs +174 -0
  68. package/esm2020/lib/renderer/models/workbook-state.interface.mjs +5 -0
  69. package/esm2020/lib/renderer/models/z-index.enum.mjs +55 -0
  70. package/esm2020/lib/schemas/table-config.schema.mjs +472 -0
  71. package/esm2020/lib/services/autosave.service.mjs +92 -0
  72. package/esm2020/lib/services/custom-validation-rules.util.mjs +124 -0
  73. package/esm2020/lib/services/json-schema-validator.service.mjs +216 -0
  74. package/esm2020/lib/services/row-validation.service.mjs +42 -0
  75. package/esm2020/lib/services/validation-logger.service.mjs +177 -0
  76. package/esm2020/lib/services/virtual-scroll.service.mjs +52 -0
  77. package/esm2020/lib/shared/shared-table-components.module.mjs +35 -0
  78. package/esm2020/lib/smart-table.module.mjs +124 -0
  79. package/esm2020/lib/strategies/default-editors.mjs +433 -0
  80. package/esm2020/lib/strategies/default-formatters.mjs +238 -0
  81. package/esm2020/lib/strategies/default-validators.mjs +327 -0
  82. package/esm2020/public-api.mjs +146 -0
  83. package/fesm2015/aquera-ngx-smart-table.mjs +11860 -0
  84. package/fesm2015/aquera-ngx-smart-table.mjs.map +1 -0
  85. package/fesm2020/aquera-ngx-smart-table.mjs +11897 -0
  86. package/fesm2020/aquera-ngx-smart-table.mjs.map +1 -0
  87. package/lib/builder/components/builder-preview/builder-preview.component.d.ts +31 -0
  88. package/lib/builder/components/builder-toolbar/builder-toolbar.component.d.ts +53 -0
  89. package/lib/builder/components/column-editor/column-editor.component.d.ts +69 -0
  90. package/lib/builder/components/column-list/column-list.component.d.ts +65 -0
  91. package/lib/builder/components/definition-builder/definition-builder.component.d.ts +58 -0
  92. package/lib/builder/components/table-config-editor/table-config-editor.component.d.ts +32 -0
  93. package/lib/builder/definition-builder.module.d.ts +15 -0
  94. package/lib/builder/models/builder-state.interface.d.ts +93 -0
  95. package/lib/builder/services/definition-builder.service.d.ts +80 -0
  96. package/lib/builder/services/definition-export.service.d.ts +59 -0
  97. package/lib/builder/services/definition-import.service.d.ts +31 -0
  98. package/lib/builder/services/sample-data-generator.service.d.ts +41 -0
  99. package/lib/builder/utils/config-validator.util.d.ts +32 -0
  100. package/lib/builder/utils/typescript-generator.util.d.ts +29 -0
  101. package/lib/editors/index.d.ts +8 -0
  102. package/lib/editors/nile-autocomplete-editor.d.ts +102 -0
  103. package/lib/editors/nile-calendar-editor.d.ts +89 -0
  104. package/lib/editors/nile-date-picker-editor.d.ts +95 -0
  105. package/lib/editors/nile-input-editor.d.ts +67 -0
  106. package/lib/editors/nile-select-editor.d.ts +109 -0
  107. package/lib/factories/column-config.factory.d.ts +73 -0
  108. package/lib/models/autosave-config.interface.d.ts +23 -0
  109. package/lib/models/base-column-config.class.d.ts +115 -0
  110. package/lib/models/cell-strategies.interface.d.ts +181 -0
  111. package/lib/models/cell-types.d.ts +337 -0
  112. package/lib/models/column-action.interface.d.ts +86 -0
  113. package/lib/models/column-config.interface.d.ts +272 -0
  114. package/lib/models/column-config.utils.d.ts +37 -0
  115. package/lib/models/row-action.interface.d.ts +86 -0
  116. package/lib/models/row-validator.interface.d.ts +37 -0
  117. package/lib/models/schema-validation.interface.d.ts +42 -0
  118. package/lib/models/sheet-action.interface.d.ts +59 -0
  119. package/lib/models/sheet-config.interface.d.ts +41 -0
  120. package/lib/models/table-config.interface.d.ts +245 -0
  121. package/lib/models/table-validator.interface.d.ts +40 -0
  122. package/lib/models/workbook-action.interface.d.ts +90 -0
  123. package/lib/models/workbook-config.interface.d.ts +107 -0
  124. package/lib/renderer/components/st-add-column-button/st-add-column-button.component.d.ts +9 -0
  125. package/lib/renderer/components/st-cell/st-cell.component.d.ts +69 -0
  126. package/lib/renderer/components/st-column-editor-modal/st-column-editor-modal.component.d.ts +39 -0
  127. package/lib/renderer/components/st-column-filter/st-column-filter.component.d.ts +139 -0
  128. package/lib/renderer/components/st-column-menu/st-column-menu.component.d.ts +81 -0
  129. package/lib/renderer/components/st-column-visibility/st-column-visibility.component.d.ts +44 -0
  130. package/lib/renderer/components/st-header/st-header.component.d.ts +93 -0
  131. package/lib/renderer/components/st-pagination/st-pagination.component.d.ts +42 -0
  132. package/lib/renderer/components/st-row-actions-dropdown/st-row-actions-dropdown.component.d.ts +67 -0
  133. package/lib/renderer/components/st-sheet/st-sheet.component.d.ts +98 -0
  134. package/lib/renderer/components/st-sheet-actions/st-sheet-actions.component.d.ts +58 -0
  135. package/lib/renderer/components/st-table/st-table.component.d.ts +349 -0
  136. package/lib/renderer/components/st-table-actions/st-table-actions.component.d.ts +77 -0
  137. package/lib/renderer/components/st-workbook/st-workbook.component.d.ts +235 -0
  138. package/lib/renderer/directives/click-outside.directive.d.ts +10 -0
  139. package/lib/renderer/directives/st-column-resize.directive.d.ts +44 -0
  140. package/lib/renderer/directives/st-keyboard-navigation.directive.d.ts +15 -0
  141. package/lib/renderer/models/cell-state.interface.d.ts +118 -0
  142. package/lib/renderer/models/cell.class.d.ts +174 -0
  143. package/lib/renderer/models/row-validation-state.interface.d.ts +27 -0
  144. package/lib/renderer/models/sheet-state.class.d.ts +67 -0
  145. package/lib/renderer/models/sheet-state.interface.d.ts +55 -0
  146. package/lib/renderer/models/table-state.class.d.ts +313 -0
  147. package/lib/renderer/models/table-state.interface.d.ts +18 -0
  148. package/lib/renderer/models/table-types.d.ts +228 -0
  149. package/lib/renderer/models/table-validation-state.interface.d.ts +34 -0
  150. package/lib/renderer/models/workbook-state.class.d.ts +117 -0
  151. package/lib/renderer/models/workbook-state.interface.d.ts +71 -0
  152. package/lib/renderer/models/z-index.enum.d.ts +44 -0
  153. package/lib/schemas/table-config.schema.d.ts +455 -0
  154. package/lib/services/autosave.service.d.ts +73 -0
  155. package/lib/services/custom-validation-rules.util.d.ts +12 -0
  156. package/lib/services/json-schema-validator.service.d.ts +49 -0
  157. package/lib/services/row-validation.service.d.ts +17 -0
  158. package/lib/services/validation-logger.service.d.ts +87 -0
  159. package/lib/services/virtual-scroll.service.d.ts +44 -0
  160. package/lib/shared/shared-table-components.module.d.ts +9 -0
  161. package/lib/smart-table.module.d.ts +26 -0
  162. package/lib/strategies/default-editors.d.ts +109 -0
  163. package/lib/strategies/default-formatters.d.ts +116 -0
  164. package/lib/strategies/default-validators.d.ts +113 -0
  165. package/package.json +42 -0
  166. package/public-api.d.ts +70 -0
  167. package/src/lib/builder/README.md +30 -0
  168. package/src/lib/editors/README.md +303 -0
  169. package/src/lib/renderer/components/st-column-filter/README.md +286 -0
@@ -0,0 +1,317 @@
1
+ /**
2
+ * Custom editor using NileSelect from @aquera/nile-elements
3
+ * This demonstrates how to create dropdown/select editors for ngx-smart-table
4
+ */
5
+ import { isObservable } from 'rxjs';
6
+ /**
7
+ * Custom editor that uses NileSelect component
8
+ * @template T The value type (string for single selection, string[] for multiple)
9
+ */
10
+ export class NileSelectEditor {
11
+ constructor(options) {
12
+ this.options = options;
13
+ this.eventListeners = [];
14
+ this.currentOptions = [];
15
+ // Handle Observable options
16
+ if (isObservable(options.options)) {
17
+ this.optionsSubscription = options.options.subscribe(opts => {
18
+ this.currentOptions = opts;
19
+ // If editor is already active, update the DOM
20
+ if (this.select) {
21
+ this.updateOptions();
22
+ }
23
+ });
24
+ }
25
+ else {
26
+ // Static options
27
+ this.currentOptions = options.options || [];
28
+ if (this.currentOptions.length === 0) {
29
+ console.warn('NileSelectEditor: options array is empty');
30
+ }
31
+ }
32
+ }
33
+ edit(context) {
34
+ if (!context.container) {
35
+ console.warn('NileSelectEditor requires a container element');
36
+ return;
37
+ }
38
+ // Create NileSelect custom element using document.createElement
39
+ this.select = document.createElement('nile-select');
40
+ this.select.className = 'st-cell-editor';
41
+ // Apply inline styles for proper cell fitting
42
+ this.select.style.width = '100%';
43
+ this.select.style.height = 'inherit';
44
+ this.select.style.boxSizing = 'border-box';
45
+ // Set initial value
46
+ this.setInitialValue(context.value);
47
+ // Apply all configuration options
48
+ this.applyOptions();
49
+ // Create and append options with current options
50
+ this.createAndAppendOptions(this.currentOptions);
51
+ // Set up event listeners
52
+ this.setupEventListeners(context);
53
+ // Clear container and append select
54
+ context.container.innerHTML = '';
55
+ context.container.appendChild(this.select);
56
+ // Focus after render
57
+ setTimeout(() => {
58
+ this.select?.focus();
59
+ this.select?.click();
60
+ }, 0);
61
+ }
62
+ /**
63
+ * Set the initial value for the select
64
+ */
65
+ setInitialValue(value) {
66
+ if (!this.select)
67
+ return;
68
+ if (this.options.multiple) {
69
+ // Handle multiple selection - value should be array
70
+ if (Array.isArray(value)) {
71
+ this.select.value = value;
72
+ }
73
+ else if (value) {
74
+ this.select.value = [String(value)];
75
+ }
76
+ else {
77
+ this.select.value = [];
78
+ }
79
+ }
80
+ else {
81
+ // Handle single selection
82
+ this.select.value = value ? String(value) : '';
83
+ }
84
+ }
85
+ /**
86
+ * Apply all configuration options to the NileSelect element
87
+ */
88
+ applyOptions() {
89
+ if (!this.select)
90
+ return;
91
+ // Basic options
92
+ if (this.options.placeholder) {
93
+ this.select.placeholder = this.options.placeholder;
94
+ }
95
+ if (this.options.size) {
96
+ this.select.size = this.options.size;
97
+ }
98
+ else {
99
+ this.select.size = 'small'; // Default for table cells
100
+ }
101
+ if (this.options.multiple) {
102
+ this.select.multiple = this.options.multiple;
103
+ }
104
+ // Behavior options
105
+ if (this.options.clearable) {
106
+ this.select.clearable = this.options.clearable;
107
+ }
108
+ if (this.options.disabled) {
109
+ this.select.disabled = this.options.disabled;
110
+ }
111
+ if (this.options.required) {
112
+ this.select.required = this.options.required;
113
+ }
114
+ if (this.options.searchEnabled) {
115
+ this.select.searchEnabled = this.options.searchEnabled;
116
+ }
117
+ // Visual states
118
+ if (this.options.warning) {
119
+ this.select.warning = this.options.warning;
120
+ }
121
+ if (this.options.error) {
122
+ this.select.error = this.options.error;
123
+ }
124
+ if (this.options.success) {
125
+ this.select.success = this.options.success;
126
+ }
127
+ if (this.options.errorMessage) {
128
+ this.select.errorMessage = this.options.errorMessage;
129
+ }
130
+ if (this.options.helpText) {
131
+ this.select.helpText = this.options.helpText;
132
+ }
133
+ // Advanced features
134
+ if (this.options.maxOptionsVisible !== undefined) {
135
+ this.select.maxOptionsVisible = this.options.maxOptionsVisible;
136
+ }
137
+ if (this.options.filled !== undefined) {
138
+ this.select.filled = this.options.filled;
139
+ }
140
+ if (this.options.pill) {
141
+ this.select.pill = this.options.pill;
142
+ }
143
+ if (this.options.hoist) {
144
+ this.select.hoist = this.options.hoist;
145
+ }
146
+ if (this.options.placement) {
147
+ this.select.placement = this.options.placement;
148
+ }
149
+ if (this.options.enableVirtualScroll) {
150
+ this.select.enableVirtualScroll = this.options.enableVirtualScroll;
151
+ }
152
+ if (this.options.disableLocalSearch) {
153
+ this.select.disableLocalSearch = this.options.disableLocalSearch;
154
+ }
155
+ if (this.options.portal !== undefined) {
156
+ this.select.portal = this.options.portal;
157
+ }
158
+ // Prevent width syncing issues in table cells
159
+ this.select.noWidthSync = true;
160
+ }
161
+ /**
162
+ * Update options dynamically while editor is active
163
+ */
164
+ updateOptions() {
165
+ if (!this.select)
166
+ return;
167
+ // Clear existing options
168
+ while (this.select.firstChild) {
169
+ this.select.removeChild(this.select.firstChild);
170
+ }
171
+ // Re-append with new options
172
+ this.createAndAppendOptions(this.currentOptions);
173
+ // Trigger update on the web component
174
+ if (this.select.requestUpdate) {
175
+ this.select.requestUpdate();
176
+ }
177
+ }
178
+ /**
179
+ * Create NileOption elements and append them to the select
180
+ * @param options - The options to render
181
+ */
182
+ createAndAppendOptions(options) {
183
+ if (!this.select)
184
+ return;
185
+ options.forEach(opt => {
186
+ const nileOption = document.createElement('nile-option');
187
+ // Auto-detect format: string or SelectOption object
188
+ if (typeof opt === 'string') {
189
+ nileOption.value = opt;
190
+ nileOption.setAttribute('value', opt);
191
+ nileOption.textContent = opt;
192
+ }
193
+ else {
194
+ nileOption.value = opt.value;
195
+ nileOption.setAttribute('value', opt.value);
196
+ nileOption.textContent = opt.label;
197
+ if (opt.disabled) {
198
+ nileOption.disabled = true;
199
+ nileOption.setAttribute('disabled', 'true');
200
+ }
201
+ // Handle prefix if provided (could be icon name or content)
202
+ if (opt.prefix) {
203
+ // nileOption.setAttribute('slot', 'prefix');
204
+ // nileOption.innerHTML = `<nile-icon name="${opt.prefix}"></nile-icon>`;
205
+ }
206
+ }
207
+ this.select.appendChild(nileOption);
208
+ });
209
+ }
210
+ /**
211
+ * Set up all event listeners with proper cleanup tracking
212
+ */
213
+ setupEventListeners(context) {
214
+ if (!this.select)
215
+ return;
216
+ const validateOnSave = this.options.validateOnSave !== false;
217
+ // Handle keyboard events (keydown is not replaced by custom events)
218
+ const keydownHandler = (e) => {
219
+ const keyEvent = e;
220
+ if (keyEvent.key === 'Escape') {
221
+ keyEvent.preventDefault();
222
+ keyEvent.stopPropagation();
223
+ context.onCancel();
224
+ }
225
+ };
226
+ this.select.addEventListener('keydown', keydownHandler);
227
+ this.eventListeners.push({ event: 'keydown', handler: keydownHandler });
228
+ // Use nile-change custom event as primary save trigger
229
+ const changeHandler = (e) => {
230
+ const customEvent = e;
231
+ if (validateOnSave && !this.select?.checkValidity()) {
232
+ this.select?.reportValidity();
233
+ return;
234
+ }
235
+ context.onSave(this.parseValue(customEvent.detail.value));
236
+ };
237
+ this.select.addEventListener('nile-change', changeHandler);
238
+ this.eventListeners.push({ event: 'nile-change', handler: changeHandler });
239
+ // Handle blur as secondary save trigger
240
+ const blurHandler = (e) => {
241
+ if (validateOnSave && !this.select?.checkValidity()) {
242
+ this.select?.reportValidity();
243
+ return;
244
+ }
245
+ // context.onSave(this.getCurrentValue());
246
+ };
247
+ this.select.addEventListener('nile-blur', blurHandler);
248
+ this.eventListeners.push({ event: 'nile-blur', handler: blurHandler });
249
+ // Handle clear button if enabled
250
+ if (this.options.clearable) {
251
+ const clearHandler = (e) => {
252
+ context.onSave(this.parseValue(this.options.multiple ? [] : ''));
253
+ };
254
+ this.select.addEventListener('nile-clear', clearHandler);
255
+ this.eventListeners.push({ event: 'nile-clear', handler: clearHandler });
256
+ }
257
+ // Handle search for server-side search scenarios
258
+ if (this.options.disableLocalSearch) {
259
+ const searchHandler = (e) => {
260
+ const customEvent = e;
261
+ // Emit search query through onChange for external handling
262
+ context.onChange(customEvent.detail);
263
+ };
264
+ this.select.addEventListener('nile-search', searchHandler);
265
+ this.eventListeners.push({ event: 'nile-search', handler: searchHandler });
266
+ }
267
+ }
268
+ /**
269
+ * Parse value based on selection mode
270
+ */
271
+ parseValue(value) {
272
+ if (this.options.multiple) {
273
+ // Ensure array for multiple selection
274
+ if (Array.isArray(value)) {
275
+ return value;
276
+ }
277
+ return (value ? [value] : []);
278
+ }
279
+ // Single selection - return string
280
+ if (Array.isArray(value)) {
281
+ return (value.length > 0 ? value[0] : '');
282
+ }
283
+ return value;
284
+ }
285
+ destroy() {
286
+ // Unsubscribe from options Observable
287
+ if (this.optionsSubscription) {
288
+ this.optionsSubscription.unsubscribe();
289
+ this.optionsSubscription = undefined;
290
+ }
291
+ // Remove all event listeners
292
+ if (this.select) {
293
+ this.eventListeners.forEach(({ event, handler }) => {
294
+ this.select?.removeEventListener(event, handler);
295
+ });
296
+ this.eventListeners = [];
297
+ this.select.remove();
298
+ this.select = undefined;
299
+ }
300
+ }
301
+ focus() {
302
+ this.select?.focus();
303
+ }
304
+ getCurrentValue() {
305
+ if (!this.select) {
306
+ return (this.options.multiple ? [] : '');
307
+ }
308
+ const value = this.select.value;
309
+ // Handle multiple selection
310
+ if (this.options.multiple) {
311
+ return (Array.isArray(value) ? value : [value]);
312
+ }
313
+ // Handle single selection
314
+ return (Array.isArray(value) ? (value.length > 0 ? value[0] : '') : value);
315
+ }
316
+ }
317
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmlsZS1zZWxlY3QtZWRpdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc21hcnQtdGFibGUvc3JjL2xpYi9lZGl0b3JzL25pbGUtc2VsZWN0LWVkaXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFHSCxPQUFPLEVBQTRCLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQW1GOUQ7OztHQUdHO0FBQ0gsTUFBTSxPQUFPLGdCQUFnQjtJQU0zQixZQUE2QixPQUFnQztRQUFoQyxZQUFPLEdBQVAsT0FBTyxDQUF5QjtRQUpyRCxtQkFBYyxHQUFxRCxFQUFFLENBQUM7UUFFdEUsbUJBQWMsR0FBOEIsRUFBRSxDQUFDO1FBR3JELDRCQUE0QjtRQUM1QixJQUFJLFlBQVksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDakMsSUFBSSxDQUFDLG1CQUFtQixHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUMxRCxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztnQkFDM0IsOENBQThDO2dCQUM5QyxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7b0JBQ2YsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO2lCQUN0QjtZQUNILENBQUMsQ0FBQyxDQUFDO1NBQ0o7YUFBTTtZQUNMLGlCQUFpQjtZQUNqQixJQUFJLENBQUMsY0FBYyxHQUFHLE9BQU8sQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDO1lBQzVDLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO2dCQUNwQyxPQUFPLENBQUMsSUFBSSxDQUFDLDBDQUEwQyxDQUFDLENBQUM7YUFDMUQ7U0FDRjtJQUNILENBQUM7SUFFRCxJQUFJLENBQUMsT0FBNkI7UUFDaEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUU7WUFDdEIsT0FBTyxDQUFD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QUksQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDO1NBQ3pCO0lBQ0gsQ0FBQztJQUVELEtBQUs7UUFDSCxJQUFJLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxlQUFlO1FBQ2IsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDaEIsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBaUIsQ0FBQztTQUMxRDtRQUVELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO1FBRWhDLDRCQUE0QjtRQUM1QixJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFO1lBQ3pCLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQWlCLENBQUM7U0FDakU7UUFFRCwwQkFBMEI7UUFDMUIsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBaUIsQ0FBQztJQUM3RixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEN1c3RvbSBlZGl0b3IgdXNpbmcgTmlsZVNlbGVjdCBmcm9tIEBhcXVlcmEvbmlsZS1lbGVtZW50c1xuICogVGhpcyBkZW1vbnN0cmF0ZXMgaG93IHRvIGNyZWF0ZSBkcm9wZG93bi9zZWxlY3QgZWRpdG9ycyBmb3Igbmd4LXNtYXJ0LXRhYmxlXG4gKi9cblxuaW1wb3J0IHsgQ2VsbEVkaXRvciwgQ2VsbEVkaXRvckNvbnRleHQgfSBmcm9tICcuLi9tb2RlbHMvY2VsbC1zdHJhdGVnaWVzLmludGVyZmFjZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJzY3JpcHRpb24sIGlzT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuXG4vKipcbiAqIFNlbGVjdCBvcHRpb24gY29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlbGVjdE9wdGlvbiB7XG4gIC8qKiBUaGUgb3B0aW9uJ3MgdmFsdWUgKi9cbiAgdmFsdWU6IHN0cmluZztcbiAgLyoqIERpc3BsYXkgbGFiZWwgZm9yIHRoZSBvcHRpb24gKi9cbiAgbGFiZWw6IHN0cmluZztcbiAgLyoqIFdoZXRoZXIgdGhlIG9wdGlvbiBpcyBkaXNhYmxlZCAqL1xuICBkaXNhYmxlZD86IGJvb2xlYW47XG4gIC8qKiBPcHRpb25hbCBwcmVmaXggaWNvbiBvciBjb250ZW50ICovXG4gIHByZWZpeD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBPcHRpb25zIGludGVyZmFjZSBmb3IgTmlsZVNlbGVjdEVkaXRvclxuICovXG5leHBvcnQgaW50ZXJmYWNlIE5pbGVTZWxlY3RFZGl0b3JPcHRpb25zIHtcbiAgLy8gT3B0aW9ucyBjb25maWd1cmF0aW9uIChSRVFVSVJFRClcbiAgLyoqIEFycmF5IG9mIG9wdGlvbnMgLSBzdXBwb3J0cyBzdGF0aWMgYXJyYXlzLCBPYnNlcnZhYmxlLCBvciBCZWhhdmlvclN1YmplY3QgZm9yIHJlYWN0aXZlIHVwZGF0ZXMgKi9cbiAgb3B0aW9uczogU2VsZWN0T3B0aW9uW10gfCBzdHJpbmdbXSB8IE9ic2VydmFibGU8U2VsZWN0T3B0aW9uW10gfCBzdHJpbmdbXT47XG4gIFxuICAvLyBCYXNpYyBwcm9wZXJ0aWVzXG4gIC8qKiBQbGFjZWhvbGRlciB0ZXh0IHdoZW4gbm8gc2VsZWN0aW9uIGlzIG1hZGUgKi9cbiAgcGxhY2Vob2xkZXI/OiBzdHJpbmc7XG4gIC8qKiBTaXplIG9mIHRoZSBzZWxlY3QgY29udHJvbCAqL1xuICBzaXplPzogJ3NtYWxsJyB8ICdtZWRpdW0nIHwgJ2xhcmdlJztcbiAgLyoqIEVuYWJsZSBtdWx0aXBsZSBzZWxlY3Rpb24gbW9kZSAqL1xuICBtdWx0aXBsZT86IGJvb2xlYW47XG4gIFxuICAvLyBCZWhhdmlvciBvcHRpb25zXG4gIC8qKiBBZGRzIGNsZWFyIGJ1dHRvbiB3aGVuIHZhbHVlIGlzIG5vdCBlbXB0eSAqL1xuICBjbGVhcmFibGU/OiBib29sZWFuO1xuICAvKiogRGlzYWJsZSB0aGUgc2VsZWN0IGNvbnRyb2wgKi9cbiAgZGlzYWJsZWQ/OiBib29sZWFuO1xuICAvKiogTWFrZSB0aGUgc2VsZWN0IHJlcXVpcmVkICovXG4gIHJlcXVpcmVkPzogYm9vbGVhbjtcbiAgLyoqIEVuYWJsZSBzZWFyY2ggZnVuY3Rpb25hbGl0eSAqL1xuICBzZWFyY2hFbmFibGVkPzogYm9vbGVhbjtcbiAgXG4gIC8vIFZpc3VhbCBzdGF0ZXNcbiAgLyoqIFdhcm5pbmcgc3RhdGUgc3R5bGluZyAqL1xuICB3YXJuaW5nPzogYm9vbGVhbjtcbiAgLyoqIEVycm9yIHN0YXRlIHN0eWxpbmcgKi9cbiAgZXJyb3I/OiBib29sZWFuO1xuICAvKiogU3VjY2VzcyBzdGF0ZSBzdHlsaW5nICovXG4gIHN1Y2Nlc3M/OiBib29sZWFuO1xuICAvKiogRXJyb3IgbWVzc2FnZSB0byBkaXNwbGF5ICovXG4gIGVycm9yTWVzc2FnZT86IHN0cmluZztcbiAgLyoqIEhlbHAgdGV4dCB0byBkaXNwbGF5ICovXG4gIGhlbHBUZXh0Pzogc3RyaW5nO1xuICBcbiAgLy8gQWR2YW5jZWQgZmVhdHVyZXNcbiAgLyoqIE1heGltdW0gbnVtYmVyIG9mIHNlbGVjdGVkIG9wdGlvbnMgdG8gc2hvdyBpbiBtdWx0aXBsZSBtb2RlICgwID0gbm8gbGltaXQpICovXG4gIG1heE9wdGlvbnNWaXNpYmxlPzogbnVtYmVyO1xuICAvKiogRHJhd3MgYSBmaWxsZWQgc2VsZWN0IHN0eWxlICovXG4gIGZpbGxlZD86IGJvb2xlYW47XG4gIC8qKiBQaWxsLXN0eWxlIHdpdGggcm91bmRlZCBlZGdlcyAqL1xuICBwaWxsPzogYm9vbGVhbjtcbiAgLyoqIFVzZSBmaXhlZCBwb3NpdGlvbmluZyB0byBwcmV2ZW50IGNsaXBwaW5nICovXG4gIGhvaXN0PzogYm9vbGVhbjtcbiAgLyoqIFBsYWNlbWVudCBvZiB0aGUgZHJvcGRvd24gbWVudSAqL1xuICBwbGFjZW1lbnQ/OiAndG9wJyB8ICdib3R0b20nO1xuICBcbiAgLy8gVmlydHVhbCBzY3JvbGwgZm9yIGxhcmdlIGxpc3RzXG4gIC8qKiBFbmFibGUgdmlydHVhbCBzY3JvbGxpbmcgZm9yIGJldHRlciBwZXJmb3JtYW5jZSB3aXRoIG1hbnkgb3B0aW9ucyAqL1xuICBlbmFibGVWaXJ0dWFsU2Nyb2xsPzogYm9vbGVhbjtcbiAgXG4gIC8vIFNlYXJjaCBjb25maWd1cmF0aW9uXG4gIC8qKiBEaXNhYmxlIGxvY2FsIHNlYXJjaCAodXNlIGZvciBzZXJ2ZXItc2lkZSBzZWFyY2gpICovXG4gIGRpc2FibGVMb2NhbFNlYXJjaD86IGJvb2xlYW47XG4gIFxuICAvLyBWYWxpZGF0aW9uXG4gIC8qKiBWYWxpZGF0ZSBiZWZvcmUgc2F2aW5nIChkZWZhdWx0OiB0cnVlKSAqL1xuICB2YWxpZGF0ZU9uU2F2ZT86IGJvb2xlYW47XG4gIFxuICAvLyBQb3J0YWwgb3B0aW9uc1xuICAvKiogQXBwZW5kIGRyb3Bkb3duIHRvIGRvY3VtZW50IGJvZHkgaW5zdGVhZCBvZiBwYXJlbnQgKi9cbiAgcG9ydGFsPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDdXN0b20gZWRpdG9yIHRoYXQgdXNlcyBOaWxlU2VsZWN0IGNvbXBvbmVudFxuICogQHRlbXBsYXRlIFQgVGhlIHZhbHVlIHR5cGUgKHN0cmluZyBmb3Igc2luZ2xlIHNlbGVjdGlvbiwgc3RyaW5nW10gZm9yIG11bHRpcGxlKVxuICovXG5leHBvcnQgY2xhc3MgTmlsZVNlbGVjdEVkaXRvcjxUID0gc3RyaW5nPiBpbXBsZW1lbnRzIENlbGxFZGl0b3I8VD4ge1xuICBwcml2YXRlIHNlbGVjdD86IGFueTtcbiAgcHJpdmF0ZSBldmVudExpc3RlbmVyczogQXJyYXk8eyBldmVudDogc3RyaW5nOyBoYW5kbGVyOiBFdmVudExpc3RlbmVyIH0+ID0gW107XG4gIHByaXZhdGUgb3B0aW9uc1N1YnNjcmlwdGlvbj86IFN1YnNjcmlwdGlvbjtcbiAgcHJpdmF0ZSBjdXJyZW50T3B0aW9uczogKFNlbGVjdE9wdGlvbiB8IHN0cmluZylbXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgb3B0aW9uczogTmlsZVNlbGVjdEVkaXRvck9wdGlvbnMpIHtcbiAgICAvLyBIYW5kbGUgT2JzZXJ2YWJsZSBvcHRpb25zXG4gICAgaWYgKGlzT2JzZXJ2YWJsZShvcHRpb25zLm9wdGlvbnMpKSB7XG4gICAgICB0aGlzLm9wdGlvbnNTdWJzY3JpcHRpb24gPSBvcHRpb25zLm9wdGlvbnMuc3Vic2NyaWJlKG9wdHMgPT4ge1xuICAgICAgICB0aGlzLmN1cnJlbnRPcHRpb25zID0gb3B0cztcbiAgICAgICAgLy8gSWYgZWRpdG9yIGlzIGFscmVhZHkgYWN0aXZlLCB1cGRhdGUgdGhlIERPTVxuICAgICAgICBpZiAodGhpcy5zZWxlY3QpIHtcbiAgICAgICAgICB0aGlzLnVwZGF0ZU9wdGlvbnMoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFN0YXRpYyBvcHRpb25zXG4gICAgICB0aGlzLmN1cnJlbnRPcHRpb25zID0gb3B0aW9ucy5vcHRpb25zIHx8IFtdO1xuICAgICAgaWYgKHRoaXMuY3VycmVudE9wdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignTmlsZVNlbGVjdEVkaXRvcjogb3B0aW9ucyBhcnJheSBpcyBlbXB0eScpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGVkaXQoY29udGV4dDogQ2VsbEVkaXRvckNvbnRleHQ8VD4pOiB2b2lkIHtcbiAgICBpZiAoIWNvbnRleHQuY29udGFpbmVyKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ05pbGVTZWxlY3RFZGl0b3IgcmVxdWlyZXMgYSBjb250YWluZXIgZWxlbWVudCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBOaWxlU2VsZWN0IGN1c3RvbSBlbGVtZW50IHVzaW5nIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnRcbiAgICB0aGlzLnNlbGVjdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ25pbGUtc2VsZWN0Jyk7XG4gICAgdGhpcy5zZWxlY3QuY2xhc3NOYW1lID0gJ3N0LWNlbGwtZWRpdG9yJztcbiAgICBcbiAgICAvLyBBcHBseSBpbmxpbmUgc3R5bGVzIGZvciBwcm9wZXIgY2VsbCBmaXR0aW5nXG4gICAgdGhpcy5zZWxlY3Quc3R5bGUud2lkdGggPSAnMTAwJSc7XG4gICAgdGhpcy5zZWxlY3Quc3R5bGUuaGVpZ2h0ID0gJ2luaGVyaXQnO1xuICAgIHRoaXMuc2VsZWN0LnN0eWxlLmJveFNpemluZyA9ICdib3JkZXItYm94JztcbiAgICBcbiAgICAvLyBTZXQgaW5pdGlhbCB2YWx1ZVxuICAgIHRoaXMuc2V0SW5pdGlhbFZhbHVlKGNvbnRleHQudmFsdWUpO1xuXG4gICAgLy8gQXBwbHkgYWxsIGNvbmZpZ3VyYXRpb24gb3B0aW9uc1xuICAgIHRoaXMuYXBwbHlPcHRpb25zKCk7XG5cbiAgICAvLyBDcmVhdGUgYW5kIGFwcGVuZCBvcHRpb25zIHdpdGggY3VycmVudCBvcHRpb25zXG4gICAgdGhpcy5jcmVhdGVBbmRBcHBlbmRPcHRpb25zKHRoaXMuY3VycmVudE9wdGlvbnMpO1xuXG4gICAgLy8gU2V0IHVwIGV2ZW50IGxpc3RlbmVyc1xuICAgIHRoaXMuc2V0dXBFdmVudExpc3RlbmVycyhjb250ZXh0KTtcblxuICAgIC8vIENsZWFyIGNvbnRhaW5lciBhbmQgYXBwZW5kIHNlbGVjdFxuICAgIGNvbnRleHQuY29udGFpbmVyLmlubmVySFRNTCA9ICcnO1xuICAgIGNvbnRleHQuY29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuc2VsZWN0KTtcblxuICAgIC8vIEZvY3VzIGFmdGVyIHJlbmRlclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5zZWxlY3Q/LmZvY3VzKCk7XG4gICAgICB0aGlzLnNlbGVjdD8uY2xpY2soKTtcbiAgICB9LCAwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIGluaXRpYWwgdmFsdWUgZm9yIHRoZSBzZWxlY3RcbiAgICovXG4gIHByaXZhdGUgc2V0SW5pdGlhbFZhbHVlKHZhbHVlOiBUKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnNlbGVjdCkgcmV0dXJuO1xuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5tdWx0aXBsZSkge1xuICAgICAgLy8gSGFuZGxlIG11bHRpcGxlIHNlbGVjdGlvbiAtIHZhbHVlIHNob3VsZCBiZSBhcnJheVxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0LnZhbHVlID0gdmFsdWU7XG4gICAgICB9IGVsc2UgaWYgKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0LnZhbHVlID0gW1N0cmluZyh2YWx1ZSldO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zZWxlY3QudmFsdWUgPSBbXTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSGFuZGxlIHNpbmdsZSBzZWxlY3Rpb25cbiAgICAgIHRoaXMuc2VsZWN0LnZhbHVlID0gdmFsdWUgPyBTdHJpbmcodmFsdWUpIDogJyc7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFwcGx5IGFsbCBjb25maWd1cmF0aW9uIG9wdGlvbnMgdG8gdGhlIE5pbGVTZWxlY3QgZWxlbWVudFxuICAgKi9cbiAgcHJpdmF0ZSBhcHBseU9wdGlvbnMoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnNlbGVjdCkgcmV0dXJuO1xuXG4gICAgLy8gQmFzaWMgb3B0aW9uc1xuICAgIGlmICh0aGlzLm9wdGlvbnMucGxhY2Vob2xkZXIpIHtcbiAgICAgIHRoaXMuc2VsZWN0LnBsYWNlaG9sZGVyID0gdGhpcy5vcHRpb25zLnBsYWNlaG9sZGVyO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMuc2l6ZSkge1xuICAgICAgdGhpcy5zZWxlY3Quc2l6ZSA9IHRoaXMub3B0aW9ucy5zaXplO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNlbGVjdC5zaXplID0gJ3NtYWxsJzsgLy8gRGVmYXVsdCBmb3IgdGFibGUgY2VsbHNcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLm11bHRpcGxlKSB7XG4gICAgICB0aGlzLnNlbGVjdC5tdWx0aXBsZSA9IHRoaXMub3B0aW9ucy5tdWx0aXBsZTtcbiAgICB9XG5cbiAgICAvLyBCZWhhdmlvciBvcHRpb25zXG4gICAgaWYgKHRoaXMub3B0aW9ucy5jbGVhcmFibGUpIHtcbiAgICAgIHRoaXMuc2VsZWN0LmNsZWFyYWJsZSA9IHRoaXMub3B0aW9ucy5jbGVhcmFibGU7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5kaXNhYmxlZCkge1xuICAgICAgdGhpcy5zZWxlY3QuZGlzYWJsZWQgPSB0aGlzLm9wdGlvbnMuZGlzYWJsZWQ7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5yZXF1aXJlZCkge1xuICAgICAgdGhpcy5zZWxlY3QucmVxdWlyZWQgPSB0aGlzLm9wdGlvbnMucmVxdWlyZWQ7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5zZWFyY2hFbmFibGVkKSB7XG4gICAgICB0aGlzLnNlbGVjdC5zZWFyY2hFbmFibGVkID0gdGhpcy5vcHRpb25zLnNlYXJjaEVuYWJsZWQ7XG4gICAgfVxuXG4gICAgLy8gVmlzdWFsIHN0YXRlc1xuICAgIGlmICh0aGlzLm9wdGlvbnMud2FybmluZykge1xuICAgICAgdGhpcy5zZWxlY3Qud2FybmluZyA9IHRoaXMub3B0aW9ucy53YXJuaW5nO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMuZXJyb3IpIHtcbiAgICAgIHRoaXMuc2VsZWN0LmVycm9yID0gdGhpcy5vcHRpb25zLmVycm9yO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMuc3VjY2Vzcykge1xuICAgICAgdGhpcy5zZWxlY3Quc3VjY2VzcyA9IHRoaXMub3B0aW9ucy5zdWNjZXNzO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMuZXJyb3JNZXNzYWdlKSB7XG4gICAgICB0aGlzLnNlbGVjdC5lcnJvck1lc3NhZ2UgPSB0aGlzLm9wdGlvbnMuZXJyb3JNZXNzYWdlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMuaGVscFRleHQpIHtcbiAgICAgIHRoaXMuc2VsZWN0LmhlbHBUZXh0ID0gdGhpcy5vcHRpb25zLmhlbHBUZXh0O1xuICAgIH1cblxuICAgIC8vIEFkdmFuY2VkIGZlYXR1cmVzXG4gICAgaWYgKHRoaXMub3B0aW9ucy5tYXhPcHRpb25zVmlzaWJsZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnNlbGVjdC5tYXhPcHRpb25zVmlzaWJsZSA9IHRoaXMub3B0aW9ucy5tYXhPcHRpb25zVmlzaWJsZTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLmZpbGxlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnNlbGVjdC5maWxsZWQgPSB0aGlzLm9wdGlvbnMuZmlsbGVkO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMucGlsbCkge1xuICAgICAgdGhpcy5zZWxlY3QucGlsbCA9IHRoaXMub3B0aW9ucy5waWxsO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMuaG9pc3QpIHtcbiAgICAgIHRoaXMuc2VsZWN0LmhvaXN0ID0gdGhpcy5vcHRpb25zLmhvaXN0O1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMucGxhY2VtZW50KSB7XG4gICAgICB0aGlzLnNlbGVjdC5wbGFjZW1lbnQgPSB0aGlzLm9wdGlvbnMucGxhY2VtZW50O1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMuZW5hYmxlVmlydHVhbFNjcm9sbCkge1xuICAgICAgdGhpcy5zZWxlY3QuZW5hYmxlVmlydHVhbFNjcm9sbCA9IHRoaXMub3B0aW9ucy5lbmFibGVWaXJ0dWFsU2Nyb2xsO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMuZGlzYWJsZUxvY2FsU2VhcmNoKSB7XG4gICAgICB0aGlzLnNlbGVjdC5kaXNhYmxlTG9jYWxTZWFyY2ggPSB0aGlzLm9wdGlvbnMuZGlzYWJsZUxvY2FsU2VhcmNoO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMucG9ydGFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuc2VsZWN0LnBvcnRhbCA9IHRoaXMub3B0aW9ucy5wb3J0YWw7XG4gICAgfVxuXG4gICAgLy8gUHJldmVudCB3aWR0aCBzeW5jaW5nIGlzc3VlcyBpbiB0YWJsZSBjZWxsc1xuICAgIHRoaXMuc2VsZWN0Lm5vV2lkdGhTeW5jID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgb3B0aW9ucyBkeW5hbWljYWxseSB3aGlsZSBlZGl0b3IgaXMgYWN0aXZlXG4gICAqL1xuICBwcml2YXRlIHVwZGF0ZU9wdGlvbnMoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnNlbGVjdCkgcmV0dXJuO1xuXG4gICAgLy8gQ2xlYXIgZXhpc3Rpbmcgb3B0aW9uc1xuICAgIHdoaWxlICh0aGlzLnNlbGVjdC5maXJzdENoaWxkKSB7XG4gICAgICB0aGlzLnNlbGVjdC5yZW1vdmVDaGlsZCh0aGlzLnNlbGVjdC5maXJzdENoaWxkKTtcbiAgICB9XG5cbiAgICAvLyBSZS1hcHBlbmQgd2l0aCBuZXcgb3B0aW9uc1xuICAgIHRoaXMuY3JlYXRlQW5kQXBwZW5kT3B0aW9ucyh0aGlzLmN1cnJlbnRPcHRpb25zKTtcbiAgICBcbiAgICAvLyBUcmlnZ2VyIHVwZGF0ZSBvbiB0aGUgd2ViIGNvbXBvbmVudFxuICAgIGlmICh0aGlzLnNlbGVjdC5yZXF1ZXN0VXBkYXRlKSB7XG4gICAgICB0aGlzLnNlbGVjdC5yZXF1ZXN0VXBkYXRlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBOaWxlT3B0aW9uIGVsZW1lbnRzIGFuZCBhcHBlbmQgdGhlbSB0byB0aGUgc2VsZWN0XG4gICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgdG8gcmVuZGVyXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZUFuZEFwcGVuZE9wdGlvbnMob3B0aW9uczogKFNlbGVjdE9wdGlvbiB8IHN0cmluZylbXSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zZWxlY3QpIHJldHVybjtcblxuICAgIG9wdGlvbnMuZm9yRWFjaChvcHQgPT4ge1xuICAgICAgY29uc3QgbmlsZU9wdGlvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ25pbGUtb3B0aW9uJykgYXMgYW55O1xuXG4gICAgICAvLyBBdXRvLWRldGVjdCBmb3JtYXQ6IHN0cmluZyBvciBTZWxlY3RPcHRpb24gb2JqZWN0XG4gICAgICBpZiAodHlwZW9mIG9wdCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgbmlsZU9wdGlvbi52YWx1ZSA9IG9wdDtcbiAgICAgICAgbmlsZU9wdGlvbi5zZXRBdHRyaWJ1dGUoJ3ZhbHVlJywgb3B0KTtcbiAgICAgICAgbmlsZU9wdGlvbi50ZXh0Q29udGVudCA9IG9wdDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5pbGVPcHRpb24udmFsdWUgPSBvcHQudmFsdWU7XG4gICAgICAgIG5pbGVPcHRpb24uc2V0QXR0cmlidXRlKCd2YWx1ZScsIG9wdC52YWx1ZSk7XG4gICAgICAgIG5pbGVPcHRpb24udGV4dENvbnRlbnQgPSBvcHQubGFiZWw7XG4gICAgICAgIFxuICAgICAgICBpZiAob3B0LmRpc2FibGVkKSB7XG4gICAgICAgICAgbmlsZU9wdGlvbi5kaXNhYmxlZCA9IHRydWU7XG4gICAgICAgICAgbmlsZU9wdGlvbi5zZXRBdHRyaWJ1dGUoJ2Rpc2FibGVkJywgJ3RydWUnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEhhbmRsZSBwcmVmaXggaWYgcHJvdmlkZWQgKGNvdWxkIGJlIGljb24gbmFtZSBvciBjb250ZW50KVxuICAgICAgICBpZiAob3B0LnByZWZpeCkge1xuICAgICAgICAgIC8vIG5pbGVPcHRpb24uc2V0QXR0cmlidXRlKCdzbG90JywgJ3ByZWZpeCcpO1xuICAgICAgICAgIC8vIG5pbGVPcHRpb24uaW5uZXJIVE1MID0gYDxuaWxlLWljb24gbmFtZT1cIiR7b3B0LnByZWZpeH1cIj48L25pbGUtaWNvbj5gO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc2VsZWN0IS5hcHBlbmRDaGlsZChuaWxlT3B0aW9uKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdXAgYWxsIGV2ZW50IGxpc3RlbmVycyB3aXRoIHByb3BlciBjbGVhbnVwIHRyYWNraW5nXG4gICAqL1xuICBwcml2YXRlIHNldHVwRXZlbnRMaXN0ZW5lcnMoY29udGV4dDogQ2VsbEVkaXRvckNvbnRleHQ8VD4pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc2VsZWN0KSByZXR1cm47XG5cbiAgICBjb25zdCB2YWxpZGF0ZU9uU2F2ZSA9IHRoaXMub3B0aW9ucy52YWxpZGF0ZU9uU2F2ZSAhPT0gZmFsc2U7XG5cbiAgICAvLyBIYW5kbGUga2V5Ym9hcmQgZXZlbnRzIChrZXlkb3duIGlzIG5vdCByZXBsYWNlZCBieSBjdXN0b20gZXZlbnRzKVxuICAgIGNvbnN0IGtleWRvd25IYW5kbGVyID0gKGU6IEV2ZW50KSA9PiB7XG4gICAgICBjb25zdCBrZXlFdmVudCA9IGUgYXMgS2V5Ym9hcmRFdmVudDtcbiAgICAgIGlmIChrZXlFdmVudC5rZXkgPT09ICdFc2NhcGUnKSB7XG4gICAgICAgIGtleUV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGtleUV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBjb250ZXh0Lm9uQ2FuY2VsKCk7XG4gICAgICB9XG4gICAgfTtcbiAgICB0aGlzLnNlbGVjdC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywga2V5ZG93bkhhbmRsZXIpO1xuICAgIHRoaXMuZXZlbnRMaXN0ZW5lcnMucHVzaCh7IGV2ZW50OiAna2V5ZG93bicsIGhhbmRsZXI6IGtleWRvd25IYW5kbGVyIH0pO1xuXG4gICAgLy8gVXNlIG5pbGUtY2hhbmdlIGN1c3RvbSBldmVudCBhcyBwcmltYXJ5IHNhdmUgdHJpZ2dlclxuICAgIGNvbnN0IGNoYW5nZUhhbmRsZXIgPSAoZTogRXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IGN1c3RvbUV2ZW50ID0gZSBhcyBDdXN0b21FdmVudDtcbiAgICAgIGlmICh2YWxpZGF0ZU9uU2F2ZSAmJiAhdGhpcy5zZWxlY3Q/LmNoZWNrVmFsaWRpdHkoKSkge1xuICAgICAgICB0aGlzLnNlbGVjdD8ucmVwb3J0VmFsaWRpdHkoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29udGV4dC5vblNhdmUodGhpcy5wYXJzZVZhbHVlKGN1c3RvbUV2ZW50LmRldGFpbC52YWx1ZSkpO1xuICAgIH07XG4gICAgdGhpcy5zZWxlY3QuYWRkRXZlbnRMaXN0ZW5lcignbmlsZS1jaGFuZ2UnLCBjaGFuZ2VIYW5kbGVyKTtcbiAgICB0aGlzLmV2ZW50TGlzdGVuZXJzLnB1c2goeyBldmVudDogJ25pbGUtY2hhbmdlJywgaGFuZGxlcjogY2hhbmdlSGFuZGxlciB9KTtcblxuICAgIC8vIEhhbmRsZSBibHVyIGFzIHNlY29uZGFyeSBzYXZlIHRyaWdnZXJcbiAgICBjb25zdCBibHVySGFuZGxlciA9IChlOiBFdmVudCkgPT4ge1xuICAgICAgaWYgKHZhbGlkYXRlT25TYXZlICYmICF0aGlzLnNlbGVjdD8uY2hlY2tWYWxpZGl0eSgpKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0Py5yZXBvcnRWYWxpZGl0eSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBjb250ZXh0Lm9uU2F2ZSh0aGlzLmdldEN1cnJlbnRWYWx1ZSgpKTtcbiAgICB9O1xuICAgIHRoaXMuc2VsZWN0LmFkZEV2ZW50TGlzdGVuZXIoJ25pbGUtYmx1cicsIGJsdXJIYW5kbGVyKTtcbiAgICB0aGlzLmV2ZW50TGlzdGVuZXJzLnB1c2goeyBldmVudDogJ25pbGUtYmx1cicsIGhhbmRsZXI6IGJsdXJIYW5kbGVyIH0pO1xuXG4gICAgLy8gSGFuZGxlIGNsZWFyIGJ1dHRvbiBpZiBlbmFibGVkXG4gICAgaWYgKHRoaXMub3B0aW9ucy5jbGVhcmFibGUpIHtcbiAgICAgIGNvbnN0IGNsZWFySGFuZGxlciA9IChlOiBFdmVudCkgPT4ge1xuICAgICAgICBjb250ZXh0Lm9uU2F2ZSh0aGlzLnBhcnNlVmFsdWUodGhpcy5vcHRpb25zLm11bHRpcGxlID8gW10gOiAnJykpO1xuICAgICAgfTtcbiAgICAgIHRoaXMuc2VsZWN0LmFkZEV2ZW50TGlzdGVuZXIoJ25pbGUtY2xlYXInLCBjbGVhckhhbmRsZXIpO1xuICAgICAgdGhpcy5ldmVudExpc3RlbmVycy5wdXNoKHsgZXZlbnQ6ICduaWxlLWNsZWFyJywgaGFuZGxlcjogY2xlYXJIYW5kbGVyIH0pO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBzZWFyY2ggZm9yIHNlcnZlci1zaWRlIHNlYXJjaCBzY2VuYXJpb3NcbiAgICBpZiAodGhpcy5vcHRpb25zLmRpc2FibGVMb2NhbFNlYXJjaCkge1xuICAgICAgY29uc3Qgc2VhcmNoSGFuZGxlciA9IChlOiBFdmVudCkgPT4ge1xuICAgICAgICBjb25zdCBjdXN0b21FdmVudCA9IGUgYXMgQ3VzdG9tRXZlbnQ7XG4gICAgICAgIC8vIEVtaXQgc2VhcmNoIHF1ZXJ5IHRocm91Z2ggb25DaGFuZ2UgZm9yIGV4dGVybmFsIGhhbmRsaW5nXG4gICAgICAgIGNvbnRleHQub25DaGFuZ2UoY3VzdG9tRXZlbnQuZGV0YWlsIGFzIFQpO1xuICAgICAgfTtcbiAgICAgIHRoaXMuc2VsZWN0LmFkZEV2ZW50TGlzdGVuZXIoJ25pbGUtc2VhcmNoJywgc2VhcmNoSGFuZGxlcik7XG4gICAgICB0aGlzLmV2ZW50TGlzdGVuZXJzLnB1c2goeyBldmVudDogJ25pbGUtc2VhcmNoJywgaGFuZGxlcjogc2VhcmNoSGFuZGxlciB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUGFyc2UgdmFsdWUgYmFzZWQgb24gc2VsZWN0aW9uIG1vZGVcbiAgICovXG4gIHByaXZhdGUgcGFyc2VWYWx1ZSh2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10pOiBUIHtcbiAgICBpZiAodGhpcy5vcHRpb25zLm11bHRpcGxlKSB7XG4gICAgICAvLyBFbnN1cmUgYXJyYXkgZm9yIG11bHRpcGxlIHNlbGVjdGlvblxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSBhcyB1bmtub3duIGFzIFQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gKHZhbHVlID8gW3ZhbHVlXSA6IFtdKSBhcyB1bmtub3duIGFzIFQ7XG4gICAgfVxuICAgIFxuICAgIC8vIFNpbmdsZSBzZWxlY3Rpb24gLSByZXR1cm4gc3RyaW5nXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICByZXR1cm4gKHZhbHVlLmxlbmd0aCA+IDAgPyB2YWx1ZVswXSA6ICcnKSBhcyB1bmtub3duIGFzIFQ7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZSBhcyB1bmtub3duIGFzIFQ7XG4gIH1cblxuICBkZXN0cm95KCk6IHZvaWQge1xuICAgIC8vIFVuc3Vic2NyaWJlIGZyb20gb3B0aW9ucyBPYnNlcnZhYmxlXG4gICAgaWYgKHRoaXMub3B0aW9uc1N1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5vcHRpb25zU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICB0aGlzLm9wdGlvbnNTdWJzY3JpcHRpb24gPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIFxuICAgIC8vIFJlbW92ZSBhbGwgZXZlbnQgbGlzdGVuZXJzXG4gICAgaWYgKHRoaXMuc2VsZWN0KSB7XG4gICAgICB0aGlzLmV2ZW50TGlzdGVuZXJzLmZvckVhY2goKHsgZXZlbnQsIGhhbmRsZXIgfSkgPT4ge1xuICAgICAgICB0aGlzLnNlbGVjdD8ucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudCwgaGFuZGxlcik7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuZXZlbnRMaXN0ZW5lcnMgPSBbXTtcbiAgICAgIFxuICAgICAgdGhpcy5zZWxlY3QucmVtb3ZlKCk7XG4gICAgICB0aGlzLnNlbGVjdCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICBmb2N1cygpOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdD8uZm9jdXMoKTtcbiAgfVxuXG4gIGdldEN1cnJlbnRWYWx1ZSgpOiBUIHtcbiAgICBpZiAoIXRoaXMuc2VsZWN0KSB7XG4gICAgICByZXR1cm4gKHRoaXMub3B0aW9ucy5tdWx0aXBsZSA/IFtdIDogJycpIGFzIHVua25vd24gYXMgVDtcbiAgICB9XG4gICAgXG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLnNlbGVjdC52YWx1ZTtcbiAgICBcbiAgICAvLyBIYW5kbGUgbXVsdGlwbGUgc2VsZWN0aW9uXG4gICAgaWYgKHRoaXMub3B0aW9ucy5tdWx0aXBsZSkge1xuICAgICAgcmV0dXJuIChBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW3ZhbHVlXSkgYXMgdW5rbm93biBhcyBUO1xuICAgIH1cbiAgICBcbiAgICAvLyBIYW5kbGUgc2luZ2xlIHNlbGVjdGlvblxuICAgIHJldHVybiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyAodmFsdWUubGVuZ3RoID4gMCA/IHZhbHVlWzBdIDogJycpIDogdmFsdWUpIGFzIHVua25vd24gYXMgVDtcbiAgfVxufVxuIl19
@@ -0,0 +1,231 @@
1
+ /**
2
+ * Column configuration factory
3
+ * Simplifies creation of common column types with sensible defaults
4
+ */
5
+ import { DEFAULT_COLUMN_CONFIG } from '../models/column-config.interface';
6
+ import { CellDataType } from '../models/cell-types';
7
+ import { Cell } from '../renderer/models/cell.class';
8
+ import { StringFormatter, NumberFormatter, CurrencyFormatter, DateFormatter, BooleanFormatter } from '../strategies/default-formatters';
9
+ import { PatternValidators } from '../strategies/default-validators';
10
+ import { TextEditor, NumberEditor, DateEditor, SelectEditor, BooleanEditor } from '../strategies/default-editors';
11
+ import { deepMergeColumnConfig } from '../models/column-config.utils';
12
+ /**
13
+ * Column configuration factory - Factory Pattern
14
+ * Provides convenient methods to create pre-configured column types
15
+ */
16
+ export class ColumnConfigFactory {
17
+ /**
18
+ * Create a text column
19
+ */
20
+ static text(key, options) {
21
+ const config = deepMergeColumnConfig(DEFAULT_COLUMN_CONFIG, {
22
+ key,
23
+ header: key.charAt(0).toUpperCase() + key.slice(1),
24
+ dataType: CellDataType.STRING,
25
+ formatter: new StringFormatter(),
26
+ editor: new TextEditor(),
27
+ }, options || {});
28
+ return {
29
+ ...config,
30
+ createCell(rowData, rowIndex) {
31
+ const valueGetter = options?.valueGetter || ((data) => data[key]);
32
+ const value = valueGetter(rowData);
33
+ return new Cell(this, value, rowData, rowIndex);
34
+ }
35
+ };
36
+ }
37
+ /**
38
+ * Create a number column
39
+ */
40
+ static number(key, options) {
41
+ const config = deepMergeColumnConfig(DEFAULT_COLUMN_CONFIG, {
42
+ key,
43
+ header: key.charAt(0).toUpperCase() + key.slice(1),
44
+ dataType: CellDataType.NUMBER,
45
+ formatter: new NumberFormatter({ decimals: 2 }),
46
+ validator: PatternValidators.custom((val) => typeof val === 'number' && !isNaN(val), 'Must be a valid number'),
47
+ editor: new NumberEditor(),
48
+ }, options || {});
49
+ return {
50
+ ...config,
51
+ createCell(rowData, rowIndex) {
52
+ const valueGetter = options?.valueGetter || ((data) => data[key]);
53
+ const value = valueGetter(rowData);
54
+ return new Cell(this, value, rowData, rowIndex);
55
+ }
56
+ };
57
+ }
58
+ /**
59
+ * Create a currency column
60
+ */
61
+ static currency(key, options) {
62
+ const currency = options?.currency || 'USD';
63
+ const locale = options?.locale || 'en-US';
64
+ const config = deepMergeColumnConfig(DEFAULT_COLUMN_CONFIG, {
65
+ key,
66
+ header: key.charAt(0).toUpperCase() + key.slice(1),
67
+ dataType: CellDataType.NUMBER,
68
+ formatter: new CurrencyFormatter({ currency, locale }),
69
+ validator: PatternValidators.chain(PatternValidators.custom((val) => typeof val === 'number' && !isNaN(val), 'Must be a valid number'), PatternValidators.range(0, undefined, 'Amount must be positive')),
70
+ editor: new NumberEditor({ min: 0, step: 0.01 }),
71
+ }, options || {});
72
+ return {
73
+ ...config,
74
+ createCell(rowData, rowIndex) {
75
+ const valueGetter = options?.valueGetter || ((data) => data[key]);
76
+ const value = valueGetter(rowData);
77
+ return new Cell(this, value, rowData, rowIndex);
78
+ }
79
+ };
80
+ }
81
+ /**
82
+ * Create a date column
83
+ */
84
+ static date(key, options) {
85
+ const dateStyle = options?.dateStyle || 'medium';
86
+ const locale = options?.locale || 'en-US';
87
+ const config = deepMergeColumnConfig(DEFAULT_COLUMN_CONFIG, {
88
+ key,
89
+ header: key.charAt(0).toUpperCase() + key.slice(1),
90
+ dataType: CellDataType.DATE,
91
+ formatter: new DateFormatter({ dateStyle, locale }),
92
+ editor: new DateEditor(),
93
+ }, options || {});
94
+ return {
95
+ ...config,
96
+ createCell(rowData, rowIndex) {
97
+ const valueGetter = options?.valueGetter || ((data) => data[key]);
98
+ const value = valueGetter(rowData);
99
+ return new Cell(this, value, rowData, rowIndex);
100
+ }
101
+ };
102
+ }
103
+ /**
104
+ * Create a boolean column
105
+ */
106
+ static boolean(key, options) {
107
+ const trueValue = options?.trueValue || 'Yes';
108
+ const falseValue = options?.falseValue || 'No';
109
+ const config = deepMergeColumnConfig(DEFAULT_COLUMN_CONFIG, {
110
+ key,
111
+ header: key.charAt(0).toUpperCase() + key.slice(1),
112
+ dataType: CellDataType.BOOLEAN,
113
+ formatter: new BooleanFormatter({ trueValue, falseValue }),
114
+ editor: new BooleanEditor(),
115
+ }, options || {});
116
+ return {
117
+ ...config,
118
+ createCell(rowData, rowIndex) {
119
+ const valueGetter = options?.valueGetter || ((data) => data[key]);
120
+ const value = valueGetter(rowData);
121
+ return new Cell(this, value, rowData, rowIndex);
122
+ }
123
+ };
124
+ }
125
+ /**
126
+ * Create a select/dropdown column
127
+ */
128
+ static select(key, selectOptions, options) {
129
+ const config = deepMergeColumnConfig(DEFAULT_COLUMN_CONFIG, {
130
+ key,
131
+ header: key.charAt(0).toUpperCase() + key.slice(1),
132
+ editor: new SelectEditor({ options: selectOptions }),
133
+ }, options || {});
134
+ return {
135
+ ...config,
136
+ createCell(rowData, rowIndex) {
137
+ const valueGetter = options?.valueGetter || ((data) => data[key]);
138
+ const value = valueGetter(rowData);
139
+ return new Cell(this, value, rowData, rowIndex);
140
+ }
141
+ };
142
+ }
143
+ /**
144
+ * Create an email column
145
+ */
146
+ static email(key, options) {
147
+ const config = deepMergeColumnConfig(DEFAULT_COLUMN_CONFIG, {
148
+ key,
149
+ header: key.charAt(0).toUpperCase() + key.slice(1),
150
+ dataType: CellDataType.STRING,
151
+ formatter: new StringFormatter(),
152
+ validator: PatternValidators.email(),
153
+ editor: new TextEditor({ placeholder: 'email@example.com' }),
154
+ }, options || {});
155
+ return {
156
+ ...config,
157
+ createCell(rowData, rowIndex) {
158
+ const valueGetter = options?.valueGetter || ((data) => data[key]);
159
+ const value = valueGetter(rowData);
160
+ return new Cell(this, value, rowData, rowIndex);
161
+ }
162
+ };
163
+ }
164
+ /**
165
+ * Create a readonly column
166
+ */
167
+ static readonly(key, options) {
168
+ const config = deepMergeColumnConfig(DEFAULT_COLUMN_CONFIG, {
169
+ key,
170
+ header: key.charAt(0).toUpperCase() + key.slice(1),
171
+ editable: false,
172
+ }, options || {});
173
+ return {
174
+ ...config,
175
+ createCell(rowData, rowIndex) {
176
+ const valueGetter = options?.valueGetter || ((data) => data[key]);
177
+ const value = valueGetter(rowData);
178
+ return new Cell(this, value, rowData, rowIndex);
179
+ }
180
+ };
181
+ }
182
+ /**
183
+ * Create a custom column with full control
184
+ */
185
+ static custom(config) {
186
+ if (!config.key) {
187
+ throw new Error('Column key is required');
188
+ }
189
+ const mergedConfig = deepMergeColumnConfig(DEFAULT_COLUMN_CONFIG, {
190
+ header: config.key.charAt(0).toUpperCase() + config.key.slice(1),
191
+ }, config);
192
+ return {
193
+ ...mergedConfig,
194
+ createCell(rowData, rowIndex) {
195
+ const valueGetter = config.valueGetter || ((data) => data[config.key]);
196
+ const value = valueGetter(rowData);
197
+ return new Cell(this, value, rowData, rowIndex);
198
+ }
199
+ };
200
+ }
201
+ /**
202
+ * Create multiple columns at once from a simple configuration
203
+ */
204
+ static fromKeys(keys) {
205
+ return keys.map(keyConfig => {
206
+ if (typeof keyConfig === 'string' || typeof keyConfig === 'number' || typeof keyConfig === 'symbol') {
207
+ return ColumnConfigFactory.text(String(keyConfig));
208
+ }
209
+ else {
210
+ const { key, type = 'text', options = {} } = keyConfig;
211
+ const keyStr = String(key);
212
+ switch (type) {
213
+ case 'number':
214
+ return ColumnConfigFactory.number(keyStr, options);
215
+ case 'date':
216
+ return ColumnConfigFactory.date(keyStr, options);
217
+ case 'boolean':
218
+ return ColumnConfigFactory.boolean(keyStr, options);
219
+ case 'text':
220
+ default:
221
+ return ColumnConfigFactory.text(keyStr, options);
222
+ }
223
+ }
224
+ });
225
+ }
226
+ }
227
+ /**
228
+ * Convenience exports for common column types
229
+ */
230
+ export const Columns = ColumnConfigFactory;
231
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sdW1uLWNvbmZpZy5mYWN0b3J5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc21hcnQtdGFibGUvc3JjL2xpYi9mYWN0b3JpZXMvY29sdW1uLWNvbmZpZy5mYWN0b3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQUVILE9BQU8sRUFBZ0IscUJBQXFCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUN4RixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDcEQsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ3JELE9BQU8sRUFDTCxlQUFlLEVBQ2YsZUFBZSxFQUNmLGlCQUFpQixFQUNqQixhQUFhLEVBQ2IsZ0JBQWdCLEVBQ2pCLE1BQU0sa0NBQWtDLENBQUM7QUFDMUMsT0FBTyxFQUNMLGlCQUFpQixFQUNsQixNQUFNLGtDQUFrQyxDQUFDO0FBQzFDLE9BQU8sRUFDTCxVQUFVLEVBQ1YsWUFBWSxFQUNaLFVBQVUsRUFDVixZQUFZLEVBQ1osYUFBYSxFQUNkLE1BQU0sK0JBQStCLENBQUM7QUFDdkMsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFFdEU7OztHQUdHO0FBQ0gsTUFBTSxPQUFPLG1CQUFtQjtJQUM5Qjs7T0FFRztJQUNILE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBVyxFQUFFLE9BQXVDO1FBQzlELE1BQU0sTUFBTSxHQUFHLHFCQUFxQixDQUNsQyxxQkFBcUIsRUFDckI7WUFDRSxHQUFHO1lBQ0gsTUFBTSxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDbEQsUUFBUSxFQUFFLFlBQVksQ0FBQyxNQUFNO1lBQzdCLFNBQVMsRUFBRSxJQUFJLGVBQWUsRUFBRTtZQUNoQyxNQUFNLEVB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O0lBRUQ7O09BRUc7SUFDSCxNQUFNLENBQUMsUUFBUSxDQUNiLElBQXFHO1FBRXJHLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsRUFBRTtZQUMxQixJQUFJLE9BQU8sU0FBUyxLQUFLLFFBQVEsSUFBSSxPQUFPLFNBQVMsS0FBSyxRQUFRLElBQUksT0FBTyxTQUFTLEtBQUssUUFBUSxFQUFFO2dCQUNuRyxPQUFPLG1CQUFtQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQzthQUNwRDtpQkFBTTtnQkFDTCxNQUFNLEVBQUUsR0FBRyxFQUFFLElBQUksR0FBRyxNQUFNLEVBQUUsT0FBTyxHQUFHLEVBQUUsRUFBRSxHQUFHLFNBQVMsQ0FBQztnQkFDdkQsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUUzQixRQUFRLElBQUksRUFBRTtvQkFDWixLQUFLLFFBQVE7d0JBQ1gsT0FBTyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO29CQUNyRCxLQUFLLE1BQU07d0JBQ1QsT0FBTyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO29CQUNuRCxLQUFLLFNBQVM7d0JBQ1osT0FBTyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO29CQUN0RCxLQUFLLE1BQU0sQ0FBQztvQkFDWjt3QkFDRSxPQUFPLG1CQUFtQixDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7aUJBQ3BEO2FBQ0Y7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQUVEOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHLG1CQUFtQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb2x1bW4gY29uZmlndXJhdGlvbiBmYWN0b3J5XG4gKiBTaW1wbGlmaWVzIGNyZWF0aW9uIG9mIGNvbW1vbiBjb2x1bW4gdHlwZXMgd2l0aCBzZW5zaWJsZSBkZWZhdWx0c1xuICovXG5cbmltcG9ydCB7IENvbHVtbkNvbmZpZywgREVGQVVMVF9DT0xVTU5fQ09ORklHIH0gZnJvbSAnLi4vbW9kZWxzL2NvbHVtbi1jb25maWcuaW50ZXJmYWNlJztcbmltcG9ydCB7IENlbGxEYXRhVHlwZSB9IGZyb20gJy4uL21vZGVscy9jZWxsLXR5cGVzJztcbmltcG9ydCB7IENlbGwgfSBmcm9tICcuLi9yZW5kZXJlci9tb2RlbHMvY2VsbC5jbGFzcyc7XG5pbXBvcnQge1xuICBTdHJpbmdGb3JtYXR0ZXIsXG4gIE51bWJlckZvcm1hdHRlcixcbiAgQ3VycmVuY3lGb3JtYXR0ZXIsXG4gIERhdGVGb3JtYXR0ZXIsXG4gIEJvb2xlYW5Gb3JtYXR0ZXJcbn0gZnJvbSAnLi4vc3RyYXRlZ2llcy9kZWZhdWx0LWZvcm1hdHRlcnMnO1xuaW1wb3J0IHtcbiAgUGF0dGVyblZhbGlkYXRvcnNcbn0gZnJvbSAnLi4vc3RyYXRlZ2llcy9kZWZhdWx0LXZhbGlkYXRvcnMnO1xuaW1wb3J0IHtcbiAgVGV4dEVkaXRvcixcbiAgTnVtYmVyRWRpdG9yLFxuICBEYXRlRWRpdG9yLFxuICBTZWxlY3RFZGl0b3IsXG4gIEJvb2xlYW5FZGl0b3Jcbn0gZnJvbSAnLi4vc3RyYXRlZ2llcy9kZWZhdWx0LWVkaXRvcnMnO1xuaW1wb3J0IHsgZGVlcE1lcmdlQ29sdW1uQ29uZmlnIH0gZnJvbSAnLi4vbW9kZWxzL2NvbHVtbi1jb25maWcudXRpbHMnO1xuXG4vKipcbiAqIENvbHVtbiBjb25maWd1cmF0aW9uIGZhY3RvcnkgLSBGYWN0b3J5IFBhdHRlcm5cbiAqIFByb3ZpZGVzIGNvbnZlbmllbnQgbWV0aG9kcyB0byBjcmVhdGUgcHJlLWNvbmZpZ3VyZWQgY29sdW1uIHR5cGVzXG4gKi9cbmV4cG9ydCBjbGFzcyBDb2x1bW5Db25maWdGYWN0b3J5IHtcbiAgLyoqXG4gICAqIENyZWF0ZSBhIHRleHQgY29sdW1uXG4gICAqL1xuICBzdGF0aWMgdGV4dChrZXk6IHN0cmluZywgb3B0aW9ucz86IFBhcnRpYWw8Q29sdW1uQ29uZmlnPHN0cmluZz4+KTogQ29sdW1uQ29uZmlnPHN0cmluZz4ge1xuICAgIGNvbnN0IGNvbmZpZyA9IGRlZXBNZXJnZUNvbHVtbkNvbmZpZyhcbiAgICAgIERFRkFVTFRfQ09MVU1OX0NPTkZJRyxcbiAgICAgIHtcbiAgICAgICAga2V5LFxuICAgICAgICBoZWFkZXI6IGtleS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIGtleS5zbGljZSgxKSxcbiAgICAgICAgZGF0YVR5cGU6IENlbGxEYXRhVHlwZS5TVFJJTkcsXG4gICAgICAgIGZvcm1hdHRlcjogbmV3IFN0cmluZ0Zvcm1hdHRlcigpLFxuICAgICAgICBlZGl0b3I6IG5ldyBUZXh0RWRpdG9yKCksXG4gICAgICB9LFxuICAgICAgb3B0aW9ucyB8fCB7fVxuICAgICk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uY29uZmlnLFxuICAgICAgY3JlYXRlQ2VsbChyb3dEYXRhOiBhbnksIHJvd0luZGV4PzogbnVtYmVyKTogQ2VsbDxzdHJpbmc+IHtcbiAgICAgICAgY29uc3QgdmFsdWVHZXR0ZXIgPSBvcHRpb25zPy52YWx1ZUdldHRlciB8fCAoKGRhdGE6IGFueSkgPT4gZGF0YVtrZXldKTtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB2YWx1ZUdldHRlcihyb3dEYXRhKTtcbiAgICAgICAgcmV0dXJuIG5ldyBDZWxsKHRoaXMsIHZhbHVlLCByb3dEYXRhLCByb3dJbmRleCk7XG4gICAgICB9XG4gICAgfSBhcyBDb2x1bW5Db25maWc8c3RyaW5nPjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBudW1iZXIgY29sdW1uXG4gICAqL1xuICBzdGF0aWMgbnVtYmVyKGtleTogc3RyaW5nLCBvcHRpb25zPzogUGFydGlhbDxDb2x1bW5Db25maWc8bnVtYmVyPj4pOiBDb2x1bW5Db25maWc8bnVtYmVyPiB7XG4gICAgY29uc3QgY29uZmlnID0gZGVlcE1lcmdlQ29sdW1uQ29uZmlnKFxuICAgICAgREVGQVVMVF9DT0xVTU5fQ09ORklHLFxuICAgICAge1xuICAgICAgICBrZXksXG4gICAgICAgIGhlYWRlcjoga2V5LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsga2V5LnNsaWNlKDEpLFxuICAgICAgICBkYXRhVHlwZTogQ2VsbERhdGFUeXBlLk5VTUJFUixcbiAgICAgICAgZm9ybWF0dGVyOiBuZXcgTnVtYmVyRm9ybWF0dGVyKHsgZGVjaW1hbHM6IDIgfSksXG4gICAgICAgIHZhbGlkYXRvcjogUGF0dGVyblZhbGlkYXRvcnMuY3VzdG9tKCh2YWwpID0+IHR5cGVvZiB2YWwgPT09ICdudW1iZXInICYmICFpc05hTih2YWwpLCAnTXVzdCBiZSBhIHZhbGlkIG51bWJlcicpLFxuICAgICAgICBlZGl0b3I6IG5ldyBOdW1iZXJFZGl0b3IoKSxcbiAgICAgIH0sXG4gICAgICBvcHRpb25zIHx8IHt9XG4gICAgKTtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi5jb25maWcsXG4gICAgICBjcmVhdGVDZWxsKHJvd0RhdGE6IGFueSwgcm93SW5kZXg/OiBudW1iZXIpOiBDZWxsPG51bWJlcj4ge1xuICAgICAgICBjb25zdCB2YWx1ZUdldHRlciA9IG9wdGlvbnM/LnZhbHVlR2V0dGVyIHx8ICgoZGF0YTogYW55KSA9PiBkYXRhW2tleV0pO1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHZhbHVlR2V0dGVyKHJvd0RhdGEpO1xuICAgICAgICByZXR1cm4gbmV3IENlbGwodGhpcywgdmFsdWUsIHJvd0RhdGEsIHJvd0luZGV4KTtcbiAgICAgIH1cbiAgICB9IGFzIENvbHVtbkNvbmZpZzxudW1iZXI+O1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIGN1cnJlbmN5IGNvbHVtblxuICAgKi9cbiAgc3RhdGljIGN1cnJlbmN5KGtleTogc3RyaW5nLCBvcHRpb25zPzogUGFydGlhbDxDb2x1bW5Db25maWc8bnVtYmVyPj4gJiB7XG4gICAgY3VycmVuY3k/OiBzdHJpbmc7XG4gICAgbG9jYWxlPzogc3RyaW5nO1xuICB9KTogQ29sdW1uQ29uZmlnPG51bWJlcj4ge1xuICAgIGNvbnN0IGN1cnJlbmN5ID0gKG9wdGlvbnMgYXMgYW55KT8uY3VycmVuY3kgfHwgJ1VTRCc7XG4gICAgY29uc3QgbG9jYWxlID0gKG9wdGlvbnMgYXMgYW55KT8ubG9jYWxlIHx8ICdlbi1VUyc7XG5cbiAgICBjb25zdCBjb25maWcgPSBkZWVwTWVyZ2VDb2x1bW5Db25maWcoXG4gICAgICBERUZBVUxUX0NPTFVNTl9DT05GSUcsXG4gICAgICB7XG4gICAgICAgIGtleSxcbiAgICAgICAgaGVhZGVyOiBrZXkuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBrZXkuc2xpY2UoMSksXG4gICAgICAgIGRhdGFUeXBlOiBDZWxsRGF0YVR5cGUuTlVNQkVSLFxuICAgICAgICBmb3JtYXR0ZXI6IG5ldyBDdXJyZW5jeUZvcm1hdHRlcih7IGN1cnJlbmN5LCBsb2NhbGUgfSksXG4gICAgICAgIHZhbGlkYXRvcjogUGF0dGVyblZhbGlkYXRvcnMuY2hhaW4oXG4gICAgICAgICAgUGF0dGVyblZhbGlkYXRvcnMuY3VzdG9tKCh2YWwpID0+IHR5cGVvZiB2YWwgPT09ICdudW1iZXInICYmICFpc05hTih2YWwpLCAnTXVzdCBiZSBhIHZhbGlkIG51bWJlcicpLFxuICAgICAgICAgIFBhdHRlcm5WYWxpZGF0b3JzLnJhbmdlKDAsIHVuZGVmaW5lZCwgJ0Ftb3VudCBtdXN0IGJlIHBvc2l0aXZlJylcbiAgICAgICAgKSxcbiAgICAgICAgZWRpdG9yOiBuZXcgTnVtYmVyRWRpdG9yKHsgbWluOiAwLCBzdGVwOiAwLjAxIH0pLFxuICAgICAgfSxcbiAgICAgIG9wdGlvbnMgfHwge31cbiAgICApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmNvbmZpZyxcbiAgICAgIGNyZWF0ZUNlbGwocm93RGF0YTogYW55LCByb3dJbmRleD86IG51bWJlcik6IENlbGw8bnVtYmVyPiB7XG4gICAgICAgIGNvbnN0IHZhbHVlR2V0dGVyID0gb3B0aW9ucz8udmFsdWVHZXR0ZXIgfHwgKChkYXRhOiBhbnkpID0+IGRhdGFba2V5XSk7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdmFsdWVHZXR0ZXIocm93RGF0YSk7XG4gICAgICAgIHJldHVybiBuZXcgQ2VsbCh0aGlzLCB2YWx1ZSwgcm93RGF0YSwgcm93SW5kZXgpO1xuICAgICAgfVxuICAgIH0gYXMgQ29sdW1uQ29uZmlnPG51bWJlcj47XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgZGF0ZSBjb2x1bW5cbiAgICovXG4gIHN0YXRpYyBkYXRlKGtleTogc3RyaW5nLCBvcHRpb25zPzogUGFydGlhbDxDb2x1bW5Db25maWc8RGF0ZT4+ICYge1xuICAgIGRhdGVTdHlsZT86ICdmdWxsJyB8ICdsb25nJyB8ICdtZWRpdW0nIHwgJ3Nob3J0JztcbiAgICBsb2NhbGU/OiBzdHJpbmc7XG4gIH0pOiBDb2x1bW5Db25maWc8RGF0ZT4ge1xuICAgIGNvbnN0IGRhdGVTdHlsZSA9IChvcHRpb25zIGFzIGFueSk/LmRhdGVTdHlsZSB8fCAnbWVkaXVtJztcbiAgICBjb25zdCBsb2NhbGUgPSAob3B0aW9ucyBhcyBhbnkpPy5sb2NhbGUgfHwgJ2VuLVVTJztcblxuICAgIGNvbnN0IGNvbmZpZyA9IGRlZXBNZXJnZUNvbHVtbkNvbmZpZyhcbiAgICAgIERFRkFVTFRfQ09MVU1OX0NPTkZJRyxcbiAgICAgIHtcbiAgICAgICAga2V5LFxuICAgICAgICBoZWFkZXI6IGtleS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIGtleS5zbGljZSgxKSxcbiAgICAgICAgZGF0YVR5cGU6IENlbGxEYXRhVHlwZS5EQVRFLFxuICAgICAgICBmb3JtYXR0ZXI6IG5ldyBEYXRlRm9ybWF0dGVyKHsgZGF0ZVN0eWxlLCBsb2NhbGUgfSksXG4gICAgICAgIGVkaXRvcjogbmV3IERhdGVFZGl0b3IoKSxcbiAgICAgIH0sXG4gICAgICBvcHRpb25zIHx8IHt9XG4gICAgKTtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi5jb25maWcsXG4gICAgICBjcmVhdGVDZWxsKHJvd0RhdGE6IGFueSwgcm93SW5kZXg/OiBudW1iZXIpOiBDZWxsPERhdGU+IHtcbiAgICAgICAgY29uc3QgdmFsdWVHZXR0ZXIgPSBvcHRpb25zPy52YWx1ZUdldHRlciB8fCAoKGRhdGE6IGFueSkgPT4gZGF0YVtrZXldKTtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB2YWx1ZUdldHRlcihyb3dEYXRhKTtcbiAgICAgICAgcmV0dXJuIG5ldyBDZWxsKHRoaXMsIHZhbHVlLCByb3dEYXRhLCByb3dJbmRleCk7XG4gICAgICB9XG4gICAgfSBhcyBDb2x1bW5Db25maWc8RGF0ZT47XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgYm9vbGVhbiBjb2x1bW5cbiAgICovXG4gIHN0YXRpYyBib29sZWFuKGtleTogc3RyaW5nLCBvcHRpb25zPzogUGFydGlhbDxDb2x1bW5Db25maWc8Ym9vbGVhbj4+ICYge1xuICAgIHRydWVWYWx1ZT86IHN0cmluZztcbiAgICBmYWxzZVZhbHVlPzogc3RyaW5nO1xuICB9KTogQ29sdW1uQ29uZmlnPGJvb2xlYW4+IHtcbiAgICBjb25zdCB0cnVlVmFsdWUgPSAob3B0aW9ucyBhcyBhbnkpPy50cnVlVmFsdWUgfHwgJ1llcyc7XG4gICAgY29uc3QgZmFsc2VWYWx1ZSA9IChvcHRpb25zIGFzIGFueSk/LmZhbHNlVmFsdWUgfHwgJ05vJztcblxuICAgIGNvbnN0IGNvbmZpZyA9IGRlZXBNZXJnZUNvbHVtbkNvbmZpZyhcbiAgICAgIERFRkFVTFRfQ09MVU1OX0NPTkZJRyxcbiAgICAgIHtcbiAgICAgICAga2V5LFxuICAgICAgICBoZWFkZXI6IGtleS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIGtleS5zbGljZSgxKSxcbiAgICAgICAgZGF0YVR5cGU6IENlbGxEYXRhVHlwZS5CT09MRUFOLFxuICAgICAgICBmb3JtYXR0ZXI6IG5ldyBCb29sZWFuRm9ybWF0dGVyKHsgdHJ1ZVZhbHVlLCBmYWxzZVZhbHVlIH0pLFxuICAgICAgICBlZGl0b3I6IG5ldyBCb29sZWFuRWRpdG9yKCksXG4gICAgICB9LFxuICAgICAgb3B0aW9ucyB8fCB7fVxuICAgICk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uY29uZmlnLFxuICAgICAgY3JlYXRlQ2VsbChyb3dEYXRhOiBhbnksIHJvd0luZGV4PzogbnVtYmVyKTogQ2VsbDxib29sZWFuPiB7XG4gICAgICAgIGNvbnN0IHZhbHVlR2V0dGVyID0gb3B0aW9ucz8udmFsdWVHZXR0ZXIgfHwgKChkYXRhOiBhbnkpID0+IGRhdGFba2V5XSk7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdmFsdWVHZXR0ZXIocm93RGF0YSk7XG4gICAgICAgIHJldHVybiBuZXcgQ2VsbCh0aGlzLCB2YWx1ZSwgcm93RGF0YSwgcm93SW5kZXgpO1xuICAgICAgfVxuICAgIH0gYXMgQ29sdW1uQ29uZmlnPGJvb2xlYW4+O1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIHNlbGVjdC9kcm9wZG93biBjb2x1bW5cbiAgICovXG4gIHN0YXRpYyBzZWxlY3Q8VCA9IHN0cmluZz4oXG4gICAga2V5OiBzdHJpbmcsXG4gICAgc2VsZWN0T3B0aW9uczogQXJyYXk8eyB2YWx1ZTogVDsgbGFiZWw6IHN0cmluZyB9PixcbiAgICBvcHRpb25zPzogUGFydGlhbDxDb2x1bW5Db25maWc8VD4+XG4gICk6IENvbHVtbkNvbmZpZzxUPiB7XG4gICAgY29uc3QgY29uZmlnID0gZGVlcE1lcmdlQ29sdW1uQ29uZmlnKFxuICAgICAgREVGQVVMVF9DT0xVTU5fQ09ORklHLFxuICAgICAge1xuICAgICAgICBrZXksXG4gICAgICAgIGhlYWRlcjoga2V5LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsga2V5LnNsaWNlKDEpLFxuICAgICAgICBlZGl0b3I6IG5ldyBTZWxlY3RFZGl0b3IoeyBvcHRpb25zOiBzZWxlY3RPcHRpb25zIH0pLFxuICAgICAgfSxcbiAgICAgIG9wdGlvbnMgfHwge31cbiAgICApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmNvbmZpZyxcbiAgICAgIGNyZWF0ZUNlbGwocm93RGF0YTogYW55LCByb3dJbmRleD86IG51bWJlcik6IENlbGw8VD4ge1xuICAgICAgICBjb25zdCB2YWx1ZUdldHRlciA9IG9wdGlvbnM/LnZhbHVlR2V0dGVyIHx8ICgoZGF0YTogYW55KSA9PiBkYXRhW2tleV0pO1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHZhbHVlR2V0dGVyKHJvd0RhdGEpO1xuICAgICAgICByZXR1cm4gbmV3IENlbGwodGhpcywgdmFsdWUsIHJvd0RhdGEsIHJvd0luZGV4KTtcbiAgICAgIH1cbiAgICB9IGFzIENvbHVtbkNvbmZpZzxUPjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYW4gZW1haWwgY29sdW1uXG4gICAqL1xuICBzdGF0aWMgZW1haWwoa2V5OiBzdHJpbmcsIG9wdGlvbnM/OiBQYXJ0aWFsPENvbHVtbkNvbmZpZzxzdHJpbmc+Pik6IENvbHVtbkNvbmZpZzxzdHJpbmc+IHtcbiAgICBjb25zdCBjb25maWcgPSBkZWVwTWVyZ2VDb2x1bW5Db25maWcoXG4gICAgICBERUZBVUxUX0NPTFVNTl9DT05GSUcsXG4gICAgICB7XG4gICAgICAgIGtleSxcbiAgICAgICAgaGVhZGVyOiBrZXkuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBrZXkuc2xpY2UoMSksXG4gICAgICAgIGRhdGFUeXBlOiBDZWxsRGF0YVR5cGUuU1RSSU5HLFxuICAgICAgICBmb3JtYXR0ZXI6IG5ldyBTdHJpbmdGb3JtYXR0ZXIoKSxcbiAgICAgICAgdmFsaWRhdG9yOiBQYXR0ZXJuVmFsaWRhdG9ycy5lbWFpbCgpLFxuICAgICAgICBlZGl0b3I6IG5ldyBUZXh0RWRpdG9yKHsgcGxhY2Vob2xkZXI6ICdlbWFpbEBleGFtcGxlLmNvbScgfSksXG4gICAgICB9LFxuICAgICAgb3B0aW9ucyB8fCB7fVxuICAgICk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uY29uZmlnLFxuICAgICAgY3JlYXRlQ2VsbChyb3dEYXRhOiBhbnksIHJvd0luZGV4PzogbnVtYmVyKTogQ2VsbDxzdHJpbmc+IHtcbiAgICAgICAgY29uc3QgdmFsdWVHZXR0ZXIgPSBvcHRpb25zPy52YWx1ZUdldHRlciB8fCAoKGRhdGE6IGFueSkgPT4gZGF0YVtrZXldKTtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB2YWx1ZUdldHRlcihyb3dEYXRhKTtcbiAgICAgICAgcmV0dXJuIG5ldyBDZWxsKHRoaXMsIHZhbHVlLCByb3dEYXRhLCByb3dJbmRleCk7XG4gICAgICB9XG4gICAgfSBhcyBDb2x1bW5Db25maWc8c3RyaW5nPjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSByZWFkb25seSBjb2x1bW5cbiAgICovXG4gIHN0YXRpYyByZWFkb25seTxUID0gYW55PihrZXk6IHN0cmluZywgb3B0aW9ucz86IFBhcnRpYWw8Q29sdW1uQ29uZmlnPFQ+Pik6IENvbHVtbkNvbmZpZzxUPiB7XG4gICAgY29uc3QgY29uZmlnID0gZGVlcE1lcmdlQ29sdW1uQ29uZmlnKFxuICAgICAgREVGQVVMVF9DT0xVTU5fQ09ORklHLFxuICAgICAge1xuICAgICAgICBrZXksXG4gICAgICAgIGhlYWRlcjoga2V5LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsga2V5LnNsaWNlKDEpLFxuICAgICAgICBlZGl0YWJsZTogZmFsc2UsXG4gICAgICB9LFxuICAgICAgb3B0aW9ucyB8fCB7fVxuICAgICk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uY29uZmlnLFxuICAgICAgY3JlYXRlQ2VsbChyb3dEYXRhOiBhbnksIHJvd0luZGV4PzogbnVtYmVyKTogQ2VsbDxUPiB7XG4gICAgICAgIGNvbnN0IHZhbHVlR2V0dGVyID0gb3B0aW9ucz8udmFsdWVHZXR0ZXIgfHwgKChkYXRhOiBhbnkpID0+IGRhdGFba2V5XSk7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdmFsdWVHZXR0ZXIocm93RGF0YSk7XG4gICAgICAgIHJldHVybiBuZXcgQ2VsbCh0aGlzLCB2YWx1ZSwgcm93RGF0YSwgcm93SW5kZXgpO1xuICAgICAgfVxuICAgIH0gYXMgQ29sdW1uQ29uZmlnPFQ+O1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIGN1c3RvbSBjb2x1bW4gd2l0aCBmdWxsIGNvbnRyb2xcbiAgICovXG4gIHN0YXRpYyBjdXN0b208VCA9IGFueT4oY29uZmlnOiBQYXJ0aWFsPENvbHVtbkNvbmZpZzxUPj4gJiB7IGtleTogc3RyaW5nIH0pOiBDb2x1bW5Db25maWc8VD4ge1xuICAgIGlmICghY29uZmlnLmtleSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb2x1bW4ga2V5IGlzIHJlcXVpcmVkJyk7XG4gICAgfVxuXG4gICAgY29uc3QgbWVyZ2VkQ29uZmlnID0gZGVlcE1lcmdlQ29sdW1uQ29uZmlnKFxuICAgICAgREVGQVVMVF9DT0xVTU5fQ09ORklHLFxuICAgICAge1xuICAgICAgICBoZWFkZXI6IGNvbmZpZy5rZXkuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBjb25maWcua2V5LnNsaWNlKDEpLFxuICAgICAgfSxcbiAgICAgIGNvbmZpZ1xuICAgICk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4ubWVyZ2VkQ29uZmlnLFxuICAgICAgY3JlYXRlQ2VsbChyb3dEYXRhOiBhbnksIHJvd0luZGV4PzogbnVtYmVyKTogQ2VsbDxUPiB7XG4gICAgICAgIGNvbnN0IHZhbHVlR2V0dGVyID0gY29uZmlnLnZhbHVlR2V0dGVyIHx8ICgoZGF0YTogYW55KSA9PiBkYXRhW2NvbmZpZy5rZXldKTtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB2YWx1ZUdldHRlcihyb3dEYXRhKTtcbiAgICAgICAgcmV0dXJuIG5ldyBDZWxsKHRoaXMsIHZhbHVlLCByb3dEYXRhLCByb3dJbmRleCk7XG4gICAgICB9XG4gICAgfSBhcyBDb2x1bW5Db25maWc8VD47XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIG11bHRpcGxlIGNvbHVtbnMgYXQgb25jZSBmcm9tIGEgc2ltcGxlIGNvbmZpZ3VyYXRpb25cbiAgICovXG4gIHN0YXRpYyBmcm9tS2V5czxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55Pj4oXG4gICAga2V5czogQXJyYXk8a2V5b2YgVCB8IHsga2V5OiBrZXlvZiBUOyB0eXBlPzogJ3RleHQnIHwgJ251bWJlcicgfCAnZGF0ZScgfCAnYm9vbGVhbic7IG9wdGlvbnM/OiBhbnkgfT5cbiAgKTogQ29sdW1uQ29uZmlnPGFueT5bXSB7XG4gICAgcmV0dXJuIGtleXMubWFwKGtleUNvbmZpZyA9PiB7XG4gICAgICBpZiAodHlwZW9mIGtleUNvbmZpZyA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIGtleUNvbmZpZyA9PT0gJ251bWJlcicgfHwgdHlwZW9mIGtleUNvbmZpZyA9PT0gJ3N5bWJvbCcpIHtcbiAgICAgICAgcmV0dXJuIENvbHVtbkNvbmZpZ0ZhY3RvcnkudGV4dChTdHJpbmcoa2V5Q29uZmlnKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCB7IGtleSwgdHlwZSA9ICd0ZXh0Jywgb3B0aW9ucyA9IHt9IH0gPSBrZXlDb25maWc7XG4gICAgICAgIGNvbnN0IGtleVN0ciA9IFN0cmluZyhrZXkpO1xuICAgICAgICBcbiAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgICAgICAgIHJldHVybiBDb2x1bW5Db25maWdGYWN0b3J5Lm51bWJlcihrZXlTdHIsIG9wdGlvbnMpO1xuICAgICAgICAgIGNhc2UgJ2RhdGUnOlxuICAgICAgICAgICAgcmV0dXJuIENvbHVtbkNvbmZpZ0ZhY3RvcnkuZGF0ZShrZXlTdHIsIG9wdGlvbnMpO1xuICAgICAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgICAgICAgcmV0dXJuIENvbHVtbkNvbmZpZ0ZhY3RvcnkuYm9vbGVhbihrZXlTdHIsIG9wdGlvbnMpO1xuICAgICAgICAgIGNhc2UgJ3RleHQnOlxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gQ29sdW1uQ29uZmlnRmFjdG9yeS50ZXh0KGtleVN0ciwgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIENvbnZlbmllbmNlIGV4cG9ydHMgZm9yIGNvbW1vbiBjb2x1bW4gdHlwZXNcbiAqL1xuZXhwb3J0IGNvbnN0IENvbHVtbnMgPSBDb2x1bW5Db25maWdGYWN0b3J5O1xuXG4iXX0=