@gnggln/ng-ui-system 1.0.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (141) hide show
  1. package/esm2022/gnggln-ng-ui-system.mjs +5 -0
  2. package/esm2022/lib/components/accordion/accordion.component.mjs +353 -0
  3. package/esm2022/lib/components/accordion/accordion.types.mjs +6 -0
  4. package/esm2022/lib/components/accordion/index.mjs +2 -0
  5. package/esm2022/lib/components/base-layout/base-layout.component.mjs +218 -0
  6. package/esm2022/lib/components/base-layout/base-layout.types.mjs +6 -0
  7. package/esm2022/lib/components/base-layout/index.mjs +14 -0
  8. package/esm2022/lib/components/button/button-area.component.mjs +196 -0
  9. package/esm2022/lib/components/button/button.component.mjs +164 -0
  10. package/esm2022/lib/components/button/button.types.mjs +6 -0
  11. package/esm2022/lib/components/button/index.mjs +16 -0
  12. package/esm2022/lib/components/crud-table/crud-table.component.mjs +789 -0
  13. package/esm2022/lib/components/crud-table/crud-table.types.mjs +6 -0
  14. package/esm2022/lib/components/crud-table/index.mjs +16 -0
  15. package/esm2022/lib/components/form-builder/adapters/it-date-adapter.mjs +82 -0
  16. package/esm2022/lib/components/form-builder/directives/currency-input.directive.mjs +184 -0
  17. package/esm2022/lib/components/form-builder/form-builder.component.mjs +824 -0
  18. package/esm2022/lib/components/form-builder/form-wizard.component.mjs +510 -0
  19. package/esm2022/lib/components/form-builder/index.mjs +19 -0
  20. package/esm2022/lib/components/form-builder/services/form-condition.service.mjs +132 -0
  21. package/esm2022/lib/components/form-builder/services/form-validation.service.mjs +381 -0
  22. package/esm2022/lib/components/form-builder/services/location.service.mjs +140 -0
  23. package/esm2022/lib/components/form-builder/services/wizard-sync.service.mjs +84 -0
  24. package/esm2022/lib/components/form-builder/sub-components/error-summary/form-error-summary.component.mjs +161 -0
  25. package/esm2022/lib/components/form-builder/sub-components/file-input/file-input.component.mjs +310 -0
  26. package/esm2022/lib/components/form-builder/sub-components/specifica-territoriale/specifica-territoriale.component.mjs +648 -0
  27. package/esm2022/lib/components/form-builder/sub-components/table-territoriale/table-territoriale.component.mjs +432 -0
  28. package/esm2022/lib/components/form-builder/types/condition.types.mjs +6 -0
  29. package/esm2022/lib/components/form-builder/types/field.types.mjs +6 -0
  30. package/esm2022/lib/components/form-builder/types/index.mjs +2 -0
  31. package/esm2022/lib/components/form-builder/types/schema.types.mjs +6 -0
  32. package/esm2022/lib/components/form-builder/types/territoriale.types.mjs +6 -0
  33. package/esm2022/lib/components/form-builder/types/validation.types.mjs +6 -0
  34. package/esm2022/lib/components/form-builder-editor/form-builder-editor.component.mjs +730 -0
  35. package/esm2022/lib/components/form-builder-editor/form-builder-editor.service.mjs +56 -0
  36. package/esm2022/lib/components/form-builder-editor/index.mjs +21 -0
  37. package/esm2022/lib/components/form-builder-editor/services/editor-persistence.service.mjs +190 -0
  38. package/esm2022/lib/components/form-builder-editor/services/editor-state.service.mjs +324 -0
  39. package/esm2022/lib/components/form-builder-editor/services/field-factory.service.mjs +188 -0
  40. package/esm2022/lib/components/form-builder-editor/sub-components/condition-editor/condition-editor.component.mjs +667 -0
  41. package/esm2022/lib/components/form-builder-editor/sub-components/editor-toolbar/editor-toolbar.component.mjs +317 -0
  42. package/esm2022/lib/components/form-builder-editor/sub-components/field-config-panel/field-config-panel.component.mjs +611 -0
  43. package/esm2022/lib/components/form-builder-editor/sub-components/field-palette/field-palette.component.mjs +267 -0
  44. package/esm2022/lib/components/form-builder-editor/sub-components/form-values-panel/form-values-panel.component.mjs +276 -0
  45. package/esm2022/lib/components/form-builder-editor/sub-components/options-editor/options-editor.component.mjs +323 -0
  46. package/esm2022/lib/components/form-builder-editor/sub-components/preview-container/preview-container.component.mjs +238 -0
  47. package/esm2022/lib/components/form-builder-editor/sub-components/section-editor/section-editor.component.mjs +472 -0
  48. package/esm2022/lib/components/form-builder-editor/sub-components/validation-editor/validation-editor.component.mjs +473 -0
  49. package/esm2022/lib/components/form-builder-editor/types/editor.types.mjs +6 -0
  50. package/esm2022/lib/components/layout-builder/index.mjs +18 -0
  51. package/esm2022/lib/components/layout-builder/layout-builder.component.mjs +1730 -0
  52. package/esm2022/lib/components/layout-builder/layout-builder.types.mjs +9 -0
  53. package/esm2022/lib/components/layout-builder/layout.service.mjs +239 -0
  54. package/esm2022/lib/components/modal/confirm-dialog.component.mjs +151 -0
  55. package/esm2022/lib/components/modal/index.mjs +4 -0
  56. package/esm2022/lib/components/modal/modal.component.mjs +139 -0
  57. package/esm2022/lib/components/modal/modal.service.mjs +194 -0
  58. package/esm2022/lib/components/modal/modal.types.mjs +6 -0
  59. package/esm2022/lib/components/page-header/breadcrumb.service.mjs +242 -0
  60. package/esm2022/lib/components/page-header/index.mjs +20 -0
  61. package/esm2022/lib/components/page-header/page-header.component.mjs +243 -0
  62. package/esm2022/lib/components/page-header/page-header.types.mjs +21 -0
  63. package/esm2022/lib/components/table/index.mjs +2 -0
  64. package/esm2022/lib/components/table/paginated-table.component.mjs +407 -0
  65. package/esm2022/lib/components/table/table.types.mjs +6 -0
  66. package/esm2022/lib/core/types/index.mjs +6 -0
  67. package/esm2022/lib/core/utils/index.mjs +53 -0
  68. package/esm2022/lib/sources/location-data.opt.json +8942 -0
  69. package/esm2022/lib/sources/nazioni.opt.json +215 -0
  70. package/esm2022/public-api.mjs +34 -0
  71. package/fesm2022/gnggln-ng-ui-system.mjs +55752 -0
  72. package/fesm2022/gnggln-ng-ui-system.mjs.map +1 -0
  73. package/index.d.ts +5 -0
  74. package/lib/components/accordion/accordion.component.d.ts +118 -0
  75. package/lib/components/accordion/accordion.types.d.ts +62 -0
  76. package/lib/components/accordion/index.d.ts +2 -0
  77. package/lib/components/base-layout/base-layout.component.d.ts +83 -0
  78. package/lib/components/base-layout/base-layout.types.d.ts +26 -0
  79. package/lib/components/base-layout/index.d.ts +13 -0
  80. package/lib/components/button/button-area.component.d.ts +88 -0
  81. package/lib/components/button/button.component.d.ts +55 -0
  82. package/lib/components/button/button.types.d.ts +70 -0
  83. package/lib/components/button/index.d.ts +15 -0
  84. package/lib/components/crud-table/crud-table.component.d.ts +143 -0
  85. package/lib/components/crud-table/crud-table.types.d.ts +207 -0
  86. package/lib/components/crud-table/index.d.ts +15 -0
  87. package/lib/components/form-builder/adapters/it-date-adapter.d.ts +32 -0
  88. package/lib/components/form-builder/directives/currency-input.directive.d.ts +48 -0
  89. package/lib/components/form-builder/form-builder.component.d.ts +183 -0
  90. package/lib/components/form-builder/form-wizard.component.d.ts +87 -0
  91. package/lib/components/form-builder/index.d.ts +13 -0
  92. package/lib/components/form-builder/services/form-condition.service.d.ts +46 -0
  93. package/lib/components/form-builder/services/form-validation.service.d.ts +63 -0
  94. package/lib/components/form-builder/services/location.service.d.ts +83 -0
  95. package/lib/components/form-builder/services/wizard-sync.service.d.ts +63 -0
  96. package/lib/components/form-builder/sub-components/error-summary/form-error-summary.component.d.ts +28 -0
  97. package/lib/components/form-builder/sub-components/file-input/file-input.component.d.ts +41 -0
  98. package/lib/components/form-builder/sub-components/specifica-territoriale/specifica-territoriale.component.d.ts +145 -0
  99. package/lib/components/form-builder/sub-components/table-territoriale/table-territoriale.component.d.ts +108 -0
  100. package/lib/components/form-builder/types/condition.types.d.ts +51 -0
  101. package/lib/components/form-builder/types/field.types.d.ts +288 -0
  102. package/lib/components/form-builder/types/index.d.ts +5 -0
  103. package/lib/components/form-builder/types/schema.types.d.ts +227 -0
  104. package/lib/components/form-builder/types/territoriale.types.d.ts +170 -0
  105. package/lib/components/form-builder/types/validation.types.d.ts +174 -0
  106. package/lib/components/form-builder-editor/form-builder-editor.component.d.ts +117 -0
  107. package/lib/components/form-builder-editor/form-builder-editor.service.d.ts +38 -0
  108. package/lib/components/form-builder-editor/index.d.ts +15 -0
  109. package/lib/components/form-builder-editor/services/editor-persistence.service.d.ts +42 -0
  110. package/lib/components/form-builder-editor/services/editor-state.service.d.ts +66 -0
  111. package/lib/components/form-builder-editor/services/field-factory.service.d.ts +28 -0
  112. package/lib/components/form-builder-editor/sub-components/condition-editor/condition-editor.component.d.ts +139 -0
  113. package/lib/components/form-builder-editor/sub-components/editor-toolbar/editor-toolbar.component.d.ts +43 -0
  114. package/lib/components/form-builder-editor/sub-components/field-config-panel/field-config-panel.component.d.ts +83 -0
  115. package/lib/components/form-builder-editor/sub-components/field-palette/field-palette.component.d.ts +40 -0
  116. package/lib/components/form-builder-editor/sub-components/form-values-panel/form-values-panel.component.d.ts +51 -0
  117. package/lib/components/form-builder-editor/sub-components/options-editor/options-editor.component.d.ts +63 -0
  118. package/lib/components/form-builder-editor/sub-components/preview-container/preview-container.component.d.ts +68 -0
  119. package/lib/components/form-builder-editor/sub-components/section-editor/section-editor.component.d.ts +82 -0
  120. package/lib/components/form-builder-editor/sub-components/validation-editor/validation-editor.component.d.ts +112 -0
  121. package/lib/components/form-builder-editor/types/editor.types.d.ts +124 -0
  122. package/lib/components/layout-builder/index.d.ts +16 -0
  123. package/lib/components/layout-builder/layout-builder.component.d.ts +85 -0
  124. package/lib/components/layout-builder/layout-builder.types.d.ts +436 -0
  125. package/lib/components/layout-builder/layout.service.d.ts +100 -0
  126. package/lib/components/modal/confirm-dialog.component.d.ts +46 -0
  127. package/lib/components/modal/index.d.ts +4 -0
  128. package/lib/components/modal/modal.component.d.ts +44 -0
  129. package/lib/components/modal/modal.service.d.ts +93 -0
  130. package/lib/components/modal/modal.types.d.ts +110 -0
  131. package/lib/components/page-header/breadcrumb.service.d.ts +96 -0
  132. package/lib/components/page-header/index.d.ts +16 -0
  133. package/lib/components/page-header/page-header.component.d.ts +59 -0
  134. package/lib/components/page-header/page-header.types.d.ts +96 -0
  135. package/lib/components/table/index.d.ts +2 -0
  136. package/lib/components/table/paginated-table.component.d.ts +85 -0
  137. package/lib/components/table/table.types.d.ts +81 -0
  138. package/lib/core/types/index.d.ts +57 -0
  139. package/lib/core/utils/index.d.ts +29 -0
  140. package/package.json +44 -0
  141. package/public-api.d.ts +22 -0
@@ -0,0 +1,56 @@
1
+ /**
2
+ * @module ng-ui-system/form-builder-editor
3
+ * Servizio per aprire l'editor visuale in una modale fullscreen.
4
+ */
5
+ import { Injectable, inject } from '@angular/core';
6
+ import { UiModalService } from '../modal/index';
7
+ import { UiFormBuilderEditorComponent } from './form-builder-editor.component';
8
+ import * as i0 from "@angular/core";
9
+ /**
10
+ * Servizio per aprire l'editor visuale del form builder
11
+ * in una modale fullscreen tramite il UiModalService.
12
+ *
13
+ * @usageNotes
14
+ *
15
+ * ### Apertura base
16
+ * ```typescript
17
+ * const ref = this.editorService.open();
18
+ * ref.afterClosed().subscribe(schema => {
19
+ * if (schema) console.log('Schema risultante:', schema);
20
+ * });
21
+ * ```
22
+ *
23
+ * ### Apertura con schema iniziale
24
+ * ```typescript
25
+ * this.editorService.open(myExistingSchema)
26
+ * .afterClosed()
27
+ * .subscribe(schema => { ... });
28
+ * ```
29
+ */
30
+ export class UiFormBuilderEditorService {
31
+ constructor() {
32
+ /** @internal Servizio modale per l'apertura. */
33
+ this.modalService = inject(UiModalService);
34
+ }
35
+ /**
36
+ * Apre l'editor in una modale fullscreen.
37
+ *
38
+ * @param initialSchema - Schema iniziale da caricare nell'editor
39
+ * @returns Riferimento alla dialog per gestire chiusura e risultato
40
+ */
41
+ open(initialSchema) {
42
+ return this.modalService.open(UiFormBuilderEditorComponent, {
43
+ size: 'fullscreen',
44
+ disableClose: false,
45
+ data: { initialSchema },
46
+ panelClass: 'ui-form-builder-editor-dialog',
47
+ });
48
+ }
49
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: UiFormBuilderEditorService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
50
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: UiFormBuilderEditorService, providedIn: 'root' }); }
51
+ }
52
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: UiFormBuilderEditorService, decorators: [{
53
+ type: Injectable,
54
+ args: [{ providedIn: 'root' }]
55
+ }] });
56
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1idWlsZGVyLWVkaXRvci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvbmctdWktc3lzdGVtL3NyYy9saWIvY29tcG9uZW50cy9mb3JtLWJ1aWxkZXItZWRpdG9yL2Zvcm0tYnVpbGRlci1lZGl0b3Iuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFFSCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUduRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDaEQsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0saUNBQWlDLENBQUM7O0FBRS9FOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CRztBQUVILE1BQU0sT0FBTywwQkFBMEI7SUFEdkM7UUFFRSxnREFBZ0Q7UUFDL0IsaUJBQVksR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7S0FtQnhEO0lBakJDOzs7OztPQUtHO0lBQ0gsSUFBSSxDQUFDLGFBQTRCO1FBQy9CLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQzNCLDRCQUE0QixFQUM1QjtZQUNFLElBQUksRUFBRSxZQUFZO1lBQ2xCLFlBQVksRUFBRSxLQUFLO1lBQ25CLElBQUksRUFBRSxFQUFFLGFBQWEsRUFBRTtZQUN2QixVQUFVLEVBQUUsK0JBQStCO1NBQzVDLENBQ0YsQ0FBQztJQUNKLENBQUM7K0dBcEJVLDBCQUEwQjttSEFBMUIsMEJBQTBCLGNBRGIsTUFBTTs7NEZBQ25CLDBCQUEwQjtrQkFEdEMsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogQG1vZHVsZSBuZy11aS1zeXN0ZW0vZm9ybS1idWlsZGVyLWVkaXRvclxyXG4gKiBTZXJ2aXppbyBwZXIgYXByaXJlIGwnZWRpdG9yIHZpc3VhbGUgaW4gdW5hIG1vZGFsZSBmdWxsc2NyZWVuLlxyXG4gKi9cclxuXHJcbmltcG9ydCB7IEluamVjdGFibGUsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBNYXREaWFsb2dSZWYgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xyXG5pbXBvcnQgeyBVaUZvcm1TY2hlbWEgfSBmcm9tICcuLi9mb3JtLWJ1aWxkZXIvdHlwZXMvaW5kZXgnO1xyXG5pbXBvcnQgeyBVaU1vZGFsU2VydmljZSB9IGZyb20gJy4uL21vZGFsL2luZGV4JztcclxuaW1wb3J0IHsgVWlGb3JtQnVpbGRlckVkaXRvckNvbXBvbmVudCB9IGZyb20gJy4vZm9ybS1idWlsZGVyLWVkaXRvci5jb21wb25lbnQnO1xyXG5cclxuLyoqXHJcbiAqIFNlcnZpemlvIHBlciBhcHJpcmUgbCdlZGl0b3IgdmlzdWFsZSBkZWwgZm9ybSBidWlsZGVyXHJcbiAqIGluIHVuYSBtb2RhbGUgZnVsbHNjcmVlbiB0cmFtaXRlIGlsIFVpTW9kYWxTZXJ2aWNlLlxyXG4gKlxyXG4gKiBAdXNhZ2VOb3Rlc1xyXG4gKlxyXG4gKiAjIyMgQXBlcnR1cmEgYmFzZVxyXG4gKiBgYGB0eXBlc2NyaXB0XHJcbiAqIGNvbnN0IHJlZiA9IHRoaXMuZWRpdG9yU2VydmljZS5vcGVuKCk7XHJcbiAqIHJlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZShzY2hlbWEgPT4ge1xyXG4gKiAgIGlmIChzY2hlbWEpIGNvbnNvbGUubG9nKCdTY2hlbWEgcmlzdWx0YW50ZTonLCBzY2hlbWEpO1xyXG4gKiB9KTtcclxuICogYGBgXHJcbiAqXHJcbiAqICMjIyBBcGVydHVyYSBjb24gc2NoZW1hIGluaXppYWxlXHJcbiAqIGBgYHR5cGVzY3JpcHRcclxuICogdGhpcy5lZGl0b3JTZXJ2aWNlLm9wZW4obXlFeGlzdGluZ1NjaGVtYSlcclxuICogICAuYWZ0ZXJDbG9zZWQoKVxyXG4gKiAgIC5zdWJzY3JpYmUoc2NoZW1hID0+IHsgLi4uIH0pO1xyXG4gKiBgYGBcclxuICovXHJcbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXHJcbmV4cG9ydCBjbGFzcyBVaUZvcm1CdWlsZGVyRWRpdG9yU2VydmljZSB7XHJcbiAgLyoqIEBpbnRlcm5hbCBTZXJ2aXppbyBtb2RhbGUgcGVyIGwnYXBlcnR1cmEuICovXHJcbiAgcHJpdmF0ZSByZWFkb25seSBtb2RhbFNlcnZpY2UgPSBpbmplY3QoVWlNb2RhbFNlcnZpY2UpO1xyXG5cclxuICAvKipcclxuICAgKiBBcHJlIGwnZWRpdG9yIGluIHVuYSBtb2RhbGUgZnVsbHNjcmVlbi5cclxuICAgKlxyXG4gICAqIEBwYXJhbSBpbml0aWFsU2NoZW1hIC0gU2NoZW1hIGluaXppYWxlIGRhIGNhcmljYXJlIG5lbGwnZWRpdG9yXHJcbiAgICogQHJldHVybnMgUmlmZXJpbWVudG8gYWxsYSBkaWFsb2cgcGVyIGdlc3RpcmUgY2hpdXN1cmEgZSByaXN1bHRhdG9cclxuICAgKi9cclxuICBvcGVuKGluaXRpYWxTY2hlbWE/OiBVaUZvcm1TY2hlbWEpOiBNYXREaWFsb2dSZWY8VWlGb3JtQnVpbGRlckVkaXRvckNvbXBvbmVudCwgVWlGb3JtU2NoZW1hIHwgbnVsbD4ge1xyXG4gICAgcmV0dXJuIHRoaXMubW9kYWxTZXJ2aWNlLm9wZW48VWlGb3JtQnVpbGRlckVkaXRvckNvbXBvbmVudCwgYW55LCBVaUZvcm1TY2hlbWEgfCBudWxsPihcclxuICAgICAgVWlGb3JtQnVpbGRlckVkaXRvckNvbXBvbmVudCxcclxuICAgICAge1xyXG4gICAgICAgIHNpemU6ICdmdWxsc2NyZWVuJyxcclxuICAgICAgICBkaXNhYmxlQ2xvc2U6IGZhbHNlLFxyXG4gICAgICAgIGRhdGE6IHsgaW5pdGlhbFNjaGVtYSB9LFxyXG4gICAgICAgIHBhbmVsQ2xhc3M6ICd1aS1mb3JtLWJ1aWxkZXItZWRpdG9yLWRpYWxvZycsXHJcbiAgICAgIH0sXHJcbiAgICApO1xyXG4gIH1cclxufVxyXG4iXX0=
@@ -0,0 +1,21 @@
1
+ // ── Componente principale ──
2
+ export { UiFormBuilderEditorComponent } from './form-builder-editor.component';
3
+ // ── Servizio apertura modale ──
4
+ export { UiFormBuilderEditorService } from './form-builder-editor.service';
5
+ // ── Servizi interni (esposti per uso avanzato) ──
6
+ export { UiEditorStateService } from './services/editor-state.service';
7
+ export { UiEditorPersistenceService } from './services/editor-persistence.service';
8
+ export { UiEditorFieldFactoryService } from './services/field-factory.service';
9
+ // ── Sotto-componenti (esposti per composizione custom) ──
10
+ export { UiEditorToolbarComponent } from './sub-components/editor-toolbar/editor-toolbar.component';
11
+ export { UiFieldPaletteComponent } from './sub-components/field-palette/field-palette.component';
12
+ export { UiSectionEditorComponent } from './sub-components/section-editor/section-editor.component';
13
+ export { UiEditorFieldConfigPanelComponent } from './sub-components/field-config-panel/field-config-panel.component';
14
+ export { UiEditorPreviewContainerComponent } from './sub-components/preview-container/preview-container.component';
15
+ export { UiValidationEditorComponent } from './sub-components/validation-editor/validation-editor.component';
16
+ export { UiConditionEditorComponent } from './sub-components/condition-editor/condition-editor.component';
17
+ export { UiOptionsEditorComponent } from './sub-components/options-editor/options-editor.component';
18
+ export { UiEditorFormValuesPanelComponent } from './sub-components/form-values-panel/form-values-panel.component';
19
+ // ── Tipi ──
20
+ export * from './types/editor.types';
21
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9uZy11aS1zeXN0ZW0vc3JjL2xpYi9jb21wb25lbnRzL2Zvcm0tYnVpbGRlci1lZGl0b3IvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsOEJBQThCO0FBQzlCLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBRS9FLGlDQUFpQztBQUNqQyxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUUzRSxtREFBbUQ7QUFDbkQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDdkUsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDbkYsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFFL0UsMkRBQTJEO0FBQzNELE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLDBEQUEwRCxDQUFDO0FBQ3BHLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHdEQUF3RCxDQUFDO0FBQ2pHLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLDBEQUEwRCxDQUFDO0FBQ3BHLE9BQU8sRUFBRSxpQ0FBaUMsRUFBRSxNQUFNLGtFQUFrRSxDQUFDO0FBQ3JILE9BQU8sRUFBRSxpQ0FBaUMsRUFBRSxNQUFNLGdFQUFnRSxDQUFDO0FBQ25ILE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLGdFQUFnRSxDQUFDO0FBQzdHLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLDhEQUE4RCxDQUFDO0FBQzFHLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLDBEQUEwRCxDQUFDO0FBQ3BHLE9BQU8sRUFBRSxnQ0FBZ0MsRUFBRSxNQUFNLGdFQUFnRSxDQUFDO0FBRWxILGFBQWE7QUFDYixjQUFjLHNCQUFzQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8g4pSA4pSAIENvbXBvbmVudGUgcHJpbmNpcGFsZSDilIDilIBcclxuZXhwb3J0IHsgVWlGb3JtQnVpbGRlckVkaXRvckNvbXBvbmVudCB9IGZyb20gJy4vZm9ybS1idWlsZGVyLWVkaXRvci5jb21wb25lbnQnO1xyXG5cclxuLy8g4pSA4pSAIFNlcnZpemlvIGFwZXJ0dXJhIG1vZGFsZSDilIDilIBcclxuZXhwb3J0IHsgVWlGb3JtQnVpbGRlckVkaXRvclNlcnZpY2UgfSBmcm9tICcuL2Zvcm0tYnVpbGRlci1lZGl0b3Iuc2VydmljZSc7XHJcblxyXG4vLyDilIDilIAgU2Vydml6aSBpbnRlcm5pIChlc3Bvc3RpIHBlciB1c28gYXZhbnphdG8pIOKUgOKUgFxyXG5leHBvcnQgeyBVaUVkaXRvclN0YXRlU2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvZWRpdG9yLXN0YXRlLnNlcnZpY2UnO1xyXG5leHBvcnQgeyBVaUVkaXRvclBlcnNpc3RlbmNlU2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvZWRpdG9yLXBlcnNpc3RlbmNlLnNlcnZpY2UnO1xyXG5leHBvcnQgeyBVaUVkaXRvckZpZWxkRmFjdG9yeVNlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL2ZpZWxkLWZhY3Rvcnkuc2VydmljZSc7XHJcblxyXG4vLyDilIDilIAgU290dG8tY29tcG9uZW50aSAoZXNwb3N0aSBwZXIgY29tcG9zaXppb25lIGN1c3RvbSkg4pSA4pSAXHJcbmV4cG9ydCB7IFVpRWRpdG9yVG9vbGJhckNvbXBvbmVudCB9IGZyb20gJy4vc3ViLWNvbXBvbmVudHMvZWRpdG9yLXRvb2xiYXIvZWRpdG9yLXRvb2xiYXIuY29tcG9uZW50JztcclxuZXhwb3J0IHsgVWlGaWVsZFBhbGV0dGVDb21wb25lbnQgfSBmcm9tICcuL3N1Yi1jb21wb25lbnRzL2ZpZWxkLXBhbGV0dGUvZmllbGQtcGFsZXR0ZS5jb21wb25lbnQnO1xyXG5leHBvcnQgeyBVaVNlY3Rpb25FZGl0b3JDb21wb25lbnQgfSBmcm9tICcuL3N1Yi1jb21wb25lbnRzL3NlY3Rpb24tZWRpdG9yL3NlY3Rpb24tZWRpdG9yLmNvbXBvbmVudCc7XHJcbmV4cG9ydCB7IFVpRWRpdG9yRmllbGRDb25maWdQYW5lbENvbXBvbmVudCB9IGZyb20gJy4vc3ViLWNvbXBvbmVudHMvZmllbGQtY29uZmlnLXBhbmVsL2ZpZWxkLWNvbmZpZy1wYW5lbC5jb21wb25lbnQnO1xyXG5leHBvcnQgeyBVaUVkaXRvclByZXZpZXdDb250YWluZXJDb21wb25lbnQgfSBmcm9tICcuL3N1Yi1jb21wb25lbnRzL3ByZXZpZXctY29udGFpbmVyL3ByZXZpZXctY29udGFpbmVyLmNvbXBvbmVudCc7XHJcbmV4cG9ydCB7IFVpVmFsaWRhdGlvbkVkaXRvckNvbXBvbmVudCB9IGZyb20gJy4vc3ViLWNvbXBvbmVudHMvdmFsaWRhdGlvbi1lZGl0b3IvdmFsaWRhdGlvbi1lZGl0b3IuY29tcG9uZW50JztcclxuZXhwb3J0IHsgVWlDb25kaXRpb25FZGl0b3JDb21wb25lbnQgfSBmcm9tICcuL3N1Yi1jb21wb25lbnRzL2NvbmRpdGlvbi1lZGl0b3IvY29uZGl0aW9uLWVkaXRvci5jb21wb25lbnQnO1xyXG5leHBvcnQgeyBVaU9wdGlvbnNFZGl0b3JDb21wb25lbnQgfSBmcm9tICcuL3N1Yi1jb21wb25lbnRzL29wdGlvbnMtZWRpdG9yL29wdGlvbnMtZWRpdG9yLmNvbXBvbmVudCc7XHJcbmV4cG9ydCB7IFVpRWRpdG9yRm9ybVZhbHVlc1BhbmVsQ29tcG9uZW50IH0gZnJvbSAnLi9zdWItY29tcG9uZW50cy9mb3JtLXZhbHVlcy1wYW5lbC9mb3JtLXZhbHVlcy1wYW5lbC5jb21wb25lbnQnO1xyXG5cclxuLy8g4pSA4pSAIFRpcGkg4pSA4pSAXHJcbmV4cG9ydCAqIGZyb20gJy4vdHlwZXMvZWRpdG9yLnR5cGVzJztcclxuIl19
@@ -0,0 +1,190 @@
1
+ /**
2
+ * @module ng-ui-system/form-builder-editor
3
+ * Servizio per la persistenza dello schema (localStorage, import/export JSON).
4
+ */
5
+ import { Injectable } from '@angular/core';
6
+ import * as i0 from "@angular/core";
7
+ /**
8
+ * Gestisce il salvataggio e il recupero degli schemi dell'editor.
9
+ *
10
+ * Supporta:
11
+ * - Auto-save e recupero da localStorage
12
+ * - Import/export da/verso file JSON
13
+ * - Backup automatici con rotazione (max 5)
14
+ */
15
+ export class UiEditorPersistenceService {
16
+ constructor() {
17
+ /** @internal Chiave localStorage per l'auto-save. */
18
+ this.STORAGE_KEY = 'ui-form-editor-autosave';
19
+ /** @internal Versione dello storage per migrazioni future. */
20
+ this.STORAGE_VERSION = '1.0.0';
21
+ /** @internal Durata massima di un salvataggio (24 ore). */
22
+ this.MAX_AGE_MS = 24 * 60 * 60 * 1000;
23
+ }
24
+ // ─── localStorage ────────────────────────────────────────────
25
+ /** Salva lo schema nel localStorage. */
26
+ saveToLocalStorage(schema) {
27
+ const data = {
28
+ schema,
29
+ timestamp: Date.now(),
30
+ version: this.STORAGE_VERSION,
31
+ };
32
+ try {
33
+ localStorage.setItem(this.STORAGE_KEY, JSON.stringify(data));
34
+ }
35
+ catch (error) {
36
+ throw new Error('Impossibile salvare nel localStorage. Spazio disponibile esaurito.');
37
+ }
38
+ }
39
+ /** Carica lo schema dal localStorage (null se scaduto o assente). */
40
+ loadFromLocalStorage() {
41
+ try {
42
+ const raw = localStorage.getItem(this.STORAGE_KEY);
43
+ if (!raw)
44
+ return null;
45
+ const data = JSON.parse(raw);
46
+ if (Date.now() - data.timestamp > this.MAX_AGE_MS) {
47
+ this.clearLocalStorage();
48
+ return null;
49
+ }
50
+ return data.schema;
51
+ }
52
+ catch {
53
+ return null;
54
+ }
55
+ }
56
+ /** Verifica se esiste un salvataggio valido. */
57
+ hasLocalStorageData() {
58
+ try {
59
+ const raw = localStorage.getItem(this.STORAGE_KEY);
60
+ if (!raw)
61
+ return false;
62
+ const data = JSON.parse(raw);
63
+ return Date.now() - data.timestamp <= this.MAX_AGE_MS;
64
+ }
65
+ catch {
66
+ return false;
67
+ }
68
+ }
69
+ /** Restituisce la data dell'ultimo salvataggio. */
70
+ getLocalStorageAge() {
71
+ try {
72
+ const raw = localStorage.getItem(this.STORAGE_KEY);
73
+ if (!raw)
74
+ return null;
75
+ const data = JSON.parse(raw);
76
+ return new Date(data.timestamp);
77
+ }
78
+ catch {
79
+ return null;
80
+ }
81
+ }
82
+ /** Rimuove il salvataggio dal localStorage. */
83
+ clearLocalStorage() {
84
+ localStorage.removeItem(this.STORAGE_KEY);
85
+ }
86
+ // ─── Export ──────────────────────────────────────────────────
87
+ /** Esporta lo schema come file JSON scaricabile. */
88
+ exportToJSON(schema, filename) {
89
+ const json = JSON.stringify(schema, null, 2);
90
+ const blob = new Blob([json], { type: 'application/json' });
91
+ const defaultName = filename || `form-schema-${schema.id}-${Date.now()}.json`;
92
+ this.downloadBlob(blob, defaultName);
93
+ }
94
+ // ─── Import ──────────────────────────────────────────────────
95
+ /** Importa lo schema da un file JSON. */
96
+ async importFromJSON(file) {
97
+ return new Promise((resolve, reject) => {
98
+ const reader = new FileReader();
99
+ reader.onload = (e) => {
100
+ try {
101
+ const content = e.target?.result;
102
+ const schema = JSON.parse(content);
103
+ if (!this.isValidSchema(schema)) {
104
+ reject(new Error('Schema non valido: struttura non corretta'));
105
+ return;
106
+ }
107
+ resolve(schema);
108
+ }
109
+ catch {
110
+ reject(new Error('Errore durante la lettura del file JSON: formato non valido'));
111
+ }
112
+ };
113
+ reader.onerror = () => reject(new Error('Errore durante la lettura del file'));
114
+ reader.readAsText(file);
115
+ });
116
+ }
117
+ // ─── Backup ──────────────────────────────────────────────────
118
+ /** Crea un backup dello schema prima di operazioni distruttive. */
119
+ createBackup(schema) {
120
+ const backupKey = `${this.STORAGE_KEY}_backup_${Date.now()}`;
121
+ const data = {
122
+ schema,
123
+ timestamp: Date.now(),
124
+ version: this.STORAGE_VERSION,
125
+ };
126
+ try {
127
+ localStorage.setItem(backupKey, JSON.stringify(data));
128
+ this.cleanOldBackups();
129
+ }
130
+ catch {
131
+ // Silenzioso: il backup non e critico
132
+ }
133
+ }
134
+ // ─── Private ─────────────────────────────────────────────────
135
+ /** @internal Validazione strutturale minima dello schema. */
136
+ isValidSchema(schema) {
137
+ const s = schema;
138
+ return (s &&
139
+ typeof s === 'object' &&
140
+ typeof s.id === 'string' &&
141
+ Array.isArray(s.sections) &&
142
+ s.sections.every((sec) => sec &&
143
+ typeof sec.id === 'string' &&
144
+ Array.isArray(sec.fields) &&
145
+ sec.fields.every((f) => f && typeof f.key === 'string' && typeof f.type === 'string' && typeof f.label === 'string')));
146
+ }
147
+ /** @internal Scarica un blob come file. */
148
+ downloadBlob(blob, filename) {
149
+ const url = URL.createObjectURL(blob);
150
+ const link = document.createElement('a');
151
+ link.href = url;
152
+ link.download = filename;
153
+ link.style.display = 'none';
154
+ document.body.appendChild(link);
155
+ link.click();
156
+ setTimeout(() => {
157
+ document.body.removeChild(link);
158
+ URL.revokeObjectURL(url);
159
+ }, 100);
160
+ }
161
+ /** @internal Mantiene solo gli ultimi 5 backup. */
162
+ cleanOldBackups() {
163
+ try {
164
+ const keys = [];
165
+ for (let i = 0; i < localStorage.length; i++) {
166
+ const key = localStorage.key(i);
167
+ if (key?.startsWith(`${this.STORAGE_KEY}_backup_`)) {
168
+ keys.push(key);
169
+ }
170
+ }
171
+ keys
172
+ .sort((a, b) => {
173
+ const tsA = parseInt(a.split('_').pop() || '0', 10);
174
+ const tsB = parseInt(b.split('_').pop() || '0', 10);
175
+ return tsB - tsA;
176
+ })
177
+ .slice(5)
178
+ .forEach((key) => localStorage.removeItem(key));
179
+ }
180
+ catch {
181
+ // Silenzioso
182
+ }
183
+ }
184
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: UiEditorPersistenceService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
185
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: UiEditorPersistenceService }); }
186
+ }
187
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: UiEditorPersistenceService, decorators: [{
188
+ type: Injectable
189
+ }] });
190
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRpdG9yLXBlcnNpc3RlbmNlLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9uZy11aS1zeXN0ZW0vc3JjL2xpYi9jb21wb25lbnRzL2Zvcm0tYnVpbGRlci1lZGl0b3Ivc2VydmljZXMvZWRpdG9yLXBlcnNpc3RlbmNlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBRUgsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFJM0M7Ozs7Ozs7R0FPRztBQUVILE1BQU0sT0FBTywwQkFBMEI7SUFEdkM7UUFFRSxxREFBcUQ7UUFDcEMsZ0JBQVcsR0FBRyx5QkFBeUIsQ0FBQztRQUV6RCw4REFBOEQ7UUFDN0Msb0JBQWUsR0FBRyxPQUFPLENBQUM7UUFFM0MsMkRBQTJEO1FBQzFDLGVBQVUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7S0ErS25EO0lBN0tDLGdFQUFnRTtJQUVoRSx3Q0FBd0M7SUFDeEMsa0JBQWtCLENBQUMsTUFBb0I7UUFDckMsTUFBTSxJQUFJLEdBQXdCO1lBQ2hDLE1BQU07WUFDTixTQUFTLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUNyQixPQUFPLEVBQUUsSUFBSSxDQUFDLGVBQWU7U0FDOUIsQ0FBQztRQUNGLElBQUksQ0FBQztZQUNILFlBQVksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDL0QsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixNQUFNLElBQUksS0FBSyxDQUFDLG9FQUFvRSxDQUFDLENBQUM7UUFDeEYsQ0FBQztJQUNILENBQUM7SUFFRCxxRUFBcUU7SUFDckUsb0JBQW9CO1FBQ2xCLElBQUksQ0FBQztZQUNILE1BQU0sR0FBRyxHQUFH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LFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3BELENBQUM7UUFBQyxNQUFNLENBQUM7WUFDUCxhQUFhO1FBQ2YsQ0FBQztJQUNILENBQUM7K0dBdExVLDBCQUEwQjttSEFBMUIsMEJBQTBCOzs0RkFBMUIsMEJBQTBCO2tCQUR0QyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXHJcbiAqIEBtb2R1bGUgbmctdWktc3lzdGVtL2Zvcm0tYnVpbGRlci1lZGl0b3JcclxuICogU2Vydml6aW8gcGVyIGxhIHBlcnNpc3RlbnphIGRlbGxvIHNjaGVtYSAobG9jYWxTdG9yYWdlLCBpbXBvcnQvZXhwb3J0IEpTT04pLlxyXG4gKi9cclxuXHJcbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgVWlGb3JtU2NoZW1hIH0gZnJvbSAnLi4vLi4vZm9ybS1idWlsZGVyL3R5cGVzL2luZGV4JztcclxuaW1wb3J0IHsgVWlFZGl0b3JTdG9yYWdlRGF0YSB9IGZyb20gJy4uL3R5cGVzL2VkaXRvci50eXBlcyc7XHJcblxyXG4vKipcclxuICogR2VzdGlzY2UgaWwgc2FsdmF0YWdnaW8gZSBpbCByZWN1cGVybyBkZWdsaSBzY2hlbWkgZGVsbCdlZGl0b3IuXHJcbiAqXHJcbiAqIFN1cHBvcnRhOlxyXG4gKiAtIEF1dG8tc2F2ZSBlIHJlY3VwZXJvIGRhIGxvY2FsU3RvcmFnZVxyXG4gKiAtIEltcG9ydC9leHBvcnQgZGEvdmVyc28gZmlsZSBKU09OXHJcbiAqIC0gQmFja3VwIGF1dG9tYXRpY2kgY29uIHJvdGF6aW9uZSAobWF4IDUpXHJcbiAqL1xyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBVaUVkaXRvclBlcnNpc3RlbmNlU2VydmljZSB7XHJcbiAgLyoqIEBpbnRlcm5hbCBDaGlhdmUgbG9jYWxTdG9yYWdlIHBlciBsJ2F1dG8tc2F2ZS4gKi9cclxuICBwcml2YXRlIHJlYWRvbmx5IFNUT1JBR0VfS0VZID0gJ3VpLWZvcm0tZWRpdG9yLWF1dG9zYXZlJztcclxuXHJcbiAgLyoqIEBpbnRlcm5hbCBWZXJzaW9uZSBkZWxsbyBzdG9yYWdlIHBlciBtaWdyYXppb25pIGZ1dHVyZS4gKi9cclxuICBwcml2YXRlIHJlYWRvbmx5IFNUT1JBR0VfVkVSU0lPTiA9ICcxLjAuMCc7XHJcblxyXG4gIC8qKiBAaW50ZXJuYWwgRHVyYXRhIG1hc3NpbWEgZGkgdW4gc2FsdmF0YWdnaW8gKDI0IG9yZSkuICovXHJcbiAgcHJpdmF0ZSByZWFkb25seSBNQVhfQUdFX01TID0gMjQgKiA2MCAqIDYwICogMTAwMDtcclxuXHJcbiAgLy8g4pSA4pSA4pSAIGxvY2FsU3RvcmFnZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuXHJcbiAgLyoqIFNhbHZhIGxvIHNjaGVtYSBuZWwgbG9jYWxTdG9yYWdlLiAqL1xyXG4gIHNhdmVUb0xvY2FsU3RvcmFnZShzY2hlbWE6IFVpRm9ybVNjaGVtYSk6IHZvaWQge1xyXG4gICAgY29uc3QgZGF0YTogVWlFZGl0b3JTdG9yYWdlRGF0YSA9IHtcclxuICAgICAgc2NoZW1hLFxyXG4gICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXHJcbiAgICAgIHZlcnNpb246IHRoaXMuU1RPUkFHRV9WRVJTSU9OLFxyXG4gICAgfTtcclxuICAgIHRyeSB7XHJcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMuU1RPUkFHRV9LRVksIEpTT04uc3RyaW5naWZ5KGRhdGEpKTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW1wb3NzaWJpbGUgc2FsdmFyZSBuZWwgbG9jYWxTdG9yYWdlLiBTcGF6aW8gZGlzcG9uaWJpbGUgZXNhdXJpdG8uJyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogQ2FyaWNhIGxvIHNjaGVtYSBkYWwgbG9jYWxTdG9yYWdlIChudWxsIHNlIHNjYWR1dG8gbyBhc3NlbnRlKS4gKi9cclxuICBsb2FkRnJvbUxvY2FsU3RvcmFnZSgpOiBVaUZvcm1TY2hlbWEgfCBudWxsIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IHJhdyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMuU1RPUkFHRV9LRVkpO1xyXG4gICAgICBpZiAoIXJhdykgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgICBjb25zdCBkYXRhOiBVaUVkaXRvclN0b3JhZ2VEYXRhID0gSlNPTi5wYXJzZShyYXcpO1xyXG4gICAgICBpZiAoRGF0ZS5ub3coKSAtIGRhdGEudGltZXN0YW1wID4gdGhpcy5NQVhfQUdFX01TKSB7XHJcbiAgICAgICAgdGhpcy5jbGVhckxvY2FsU3RvcmFnZSgpO1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBkYXRhLnNjaGVtYTtcclxuICAgIH0gY2F0Y2gge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKiBWZXJpZmljYSBzZSBlc2lzdGUgdW4gc2FsdmF0YWdnaW8gdmFsaWRvLiAqL1xyXG4gIGhhc0xvY2FsU3RvcmFnZURhdGEoKTogYm9vbGVhbiB7XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCByYXcgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0aGlzLlNUT1JBR0VfS0VZKTtcclxuICAgICAgaWYgKCFyYXcpIHJldHVybiBmYWxzZTtcclxuICAgICAgY29uc3QgZGF0YTogVWlFZGl0b3JTdG9yYWdlRGF0YSA9IEpTT04ucGFyc2UocmF3KTtcclxuICAgICAgcmV0dXJuIERhdGUubm93KCkgLSBkYXRhLnRpbWVzdGFtcCA8PSB0aGlzLk1BWF9BR0VfTVM7XHJcbiAgICB9IGNhdGNoIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqIFJlc3RpdHVpc2NlIGxhIGRhdGEgZGVsbCd1bHRpbW8gc2FsdmF0YWdnaW8uICovXHJcbiAgZ2V0TG9jYWxTdG9yYWdlQWdlKCk6IERhdGUgfCBudWxsIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IHJhdyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMuU1RPUkFHRV9LRVkpO1xyXG4gICAgICBpZiAoIXJhdykgcmV0dXJuIG51bGw7XHJcbiAgICAgIGNvbnN0IGRhdGE6IFVpRWRpdG9yU3RvcmFnZURhdGEgPSBKU09OLnBhcnNlKHJhdyk7XHJcbiAgICAgIHJldHVybiBuZXcgRGF0ZShkYXRhLnRpbWVzdGFtcCk7XHJcbiAgICB9IGNhdGNoIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogUmltdW92ZSBpbCBzYWx2YXRhZ2dpbyBkYWwgbG9jYWxTdG9yYWdlLiAqL1xyXG4gIGNsZWFyTG9jYWxTdG9yYWdlKCk6IHZvaWQge1xyXG4gICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0odGhpcy5TVE9SQUdFX0tFWSk7XHJcbiAgfVxyXG5cclxuICAvLyDilIDilIDilIAgRXhwb3J0IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxyXG5cclxuICAvKiogRXNwb3J0YSBsbyBzY2hlbWEgY29tZSBmaWxlIEpTT04gc2NhcmljYWJpbGUuICovXHJcbiAgZXhwb3J0VG9KU09OKHNjaGVtYTogVWlGb3JtU2NoZW1hLCBmaWxlbmFtZT86IHN0cmluZyk6IHZvaWQge1xyXG4gICAgY29uc3QganNvbiA9IEpTT04uc3RyaW5naWZ5KHNjaGVtYSwgbnVsbCwgMik7XHJcbiAgICBjb25zdCBibG9iID0gbmV3IEJsb2IoW2pzb25dLCB7IHR5cGU6ICdhcHBsaWNhdGlvbi9qc29uJyB9KTtcclxuICAgIGNvbnN0IGRlZmF1bHROYW1lID0gZmlsZW5hbWUgfHwgYGZvcm0tc2NoZW1hLSR7c2NoZW1hLmlkfS0ke0RhdGUubm93KCl9Lmpzb25gO1xyXG4gICAgdGhpcy5kb3dubG9hZEJsb2IoYmxvYiwgZGVmYXVsdE5hbWUpO1xyXG4gIH1cclxuXHJcbiAgLy8g4pSA4pSA4pSAIEltcG9ydCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuXHJcbiAgLyoqIEltcG9ydGEgbG8gc2NoZW1hIGRhIHVuIGZpbGUgSlNPTi4gKi9cclxuICBhc3luYyBpbXBvcnRGcm9tSlNPTihmaWxlOiBGaWxlKTogUHJvbWlzZTxVaUZvcm1TY2hlbWE+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XHJcbiAgICAgIHJlYWRlci5vbmxvYWQgPSAoZSkgPT4ge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICBjb25zdCBjb250ZW50ID0gZS50YXJnZXQ/LnJlc3VsdCBhcyBzdHJpbmc7XHJcbiAgICAgICAgICBjb25zdCBzY2hlbWE6IFVpRm9ybVNjaGVtYSA9IEpTT04ucGFyc2UoY29udGVudCk7XHJcbiAgICAgICAgICBpZiAoIXRoaXMuaXNWYWxpZFNjaGVtYShzY2hlbWEpKSB7XHJcbiAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ1NjaGVtYSBub24gdmFsaWRvOiBzdHJ1dHR1cmEgbm9uIGNvcnJldHRhJykpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXNvbHZlKHNjaGVtYSk7XHJcbiAgICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKCdFcnJvcmUgZHVyYW50ZSBsYSBsZXR0dXJhIGRlbCBmaWxlIEpTT046IGZvcm1hdG8gbm9uIHZhbGlkbycpKTtcclxuICAgICAgICB9XHJcbiAgICAgIH07XHJcbiAgICAgIHJlYWRlci5vbmVycm9yID0gKCkgPT4gcmVqZWN0KG5ldyBFcnJvcignRXJyb3JlIGR1cmFudGUgbGEgbGV0dHVyYSBkZWwgZmlsZScpKTtcclxuICAgICAgcmVhZGVyLnJlYWRBc1RleHQoZmlsZSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8vIOKUgOKUgOKUgCBCYWNrdXAg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXHJcblxyXG4gIC8qKiBDcmVhIHVuIGJhY2t1cCBkZWxsbyBzY2hlbWEgcHJpbWEgZGkgb3BlcmF6aW9uaSBkaXN0cnV0dGl2ZS4gKi9cclxuICBjcmVhdGVCYWNrdXAoc2NoZW1hOiBVaUZvcm1TY2hlbWEpOiB2b2lkIHtcclxuICAgIGNvbnN0IGJhY2t1cEtleSA9IGAke3RoaXMuU1RPUkFHRV9LRVl9X2JhY2t1cF8ke0RhdGUubm93KCl9YDtcclxuICAgIGNvbnN0IGRhdGE6IFVpRWRpdG9yU3RvcmFnZURhdGEgPSB7XHJcbiAgICAgIHNjaGVtYSxcclxuICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxyXG4gICAgICB2ZXJzaW9uOiB0aGlzLlNUT1JBR0VfVkVSU0lPTixcclxuICAgIH07XHJcbiAgICB0cnkge1xyXG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShiYWNrdXBLZXksIEpTT04uc3RyaW5naWZ5KGRhdGEpKTtcclxuICAgICAgdGhpcy5jbGVhbk9sZEJhY2t1cHMoKTtcclxuICAgIH0gY2F0Y2gge1xyXG4gICAgICAvLyBTaWxlbnppb3NvOiBpbCBiYWNrdXAgbm9uIGUgY3JpdGljb1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8g4pSA4pSA4pSAIFByaXZhdGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXHJcblxyXG4gIC8qKiBAaW50ZXJuYWwgVmFsaWRhemlvbmUgc3RydXR0dXJhbGUgbWluaW1hIGRlbGxvIHNjaGVtYS4gKi9cclxuICBwcml2YXRlIGlzVmFsaWRTY2hlbWEoc2NoZW1hOiB1bmtub3duKTogc2NoZW1hIGlzIFVpRm9ybVNjaGVtYSB7XHJcbiAgICBjb25zdCBzID0gc2NoZW1hIGFzIGFueTtcclxuICAgIHJldHVybiAoXHJcbiAgICAgIHMgJiZcclxuICAgICAgdHlwZW9mIHMgPT09ICdvYmplY3QnICYmXHJcbiAgICAgIHR5cGVvZiBzLmlkID09PSAnc3RyaW5nJyAmJlxyXG4gICAgICBBcnJheS5pc0FycmF5KHMuc2VjdGlvbnMpICYmXHJcbiAgICAgIHMuc2VjdGlvbnMuZXZlcnkoXHJcbiAgICAgICAgKHNlYzogYW55KSA9PlxyXG4gICAgICAgICAgc2VjICYmXHJcbiAgICAgICAgICB0eXBlb2Ygc2VjLmlkID09PSAnc3RyaW5nJyAmJlxyXG4gICAgICAgICAgQXJyYXkuaXNBcnJheShzZWMuZmllbGRzKSAmJlxyXG4gICAgICAgICAgc2VjLmZpZWxkcy5ldmVyeShcclxuICAgICAgICAgICAgKGY6IGFueSkgPT4gZiAmJiB0eXBlb2YgZi5rZXkgPT09ICdzdHJpbmcnICYmIHR5cGVvZiBmLnR5cGUgPT09ICdzdHJpbmcnICYmIHR5cGVvZiBmLmxhYmVsID09PSAnc3RyaW5nJyxcclxuICAgICAgICAgICksXHJcbiAgICAgIClcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKiogQGludGVybmFsIFNjYXJpY2EgdW4gYmxvYiBjb21lIGZpbGUuICovXHJcbiAgcHJpdmF0ZSBkb3dubG9hZEJsb2IoYmxvYjogQmxvYiwgZmlsZW5hbWU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgY29uc3QgdXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcclxuICAgIGNvbnN0IGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XHJcbiAgICBsaW5rLmhyZWYgPSB1cmw7XHJcbiAgICBsaW5rLmRvd25sb2FkID0gZmlsZW5hbWU7XHJcbiAgICBsaW5rLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGxpbmspO1xyXG4gICAgbGluay5jbGljaygpO1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQobGluayk7XHJcbiAgICAgIFVSTC5yZXZva2VPYmplY3RVUkwodXJsKTtcclxuICAgIH0sIDEwMCk7XHJcbiAgfVxyXG5cclxuICAvKiogQGludGVybmFsIE1hbnRpZW5lIHNvbG8gZ2xpIHVsdGltaSA1IGJhY2t1cC4gKi9cclxuICBwcml2YXRlIGNsZWFuT2xkQmFja3VwcygpOiB2b2lkIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IGtleXM6IHN0cmluZ1tdID0gW107XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbG9jYWxTdG9yYWdlLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgY29uc3Qga2V5ID0gbG9jYWxTdG9yYWdlLmtleShpKTtcclxuICAgICAgICBpZiAoa2V5Py5zdGFydHNXaXRoKGAke3RoaXMuU1RPUkFHRV9LRVl9X2JhY2t1cF9gKSkge1xyXG4gICAgICAgICAga2V5cy5wdXNoKGtleSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGtleXNcclxuICAgICAgICAuc29ydCgoYSwgYikgPT4ge1xyXG4gICAgICAgICAgY29uc3QgdHNBID0gcGFyc2VJbnQoYS5zcGxpdCgnXycpLnBvcCgpIHx8ICcwJywgMTApO1xyXG4gICAgICAgICAgY29uc3QgdHNCID0gcGFyc2VJbnQoYi5zcGxpdCgnXycpLnBvcCgpIHx8ICcwJywgMTApO1xyXG4gICAgICAgICAgcmV0dXJuIHRzQiAtIHRzQTtcclxuICAgICAgICB9KVxyXG4gICAgICAgIC5zbGljZSg1KVxyXG4gICAgICAgIC5mb3JFYWNoKChrZXkpID0+IGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGtleSkpO1xyXG4gICAgfSBjYXRjaCB7XHJcbiAgICAgIC8vIFNpbGVuemlvc29cclxuICAgIH1cclxuICB9XHJcbn1cclxuIl19