@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,206 @@
1
+ /**
2
+ * Column Editor Component
3
+ * Form-based column configuration
4
+ */
5
+ import { Component, Input, Output, EventEmitter } from '@angular/core';
6
+ import { Validators } from '@angular/forms';
7
+ import { CellDataType, CellAlignment, CellVerticalAlignment, EditMode } from '../../../models/cell-types';
8
+ import * as i0 from "@angular/core";
9
+ import * as i1 from "@angular/forms";
10
+ import * as i2 from "@angular/common";
11
+ export class ColumnEditorComponent {
12
+ constructor(fb) {
13
+ this.fb = fb;
14
+ this.columnUpdated = new EventEmitter();
15
+ this.cancel = new EventEmitter();
16
+ this.dataTypes = [
17
+ { value: CellDataType.STRING, label: 'Text' },
18
+ { value: CellDataType.NUMBER, label: 'Number' },
19
+ { value: CellDataType.DATE, label: 'Date' },
20
+ { value: CellDataType.BOOLEAN, label: 'Boolean' },
21
+ { value: CellDataType.CUSTOM, label: 'Custom' }
22
+ ];
23
+ this.alignments = [
24
+ { value: CellAlignment.LEFT, label: 'Left' },
25
+ { value: CellAlignment.CENTER, label: 'Center' },
26
+ { value: CellAlignment.RIGHT, label: 'Right' }
27
+ ];
28
+ this.verticalAlignments = [
29
+ { value: CellVerticalAlignment.TOP, label: 'Top' },
30
+ { value: CellVerticalAlignment.MIDDLE, label: 'Middle' },
31
+ { value: CellVerticalAlignment.BOTTOM, label: 'Bottom' }
32
+ ];
33
+ this.editModes = [
34
+ { value: EditMode.CLICK, label: 'Click' },
35
+ { value: EditMode.MANUAL, label: 'Manual' },
36
+ { value: EditMode.NONE, label: 'None' }
37
+ ];
38
+ this.stickyOptions = [
39
+ { value: false, label: 'None' },
40
+ { value: 'left', label: 'Left' },
41
+ { value: 'right', label: 'Right' }
42
+ ];
43
+ }
44
+ ngOnInit() {
45
+ this.buildForm();
46
+ }
47
+ ngOnChanges(changes) {
48
+ if (changes['column'] && !changes['column'].firstChange && this.form) {
49
+ this.updateForm();
50
+ }
51
+ }
52
+ /**
53
+ * Build the reactive form
54
+ */
55
+ buildForm() {
56
+ this.form = this.fb.group({
57
+ // Basic properties
58
+ key: [this.column.key, [Validators.required, Validators.pattern(/^[a-zA-Z_$][a-zA-Z0-9_$]*$/)]],
59
+ header: [this.column.header || ''],
60
+ dataType: [this.column.dataType || CellDataType.STRING],
61
+ // Feature flags
62
+ editable: [this.column.editable !== false],
63
+ sortable: [this.column.sortable !== false],
64
+ filterable: [this.column.filterable !== false],
65
+ resizable: [this.column.resizable !== false],
66
+ hideable: [this.column.hideable !== false],
67
+ movable: [this.column.movable !== false],
68
+ pinnable: [this.column.pinnable !== false],
69
+ enableMenu: [this.column.enableMenu !== false],
70
+ // Layout
71
+ width: [this.column.width || ''],
72
+ minWidth: [this.column.minWidth || ''],
73
+ maxWidth: [this.column.maxWidth || ''],
74
+ sticky: [this.column.sticky || false],
75
+ alignment: [this.column.alignment || CellAlignment.LEFT],
76
+ verticalAlignment: [this.column.verticalAlignment || CellVerticalAlignment.MIDDLE],
77
+ // Edit mode
78
+ editMode: [this.column.editMode || EditMode.CLICK],
79
+ // Display
80
+ visible: [this.column.visible !== false],
81
+ truncate: [this.column.truncate || false]
82
+ });
83
+ // Subscribe to hideable changes to enforce visible=true when hideable=false
84
+ this.form.get('hideable')?.valueChanges.subscribe(hideable => {
85
+ if (!hideable) {
86
+ this.form.get('visible')?.setValue(true, { emitEvent: false });
87
+ }
88
+ });
89
+ // Update form when column changes
90
+ this.updateForm();
91
+ }
92
+ /**
93
+ * Update form values from column
94
+ */
95
+ updateForm() {
96
+ if (!this.form || !this.column)
97
+ return;
98
+ this.form.patchValue({
99
+ key: this.column.key,
100
+ header: this.column.header || '',
101
+ dataType: this.column.dataType || CellDataType.STRING,
102
+ editable: this.column.editable !== false,
103
+ sortable: this.column.sortable !== false,
104
+ filterable: this.column.filterable !== false,
105
+ resizable: this.column.resizable !== false,
106
+ hideable: this.column.hideable !== false,
107
+ movable: this.column.movable !== false,
108
+ pinnable: this.column.pinnable !== false,
109
+ enableMenu: this.column.enableMenu !== false,
110
+ width: this.column.width || '',
111
+ minWidth: this.column.minWidth || '',
112
+ maxWidth: this.column.maxWidth || '',
113
+ sticky: this.column.sticky || false,
114
+ alignment: this.column.alignment || CellAlignment.LEFT,
115
+ verticalAlignment: this.column.verticalAlignment || CellVerticalAlignment.MIDDLE,
116
+ editMode: this.column.editMode || EditMode.CLICK,
117
+ visible: this.column.visible !== false,
118
+ truncate: this.column.truncate || false
119
+ }, { emitEvent: false });
120
+ }
121
+ /**
122
+ * Handle form submission
123
+ */
124
+ onSave() {
125
+ if (this.form.valid) {
126
+ const formValue = this.form.value;
127
+ const updates = {
128
+ key: formValue.key,
129
+ header: formValue.header || undefined,
130
+ dataType: formValue.dataType,
131
+ editable: formValue.editable,
132
+ sortable: formValue.sortable,
133
+ filterable: formValue.filterable,
134
+ resizable: formValue.resizable,
135
+ hideable: formValue.hideable,
136
+ movable: formValue.movable,
137
+ pinnable: formValue.pinnable,
138
+ enableMenu: formValue.enableMenu,
139
+ width: formValue.width || undefined,
140
+ minWidth: formValue.minWidth || undefined,
141
+ maxWidth: formValue.maxWidth || undefined,
142
+ sticky: formValue.sticky || undefined,
143
+ alignment: formValue.alignment,
144
+ verticalAlignment: formValue.verticalAlignment,
145
+ editMode: formValue.editMode,
146
+ visible: formValue.visible,
147
+ truncate: formValue.truncate
148
+ };
149
+ // Convert empty strings to undefined
150
+ Object.keys(updates).forEach(key => {
151
+ const value = updates[key];
152
+ if (value === '' || value === null) {
153
+ updates[key] = undefined;
154
+ }
155
+ });
156
+ this.columnUpdated.emit(updates);
157
+ }
158
+ else {
159
+ // Mark all fields as touched to show validation errors
160
+ Object.keys(this.form.controls).forEach(key => {
161
+ this.form.get(key)?.markAsTouched();
162
+ });
163
+ }
164
+ }
165
+ /**
166
+ * Handle cancel
167
+ */
168
+ onCancel() {
169
+ this.cancel.emit();
170
+ }
171
+ /**
172
+ * Get form control error message
173
+ */
174
+ getErrorMessage(controlName) {
175
+ const control = this.form.get(controlName);
176
+ if (control?.hasError('required')) {
177
+ return 'This field is required';
178
+ }
179
+ if (control?.hasError('pattern')) {
180
+ return 'Invalid format';
181
+ }
182
+ return '';
183
+ }
184
+ /**
185
+ * Check if form control has error
186
+ */
187
+ hasError(controlName) {
188
+ const control = this.form.get(controlName);
189
+ return !!(control && control.invalid && (control.dirty || control.touched));
190
+ }
191
+ }
192
+ ColumnEditorComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: ColumnEditorComponent, deps: [{ token: i1.FormBuilder }], target: i0.ɵɵFactoryTarget.Component });
193
+ ColumnEditorComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: ColumnEditorComponent, selector: "st-column-editor", inputs: { column: "column", columnIndex: "columnIndex" }, outputs: { columnUpdated: "columnUpdated", cancel: "cancel" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"column-editor\">\n <div class=\"editor-header\">\n <h3>Column Editor</h3>\n <div class=\"editor-actions\">\n <button class=\"btn btn-secondary\" (click)=\"onCancel()\">Cancel</button>\n <button class=\"btn btn-primary\" (click)=\"onSave()\">Save</button>\n </div>\n </div>\n\n <form [formGroup]=\"form\" class=\"editor-form\">\n <!-- Basic Properties -->\n <div class=\"form-section\">\n <h4>Basic Properties</h4>\n <div class=\"form-group\">\n <label for=\"key\">Key *</label>\n <input\n id=\"key\"\n type=\"text\"\n formControlName=\"key\"\n class=\"form-control\"\n [class.error]=\"hasError('key')\"\n placeholder=\"columnKey\">\n <span class=\"error-message\" *ngIf=\"hasError('key')\">\n {{ getErrorMessage('key') }}\n </span>\n </div>\n\n <div class=\"form-group\">\n <label for=\"header\">Header</label>\n <input\n id=\"header\"\n type=\"text\"\n formControlName=\"header\"\n class=\"form-control\"\n placeholder=\"Column Header\">\n </div>\n\n <div class=\"form-group\">\n <label for=\"dataType\">Data Type</label>\n <select id=\"dataType\" formControlName=\"dataType\" class=\"form-control\">\n <option *ngFor=\"let type of dataTypes\" [value]=\"type.value\">\n {{ type.label }}\n </option>\n </select>\n </div>\n </div>\n\n <!-- Features -->\n <div class=\"form-section\">\n <h4>Features</h4>\n <div class=\"checkbox-group\">\n <label class=\"checkbox-label\">\n <input type=\"checkbox\" formControlName=\"editable\">\n <span>Editable</span>\n </label>\n <label class=\"checkbox-label\">\n <input type=\"checkbox\" formControlName=\"sortable\">\n <span>Sortable</span>\n </label>\n <label class=\"checkbox-label\">\n <input type=\"checkbox\" formControlName=\"filterable\">\n <span>Filterable</span>\n </label>\n <label class=\"checkbox-label\">\n <input type=\"checkbox\" formControlName=\"resizable\">\n <span>Resizable</span>\n </label>\n <label class=\"checkbox-label\">\n <input type=\"checkbox\" formControlName=\"hideable\">\n <span>Hideable</span>\n </label>\n <label class=\"checkbox-label\">\n <input type=\"checkbox\" formControlName=\"movable\">\n <span>Movable</span>\n </label>\n <label class=\"checkbox-label\">\n <input type=\"checkbox\" formControlName=\"pinnable\">\n <span>Pinnable</span>\n </label>\n <label class=\"checkbox-label\">\n <input type=\"checkbox\" formControlName=\"enableMenu\">\n <span>Enable Menu</span>\n </label>\n </div>\n </div>\n\n <!-- Layout -->\n <div class=\"form-section\">\n <h4>Layout</h4>\n <div class=\"form-row\">\n <div class=\"form-group\">\n <label for=\"width\">Width</label>\n <input\n id=\"width\"\n type=\"text\"\n formControlName=\"width\"\n class=\"form-control\"\n placeholder=\"150 or 'auto'\">\n </div>\n <div class=\"form-group\">\n <label for=\"minWidth\">Min Width</label>\n <input\n id=\"minWidth\"\n type=\"number\"\n formControlName=\"minWidth\"\n class=\"form-control\"\n placeholder=\"50\">\n </div>\n <div class=\"form-group\">\n <label for=\"maxWidth\">Max Width</label>\n <input\n id=\"maxWidth\"\n type=\"number\"\n formControlName=\"maxWidth\"\n class=\"form-control\"\n placeholder=\"500\">\n </div>\n </div>\n\n <div class=\"form-row\">\n <div class=\"form-group\">\n <label for=\"sticky\">Sticky</label>\n <select id=\"sticky\" formControlName=\"sticky\" class=\"form-control\">\n <option *ngFor=\"let option of stickyOptions\" [value]=\"option.value\">\n {{ option.label }}\n </option>\n </select>\n </div>\n <div class=\"form-group\">\n <label for=\"alignment\">Alignment</label>\n <select id=\"alignment\" formControlName=\"alignment\" class=\"form-control\">\n <option *ngFor=\"let align of alignments\" [value]=\"align.value\">\n {{ align.label }}\n </option>\n </select>\n </div>\n <div class=\"form-group\">\n <label for=\"verticalAlignment\">Vertical Alignment</label>\n <select id=\"verticalAlignment\" formControlName=\"verticalAlignment\" class=\"form-control\">\n <option *ngFor=\"let align of verticalAlignments\" [value]=\"align.value\">\n {{ align.label }}\n </option>\n </select>\n </div>\n </div>\n </div>\n\n <!-- Edit Mode -->\n <div class=\"form-section\">\n <h4>Edit Mode</h4>\n <div class=\"form-group\">\n <label for=\"editMode\">Edit Trigger</label>\n <select id=\"editMode\" formControlName=\"editMode\" class=\"form-control\">\n <option *ngFor=\"let mode of editModes\" [value]=\"mode.value\">\n {{ mode.label }}\n </option>\n </select>\n </div>\n </div>\n\n <!-- Display -->\n <div class=\"form-section\">\n <h4>Display</h4>\n <div class=\"checkbox-group\">\n <label class=\"checkbox-label\" [class.disabled]=\"!form.get('hideable')?.value\">\n <input type=\"checkbox\" \n formControlName=\"visible\"\n [disabled]=\"!form.get('hideable')?.value\"\n [title]=\"!form.get('hideable')?.value ? 'Column visibility cannot be changed when hideable is disabled' : ''\">\n <span>Visible</span>\n </label>\n <label class=\"checkbox-label\">\n <input type=\"checkbox\" formControlName=\"truncate\">\n <span>Truncate Text</span>\n </label>\n </div>\n </div>\n </form>\n</div>\n\n", styles: [".column-editor{display:flex;flex-direction:column;height:100%}.editor-header{display:flex;justify-content:space-between;align-items:center;padding:1rem;border-bottom:1px solid #e0e0e0;background-color:#f8f8f8}.editor-header h3{margin:0;font-size:1.125rem;font-weight:600;color:#333}.editor-actions{display:flex;gap:.5rem}.btn{padding:.5rem 1rem;border:1px solid #d0d0d0;border-radius:4px;cursor:pointer;font-size:.875rem;transition:all .2s}.btn.btn-primary{background-color:#2196f3;color:#fff;border-color:#2196f3}.btn.btn-primary:hover{background-color:#1976d2;border-color:#1976d2}.btn.btn-secondary{background-color:#fff;color:#333}.btn.btn-secondary:hover{background-color:#f5f5f5}.editor-form{flex:1;overflow-y:auto;padding:1rem}.form-section{margin-bottom:2rem}.form-section h4{margin:0 0 1rem;font-size:.875rem;font-weight:600;color:#666;text-transform:uppercase;letter-spacing:.5px}.form-group{margin-bottom:1rem}.form-group label{display:block;margin-bottom:.5rem;font-size:.875rem;font-weight:500;color:#333}.form-control{width:100%;padding:.5rem;border:1px solid #d0d0d0;border-radius:4px;font-size:.875rem;transition:border-color .2s}.form-control:focus{outline:none;border-color:#2196f3}.form-control.error{border-color:#f44336}.form-row{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));grid-gap:1rem;gap:1rem}.checkbox-group{display:flex;row-gap:1rem;flex-wrap:wrap;gap:.75rem}.checkbox-label{display:flex;align-items:center;gap:.5rem;cursor:pointer;font-size:.875rem;color:#333}.checkbox-label input[type=checkbox]{width:18px;height:18px;cursor:pointer}.checkbox-label input[type=checkbox]:disabled{cursor:not-allowed;opacity:.5}.checkbox-label.disabled{opacity:.6;cursor:not-allowed}.checkbox-label.disabled span{color:#999}.error-message{display:block;margin-top:.25rem;font-size:.75rem;color:#f44336}\n"], directives: [{ type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { type: i1.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }] });
194
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: ColumnEditorComponent, decorators: [{
195
+ type: Component,
196
+ args: [{ selector: 'st-column-editor', template: "<div class=\"column-editor\">\n <div class=\"editor-header\">\n <h3>Column Editor</h3>\n <div class=\"editor-actions\">\n <button class=\"btn btn-secondary\" (click)=\"onCancel()\">Cancel</button>\n <button class=\"btn btn-primary\" (click)=\"onSave()\">Save</button>\n </div>\n </div>\n\n <form [formGroup]=\"form\" class=\"editor-form\">\n <!-- Basic Properties -->\n <div class=\"form-section\">\n <h4>Basic Properties</h4>\n <div class=\"form-group\">\n <label for=\"key\">Key *</label>\n <input\n id=\"key\"\n type=\"text\"\n formControlName=\"key\"\n class=\"form-control\"\n [class.error]=\"hasError('key')\"\n placeholder=\"columnKey\">\n <span class=\"error-message\" *ngIf=\"hasError('key')\">\n {{ getErrorMessage('key') }}\n </span>\n </div>\n\n <div class=\"form-group\">\n <label for=\"header\">Header</label>\n <input\n id=\"header\"\n type=\"text\"\n formControlName=\"header\"\n class=\"form-control\"\n placeholder=\"Column Header\">\n </div>\n\n <div class=\"form-group\">\n <label for=\"dataType\">Data Type</label>\n <select id=\"dataType\" formControlName=\"dataType\" class=\"form-control\">\n <option *ngFor=\"let type of dataTypes\" [value]=\"type.value\">\n {{ type.label }}\n </option>\n </select>\n </div>\n </div>\n\n <!-- Features -->\n <div class=\"form-section\">\n <h4>Features</h4>\n <div class=\"checkbox-group\">\n <label class=\"checkbox-label\">\n <input type=\"checkbox\" formControlName=\"editable\">\n <span>Editable</span>\n </label>\n <label class=\"checkbox-label\">\n <input type=\"checkbox\" formControlName=\"sortable\">\n <span>Sortable</span>\n </label>\n <label class=\"checkbox-label\">\n <input type=\"checkbox\" formControlName=\"filterable\">\n <span>Filterable</span>\n </label>\n <label class=\"checkbox-label\">\n <input type=\"checkbox\" formControlName=\"resizable\">\n <span>Resizable</span>\n </label>\n <label class=\"checkbox-label\">\n <input type=\"checkbox\" formControlName=\"hideable\">\n <span>Hideable</span>\n </label>\n <label class=\"checkbox-label\">\n <input type=\"checkbox\" formControlName=\"movable\">\n <span>Movable</span>\n </label>\n <label class=\"checkbox-label\">\n <input type=\"checkbox\" formControlName=\"pinnable\">\n <span>Pinnable</span>\n </label>\n <label class=\"checkbox-label\">\n <input type=\"checkbox\" formControlName=\"enableMenu\">\n <span>Enable Menu</span>\n </label>\n </div>\n </div>\n\n <!-- Layout -->\n <div class=\"form-section\">\n <h4>Layout</h4>\n <div class=\"form-row\">\n <div class=\"form-group\">\n <label for=\"width\">Width</label>\n <input\n id=\"width\"\n type=\"text\"\n formControlName=\"width\"\n class=\"form-control\"\n placeholder=\"150 or 'auto'\">\n </div>\n <div class=\"form-group\">\n <label for=\"minWidth\">Min Width</label>\n <input\n id=\"minWidth\"\n type=\"number\"\n formControlName=\"minWidth\"\n class=\"form-control\"\n placeholder=\"50\">\n </div>\n <div class=\"form-group\">\n <label for=\"maxWidth\">Max Width</label>\n <input\n id=\"maxWidth\"\n type=\"number\"\n formControlName=\"maxWidth\"\n class=\"form-control\"\n placeholder=\"500\">\n </div>\n </div>\n\n <div class=\"form-row\">\n <div class=\"form-group\">\n <label for=\"sticky\">Sticky</label>\n <select id=\"sticky\" formControlName=\"sticky\" class=\"form-control\">\n <option *ngFor=\"let option of stickyOptions\" [value]=\"option.value\">\n {{ option.label }}\n </option>\n </select>\n </div>\n <div class=\"form-group\">\n <label for=\"alignment\">Alignment</label>\n <select id=\"alignment\" formControlName=\"alignment\" class=\"form-control\">\n <option *ngFor=\"let align of alignments\" [value]=\"align.value\">\n {{ align.label }}\n </option>\n </select>\n </div>\n <div class=\"form-group\">\n <label for=\"verticalAlignment\">Vertical Alignment</label>\n <select id=\"verticalAlignment\" formControlName=\"verticalAlignment\" class=\"form-control\">\n <option *ngFor=\"let align of verticalAlignments\" [value]=\"align.value\">\n {{ align.label }}\n </option>\n </select>\n </div>\n </div>\n </div>\n\n <!-- Edit Mode -->\n <div class=\"form-section\">\n <h4>Edit Mode</h4>\n <div class=\"form-group\">\n <label for=\"editMode\">Edit Trigger</label>\n <select id=\"editMode\" formControlName=\"editMode\" class=\"form-control\">\n <option *ngFor=\"let mode of editModes\" [value]=\"mode.value\">\n {{ mode.label }}\n </option>\n </select>\n </div>\n </div>\n\n <!-- Display -->\n <div class=\"form-section\">\n <h4>Display</h4>\n <div class=\"checkbox-group\">\n <label class=\"checkbox-label\" [class.disabled]=\"!form.get('hideable')?.value\">\n <input type=\"checkbox\" \n formControlName=\"visible\"\n [disabled]=\"!form.get('hideable')?.value\"\n [title]=\"!form.get('hideable')?.value ? 'Column visibility cannot be changed when hideable is disabled' : ''\">\n <span>Visible</span>\n </label>\n <label class=\"checkbox-label\">\n <input type=\"checkbox\" formControlName=\"truncate\">\n <span>Truncate Text</span>\n </label>\n </div>\n </div>\n </form>\n</div>\n\n", styles: [".column-editor{display:flex;flex-direction:column;height:100%}.editor-header{display:flex;justify-content:space-between;align-items:center;padding:1rem;border-bottom:1px solid #e0e0e0;background-color:#f8f8f8}.editor-header h3{margin:0;font-size:1.125rem;font-weight:600;color:#333}.editor-actions{display:flex;gap:.5rem}.btn{padding:.5rem 1rem;border:1px solid #d0d0d0;border-radius:4px;cursor:pointer;font-size:.875rem;transition:all .2s}.btn.btn-primary{background-color:#2196f3;color:#fff;border-color:#2196f3}.btn.btn-primary:hover{background-color:#1976d2;border-color:#1976d2}.btn.btn-secondary{background-color:#fff;color:#333}.btn.btn-secondary:hover{background-color:#f5f5f5}.editor-form{flex:1;overflow-y:auto;padding:1rem}.form-section{margin-bottom:2rem}.form-section h4{margin:0 0 1rem;font-size:.875rem;font-weight:600;color:#666;text-transform:uppercase;letter-spacing:.5px}.form-group{margin-bottom:1rem}.form-group label{display:block;margin-bottom:.5rem;font-size:.875rem;font-weight:500;color:#333}.form-control{width:100%;padding:.5rem;border:1px solid #d0d0d0;border-radius:4px;font-size:.875rem;transition:border-color .2s}.form-control:focus{outline:none;border-color:#2196f3}.form-control.error{border-color:#f44336}.form-row{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));grid-gap:1rem;gap:1rem}.checkbox-group{display:flex;row-gap:1rem;flex-wrap:wrap;gap:.75rem}.checkbox-label{display:flex;align-items:center;gap:.5rem;cursor:pointer;font-size:.875rem;color:#333}.checkbox-label input[type=checkbox]{width:18px;height:18px;cursor:pointer}.checkbox-label input[type=checkbox]:disabled{cursor:not-allowed;opacity:.5}.checkbox-label.disabled{opacity:.6;cursor:not-allowed}.checkbox-label.disabled span{color:#999}.error-message{display:block;margin-top:.25rem;font-size:.75rem;color:#f44336}\n"] }]
197
+ }], ctorParameters: function () { return [{ type: i1.FormBuilder }]; }, propDecorators: { column: [{
198
+ type: Input
199
+ }], columnIndex: [{
200
+ type: Input
201
+ }], columnUpdated: [{
202
+ type: Output
203
+ }], cancel: [{
204
+ type: Output
205
+ }] } });
206
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sdW1uLWVkaXRvci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zbWFydC10YWJsZS9zcmMvbGliL2J1aWxkZXIvY29tcG9uZW50cy9jb2x1bW4tZWRpdG9yL2NvbHVtbi1lZGl0b3IuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc21hcnQtdGFibGUvc3JjL2xpYi9idWlsZGVyL2NvbXBvbmVudHMvY29sdW1uLWVkaXRvci9jb2x1bW4tZWRpdG9yLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQUVILE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQW9DLE1BQU0sZUFBZSxDQUFDO0FBQ3pHLE9BQU8sRUFBMEIsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFcEUsT0FBTyxFQUFFLFlBQVksRUFBRSxhQUFhLEVBQUUscUJBQXFCLEVBQUUsUUFBUSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7Ozs7QUFPMUcsTUFBTSxPQUFPLHFCQUFxQjtJQXlDaEMsWUFBb0IsRUFBZTtRQUFmLE9BQUUsR0FBRixFQUFFLENBQWE7UUFyQ3pCLGtCQUFhLEdBQUcsSUFBSSxZQUFZLEVBQXlCLENBQUM7UUFDMUQsV0FBTSxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFJbkMsY0FBUyxHQUFHO1lBQ25CLEVBQUUsS0FBSyxFQUFFLFlBQVksQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRTtZQUM3QyxFQUFFLEtBQUssRUFBRSxZQUFZLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUU7WUFDL0MsRUFBRSxLQUFLLEVBQUUsWUFBWSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFO1lBQzNDLEVBQUUsS0FBSyxFQUFFLFlBQVksQ0FB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bmVudFxuICogRm9ybS1iYXNlZCBjb2x1bW4gY29uZmlndXJhdGlvblxuICovXG5cbmltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBPbkluaXQsIE9uQ2hhbmdlcywgU2ltcGxlQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUJ1aWxkZXIsIEZvcm1Hcm91cCwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IENvbHVtbkNvbmZpZyB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9jb2x1bW4tY29uZmlnLmludGVyZmFjZSc7XG5pbXBvcnQgeyBDZWxsRGF0YVR5cGUsIENlbGxBbGlnbm1lbnQsIENlbGxWZXJ0aWNhbEFsaWdubWVudCwgRWRpdE1vZGUgfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvY2VsbC10eXBlcyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3N0LWNvbHVtbi1lZGl0b3InLFxuICB0ZW1wbGF0ZVVybDogJy4vY29sdW1uLWVkaXRvci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2NvbHVtbi1lZGl0b3IuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBDb2x1bW5FZGl0b3JDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XG4gIEBJbnB1dCgpIGNvbHVtbiE6IENvbHVtbkNvbmZpZztcbiAgQElucHV0KCkgY29sdW1uSW5kZXghOiBudW1iZXI7XG5cbiAgQE91dHB1dCgpIGNvbHVtblVwZGF0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPFBhcnRpYWw8Q29sdW1uQ29uZmlnPj4oKTtcbiAgQE91dHB1dCgpIGNhbmNlbCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICBmb3JtITogRm9ybUdyb3VwO1xuXG4gIHJlYWRvbmx5IGRhdGFUeXBlcyA9IFtcbiAgICB7IHZhbHVlOiBDZWxsRGF0YVR5cGUuU1RSSU5HLCBsYWJlbDogJ1RleHQnIH0sXG4gICAgeyB2YWx1ZTogQ2VsbERhdGFUeXBlLk5VTUJFUiwgbGFiZWw6ICdOdW1iZXInIH0sXG4gICAgeyB2YWx1ZTogQ2VsbERhdGFUeXBlLkRBVEUsIGxhYmVsOiAnRGF0ZScgfSxcbiAgICB7IHZhbHVlOiBDZWxsRGF0YVR5cGUuQk9PTEVBTiwgbGFiZWw6ICdCb29sZWFuJyB9LFxuICAgIHsgdmFsdWU6IENlbGxEYXRhVHlwZS5DVVNUT00sIGxhYmVsOiAnQ3VzdG9tJyB9XG4gIF07XG5cbiAgcmVhZG9ubHkgYWxpZ25tZW50cyA9IFtcbiAgICB7IHZhbHVlOiBDZWxsQWxpZ25tZW50LkxFRlQsIGxhYmVsOiAnTGVmdCcgfSxcbiAgICB7IHZhbHVlOiBDZWxsQWxpZ25tZW50LkNFTlRFUiwgbGFiZWw6ICdDZW50ZXInIH0sXG4gICAgeyB2YWx1ZTogQ2VsbEFsaWdubWVudC5SSUdIVCwgbGFiZWw6ICdSaWdodCcgfVxuICBdO1xuXG4gIHJlYWRvbmx5IHZlcnRpY2FsQWxpZ25tZW50cyA9IFtcbiAgICB7IHZhbHVlOiBDZWxsVmVydGljYWxBbGlnbm1lbnQuVE9QLCBsYWJlbDogJ1RvcCcgfSxcbiAgICB7IHZhbHVlOiBDZWxsVmVydGljYWxBbGlnbm1lbnQuTUlERExFLCBsYWJlbDogJ01pZGRsZScgfSxcbiAgICB7IHZhbHVlOiBDZWxsVmVydGljYWxBbGlnbm1lbnQuQk9UVE9NLCBsYWJlbDogJ0JvdHRvbScgfVxuICBdO1xuXG4gIHJlYWRvbmx5IGVkaXRNb2RlcyA9IFtcbiAgICB7IHZhbHVlOiBFZGl0TW9kZS5DTElDSywgbGFiZWw6ICdDbGljaycgfSxcbiAgICB7IHZhbHVlOiBFZGl0TW9kZS5NQU5VQUwsIGxhYmVsOiAnTWFudWFsJyB9LFxuICAgIHsgdmFsdWU6IEVkaXRNb2RlLk5PTkUsIGxhYmVsOiAnTm9uZScgfVxuICBdO1xuXG4gIHJlYWRvbmx5IHN0aWNreU9wdGlvbnMgPSBbXG4gICAgeyB2YWx1ZTogZmFsc2UsIGxhYmVsOiAnTm9uZScgfSxcbiAgICB7IHZhbHVlOiAnbGVmdCcsIGxhYmVsOiAnTGVmdCcgfSxcbiAgICB7IHZhbHVlOiAncmlnaHQnLCBsYWJlbDogJ1JpZ2h0JyB9XG4gIF07XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIpIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5idWlsZEZvcm0oKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1snY29sdW1uJ10gJiYgIWNoYW5nZXNbJ2NvbHVtbiddLmZpcnN0Q2hhbmdlICYmIHRoaXMuZm9ybSkge1xuICAgICAgdGhpcy51cGRhdGVGb3JtKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIHRoZSByZWFjdGl2ZSBmb3JtXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkRm9ybSgpOiB2b2lkIHtcbiAgICB0aGlzLmZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgIC8vIEJhc2ljIHByb3BlcnRpZXNcbiAgICAgIGtleTogW3RoaXMuY29sdW1uLmtleSwgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMucGF0dGVybigvXlthLXpBLVpfJF1bYS16QS1aMC05XyRdKiQvKV1dLFxuICAgICAgaGVhZGVyOiBbdGhpcy5jb2x1bW4uaGVhZGVyIHx8ICcnXSxcbiAgICAgIGRhdGFUeXBlOiBbdGhpcy5jb2x1bW4uZGF0YVR5cGUgfHwgQ2VsbERhdGFUeXBlLlNUUklOR10sXG5cbiAgICAgIC8vIEZlYXR1cmUgZmxhZ3NcbiAgICAgIGVkaXRhYmxlOiBbdGhpcy5jb2x1bW4uZWRpdGFibGUgIT09IGZhbHNlXSxcbiAgICAgIHNvcnRhYmxlOiBbdGhpcy5jb2x1bW4uc29ydGFibGUgIT09IGZhbHNlXSxcbiAgICAgIGZpbHRlcmFibGU6IFt0aGlzLmNvbHVtbi5maWx0ZXJhYmxlICE9PSBmYWxzZV0sXG4gICAgICByZXNpemFibGU6IFt0aGlzLmNvbHVtbi5yZXNpemFibGUgIT09IGZhbHNlXSxcbiAgICAgIGhpZGVhYmxlOiBbdGhpcy5jb2x1bW4uaGlkZWFibGUgIT09IGZhbHNlXSxcbiAgICAgIG1vdmFibGU6IFt0aGlzLmNvbHVtbi5tb3ZhYmxlICE9PSBmYWxzZV0sXG4gICAgICBwaW5uYWJsZTogW3RoaXMuY29sdW1uLnBpbm5hYmxlICE9PSBmYWxzZV0sXG4gICAgICBlbmFibGVNZW51OiBbdGhpcy5jb2x1bW4uZW5hYmxlTWVudSAhPT0gZmFsc2VdLFxuXG4gICAgICAvLyBMYXlvdXRcbiAgICAgIHdpZHRoOiBbdGhpcy5jb2x1bW4ud2lkdGggfHwgJyddLFxuICAgICAgbWluV2lkdGg6IFt0aGlzLmNvbHVtbi5taW5XaWR0aCB8fCAnJ10sXG4gICAgICBtYXhXaWR0aDogW3RoaXMuY29sdW1uLm1heFdpZHRoIHx8ICcnXSxcbiAgICAgIHN0aWNreTogW3RoaXMuY29sdW1uLnN0aWNreSB8fCBmYWxzZV0sXG4gICAgICBhbGlnbm1lbnQ6IFt0aGlzLmNvbHVtbi5hbGlnbm1lbnQgfHwgQ2VsbEFsaWdubWVudC5MRUZUXSxcbiAgICAgIHZlcnRpY2FsQWxpZ25tZW50OiBbdGhpcy5jb2x1bW4udmVydGljYWxBbGlnbm1lbnQgfHwgQ2VsbFZlcnRpY2FsQWxpZ25tZW50Lk1JRERMRV0sXG5cbiAgICAgIC8vIEVkaXQgbW9kZVxuICAgICAgZWRpdE1vZGU6IFt0aGlzLmNvbHVtbi5lZGl0TW9kZSB8fCBFZGl0TW9kZS5DTElDS10sXG5cbiAgICAgIC8vIERpc3BsYXlcbiAgICAgIHZpc2libGU6IFt0aGlzLmNvbHVtbi52aXNpYmxlICE9PSBmYWxzZV0sXG4gICAgICB0cnVuY2F0ZTogW3RoaXMuY29sdW1uLnRydW5jYXRlIHx8IGZhbHNlXVxuICAgIH0pO1xuXG4gICAgLy8gU3Vic2NyaWJlIHRvIGhpZGVhYmxlIGNoYW5nZXMgdG8gZW5mb3JjZSB2aXNpYmxlPXRydWUgd2hlbiBoaWRlYWJsZT1mYWxzZVxuICAgIHRoaXMuZm9ybS5nZXQoJ2hpZGVhYmxlJyk/LnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoaGlkZWFibGUgPT4ge1xuICAgICAgaWYgKCFoaWRlYWJsZSkge1xuICAgICAgICB0aGlzLmZvcm0uZ2V0KCd2aXNpYmxlJyk/LnNldFZhbHVlKHRydWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIFVwZGF0ZSBmb3JtIHdoZW4gY29sdW1uIGNoYW5nZXNcbiAgICB0aGlzLnVwZGF0ZUZvcm0oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgZm9ybSB2YWx1ZXMgZnJvbSBjb2x1bW5cbiAgICovXG4gIHByaXZhdGUgdXBkYXRlRm9ybSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZm9ybSB8fCAhdGhpcy5jb2x1bW4pIHJldHVybjtcblxuICAgIHRoaXMuZm9ybS5wYXRjaFZhbHVlKHtcbiAgICAgIGtleTogdGhpcy5jb2x1bW4ua2V5LFxuICAgICAgaGVhZGVyOiB0aGlzLmNvbHVtbi5oZWFkZXIgfHwgJycsXG4gICAgICBkYXRhVHlwZTogdGhpcy5jb2x1bW4uZGF0YVR5cGUgfHwgQ2VsbERhdGFUeXBlLlNUUklORyxcbiAgICAgIGVkaXRhYmxlOiB0aGlzLmNvbHVtbi5lZGl0YWJsZSAhPT0gZmFsc2UsXG4gICAgICBzb3J0YWJsZTogdGhpcy5jb2x1bW4uc29ydGFibGUgIT09IGZhbHNlLFxuICAgICAgZmlsdGVyYWJsZTogdGhpcy5jb2x1bW4uZmlsdGVyYWJsZSAhPT0gZmFsc2UsXG4gICAgICByZXNpemFibGU6IHRoaXMuY29sdW1uLnJlc2l6YWJsZSAhPT0gZmFsc2UsXG4gICAgICBoaWRlYWJsZTogdGhpcy5jb2x1bW4uaGlkZWFibGUgIT09IGZhbHNlLFxuICAgICAgbW92YWJsZTogdGhpcy5jb2x1bW4ubW92YWJsZSAhPT0gZmFsc2UsXG4gICAgICBwaW5uYWJsZTogdGhpcy5jb2x1bW4ucGlubmFibGUgIT09IGZhbHNlLFxuICAgICAgZW5hYmxlTWVudTogdGhpcy5jb2x1bW4uZW5hYmxlTWVudSAhPT0gZmFsc2UsXG4gICAgICB3aWR0aDogdGhpcy5jb2x1bW4ud2lkdGggfHwgJycsXG4gICAgICBtaW5XaWR0aDogdGhpcy5jb2x1bW4ubWluV2lkdGggfHwgJycsXG4gICAgICBtYXhXaWR0aDogdGhpcy5jb2x1bW4ubWF4V2lkdGggfHwgJycsXG4gICAgICBzdGlja3k6IHRoaXMuY29sdW1uLnN0aWNreSB8fCBmYWxzZSxcbiAgICAgIGFsaWdubWVudDogdGhpcy5jb2x1bW4uYWxpZ25tZW50IHx8IENlbGxBbGlnbm1lbnQuTEVGVCxcbiAgICAgIHZlcnRpY2FsQWxpZ25tZW50OiB0aGlzLmNvbHVtbi52ZXJ0aWNhbEFsaWdubWVudCB8fCBDZWxsVmVydGljYWxBbGlnbm1lbnQuTUlERExFLFxuICAgICAgZWRpdE1vZGU6IHRoaXMuY29sdW1uLmVkaXRNb2RlIHx8IEVkaXRNb2RlLkNMSUNLLFxuICAgICAgdmlzaWJsZTogdGhpcy5jb2x1bW4udmlzaWJsZSAhPT0gZmFsc2UsXG4gICAgICB0cnVuY2F0ZTogdGhpcy5jb2x1bW4udHJ1bmNhdGUgfHwgZmFsc2VcbiAgICB9LCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIGZvcm0gc3VibWlzc2lvblxuICAgKi9cbiAgb25TYXZlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmZvcm0udmFsaWQpIHtcbiAgICAgIGNvbnN0IGZvcm1WYWx1ZSA9IHRoaXMuZm9ybS52YWx1ZTtcbiAgICAgIGNvbnN0IHVwZGF0ZXM6IFBhcnRpYWw8Q29sdW1uQ29uZmlnPiA9IHtcbiAgICAgICAga2V5OiBmb3JtVmFsdWUua2V5LFxuICAgICAgICBoZWFkZXI6IGZvcm1WYWx1ZS5oZWFkZXIgfHwgdW5kZWZpbmVkLFxuICAgICAgICBkYXRhVHlwZTogZm9ybVZhbHVlLmRhdGFUeXBlLFxuICAgICAgICBlZGl0YWJsZTogZm9ybVZhbHVlLmVkaXRhYmxlLFxuICAgICAgICBzb3J0YWJsZTogZm9ybVZhbHVlLnNvcnRhYmxlLFxuICAgICAgICBmaWx0ZXJhYmxlOiBmb3JtVmFsdWUuZmlsdGVyYWJsZSxcbiAgICAgICAgcmVzaXphYmxlOiBmb3JtVmFsdWUucmVzaXphYmxlLFxuICAgICAgICBoaWRlYWJsZTogZm9ybVZhbHVlLmhpZGVhYmxlLFxuICAgICAgICBtb3ZhYmxlOiBmb3JtVmFsdWUubW92YWJsZSxcbiAgICAgICAgcGlubmFibGU6IGZvcm1WYWx1ZS5waW5uYWJsZSxcbiAgICAgICAgZW5hYmxlTWVudTogZm9ybVZhbHVlLmVuYWJsZU1lbnUsXG4gICAgICAgIHdpZHRoOiBmb3JtVmFsdWUud2lkdGggfHwgdW5kZWZpbmVkLFxuICAgICAgICBtaW5XaWR0aDogZm9ybVZhbHVlLm1pbldpZHRoIHx8IHVuZGVmaW5lZCxcbiAgICAgICAgbWF4V2lkdGg6IGZvcm1WYWx1ZS5tYXhXaWR0aCB8fCB1bmRlZmluZWQsXG4gICAgICAgIHN0aWNreTogZm9ybVZhbHVlLnN0aWNreSB8fCB1bmRlZmluZWQsXG4gICAgICAgIGFsaWdubWVudDogZm9ybVZhbHVlLmFsaWdubWVudCxcbiAgICAgICAgdmVydGljYWxBbGlnbm1lbnQ6IGZvcm1WYWx1ZS52ZXJ0aWNhbEFsaWdubWVudCxcbiAgICAgICAgZWRpdE1vZGU6IGZvcm1WYWx1ZS5lZGl0TW9kZSxcbiAgICAgICAgdmlzaWJsZTogZm9ybVZhbHVlLnZpc2libGUsXG4gICAgICAgIHRydW5jYXRlOiBmb3JtVmFsdWUudHJ1bmNhdGVcbiAgICAgIH07XG5cbiAgICAgIC8vIENvbnZlcnQgZW1wdHkgc3RyaW5ncyB0byB1bmRlZmluZWRcbiAgICAgIE9iamVjdC5rZXlzKHVwZGF0ZXMpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSAodXBkYXRlcyBhcyBhbnkpW2tleV07XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gJycgfHwgdmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgICAodXBkYXRlcyBhcyBhbnkpW2tleV0gPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLmNvbHVtblVwZGF0ZWQuZW1pdCh1cGRhdGVzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTWFyayBhbGwgZmllbGRzIGFzIHRvdWNoZWQgdG8gc2hvdyB2YWxpZGF0aW9uIGVycm9yc1xuICAgICAgT2JqZWN0LmtleXModGhpcy5mb3JtLmNvbnRyb2xzKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgIHRoaXMuZm9ybS5nZXQoa2V5KT8ubWFya0FzVG91Y2hlZCgpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBjYW5jZWxcbiAgICovXG4gIG9uQ2FuY2VsKCk6IHZvaWQge1xuICAgIHRoaXMuY2FuY2VsLmVtaXQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgZm9ybSBjb250cm9sIGVycm9yIG1lc3NhZ2VcbiAgICovXG4gIGdldEVycm9yTWVzc2FnZShjb250cm9sTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBjb250cm9sID0gdGhpcy5mb3JtLmdldChjb250cm9sTmFtZSk7XG4gICAgaWYgKGNvbnRyb2w/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpKSB7XG4gICAgICByZXR1cm4gJ1RoaXMgZmllbGQgaXMgcmVxdWlyZWQnO1xuICAgIH1cbiAgICBpZiAoY29udHJvbD8uaGFzRXJyb3IoJ3BhdHRlcm4nKSkge1xuICAgICAgcmV0dXJuICdJbnZhbGlkIGZvcm1hdCc7XG4gICAgfVxuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBmb3JtIGNvbnRyb2wgaGFzIGVycm9yXG4gICAqL1xuICBoYXNFcnJvcihjb250cm9sTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3QgY29udHJvbCA9IHRoaXMuZm9ybS5nZXQoY29udHJvbE5hbWUpO1xuICAgIHJldHVybiAhIShjb250cm9sICYmIGNvbnRyb2wuaW52YWxpZCAmJiAoY29udHJvbC5kaXJ0eSB8fCBjb250cm9sLnRvdWNoZWQpKTtcbiAgfVxufVxuXG4iLCI8ZGl2IGNsYXNzPVwiY29sdW1uLWVkaXRvclwiPlxuICA8ZGl2IGNsYXNzPVwiZWRpdG9yLWhlYWRlclwiPlxuICAgIDxoMz5Db2x1bW4gRWRpdG9yPC9oMz5cbiAgICA8ZGl2IGNsYXNzPVwiZWRpdG9yLWFjdGlvbnNcIj5cbiAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXNlY29uZGFyeVwiIChjbGljayk9XCJvbkNhbmNlbCgpXCI+Q2FuY2VsPC9idXR0b24+XG4gICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCIgKGNsaWNrKT1cIm9uU2F2ZSgpXCI+U2F2ZTwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8Zm9ybSBbZm9ybUdyb3VwXT1cImZvcm1cIiBjbGFzcz1cImVkaXRvci1mb3JtXCI+XG4gICAgPCEtLSBCYXNpYyBQcm9wZXJ0aWVzIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJmb3JtLXNlY3Rpb25cIj5cbiAgICAgIDxoND5CYXNpYyBQcm9wZXJ0aWVzPC9oND5cbiAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XG4gICAgICAgIDxsYWJlbCBmb3I9XCJrZXlcIj5LZXkgKjwvbGFiZWw+XG4gICAgICAgIDxpbnB1dFxuICAgICAgICAgIGlkPVwia2V5XCJcbiAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwia2V5XCJcbiAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgW2NsYXNzLmVycm9yXT1cImhhc0Vycm9yKCdrZXknKVwiXG4gICAgICAgICAgcGxhY2Vob2xkZXI9XCJjb2x1bW5LZXlcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJlcnJvci1tZXNzYWdlXCIgKm5nSWY9XCJoYXNFcnJvcigna2V5JylcIj5cbiAgICAgICAgICB7eyBnZXRFcnJvck1lc3NhZ2UoJ2tleScpIH19XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuICAgICAgICA8bGFiZWwgZm9yPVwiaGVhZGVyXCI+SGVhZGVyPC9sYWJlbD5cbiAgICAgICAgPGlucHV0XG4gICAgICAgICAgaWQ9XCJoZWFkZXJcIlxuICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJoZWFkZXJcIlxuICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgICBwbGFjZWhvbGRlcj1cIkNvbHVtbiBIZWFkZXJcIj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuICAgICAgICA8bGFiZWwgZm9yPVwiZGF0YVR5cGVcIj5EYXRhIFR5cGU8L2xhYmVsPlxuICAgICAgICA8c2VsZWN0IGlkPVwiZGF0YVR5cGVcIiBmb3JtQ29udHJvbE5hbWU9XCJkYXRhVHlwZVwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCI+XG4gICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgdHlwZSBvZiBkYXRhVHlwZXNcIiBbdmFsdWVdPVwidHlwZS52YWx1ZVwiPlxuICAgICAgICAgICAge3sgdHlwZS5sYWJlbCB9fVxuICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICA8L3NlbGVjdD5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBGZWF0dXJlcyAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiZm9ybS1zZWN0aW9uXCI+XG4gICAgICA8aDQ+RmVhdHVyZXM8L2g0PlxuICAgICAgPGRpdiBjbGFzcz1cImNoZWNrYm94LWdyb3VwXCI+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImNoZWNrYm94LWxhYmVsXCI+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGZvcm1Db250cm9sTmFtZT1cImVkaXRhYmxlXCI+XG4gICAgICAgICAgPHNwYW4+RWRpdGFibGU8L3NwYW4+XG4gICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImNoZWNrYm94LWxhYmVsXCI+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGZvcm1Db250cm9sTmFtZT1cInNvcnRhYmxlXCI+XG4gICAgICAgICAgPHNwYW4+U29ydGFibGU8L3NwYW4+XG4gICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImNoZWNrYm94LWxhYmVsXCI+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGZvcm1Db250cm9sTmFtZT1cImZpbHRlcmFibGVcIj5cbiAgICAgICAgICA8c3Bhbj5GaWx0ZXJhYmxlPC9zcGFuPlxuICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJjaGVja2JveC1sYWJlbFwiPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBmb3JtQ29udHJvbE5hbWU9XCJyZXNpemFibGVcIj5cbiAgICAgICAgICA8c3Bhbj5SZXNpemFibGU8L3NwYW4+XG4gICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImNoZWNrYm94LWxhYmVsXCI+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGZvcm1Db250cm9sTmFtZT1cImhpZGVhYmxlXCI+XG4gICAgICAgICAgPHNwYW4+SGlkZWFibGU8L3NwYW4+XG4gICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImNoZWNrYm94LWxhYmVsXCI+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGZvcm1Db250cm9sTmFtZT1cIm1vdmFibGVcIj5cbiAgICAgICAgICA8c3Bhbj5Nb3ZhYmxlPC9zcGFuPlxuICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJjaGVja2JveC1sYWJlbFwiPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBmb3JtQ29udHJvbE5hbWU9XCJwaW5uYWJsZVwiPlxuICAgICAgICAgIDxzcGFuPlBpbm5hYmxlPC9zcGFuPlxuICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJjaGVja2JveC1sYWJlbFwiPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBmb3JtQ29udHJvbE5hbWU9XCJlbmFibGVNZW51XCI+XG4gICAgICAgICAgPHNwYW4+RW5hYmxlIE1lbnU8L3NwYW4+XG4gICAgICAgIDwvbGFiZWw+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gTGF5b3V0IC0tPlxuICAgIDxkaXYgY2xhc3M9XCJmb3JtLXNlY3Rpb25cIj5cbiAgICAgIDxoND5MYXlvdXQ8L2g0PlxuICAgICAgPGRpdiBjbGFzcz1cImZvcm0tcm93XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XG4gICAgICAgICAgPGxhYmVsIGZvcj1cIndpZHRoXCI+V2lkdGg8L2xhYmVsPlxuICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgaWQ9XCJ3aWR0aFwiXG4gICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJ3aWR0aFwiXG4gICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cIjE1MCBvciAnYXV0bydcIj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XG4gICAgICAgICAgPGxhYmVsIGZvcj1cIm1pbldpZHRoXCI+TWluIFdpZHRoPC9sYWJlbD5cbiAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgIGlkPVwibWluV2lkdGhcIlxuICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXG4gICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJtaW5XaWR0aFwiXG4gICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cIjUwXCI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuICAgICAgICAgIDxsYWJlbCBmb3I9XCJtYXhXaWR0aFwiPk1heCBXaWR0aDwvbGFiZWw+XG4gICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICBpZD1cIm1heFdpZHRoXCJcbiAgICAgICAgICAgIHR5cGU9XCJudW1iZXJcIlxuICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwibWF4V2lkdGhcIlxuICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCI1MDBcIj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cImZvcm0tcm93XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XG4gICAgICAgICAgPGxhYmVsIGZvcj1cInN0aWNreVwiPlN0aWNreTwvbGFiZWw+XG4gICAgICAgICAgPHNlbGVjdCBpZD1cInN0aWNreVwiIGZvcm1Db250cm9sTmFtZT1cInN0aWNreVwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCI+XG4gICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBvcHRpb24gb2Ygc3RpY2t5T3B0aW9uc1wiIFt2YWx1ZV09XCJvcHRpb24udmFsdWVcIj5cbiAgICAgICAgICAgICAge3sgb3B0aW9uLmxhYmVsIH19XG4gICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XG4gICAgICAgICAgPGxhYmVsIGZvcj1cImFsaWdubWVudFwiPkFsaWdubWVudDwvbGFiZWw+XG4gICAgICAgICAgPHNlbGVjdCBpZD1cImFsaWdubWVudFwiIGZvcm1Db250cm9sTmFtZT1cImFsaWdubWVudFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCI+XG4gICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBhbGlnbiBvZiBhbGlnbm1lbnRzXCIgW3ZhbHVlXT1cImFsaWduLnZhbHVlXCI+XG4gICAgICAgICAgICAgIHt7IGFsaWduLmxhYmVsIH19XG4gICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XG4gICAgICAgICAgPGxhYmVsIGZvcj1cInZlcnRpY2FsQWxpZ25tZW50XCI+VmVydGljYWwgQWxpZ25tZW50PC9sYWJlbD5cbiAgICAgICAgICA8c2VsZWN0IGlkPVwidmVydGljYWxBbGlnbm1lbnRcIiBmb3JtQ29udHJvbE5hbWU9XCJ2ZXJ0aWNhbEFsaWdubWVudFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCI+XG4gICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBhbGlnbiBvZiB2ZXJ0aWNhbEFsaWdubWVudHNcIiBbdmFsdWVdPVwiYWxpZ24udmFsdWVcIj5cbiAgICAgICAgICAgICAge3sgYWxpZ24ubGFiZWwgfX1cbiAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBFZGl0IE1vZGUgLS0+XG4gICAgPGRpdiBjbGFzcz1cImZvcm0tc2VjdGlvblwiPlxuICAgICAgPGg0PkVkaXQgTW9kZTwvaDQ+XG4gICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuICAgICAgICA8bGFiZWwgZm9yPVwiZWRpdE1vZGVcIj5FZGl0IFRyaWdnZXI8L2xhYmVsPlxuICAgICAgICA8c2VsZWN0IGlkPVwiZWRpdE1vZGVcIiBmb3JtQ29udHJvbE5hbWU9XCJlZGl0TW9kZVwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCI+XG4gICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgbW9kZSBvZiBlZGl0TW9kZXNcIiBbdmFsdWVdPVwibW9kZS52YWx1ZVwiPlxuICAgICAgICAgICAge3sgbW9kZS5sYWJlbCB9fVxuICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICA8L3NlbGVjdD5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBEaXNwbGF5IC0tPlxuICAgIDxkaXYgY2xhc3M9XCJmb3JtLXNlY3Rpb25cIj5cbiAgICAgIDxoND5EaXNwbGF5PC9oND5cbiAgICAgIDxkaXYgY2xhc3M9XCJjaGVja2JveC1ncm91cFwiPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJjaGVja2JveC1sYWJlbFwiIFtjbGFzcy5kaXNhYmxlZF09XCIhZm9ybS5nZXQoJ2hpZGVhYmxlJyk/LnZhbHVlXCI+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIFxuICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJ2aXNpYmxlXCJcbiAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFmb3JtLmdldCgnaGlkZWFibGUnKT8udmFsdWVcIlxuICAgICAgICAgICAgICAgICBbdGl0bGVdPVwiIWZvcm0uZ2V0KCdoaWRlYWJsZScpPy52YWx1ZSA/ICdDb2x1bW4gdmlzaWJpbGl0eSBjYW5ub3QgYmUgY2hhbmdlZCB3aGVuIGhpZGVhYmxlIGlzIGRpc2FibGVkJyA6ICcnXCI+XG4gICAgICAgICAgPHNwYW4+VmlzaWJsZTwvc3Bhbj5cbiAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPGxhYmVsIGNsYXNzPVwiY2hlY2tib3gtbGFiZWxcIj5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgZm9ybUNvbnRyb2xOYW1lPVwidHJ1bmNhdGVcIj5cbiAgICAgICAgICA8c3Bhbj5UcnVuY2F0ZSBUZXh0PC9zcGFuPlxuICAgICAgICA8L2xhYmVsPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZm9ybT5cbjwvZGl2PlxuXG4iXX0=
@@ -0,0 +1,125 @@
1
+ /**
2
+ * Column List Component
3
+ * Displays and manages columns
4
+ */
5
+ import { Component, Input, Output, EventEmitter } from '@angular/core';
6
+ import { CellDataType } from '../../../models/cell-types';
7
+ import * as i0 from "@angular/core";
8
+ import * as i1 from "../../../renderer/directives/click-outside.directive";
9
+ import * as i2 from "@angular/common";
10
+ export class ColumnListComponent {
11
+ constructor() {
12
+ this.columns = [];
13
+ this.selectedIndex = null;
14
+ this.columnSelected = new EventEmitter();
15
+ this.columnAdded = new EventEmitter();
16
+ this.columnDeleted = new EventEmitter();
17
+ this.columnReordered = new EventEmitter();
18
+ this.showAddMenu = false;
19
+ this.draggedIndex = null;
20
+ this.dragOverIndex = null;
21
+ this.dataTypes = [
22
+ { value: CellDataType.STRING, label: 'Text' },
23
+ { value: CellDataType.NUMBER, label: 'Number' },
24
+ { value: CellDataType.DATE, label: 'Date' },
25
+ { value: CellDataType.BOOLEAN, label: 'Boolean' }
26
+ ];
27
+ }
28
+ /**
29
+ * Handle column click
30
+ */
31
+ onColumnClick(index) {
32
+ this.columnSelected.emit(index);
33
+ }
34
+ /**
35
+ * Handle delete button click
36
+ */
37
+ onDelete(index, event) {
38
+ event.stopPropagation();
39
+ if (confirm(`Are you sure you want to delete column "${this.columns[index].header || this.columns[index].key}"?`)) {
40
+ this.columnDeleted.emit(index);
41
+ }
42
+ }
43
+ /**
44
+ * Handle add column button click
45
+ */
46
+ onAddColumn(type) {
47
+ this.showAddMenu = false;
48
+ this.columnAdded.emit(type);
49
+ }
50
+ closeMenu() {
51
+ this.showAddMenu = false;
52
+ }
53
+ /**
54
+ * Handle drag start
55
+ */
56
+ onDragStart(event, index) {
57
+ this.draggedIndex = index;
58
+ if (event.dataTransfer) {
59
+ event.dataTransfer.effectAllowed = 'move';
60
+ event.dataTransfer.setData('text/html', '');
61
+ }
62
+ }
63
+ /**
64
+ * Handle drag over
65
+ */
66
+ onDragOver(event, index) {
67
+ event.preventDefault();
68
+ if (event.dataTransfer) {
69
+ event.dataTransfer.dropEffect = 'move';
70
+ }
71
+ this.dragOverIndex = index;
72
+ }
73
+ /**
74
+ * Handle drop
75
+ */
76
+ onDrop(event, dropIndex) {
77
+ event.preventDefault();
78
+ if (this.draggedIndex !== null && this.draggedIndex !== dropIndex) {
79
+ this.columnReordered.emit({
80
+ fromIndex: this.draggedIndex,
81
+ toIndex: dropIndex
82
+ });
83
+ }
84
+ this.draggedIndex = null;
85
+ }
86
+ /**
87
+ * Handle drag end
88
+ */
89
+ onDragEnd(event) {
90
+ this.draggedIndex = null;
91
+ this.dragOverIndex = null;
92
+ }
93
+ /**
94
+ * Get display name for column
95
+ */
96
+ getColumnDisplayName(column) {
97
+ return column.header || column.key;
98
+ }
99
+ /**
100
+ * Get data type label
101
+ */
102
+ getDataTypeLabel(column) {
103
+ const type = this.dataTypes.find(dt => dt.value === column.dataType);
104
+ return type?.label || 'Text';
105
+ }
106
+ }
107
+ ColumnListComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: ColumnListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
108
+ ColumnListComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: ColumnListComponent, selector: "st-column-list", inputs: { columns: "columns", selectedIndex: "selectedIndex" }, outputs: { columnSelected: "columnSelected", columnAdded: "columnAdded", columnDeleted: "columnDeleted", columnReordered: "columnReordered" }, ngImport: i0, template: "<div class=\"column-list\" (clickOutside)=\"closeMenu()\">\n <div class=\"column-list-header\">\n <h3>Columns</h3>\n <div class=\"add-column-menu\" [class.open]=\"showAddMenu\">\n <button class=\"add-btn\" (click)=\"showAddMenu = !showAddMenu\" title=\"Add Column\">\n <span>+ Add Column</span>\n </button>\n <div class=\"add-menu\" *ngIf=\"showAddMenu\">\n <button\n *ngFor=\"let type of dataTypes\"\n class=\"menu-item\"\n (click)=\"onAddColumn(type.value)\">\n {{ type.label }}\n </button>\n </div>\n </div>\n </div>\n\n <div class=\"column-items\">\n <div\n *ngFor=\"let column of columns; let i = index\"\n class=\"column-item\"\n [class.selected]=\"selectedIndex === i\"\n [class.dragging]=\"draggedIndex === i\"\n [class.drag-over]=\"dragOverIndex === i\"\n (click)=\"onColumnClick(i)\"\n draggable=\"true\"\n (dragstart)=\"onDragStart($event, i)\"\n (dragover)=\"onDragOver($event, i)\"\n (drop)=\"onDrop($event, i)\"\n (dragend)=\"onDragEnd($event)\"\n (dragleave)=\"dragOverIndex = null\">\n <div class=\"drag-handle\">\n <span>\u2630</span>\n </div>\n <div class=\"column-info\">\n <div class=\"column-name\">{{ getColumnDisplayName(column) }}</div>\n <div class=\"column-meta\">\n <span class=\"column-type\">{{ getDataTypeLabel(column) }}</span>\n <span class=\"column-key\">{{ column.key }}</span>\n </div>\n </div>\n <button\n class=\"delete-btn\"\n (click)=\"onDelete(i, $event)\"\n title=\"Delete Column\">\n \u00D7\n </button>\n </div>\n\n <div *ngIf=\"columns.length === 0\" class=\"empty-state\">\n <p>No columns yet. Click \"Add Column\" to get started.</p>\n </div>\n </div>\n</div>\n\n", styles: [".column-list{display:flex;flex-direction:column;background-color:#fff;border-radius:4px;box-shadow:0 2px 4px #0000001a;overflow:hidden}.column-list-header{display:flex;justify-content:space-between;align-items:center;padding:1rem;border-bottom:1px solid #e0e0e0;background-color:#f8f8f8}.column-list-header h3{margin:0;font-size:1rem;font-weight:600;color:#333}.add-column-menu{position:relative}.add-column-menu.open .add-btn{background-color:#e3f2fd;border-color:#2196f3}.add-btn{padding:.5rem 1rem;border:1px solid #d0d0d0;border-radius:4px;background-color:#fff;color:#333;cursor:pointer;font-size:.875rem;transition:all .2s}.add-btn:hover{background-color:#f5f5f5}.add-menu{position:absolute;top:100%;right:0;margin-top:.25rem;background-color:#fff;border:1px solid #d0d0d0;border-radius:4px;box-shadow:0 4px 8px #0000001a;z-index:100;min-width:150px}.menu-item{display:block;width:100%;padding:.75rem 1rem;border:none;background:none;text-align:left;cursor:pointer;font-size:.875rem;color:#333;transition:background-color .2s}.menu-item:hover{background-color:#f5f5f5}.menu-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.menu-item:last-child{border-bottom-left-radius:4px;border-bottom-right-radius:4px}.column-items{max-height:400px;overflow-y:auto;padding:.5rem}.column-item{display:flex;align-items:center;gap:.5rem;padding:.75rem;margin-bottom:.5rem;border:1px solid #e0e0e0;border-radius:4px;background-color:#fff;cursor:pointer;transition:all .2s}.column-item:hover{border-color:#b0b0b0;background-color:#f8f8f8}.column-item.selected{border-color:#2196f3;background-color:#e3f2fd}.column-item.cdk-drag-preview{box-shadow:0 8px 16px #0003;opacity:.9}.column-item.cdk-drag-placeholder{opacity:.3}.drag-handle{cursor:move;color:#999;font-size:1.25rem;padding:.25rem;display:flex;align-items:center}.drag-handle:hover{color:#666}.column-info{flex:1;min-width:0}.column-name{font-weight:500;color:#333;margin-bottom:.25rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.column-meta{display:flex;gap:.5rem;font-size:.75rem;color:#666}.column-type{padding:.125rem .5rem;background-color:#e8e8e8;border-radius:3px}.column-key{font-family:monospace;color:#999}.delete-btn{padding:.25rem .5rem;border:none;background:none;color:#999;cursor:pointer;font-size:1.5rem;line-height:1;transition:color .2s}.delete-btn:hover{color:#f44336}.empty-state{padding:2rem;text-align:center;color:#999;font-size:.875rem}.column-item.dragging{opacity:.5}.column-item.drag-over{border-color:#2196f3}\n"], directives: [{ type: i1.ClickOutsideDirective, selector: "[clickOutside]", outputs: ["clickOutside"] }, { type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
109
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: ColumnListComponent, decorators: [{
110
+ type: Component,
111
+ args: [{ selector: 'st-column-list', template: "<div class=\"column-list\" (clickOutside)=\"closeMenu()\">\n <div class=\"column-list-header\">\n <h3>Columns</h3>\n <div class=\"add-column-menu\" [class.open]=\"showAddMenu\">\n <button class=\"add-btn\" (click)=\"showAddMenu = !showAddMenu\" title=\"Add Column\">\n <span>+ Add Column</span>\n </button>\n <div class=\"add-menu\" *ngIf=\"showAddMenu\">\n <button\n *ngFor=\"let type of dataTypes\"\n class=\"menu-item\"\n (click)=\"onAddColumn(type.value)\">\n {{ type.label }}\n </button>\n </div>\n </div>\n </div>\n\n <div class=\"column-items\">\n <div\n *ngFor=\"let column of columns; let i = index\"\n class=\"column-item\"\n [class.selected]=\"selectedIndex === i\"\n [class.dragging]=\"draggedIndex === i\"\n [class.drag-over]=\"dragOverIndex === i\"\n (click)=\"onColumnClick(i)\"\n draggable=\"true\"\n (dragstart)=\"onDragStart($event, i)\"\n (dragover)=\"onDragOver($event, i)\"\n (drop)=\"onDrop($event, i)\"\n (dragend)=\"onDragEnd($event)\"\n (dragleave)=\"dragOverIndex = null\">\n <div class=\"drag-handle\">\n <span>\u2630</span>\n </div>\n <div class=\"column-info\">\n <div class=\"column-name\">{{ getColumnDisplayName(column) }}</div>\n <div class=\"column-meta\">\n <span class=\"column-type\">{{ getDataTypeLabel(column) }}</span>\n <span class=\"column-key\">{{ column.key }}</span>\n </div>\n </div>\n <button\n class=\"delete-btn\"\n (click)=\"onDelete(i, $event)\"\n title=\"Delete Column\">\n \u00D7\n </button>\n </div>\n\n <div *ngIf=\"columns.length === 0\" class=\"empty-state\">\n <p>No columns yet. Click \"Add Column\" to get started.</p>\n </div>\n </div>\n</div>\n\n", styles: [".column-list{display:flex;flex-direction:column;background-color:#fff;border-radius:4px;box-shadow:0 2px 4px #0000001a;overflow:hidden}.column-list-header{display:flex;justify-content:space-between;align-items:center;padding:1rem;border-bottom:1px solid #e0e0e0;background-color:#f8f8f8}.column-list-header h3{margin:0;font-size:1rem;font-weight:600;color:#333}.add-column-menu{position:relative}.add-column-menu.open .add-btn{background-color:#e3f2fd;border-color:#2196f3}.add-btn{padding:.5rem 1rem;border:1px solid #d0d0d0;border-radius:4px;background-color:#fff;color:#333;cursor:pointer;font-size:.875rem;transition:all .2s}.add-btn:hover{background-color:#f5f5f5}.add-menu{position:absolute;top:100%;right:0;margin-top:.25rem;background-color:#fff;border:1px solid #d0d0d0;border-radius:4px;box-shadow:0 4px 8px #0000001a;z-index:100;min-width:150px}.menu-item{display:block;width:100%;padding:.75rem 1rem;border:none;background:none;text-align:left;cursor:pointer;font-size:.875rem;color:#333;transition:background-color .2s}.menu-item:hover{background-color:#f5f5f5}.menu-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.menu-item:last-child{border-bottom-left-radius:4px;border-bottom-right-radius:4px}.column-items{max-height:400px;overflow-y:auto;padding:.5rem}.column-item{display:flex;align-items:center;gap:.5rem;padding:.75rem;margin-bottom:.5rem;border:1px solid #e0e0e0;border-radius:4px;background-color:#fff;cursor:pointer;transition:all .2s}.column-item:hover{border-color:#b0b0b0;background-color:#f8f8f8}.column-item.selected{border-color:#2196f3;background-color:#e3f2fd}.column-item.cdk-drag-preview{box-shadow:0 8px 16px #0003;opacity:.9}.column-item.cdk-drag-placeholder{opacity:.3}.drag-handle{cursor:move;color:#999;font-size:1.25rem;padding:.25rem;display:flex;align-items:center}.drag-handle:hover{color:#666}.column-info{flex:1;min-width:0}.column-name{font-weight:500;color:#333;margin-bottom:.25rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.column-meta{display:flex;gap:.5rem;font-size:.75rem;color:#666}.column-type{padding:.125rem .5rem;background-color:#e8e8e8;border-radius:3px}.column-key{font-family:monospace;color:#999}.delete-btn{padding:.25rem .5rem;border:none;background:none;color:#999;cursor:pointer;font-size:1.5rem;line-height:1;transition:color .2s}.delete-btn:hover{color:#f44336}.empty-state{padding:2rem;text-align:center;color:#999;font-size:.875rem}.column-item.dragging{opacity:.5}.column-item.drag-over{border-color:#2196f3}\n"] }]
112
+ }], propDecorators: { columns: [{
113
+ type: Input
114
+ }], selectedIndex: [{
115
+ type: Input
116
+ }], columnSelected: [{
117
+ type: Output
118
+ }], columnAdded: [{
119
+ type: Output
120
+ }], columnDeleted: [{
121
+ type: Output
122
+ }], columnReordered: [{
123
+ type: Output
124
+ }] } });
125
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sdW1uLWxpc3QuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc21hcnQtdGFibGUvc3JjL2xpYi9idWlsZGVyL2NvbXBvbmVudHMvY29sdW1uLWxpc3QvY29sdW1uLWxpc3QuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc21hcnQtdGFibGUvc3JjL2xpYi9idWlsZGVyL2NvbXBvbmVudHMvY29sdW1uLWxpc3QvY29sdW1uLWxpc3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBRUgsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV2RSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7Ozs7QUFhMUQsTUFBTSxPQUFPLG1CQUFtQjtJQUxoQztRQU1XLFlBQU8sR0FBbUIsRUFBRSxDQUFDO1FBQzdCLGtCQUFhLEdBQWtCLElBQUksQ0FBQztRQUVuQyxtQkFBYyxHQUFHLElBQUksWUFBWSxFQUFVLENBQUM7UUFDNUMsZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO1FBQ3pDLGtCQUFhLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUMzQyxvQkFBZSxHQUFHLElBQUksWUFBWSxFQUEwQyxDQUFDO1FBRXZGLGdCQUFXLEdBQUcsS0FBSyxDQUFDO1FBQ3BCLGlCQUFZLEdBQWtCLElBQUksQ0FBQztRQUNuQyxrQkFBYSxHQUFrQixJQUFJLENBQUM7UUFDM0IsY0FBUyxHQUFHO1lBQ25CLEVBQUUsS0FBSyxFQUFFLFlBQVksQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRTtZQUM3QyxFQUFFLEtBQUssRUFBRSxZQUFZLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUU7WUFD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LEtBQUssSUFBSSxNQUFNLENBQUM7SUFDL0IsQ0FBQzs7Z0hBekdVLG1CQUFtQjtvR0FBbkIsbUJBQW1CLHFRQ3BCaEMseTFEQXdEQTsyRkRwQ2EsbUJBQW1CO2tCQUwvQixTQUFTOytCQUNFLGdCQUFnQjs4QkFLakIsT0FBTztzQkFBZixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBRUksY0FBYztzQkFBdkIsTUFBTTtnQkFDRyxXQUFXO3NCQUFwQixNQUFNO2dCQUNHLGFBQWE7c0JBQXRCLE1BQU07Z0JBQ0csZUFBZTtzQkFBeEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29sdW1uIExpc3QgQ29tcG9uZW50XG4gKiBEaXNwbGF5cyBhbmQgbWFuYWdlcyBjb2x1bW5zXG4gKi9cblxuaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbHVtbkNvbmZpZyB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9jb2x1bW4tY29uZmlnLmludGVyZmFjZSc7XG5pbXBvcnQgeyBDZWxsRGF0YVR5cGUgfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvY2VsbC10eXBlcyc7XG5cbi8vIERyYWctZHJvcCBpbnRlcmZhY2UgKG1ha2luZyBDREsgb3B0aW9uYWwpXG5pbnRlcmZhY2UgRHJhZ0Ryb3BFdmVudCB7XG4gIHByZXZpb3VzSW5kZXg6IG51bWJlcjtcbiAgY3VycmVudEluZGV4OiBudW1iZXI7XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3N0LWNvbHVtbi1saXN0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2NvbHVtbi1saXN0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vY29sdW1uLWxpc3QuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBDb2x1bW5MaXN0Q29tcG9uZW50IHtcbiAgQElucHV0KCkgY29sdW1uczogQ29sdW1uQ29uZmlnW10gPSBbXTtcbiAgQElucHV0KCkgc2VsZWN0ZWRJbmRleDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG5cbiAgQE91dHB1dCgpIGNvbHVtblNlbGVjdGVkID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG4gIEBPdXRwdXQoKSBjb2x1bW5BZGRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICBAT3V0cHV0KCkgY29sdW1uRGVsZXRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xuICBAT3V0cHV0KCkgY29sdW1uUmVvcmRlcmVkID0gbmV3IEV2ZW50RW1pdHRlcjx7IGZyb21JbmRleDogbnVtYmVyOyB0b0luZGV4OiBudW1iZXIgfT4oKTtcblxuICBzaG93QWRkTWVudSA9IGZhbHNlO1xuICBkcmFnZ2VkSW5kZXg6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICBkcmFnT3ZlckluZGV4OiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgcmVhZG9ubHkgZGF0YVR5cGVzID0gW1xuICAgIHsgdmFsdWU6IENlbGxEYXRhVHlwZS5TVFJJTkcsIGxhYmVsOiAnVGV4dCcgfSxcbiAgICB7IHZhbHVlOiBDZWxsRGF0YVR5cGUuTlVNQkVSLCBsYWJlbDogJ051bWJlcicgfSxcbiAgICB7IHZhbHVlOiBDZWxsRGF0YVR5cGUuREFURSwgbGFiZWw6ICdEYXRlJyB9LFxuICAgIHsgdmFsdWU6IENlbGxEYXRhVHlwZS5CT09MRUFOLCBsYWJlbDogJ0Jvb2xlYW4nIH1cbiAgXTtcblxuICAvKipcbiAgICogSGFuZGxlIGNvbHVtbiBjbGlja1xuICAgKi9cbiAgb25Db2x1bW5DbGljayhpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5jb2x1bW5TZWxlY3RlZC5lbWl0KGluZGV4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgZGVsZXRlIGJ1dHRvbiBjbGlja1xuICAgKi9cbiAgb25EZWxldGUoaW5kZXg6IG51bWJlciwgZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgaWYgKGNvbmZpcm0oYEFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgY29sdW1uIFwiJHt0aGlzLmNvbHVtbnNbaW5kZXhdLmhlYWRlciB8fCB0aGlzLmNvbHVtbnNbaW5kZXhdLmtleX1cIj9gKSkge1xuICAgICAgdGhpcy5jb2x1bW5EZWxldGVkLmVtaXQoaW5kZXgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgYWRkIGNvbHVtbiBidXR0b24gY2xpY2tcbiAgICovXG4gIG9uQWRkQ29sdW1uKHR5cGU6IENlbGxEYXRhVHlwZSk6IHZvaWQge1xuICAgIHRoaXMuc2hvd0FkZE1lbnUgPSBmYWxzZTtcbiAgICB0aGlzLmNvbHVtbkFkZGVkLmVtaXQodHlwZSk7XG4gIH1cblxuICBjbG9zZU1lbnUoKTogdm9pZHtcbiAgICB0aGlzLnNob3dBZGRNZW51ID0gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIGRyYWcgc3RhcnRcbiAgICovXG4gIG9uRHJhZ1N0YXJ0KGV2ZW50OiBEcmFnRXZlbnQsIGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmRyYWdnZWRJbmRleCA9IGluZGV4O1xuICAgIGlmIChldmVudC5kYXRhVHJhbnNmZXIpIHtcbiAgICAgIGV2ZW50LmRhdGFUcmFuc2Zlci5lZmZlY3RBbGxvd2VkID0gJ21vdmUnO1xuICAgICAgZXZlbnQuZGF0YVRyYW5zZmVyLnNldERhdGEoJ3RleHQvaHRtbCcsICcnKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIGRyYWcgb3ZlclxuICAgKi9cbiAgb25EcmFnT3ZlcihldmVudDogRHJhZ0V2ZW50LCBpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBpZiAoZXZlbnQuZGF0YVRyYW5zZmVyKSB7XG4gICAgICBldmVudC5kYXRhVHJhbnNmZXIuZHJvcEVmZmVjdCA9ICdtb3ZlJztcbiAgICB9XG4gICAgdGhpcy5kcmFnT3ZlckluZGV4ID0gaW5kZXg7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIGRyb3BcbiAgICovXG4gIG9uRHJvcChldmVudDogRHJhZ0V2ZW50LCBkcm9wSW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgaWYgKHRoaXMuZHJhZ2dlZEluZGV4ICE9PSBudWxsICYmIHRoaXMuZHJhZ2dlZEluZGV4ICE9PSBkcm9wSW5kZXgpIHtcbiAgICAgIHRoaXMuY29sdW1uUmVvcmRlcmVkLmVtaXQoe1xuICAgICAgICBmcm9tSW5kZXg6IHRoaXMuZHJhZ2dlZEluZGV4LFxuICAgICAgICB0b0luZGV4OiBkcm9wSW5kZXhcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLmRyYWdnZWRJbmRleCA9IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIGRyYWcgZW5kXG4gICAqL1xuICBvbkRyYWdFbmQoZXZlbnQ6IERyYWdFdmVudCk6IHZvaWQge1xuICAgIHRoaXMuZHJhZ2dlZEluZGV4ID0gbnVsbDtcbiAgICB0aGlzLmRyYWdPdmVySW5kZXggPSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBkaXNwbGF5IG5hbWUgZm9yIGNvbHVtblxuICAgKi9cbiAgZ2V0Q29sdW1uRGlzcGxheU5hbWUoY29sdW1uOiBDb2x1bW5Db25maWcpOiBzdHJpbmcge1xuICAgIHJldHVybiBjb2x1bW4uaGVhZGVyIHx8IGNvbHVtbi5rZXk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGRhdGEgdHlwZSBsYWJlbFxuICAgKi9cbiAgZ2V0RGF0YVR5cGVMYWJlbChjb2x1bW46IENvbHVtbkNvbmZpZyk6IHN0cmluZyB7XG4gICAgY29uc3QgdHlwZSA9IHRoaXMuZGF0YVR5cGVzLmZpbmQoZHQgPT4gZHQudmFsdWUgPT09IGNvbHVtbi5kYXRhVHlwZSk7XG4gICAgcmV0dXJuIHR5cGU/LmxhYmVsIHx8ICdUZXh0JztcbiAgfVxufVxuXG4iLCI8ZGl2IGNsYXNzPVwiY29sdW1uLWxpc3RcIiAoY2xpY2tPdXRzaWRlKT1cImNsb3NlTWVudSgpXCI+XG4gIDxkaXYgY2xhc3M9XCJjb2x1bW4tbGlzdC1oZWFkZXJcIj5cbiAgICA8aDM+Q29sdW1uczwvaDM+XG4gICAgPGRpdiBjbGFzcz1cImFkZC1jb2x1bW4tbWVudVwiIFtjbGFzcy5vcGVuXT1cInNob3dBZGRNZW51XCI+XG4gICAgICA8YnV0dG9uIGNsYXNzPVwiYWRkLWJ0blwiIChjbGljayk9XCJzaG93QWRkTWVudSA9ICFzaG93QWRkTWVudVwiIHRpdGxlPVwiQWRkIENvbHVtblwiPlxuICAgICAgICA8c3Bhbj4rIEFkZCBDb2x1bW48L3NwYW4+XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxkaXYgY2xhc3M9XCJhZGQtbWVudVwiICpuZ0lmPVwic2hvd0FkZE1lbnVcIj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICpuZ0Zvcj1cImxldCB0eXBlIG9mIGRhdGFUeXBlc1wiXG4gICAgICAgICAgY2xhc3M9XCJtZW51LWl0ZW1cIlxuICAgICAgICAgIChjbGljayk9XCJvbkFkZENvbHVtbih0eXBlLnZhbHVlKVwiPlxuICAgICAgICAgIHt7IHR5cGUubGFiZWwgfX1cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPGRpdiBjbGFzcz1cImNvbHVtbi1pdGVtc1wiPlxuICAgIDxkaXZcbiAgICAgICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgY29sdW1uczsgbGV0IGkgPSBpbmRleFwiXG4gICAgICBjbGFzcz1cImNvbHVtbi1pdGVtXCJcbiAgICAgIFtjbGFzcy5zZWxlY3RlZF09XCJzZWxlY3RlZEluZGV4ID09PSBpXCJcbiAgICAgIFtjbGFzcy5kcmFnZ2luZ109XCJkcmFnZ2VkSW5kZXggPT09IGlcIlxuICAgICAgW2NsYXNzLmRyYWctb3Zlcl09XCJkcmFnT3ZlckluZGV4ID09PSBpXCJcbiAgICAgIChjbGljayk9XCJvbkNvbHVtbkNsaWNrKGkpXCJcbiAgICAgIGRyYWdnYWJsZT1cInRydWVcIlxuICAgICAgKGRyYWdzdGFydCk9XCJvbkRyYWdTdGFydCgkZXZlbnQsIGkpXCJcbiAgICAgIChkcmFnb3Zlcik9XCJvbkRyYWdPdmVyKCRldmVudCwgaSlcIlxuICAgICAgKGRyb3ApPVwib25Ecm9wKCRldmVudCwgaSlcIlxuICAgICAgKGRyYWdlbmQpPVwib25EcmFnRW5kKCRldmVudClcIlxuICAgICAgKGRyYWdsZWF2ZSk9XCJkcmFnT3ZlckluZGV4ID0gbnVsbFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImRyYWctaGFuZGxlXCI+XG4gICAgICAgIDxzcGFuPuKYsDwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImNvbHVtbi1pbmZvXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2x1bW4tbmFtZVwiPnt7IGdldENvbHVtbkRpc3BsYXlOYW1lKGNvbHVtbikgfX08L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbHVtbi1tZXRhXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJjb2x1bW4tdHlwZVwiPnt7IGdldERhdGFUeXBlTGFiZWwoY29sdW1uKSB9fTwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNvbHVtbi1rZXlcIj57eyBjb2x1bW4ua2V5IH19PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGJ1dHRvblxuICAgICAgICBjbGFzcz1cImRlbGV0ZS1idG5cIlxuICAgICAgICAoY2xpY2spPVwib25EZWxldGUoaSwgJGV2ZW50KVwiXG4gICAgICAgIHRpdGxlPVwiRGVsZXRlIENvbHVtblwiPlxuICAgICAgICDDl1xuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2ICpuZ0lmPVwiY29sdW1ucy5sZW5ndGggPT09IDBcIiBjbGFzcz1cImVtcHR5LXN0YXRlXCI+XG4gICAgICA8cD5ObyBjb2x1bW5zIHlldC4gQ2xpY2sgXCJBZGQgQ29sdW1uXCIgdG8gZ2V0IHN0YXJ0ZWQuPC9wPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuXG4iXX0=
@@ -0,0 +1,105 @@
1
+ /**
2
+ * Definition Builder Component
3
+ * Main container component that orchestrates all builder sub-components
4
+ */
5
+ import { Component } from '@angular/core';
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "../../services/definition-builder.service";
8
+ import * as i2 from "../builder-toolbar/builder-toolbar.component";
9
+ import * as i3 from "../column-list/column-list.component";
10
+ import * as i4 from "../table-config-editor/table-config-editor.component";
11
+ import * as i5 from "../column-editor/column-editor.component";
12
+ import * as i6 from "../builder-preview/builder-preview.component";
13
+ import * as i7 from "@angular/common";
14
+ export class DefinitionBuilderComponent {
15
+ constructor(builderService) {
16
+ this.builderService = builderService;
17
+ this.state = this.builderService.getState();
18
+ }
19
+ ngOnInit() {
20
+ // Subscribe to state changes
21
+ this.stateSubscription = this.builderService.state$.subscribe(state => {
22
+ this.state = state;
23
+ });
24
+ }
25
+ ngOnDestroy() {
26
+ this.stateSubscription?.unsubscribe();
27
+ }
28
+ /**
29
+ * Handle new definition action
30
+ */
31
+ onNewDefinition() {
32
+ if (this.state.hasUnsavedChanges) {
33
+ if (!confirm('You have unsaved changes. Are you sure you want to create a new definition?')) {
34
+ return;
35
+ }
36
+ }
37
+ this.builderService.newDefinition();
38
+ }
39
+ /**
40
+ * Handle column selection
41
+ */
42
+ onColumnSelected(index) {
43
+ this.builderService.selectColumn(index);
44
+ }
45
+ /**
46
+ * Handle column deletion
47
+ */
48
+ onColumnDeleted(index) {
49
+ this.builderService.deleteColumn(index);
50
+ }
51
+ /**
52
+ * Handle column reorder
53
+ */
54
+ onColumnReordered(fromIndex, toIndex) {
55
+ this.builderService.reorderColumns(fromIndex, toIndex);
56
+ }
57
+ /**
58
+ * Handle column add
59
+ */
60
+ onColumnAdded(type) {
61
+ // Convert string type to CellDataType enum if provided
62
+ let dataType = undefined;
63
+ if (type) {
64
+ dataType = type; // Type is already a CellDataType string value
65
+ }
66
+ this.builderService.addColumn(dataType);
67
+ }
68
+ /**
69
+ * Handle column update
70
+ */
71
+ onColumnUpdated(index, updates) {
72
+ this.builderService.updateColumn(index, updates);
73
+ }
74
+ /**
75
+ * Handle table config update
76
+ */
77
+ onTableConfigUpdated(updates) {
78
+ this.builderService.updateTableSettings(updates);
79
+ }
80
+ /**
81
+ * Handle preview toggle
82
+ */
83
+ onPreviewToggled() {
84
+ this.builderService.togglePreview();
85
+ }
86
+ /**
87
+ * Handle save action
88
+ */
89
+ onSaved() {
90
+ this.builderService.markAsSaved();
91
+ }
92
+ /**
93
+ * Handle column cancel
94
+ */
95
+ onColumnCancel() {
96
+ this.builderService.clearSelection();
97
+ }
98
+ }
99
+ DefinitionBuilderComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: DefinitionBuilderComponent, deps: [{ token: i1.DefinitionBuilderService }], target: i0.ɵɵFactoryTarget.Component });
100
+ DefinitionBuilderComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: DefinitionBuilderComponent, selector: "st-definition-builder", ngImport: i0, template: "<div class=\"definition-builder\">\n <!-- Toolbar -->\n <st-builder-toolbar\n [hasUnsavedChanges]=\"state.hasUnsavedChanges\"\n (newDefinition)=\"onNewDefinition()\"\n (saved)=\"onSaved()\"\n (previewToggled)=\"onPreviewToggled()\">\n </st-builder-toolbar>\n\n <div class=\"builder-content\">\n <!-- Left Panel: Column List and Table Config -->\n <div class=\"left-panel\">\n <!-- Column List -->\n <st-column-list\n [columns]=\"state.tableConfig.columns\"\n [selectedIndex]=\"state.selectedColumnIndex\"\n (columnSelected)=\"onColumnSelected($event)\"\n (columnAdded)=\"onColumnAdded($event)\"\n (columnDeleted)=\"onColumnDeleted($event)\"\n (columnReordered)=\"onColumnReordered($event.fromIndex, $event.toIndex)\">\n </st-column-list>\n\n <!-- Table Config Editor -->\n <st-table-config-editor\n [config]=\"state.tableConfig\"\n (configUpdated)=\"onTableConfigUpdated($event)\">\n </st-table-config-editor>\n </div>\n\n <!-- Middle Panel: Column Editor -->\n <div class=\"middle-panel\" *ngIf=\"state.selectedColumn\">\n <st-column-editor\n [column]=\"state.selectedColumn\"\n [columnIndex]=\"state.selectedColumnIndex!\"\n (columnUpdated)=\"onColumnUpdated(state.selectedColumnIndex!, $event)\"\n (cancel)=\"onColumnCancel()\">\n </st-column-editor>\n </div>\n\n <!-- Right Panel: Preview -->\n <div class=\"right-panel\" *ngIf=\"state.previewVisible\">\n <st-builder-preview\n [tableConfig]=\"state.tableConfig\">\n </st-builder-preview>\n </div>\n </div>\n</div>\n\n", styles: [".definition-builder{display:flex;flex-direction:column;height:100%;width:100%;background-color:#f5f5f5}.builder-content{display:flex;flex:1;overflow:hidden;gap:1rem;padding:1rem}.left-panel{display:flex;flex-direction:column;width:300px;min-width:250px;gap:1rem;overflow-y:auto}.middle-panel{flex:1;min-width:400px;overflow-y:auto;background-color:#fff;border-radius:4px;padding:1rem;box-shadow:0 2px 4px #0000001a}.right-panel{min-width:400px;overflow-y:auto;background-color:#fff;border-radius:4px;padding:1rem;box-shadow:0 2px 4px #0000001a}@media (max-width: 1200px){.right-panel{display:none}}@media (max-width: 800px){.builder-content{flex-direction:column}.left-panel,.middle-panel,.right-panel{width:100%;min-width:unset}}\n"], components: [{ type: i2.BuilderToolbarComponent, selector: "st-builder-toolbar", inputs: ["hasUnsavedChanges"], outputs: ["newDefinition", "saved", "previewToggled"] }, { type: i3.ColumnListComponent, selector: "st-column-list", inputs: ["columns", "selectedIndex"], outputs: ["columnSelected", "columnAdded", "columnDeleted", "columnReordered"] }, { type: i4.TableConfigEditorComponent, selector: "st-table-config-editor", inputs: ["config"], outputs: ["configUpdated"] }, { type: i5.ColumnEditorComponent, selector: "st-column-editor", inputs: ["column", "columnIndex"], outputs: ["columnUpdated", "cancel"] }, { type: i6.BuilderPreviewComponent, selector: "st-builder-preview", inputs: ["tableConfig"] }], directives: [{ type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
101
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: DefinitionBuilderComponent, decorators: [{
102
+ type: Component,
103
+ args: [{ selector: 'st-definition-builder', template: "<div class=\"definition-builder\">\n <!-- Toolbar -->\n <st-builder-toolbar\n [hasUnsavedChanges]=\"state.hasUnsavedChanges\"\n (newDefinition)=\"onNewDefinition()\"\n (saved)=\"onSaved()\"\n (previewToggled)=\"onPreviewToggled()\">\n </st-builder-toolbar>\n\n <div class=\"builder-content\">\n <!-- Left Panel: Column List and Table Config -->\n <div class=\"left-panel\">\n <!-- Column List -->\n <st-column-list\n [columns]=\"state.tableConfig.columns\"\n [selectedIndex]=\"state.selectedColumnIndex\"\n (columnSelected)=\"onColumnSelected($event)\"\n (columnAdded)=\"onColumnAdded($event)\"\n (columnDeleted)=\"onColumnDeleted($event)\"\n (columnReordered)=\"onColumnReordered($event.fromIndex, $event.toIndex)\">\n </st-column-list>\n\n <!-- Table Config Editor -->\n <st-table-config-editor\n [config]=\"state.tableConfig\"\n (configUpdated)=\"onTableConfigUpdated($event)\">\n </st-table-config-editor>\n </div>\n\n <!-- Middle Panel: Column Editor -->\n <div class=\"middle-panel\" *ngIf=\"state.selectedColumn\">\n <st-column-editor\n [column]=\"state.selectedColumn\"\n [columnIndex]=\"state.selectedColumnIndex!\"\n (columnUpdated)=\"onColumnUpdated(state.selectedColumnIndex!, $event)\"\n (cancel)=\"onColumnCancel()\">\n </st-column-editor>\n </div>\n\n <!-- Right Panel: Preview -->\n <div class=\"right-panel\" *ngIf=\"state.previewVisible\">\n <st-builder-preview\n [tableConfig]=\"state.tableConfig\">\n </st-builder-preview>\n </div>\n </div>\n</div>\n\n", styles: [".definition-builder{display:flex;flex-direction:column;height:100%;width:100%;background-color:#f5f5f5}.builder-content{display:flex;flex:1;overflow:hidden;gap:1rem;padding:1rem}.left-panel{display:flex;flex-direction:column;width:300px;min-width:250px;gap:1rem;overflow-y:auto}.middle-panel{flex:1;min-width:400px;overflow-y:auto;background-color:#fff;border-radius:4px;padding:1rem;box-shadow:0 2px 4px #0000001a}.right-panel{min-width:400px;overflow-y:auto;background-color:#fff;border-radius:4px;padding:1rem;box-shadow:0 2px 4px #0000001a}@media (max-width: 1200px){.right-panel{display:none}}@media (max-width: 800px){.builder-content{flex-direction:column}.left-panel,.middle-panel,.right-panel{width:100%;min-width:unset}}\n"] }]
104
+ }], ctorParameters: function () { return [{ type: i1.DefinitionBuilderService }]; } });
105
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmaW5pdGlvbi1idWlsZGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NtYXJ0LXRhYmxlL3NyYy9saWIvYnVpbGRlci9jb21wb25lbnRzL2RlZmluaXRpb24tYnVpbGRlci9kZWZpbml0aW9uLWJ1aWxkZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc21hcnQtdGFibGUvc3JjL2xpYi9idWlsZGVyL2NvbXBvbmVudHMvZGVmaW5pdGlvbi1idWlsZGVyL2RlZmluaXRpb24tYnVpbGRlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFFSCxPQUFPLEVBQUUsU0FBUyxFQUFxQixNQUFNLGVBQWUsQ0FBQzs7Ozs7Ozs7O0FBVTdELE1BQU0sT0FBTywwQkFBMEI7SUFJckMsWUFBb0IsY0FBd0M7UUFBeEMsbUJBQWMsR0FBZCxjQUFjLENBQTBCO1FBQzFELElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUM5QyxDQUFDO0lBRUQsUUFBUTtRQUNOLDZCQUE2QjtRQUM3QixJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ3BFLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ3JCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsaUJBQWlCLEVBQUUsV0FBVyxFQUFFLENBQUM7SUFDeEMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsZUFBZTtRQUNiLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsRUFBRTtZQUNoQyxJQUFJLENBQUMsT0FBTyxDQUFDLDZFQUE2RSxDQUFDLEVBQUU7Z0JBQzNGLE9BQU87YUFDUjtTQUNGO1FBQ0QsSUFBSSxDQUFDLGNBQWMsQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUN0QyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxnQkFBZ0IsQ0FBQyxLQUFhO1FBQzVCLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFRDs7T0FFRztJQUNILGVBQWUsQ0FBQyxLQUFhO1FBQzNCLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFRDs7T0FFRztJQUNILGlCQUFpQixDQUFDLFNBQWlCLEVBQUUsT0FBZTtRQUNsRCxJQUFJLENBQUMsY0FBYyxDQUFDLGNBQWMsQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUVEOztPQUVHO0lBQ0gsYUFBYSxDQUFDLElBQWE7UUFDekIsdURBQXVEO1FBQ3ZELElBQUksUUFBUSxHQUFRLFNBQVMsQ0FBQztRQUM5QixJQUFJLElBQUksRUFBRTtZQUNSLFFBQVEsR0FBRyxJQUFXLENBQUMsQ0FBQyw4Q0FBOEM7U0FDdkU7UUFDRCxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxlQUFlLENBQUMsS0FBYSxFQUFFLE9BQVk7UUFDekMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFFRDs7T0FFRztJQUNILG9CQUFvQixDQUFDLE9BQVk7UUFDL0IsSUFBSSxDQUFDLGNBQWMsQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxnQkFBZ0I7UUFDZCxJQUFJLENBQUMsY0FBYyxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQ3RDLENBQUM7SUFFRDs7T0FFRztJQUNILE9BQU87UUFDTCxJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3BDLENBQUM7SUFFRDs7T0FFRztJQUNILGNBQWM7UUFDWixJQUFJLENBQUMsY0FBYyxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQ3ZDLENBQUM7O3VIQWpHVSwwQkFBMEI7MkdBQTFCLDBCQUEwQiw2RENmdkMsMm5EQWdEQTsyRkRqQ2EsMEJBQTBCO2tCQUx0QyxTQUFTOytCQUNFLHVCQUF1QiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRGVmaW5pdGlvbiBCdWlsZGVyIENvbXBvbmVudFxuICogTWFpbiBjb250YWluZXIgY29tcG9uZW50IHRoYXQgb3JjaGVzdHJhdGVzIGFsbCBidWlsZGVyIHN1Yi1jb21wb25lbnRzXG4gKi9cblxuaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIE9uRGVzdHJveSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBEZWZpbml0aW9uQnVpbGRlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9kZWZpbml0aW9uLWJ1aWxkZXIuc2VydmljZSc7XG5pbXBvcnQgeyBCdWlsZGVyU3RhdGUgfSBmcm9tICcuLi8uLi9tb2RlbHMvYnVpbGRlci1zdGF0ZS5pbnRlcmZhY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzdC1kZWZpbml0aW9uLWJ1aWxkZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vZGVmaW5pdGlvbi1idWlsZGVyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZGVmaW5pdGlvbi1idWlsZGVyLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgRGVmaW5pdGlvbkJ1aWxkZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIHN0YXRlOiBCdWlsZGVyU3RhdGU7XG4gIHByaXZhdGUgc3RhdGVTdWJzY3JpcHRpb24/OiBTdWJzY3JpcHRpb247XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBidWlsZGVyU2VydmljZTogRGVmaW5pdGlvbkJ1aWxkZXJTZXJ2aWNlKSB7XG4gICAgdGhpcy5zdGF0ZSA9IHRoaXMuYnVpbGRlclNlcnZpY2UuZ2V0U3RhdGUoKTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIC8vIFN1YnNjcmliZSB0byBzdGF0ZSBjaGFuZ2VzXG4gICAgdGhpcy5zdGF0ZVN1YnNjcmlwdGlvbiA9IHRoaXMuYnVpbGRlclNlcnZpY2Uuc3RhdGUkLnN1YnNjcmliZShzdGF0ZSA9PiB7XG4gICAgICB0aGlzLnN0YXRlID0gc3RhdGU7XG4gICAgfSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnN0YXRlU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBuZXcgZGVmaW5pdGlvbiBhY3Rpb25cbiAgICovXG4gIG9uTmV3RGVmaW5pdGlvbigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zdGF0ZS5oYXNVbnNhdmVkQ2hhbmdlcykge1xuICAgICAgaWYgKCFjb25maXJtKCdZb3UgaGF2ZSB1bnNhdmVkIGNoYW5nZXMuIEFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBjcmVhdGUgYSBuZXcgZGVmaW5pdGlvbj8nKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuYnVpbGRlclNlcnZpY2UubmV3RGVmaW5pdGlvbigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBjb2x1bW4gc2VsZWN0aW9uXG4gICAqL1xuICBvbkNvbHVtblNlbGVjdGVkKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmJ1aWxkZXJTZXJ2aWNlLnNlbGVjdENvbHVtbihpbmRleCk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIGNvbHVtbiBkZWxldGlvblxuICAgKi9cbiAgb25Db2x1bW5EZWxldGVkKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmJ1aWxkZXJTZXJ2aWNlLmRlbGV0ZUNvbHVtbihpbmRleCk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIGNvbHVtbiByZW9yZGVyXG4gICAqL1xuICBvbkNvbHVtblJlb3JkZXJlZChmcm9tSW5kZXg6IG51bWJlciwgdG9JbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5idWlsZGVyU2VydmljZS5yZW9yZGVyQ29sdW1ucyhmcm9tSW5kZXgsIHRvSW5kZXgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBjb2x1bW4gYWRkXG4gICAqL1xuICBvbkNvbHVtbkFkZGVkKHR5cGU/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAvLyBDb252ZXJ0IHN0cmluZyB0eXBlIHRvIENlbGxEYXRhVHlwZSBlbnVtIGlmIHByb3ZpZGVkXG4gICAgbGV0IGRhdGFUeXBlOiBhbnkgPSB1bmRlZmluZWQ7XG4gICAgaWYgKHR5cGUpIHtcbiAgICAgIGRhdGFUeXBlID0gdHlwZSBhcyBhbnk7IC8vIFR5cGUgaXMgYWxyZWFkeSBhIENlbGxEYXRhVHlwZSBzdHJpbmcgdmFsdWVcbiAgICB9XG4gICAgdGhpcy5idWlsZGVyU2VydmljZS5hZGRDb2x1bW4oZGF0YVR5cGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBjb2x1bW4gdXBkYXRlXG4gICAqL1xuICBvbkNvbHVtblVwZGF0ZWQoaW5kZXg6IG51bWJlciwgdXBkYXRlczogYW55KTogdm9pZCB7XG4gICAgdGhpcy5idWlsZGVyU2VydmljZS51cGRhdGVDb2x1bW4oaW5kZXgsIHVwZGF0ZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSB0YWJsZSBjb25maWcgdXBkYXRlXG4gICAqL1xuICBvblRhYmxlQ29uZmlnVXBkYXRlZCh1cGRhdGVzOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLmJ1aWxkZXJTZXJ2aWNlLnVwZGF0ZVRhYmxlU2V0dGluZ3ModXBkYXRlcyk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIHByZXZpZXcgdG9nZ2xlXG4gICAqL1xuICBvblByZXZpZXdUb2dnbGVkKCk6IHZvaWQge1xuICAgIHRoaXMuYnVpbGRlclNlcnZpY2UudG9nZ2xlUHJldmlldygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBzYXZlIGFjdGlvblxuICAgKi9cbiAgb25TYXZlZCgpOiB2b2lkIHtcbiAgICB0aGlzLmJ1aWxkZXJTZXJ2aWNlLm1hcmtBc1NhdmVkKCk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIGNvbHVtbiBjYW5jZWxcbiAgICovXG4gIG9uQ29sdW1uQ2FuY2VsKCk6IHZvaWQge1xuICAgIHRoaXMuYnVpbGRlclNlcnZpY2UuY2xlYXJTZWxlY3Rpb24oKTtcbiAgfVxufVxuXG4iLCI8ZGl2IGNsYXNzPVwiZGVmaW5pdGlvbi1idWlsZGVyXCI+XG4gIDwhLS0gVG9vbGJhciAtLT5cbiAgPHN0LWJ1aWxkZXItdG9vbGJhclxuICAgIFtoYXNVbnNhdmVkQ2hhbmdlc109XCJzdGF0ZS5oYXNVbnNhdmVkQ2hhbmdlc1wiXG4gICAgKG5ld0RlZmluaXRpb24pPVwib25OZXdEZWZpbml0aW9uKClcIlxuICAgIChzYXZlZCk9XCJvblNhdmVkKClcIlxuICAgIChwcmV2aWV3VG9nZ2xlZCk9XCJvblByZXZpZXdUb2dnbGVkKClcIj5cbiAgPC9zdC1idWlsZGVyLXRvb2xiYXI+XG5cbiAgPGRpdiBjbGFzcz1cImJ1aWxkZXItY29udGVudFwiPlxuICAgIDwhLS0gTGVmdCBQYW5lbDogQ29sdW1uIExpc3QgYW5kIFRhYmxlIENvbmZpZyAtLT5cbiAgICA8ZGl2IGNsYXNzPVwibGVmdC1wYW5lbFwiPlxuICAgICAgPCEtLSBDb2x1bW4gTGlzdCAtLT5cbiAgICAgIDxzdC1jb2x1bW4tbGlzdFxuICAgICAgICBbY29sdW1uc109XCJzdGF0ZS50YWJsZUNvbmZpZy5jb2x1bW5zXCJcbiAgICAgICAgW3NlbGVjdGVkSW5kZXhdPVwic3RhdGUuc2VsZWN0ZWRDb2x1bW5JbmRleFwiXG4gICAgICAgIChjb2x1bW5TZWxlY3RlZCk9XCJvbkNvbHVtblNlbGVjdGVkKCRldmVudClcIlxuICAgICAgICAoY29sdW1uQWRkZWQpPVwib25Db2x1bW5BZGRlZCgkZXZlbnQpXCJcbiAgICAgICAgKGNvbHVtbkRlbGV0ZWQpPVwib25Db2x1bW5EZWxldGVkKCRldmVudClcIlxuICAgICAgICAoY29sdW1uUmVvcmRlcmVkKT1cIm9uQ29sdW1uUmVvcmRlcmVkKCRldmVudC5mcm9tSW5kZXgsICRldmVudC50b0luZGV4KVwiPlxuICAgICAgPC9zdC1jb2x1bW4tbGlzdD5cblxuICAgICAgPCEtLSBUYWJsZSBDb25maWcgRWRpdG9yIC0tPlxuICAgICAgPHN0LXRhYmxlLWNvbmZpZy1lZGl0b3JcbiAgICAgICAgW2NvbmZpZ109XCJzdGF0ZS50YWJsZUNvbmZpZ1wiXG4gICAgICAgIChjb25maWdVcGRhdGVkKT1cIm9uVGFibGVDb25maWdVcGRhdGVkKCRldmVudClcIj5cbiAgICAgIDwvc3QtdGFibGUtY29uZmlnLWVkaXRvcj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gTWlkZGxlIFBhbmVsOiBDb2x1bW4gRWRpdG9yIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJtaWRkbGUtcGFuZWxcIiAqbmdJZj1cInN0YXRlLnNlbGVjdGVkQ29sdW1uXCI+XG4gICAgICA8c3QtY29sdW1uLWVkaXRvclxuICAgICAgICBbY29sdW1uXT1cInN0YXRlLnNlbGVjdGVkQ29sdW1uXCJcbiAgICAgICAgW2NvbHVtbkluZGV4XT1cInN0YXRlLnNlbGVjdGVkQ29sdW1uSW5kZXghXCJcbiAgICAgICAgKGNvbHVtblVwZGF0ZWQpPVwib25Db2x1bW5VcGRhdGVkKHN0YXRlLnNlbGVjdGVkQ29sdW1uSW5kZXghLCAkZXZlbnQpXCJcbiAgICAgICAgKGNhbmNlbCk9XCJvbkNvbHVtbkNhbmNlbCgpXCI+XG4gICAgICA8L3N0LWNvbHVtbi1lZGl0b3I+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIFJpZ2h0IFBhbmVsOiBQcmV2aWV3IC0tPlxuICAgIDxkaXYgY2xhc3M9XCJyaWdodC1wYW5lbFwiICpuZ0lmPVwic3RhdGUucHJldmlld1Zpc2libGVcIj5cbiAgICAgIDxzdC1idWlsZGVyLXByZXZpZXdcbiAgICAgICAgW3RhYmxlQ29uZmlnXT1cInN0YXRlLnRhYmxlQ29uZmlnXCI+XG4gICAgICA8L3N0LWJ1aWxkZXItcHJldmlldz5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cblxuIl19