@aquera/ngx-smart-table 0.0.17-alpha → 0.0.19-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 (170) hide show
  1. package/{fesm2020 → fesm2022}/aquera-ngx-smart-table.mjs +1579 -2101
  2. package/fesm2022/aquera-ngx-smart-table.mjs.map +1 -0
  3. package/package.json +8 -16
  4. package/types/aquera-ngx-smart-table.d.ts +5909 -0
  5. package/aquera-ngx-smart-table.d.ts +0 -5
  6. package/esm2020/aquera-ngx-smart-table.mjs +0 -5
  7. package/esm2020/lib/builder/components/builder-preview/builder-preview.component.mjs +0 -63
  8. package/esm2020/lib/builder/components/builder-toolbar/builder-toolbar.component.mjs +0 -115
  9. package/esm2020/lib/builder/components/column-editor/column-editor.component.mjs +0 -206
  10. package/esm2020/lib/builder/components/column-list/column-list.component.mjs +0 -125
  11. package/esm2020/lib/builder/components/definition-builder/definition-builder.component.mjs +0 -105
  12. package/esm2020/lib/builder/components/table-config-editor/table-config-editor.component.mjs +0 -132
  13. package/esm2020/lib/builder/definition-builder.module.mjs +0 -70
  14. package/esm2020/lib/builder/models/builder-state.interface.mjs +0 -5
  15. package/esm2020/lib/builder/services/definition-builder.service.mjs +0 -251
  16. package/esm2020/lib/builder/services/definition-export.service.mjs +0 -167
  17. package/esm2020/lib/builder/services/definition-import.service.mjs +0 -193
  18. package/esm2020/lib/builder/services/sample-data-generator.service.mjs +0 -126
  19. package/esm2020/lib/builder/utils/config-validator.util.mjs +0 -165
  20. package/esm2020/lib/builder/utils/typescript-generator.util.mjs +0 -206
  21. package/esm2020/lib/editors/index.mjs +0 -9
  22. package/esm2020/lib/editors/nile-autocomplete-editor.mjs +0 -228
  23. package/esm2020/lib/editors/nile-calendar-editor.mjs +0 -211
  24. package/esm2020/lib/editors/nile-date-picker-editor.mjs +0 -188
  25. package/esm2020/lib/editors/nile-input-editor.mjs +0 -235
  26. package/esm2020/lib/editors/nile-select-editor.mjs +0 -498
  27. package/esm2020/lib/factories/column-config.factory.mjs +0 -231
  28. package/esm2020/lib/models/autosave-config.interface.mjs +0 -8
  29. package/esm2020/lib/models/base-column-config.class.mjs +0 -253
  30. package/esm2020/lib/models/cell-strategies.interface.mjs +0 -6
  31. package/esm2020/lib/models/cell-types.mjs +0 -147
  32. package/esm2020/lib/models/column-action.interface.mjs +0 -6
  33. package/esm2020/lib/models/column-config.interface.mjs +0 -43
  34. package/esm2020/lib/models/column-config.utils.mjs +0 -101
  35. package/esm2020/lib/models/row-action.interface.mjs +0 -5
  36. package/esm2020/lib/models/row-validator.interface.mjs +0 -2
  37. package/esm2020/lib/models/schema-validation.interface.mjs +0 -2
  38. package/esm2020/lib/models/sheet-action.interface.mjs +0 -5
  39. package/esm2020/lib/models/sheet-config.interface.mjs +0 -5
  40. package/esm2020/lib/models/table-config.interface.mjs +0 -107
  41. package/esm2020/lib/models/table-validator.interface.mjs +0 -2
  42. package/esm2020/lib/models/workbook-action.interface.mjs +0 -5
  43. package/esm2020/lib/models/workbook-config.interface.mjs +0 -5
  44. package/esm2020/lib/renderer/components/st-add-column-button/st-add-column-button.component.mjs +0 -24
  45. package/esm2020/lib/renderer/components/st-cell/st-cell.component.mjs +0 -397
  46. package/esm2020/lib/renderer/components/st-column-editor-modal/st-column-editor-modal.component.mjs +0 -103
  47. package/esm2020/lib/renderer/components/st-column-filter/st-column-filter.component.mjs +0 -383
  48. package/esm2020/lib/renderer/components/st-column-menu/st-column-menu.component.mjs +0 -232
  49. package/esm2020/lib/renderer/components/st-column-visibility/st-column-visibility.component.mjs +0 -97
  50. package/esm2020/lib/renderer/components/st-header/st-header.component.mjs +0 -157
  51. package/esm2020/lib/renderer/components/st-pagination/st-pagination.component.mjs +0 -87
  52. package/esm2020/lib/renderer/components/st-row-actions-dropdown/st-row-actions-dropdown.component.mjs +0 -167
  53. package/esm2020/lib/renderer/components/st-sheet/st-sheet.component.mjs +0 -165
  54. package/esm2020/lib/renderer/components/st-sheet-actions/st-sheet-actions.component.mjs +0 -112
  55. package/esm2020/lib/renderer/components/st-table/st-table.component.mjs +0 -1453
  56. package/esm2020/lib/renderer/components/st-table-actions/st-table-actions.component.mjs +0 -169
  57. package/esm2020/lib/renderer/components/st-workbook/st-workbook.component.mjs +0 -581
  58. package/esm2020/lib/renderer/directives/click-outside.directive.mjs +0 -28
  59. package/esm2020/lib/renderer/directives/st-column-resize.directive.mjs +0 -108
  60. package/esm2020/lib/renderer/directives/st-keyboard-navigation.directive.mjs +0 -83
  61. package/esm2020/lib/renderer/models/cell-state.interface.mjs +0 -66
  62. package/esm2020/lib/renderer/models/cell.class.mjs +0 -389
  63. package/esm2020/lib/renderer/models/row-validation-state.interface.mjs +0 -7
  64. package/esm2020/lib/renderer/models/sheet-state.class.mjs +0 -90
  65. package/esm2020/lib/renderer/models/sheet-state.interface.mjs +0 -5
  66. package/esm2020/lib/renderer/models/table-state.class.mjs +0 -871
  67. package/esm2020/lib/renderer/models/table-state.interface.mjs +0 -5
  68. package/esm2020/lib/renderer/models/table-types.mjs +0 -29
  69. package/esm2020/lib/renderer/models/table-validation-state.interface.mjs +0 -7
  70. package/esm2020/lib/renderer/models/workbook-state.class.mjs +0 -174
  71. package/esm2020/lib/renderer/models/workbook-state.interface.mjs +0 -5
  72. package/esm2020/lib/renderer/models/z-index.enum.mjs +0 -55
  73. package/esm2020/lib/schemas/table-config.schema.mjs +0 -472
  74. package/esm2020/lib/services/autosave.service.mjs +0 -92
  75. package/esm2020/lib/services/custom-validation-rules.util.mjs +0 -124
  76. package/esm2020/lib/services/json-schema-validator.service.mjs +0 -216
  77. package/esm2020/lib/services/row-validation.service.mjs +0 -42
  78. package/esm2020/lib/services/validation-logger.service.mjs +0 -177
  79. package/esm2020/lib/services/virtual-scroll.service.mjs +0 -52
  80. package/esm2020/lib/shared/shared-table-components.module.mjs +0 -35
  81. package/esm2020/lib/smart-table.module.mjs +0 -124
  82. package/esm2020/lib/strategies/default-editors.mjs +0 -433
  83. package/esm2020/lib/strategies/default-formatters.mjs +0 -238
  84. package/esm2020/lib/strategies/default-validators.mjs +0 -327
  85. package/esm2020/public-api.mjs +0 -146
  86. package/fesm2015/aquera-ngx-smart-table.mjs +0 -12347
  87. package/fesm2015/aquera-ngx-smart-table.mjs.map +0 -1
  88. package/fesm2020/aquera-ngx-smart-table.mjs.map +0 -1
  89. package/lib/builder/components/builder-preview/builder-preview.component.d.ts +0 -31
  90. package/lib/builder/components/builder-toolbar/builder-toolbar.component.d.ts +0 -53
  91. package/lib/builder/components/column-editor/column-editor.component.d.ts +0 -69
  92. package/lib/builder/components/column-list/column-list.component.d.ts +0 -65
  93. package/lib/builder/components/definition-builder/definition-builder.component.d.ts +0 -58
  94. package/lib/builder/components/table-config-editor/table-config-editor.component.d.ts +0 -32
  95. package/lib/builder/definition-builder.module.d.ts +0 -15
  96. package/lib/builder/models/builder-state.interface.d.ts +0 -93
  97. package/lib/builder/services/definition-builder.service.d.ts +0 -80
  98. package/lib/builder/services/definition-export.service.d.ts +0 -59
  99. package/lib/builder/services/definition-import.service.d.ts +0 -31
  100. package/lib/builder/services/sample-data-generator.service.d.ts +0 -41
  101. package/lib/builder/utils/config-validator.util.d.ts +0 -32
  102. package/lib/builder/utils/typescript-generator.util.d.ts +0 -29
  103. package/lib/editors/index.d.ts +0 -8
  104. package/lib/editors/nile-autocomplete-editor.d.ts +0 -102
  105. package/lib/editors/nile-calendar-editor.d.ts +0 -88
  106. package/lib/editors/nile-date-picker-editor.d.ts +0 -97
  107. package/lib/editors/nile-input-editor.d.ts +0 -67
  108. package/lib/editors/nile-select-editor.d.ts +0 -113
  109. package/lib/factories/column-config.factory.d.ts +0 -73
  110. package/lib/models/autosave-config.interface.d.ts +0 -23
  111. package/lib/models/base-column-config.class.d.ts +0 -115
  112. package/lib/models/cell-strategies.interface.d.ts +0 -188
  113. package/lib/models/cell-types.d.ts +0 -337
  114. package/lib/models/column-action.interface.d.ts +0 -86
  115. package/lib/models/column-config.interface.d.ts +0 -272
  116. package/lib/models/column-config.utils.d.ts +0 -37
  117. package/lib/models/row-action.interface.d.ts +0 -86
  118. package/lib/models/row-validator.interface.d.ts +0 -37
  119. package/lib/models/schema-validation.interface.d.ts +0 -42
  120. package/lib/models/sheet-action.interface.d.ts +0 -59
  121. package/lib/models/sheet-config.interface.d.ts +0 -41
  122. package/lib/models/table-config.interface.d.ts +0 -251
  123. package/lib/models/table-validator.interface.d.ts +0 -40
  124. package/lib/models/workbook-action.interface.d.ts +0 -95
  125. package/lib/models/workbook-config.interface.d.ts +0 -107
  126. package/lib/renderer/components/st-add-column-button/st-add-column-button.component.d.ts +0 -9
  127. package/lib/renderer/components/st-cell/st-cell.component.d.ts +0 -69
  128. package/lib/renderer/components/st-column-editor-modal/st-column-editor-modal.component.d.ts +0 -39
  129. package/lib/renderer/components/st-column-filter/st-column-filter.component.d.ts +0 -139
  130. package/lib/renderer/components/st-column-menu/st-column-menu.component.d.ts +0 -81
  131. package/lib/renderer/components/st-column-visibility/st-column-visibility.component.d.ts +0 -44
  132. package/lib/renderer/components/st-header/st-header.component.d.ts +0 -93
  133. package/lib/renderer/components/st-pagination/st-pagination.component.d.ts +0 -42
  134. package/lib/renderer/components/st-row-actions-dropdown/st-row-actions-dropdown.component.d.ts +0 -67
  135. package/lib/renderer/components/st-sheet/st-sheet.component.d.ts +0 -98
  136. package/lib/renderer/components/st-sheet-actions/st-sheet-actions.component.d.ts +0 -58
  137. package/lib/renderer/components/st-table/st-table.component.d.ts +0 -380
  138. package/lib/renderer/components/st-table-actions/st-table-actions.component.d.ts +0 -77
  139. package/lib/renderer/components/st-workbook/st-workbook.component.d.ts +0 -275
  140. package/lib/renderer/directives/click-outside.directive.d.ts +0 -10
  141. package/lib/renderer/directives/st-column-resize.directive.d.ts +0 -44
  142. package/lib/renderer/directives/st-keyboard-navigation.directive.d.ts +0 -19
  143. package/lib/renderer/models/cell-state.interface.d.ts +0 -118
  144. package/lib/renderer/models/cell.class.d.ts +0 -174
  145. package/lib/renderer/models/row-validation-state.interface.d.ts +0 -27
  146. package/lib/renderer/models/sheet-state.class.d.ts +0 -67
  147. package/lib/renderer/models/sheet-state.interface.d.ts +0 -55
  148. package/lib/renderer/models/table-state.class.d.ts +0 -320
  149. package/lib/renderer/models/table-state.interface.d.ts +0 -18
  150. package/lib/renderer/models/table-types.d.ts +0 -228
  151. package/lib/renderer/models/table-validation-state.interface.d.ts +0 -34
  152. package/lib/renderer/models/workbook-state.class.d.ts +0 -117
  153. package/lib/renderer/models/workbook-state.interface.d.ts +0 -71
  154. package/lib/renderer/models/z-index.enum.d.ts +0 -44
  155. package/lib/schemas/table-config.schema.d.ts +0 -455
  156. package/lib/services/autosave.service.d.ts +0 -73
  157. package/lib/services/custom-validation-rules.util.d.ts +0 -12
  158. package/lib/services/json-schema-validator.service.d.ts +0 -49
  159. package/lib/services/row-validation.service.d.ts +0 -17
  160. package/lib/services/validation-logger.service.d.ts +0 -87
  161. package/lib/services/virtual-scroll.service.d.ts +0 -44
  162. package/lib/shared/shared-table-components.module.d.ts +0 -9
  163. package/lib/smart-table.module.d.ts +0 -26
  164. package/lib/strategies/default-editors.d.ts +0 -109
  165. package/lib/strategies/default-formatters.d.ts +0 -116
  166. package/lib/strategies/default-validators.d.ts +0 -113
  167. package/public-api.d.ts +0 -70
  168. package/src/lib/builder/README.md +0 -30
  169. package/src/lib/editors/README.md +0 -303
  170. package/src/lib/renderer/components/st-column-filter/README.md +0 -286
@@ -1,5 +0,0 @@
1
- /**
2
- * Generated bundle index. Do not edit.
3
- */
4
- /// <amd-module name="@aquera/ngx-smart-table" />
5
- export * from './public-api';
@@ -1,5 +0,0 @@
1
- /**
2
- * Generated bundle index. Do not edit.
3
- */
4
- export * from './public-api';
5
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXF1ZXJhLW5neC1zbWFydC10YWJsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL3NtYXJ0LXRhYmxlL3NyYy9hcXVlcmEtbmd4LXNtYXJ0LXRhYmxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsY0FBYyxjQUFjLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEdlbmVyYXRlZCBidW5kbGUgaW5kZXguIERvIG5vdCBlZGl0LlxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vcHVibGljLWFwaSc7XG4iXX0=
@@ -1,63 +0,0 @@
1
- /**
2
- * Builder Preview Component
3
- * Live preview of table using st-table component
4
- */
5
- import { Component, Input } from '@angular/core';
6
- import * as i0 from "@angular/core";
7
- import * as i1 from "../../services/sample-data-generator.service";
8
- import * as i2 from "../../../renderer/components/st-table/st-table.component";
9
- import * as i3 from "@angular/common";
10
- export class BuilderPreviewComponent {
11
- constructor(sampleDataGenerator) {
12
- this.sampleDataGenerator = sampleDataGenerator;
13
- this.sampleData = [];
14
- this.isLoading = false;
15
- }
16
- ngOnInit() {
17
- this.generatePreviewData();
18
- }
19
- ngOnChanges(changes) {
20
- if (changes['tableConfig'] && !changes['tableConfig'].firstChange) {
21
- this.generatePreviewData();
22
- }
23
- }
24
- /**
25
- * Generate sample data for preview
26
- */
27
- generatePreviewData() {
28
- if (!this.tableConfig || !this.tableConfig?.columns || this.tableConfig?.columns.length === 0) {
29
- this.sampleData = [];
30
- return;
31
- }
32
- this.isLoading = true;
33
- // Generate sample data based on columns
34
- setTimeout(() => {
35
- this.sampleData = this.sampleDataGenerator.generateSampleData(this.tableConfig.columns, 5 // Generate 5 sample rows
36
- );
37
- this.isLoading = false;
38
- }, 100);
39
- }
40
- /**
41
- * Refresh preview
42
- */
43
- refreshPreview() {
44
- this.generatePreviewData();
45
- }
46
- /**
47
- * Handle state change from preview table
48
- */
49
- onStateChange(event) {
50
- // Preview is read-only, so we don't need to handle state changes
51
- // But we can log them for debugging
52
- console.log('Preview state change:', event);
53
- }
54
- }
55
- BuilderPreviewComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: BuilderPreviewComponent, deps: [{ token: i1.SampleDataGeneratorService }], target: i0.ɵɵFactoryTarget.Component });
56
- BuilderPreviewComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: BuilderPreviewComponent, selector: "st-builder-preview", inputs: { tableConfig: "tableConfig" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"builder-preview\">\n <div class=\"preview-header\">\n <h3>Live Preview</h3>\n <button class=\"refresh-btn\" (click)=\"refreshPreview()\" title=\"Refresh Preview\">\n \u21BB Refresh\n </button>\n </div>\n\n <div class=\"preview-content\">\n <div *ngIf=\"isLoading\" class=\"loading\">\n <p>Generating preview...</p>\n </div>\n\n <div *ngIf=\"!isLoading && tableConfig?.columns?.length === 0\" class=\"empty-state\">\n <p>Add columns to see preview</p>\n </div>\n <ng-container *ngIf=\"tableConfig\">\n <st-table\n *ngIf=\"!isLoading && tableConfig!.columns!.length > 0\"\n [tableConfig]=\"tableConfig\"\n [data]=\"sampleData\"\n (stateChange)=\"onStateChange($event)\">\n </st-table>\n </ng-container>\n\n </div>\n</div>\n\n", styles: [".builder-preview{height:100%}.preview-header{display:flex;justify-content:space-between;align-items:center;padding:1rem;border-bottom:1px solid #e0e0e0;background-color:#f8f8f8}.preview-header h3{margin:0;font-size:1rem;font-weight:600;color:#333}.refresh-btn{padding:.5rem 1rem;border:1px solid #d0d0d0;border-radius:4px;background-color:#fff;color:#333;cursor:pointer;font-size:.875rem;transition:all .2s}.refresh-btn:hover{background-color:#f5f5f5}.preview-content{overflow:auto}.loading,.empty-state{display:flex;align-items:center;justify-content:center;height:200px;color:#999;font-size:.875rem}\n"], components: [{ type: i2.StTableComponent, selector: "st-table", inputs: ["tableConfig", "data", "data$", "tableState", "enableSorting", "enableFiltering", "validateConfig"], outputs: ["stateChange", "dataChange", "cellEdit", "cellSave", "cellCancel", "cellChange", "columnResized", "columnMoved", "configValidationErrors", "columnAdded", "rowAction", "validationStateChange", "requestAddRow"] }], directives: [{ type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
57
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: BuilderPreviewComponent, decorators: [{
58
- type: Component,
59
- args: [{ selector: 'st-builder-preview', template: "<div class=\"builder-preview\">\n <div class=\"preview-header\">\n <h3>Live Preview</h3>\n <button class=\"refresh-btn\" (click)=\"refreshPreview()\" title=\"Refresh Preview\">\n \u21BB Refresh\n </button>\n </div>\n\n <div class=\"preview-content\">\n <div *ngIf=\"isLoading\" class=\"loading\">\n <p>Generating preview...</p>\n </div>\n\n <div *ngIf=\"!isLoading && tableConfig?.columns?.length === 0\" class=\"empty-state\">\n <p>Add columns to see preview</p>\n </div>\n <ng-container *ngIf=\"tableConfig\">\n <st-table\n *ngIf=\"!isLoading && tableConfig!.columns!.length > 0\"\n [tableConfig]=\"tableConfig\"\n [data]=\"sampleData\"\n (stateChange)=\"onStateChange($event)\">\n </st-table>\n </ng-container>\n\n </div>\n</div>\n\n", styles: [".builder-preview{height:100%}.preview-header{display:flex;justify-content:space-between;align-items:center;padding:1rem;border-bottom:1px solid #e0e0e0;background-color:#f8f8f8}.preview-header h3{margin:0;font-size:1rem;font-weight:600;color:#333}.refresh-btn{padding:.5rem 1rem;border:1px solid #d0d0d0;border-radius:4px;background-color:#fff;color:#333;cursor:pointer;font-size:.875rem;transition:all .2s}.refresh-btn:hover{background-color:#f5f5f5}.preview-content{overflow:auto}.loading,.empty-state{display:flex;align-items:center;justify-content:center;height:200px;color:#999;font-size:.875rem}\n"] }]
60
- }], ctorParameters: function () { return [{ type: i1.SampleDataGeneratorService }]; }, propDecorators: { tableConfig: [{
61
- type: Input
62
- }] } });
63
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGRlci1wcmV2aWV3LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NtYXJ0LXRhYmxlL3NyYy9saWIvYnVpbGRlci9jb21wb25lbnRzL2J1aWxkZXItcHJldmlldy9idWlsZGVyLXByZXZpZXcuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc21hcnQtdGFibGUvc3JjL2xpYi9idWlsZGVyL2NvbXBvbmVudHMvYnVpbGRlci1wcmV2aWV3L2J1aWxkZXItcHJldmlldy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFFSCxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBb0MsTUFBTSxlQUFlLENBQUM7Ozs7O0FBU25GLE1BQU0sT0FBTyx1QkFBdUI7SUFNbEMsWUFDVSxtQkFBK0M7UUFBL0Msd0JBQW1CLEdBQW5CLG1CQUFtQixDQUE0QjtRQUp6RCxlQUFVLEdBQVUsRUFBRSxDQUFDO1FBQ3ZCLGNBQVMsR0FBRyxLQUFLLENBQUM7SUFJZixDQUFDO0lBRUosUUFBUTtRQUNOLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFFRCxXQUFXLENBQUMsT0FBc0I7UUFDaEMsSUFBSSxPQUFPLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsV0FBVyxFQUFFO1lBQ2pFLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1NBQzVCO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0ssbUJBQW1CO1FBQ3pCLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxPQUFPLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxPQUFPLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUM3RixJQUFJLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQztZQUNyQixPQUFPO1NBQ1I7UUFFRCxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztRQUV0Qix3Q0FBd0M7UUFDeEMsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNkLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGtCQUFrQixDQUMzRCxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFDeEIsQ0FBQyxDQUFDLHlCQUF5QjthQUM1QixDQUFDO1lBQ0YsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDekIsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ1YsQ0FBQztJQUVEOztPQUVHO0lBQ0gsY0FBYztRQUNaLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFFRDs7T0FFRztJQUNILGFBQWEsQ0FBQyxLQUFVO1FBQ3RCLGlFQUFpRTtRQUNqRSxvQ0FBb0M7UUFDcEMsT0FBTyxDQUFDLEdBQUcsQ0FBQyx1QkFBdUIsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUM5QyxDQUFDOztvSEF2RFUsdUJBQXVCO3dHQUF2Qix1QkFBdUIsdUhDZHBDLHN6QkE0QkE7MkZEZGEsdUJBQXVCO2tCQUxuQyxTQUFTOytCQUNFLG9CQUFvQjtpSEFLckIsV0FBVztzQkFBbkIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQnVpbGRlciBQcmV2aWV3IENvbXBvbmVudFxuICogTGl2ZSBwcmV2aWV3IG9mIHRhYmxlIHVzaW5nIHN0LXRhYmxlIGNvbXBvbmVudFxuICovXG5cbmltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE9uSW5pdCwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBUYWJsZUNvbmZpZyB9IGZyb20gJy4uLy4uLy4uL21vZGVscy90YWJsZS1jb25maWcuaW50ZXJmYWNlJztcbmltcG9ydCB7IFNhbXBsZURhdGFHZW5lcmF0b3JTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvc2FtcGxlLWRhdGEtZ2VuZXJhdG9yLnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzdC1idWlsZGVyLXByZXZpZXcnLFxuICB0ZW1wbGF0ZVVybDogJy4vYnVpbGRlci1wcmV2aWV3LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vYnVpbGRlci1wcmV2aWV3LmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgQnVpbGRlclByZXZpZXdDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XG4gIEBJbnB1dCgpIHRhYmxlQ29uZmlnITogVGFibGVDb25maWc7XG5cbiAgc2FtcGxlRGF0YTogYW55W10gPSBbXTtcbiAgaXNMb2FkaW5nID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBzYW1wbGVEYXRhR2VuZXJhdG9yOiBTYW1wbGVEYXRhR2VuZXJhdG9yU2VydmljZSxcbiAgKSB7fVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuZ2VuZXJhdGVQcmV2aWV3RGF0YSgpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWyd0YWJsZUNvbmZpZyddICYmICFjaGFuZ2VzWyd0YWJsZUNvbmZpZyddLmZpcnN0Q2hhbmdlKSB7XG4gICAgICB0aGlzLmdlbmVyYXRlUHJldmlld0RhdGEoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGUgc2FtcGxlIGRhdGEgZm9yIHByZXZpZXdcbiAgICovXG4gIHByaXZhdGUgZ2VuZXJhdGVQcmV2aWV3RGF0YSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMudGFibGVDb25maWcgfHwgIXRoaXMudGFibGVDb25maWc/LmNvbHVtbnMgfHwgdGhpcy50YWJsZUNvbmZpZz8uY29sdW1ucy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMuc2FtcGxlRGF0YSA9IFtdO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuaXNMb2FkaW5nID0gdHJ1ZTtcbiAgICBcbiAgICAvLyBHZW5lcmF0ZSBzYW1wbGUgZGF0YSBiYXNlZCBvbiBjb2x1bW5zXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnNhbXBsZURhdGEgPSB0aGlzLnNhbXBsZURhdGFHZW5lcmF0b3IuZ2VuZXJhdGVTYW1wbGVEYXRhKFxuICAgICAgICB0aGlzLnRhYmxlQ29uZmlnLmNvbHVtbnMsXG4gICAgICAgIDUgLy8gR2VuZXJhdGUgNSBzYW1wbGUgcm93c1xuICAgICAgKTtcbiAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgfSwgMTAwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWZyZXNoIHByZXZpZXdcbiAgICovXG4gIHJlZnJlc2hQcmV2aWV3KCk6IHZvaWQge1xuICAgIHRoaXMuZ2VuZXJhdGVQcmV2aWV3RGF0YSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBzdGF0ZSBjaGFuZ2UgZnJvbSBwcmV2aWV3IHRhYmxlXG4gICAqL1xuICBvblN0YXRlQ2hhbmdlKGV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICAvLyBQcmV2aWV3IGlzIHJlYWQtb25seSwgc28gd2UgZG9uJ3QgbmVlZCB0byBoYW5kbGUgc3RhdGUgY2hhbmdlc1xuICAgIC8vIEJ1dCB3ZSBjYW4gbG9nIHRoZW0gZm9yIGRlYnVnZ2luZ1xuICAgIGNvbnNvbGUubG9nKCdQcmV2aWV3IHN0YXRlIGNoYW5nZTonLCBldmVudCk7XG4gIH1cbn1cblxuIiwiPGRpdiBjbGFzcz1cImJ1aWxkZXItcHJldmlld1wiPlxuICA8ZGl2IGNsYXNzPVwicHJldmlldy1oZWFkZXJcIj5cbiAgICA8aDM+TGl2ZSBQcmV2aWV3PC9oMz5cbiAgICA8YnV0dG9uIGNsYXNzPVwicmVmcmVzaC1idG5cIiAoY2xpY2spPVwicmVmcmVzaFByZXZpZXcoKVwiIHRpdGxlPVwiUmVmcmVzaCBQcmV2aWV3XCI+XG4gICAgICDihrsgUmVmcmVzaFxuICAgIDwvYnV0dG9uPlxuICA8L2Rpdj5cblxuICA8ZGl2IGNsYXNzPVwicHJldmlldy1jb250ZW50XCI+XG4gICAgPGRpdiAqbmdJZj1cImlzTG9hZGluZ1wiIGNsYXNzPVwibG9hZGluZ1wiPlxuICAgICAgPHA+R2VuZXJhdGluZyBwcmV2aWV3Li4uPC9wPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiAqbmdJZj1cIiFpc0xvYWRpbmcgJiYgdGFibGVDb25maWc/LmNvbHVtbnM/Lmxlbmd0aCA9PT0gMFwiIGNsYXNzPVwiZW1wdHktc3RhdGVcIj5cbiAgICAgIDxwPkFkZCBjb2x1bW5zIHRvIHNlZSBwcmV2aWV3PC9wPlxuICAgIDwvZGl2PlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ0YWJsZUNvbmZpZ1wiPlxuICAgICAgPHN0LXRhYmxlXG4gICAgICAgICpuZ0lmPVwiIWlzTG9hZGluZyAmJiB0YWJsZUNvbmZpZyEuY29sdW1ucyEubGVuZ3RoID4gMFwiXG4gICAgICAgIFt0YWJsZUNvbmZpZ109XCJ0YWJsZUNvbmZpZ1wiXG4gICAgICAgIFtkYXRhXT1cInNhbXBsZURhdGFcIlxuICAgICAgICAoc3RhdGVDaGFuZ2UpPVwib25TdGF0ZUNoYW5nZSgkZXZlbnQpXCI+XG4gICAgICA8L3N0LXRhYmxlPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gIDwvZGl2PlxuPC9kaXY+XG5cbiJdfQ==
@@ -1,115 +0,0 @@
1
- /**
2
- * Builder Toolbar Component
3
- * Handles file operations and actions
4
- */
5
- import { Component, Input, Output, EventEmitter } from '@angular/core';
6
- import * as i0 from "@angular/core";
7
- import * as i1 from "../../services/definition-builder.service";
8
- import * as i2 from "../../services/definition-export.service";
9
- import * as i3 from "../../services/definition-import.service";
10
- import * as i4 from "@angular/common";
11
- export class BuilderToolbarComponent {
12
- constructor(builderService, exportService, importService) {
13
- this.builderService = builderService;
14
- this.exportService = exportService;
15
- this.importService = importService;
16
- this.hasUnsavedChanges = false;
17
- this.newDefinition = new EventEmitter();
18
- this.saved = new EventEmitter();
19
- this.previewToggled = new EventEmitter();
20
- }
21
- /**
22
- * Handle new definition button click
23
- */
24
- onNewDefinition() {
25
- this.newDefinition.emit();
26
- }
27
- /**
28
- * Handle open file button click
29
- */
30
- onOpenFile() {
31
- const input = document.createElement('input');
32
- input.type = 'file';
33
- input.accept = '.json';
34
- input.onchange = (event) => {
35
- const file = event.target.files[0];
36
- if (file) {
37
- this.importService.importFromFile(file).then(result => {
38
- if (result.success && result.tableConfig) {
39
- this.builderService.initialize(result.tableConfig);
40
- this.saved.emit();
41
- }
42
- else {
43
- alert(`Failed to import: ${result.error}`);
44
- }
45
- });
46
- }
47
- };
48
- input.click();
49
- }
50
- /**
51
- * Handle save button click
52
- */
53
- onSave() {
54
- const state = this.builderService.getState();
55
- this.exportService.saveToLocalStorage(state.tableConfig);
56
- this.saved.emit();
57
- }
58
- /**
59
- * Handle load from localStorage button click
60
- */
61
- onLoad() {
62
- const config = this.exportService.loadFromLocalStorage();
63
- if (config) {
64
- this.builderService.initialize(config);
65
- this.saved.emit();
66
- }
67
- else {
68
- alert('No saved configuration found');
69
- }
70
- }
71
- /**
72
- * Handle export JSON button click
73
- */
74
- onExportJSON() {
75
- const state = this.builderService.getState();
76
- this.exportService.downloadAsJSON(state.tableConfig);
77
- }
78
- /**
79
- * Handle export TypeScript button click
80
- */
81
- onExportTypeScript() {
82
- const state = this.builderService.getState();
83
- this.exportService.downloadAsTypeScript(state.tableConfig, 'table-config', {
84
- includeComments: true,
85
- variableName: 'tableConfig'
86
- });
87
- }
88
- /**
89
- * Handle import JSON button click
90
- */
91
- onImportJSON() {
92
- this.onOpenFile();
93
- }
94
- /**
95
- * Handle preview toggle button click
96
- */
97
- onTogglePreview() {
98
- this.previewToggled.emit();
99
- }
100
- }
101
- BuilderToolbarComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: BuilderToolbarComponent, deps: [{ token: i1.DefinitionBuilderService }, { token: i2.DefinitionExportService }, { token: i3.DefinitionImportService }], target: i0.ɵɵFactoryTarget.Component });
102
- BuilderToolbarComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: BuilderToolbarComponent, selector: "st-builder-toolbar", inputs: { hasUnsavedChanges: "hasUnsavedChanges" }, outputs: { newDefinition: "newDefinition", saved: "saved", previewToggled: "previewToggled" }, ngImport: i0, template: "<div class=\"builder-toolbar\">\n <div class=\"toolbar-section\">\n <button class=\"toolbar-btn\" (click)=\"onNewDefinition()\" title=\"New Definition\">\n <span>New</span>\n </button>\n <button class=\"toolbar-btn\" (click)=\"onOpenFile()\" title=\"Open File\">\n <span>Open</span>\n </button>\n <button class=\"toolbar-btn\" (click)=\"onSave()\" title=\"Save to LocalStorage\" [class.has-changes]=\"hasUnsavedChanges\">\n <span>Save</span>\n <span *ngIf=\"hasUnsavedChanges\" class=\"unsaved-indicator\">\u25CF</span>\n </button>\n <button class=\"toolbar-btn\" (click)=\"onLoad()\" title=\"Load from LocalStorage\">\n <span>Load</span>\n </button>\n </div>\n\n <div class=\"toolbar-section\">\n <button class=\"toolbar-btn\" (click)=\"onImportJSON()\" title=\"Import JSON\">\n <span>Import JSON</span>\n </button>\n <button class=\"toolbar-btn\" (click)=\"onExportJSON()\" title=\"Export JSON\">\n <span>Export JSON</span>\n </button>\n <button class=\"toolbar-btn\" (click)=\"onExportTypeScript()\" title=\"Export TypeScript\">\n <span>Export TS</span>\n </button>\n </div>\n\n <div class=\"toolbar-section\">\n <button class=\"toolbar-btn\" (click)=\"onTogglePreview()\" title=\"Toggle Preview\">\n <span>Preview</span>\n </button>\n </div>\n</div>\n\n", styles: [".builder-toolbar{display:flex;align-items:center;gap:1rem;padding:.75rem 1rem;background-color:#fff;border-bottom:1px solid #e0e0e0;box-shadow:0 2px 4px #0000000d}.toolbar-section{display:flex;align-items:center;gap:.5rem}.toolbar-section:not(:last-child):after{content:\"\";width:1px;height:24px;background-color:#e0e0e0;margin-left:.5rem}.toolbar-btn{display:flex;align-items:center;gap:.25rem;padding:.5rem 1rem;border:1px solid #d0d0d0;border-radius:4px;background-color:#fff;color:#333;cursor:pointer;font-size:.875rem;transition:all .2s}.toolbar-btn:hover{background-color:#f5f5f5;border-color:#b0b0b0}.toolbar-btn:active{background-color:#e8e8e8}.toolbar-btn.has-changes{border-color:#ff9800;background-color:#fff3e0}.toolbar-btn .unsaved-indicator{color:#ff9800;font-size:.75rem;margin-left:.25rem}\n"], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
103
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: BuilderToolbarComponent, decorators: [{
104
- type: Component,
105
- args: [{ selector: 'st-builder-toolbar', template: "<div class=\"builder-toolbar\">\n <div class=\"toolbar-section\">\n <button class=\"toolbar-btn\" (click)=\"onNewDefinition()\" title=\"New Definition\">\n <span>New</span>\n </button>\n <button class=\"toolbar-btn\" (click)=\"onOpenFile()\" title=\"Open File\">\n <span>Open</span>\n </button>\n <button class=\"toolbar-btn\" (click)=\"onSave()\" title=\"Save to LocalStorage\" [class.has-changes]=\"hasUnsavedChanges\">\n <span>Save</span>\n <span *ngIf=\"hasUnsavedChanges\" class=\"unsaved-indicator\">\u25CF</span>\n </button>\n <button class=\"toolbar-btn\" (click)=\"onLoad()\" title=\"Load from LocalStorage\">\n <span>Load</span>\n </button>\n </div>\n\n <div class=\"toolbar-section\">\n <button class=\"toolbar-btn\" (click)=\"onImportJSON()\" title=\"Import JSON\">\n <span>Import JSON</span>\n </button>\n <button class=\"toolbar-btn\" (click)=\"onExportJSON()\" title=\"Export JSON\">\n <span>Export JSON</span>\n </button>\n <button class=\"toolbar-btn\" (click)=\"onExportTypeScript()\" title=\"Export TypeScript\">\n <span>Export TS</span>\n </button>\n </div>\n\n <div class=\"toolbar-section\">\n <button class=\"toolbar-btn\" (click)=\"onTogglePreview()\" title=\"Toggle Preview\">\n <span>Preview</span>\n </button>\n </div>\n</div>\n\n", styles: [".builder-toolbar{display:flex;align-items:center;gap:1rem;padding:.75rem 1rem;background-color:#fff;border-bottom:1px solid #e0e0e0;box-shadow:0 2px 4px #0000000d}.toolbar-section{display:flex;align-items:center;gap:.5rem}.toolbar-section:not(:last-child):after{content:\"\";width:1px;height:24px;background-color:#e0e0e0;margin-left:.5rem}.toolbar-btn{display:flex;align-items:center;gap:.25rem;padding:.5rem 1rem;border:1px solid #d0d0d0;border-radius:4px;background-color:#fff;color:#333;cursor:pointer;font-size:.875rem;transition:all .2s}.toolbar-btn:hover{background-color:#f5f5f5;border-color:#b0b0b0}.toolbar-btn:active{background-color:#e8e8e8}.toolbar-btn.has-changes{border-color:#ff9800;background-color:#fff3e0}.toolbar-btn .unsaved-indicator{color:#ff9800;font-size:.75rem;margin-left:.25rem}\n"] }]
106
- }], ctorParameters: function () { return [{ type: i1.DefinitionBuilderService }, { type: i2.DefinitionExportService }, { type: i3.DefinitionImportService }]; }, propDecorators: { hasUnsavedChanges: [{
107
- type: Input
108
- }], newDefinition: [{
109
- type: Output
110
- }], saved: [{
111
- type: Output
112
- }], previewToggled: [{
113
- type: Output
114
- }] } });
115
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGRlci10b29sYmFyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NtYXJ0LXRhYmxlL3NyYy9saWIvYnVpbGRlci9jb21wb25lbnRzL2J1aWxkZXItdG9vbGJhci9idWlsZGVyLXRvb2xiYXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc21hcnQtdGFibGUvc3JjL2xpYi9idWlsZGVyL2NvbXBvbmVudHMvYnVpbGRlci10b29sYmFyL2J1aWxkZXItdG9vbGJhci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFFSCxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7Ozs7QUFVdkUsTUFBTSxPQUFPLHVCQUF1QjtJQU9sQyxZQUNVLGNBQXdDLEVBQ3hDLGFBQXNDLEVBQ3RDLGFBQXNDO1FBRnRDLG1CQUFjLEdBQWQsY0FBYyxDQUEwQjtRQUN4QyxrQkFBYSxHQUFiLGFBQWEsQ0FBeUI7UUFDdEMsa0JBQWEsR0FBYixhQUFhLENBQXlCO1FBVHZDLHNCQUFpQixHQUFZLEtBQUssQ0FBQztRQUVsQyxrQkFBYSxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFDekMsVUFBSyxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFDakMsbUJBQWMsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO0lBTWpELENBQUM7SUFFSjs7T0FFRztJQUNILGVBQWU7UUFDYixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFRDs7T0FFRztJQUNILFVBQVU7UUFDUixNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzlDLEtBQUssQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDO1FBQ3BCLEtBQUssQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDO1FBQ3ZCLEtBQUssQ0FBQyxRQUFRLEdBQUcsQ0FBQyxLQUFVLEVBQUUsRUFBRTtZQUM5QixNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNuQyxJQUFJLElBQUksRUFBRTtnQkFDUixJQUFJLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUU7b0JBQ3BELElBQUksTUFBTSxDQUFDLE9BQU8sSUFBSSxNQUFNLENBQUMsV0FBVyxFQUFFO3dCQUN4QyxJQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7d0JBQ25ELElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7cUJBQ25CO3lCQUFNO3dCQUNMLEtBQUssQ0FBQyxxQkFBcUIsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7cUJBQzVDO2dCQUNILENBQUMsQ0FBQyxDQUFDO2FBQ0o7UUFDSCxDQUFDLENBQUM7UUFDRixLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDaEIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsTUFBTTtRQUNKLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDN0MsSUFBSSxDQUFDLGFBQWEsQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDekQsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNwQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxNQUFNO1FBQ0osTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBQ3pELElBQUksTUFBTSxFQUFFO1lBQ1YsSUFBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDdkMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztTQUNuQjthQUFNO1lBQ0wsS0FBSyxDQUFDLDhCQUE4QixDQUFDLENBQUM7U0FDdkM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxZQUFZO1FBQ1YsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUM3QyxJQUFJLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUVEOztPQUVHO0lBQ0gsa0JBQWtCO1FBQ2hCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDN0MsSUFBSSxDQUFDLGFBQWEsQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLGNBQWMsRUFBRTtZQUN6RSxlQUFlLEVBQUUsSUFBSTtZQUNyQixZQUFZLEVBQUUsYUFBYTtTQUM1QixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxZQUFZO1FBQ1YsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ3BCLENBQUM7SUFFRDs7T0FFRztJQUNILGVBQWU7UUFDYixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzdCLENBQUM7O29IQWhHVSx1QkFBdUI7d0dBQXZCLHVCQUF1Qiw2TUNmcEMsODBDQW9DQTsyRkRyQmEsdUJBQXVCO2tCQUxuQyxTQUFTOytCQUNFLG9CQUFvQjsyTEFLckIsaUJBQWlCO3NCQUF6QixLQUFLO2dCQUVJLGFBQWE7c0JBQXRCLE1BQU07Z0JBQ0csS0FBSztzQkFBZCxNQUFNO2dCQUNHLGNBQWM7c0JBQXZCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEJ1aWxkZXIgVG9vbGJhciBDb21wb25lbnRcbiAqIEhhbmRsZXMgZmlsZSBvcGVyYXRpb25zIGFuZCBhY3Rpb25zXG4gKi9cblxuaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERlZmluaXRpb25CdWlsZGVyU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2RlZmluaXRpb24tYnVpbGRlci5zZXJ2aWNlJztcbmltcG9ydCB7IERlZmluaXRpb25FeHBvcnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZGVmaW5pdGlvbi1leHBvcnQuc2VydmljZSc7XG5pbXBvcnQgeyBEZWZpbml0aW9uSW1wb3J0U2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2RlZmluaXRpb24taW1wb3J0LnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzdC1idWlsZGVyLXRvb2xiYXInLFxuICB0ZW1wbGF0ZVVybDogJy4vYnVpbGRlci10b29sYmFyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vYnVpbGRlci10b29sYmFyLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgQnVpbGRlclRvb2xiYXJDb21wb25lbnQge1xuICBASW5wdXQoKSBoYXNVbnNhdmVkQ2hhbmdlczogYm9vbGVhbiA9IGZhbHNlO1xuICBcbiAgQE91dHB1dCgpIG5ld0RlZmluaXRpb24gPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSBzYXZlZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIHByZXZpZXdUb2dnbGVkID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgYnVpbGRlclNlcnZpY2U6IERlZmluaXRpb25CdWlsZGVyU2VydmljZSxcbiAgICBwcml2YXRlIGV4cG9ydFNlcnZpY2U6IERlZmluaXRpb25FeHBvcnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgaW1wb3J0U2VydmljZTogRGVmaW5pdGlvbkltcG9ydFNlcnZpY2VcbiAgKSB7fVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgbmV3IGRlZmluaXRpb24gYnV0dG9uIGNsaWNrXG4gICAqL1xuICBvbk5ld0RlZmluaXRpb24oKTogdm9pZCB7XG4gICAgdGhpcy5uZXdEZWZpbml0aW9uLmVtaXQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgb3BlbiBmaWxlIGJ1dHRvbiBjbGlja1xuICAgKi9cbiAgb25PcGVuRmlsZSgpOiB2b2lkIHtcbiAgICBjb25zdCBpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7XG4gICAgaW5wdXQudHlwZSA9ICdmaWxlJztcbiAgICBpbnB1dC5hY2NlcHQgPSAnLmpzb24nO1xuICAgIGlucHV0Lm9uY2hhbmdlID0gKGV2ZW50OiBhbnkpID0+IHtcbiAgICAgIGNvbnN0IGZpbGUgPSBldmVudC50YXJnZXQuZmlsZXNbMF07XG4gICAgICBpZiAoZmlsZSkge1xuICAgICAgICB0aGlzLmltcG9ydFNlcnZpY2UuaW1wb3J0RnJvbUZpbGUoZmlsZSkudGhlbihyZXN1bHQgPT4ge1xuICAgICAgICAgIGlmIChyZXN1bHQuc3VjY2VzcyAmJiByZXN1bHQudGFibGVDb25maWcpIHtcbiAgICAgICAgICAgIHRoaXMuYnVpbGRlclNlcnZpY2UuaW5pdGlhbGl6ZShyZXN1bHQudGFibGVDb25maWcpO1xuICAgICAgICAgICAgdGhpcy5zYXZlZC5lbWl0KCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFsZXJ0KGBGYWlsZWQgdG8gaW1wb3J0OiAke3Jlc3VsdC5lcnJvcn1gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG4gICAgaW5wdXQuY2xpY2soKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgc2F2ZSBidXR0b24gY2xpY2tcbiAgICovXG4gIG9uU2F2ZSgpOiB2b2lkIHtcbiAgICBjb25zdCBzdGF0ZSA9IHRoaXMuYnVpbGRlclNlcnZpY2UuZ2V0U3RhdGUoKTtcbiAgICB0aGlzLmV4cG9ydFNlcnZpY2Uuc2F2ZVRvTG9jYWxTdG9yYWdlKHN0YXRlLnRhYmxlQ29uZmlnKTtcbiAgICB0aGlzLnNhdmVkLmVtaXQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgbG9hZCBmcm9tIGxvY2FsU3RvcmFnZSBidXR0b24gY2xpY2tcbiAgICovXG4gIG9uTG9hZCgpOiB2b2lkIHtcbiAgICBjb25zdCBjb25maWcgPSB0aGlzLmV4cG9ydFNlcnZpY2UubG9hZEZyb21Mb2NhbFN0b3JhZ2UoKTtcbiAgICBpZiAoY29uZmlnKSB7XG4gICAgICB0aGlzLmJ1aWxkZXJTZXJ2aWNlLmluaXRpYWxpemUoY29uZmlnKTtcbiAgICAgIHRoaXMuc2F2ZWQuZW1pdCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhbGVydCgnTm8gc2F2ZWQgY29uZmlndXJhdGlvbiBmb3VuZCcpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgZXhwb3J0IEpTT04gYnV0dG9uIGNsaWNrXG4gICAqL1xuICBvbkV4cG9ydEpTT04oKTogdm9pZCB7XG4gICAgY29uc3Qgc3RhdGUgPSB0aGlzLmJ1aWxkZXJTZXJ2aWNlLmdldFN0YXRlKCk7XG4gICAgdGhpcy5leHBvcnRTZXJ2aWNlLmRvd25sb2FkQXNKU09OKHN0YXRlLnRhYmxlQ29uZmlnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgZXhwb3J0IFR5cGVTY3JpcHQgYnV0dG9uIGNsaWNrXG4gICAqL1xuICBvbkV4cG9ydFR5cGVTY3JpcHQoKTogdm9pZCB7XG4gICAgY29uc3Qgc3RhdGUgPSB0aGlzLmJ1aWxkZXJTZXJ2aWNlLmdldFN0YXRlKCk7XG4gICAgdGhpcy5leHBvcnRTZXJ2aWNlLmRvd25sb2FkQXNUeXBlU2NyaXB0KHN0YXRlLnRhYmxlQ29uZmlnLCAndGFibGUtY29uZmlnJywge1xuICAgICAgaW5jbHVkZUNvbW1lbnRzOiB0cnVlLFxuICAgICAgdmFyaWFibGVOYW1lOiAndGFibGVDb25maWcnXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIGltcG9ydCBKU09OIGJ1dHRvbiBjbGlja1xuICAgKi9cbiAgb25JbXBvcnRKU09OKCk6IHZvaWQge1xuICAgIHRoaXMub25PcGVuRmlsZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBwcmV2aWV3IHRvZ2dsZSBidXR0b24gY2xpY2tcbiAgICovXG4gIG9uVG9nZ2xlUHJldmlldygpOiB2b2lkIHtcbiAgICB0aGlzLnByZXZpZXdUb2dnbGVkLmVtaXQoKTtcbiAgfVxufVxuXG4iLCI8ZGl2IGNsYXNzPVwiYnVpbGRlci10b29sYmFyXCI+XG4gIDxkaXYgY2xhc3M9XCJ0b29sYmFyLXNlY3Rpb25cIj5cbiAgICA8YnV0dG9uIGNsYXNzPVwidG9vbGJhci1idG5cIiAoY2xpY2spPVwib25OZXdEZWZpbml0aW9uKClcIiB0aXRsZT1cIk5ldyBEZWZpbml0aW9uXCI+XG4gICAgICA8c3Bhbj5OZXc8L3NwYW4+XG4gICAgPC9idXR0b24+XG4gICAgPGJ1dHRvbiBjbGFzcz1cInRvb2xiYXItYnRuXCIgKGNsaWNrKT1cIm9uT3BlbkZpbGUoKVwiIHRpdGxlPVwiT3BlbiBGaWxlXCI+XG4gICAgICA8c3Bhbj5PcGVuPC9zcGFuPlxuICAgIDwvYnV0dG9uPlxuICAgIDxidXR0b24gY2xhc3M9XCJ0b29sYmFyLWJ0blwiIChjbGljayk9XCJvblNhdmUoKVwiIHRpdGxlPVwiU2F2ZSB0byBMb2NhbFN0b3JhZ2VcIiBbY2xhc3MuaGFzLWNoYW5nZXNdPVwiaGFzVW5zYXZlZENoYW5nZXNcIj5cbiAgICAgIDxzcGFuPlNhdmU8L3NwYW4+XG4gICAgICA8c3BhbiAqbmdJZj1cImhhc1Vuc2F2ZWRDaGFuZ2VzXCIgY2xhc3M9XCJ1bnNhdmVkLWluZGljYXRvclwiPuKXjzwvc3Bhbj5cbiAgICA8L2J1dHRvbj5cbiAgICA8YnV0dG9uIGNsYXNzPVwidG9vbGJhci1idG5cIiAoY2xpY2spPVwib25Mb2FkKClcIiB0aXRsZT1cIkxvYWQgZnJvbSBMb2NhbFN0b3JhZ2VcIj5cbiAgICAgIDxzcGFuPkxvYWQ8L3NwYW4+XG4gICAgPC9idXR0b24+XG4gIDwvZGl2PlxuXG4gIDxkaXYgY2xhc3M9XCJ0b29sYmFyLXNlY3Rpb25cIj5cbiAgICA8YnV0dG9uIGNsYXNzPVwidG9vbGJhci1idG5cIiAoY2xpY2spPVwib25JbXBvcnRKU09OKClcIiB0aXRsZT1cIkltcG9ydCBKU09OXCI+XG4gICAgICA8c3Bhbj5JbXBvcnQgSlNPTjwvc3Bhbj5cbiAgICA8L2J1dHRvbj5cbiAgICA8YnV0dG9uIGNsYXNzPVwidG9vbGJhci1idG5cIiAoY2xpY2spPVwib25FeHBvcnRKU09OKClcIiB0aXRsZT1cIkV4cG9ydCBKU09OXCI+XG4gICAgICA8c3Bhbj5FeHBvcnQgSlNPTjwvc3Bhbj5cbiAgICA8L2J1dHRvbj5cbiAgICA8YnV0dG9uIGNsYXNzPVwidG9vbGJhci1idG5cIiAoY2xpY2spPVwib25FeHBvcnRUeXBlU2NyaXB0KClcIiB0aXRsZT1cIkV4cG9ydCBUeXBlU2NyaXB0XCI+XG4gICAgICA8c3Bhbj5FeHBvcnQgVFM8L3NwYW4+XG4gICAgPC9idXR0b24+XG4gIDwvZGl2PlxuXG4gIDxkaXYgY2xhc3M9XCJ0b29sYmFyLXNlY3Rpb25cIj5cbiAgICA8YnV0dG9uIGNsYXNzPVwidG9vbGJhci1idG5cIiAoY2xpY2spPVwib25Ub2dnbGVQcmV2aWV3KClcIiB0aXRsZT1cIlRvZ2dsZSBQcmV2aWV3XCI+XG4gICAgICA8c3Bhbj5QcmV2aWV3PC9zcGFuPlxuICAgIDwvYnV0dG9uPlxuICA8L2Rpdj5cbjwvZGl2PlxuXG4iXX0=
@@ -1,206 +0,0 @@
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=