@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,140 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import * as nazioniData from '../../../sources/nazioni.opt.json';
|
|
3
|
+
import * as locationData from '../../../sources/location-data.opt.json';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
/**
|
|
6
|
+
* Servizio per la gestione dei dati geografici italiani
|
|
7
|
+
* da file JSON statici ottimizzati.
|
|
8
|
+
*
|
|
9
|
+
* Elimina la necessita di chiamate backend per nazioni,
|
|
10
|
+
* province, comuni e CAP. I dati vengono caricati in memoria
|
|
11
|
+
* al primo accesso e poi serviti dalla cache.
|
|
12
|
+
*
|
|
13
|
+
* @providedIn 'root'
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```typescript
|
|
17
|
+
* const nazioni = await this.locationService.getNazioni();
|
|
18
|
+
* const province = await this.locationService.getProvince();
|
|
19
|
+
* const comuni = await this.locationService.getComuniByProvincia('015');
|
|
20
|
+
* const caps = await this.locationService.getCapList('015146');
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
export class UiLocationService {
|
|
24
|
+
constructor() {
|
|
25
|
+
this.nazioniCache = new Map();
|
|
26
|
+
this.provinceCache = new Map();
|
|
27
|
+
this.comuniCache = new Map();
|
|
28
|
+
this.nazioniMap = nazioniData;
|
|
29
|
+
this.locationMap = locationData;
|
|
30
|
+
this.initializeCaches();
|
|
31
|
+
}
|
|
32
|
+
// ─── API pubblica ──────────────────────────────────────────────
|
|
33
|
+
/** Elenco completo delle nazioni (Italia prima). */
|
|
34
|
+
async getNazioni() {
|
|
35
|
+
const nazioni = Array.from(this.nazioniCache.values());
|
|
36
|
+
return { data: this.sortNazioniItaliaFirst(nazioni) };
|
|
37
|
+
}
|
|
38
|
+
/** Elenco completo delle province, ordinate alfabeticamente. */
|
|
39
|
+
async getProvince() {
|
|
40
|
+
const province = Array.from(this.provinceCache.values()).sort((a, b) => a.nomeProvincia.localeCompare(b.nomeProvincia, 'it'));
|
|
41
|
+
return { content: province };
|
|
42
|
+
}
|
|
43
|
+
/** Elenco dei comuni per una specifica provincia. */
|
|
44
|
+
async getComuniByProvincia(provinciaId) {
|
|
45
|
+
const comuniMin = this.locationMap.comuniPerProvincia[provinciaId] || [];
|
|
46
|
+
const provincia = this.provinceCache.get(provinciaId);
|
|
47
|
+
if (!provincia)
|
|
48
|
+
return [];
|
|
49
|
+
return comuniMin
|
|
50
|
+
.map((c) => ({
|
|
51
|
+
codiceCatastale: c.x,
|
|
52
|
+
codiceComunePk: c.x,
|
|
53
|
+
comuneSoppresso: false,
|
|
54
|
+
nomeComune: c.d,
|
|
55
|
+
prov: provincia,
|
|
56
|
+
visibile: true,
|
|
57
|
+
}))
|
|
58
|
+
.sort((a, b) => a.nomeComune.localeCompare(b.nomeComune, 'it'));
|
|
59
|
+
}
|
|
60
|
+
/** Elenco dei CAP per un comune. */
|
|
61
|
+
async getCapList(comuneId) {
|
|
62
|
+
for (const comuni of Object.values(this.locationMap.comuniPerProvincia)) {
|
|
63
|
+
const comune = comuni.find((c) => c.x === comuneId);
|
|
64
|
+
if (comune?.c) {
|
|
65
|
+
return Array.isArray(comune.c) ? comune.c : [comune.c];
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return [];
|
|
69
|
+
}
|
|
70
|
+
/** Dati completi di una location (nazione, provincia o comune). */
|
|
71
|
+
async getLocationFullData(type, id, provinciaId) {
|
|
72
|
+
switch (type) {
|
|
73
|
+
case 'nazione':
|
|
74
|
+
return this.nazioniCache.get(id) ?? null;
|
|
75
|
+
case 'provincia':
|
|
76
|
+
return this.provinceCache.get(id) ?? null;
|
|
77
|
+
case 'comune':
|
|
78
|
+
if (!provinciaId)
|
|
79
|
+
return this.comuniCache.get(id) ?? null;
|
|
80
|
+
const comuni = await this.getComuniByProvincia(provinciaId);
|
|
81
|
+
return comuni.find((c) => c.codiceComunePk === id) ?? null;
|
|
82
|
+
default:
|
|
83
|
+
return null;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
// ─── Inizializzazione cache ────────────────────────────────────
|
|
87
|
+
initializeCaches() {
|
|
88
|
+
// Nazioni
|
|
89
|
+
for (const n of this.nazioniMap.nazioni) {
|
|
90
|
+
this.nazioniCache.set(n.x, {
|
|
91
|
+
codStatoPk: n.x,
|
|
92
|
+
codiceCatastale: n.x,
|
|
93
|
+
descrizione: n.d,
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
// Province
|
|
97
|
+
for (const p of this.locationMap.province) {
|
|
98
|
+
this.provinceCache.set(p.x, {
|
|
99
|
+
codiceProvinciaPk: p.x,
|
|
100
|
+
nomeProvincia: p.d,
|
|
101
|
+
siglaProvincia: p.x,
|
|
102
|
+
visibile: true,
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
// Comuni (con riferimento alla provincia)
|
|
106
|
+
for (const [provinciaId, comuni] of Object.entries(this.locationMap.comuniPerProvincia)) {
|
|
107
|
+
const provincia = this.provinceCache.get(provinciaId);
|
|
108
|
+
if (!provincia)
|
|
109
|
+
continue;
|
|
110
|
+
for (const c of comuni) {
|
|
111
|
+
this.comuniCache.set(c.x, {
|
|
112
|
+
codiceCatastale: c.x,
|
|
113
|
+
codiceComunePk: c.x,
|
|
114
|
+
comuneSoppresso: false,
|
|
115
|
+
nomeComune: c.d,
|
|
116
|
+
prov: provincia,
|
|
117
|
+
visibile: true,
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
sortNazioniItaliaFirst(nazioni) {
|
|
123
|
+
return nazioni.sort((a, b) => {
|
|
124
|
+
const aItalia = a.descrizione?.toLowerCase().includes('italia') || a.codStatoPk === 'ITA';
|
|
125
|
+
const bItalia = b.descrizione?.toLowerCase().includes('italia') || b.codStatoPk === 'ITA';
|
|
126
|
+
if (aItalia && !bItalia)
|
|
127
|
+
return -1;
|
|
128
|
+
if (!aItalia && bItalia)
|
|
129
|
+
return 1;
|
|
130
|
+
return (a.descrizione || '').localeCompare(b.descrizione || '', 'it', { sensitivity: 'base' });
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: UiLocationService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
134
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: UiLocationService, providedIn: 'root' }); }
|
|
135
|
+
}
|
|
136
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: UiLocationService, decorators: [{
|
|
137
|
+
type: Injectable,
|
|
138
|
+
args: [{ providedIn: 'root' }]
|
|
139
|
+
}], ctorParameters: () => [] });
|
|
140
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jYXRpb24uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL25nLXVpLXN5c3RlbS9zcmMvbGliL2NvbXBvbmVudHMvZm9ybS1idWlsZGVyL3NlcnZpY2VzL2xvY2F0aW9uLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEtBQUssV0FBVyxNQUFNLG1DQUFtQyxDQUFDO0FBQ2pFLE9BQU8sS0FBSyxZQUFZLE1BQU0seUNBQXlDLENBQUM7O0FBMER4RTs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFFSCxNQUFNLE9BQU8saUJBQWlCO0lBTzVCO1FBSmlCLGlCQUFZLEdBQUcsSUFBSSxHQUFHLEVBQXFCLENBQUM7UUFDNUMsa0JBQWEsR0FBRyxJQUFJLEdBQUcsRUFBdUIsQ0FBQztRQUMvQyxnQkFBVyxHQUFHLElBQUksR0FBRyxFQUFvQixDQUFDO1FBR3pELElBQUksQ0FBQyxVQUFVLEdBQUcsV0FBaUMsQ0FBQztRQUNwRCxJQUFJLENBQUMsV0FBVyxHQUFHLFlBQW1CLENBQUM7UUFDdkMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUVELGtFQUFrRTtJQUVsRSxvREFBb0Q7SUFDcEQsS0FBSyxDQUFDLFVBQVU7UUFDZCxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUN2RCxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO0lBQ3hELENBQUM7SUFFRCxnRUFBZ0U7SUFDaEUsS0FBSyxDQUFDLFdBQVc7UUFDZixNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENB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bGFyL2NvcmUnO1xyXG5pbXBvcnQgKiBhcyBuYXppb25pRGF0YSBmcm9tICcuLi8uLi8uLi9zb3VyY2VzL25hemlvbmkub3B0Lmpzb24nO1xyXG5pbXBvcnQgKiBhcyBsb2NhdGlvbkRhdGEgZnJvbSAnLi4vLi4vLi4vc291cmNlcy9sb2NhdGlvbi1kYXRhLm9wdC5qc29uJztcclxuXHJcbi8vIOKUgOKUgOKUgCBJbnRlcmZhY2NlIEpTT04gb3R0aW1penphdGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXHJcblxyXG4vKiogVm9jZSBuYXppb25lIG5lbCBKU09OIG90dGltaXp6YXRvLiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIE1pbmlmaWVkTmF6aW9uZU9wdGlvbiB7XHJcbiAgLyoqIENvZGljZSBuYXppb25lIChlcy4gYCdJVEEnYCkuICovXHJcbiAgeDogc3RyaW5nO1xyXG4gIC8qKiBEZXNjcml6aW9uZSAoZXMuIGAnSXRhbGlhJ2ApLiAqL1xyXG4gIGQ6IHN0cmluZztcclxufVxyXG5cclxuLyoqIFZvY2UgcHJvdmluY2lhL2NvbXVuZSBuZWwgSlNPTiBvdHRpbWl6emF0by4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBNaW5pZmllZFNlbGVjdE9wdGlvbiB7XHJcbiAgLyoqIENvZGljZSAocHJvdmluY2lhIG8gY29tdW5lKS4gKi9cclxuICB4OiBzdHJpbmc7XHJcbiAgLyoqIERlc2NyaXppb25lLiAqL1xyXG4gIGQ6IHN0cmluZztcclxuICAvKiogQ0FQIHNpbmdvbG8gbyBtdWx0aXBsaS4gKi9cclxuICBjPzogc3RyaW5nIHwgc3RyaW5nW107XHJcbn1cclxuXHJcbmludGVyZmFjZSBNaW5pZmllZExvY2F0aW9uTWFwIHtcclxuICBwcm92aW5jZTogTWluaWZpZWRTZWxlY3RPcHRpb25bXTtcclxuICBjb211bmlQZXJQcm92aW5jaWE6IFJlY29yZDxzdHJpbmcsIE1pbmlmaWVkU2VsZWN0T3B0aW9uW10+O1xyXG59XHJcblxyXG5pbnRlcmZhY2UgTWluaWZpZWROYXppb25pTWFwIHtcclxuICBuYXppb25pOiBNaW5pZmllZE5hemlvbmVPcHRpb25bXTtcclxufVxyXG5cclxuLy8g4pSA4pSA4pSAIEludGVyZmFjY2UgcHViYmxpY2hlIChmb3JtYXRvIGxlZ2FjeSBjb21wYXRpYmlsZSkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXHJcblxyXG4vKiogTmF6aW9uZS4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBVaU5hemlvbmUge1xyXG4gIGNvZFN0YXRvUGs6IHN0cmluZztcclxuICBjb2RpY2VDYXRhc3RhbGU6IHN0cmluZztcclxuICBkZXNjcml6aW9uZTogc3RyaW5nO1xyXG59XHJcblxyXG4vKiogUHJvdmluY2lhLiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFVpUHJvdmluY2lhIHtcclxuICBjb2RpY2VQcm92aW5jaWFQazogc3RyaW5nO1xyXG4gIG5vbWVQcm92aW5jaWE6IHN0cmluZztcclxuICBzaWdsYVByb3ZpbmNpYTogc3RyaW5nO1xyXG4gIHZpc2liaWxlOiBib29sZWFuO1xyXG59XHJcblxyXG4vKiogQ29tdW5lLiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFVpQ29tdW5lIHtcclxuICBjb2RpY2VDYXRhc3RhbGU6IHN0cmluZztcclxuICBjb2RpY2VDb211bmVQazogc3RyaW5nO1xyXG4gIGNvbXVuZVNvcHByZXNzbzogYm9vbGVhbjtcclxuICBub21lQ29tdW5lOiBzdHJpbmc7XHJcbiAgcHJvdjogVWlQcm92aW5jaWE7XHJcbiAgdmlzaWJpbGU6IGJvb2xlYW47XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBTZXJ2aXppbyBwZXIgbGEgZ2VzdGlvbmUgZGVpIGRhdGkgZ2VvZ3JhZmljaSBpdGFsaWFuaVxyXG4gKiBkYSBmaWxlIEpTT04gc3RhdGljaSBvdHRpbWl6emF0aS5cclxuICpcclxuICogRWxpbWluYSBsYSBuZWNlc3NpdGEgZGkgY2hpYW1hdGUgYmFja2VuZCBwZXIgbmF6aW9uaSxcclxuICogcHJvdmluY2UsIGNvbXVuaSBlIENBUC4gSSBkYXRpIHZlbmdvbm8gY2FyaWNhdGkgaW4gbWVtb3JpYVxyXG4gKiBhbCBwcmltbyBhY2Nlc3NvIGUgcG9pIHNlcnZpdGkgZGFsbGEgY2FjaGUuXHJcbiAqXHJcbiAqIEBwcm92aWRlZEluICdyb290J1xyXG4gKlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGB0eXBlc2NyaXB0XHJcbiAqIGNvbnN0IG5hemlvbmkgPSBhd2FpdCB0aGlzLmxvY2F0aW9uU2VydmljZS5nZXROYXppb25pKCk7XHJcbiAqIGNvbnN0IHByb3ZpbmNlID0gYXdhaXQgdGhpcy5sb2NhdGlvblNlcnZpY2UuZ2V0UHJvdmluY2UoKTtcclxuICogY29uc3QgY29tdW5pID0gYXdhaXQgdGhpcy5sb2NhdGlvblNlcnZpY2UuZ2V0Q29tdW5pQnlQcm92aW5jaWEoJzAxNScpO1xyXG4gKiBjb25zdCBjYXBzID0gYXdhaXQgdGhpcy5sb2NhdGlvblNlcnZpY2UuZ2V0Q2FwTGlzdCgnMDE1MTQ2Jyk7XHJcbiAqIGBgYFxyXG4gKi9cclxuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcclxuZXhwb3J0IGNsYXNzIFVpTG9jYXRpb25TZXJ2aWNlIHtcclxuICBwcml2YXRlIHJlYWRvbmx5IG5hemlvbmlNYXA6IE1pbmlmaWVkTmF6aW9uaU1hcDtcclxuICBwcml2YXRlIHJlYWRvbmx5IGxvY2F0aW9uTWFwOiBNaW5pZmllZExvY2F0aW9uTWFwO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgbmF6aW9uaUNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIFVpTmF6aW9uZT4oKTtcclxuICBwcml2YXRlIHJlYWRvbmx5IHByb3ZpbmNlQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgVWlQcm92aW5jaWE+KCk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBjb211bmlDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBVaUNvbXVuZT4oKTtcclxuXHJcbiAgY29uc3RydWN0b3IoKSB7XHJcbiAgICB0aGlzLm5hemlvbmlNYXAgPSBuYXppb25pRGF0YSBhcyBNaW5pZmllZE5hemlvbmlNYXA7XHJcbiAgICB0aGlzLmxvY2F0aW9uTWFwID0gbG9jYXRpb25EYXRhIGFzIGFueTtcclxuICAgIHRoaXMuaW5pdGlhbGl6ZUNhY2hlcygpO1xyXG4gIH1cclxuXHJcbiAgLy8g4pSA4pSA4pSAIEFQSSBwdWJibGljYSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuXHJcbiAgLyoqIEVsZW5jbyBjb21wbGV0byBkZWxsZSBuYXppb25pIChJdGFsaWEgcHJpbWEpLiAqL1xyXG4gIGFzeW5jIGdldE5hemlvbmkoKTogUHJvbWlzZTx7IGRhdGE6IFVpTmF6aW9uZVtdIH0+IHtcclxuICAgIGNvbnN0IG5hemlvbmkgPSBBcnJheS5mcm9tKHRoaXMubmF6aW9uaUNhY2hlLnZhbHVlcygpKTtcclxuICAgIHJldHVybiB7IGRhdGE6IHRoaXMuc29ydE5hemlvbmlJdGFsaWFGaXJzdChuYXppb25pKSB9O1xyXG4gIH1cclxuXHJcbiAgLyoqIEVsZW5jbyBjb21wbGV0byBkZWxsZSBwcm92aW5jZSwgb3JkaW5hdGUgYWxmYWJldGljYW1lbnRlLiAqL1xyXG4gIGFzeW5jIGdldFByb3ZpbmNlKCk6IFByb21pc2U8eyBjb250ZW50OiBVaVByb3ZpbmNpYVtdIH0+IHtcclxuICAgIGNvbnN0IHByb3ZpbmNlID0gQXJyYXkuZnJvbSh0aGlzLnByb3ZpbmNlQ2FjaGUudmFsdWVzKCkpLnNvcnQoKGEsIGIpID0+XHJcbiAgICAgIGEubm9tZVByb3ZpbmNpYS5sb2NhbGVDb21wYXJlKGIubm9tZVByb3ZpbmNpYSwgJ2l0JyksXHJcbiAgICApO1xyXG4gICAgcmV0dXJuIHsgY29udGVudDogcHJvdmluY2UgfTtcclxuICB9XHJcblxyXG4gIC8qKiBFbGVuY28gZGVpIGNvbXVuaSBwZXIgdW5hIHNwZWNpZmljYSBwcm92aW5jaWEuICovXHJcbiAgYXN5bmMgZ2V0Q29tdW5pQnlQcm92aW5jaWEocHJvdmluY2lhSWQ6IHN0cmluZyk6IFByb21pc2U8VWlDb211bmVbXT4ge1xyXG4gICAgY29uc3QgY29tdW5pTWluID0gdGhpcy5sb2NhdGlvbk1hcC5jb211bmlQZXJQcm92aW5jaWFbcHJvdmluY2lhSWRdIHx8IFtdO1xyXG4gICAgY29uc3QgcHJvdmluY2lhID0gdGhpcy5wcm92aW5jZUNhY2hlLmdldChwcm92aW5jaWFJZCk7XHJcbiAgICBpZiAoIXByb3ZpbmNpYSkgcmV0dXJuIFtdO1xyXG5cclxuICAgIHJldHVybiBjb211bmlNaW5cclxuICAgICAgLm1hcCgoYykgPT4gKHtcclxuICAgICAgICBjb2RpY2VDYXRhc3RhbGU6IGMueCxcclxuICAgICAgICBjb2RpY2VDb211bmVQazogYy54LFxyXG4gICAgICAgIGNvbXVuZVNvcHByZXNzbzogZmFsc2UsXHJcbiAgICAgICAgbm9tZUNvbXVuZTogYy5kLFxyXG4gICAgICAgIHByb3Y6IHByb3ZpbmNpYSxcclxuICAgICAgICB2aXNpYmlsZTogdHJ1ZSxcclxuICAgICAgfSkpXHJcbiAgICAgIC5zb3J0KChhLCBiKSA9PiBhLm5vbWVDb211bmUubG9jYWxlQ29tcGFyZShiLm5vbWVDb211bmUsICdpdCcpKTtcclxuICB9XHJcblxyXG4gIC8qKiBFbGVuY28gZGVpIENBUCBwZXIgdW4gY29tdW5lLiAqL1xyXG4gIGFzeW5jIGdldENhcExpc3QoY29tdW5lSWQ6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nW10+IHtcclxuICAgIGZvciAoY29uc3QgY29tdW5pIG9mIE9iamVjdC52YWx1ZXModGhpcy5sb2NhdGlvbk1hcC5jb211bmlQZXJQcm92aW5jaWEpKSB7XHJcbiAgICAgIGNvbnN0IGNvbXVuZSA9IGNvbXVuaS5maW5kKChjKSA9PiBjLnggPT09IGNvbXVuZUlkKTtcclxuICAgICAgaWYgKGNvbXVuZT8uYykge1xyXG4gICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KGNvbXVuZS5jKSA/IGNvbXVuZS5jIDogW2NvbXVuZS5jXTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIFtdO1xyXG4gIH1cclxuXHJcbiAgLyoqIERhdGkgY29tcGxldGkgZGkgdW5hIGxvY2F0aW9uIChuYXppb25lLCBwcm92aW5jaWEgbyBjb211bmUpLiAqL1xyXG4gIGFzeW5jIGdldExvY2F0aW9uRnVsbERhdGEoXHJcbiAgICB0eXBlOiAnbmF6aW9uZScgfCAncHJvdmluY2lhJyB8ICdjb211bmUnLFxyXG4gICAgaWQ6IHN0cmluZyxcclxuICAgIHByb3ZpbmNpYUlkPzogc3RyaW5nLFxyXG4gICk6IFByb21pc2U8VWlOYXppb25lIHwgVWlQcm92aW5jaWEgfCBVaUNvbXVuZSB8IG51bGw+IHtcclxuICAgIHN3aXRjaCAodHlwZSkge1xyXG4gICAgICBjYXNlICduYXppb25lJzpcclxuICAgICAgICByZXR1cm4gdGhpcy5uYXppb25pQ2FjaGUuZ2V0KGlkKSA/PyBudWxsO1xyXG4gICAgICBjYXNlICdwcm92aW5jaWEnOlxyXG4gICAgICAgIHJldHVybiB0aGlzLnByb3ZpbmNlQ2FjaGUuZ2V0KGlkKSA/PyBudWxsO1xyXG4gICAgICBjYXNlICdjb211bmUnOlxyXG4gICAgICAgIGlmICghcHJvdmluY2lhSWQpIHJldHVybiB0aGlzLmNvbXVuaUNhY2hlLmdldChpZCkgPz8gbnVsbDtcclxuICAgICAgICBjb25zdCBjb211bmkgPSBhd2FpdCB0aGlzLmdldENvbXVuaUJ5UHJvdmluY2lhKHByb3ZpbmNpYUlkKTtcclxuICAgICAgICByZXR1cm4gY29tdW5pLmZpbmQoKGMpID0+IGMuY29kaWNlQ29tdW5lUGsgPT09IGlkKSA/PyBudWxsO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8g4pSA4pSA4pSAIEluaXppYWxpenphemlvbmUgY2FjaGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXHJcblxyXG4gIHByaXZhdGUgaW5pdGlhbGl6ZUNhY2hlcygpOiB2b2lkIHtcclxuICAgIC8vIE5hemlvbmlcclxuICAgIGZvciAoY29uc3QgbiBvZiB0aGlzLm5hemlvbmlNYXAubmF6aW9uaSkge1xyXG4gICAgICB0aGlzLm5hemlvbmlDYWNoZS5zZXQobi54LCB7XHJcbiAgICAgICAgY29kU3RhdG9Qazogbi54LFxyXG4gICAgICAgIGNvZGljZUNhdGFzdGFsZTogbi54LFxyXG4gICAgICAgIGRlc2NyaXppb25lOiBuLmQsXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFByb3ZpbmNlXHJcbiAgICBmb3IgKGNvbnN0IHAgb2YgdGhpcy5sb2NhdGlvbk1hcC5wcm92aW5jZSkge1xyXG4gICAgICB0aGlzLnByb3ZpbmNlQ2FjaGUuc2V0KHAueCwge1xyXG4gICAgICAgIGNvZGljZVByb3ZpbmNpYVBrOiBwLngsXHJcbiAgICAgICAgbm9tZVByb3ZpbmNpYTogcC5kLFxyXG4gICAgICAgIHNpZ2xhUHJvdmluY2lhOiBwLngsXHJcbiAgICAgICAgdmlzaWJpbGU6IHRydWUsXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIENvbXVuaSAoY29uIHJpZmVyaW1lbnRvIGFsbGEgcHJvdmluY2lhKVxyXG4gICAgZm9yIChjb25zdCBbcHJvdmluY2lhSWQsIGNvbXVuaV0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5sb2NhdGlvbk1hcC5jb211bmlQZXJQcm92aW5jaWEpKSB7XHJcbiAgICAgIGNvbnN0IHByb3ZpbmNpYSA9IHRoaXMucHJvdmluY2VDYWNoZS5nZXQocHJvdmluY2lhSWQpO1xyXG4gICAgICBpZiAoIXByb3ZpbmNpYSkgY29udGludWU7XHJcbiAgICAgIGZvciAoY29uc3QgYyBvZiBjb211bmkpIHtcclxuICAgICAgICB0aGlzLmNvbXVuaUNhY2hlLnNldChjLngsIHtcclxuICAgICAgICAgIGNvZGljZUNhdGFzdGFsZTogYy54LFxyXG4gICAgICAgICAgY29kaWNlQ29tdW5lUGs6IGMueCxcclxuICAgICAgICAgIGNvbXVuZVNvcHByZXNzbzogZmFsc2UsXHJcbiAgICAgICAgICBub21lQ29tdW5lOiBjLmQsXHJcbiAgICAgICAgICBwcm92OiBwcm92aW5jaWEsXHJcbiAgICAgICAgICB2aXNpYmlsZTogdHJ1ZSxcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzb3J0TmF6aW9uaUl0YWxpYUZpcnN0KG5hemlvbmk6IFVpTmF6aW9uZVtdKTogVWlOYXppb25lW10ge1xyXG4gICAgcmV0dXJuIG5hemlvbmkuc29ydCgoYSwgYikgPT4ge1xyXG4gICAgICBjb25zdCBhSXRhbGlhID0gYS5kZXNjcml6aW9uZT8udG9Mb3dlckNhc2UoKS5pbmNsdWRlcygnaXRhbGlhJykgfHwgYS5jb2RTdGF0b1BrID09PSAnSVRBJztcclxuICAgICAgY29uc3QgYkl0YWxpYSA9IGIuZGVzY3JpemlvbmU/LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJ2l0YWxpYScpIHx8IGIuY29kU3RhdG9QayA9PT0gJ0lUQSc7XHJcbiAgICAgIGlmIChhSXRhbGlhICYmICFiSXRhbGlhKSByZXR1cm4gLTE7XHJcbiAgICAgIGlmICghYUl0YWxpYSAmJiBiSXRhbGlhKSByZXR1cm4gMTtcclxuICAgICAgcmV0dXJuIChhLmRlc2NyaXppb25lIHx8ICcnKS5sb2NhbGVDb21wYXJlKGIuZGVzY3JpemlvbmUgfHwgJycsICdpdCcsIHsgc2Vuc2l0aXZpdHk6ICdiYXNlJyB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxufVxyXG4iXX0=
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import { BehaviorSubject } from 'rxjs';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
/**
|
|
5
|
+
* Servizio per la sincronizzazione dello stato del wizard
|
|
6
|
+
* tra istanze multiple (es. header esterno e form wizard).
|
|
7
|
+
*
|
|
8
|
+
* Utilizza BehaviorSubject per mantenere lo stato corrente
|
|
9
|
+
* e notificare i sottoscrittori in tempo reale.
|
|
10
|
+
*
|
|
11
|
+
* @providedIn 'root'
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```typescript
|
|
15
|
+
* // Nel componente header esterno
|
|
16
|
+
* this.wizardSync.getWizardState$('my-wizard')
|
|
17
|
+
* .subscribe(data => {
|
|
18
|
+
* this.currentStep = data?.wizardState.currentStep;
|
|
19
|
+
* this.totalSteps = data?.wizardState.totalSteps;
|
|
20
|
+
* });
|
|
21
|
+
*
|
|
22
|
+
* // Navigazione da header esterno
|
|
23
|
+
* this.wizardSync.navigateToStep('my-wizard', 2);
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
export class UiWizardSyncService {
|
|
27
|
+
constructor() {
|
|
28
|
+
this.instances = new Map();
|
|
29
|
+
}
|
|
30
|
+
/** Registra un nuovo wizard o aggiorna uno esistente. */
|
|
31
|
+
registerWizard(wizardId, data) {
|
|
32
|
+
if (!this.instances.has(wizardId)) {
|
|
33
|
+
this.instances.set(wizardId, new BehaviorSubject(null));
|
|
34
|
+
}
|
|
35
|
+
this.instances.get(wizardId).next(data);
|
|
36
|
+
}
|
|
37
|
+
/** Ottiene un observable per monitorare lo stato di un wizard. */
|
|
38
|
+
getWizardState$(wizardId) {
|
|
39
|
+
if (!this.instances.has(wizardId)) {
|
|
40
|
+
this.instances.set(wizardId, new BehaviorSubject(null));
|
|
41
|
+
}
|
|
42
|
+
return this.instances.get(wizardId).asObservable();
|
|
43
|
+
}
|
|
44
|
+
/** Ottiene lo stato corrente (snapshot). */
|
|
45
|
+
getCurrentWizardState(wizardId) {
|
|
46
|
+
return this.instances.get(wizardId)?.value ?? null;
|
|
47
|
+
}
|
|
48
|
+
/** Rimuove un wizard dal registro (cleanup su destroy). */
|
|
49
|
+
unregisterWizard(wizardId) {
|
|
50
|
+
const subject = this.instances.get(wizardId);
|
|
51
|
+
if (subject) {
|
|
52
|
+
subject.complete();
|
|
53
|
+
this.instances.delete(wizardId);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
/** Aggiorna parzialmente lo stato del wizard. */
|
|
57
|
+
updateWizardState(wizardId, partial) {
|
|
58
|
+
const subject = this.instances.get(wizardId);
|
|
59
|
+
const current = subject?.value;
|
|
60
|
+
if (current) {
|
|
61
|
+
subject.next({
|
|
62
|
+
...current,
|
|
63
|
+
wizardState: { ...current.wizardState, ...partial },
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/** Emette un evento di navigazione verso uno step specifico. */
|
|
68
|
+
navigateToStep(wizardId, stepIndex) {
|
|
69
|
+
const current = this.getCurrentWizardState(wizardId);
|
|
70
|
+
if (current) {
|
|
71
|
+
this.updateWizardState(wizardId, {
|
|
72
|
+
currentStep: stepIndex,
|
|
73
|
+
visitedSteps: new Set([...current.wizardState.visitedSteps, stepIndex]),
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: UiWizardSyncService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
78
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: UiWizardSyncService, providedIn: 'root' }); }
|
|
79
|
+
}
|
|
80
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: UiWizardSyncService, decorators: [{
|
|
81
|
+
type: Injectable,
|
|
82
|
+
args: [{ providedIn: 'root' }]
|
|
83
|
+
}] });
|
|
84
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l6YXJkLXN5bmMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL25nLXVpLXN5c3RlbS9zcmMvbGliL2NvbXBvbmVudHMvZm9ybS1idWlsZGVyL3NlcnZpY2VzL3dpemFyZC1zeW5jLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsZUFBZSxFQUFjLE1BQU0sTUFBTSxDQUFDOztBQXNCbkQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXFCRztBQUVILE1BQU0sT0FBTyxtQkFBbUI7SUFEaEM7UUFFbUIsY0FBUyxHQUFHLElBQUksR0FBRyxFQUFvRCxDQUFDO0tBc0QxRjtJQXBEQyx5REFBeUQ7SUFDekQsY0FBYyxDQUFDLFFBQWdCLEVBQUUsSUFBc0I7UUFDckQsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7WUFDbEMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLElBQUksZUFBZSxDQUEwQixJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ25GLENBQUM7UUFDRCxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVELGtFQUFrRTtJQUNsRSxlQUFlLENBQUMsUUFBZ0I7UUFDOUIsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7WUFDbEMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLElBQUksZUFBZSxDQUEwQixJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ25GLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBRSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3RELENBQUM7SUFFRCw0Q0FBNEM7SUFDNUMscUJBQXFCLENBQUMsUUFBZ0I7UUFDcEMsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRSxLQUFLLElBQUksSUFBSSxDQUFDO0lBQ3JELENBQUM7SUFFRCwyREFBMkQ7SUFDM0QsZ0JBQWdCLENBQUMsUUFBZ0I7UUFDL0IsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDN0MsSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUNaLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNuQixJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNsQyxDQUFDO0lBQ0gsQ0FBQztJQUVELGlEQUFpRDtJQUNqRCxpQkFBaUIsQ0FBQyxRQUFnQixFQUFFLE9BQStCO1FBQ2pFLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzdDLE1BQU0sT0FBTyxHQUFHLE9BQU8sRUFBRSxLQUFLLENBQUM7UUFDL0IsSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUNaLE9BQVEsQ0FBQyxJQUFJLENBQUM7Z0JBQ1osR0FBRyxPQUFPO2dCQUNWLFdBQVcsRUFBRSxFQUFFLEdBQUcsT0FBTyxDQUFDLFdBQVcsRUFBRSxHQUFHLE9BQU8sRUFBRTthQUNwRCxDQUFDLENBQUM7UUFDTCxDQUFDO0lBQ0gsQ0FBQztJQUVELGdFQUFnRTtJQUNoRSxjQUFjLENBQUMsUUFBZ0IsRUFBRSxTQUFpQjtRQUNoRCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDckQsSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUNaLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLEVBQUU7Z0JBQy9CLFdBQVcsRUFBRSxTQUFTO2dCQUN0QixZQUFZLEVBQUUsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUMsWUFBWSxFQUFFLFNBQVMsQ0FBQyxDQUFDO2FBQ3hFLENBQUMsQ0FBQztRQUNMLENBQUM7SUFDSCxDQUFDOytHQXREVSxtQkFBbUI7bUhBQW5CLG1CQUFtQixjQUROLE1BQU07OzRGQUNuQixtQkFBbUI7a0JBRC9CLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBVaVdpemFyZFN0YXRlLCBVaUZvcm1TY2hlbWEgfSBmcm9tICcuLi90eXBlcy9zY2hlbWEudHlwZXMnO1xuXG4vKipcbiAqIERhdGkgc2luY3Jvbml6emF0aSB0cmEgaXN0YW56ZSB3aXphcmQuXG4gKiBVc2F0byBwZXIgbGEgZnVuemlvbmFsaXRhIFwid2lyZWxlc3MgaGVhZGluZ1wiIGNoZSBwZXJtZXR0ZVxuICogYSB1biBjb21wb25lbnRlIGVzdGVybm8gZGkgY29udHJvbGxhcmUgbGEgdmlzdWFsaXp6YXppb25lXG4gKiBkZWxsJ2hlYWRlciBkZWwgd2l6YXJkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVpV2l6YXJkU3luY0RhdGEge1xuICAvKiogSUQgZGVsIHdpemFyZC4gKi9cbiAgd2l6YXJkSWQ6IHN0cmluZztcbiAgLyoqIFN0YXRvIGNvcnJlbnRlIGRlbCB3aXphcmQuICovXG4gIHdpemFyZFN0YXRlOiBVaVdpemFyZFN0YXRlO1xuICAvKiogQ29uZmlndXJhemlvbmkgZGVnbGkgc3RlcC4gKi9cbiAgd2l6YXJkU3RlcHM6IHsgdGl0bGU/OiBzdHJpbmc7IGRlc2NyaXB0aW9uPzogc3RyaW5nIH1bXTtcbiAgLyoqIFNlIGlsIHdpemFyZCBlIGF0dGl2by4gKi9cbiAgaXNXaXphcmRNb2RlOiBib29sZWFuO1xuICAvKiogU2NoZW1hIGNvcnJlbnRlIGRlbCBmb3JtLiAqL1xuICBzY2hlbWE6IFVpRm9ybVNjaGVtYSB8IG51bGw7XG59XG5cbi8qKlxuICogU2Vydml6aW8gcGVyIGxhIHNpbmNyb25penphemlvbmUgZGVsbG8gc3RhdG8gZGVsIHdpemFyZFxuICogdHJhIGlzdGFuemUgbXVsdGlwbGUgKGVzLiBoZWFkZXIgZXN0ZXJubyBlIGZvcm0gd2l6YXJkKS5cbiAqXG4gKiBVdGlsaXp6YSBCZWhhdmlvclN1YmplY3QgcGVyIG1hbnRlbmVyZSBsbyBzdGF0byBjb3JyZW50ZVxuICogZSBub3RpZmljYXJlIGkgc290dG9zY3JpdHRvcmkgaW4gdGVtcG8gcmVhbGUuXG4gKlxuICogQHByb3ZpZGVkSW4gJ3Jvb3QnXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIE5lbCBjb21wb25lbnRlIGhlYWRlciBlc3Rlcm5vXG4gKiB0aGlzLndpemFyZFN5bmMuZ2V0V2l6YXJkU3RhdGUkKCdteS13aXphcmQnKVxuICogICAuc3Vic2NyaWJlKGRhdGEgPT4ge1xuICogICAgIHRoaXMuY3VycmVudFN0ZXAgPSBkYXRhPy53aXphcmRTdGF0ZS5jdXJyZW50U3RlcDtcbiAqICAgICB0aGlzLnRvdGFsU3RlcHMgPSBkYXRhPy53aXphcmRTdGF0ZS50b3RhbFN0ZXBzO1xuICogICB9KTtcbiAqXG4gKiAvLyBOYXZpZ2F6aW9uZSBkYSBoZWFkZXIgZXN0ZXJub1xuICogdGhpcy53aXphcmRTeW5jLm5hdmlnYXRlVG9TdGVwKCdteS13aXphcmQnLCAyKTtcbiAqIGBgYFxuICovXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIFVpV2l6YXJkU3luY1NlcnZpY2Uge1xuICBwcml2YXRlIHJlYWRvbmx5IGluc3RhbmNlcyA9IG5ldyBNYXA8c3RyaW5nLCBCZWhhdmlvclN1YmplY3Q8VWlXaXphcmRTeW5jRGF0YSB8IG51bGw+PigpO1xuXG4gIC8qKiBSZWdpc3RyYSB1biBudW92byB3aXphcmQgbyBhZ2dpb3JuYSB1bm8gZXNpc3RlbnRlLiAqL1xuICByZWdpc3RlcldpemFyZCh3aXphcmRJZDogc3RyaW5nLCBkYXRhOiBVaVdpemFyZFN5bmNEYXRhKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmluc3RhbmNlcy5oYXMod2l6YXJkSWQpKSB7XG4gICAgICB0aGlzLmluc3RhbmNlcy5zZXQod2l6YXJkSWQsIG5ldyBCZWhhdmlvclN1YmplY3Q8VWlXaXphcmRTeW5jRGF0YSB8IG51bGw+KG51bGwpKTtcbiAgICB9XG4gICAgdGhpcy5pbnN0YW5jZXMuZ2V0KHdpemFyZElkKSEubmV4dChkYXRhKTtcbiAgfVxuXG4gIC8qKiBPdHRpZW5lIHVuIG9ic2VydmFibGUgcGVyIG1vbml0b3JhcmUgbG8gc3RhdG8gZGkgdW4gd2l6YXJkLiAqL1xuICBnZXRXaXphcmRTdGF0ZSQod2l6YXJkSWQ6IHN0cmluZyk6IE9ic2VydmFibGU8VWlXaXphcmRTeW5jRGF0YSB8IG51bGw+IHtcbiAgICBpZiAoIXRoaXMuaW5zdGFuY2VzLmhhcyh3aXphcmRJZCkpIHtcbiAgICAgIHRoaXMuaW5zdGFuY2VzLnNldCh3aXphcmRJZCwgbmV3IEJlaGF2aW9yU3ViamVjdDxVaVdpemFyZFN5bmNEYXRhIHwgbnVsbD4obnVsbCkpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5pbnN0YW5jZXMuZ2V0KHdpemFyZElkKSEuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICAvKiogT3R0aWVuZSBsbyBzdGF0byBjb3JyZW50ZSAoc25hcHNob3QpLiAqL1xuICBnZXRDdXJyZW50V2l6YXJkU3RhdGUod2l6YXJkSWQ6IHN0cmluZyk6IFVpV2l6YXJkU3luY0RhdGEgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5pbnN0YW5jZXMuZ2V0KHdpemFyZElkKT8udmFsdWUgPz8gbnVsbDtcbiAgfVxuXG4gIC8qKiBSaW11b3ZlIHVuIHdpemFyZCBkYWwgcmVnaXN0cm8gKGNsZWFudXAgc3UgZGVzdHJveSkuICovXG4gIHVucmVnaXN0ZXJXaXphcmQod2l6YXJkSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHN1YmplY3QgPSB0aGlzLmluc3RhbmNlcy5nZXQod2l6YXJkSWQpO1xuICAgIGlmIChzdWJqZWN0KSB7XG4gICAgICBzdWJqZWN0LmNvbXBsZXRlKCk7XG4gICAgICB0aGlzLmluc3RhbmNlcy5kZWxldGUod2l6YXJkSWQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBBZ2dpb3JuYSBwYXJ6aWFsbWVudGUgbG8gc3RhdG8gZGVsIHdpemFyZC4gKi9cbiAgdXBkYXRlV2l6YXJkU3RhdGUod2l6YXJkSWQ6IHN0cmluZywgcGFydGlhbDogUGFydGlhbDxVaVdpemFyZFN0YXRlPik6IHZvaWQge1xuICAgIGNvbnN0IHN1YmplY3QgPSB0aGlzLmluc3RhbmNlcy5nZXQod2l6YXJkSWQpO1xuICAgIGNvbnN0IGN1cnJlbnQgPSBzdWJqZWN0Py52YWx1ZTtcbiAgICBpZiAoY3VycmVudCkge1xuICAgICAgc3ViamVjdCEubmV4dCh7XG4gICAgICAgIC4uLmN1cnJlbnQsXG4gICAgICAgIHdpemFyZFN0YXRlOiB7IC4uLmN1cnJlbnQud2l6YXJkU3RhdGUsIC4uLnBhcnRpYWwgfSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBFbWV0dGUgdW4gZXZlbnRvIGRpIG5hdmlnYXppb25lIHZlcnNvIHVubyBzdGVwIHNwZWNpZmljby4gKi9cbiAgbmF2aWdhdGVUb1N0ZXAod2l6YXJkSWQ6IHN0cmluZywgc3RlcEluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5nZXRDdXJyZW50V2l6YXJkU3RhdGUod2l6YXJkSWQpO1xuICAgIGlmIChjdXJyZW50KSB7XG4gICAgICB0aGlzLnVwZGF0ZVdpemFyZFN0YXRlKHdpemFyZElkLCB7XG4gICAgICAgIGN1cnJlbnRTdGVwOiBzdGVwSW5kZXgsXG4gICAgICAgIHZpc2l0ZWRTdGVwczogbmV3IFNldChbLi4uY3VycmVudC53aXphcmRTdGF0ZS52aXNpdGVkU3RlcHMsIHN0ZXBJbmRleF0pLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy, ViewEncapsulation } from '@angular/core';
|
|
2
|
+
import { LucideAngularModule } from 'lucide-angular';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
import * as i1 from "lucide-angular";
|
|
5
|
+
/**
|
|
6
|
+
* Componente per il riepilogo errori del form.
|
|
7
|
+
*
|
|
8
|
+
* Mostra un indicatore con il conteggio degli errori e un dropdown
|
|
9
|
+
* con il dettaglio per campo. Click su un errore emette `fieldClick`
|
|
10
|
+
* per consentire lo scroll-to-field con highlight nel form builder.
|
|
11
|
+
*
|
|
12
|
+
* @selector ui-form-error-summary
|
|
13
|
+
*/
|
|
14
|
+
export class UiFormErrorSummaryComponent {
|
|
15
|
+
constructor() {
|
|
16
|
+
/** Lista di errori dettagliati per campo. */
|
|
17
|
+
this.errors = [];
|
|
18
|
+
/** Conteggio totale degli errori (somma di tutti i messaggi). */
|
|
19
|
+
this.totalErrorCount = 0;
|
|
20
|
+
/** Emesso quando l'utente clicca su un errore per navigare al campo. */
|
|
21
|
+
this.fieldClick = new EventEmitter();
|
|
22
|
+
/** @internal Stato del dropdown. */
|
|
23
|
+
this.showDropdown = false;
|
|
24
|
+
}
|
|
25
|
+
/** Conteggio da visualizzare: usa totalErrorCount se fornito, altrimenti conta dai dettagli. */
|
|
26
|
+
get displayCount() {
|
|
27
|
+
return this.totalErrorCount > 0 ? this.totalErrorCount : this.errors.reduce((sum, d) => sum + d.errors.length, 0);
|
|
28
|
+
}
|
|
29
|
+
/** @internal Gestione click su errore. */
|
|
30
|
+
onFieldClick(fieldKey) {
|
|
31
|
+
this.showDropdown = false;
|
|
32
|
+
this.fieldClick.emit(fieldKey);
|
|
33
|
+
}
|
|
34
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: UiFormErrorSummaryComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
35
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: UiFormErrorSummaryComponent, isStandalone: true, selector: "ui-form-error-summary", inputs: { errors: "errors", totalErrorCount: "totalErrorCount" }, outputs: { fieldClick: "fieldClick" }, ngImport: i0, template: `
|
|
36
|
+
@if (errors.length > 0) {
|
|
37
|
+
<div
|
|
38
|
+
class="ui-form-error-summary"
|
|
39
|
+
(mouseenter)="showDropdown = true"
|
|
40
|
+
(mouseleave)="showDropdown = false"
|
|
41
|
+
>
|
|
42
|
+
<!-- Indicatore errori con icona e messaggio -->
|
|
43
|
+
<div class="ui-form-error-summary__heading"
|
|
44
|
+
(click)="showDropdown = !showDropdown"
|
|
45
|
+
role="button"
|
|
46
|
+
tabindex="0"
|
|
47
|
+
[attr.aria-label]="displayCount + ' errori nel form'"
|
|
48
|
+
(keydown.enter)="showDropdown = !showDropdown"
|
|
49
|
+
(keydown.space)="showDropdown = !showDropdown; $event.preventDefault()"
|
|
50
|
+
>
|
|
51
|
+
<lucide-icon name="alert-circle" [size]="20" class="ui-form-error-summary__icon" aria-hidden="true" />
|
|
52
|
+
<p class="ui-form-error-summary__text">
|
|
53
|
+
Sono presenti <strong>{{ displayCount }}</strong>
|
|
54
|
+
{{ displayCount === 1 ? 'errore' : 'errori' }} nel form.
|
|
55
|
+
</p>
|
|
56
|
+
</div>
|
|
57
|
+
|
|
58
|
+
<!-- Dropdown dettaglio -->
|
|
59
|
+
<div
|
|
60
|
+
class="ui-form-error-summary__dropdown"
|
|
61
|
+
[class.ui-form-error-summary__dropdown--visible]="showDropdown"
|
|
62
|
+
role="list"
|
|
63
|
+
aria-label="Elenco errori del form"
|
|
64
|
+
>
|
|
65
|
+
<div class="ui-form-error-summary__dropdown-content">
|
|
66
|
+
<h4 class="ui-form-error-summary__dropdown-title">Dettagli errori:</h4>
|
|
67
|
+
<ul class="ui-form-error-summary__list">
|
|
68
|
+
@for (detail of errors; track detail.fieldKey) {
|
|
69
|
+
<li
|
|
70
|
+
class="ui-form-error-summary__item"
|
|
71
|
+
role="listitem"
|
|
72
|
+
(click)="onFieldClick(detail.fieldKey)"
|
|
73
|
+
tabindex="0"
|
|
74
|
+
(keydown.enter)="onFieldClick(detail.fieldKey)"
|
|
75
|
+
>
|
|
76
|
+
<div class="ui-form-error-summary__field-name">
|
|
77
|
+
<lucide-icon name="arrow-right" [size]="14" class="ui-form-error-summary__arrow" aria-hidden="true" />
|
|
78
|
+
{{ detail.fieldLabel }}
|
|
79
|
+
</div>
|
|
80
|
+
<div class="ui-form-error-summary__messages">
|
|
81
|
+
@for (err of detail.errors; track $index; let last = $last) {
|
|
82
|
+
<span>{{ err }}@if (!last) {, }</span>
|
|
83
|
+
}
|
|
84
|
+
</div>
|
|
85
|
+
</li>
|
|
86
|
+
}
|
|
87
|
+
</ul>
|
|
88
|
+
</div>
|
|
89
|
+
</div>
|
|
90
|
+
</div>
|
|
91
|
+
}
|
|
92
|
+
`, isInline: true, styles: [".ui-form-error-summary{position:relative;cursor:pointer}.ui-form-error-summary__heading{display:flex;align-items:center;gap:var(--ui-spacing-2, 8px);padding:var(--ui-spacing-2, 8px) 0;outline:none}.ui-form-error-summary__heading:focus{outline:none}.ui-form-error-summary__heading:focus-visible{outline:var(--ui-focus-ring-width) solid var(--ui-focus-ring-color);outline-offset:var(--ui-focus-ring-offset)}.ui-form-error-summary__icon{color:var(--ui-color-error, #dc2626);flex-shrink:0}.ui-form-error-summary__text{margin:0;color:var(--ui-color-error, #dc2626);font-size:var(--ui-font-size-sm, 14px);font-family:var(--ui-font-family);line-height:1.4}.ui-form-error-summary__text strong{font-weight:var(--ui-font-weight-semibold, 600)}.ui-form-error-summary__dropdown{position:absolute;bottom:100%;left:0;right:0;min-width:320px;max-height:300px;overflow-y:auto;background:var(--ui-color-surface, #fff);border:1px solid var(--ui-color-border, #e5e7eb);border-radius:var(--ui-radius-lg, 8px);box-shadow:0 -10px 25px -3px #0000001a,0 -4px 6px -2px #0000000d;z-index:1000;margin-bottom:var(--ui-spacing-2, 8px);opacity:0;visibility:hidden;transform:translateY(10px);transition:opacity .2s ease-in-out,visibility .2s ease-in-out,transform .2s ease-in-out}.ui-form-error-summary__dropdown--visible{opacity:1;visibility:visible;transform:translateY(0)}.ui-form-error-summary__dropdown-content{padding:var(--ui-spacing-4, 16px)}.ui-form-error-summary__dropdown-title{margin:0 0 var(--ui-spacing-3, 12px) 0;color:var(--ui-color-text, #374151);font-size:var(--ui-font-size-sm, 14px);font-weight:var(--ui-font-weight-semibold, 600);font-family:var(--ui-font-family)}.ui-form-error-summary__list{list-style:none;padding:0;margin:0}.ui-form-error-summary__item{padding:var(--ui-spacing-3, 12px);border-radius:var(--ui-radius-md, 6px);cursor:pointer;transition:background-color .15s ease;border:1px solid transparent;margin-bottom:var(--ui-spacing-2, 8px);outline:none}.ui-form-error-summary__item:focus{outline:none}.ui-form-error-summary__item:focus-visible{outline:var(--ui-focus-ring-width) solid var(--ui-focus-ring-color);outline-offset:var(--ui-focus-ring-offset)}.ui-form-error-summary__item:last-child{margin-bottom:0}.ui-form-error-summary__item:hover{background:var(--ui-color-surface-hover, #f9fafb);border-color:var(--ui-color-border, #e5e7eb)}.ui-form-error-summary__field-name{display:flex;align-items:center;gap:var(--ui-spacing-2, 8px);font-weight:var(--ui-font-weight-semibold, 600);color:var(--ui-color-text, #374151);font-size:var(--ui-font-size-sm, 14px);font-family:var(--ui-font-family);margin-bottom:4px}.ui-form-error-summary__arrow{color:var(--ui-color-text-muted, #6b7280);flex-shrink:0;transition:transform .15s ease}.ui-form-error-summary__item:hover .ui-form-error-summary__arrow{transform:translate(4px)}.ui-form-error-summary__messages{color:var(--ui-color-error, #dc2626);font-size:var(--ui-font-size-xs, 13px);font-family:var(--ui-font-family);line-height:1.4;margin-left:22px}@media (max-width: 768px){.ui-form-error-summary__dropdown{position:fixed;inset:50% 16px auto;transform:translateY(-50%);margin-bottom:0}.ui-form-error-summary__dropdown--visible{transform:translateY(-50%)}}\n"], dependencies: [{ kind: "ngmodule", type: LucideAngularModule }, { kind: "component", type: i1.LucideAngularComponent, selector: "lucide-angular, lucide-icon, i-lucide, span-lucide", inputs: ["class", "name", "img", "color", "absoluteStrokeWidth", "size", "strokeWidth"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
93
|
+
}
|
|
94
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: UiFormErrorSummaryComponent, decorators: [{
|
|
95
|
+
type: Component,
|
|
96
|
+
args: [{ selector: 'ui-form-error-summary', standalone: true, imports: [LucideAngularModule], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: `
|
|
97
|
+
@if (errors.length > 0) {
|
|
98
|
+
<div
|
|
99
|
+
class="ui-form-error-summary"
|
|
100
|
+
(mouseenter)="showDropdown = true"
|
|
101
|
+
(mouseleave)="showDropdown = false"
|
|
102
|
+
>
|
|
103
|
+
<!-- Indicatore errori con icona e messaggio -->
|
|
104
|
+
<div class="ui-form-error-summary__heading"
|
|
105
|
+
(click)="showDropdown = !showDropdown"
|
|
106
|
+
role="button"
|
|
107
|
+
tabindex="0"
|
|
108
|
+
[attr.aria-label]="displayCount + ' errori nel form'"
|
|
109
|
+
(keydown.enter)="showDropdown = !showDropdown"
|
|
110
|
+
(keydown.space)="showDropdown = !showDropdown; $event.preventDefault()"
|
|
111
|
+
>
|
|
112
|
+
<lucide-icon name="alert-circle" [size]="20" class="ui-form-error-summary__icon" aria-hidden="true" />
|
|
113
|
+
<p class="ui-form-error-summary__text">
|
|
114
|
+
Sono presenti <strong>{{ displayCount }}</strong>
|
|
115
|
+
{{ displayCount === 1 ? 'errore' : 'errori' }} nel form.
|
|
116
|
+
</p>
|
|
117
|
+
</div>
|
|
118
|
+
|
|
119
|
+
<!-- Dropdown dettaglio -->
|
|
120
|
+
<div
|
|
121
|
+
class="ui-form-error-summary__dropdown"
|
|
122
|
+
[class.ui-form-error-summary__dropdown--visible]="showDropdown"
|
|
123
|
+
role="list"
|
|
124
|
+
aria-label="Elenco errori del form"
|
|
125
|
+
>
|
|
126
|
+
<div class="ui-form-error-summary__dropdown-content">
|
|
127
|
+
<h4 class="ui-form-error-summary__dropdown-title">Dettagli errori:</h4>
|
|
128
|
+
<ul class="ui-form-error-summary__list">
|
|
129
|
+
@for (detail of errors; track detail.fieldKey) {
|
|
130
|
+
<li
|
|
131
|
+
class="ui-form-error-summary__item"
|
|
132
|
+
role="listitem"
|
|
133
|
+
(click)="onFieldClick(detail.fieldKey)"
|
|
134
|
+
tabindex="0"
|
|
135
|
+
(keydown.enter)="onFieldClick(detail.fieldKey)"
|
|
136
|
+
>
|
|
137
|
+
<div class="ui-form-error-summary__field-name">
|
|
138
|
+
<lucide-icon name="arrow-right" [size]="14" class="ui-form-error-summary__arrow" aria-hidden="true" />
|
|
139
|
+
{{ detail.fieldLabel }}
|
|
140
|
+
</div>
|
|
141
|
+
<div class="ui-form-error-summary__messages">
|
|
142
|
+
@for (err of detail.errors; track $index; let last = $last) {
|
|
143
|
+
<span>{{ err }}@if (!last) {, }</span>
|
|
144
|
+
}
|
|
145
|
+
</div>
|
|
146
|
+
</li>
|
|
147
|
+
}
|
|
148
|
+
</ul>
|
|
149
|
+
</div>
|
|
150
|
+
</div>
|
|
151
|
+
</div>
|
|
152
|
+
}
|
|
153
|
+
`, styles: [".ui-form-error-summary{position:relative;cursor:pointer}.ui-form-error-summary__heading{display:flex;align-items:center;gap:var(--ui-spacing-2, 8px);padding:var(--ui-spacing-2, 8px) 0;outline:none}.ui-form-error-summary__heading:focus{outline:none}.ui-form-error-summary__heading:focus-visible{outline:var(--ui-focus-ring-width) solid var(--ui-focus-ring-color);outline-offset:var(--ui-focus-ring-offset)}.ui-form-error-summary__icon{color:var(--ui-color-error, #dc2626);flex-shrink:0}.ui-form-error-summary__text{margin:0;color:var(--ui-color-error, #dc2626);font-size:var(--ui-font-size-sm, 14px);font-family:var(--ui-font-family);line-height:1.4}.ui-form-error-summary__text strong{font-weight:var(--ui-font-weight-semibold, 600)}.ui-form-error-summary__dropdown{position:absolute;bottom:100%;left:0;right:0;min-width:320px;max-height:300px;overflow-y:auto;background:var(--ui-color-surface, #fff);border:1px solid var(--ui-color-border, #e5e7eb);border-radius:var(--ui-radius-lg, 8px);box-shadow:0 -10px 25px -3px #0000001a,0 -4px 6px -2px #0000000d;z-index:1000;margin-bottom:var(--ui-spacing-2, 8px);opacity:0;visibility:hidden;transform:translateY(10px);transition:opacity .2s ease-in-out,visibility .2s ease-in-out,transform .2s ease-in-out}.ui-form-error-summary__dropdown--visible{opacity:1;visibility:visible;transform:translateY(0)}.ui-form-error-summary__dropdown-content{padding:var(--ui-spacing-4, 16px)}.ui-form-error-summary__dropdown-title{margin:0 0 var(--ui-spacing-3, 12px) 0;color:var(--ui-color-text, #374151);font-size:var(--ui-font-size-sm, 14px);font-weight:var(--ui-font-weight-semibold, 600);font-family:var(--ui-font-family)}.ui-form-error-summary__list{list-style:none;padding:0;margin:0}.ui-form-error-summary__item{padding:var(--ui-spacing-3, 12px);border-radius:var(--ui-radius-md, 6px);cursor:pointer;transition:background-color .15s ease;border:1px solid transparent;margin-bottom:var(--ui-spacing-2, 8px);outline:none}.ui-form-error-summary__item:focus{outline:none}.ui-form-error-summary__item:focus-visible{outline:var(--ui-focus-ring-width) solid var(--ui-focus-ring-color);outline-offset:var(--ui-focus-ring-offset)}.ui-form-error-summary__item:last-child{margin-bottom:0}.ui-form-error-summary__item:hover{background:var(--ui-color-surface-hover, #f9fafb);border-color:var(--ui-color-border, #e5e7eb)}.ui-form-error-summary__field-name{display:flex;align-items:center;gap:var(--ui-spacing-2, 8px);font-weight:var(--ui-font-weight-semibold, 600);color:var(--ui-color-text, #374151);font-size:var(--ui-font-size-sm, 14px);font-family:var(--ui-font-family);margin-bottom:4px}.ui-form-error-summary__arrow{color:var(--ui-color-text-muted, #6b7280);flex-shrink:0;transition:transform .15s ease}.ui-form-error-summary__item:hover .ui-form-error-summary__arrow{transform:translate(4px)}.ui-form-error-summary__messages{color:var(--ui-color-error, #dc2626);font-size:var(--ui-font-size-xs, 13px);font-family:var(--ui-font-family);line-height:1.4;margin-left:22px}@media (max-width: 768px){.ui-form-error-summary__dropdown{position:fixed;inset:50% 16px auto;transform:translateY(-50%);margin-bottom:0}.ui-form-error-summary__dropdown--visible{transform:translateY(-50%)}}\n"] }]
|
|
154
|
+
}], propDecorators: { errors: [{
|
|
155
|
+
type: Input
|
|
156
|
+
}], totalErrorCount: [{
|
|
157
|
+
type: Input
|
|
158
|
+
}], fieldClick: [{
|
|
159
|
+
type: Output
|
|
160
|
+
}] } });
|
|
161
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1lcnJvci1zdW1tYXJ5LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL25nLXVpLXN5c3RlbS9zcmMvbGliL2NvbXBvbmVudHMvZm9ybS1idWlsZGVyL3N1Yi1jb21wb25lbnRzL2Vycm9yLXN1bW1hcnkvZm9ybS1lcnJvci1zdW1tYXJ5LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLHVCQUF1QixFQUFFLGlCQUFpQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ILE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7QUFHckQ7Ozs7Ozs7O0dBUUc7QUFtRUgsTUFBTSxPQUFPLDJCQUEyQjtJQWxFeEM7UUFtRUUsNkNBQTZDO1FBQ3BDLFdBQU0sR0FBd0IsRUFBRSxDQUFDO1FBRTFDLGlFQUFpRTtRQUN4RCxvQkFBZSxHQUFHLENBQUMsQ0FBQztRQUU3Qix3RUFBd0U7UUFDOUQsZUFBVSxHQUFHLElBQUksWUFBWSxFQUFVLENBQUM7UUFFbEQsb0NBQW9DO1FBQ3BDLGlCQUFZLEdBQUcsS0FBSyxDQUFDO0tBWXRCO0lBVkMsZ0dBQWdHO0lBQ2hHLElBQUksWUFBWTtRQUNkLE9BQU8sSUFBSSxDQUFDLGVBQWUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3BILENBQUM7SUFFRCwwQ0FBMEM7SUFDMUMsWUFBWSxDQUFDLFFBQWdCO1FBQzNCLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO1FBQzFCLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2pDLENBQUM7K0dBdEJVLDJCQUEyQjttR0FBM0IsMkJBQTJCLDBMQTVENUI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXlEVCw4c0dBNURTLG1CQUFtQjs7NEZBK0RsQiwyQkFBMkI7a0JBbEV2QyxTQUFTOytCQUNFLHVCQUF1QixjQUNyQixJQUFJLFdBQ1AsQ0FBQyxtQkFBbUIsQ0FBQyxtQkFDYix1QkFBdUIsQ0FBQyxNQUFNLGlCQUNoQyxpQkFBaUIsQ0FBQyxJQUFJLFlBQzNCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F5RFQ7OEJBS1EsTUFBTTtzQkFBZCxLQUFLO2dCQUdHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBR0ksVUFBVTtzQkFBbkIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgVmlld0VuY2Fwc3VsYXRpb24gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTHVjaWRlQW5ndWxhck1vZHVsZSB9IGZyb20gJ2x1Y2lkZS1hbmd1bGFyJztcclxuaW1wb3J0IHsgVWlGb3JtRXJyb3JEZXRhaWwgfSBmcm9tICcuLi8uLi90eXBlcy92YWxpZGF0aW9uLnR5cGVzJztcclxuXHJcbi8qKlxyXG4gKiBDb21wb25lbnRlIHBlciBpbCByaWVwaWxvZ28gZXJyb3JpIGRlbCBmb3JtLlxyXG4gKlxyXG4gKiBNb3N0cmEgdW4gaW5kaWNhdG9yZSBjb24gaWwgY29udGVnZ2lvIGRlZ2xpIGVycm9yaSBlIHVuIGRyb3Bkb3duXHJcbiAqIGNvbiBpbCBkZXR0YWdsaW8gcGVyIGNhbXBvLiBDbGljayBzdSB1biBlcnJvcmUgZW1ldHRlIGBmaWVsZENsaWNrYFxyXG4gKiBwZXIgY29uc2VudGlyZSBsbyBzY3JvbGwtdG8tZmllbGQgY29uIGhpZ2hsaWdodCBuZWwgZm9ybSBidWlsZGVyLlxyXG4gKlxyXG4gKiBAc2VsZWN0b3IgdWktZm9ybS1lcnJvci1zdW1tYXJ5XHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ3VpLWZvcm0tZXJyb3Itc3VtbWFyeScsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBpbXBvcnRzOiBbTHVjaWRlQW5ndWxhck1vZHVsZV0sXHJcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXHJcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcclxuICB0ZW1wbGF0ZTogYFxyXG4gICAgQGlmIChlcnJvcnMubGVuZ3RoID4gMCkge1xyXG4gICAgICA8ZGl2XHJcbiAgICAgICAgY2xhc3M9XCJ1aS1mb3JtLWVycm9yLXN1bW1hcnlcIlxyXG4gICAgICAgIChtb3VzZWVudGVyKT1cInNob3dEcm9wZG93biA9IHRydWVcIlxyXG4gICAgICAgIChtb3VzZWxlYXZlKT1cInNob3dEcm9wZG93biA9IGZhbHNlXCJcclxuICAgICAgPlxyXG4gICAgICAgIDwhLS0gSW5kaWNhdG9yZSBlcnJvcmkgY29uIGljb25hIGUgbWVzc2FnZ2lvIC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ1aS1mb3JtLWVycm9yLXN1bW1hcnlfX2hlYWRpbmdcIlxyXG4gICAgICAgICAgKGNsaWNrKT1cInNob3dEcm9wZG93biA9ICFzaG93RHJvcGRvd25cIlxyXG4gICAgICAgICAgcm9sZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICB0YWJpbmRleD1cIjBcIlxyXG4gICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJkaXNwbGF5Q291bnQgKyAnIGVycm9yaSBuZWwgZm9ybSdcIlxyXG4gICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwic2hvd0Ryb3Bkb3duID0gIXNob3dEcm9wZG93blwiXHJcbiAgICAgICAgICAoa2V5ZG93bi5zcGFjZSk9XCJzaG93RHJvcGRvd24gPSAhc2hvd0Ryb3Bkb3duOyAkZXZlbnQucHJldmVudERlZmF1bHQoKVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPGx1Y2lkZS1pY29uIG5hbWU9XCJhbGVydC1jaXJjbGVcIiBbc2l6ZV09XCIyMFwiIGNsYXNzPVwidWktZm9ybS1lcnJvci1zdW1tYXJ5X19pY29uXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCIgLz5cclxuICAgICAgICAgIDxwIGNsYXNzPVwidWktZm9ybS1lcnJvci1zdW1tYXJ5X190ZXh0XCI+XHJcbiAgICAgICAgICAgIFNvbm8gcHJlc2VudGkgPHN0cm9uZz57eyBkaXNwbGF5Q291bnQgfX08L3N0cm9uZz5cclxuICAgICAgICAgICAge3sgZGlzcGxheUNvdW50ID09PSAxID8gJ2Vycm9yZScgOiAnZXJyb3JpJyB9fSBuZWwgZm9ybS5cclxuICAgICAgICAgIDwvcD5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPCEtLSBEcm9wZG93biBkZXR0YWdsaW8gLS0+XHJcbiAgICAgICAgPGRpdlxyXG4gICAgICAgICAgY2xhc3M9XCJ1aS1mb3JtLWVycm9yLXN1bW1hcnlfX2Ryb3Bkb3duXCJcclxuICAgICAgICAgIFtjbGFzcy51aS1mb3JtLWVycm9yLXN1bW1hcnlfX2Ryb3Bkb3duLS12aXNpYmxlXT1cInNob3dEcm9wZG93blwiXHJcbiAgICAgICAgICByb2xlPVwibGlzdFwiXHJcbiAgICAgICAgICBhcmlhLWxhYmVsPVwiRWxlbmNvIGVycm9yaSBkZWwgZm9ybVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInVpLWZvcm0tZXJyb3Itc3VtbWFyeV9fZHJvcGRvd24tY29udGVudFwiPlxyXG4gICAgICAgICAgICA8aDQgY2xhc3M9XCJ1aS1mb3JtLWVycm9yLXN1bW1hcnlfX2Ryb3Bkb3duLXRpdGxlXCI+RGV0dGFnbGkgZXJyb3JpOjwvaDQ+XHJcbiAgICAgICAgICAgIDx1bCBjbGFzcz1cInVpLWZvcm0tZXJyb3Itc3VtbWFyeV9fbGlzdFwiPlxyXG4gICAgICAgICAgICAgIEBmb3IgKGRldGFpbCBvZiBlcnJvcnM7IHRyYWNrIGRldGFpbC5maWVsZEtleSkge1xyXG4gICAgICAgICAgICAgICAgPGxpXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwidWktZm9ybS1lcnJvci1zdW1tYXJ5X19pdGVtXCJcclxuICAgICAgICAgICAgICAgICAgcm9sZT1cImxpc3RpdGVtXCJcclxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uRmllbGRDbGljayhkZXRhaWwuZmllbGRLZXkpXCJcclxuICAgICAgICAgICAgICAgICAgdGFiaW5kZXg9XCIwXCJcclxuICAgICAgICAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwib25GaWVsZENsaWNrKGRldGFpbC5maWVsZEtleSlcIlxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidWktZm9ybS1lcnJvci1zdW1tYXJ5X19maWVsZC1uYW1lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGx1Y2lkZS1pY29uIG5hbWU9XCJhcnJvdy1yaWdodFwiIFtzaXplXT1cIjE0XCIgY2xhc3M9XCJ1aS1mb3JtLWVycm9yLXN1bW1hcnlfX2Fycm93XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICB7eyBkZXRhaWwuZmllbGRMYWJlbCB9fVxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInVpLWZvcm0tZXJyb3Itc3VtbWFyeV9fbWVzc2FnZXNcIj5cclxuICAgICAgICAgICAgICAgICAgICBAZm9yIChlcnIgb2YgZGV0YWlsLmVycm9yczsgdHJhY2sgJGluZGV4OyBsZXQgbGFzdCA9ICRsYXN0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyBlcnIgfX1AaWYgKCFsYXN0KSB7LCB9PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgPC91bD5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIH1cclxuICBgLFxyXG4gIHN0eWxlVXJsOiAnLi9mb3JtLWVycm9yLXN1bW1hcnkuY29tcG9uZW50LnNjc3MnLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgVWlGb3JtRXJyb3JTdW1tYXJ5Q29tcG9uZW50IHtcclxuICAvKiogTGlzdGEgZGkgZXJyb3JpIGRldHRhZ2xpYXRpIHBlciBjYW1wby4gKi9cclxuICBASW5wdXQoKSBlcnJvcnM6IFVpRm9ybUVycm9yRGV0YWlsW10gPSBbXTtcclxuXHJcbiAgLyoqIENvbnRlZ2dpbyB0b3RhbGUgZGVnbGkgZXJyb3JpIChzb21tYSBkaSB0dXR0aSBpIG1lc3NhZ2dpKS4gKi9cclxuICBASW5wdXQoKSB0b3RhbEVycm9yQ291bnQgPSAwO1xyXG5cclxuICAvKiogRW1lc3NvIHF1YW5kbyBsJ3V0ZW50ZSBjbGljY2Egc3UgdW4gZXJyb3JlIHBlciBuYXZpZ2FyZSBhbCBjYW1wby4gKi9cclxuICBAT3V0cHV0KCkgZmllbGRDbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xyXG5cclxuICAvKiogQGludGVybmFsIFN0YXRvIGRlbCBkcm9wZG93bi4gKi9cclxuICBzaG93RHJvcGRvd24gPSBmYWxzZTtcclxuXHJcbiAgLyoqIENvbnRlZ2dpbyBkYSB2aXN1YWxpenphcmU6IHVzYSB0b3RhbEVycm9yQ291bnQgc2UgZm9ybml0bywgYWx0cmltZW50aSBjb250YSBkYWkgZGV0dGFnbGkuICovXHJcbiAgZ2V0IGRpc3BsYXlDb3VudCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMudG90YWxFcnJvckNvdW50ID4gMCA/IHRoaXMudG90YWxFcnJvckNvdW50IDogdGhpcy5lcnJvcnMucmVkdWNlKChzdW0sIGQpID0+IHN1bSArIGQuZXJyb3JzLmxlbmd0aCwgMCk7XHJcbiAgfVxyXG5cclxuICAvKiogQGludGVybmFsIEdlc3Rpb25lIGNsaWNrIHN1IGVycm9yZS4gKi9cclxuICBvbkZpZWxkQ2xpY2soZmllbGRLZXk6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5zaG93RHJvcGRvd24gPSBmYWxzZTtcclxuICAgIHRoaXMuZmllbGRDbGljay5lbWl0KGZpZWxkS2V5KTtcclxuICB9XHJcbn1cclxuIl19
|