@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.
- package/esm2022/gnggln-ng-ui-system.mjs +5 -0
- package/esm2022/lib/components/accordion/accordion.component.mjs +353 -0
- package/esm2022/lib/components/accordion/accordion.types.mjs +6 -0
- package/esm2022/lib/components/accordion/index.mjs +2 -0
- package/esm2022/lib/components/base-layout/base-layout.component.mjs +218 -0
- package/esm2022/lib/components/base-layout/base-layout.types.mjs +6 -0
- package/esm2022/lib/components/base-layout/index.mjs +14 -0
- package/esm2022/lib/components/button/button-area.component.mjs +196 -0
- package/esm2022/lib/components/button/button.component.mjs +164 -0
- package/esm2022/lib/components/button/button.types.mjs +6 -0
- package/esm2022/lib/components/button/index.mjs +16 -0
- package/esm2022/lib/components/crud-table/crud-table.component.mjs +789 -0
- package/esm2022/lib/components/crud-table/crud-table.types.mjs +6 -0
- package/esm2022/lib/components/crud-table/index.mjs +16 -0
- package/esm2022/lib/components/form-builder/adapters/it-date-adapter.mjs +82 -0
- package/esm2022/lib/components/form-builder/directives/currency-input.directive.mjs +184 -0
- package/esm2022/lib/components/form-builder/form-builder.component.mjs +824 -0
- package/esm2022/lib/components/form-builder/form-wizard.component.mjs +510 -0
- package/esm2022/lib/components/form-builder/index.mjs +19 -0
- package/esm2022/lib/components/form-builder/services/form-condition.service.mjs +132 -0
- package/esm2022/lib/components/form-builder/services/form-validation.service.mjs +381 -0
- package/esm2022/lib/components/form-builder/services/location.service.mjs +140 -0
- package/esm2022/lib/components/form-builder/services/wizard-sync.service.mjs +84 -0
- package/esm2022/lib/components/form-builder/sub-components/error-summary/form-error-summary.component.mjs +161 -0
- package/esm2022/lib/components/form-builder/sub-components/file-input/file-input.component.mjs +310 -0
- package/esm2022/lib/components/form-builder/sub-components/specifica-territoriale/specifica-territoriale.component.mjs +648 -0
- package/esm2022/lib/components/form-builder/sub-components/table-territoriale/table-territoriale.component.mjs +432 -0
- package/esm2022/lib/components/form-builder/types/condition.types.mjs +6 -0
- package/esm2022/lib/components/form-builder/types/field.types.mjs +6 -0
- package/esm2022/lib/components/form-builder/types/index.mjs +2 -0
- package/esm2022/lib/components/form-builder/types/schema.types.mjs +6 -0
- package/esm2022/lib/components/form-builder/types/territoriale.types.mjs +6 -0
- package/esm2022/lib/components/form-builder/types/validation.types.mjs +6 -0
- package/esm2022/lib/components/form-builder-editor/form-builder-editor.component.mjs +730 -0
- package/esm2022/lib/components/form-builder-editor/form-builder-editor.service.mjs +56 -0
- package/esm2022/lib/components/form-builder-editor/index.mjs +21 -0
- package/esm2022/lib/components/form-builder-editor/services/editor-persistence.service.mjs +190 -0
- package/esm2022/lib/components/form-builder-editor/services/editor-state.service.mjs +324 -0
- package/esm2022/lib/components/form-builder-editor/services/field-factory.service.mjs +188 -0
- package/esm2022/lib/components/form-builder-editor/sub-components/condition-editor/condition-editor.component.mjs +667 -0
- package/esm2022/lib/components/form-builder-editor/sub-components/editor-toolbar/editor-toolbar.component.mjs +317 -0
- package/esm2022/lib/components/form-builder-editor/sub-components/field-config-panel/field-config-panel.component.mjs +611 -0
- package/esm2022/lib/components/form-builder-editor/sub-components/field-palette/field-palette.component.mjs +267 -0
- package/esm2022/lib/components/form-builder-editor/sub-components/form-values-panel/form-values-panel.component.mjs +276 -0
- package/esm2022/lib/components/form-builder-editor/sub-components/options-editor/options-editor.component.mjs +323 -0
- package/esm2022/lib/components/form-builder-editor/sub-components/preview-container/preview-container.component.mjs +238 -0
- package/esm2022/lib/components/form-builder-editor/sub-components/section-editor/section-editor.component.mjs +472 -0
- package/esm2022/lib/components/form-builder-editor/sub-components/validation-editor/validation-editor.component.mjs +473 -0
- package/esm2022/lib/components/form-builder-editor/types/editor.types.mjs +6 -0
- package/esm2022/lib/components/layout-builder/index.mjs +18 -0
- package/esm2022/lib/components/layout-builder/layout-builder.component.mjs +1730 -0
- package/esm2022/lib/components/layout-builder/layout-builder.types.mjs +9 -0
- package/esm2022/lib/components/layout-builder/layout.service.mjs +239 -0
- package/esm2022/lib/components/modal/confirm-dialog.component.mjs +151 -0
- package/esm2022/lib/components/modal/index.mjs +4 -0
- package/esm2022/lib/components/modal/modal.component.mjs +139 -0
- package/esm2022/lib/components/modal/modal.service.mjs +194 -0
- package/esm2022/lib/components/modal/modal.types.mjs +6 -0
- package/esm2022/lib/components/page-header/breadcrumb.service.mjs +242 -0
- package/esm2022/lib/components/page-header/index.mjs +20 -0
- package/esm2022/lib/components/page-header/page-header.component.mjs +243 -0
- package/esm2022/lib/components/page-header/page-header.types.mjs +21 -0
- package/esm2022/lib/components/table/index.mjs +2 -0
- package/esm2022/lib/components/table/paginated-table.component.mjs +407 -0
- package/esm2022/lib/components/table/table.types.mjs +6 -0
- package/esm2022/lib/core/types/index.mjs +6 -0
- package/esm2022/lib/core/utils/index.mjs +53 -0
- package/esm2022/lib/sources/location-data.opt.json +8942 -0
- package/esm2022/lib/sources/nazioni.opt.json +215 -0
- package/esm2022/public-api.mjs +34 -0
- package/fesm2022/gnggln-ng-ui-system.mjs +55752 -0
- package/fesm2022/gnggln-ng-ui-system.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/components/accordion/accordion.component.d.ts +118 -0
- package/lib/components/accordion/accordion.types.d.ts +62 -0
- package/lib/components/accordion/index.d.ts +2 -0
- package/lib/components/base-layout/base-layout.component.d.ts +83 -0
- package/lib/components/base-layout/base-layout.types.d.ts +26 -0
- package/lib/components/base-layout/index.d.ts +13 -0
- package/lib/components/button/button-area.component.d.ts +88 -0
- package/lib/components/button/button.component.d.ts +55 -0
- package/lib/components/button/button.types.d.ts +70 -0
- package/lib/components/button/index.d.ts +15 -0
- package/lib/components/crud-table/crud-table.component.d.ts +143 -0
- package/lib/components/crud-table/crud-table.types.d.ts +207 -0
- package/lib/components/crud-table/index.d.ts +15 -0
- package/lib/components/form-builder/adapters/it-date-adapter.d.ts +32 -0
- package/lib/components/form-builder/directives/currency-input.directive.d.ts +48 -0
- package/lib/components/form-builder/form-builder.component.d.ts +183 -0
- package/lib/components/form-builder/form-wizard.component.d.ts +87 -0
- package/lib/components/form-builder/index.d.ts +13 -0
- package/lib/components/form-builder/services/form-condition.service.d.ts +46 -0
- package/lib/components/form-builder/services/form-validation.service.d.ts +63 -0
- package/lib/components/form-builder/services/location.service.d.ts +83 -0
- package/lib/components/form-builder/services/wizard-sync.service.d.ts +63 -0
- package/lib/components/form-builder/sub-components/error-summary/form-error-summary.component.d.ts +28 -0
- package/lib/components/form-builder/sub-components/file-input/file-input.component.d.ts +41 -0
- package/lib/components/form-builder/sub-components/specifica-territoriale/specifica-territoriale.component.d.ts +145 -0
- package/lib/components/form-builder/sub-components/table-territoriale/table-territoriale.component.d.ts +108 -0
- package/lib/components/form-builder/types/condition.types.d.ts +51 -0
- package/lib/components/form-builder/types/field.types.d.ts +288 -0
- package/lib/components/form-builder/types/index.d.ts +5 -0
- package/lib/components/form-builder/types/schema.types.d.ts +227 -0
- package/lib/components/form-builder/types/territoriale.types.d.ts +170 -0
- package/lib/components/form-builder/types/validation.types.d.ts +174 -0
- package/lib/components/form-builder-editor/form-builder-editor.component.d.ts +117 -0
- package/lib/components/form-builder-editor/form-builder-editor.service.d.ts +38 -0
- package/lib/components/form-builder-editor/index.d.ts +15 -0
- package/lib/components/form-builder-editor/services/editor-persistence.service.d.ts +42 -0
- package/lib/components/form-builder-editor/services/editor-state.service.d.ts +66 -0
- package/lib/components/form-builder-editor/services/field-factory.service.d.ts +28 -0
- package/lib/components/form-builder-editor/sub-components/condition-editor/condition-editor.component.d.ts +139 -0
- package/lib/components/form-builder-editor/sub-components/editor-toolbar/editor-toolbar.component.d.ts +43 -0
- package/lib/components/form-builder-editor/sub-components/field-config-panel/field-config-panel.component.d.ts +83 -0
- package/lib/components/form-builder-editor/sub-components/field-palette/field-palette.component.d.ts +40 -0
- package/lib/components/form-builder-editor/sub-components/form-values-panel/form-values-panel.component.d.ts +51 -0
- package/lib/components/form-builder-editor/sub-components/options-editor/options-editor.component.d.ts +63 -0
- package/lib/components/form-builder-editor/sub-components/preview-container/preview-container.component.d.ts +68 -0
- package/lib/components/form-builder-editor/sub-components/section-editor/section-editor.component.d.ts +82 -0
- package/lib/components/form-builder-editor/sub-components/validation-editor/validation-editor.component.d.ts +112 -0
- package/lib/components/form-builder-editor/types/editor.types.d.ts +124 -0
- package/lib/components/layout-builder/index.d.ts +16 -0
- package/lib/components/layout-builder/layout-builder.component.d.ts +85 -0
- package/lib/components/layout-builder/layout-builder.types.d.ts +436 -0
- package/lib/components/layout-builder/layout.service.d.ts +100 -0
- package/lib/components/modal/confirm-dialog.component.d.ts +46 -0
- package/lib/components/modal/index.d.ts +4 -0
- package/lib/components/modal/modal.component.d.ts +44 -0
- package/lib/components/modal/modal.service.d.ts +93 -0
- package/lib/components/modal/modal.types.d.ts +110 -0
- package/lib/components/page-header/breadcrumb.service.d.ts +96 -0
- package/lib/components/page-header/index.d.ts +16 -0
- package/lib/components/page-header/page-header.component.d.ts +59 -0
- package/lib/components/page-header/page-header.types.d.ts +96 -0
- package/lib/components/table/index.d.ts +2 -0
- package/lib/components/table/paginated-table.component.d.ts +85 -0
- package/lib/components/table/table.types.d.ts +81 -0
- package/lib/core/types/index.d.ts +57 -0
- package/lib/core/utils/index.d.ts +29 -0
- package/package.json +44 -0
- 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
|