@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,323 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module ng-ui-system/form-builder-editor
|
|
3
|
+
* Componente editor delle opzioni per campi di tipo select, radio e multiselect.
|
|
4
|
+
*
|
|
5
|
+
* Permette di aggiungere, modificare, riordinare e rimuovere le opzioni
|
|
6
|
+
* di un campo di scelta, con supporto per valore, etichetta e stato disabilitato.
|
|
7
|
+
*/
|
|
8
|
+
import { Component, ChangeDetectionStrategy, Input, Output, EventEmitter } from '@angular/core';
|
|
9
|
+
import { FormsModule } from '@angular/forms';
|
|
10
|
+
import { MatCardModule } from '@angular/material/card';
|
|
11
|
+
import { MatFormFieldModule } from '@angular/material/form-field';
|
|
12
|
+
import { MatInputModule } from '@angular/material/input';
|
|
13
|
+
import { MatCheckboxModule } from '@angular/material/checkbox';
|
|
14
|
+
import { MatTooltipModule } from '@angular/material/tooltip';
|
|
15
|
+
import { LucideAngularModule } from 'lucide-angular';
|
|
16
|
+
import { UiButtonComponent } from '../../../button/index';
|
|
17
|
+
import * as i0 from "@angular/core";
|
|
18
|
+
import * as i1 from "@angular/forms";
|
|
19
|
+
import * as i2 from "@angular/material/card";
|
|
20
|
+
import * as i3 from "@angular/material/form-field";
|
|
21
|
+
import * as i4 from "@angular/material/input";
|
|
22
|
+
import * as i5 from "@angular/material/checkbox";
|
|
23
|
+
import * as i6 from "@angular/material/tooltip";
|
|
24
|
+
import * as i7 from "lucide-angular";
|
|
25
|
+
/**
|
|
26
|
+
* Editor per le opzioni di un campo di scelta (select, radio, multiselect).
|
|
27
|
+
*
|
|
28
|
+
* Mostra una lista di opzioni con:
|
|
29
|
+
* - Header con titolo e pulsante per aggiungere nuove opzioni
|
|
30
|
+
* - Per ogni opzione: input valore, input etichetta, checkbox disabilitato,
|
|
31
|
+
* frecce per spostamento su/giu, pulsante elimina
|
|
32
|
+
* - Stato vuoto quando non ci sono opzioni configurate
|
|
33
|
+
*/
|
|
34
|
+
export class UiOptionsEditorComponent {
|
|
35
|
+
constructor() {
|
|
36
|
+
/**
|
|
37
|
+
* Opzioni del campo da modificare.
|
|
38
|
+
* Accetta sia un array di UiFieldOption che un valore generico
|
|
39
|
+
* (per gestire campi non ancora configurati).
|
|
40
|
+
*/
|
|
41
|
+
this.options = [];
|
|
42
|
+
/** Emette l'array aggiornato delle opzioni ad ogni modifica. */
|
|
43
|
+
this.optionsChange = new EventEmitter();
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Normalizza l'input per garantire che sia sempre un array valido.
|
|
47
|
+
* Gestisce il caso in cui le opzioni siano null, undefined o di tipo inatteso.
|
|
48
|
+
*/
|
|
49
|
+
get normalizedOptions() {
|
|
50
|
+
if (Array.isArray(this.options)) {
|
|
51
|
+
return this.options;
|
|
52
|
+
}
|
|
53
|
+
return [];
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Aggiunge una nuova opzione vuota alla lista e notifica il parent.
|
|
57
|
+
*/
|
|
58
|
+
addOption() {
|
|
59
|
+
const newOption = {
|
|
60
|
+
value: '',
|
|
61
|
+
label: '',
|
|
62
|
+
disabled: false,
|
|
63
|
+
};
|
|
64
|
+
const updated = [...this.normalizedOptions, newOption];
|
|
65
|
+
this.emitChange(updated);
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Aggiorna una proprieta specifica di un'opzione.
|
|
69
|
+
* @param index - Indice dell'opzione da aggiornare.
|
|
70
|
+
* @param field - Nome della proprieta da modificare.
|
|
71
|
+
* @param value - Nuovo valore della proprieta.
|
|
72
|
+
*/
|
|
73
|
+
updateOption(index, field, value) {
|
|
74
|
+
const updated = this.normalizedOptions.map((opt, i) => (i === index ? { ...opt, [field]: value } : opt));
|
|
75
|
+
this.emitChange(updated);
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Rimuove un'opzione dalla lista.
|
|
79
|
+
* @param index - Indice dell'opzione da rimuovere.
|
|
80
|
+
*/
|
|
81
|
+
removeOption(index) {
|
|
82
|
+
const updated = this.normalizedOptions.filter((_, i) => i !== index);
|
|
83
|
+
this.emitChange(updated);
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Sposta un'opzione in alto o in basso nella lista.
|
|
87
|
+
* @param index - Indice corrente dell'opzione.
|
|
88
|
+
* @param direction - Direzione dello spostamento: -1 (su) o +1 (giu).
|
|
89
|
+
*/
|
|
90
|
+
moveOption(index, direction) {
|
|
91
|
+
const newIndex = index + direction;
|
|
92
|
+
if (newIndex < 0 || newIndex >= this.normalizedOptions.length) {
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
const updated = [...this.normalizedOptions];
|
|
96
|
+
const [moved] = updated.splice(index, 1);
|
|
97
|
+
updated.splice(newIndex, 0, moved);
|
|
98
|
+
this.emitChange(updated);
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Emette l'array aggiornato delle opzioni.
|
|
102
|
+
* @param options - Nuovo array di opzioni.
|
|
103
|
+
*/
|
|
104
|
+
emitChange(options) {
|
|
105
|
+
this.optionsChange.emit(options);
|
|
106
|
+
}
|
|
107
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: UiOptionsEditorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
108
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: UiOptionsEditorComponent, isStandalone: true, selector: "ui-options-editor", inputs: { options: "options" }, outputs: { optionsChange: "optionsChange" }, ngImport: i0, template: `
|
|
109
|
+
<mat-card class="options-card">
|
|
110
|
+
<!-- Header -->
|
|
111
|
+
<div class="options-header">
|
|
112
|
+
<span class="options-header__title">
|
|
113
|
+
<lucide-icon name="list" [size]="16" />
|
|
114
|
+
Opzioni del Campo
|
|
115
|
+
</span>
|
|
116
|
+
<ui-button
|
|
117
|
+
icon="plus"
|
|
118
|
+
variant="ghost"
|
|
119
|
+
size="sm"
|
|
120
|
+
ariaLabel="Aggiungi opzione"
|
|
121
|
+
tooltip="Aggiungi opzione"
|
|
122
|
+
(click)="addOption()"
|
|
123
|
+
/>
|
|
124
|
+
</div>
|
|
125
|
+
|
|
126
|
+
<!-- Lista opzioni -->
|
|
127
|
+
<div class="options-list">
|
|
128
|
+
@for (option of normalizedOptions; track $index) {
|
|
129
|
+
<div class="option-row">
|
|
130
|
+
<!-- Indice opzione -->
|
|
131
|
+
<span class="option-row__index">{{ $index + 1 }}</span>
|
|
132
|
+
|
|
133
|
+
<!-- Input valore -->
|
|
134
|
+
<mat-form-field class="option-row__field" appearance="outline">
|
|
135
|
+
<mat-label>Valore</mat-label>
|
|
136
|
+
<input
|
|
137
|
+
matInput
|
|
138
|
+
[ngModel]="option.value"
|
|
139
|
+
(ngModelChange)="updateOption($index, 'value', $event)"
|
|
140
|
+
placeholder="Valore"
|
|
141
|
+
/>
|
|
142
|
+
</mat-form-field>
|
|
143
|
+
|
|
144
|
+
<!-- Input etichetta -->
|
|
145
|
+
<mat-form-field class="option-row__field" appearance="outline">
|
|
146
|
+
<mat-label>Etichetta</mat-label>
|
|
147
|
+
<input
|
|
148
|
+
matInput
|
|
149
|
+
[ngModel]="option.label"
|
|
150
|
+
(ngModelChange)="updateOption($index, 'label', $event)"
|
|
151
|
+
placeholder="Etichetta"
|
|
152
|
+
/>
|
|
153
|
+
</mat-form-field>
|
|
154
|
+
|
|
155
|
+
<!-- Checkbox disabilitato -->
|
|
156
|
+
<mat-checkbox
|
|
157
|
+
[checked]="!!option.disabled"
|
|
158
|
+
(change)="updateOption($index, 'disabled', $event.checked)"
|
|
159
|
+
matTooltip="Opzione disabilitata"
|
|
160
|
+
class="option-row__checkbox"
|
|
161
|
+
>
|
|
162
|
+
<span class="option-row__checkbox-label">Disab.</span>
|
|
163
|
+
</mat-checkbox>
|
|
164
|
+
|
|
165
|
+
<!-- Azioni di riordino e rimozione -->
|
|
166
|
+
<div class="option-row__actions">
|
|
167
|
+
<ui-button
|
|
168
|
+
icon="arrow-up"
|
|
169
|
+
variant="ghost"
|
|
170
|
+
size="xs"
|
|
171
|
+
ariaLabel="Sposta su"
|
|
172
|
+
tooltip="Sposta su"
|
|
173
|
+
[disabled]="$index === 0"
|
|
174
|
+
(click)="moveOption($index, -1)"
|
|
175
|
+
/>
|
|
176
|
+
|
|
177
|
+
<ui-button
|
|
178
|
+
icon="arrow-down"
|
|
179
|
+
variant="ghost"
|
|
180
|
+
size="xs"
|
|
181
|
+
ariaLabel="Sposta giu"
|
|
182
|
+
tooltip="Sposta giu"
|
|
183
|
+
[disabled]="$index === normalizedOptions.length - 1"
|
|
184
|
+
(click)="moveOption($index, 1)"
|
|
185
|
+
/>
|
|
186
|
+
|
|
187
|
+
<ui-button
|
|
188
|
+
icon="trash-2"
|
|
189
|
+
variant="warn"
|
|
190
|
+
size="xs"
|
|
191
|
+
ariaLabel="Elimina opzione"
|
|
192
|
+
tooltip="Elimina opzione"
|
|
193
|
+
(click)="removeOption($index)"
|
|
194
|
+
/>
|
|
195
|
+
</div>
|
|
196
|
+
</div>
|
|
197
|
+
} @empty {
|
|
198
|
+
<!-- Stato vuoto -->
|
|
199
|
+
<div class="options-empty">
|
|
200
|
+
<lucide-icon name="inbox" [size]="24" />
|
|
201
|
+
<span>Nessuna opzione configurata</span>
|
|
202
|
+
</div>
|
|
203
|
+
}
|
|
204
|
+
</div>
|
|
205
|
+
</mat-card>
|
|
206
|
+
`, isInline: true, styles: [":host{display:block}.options-card{border:1px solid var(--ui-color-border);border-radius:var(--ui-radius-md);overflow:hidden}.options-header{display:flex;align-items:center;justify-content:space-between;padding:var(--ui-spacing-3) var(--ui-spacing-4);background:var(--ui-color-bg-subtle);border-bottom:1px solid var(--ui-color-border)}.options-header__title{display:flex;align-items:center;gap:var(--ui-spacing-2);font-size:var(--ui-font-size-sm);font-weight:600;color:var(--ui-color-text)}.options-list{padding:var(--ui-spacing-3);display:flex;flex-direction:column;gap:var(--ui-spacing-2)}.option-row{display:flex;align-items:center;gap:var(--ui-spacing-2);padding:var(--ui-spacing-2);background:var(--ui-color-surface);border:1px solid var(--ui-color-border);border-radius:var(--ui-radius-sm);transition:border-color var(--ui-transition-fast),box-shadow var(--ui-transition-fast)}.option-row:hover{border-color:var(--ui-color-primary);box-shadow:var(--ui-shadow-sm)}.option-row__index{display:flex;align-items:center;justify-content:center;width:24px;height:24px;border-radius:50%;background:var(--ui-color-bg-subtle);color:var(--ui-color-text-muted);font-size:var(--ui-font-size-xs);font-weight:600;flex-shrink:0}.option-row__field{flex:1;min-width:0}.option-row__field ::ng-deep .mat-mdc-form-field-infix{padding-top:var(--ui-spacing-1)!important;padding-bottom:var(--ui-spacing-1)!important;min-height:unset}.option-row__field ::ng-deep .mat-mdc-form-field-subscript-wrapper{display:none}.option-row__checkbox{flex-shrink:0}.option-row__checkbox-label{font-size:var(--ui-font-size-xs);color:var(--ui-color-text-secondary)}.option-row__actions{display:flex;align-items:center;gap:var(--ui-spacing-1);flex-shrink:0}.options-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--ui-spacing-2);padding:var(--ui-spacing-6) var(--ui-spacing-4);color:var(--ui-color-text-muted);font-size:var(--ui-font-size-sm)}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: MatCardModule }, { kind: "component", type: i2.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i3.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i3.MatLabel, selector: "mat-label" }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i4.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i5.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i6.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: LucideAngularModule }, { kind: "component", type: i7.LucideAngularComponent, selector: "lucide-angular, lucide-icon, i-lucide, span-lucide", inputs: ["class", "name", "img", "color", "absoluteStrokeWidth", "size", "strokeWidth"] }, { kind: "component", type: UiButtonComponent, selector: "ui-button", inputs: ["label", "tooltip", "variant", "size", "icon", "iconPosition", "loading", "disabled", "fullWidth", "type", "ariaLabel", "customClass"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
207
|
+
}
|
|
208
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: UiOptionsEditorComponent, decorators: [{
|
|
209
|
+
type: Component,
|
|
210
|
+
args: [{ selector: 'ui-options-editor', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [
|
|
211
|
+
FormsModule,
|
|
212
|
+
MatCardModule,
|
|
213
|
+
MatFormFieldModule,
|
|
214
|
+
MatInputModule,
|
|
215
|
+
MatCheckboxModule,
|
|
216
|
+
MatTooltipModule,
|
|
217
|
+
LucideAngularModule,
|
|
218
|
+
UiButtonComponent,
|
|
219
|
+
], template: `
|
|
220
|
+
<mat-card class="options-card">
|
|
221
|
+
<!-- Header -->
|
|
222
|
+
<div class="options-header">
|
|
223
|
+
<span class="options-header__title">
|
|
224
|
+
<lucide-icon name="list" [size]="16" />
|
|
225
|
+
Opzioni del Campo
|
|
226
|
+
</span>
|
|
227
|
+
<ui-button
|
|
228
|
+
icon="plus"
|
|
229
|
+
variant="ghost"
|
|
230
|
+
size="sm"
|
|
231
|
+
ariaLabel="Aggiungi opzione"
|
|
232
|
+
tooltip="Aggiungi opzione"
|
|
233
|
+
(click)="addOption()"
|
|
234
|
+
/>
|
|
235
|
+
</div>
|
|
236
|
+
|
|
237
|
+
<!-- Lista opzioni -->
|
|
238
|
+
<div class="options-list">
|
|
239
|
+
@for (option of normalizedOptions; track $index) {
|
|
240
|
+
<div class="option-row">
|
|
241
|
+
<!-- Indice opzione -->
|
|
242
|
+
<span class="option-row__index">{{ $index + 1 }}</span>
|
|
243
|
+
|
|
244
|
+
<!-- Input valore -->
|
|
245
|
+
<mat-form-field class="option-row__field" appearance="outline">
|
|
246
|
+
<mat-label>Valore</mat-label>
|
|
247
|
+
<input
|
|
248
|
+
matInput
|
|
249
|
+
[ngModel]="option.value"
|
|
250
|
+
(ngModelChange)="updateOption($index, 'value', $event)"
|
|
251
|
+
placeholder="Valore"
|
|
252
|
+
/>
|
|
253
|
+
</mat-form-field>
|
|
254
|
+
|
|
255
|
+
<!-- Input etichetta -->
|
|
256
|
+
<mat-form-field class="option-row__field" appearance="outline">
|
|
257
|
+
<mat-label>Etichetta</mat-label>
|
|
258
|
+
<input
|
|
259
|
+
matInput
|
|
260
|
+
[ngModel]="option.label"
|
|
261
|
+
(ngModelChange)="updateOption($index, 'label', $event)"
|
|
262
|
+
placeholder="Etichetta"
|
|
263
|
+
/>
|
|
264
|
+
</mat-form-field>
|
|
265
|
+
|
|
266
|
+
<!-- Checkbox disabilitato -->
|
|
267
|
+
<mat-checkbox
|
|
268
|
+
[checked]="!!option.disabled"
|
|
269
|
+
(change)="updateOption($index, 'disabled', $event.checked)"
|
|
270
|
+
matTooltip="Opzione disabilitata"
|
|
271
|
+
class="option-row__checkbox"
|
|
272
|
+
>
|
|
273
|
+
<span class="option-row__checkbox-label">Disab.</span>
|
|
274
|
+
</mat-checkbox>
|
|
275
|
+
|
|
276
|
+
<!-- Azioni di riordino e rimozione -->
|
|
277
|
+
<div class="option-row__actions">
|
|
278
|
+
<ui-button
|
|
279
|
+
icon="arrow-up"
|
|
280
|
+
variant="ghost"
|
|
281
|
+
size="xs"
|
|
282
|
+
ariaLabel="Sposta su"
|
|
283
|
+
tooltip="Sposta su"
|
|
284
|
+
[disabled]="$index === 0"
|
|
285
|
+
(click)="moveOption($index, -1)"
|
|
286
|
+
/>
|
|
287
|
+
|
|
288
|
+
<ui-button
|
|
289
|
+
icon="arrow-down"
|
|
290
|
+
variant="ghost"
|
|
291
|
+
size="xs"
|
|
292
|
+
ariaLabel="Sposta giu"
|
|
293
|
+
tooltip="Sposta giu"
|
|
294
|
+
[disabled]="$index === normalizedOptions.length - 1"
|
|
295
|
+
(click)="moveOption($index, 1)"
|
|
296
|
+
/>
|
|
297
|
+
|
|
298
|
+
<ui-button
|
|
299
|
+
icon="trash-2"
|
|
300
|
+
variant="warn"
|
|
301
|
+
size="xs"
|
|
302
|
+
ariaLabel="Elimina opzione"
|
|
303
|
+
tooltip="Elimina opzione"
|
|
304
|
+
(click)="removeOption($index)"
|
|
305
|
+
/>
|
|
306
|
+
</div>
|
|
307
|
+
</div>
|
|
308
|
+
} @empty {
|
|
309
|
+
<!-- Stato vuoto -->
|
|
310
|
+
<div class="options-empty">
|
|
311
|
+
<lucide-icon name="inbox" [size]="24" />
|
|
312
|
+
<span>Nessuna opzione configurata</span>
|
|
313
|
+
</div>
|
|
314
|
+
}
|
|
315
|
+
</div>
|
|
316
|
+
</mat-card>
|
|
317
|
+
`, styles: [":host{display:block}.options-card{border:1px solid var(--ui-color-border);border-radius:var(--ui-radius-md);overflow:hidden}.options-header{display:flex;align-items:center;justify-content:space-between;padding:var(--ui-spacing-3) var(--ui-spacing-4);background:var(--ui-color-bg-subtle);border-bottom:1px solid var(--ui-color-border)}.options-header__title{display:flex;align-items:center;gap:var(--ui-spacing-2);font-size:var(--ui-font-size-sm);font-weight:600;color:var(--ui-color-text)}.options-list{padding:var(--ui-spacing-3);display:flex;flex-direction:column;gap:var(--ui-spacing-2)}.option-row{display:flex;align-items:center;gap:var(--ui-spacing-2);padding:var(--ui-spacing-2);background:var(--ui-color-surface);border:1px solid var(--ui-color-border);border-radius:var(--ui-radius-sm);transition:border-color var(--ui-transition-fast),box-shadow var(--ui-transition-fast)}.option-row:hover{border-color:var(--ui-color-primary);box-shadow:var(--ui-shadow-sm)}.option-row__index{display:flex;align-items:center;justify-content:center;width:24px;height:24px;border-radius:50%;background:var(--ui-color-bg-subtle);color:var(--ui-color-text-muted);font-size:var(--ui-font-size-xs);font-weight:600;flex-shrink:0}.option-row__field{flex:1;min-width:0}.option-row__field ::ng-deep .mat-mdc-form-field-infix{padding-top:var(--ui-spacing-1)!important;padding-bottom:var(--ui-spacing-1)!important;min-height:unset}.option-row__field ::ng-deep .mat-mdc-form-field-subscript-wrapper{display:none}.option-row__checkbox{flex-shrink:0}.option-row__checkbox-label{font-size:var(--ui-font-size-xs);color:var(--ui-color-text-secondary)}.option-row__actions{display:flex;align-items:center;gap:var(--ui-spacing-1);flex-shrink:0}.options-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--ui-spacing-2);padding:var(--ui-spacing-6) var(--ui-spacing-4);color:var(--ui-color-text-muted);font-size:var(--ui-font-size-sm)}\n"] }]
|
|
318
|
+
}], propDecorators: { options: [{
|
|
319
|
+
type: Input
|
|
320
|
+
}], optionsChange: [{
|
|
321
|
+
type: Output
|
|
322
|
+
}] } });
|
|
323
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3B0aW9ucy1lZGl0b3IuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvbmctdWktc3lzdGVtL3NyYy9saWIvY29tcG9uZW50cy9mb3JtLWJ1aWxkZXItZWRpdG9yL3N1Yi1jb21wb25lbnRzL29wdGlvbnMtZWRpdG9yL29wdGlvbnMtZWRpdG9yLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFFSCxPQUFPLEVBQUUsU0FBUyxFQUFFLHVCQUF1QixFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2hHLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDbEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQy9ELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzdELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXJELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDOzs7Ozs7Ozs7QUFHMUQ7Ozs7Ozs7O0dBUUc7QUE4T0gsTUFBTSxPQUFPLHdCQUF3QjtJQTdPckM7UUE4T0U7Ozs7V0FJRztRQUNNLFlBQU8sR0FBMEIsRUFBRSxDQUFDO1FBRTdDLGdFQUFnRTtRQUN0RCxrQkFBYSxHQUFHLElBQUksWUFBWSxFQUFtQixDQUFDO0tBcUUvRDtJQW5FQzs7O09BR0c7SUFDSCxJQUFJLGlCQUFpQjtRQUNuQixJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDaEMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQ3RCLENBQUM7UUFDRCxPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFFRDs7T0FFRztJQUNILFNBQVM7UUFDUCxNQUFNLFNBQVMsR0FBa0I7WUFDL0IsS0FBSyxFQUFFLEVBQUU7WUFDVCxLQUFLLEVBQUUsRUFBRTtZQUNULFFBQVEsRUFBRSxLQUFLO1NBQ2hCLENBQUM7UUFDRixNQUFNLE9BQU8sR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ3ZELElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDM0IsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsWUFBWSxDQUFDLEtBQWEsRUFBRSxLQUEwQixFQUFFLEtBQVU7UUFDaEUsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3pHLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDM0IsQ0FBQztJQUVEOzs7T0FHRztJQUNILFlBQVksQ0FBQyxLQUFhO1FBQ3hCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssS0FBSyxDQUFDLENBQUM7UUFDckUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUMzQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILFVBQVUsQ0FBQyxLQUFhLEVBQUUsU0FBaUI7UUFDekMsTUFBTSxRQUFRLEdBQUcsS0FBSyxHQUFHLFNBQVMsQ0FBQztRQUNuQyxJQUFJLFFBQVEsR0FBRyxDQUFDLElBQUksUUFBUSxJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUM5RCxPQUFPO1FBQ1QsQ0FBQztRQUNELE1BQU0sT0FBTyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUM1QyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDekMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ25DLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDM0IsQ0FBQztJQUVEOzs7T0FHRztJQUNLLFVBQVUsQ0FBQyxPQUF3QjtRQUN6QyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNuQyxDQUFDOytHQTdFVSx3QkFBd0I7bUdBQXhCLHdCQUF3QiwwSkEvTnpCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtHVCx1K0RBM0dDLFdBQVcsOG1CQUNYLGFBQWEsNElBQ2Isa0JBQWtCLDBTQUNsQixjQUFjLDBXQUNkLGlCQUFpQixvWUFDakIsZ0JBQWdCLDRUQUNoQixtQkFBbUIsZ1BBQ25CLGlCQUFpQjs7NEZBaU9SLHdCQUF3QjtrQkE3T3BDLFNBQVM7K0JBQ0UsbUJBQW1CLGNBQ2pCLElBQUksbUJBQ0MsdUJBQXVCLENBQUMsTUFBTSxXQUN0Qzt3QkFDUCxXQUFXO3dCQUNYLGFBQWE7d0JBQ2Isa0JBQWtCO3dCQUNsQixjQUFjO3dCQUNkLGlCQUFpQjt3QkFDakIsZ0JBQWdCO3dCQUNoQixtQkFBbUI7d0JBQ25CLGlCQUFpQjtxQkFDbEIsWUFDUzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrR1Q7OEJBbUlRLE9BQU87c0JBQWYsS0FBSztnQkFHSSxhQUFhO3NCQUF0QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXHJcbiAqIEBtb2R1bGUgbmctdWktc3lzdGVtL2Zvcm0tYnVpbGRlci1lZGl0b3JcclxuICogQ29tcG9uZW50ZSBlZGl0b3IgZGVsbGUgb3B6aW9uaSBwZXIgY2FtcGkgZGkgdGlwbyBzZWxlY3QsIHJhZGlvIGUgbXVsdGlzZWxlY3QuXHJcbiAqXHJcbiAqIFBlcm1ldHRlIGRpIGFnZ2l1bmdlcmUsIG1vZGlmaWNhcmUsIHJpb3JkaW5hcmUgZSByaW11b3ZlcmUgbGUgb3B6aW9uaVxyXG4gKiBkaSB1biBjYW1wbyBkaSBzY2VsdGEsIGNvbiBzdXBwb3J0byBwZXIgdmFsb3JlLCBldGljaGV0dGEgZSBzdGF0byBkaXNhYmlsaXRhdG8uXHJcbiAqL1xyXG5cclxuaW1wb3J0IHsgQ29tcG9uZW50LCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBNYXRDYXJkTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY2FyZCc7XHJcbmltcG9ydCB7IE1hdEZvcm1GaWVsZE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2Zvcm0tZmllbGQnO1xyXG5pbXBvcnQgeyBNYXRJbnB1dE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2lucHV0JztcclxuaW1wb3J0IHsgTWF0Q2hlY2tib3hNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jaGVja2JveCc7XHJcbmltcG9ydCB7IE1hdFRvb2x0aXBNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90b29sdGlwJztcclxuaW1wb3J0IHsgTHVjaWRlQW5ndWxhck1vZHVsZSB9IGZyb20gJ2x1Y2lkZS1hbmd1bGFyJztcclxuXHJcbmltcG9ydCB7IFVpQnV0dG9uQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vYnV0dG9uL2luZGV4JztcclxuaW1wb3J0IHsgVWlGaWVsZE9wdGlvbiB9IGZyb20gJy4uLy4uLy4uL2Zvcm0tYnVpbGRlci90eXBlcy9pbmRleCc7XHJcblxyXG4vKipcclxuICogRWRpdG9yIHBlciBsZSBvcHppb25pIGRpIHVuIGNhbXBvIGRpIHNjZWx0YSAoc2VsZWN0LCByYWRpbywgbXVsdGlzZWxlY3QpLlxyXG4gKlxyXG4gKiBNb3N0cmEgdW5hIGxpc3RhIGRpIG9wemlvbmkgY29uOlxyXG4gKiAtIEhlYWRlciBjb24gdGl0b2xvIGUgcHVsc2FudGUgcGVyIGFnZ2l1bmdlcmUgbnVvdmUgb3B6aW9uaVxyXG4gKiAtIFBlciBvZ25pIG9wemlvbmU6IGlucHV0IHZhbG9yZSwgaW5wdXQgZXRpY2hldHRhLCBjaGVja2JveCBkaXNhYmlsaXRhdG8sXHJcbiAqICAgZnJlY2NlIHBlciBzcG9zdGFtZW50byBzdS9naXUsIHB1bHNhbnRlIGVsaW1pbmFcclxuICogLSBTdGF0byB2dW90byBxdWFuZG8gbm9uIGNpIHNvbm8gb3B6aW9uaSBjb25maWd1cmF0ZVxyXG4gKi9cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICd1aS1vcHRpb25zLWVkaXRvcicsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcclxuICBpbXBvcnRzOiBbXHJcbiAgICBGb3Jtc01vZHVsZSxcclxuICAgIE1hdENhcmRNb2R1bGUsXHJcbiAgICBNYXRGb3JtRmllbGRNb2R1bGUsXHJcbiAgICBNYXRJbnB1dE1vZHVsZSxcclxuICAgIE1hdENoZWNrYm94TW9kdWxlLFxyXG4gICAgTWF0VG9vbHRpcE1vZHVsZSxcclxuICAgIEx1Y2lkZUFuZ3VsYXJNb2R1bGUsXHJcbiAgICBVaUJ1dHRvbkNvbXBvbmVudCxcclxuICBdLFxyXG4gIHRlbXBsYXRlOiBgXHJcbiAgICA8bWF0LWNhcmQgY2xhc3M9XCJvcHRpb25zLWNhcmRcIj5cclxuICAgICAgPCEtLSBIZWFkZXIgLS0+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJvcHRpb25zLWhlYWRlclwiPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwib3B0aW9ucy1oZWFkZXJfX3RpdGxlXCI+XHJcbiAgICAgICAgICA8bHVjaWRlLWljb24gbmFtZT1cImxpc3RcIiBbc2l6ZV09XCIxNlwiIC8+XHJcbiAgICAgICAgICBPcHppb25pIGRlbCBDYW1wb1xyXG4gICAgICAgIDwvc3Bhbj5cclxuICAgICAgICA8dWktYnV0dG9uXHJcbiAgICAgICAgICBpY29uPVwicGx1c1wiXHJcbiAgICAgICAgICB2YXJpYW50PVwiZ2hvc3RcIlxyXG4gICAgICAgICAgc2l6ZT1cInNtXCJcclxuICAgICAgICAgIGFyaWFMYWJlbD1cIkFnZ2l1bmdpIG9wemlvbmVcIlxyXG4gICAgICAgICAgdG9vbHRpcD1cIkFnZ2l1bmdpIG9wemlvbmVcIlxyXG4gICAgICAgICAgKGNsaWNrKT1cImFkZE9wdGlvbigpXCJcclxuICAgICAgICAvPlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDwhLS0gTGlzdGEgb3B6aW9uaSAtLT5cclxuICAgICAgPGRpdiBjbGFzcz1cIm9wdGlvbnMtbGlzdFwiPlxyXG4gICAgICAgIEBmb3IgKG9wdGlvbiBvZiBub3JtYWxpemVkT3B0aW9uczsgdHJhY2sgJGluZGV4KSB7XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwib3B0aW9uLXJvd1wiPlxyXG4gICAgICAgICAgICA8IS0tIEluZGljZSBvcHppb25lIC0tPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm9wdGlvbi1yb3dfX2luZGV4XCI+e3sgJGluZGV4ICsgMSB9fTwvc3Bhbj5cclxuXHJcbiAgICAgICAgICAgIDwhLS0gSW5wdXQgdmFsb3JlIC0tPlxyXG4gICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJvcHRpb24tcm93X19maWVsZFwiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XHJcbiAgICAgICAgICAgICAgPG1hdC1sYWJlbD5WYWxvcmU8L21hdC1sYWJlbD5cclxuICAgICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICAgIG1hdElucHV0XHJcbiAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJvcHRpb24udmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwidXBkYXRlT3B0aW9uKCRpbmRleCwgJ3ZhbHVlJywgJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlZhbG9yZVwiXHJcbiAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuXHJcbiAgICAgICAgICAgIDwhLS0gSW5wdXQgZXRpY2hldHRhIC0tPlxyXG4gICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJvcHRpb24tcm93X19maWVsZFwiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XHJcbiAgICAgICAgICAgICAgPG1hdC1sYWJlbD5FdGljaGV0dGE8L21hdC1sYWJlbD5cclxuICAgICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICAgIG1hdElucHV0XHJcbiAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJvcHRpb24ubGFiZWxcIlxyXG4gICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwidXBkYXRlT3B0aW9uKCRpbmRleCwgJ2xhYmVsJywgJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkV0aWNoZXR0YVwiXHJcbiAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuXHJcbiAgICAgICAgICAgIDwhLS0gQ2hlY2tib3ggZGlzYWJpbGl0YXRvIC0tPlxyXG4gICAgICAgICAgICA8bWF0LWNoZWNrYm94XHJcbiAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiISFvcHRpb24uZGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgIChjaGFuZ2UpPVwidXBkYXRlT3B0aW9uKCRpbmRleCwgJ2Rpc2FibGVkJywgJGV2ZW50LmNoZWNrZWQpXCJcclxuICAgICAgICAgICAgICBtYXRUb29sdGlwPVwiT3B6aW9uZSBkaXNhYmlsaXRhdGFcIlxyXG4gICAgICAgICAgICAgIGNsYXNzPVwib3B0aW9uLXJvd19fY2hlY2tib3hcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJvcHRpb24tcm93X19jaGVja2JveC1sYWJlbFwiPkRpc2FiLjwvc3Bhbj5cclxuICAgICAgICAgICAgPC9tYXQtY2hlY2tib3g+XHJcblxyXG4gICAgICAgICAgICA8IS0tIEF6aW9uaSBkaSByaW9yZGlubyBlIHJpbW96aW9uZSAtLT5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm9wdGlvbi1yb3dfX2FjdGlvbnNcIj5cclxuICAgICAgICAgICAgICA8dWktYnV0dG9uXHJcbiAgICAgICAgICAgICAgICBpY29uPVwiYXJyb3ctdXBcIlxyXG4gICAgICAgICAgICAgICAgdmFyaWFudD1cImdob3N0XCJcclxuICAgICAgICAgICAgICAgIHNpemU9XCJ4c1wiXHJcbiAgICAgICAgICAgICAgICBhcmlhTGFiZWw9XCJTcG9zdGEgc3VcIlxyXG4gICAgICAgICAgICAgICAgdG9vbHRpcD1cIlNwb3N0YSBzdVwiXHJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiJGluZGV4ID09PSAwXCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJtb3ZlT3B0aW9uKCRpbmRleCwgLTEpXCJcclxuICAgICAgICAgICAgICAvPlxyXG5cclxuICAgICAgICAgICAgICA8dWktYnV0dG9uXHJcbiAgICAgICAgICAgICAgICBpY29uPVwiYXJyb3ctZG93blwiXHJcbiAgICAgICAgICAgICAgICB2YXJpYW50PVwiZ2hvc3RcIlxyXG4gICAgICAgICAgICAgICAgc2l6ZT1cInhzXCJcclxuICAgICAgICAgICAgICAgIGFyaWFMYWJlbD1cIlNwb3N0YSBnaXVcIlxyXG4gICAgICAgICAgICAgICAgdG9vbHRpcD1cIlNwb3N0YSBnaXVcIlxyXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiRpbmRleCA9PT0gbm9ybWFsaXplZE9wdGlvbnMubGVuZ3RoIC0gMVwiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwibW92ZU9wdGlvbigkaW5kZXgsIDEpXCJcclxuICAgICAgICAgICAgICAvPlxyXG5cclxuICAgICAgICAgICAgICA8dWktYnV0dG9uXHJcbiAgICAgICAgICAgICAgICBpY29uPVwidHJhc2gtMlwiXHJcbiAgICAgICAgICAgICAgICB2YXJpYW50PVwid2FyblwiXHJcbiAgICAgICAgICAgICAgICBzaXplPVwieHNcIlxyXG4gICAgICAgICAgICAgICAgYXJpYUxhYmVsPVwiRWxpbWluYSBvcHppb25lXCJcclxuICAgICAgICAgICAgICAgIHRvb2x0aXA9XCJFbGltaW5hIG9wemlvbmVcIlxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlbW92ZU9wdGlvbigkaW5kZXgpXCJcclxuICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIH0gQGVtcHR5IHtcclxuICAgICAgICAgIDwhLS0gU3RhdG8gdnVvdG8gLS0+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwib3B0aW9ucy1lbXB0eVwiPlxyXG4gICAgICAgICAgICA8bHVjaWRlLWljb24gbmFtZT1cImluYm94XCIgW3NpemVdPVwiMjRcIiAvPlxyXG4gICAgICAgICAgICA8c3Bhbj5OZXNzdW5hIG9wemlvbmUgY29uZmlndXJhdGE8L3NwYW4+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICB9XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9tYXQtY2FyZD5cclxuICBgLFxyXG4gIHN0eWxlczogW1xyXG4gICAgYFxyXG4gICAgLyog4pSA4pSA4pSAIENhcmQgb3B6aW9uaSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi9cclxuXHJcbiAgICA6aG9zdCB7XHJcbiAgICAgIGRpc3BsYXk6IGJsb2NrO1xyXG4gICAgfVxyXG5cclxuICAgIC5vcHRpb25zLWNhcmQge1xyXG4gICAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS11aS1jb2xvci1ib3JkZXIpO1xyXG4gICAgICBib3JkZXItcmFkaXVzOiB2YXIoLS11aS1yYWRpdXMtbWQpO1xyXG4gICAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gICAgfVxyXG5cclxuICAgIC8qIOKUgOKUgOKUgCBIZWFkZXIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovXHJcblxyXG4gICAgLm9wdGlvbnMtaGVhZGVyIHtcclxuICAgICAgZGlzcGxheTogZmxleDtcclxuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xyXG4gICAgICBwYWRkaW5nOiB2YXIoLS11aS1zcGFjaW5nLTMpIHZhcigtLXVpLXNwYWNpbmctNCk7XHJcbiAgICAgIGJhY2tncm91bmQ6IHZhcigtLXVpLWNvbG9yLWJnLXN1YnRsZSk7XHJcbiAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS11aS1jb2xvci1ib3JkZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIC5vcHRpb25zLWhlYWRlcl9fdGl0bGUge1xyXG4gICAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gICAgICBnYXA6IHZhcigtLXVpLXNwYWNpbmctMik7XHJcbiAgICAgIGZvbnQtc2l6ZTogdmFyKC0tdWktZm9udC1zaXplLXNtKTtcclxuICAgICAgZm9udC13ZWlnaHQ6IDYwMDtcclxuICAgICAgY29sb3I6IHZhcigtLXVpLWNvbG9yLXRleHQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qIOKUgOKUgOKUgCBMaXN0YSBvcHppb25pIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqL1xyXG5cclxuICAgIC5vcHRpb25zLWxpc3Qge1xyXG4gICAgICBwYWRkaW5nOiB2YXIoLS11aS1zcGFjaW5nLTMpO1xyXG4gICAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xyXG4gICAgICBnYXA6IHZhcigtLXVpLXNwYWNpbmctMik7XHJcbiAgICB9XHJcblxyXG4gICAgLyog4pSA4pSA4pSAIFJpZ2Egb3B6aW9uZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi9cclxuXHJcbiAgICAub3B0aW9uLXJvdyB7XHJcbiAgICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgICAgIGdhcDogdmFyKC0tdWktc3BhY2luZy0yKTtcclxuICAgICAgcGFkZGluZzogdmFyKC0tdWktc3BhY2luZy0yKTtcclxuICAgICAgYmFja2dyb3VuZDogdmFyKC0tdWktY29sb3Itc3VyZmFjZSk7XHJcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLXVpLWNvbG9yLWJvcmRlcik7XHJcbiAgICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXVpLXJhZGl1cy1zbSk7XHJcbiAgICAgIHRyYW5zaXRpb246IGJvcmRlci1jb2xvciB2YXIoLS11aS10cmFuc2l0aW9uLWZhc3QpLFxyXG4gICAgICAgICAgICAgICAgICBib3gtc2hhZG93IHZhcigtLXVpLXRyYW5zaXRpb24tZmFzdCk7XHJcbiAgICB9XHJcblxyXG4gICAgLm9wdGlvbi1yb3c6aG92ZXIge1xyXG4gICAgICBib3JkZXItY29sb3I6IHZhcigtLXVpLWNvbG9yLXByaW1hcnkpO1xyXG4gICAgICBib3gtc2hhZG93OiB2YXIoLS11aS1zaGFkb3ctc20pO1xyXG4gICAgfVxyXG5cclxuICAgIC5vcHRpb24tcm93X19pbmRleCB7XHJcbiAgICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xyXG4gICAgICB3aWR0aDogMjRweDtcclxuICAgICAgaGVpZ2h0OiAyNHB4O1xyXG4gICAgICBib3JkZXItcmFkaXVzOiA1MCU7XHJcbiAgICAgIGJhY2tncm91bmQ6IHZhcigtLXVpLWNvbG9yLWJnLXN1YnRsZSk7XHJcbiAgICAgIGNvbG9yOiB2YXIoLS11aS1jb2xvci10ZXh0LW11dGVkKTtcclxuICAgICAgZm9udC1zaXplOiB2YXIoLS11aS1mb250LXNpemUteHMpO1xyXG4gICAgICBmb250LXdlaWdodDogNjAwO1xyXG4gICAgICBmbGV4LXNocmluazogMDtcclxuICAgIH1cclxuXHJcbiAgICAub3B0aW9uLXJvd19fZmllbGQge1xyXG4gICAgICBmbGV4OiAxO1xyXG4gICAgICBtaW4td2lkdGg6IDA7XHJcbiAgICB9XHJcblxyXG4gICAgLyogUmlkdWNlIGwnYWx0ZXp6YSBkZWkgZm9ybSBmaWVsZCBpbmxpbmUgKi9cclxuICAgIC5vcHRpb24tcm93X19maWVsZCA6Om5nLWRlZXAgLm1hdC1tZGMtZm9ybS1maWVsZC1pbmZpeCB7XHJcbiAgICAgIHBhZGRpbmctdG9wOiB2YXIoLS11aS1zcGFjaW5nLTEpICFpbXBvcnRhbnQ7XHJcbiAgICAgIHBhZGRpbmctYm90dG9tOiB2YXIoLS11aS1zcGFjaW5nLTEpICFpbXBvcnRhbnQ7XHJcbiAgICAgIG1pbi1oZWlnaHQ6IHVuc2V0O1xyXG4gICAgfVxyXG5cclxuICAgIC5vcHRpb24tcm93X19maWVsZCA6Om5nLWRlZXAgLm1hdC1tZGMtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlciB7XHJcbiAgICAgIGRpc3BsYXk6IG5vbmU7XHJcbiAgICB9XHJcblxyXG4gICAgLm9wdGlvbi1yb3dfX2NoZWNrYm94IHtcclxuICAgICAgZmxleC1zaHJpbms6IDA7XHJcbiAgICB9XHJcblxyXG4gICAgLm9wdGlvbi1yb3dfX2NoZWNrYm94LWxhYmVsIHtcclxuICAgICAgZm9udC1zaXplOiB2YXIoLS11aS1mb250LXNpemUteHMpO1xyXG4gICAgICBjb2xvcjogdmFyKC0tdWktY29sb3ItdGV4dC1zZWNvbmRhcnkpO1xyXG4gICAgfVxyXG5cclxuICAgIC5vcHRpb24tcm93X19hY3Rpb25zIHtcclxuICAgICAgZGlzcGxheTogZmxleDtcclxuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICAgICAgZ2FwOiB2YXIoLS11aS1zcGFjaW5nLTEpO1xyXG4gICAgICBmbGV4LXNocmluazogMDtcclxuICAgIH1cclxuXHJcbiAgICAvKiDilIDilIDilIAgU3RhdG8gdnVvdG8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovXHJcblxyXG4gICAgLm9wdGlvbnMtZW1wdHkge1xyXG4gICAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xyXG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcclxuICAgICAgZ2FwOiB2YXIoLS11aS1zcGFjaW5nLTIpO1xyXG4gICAgICBwYWRkaW5nOiB2YXIoLS11aS1zcGFjaW5nLTYpIHZhcigtLXVpLXNwYWNpbmctNCk7XHJcbiAgICAgIGNvbG9yOiB2YXIoLS11aS1jb2xvci10ZXh0LW11dGVkKTtcclxuICAgICAgZm9udC1zaXplOiB2YXIoLS11aS1mb250LXNpemUtc20pO1xyXG4gICAgfVxyXG5cclxuICBgLFxyXG4gIF0sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBVaU9wdGlvbnNFZGl0b3JDb21wb25lbnQge1xyXG4gIC8qKlxyXG4gICAqIE9wemlvbmkgZGVsIGNhbXBvIGRhIG1vZGlmaWNhcmUuXHJcbiAgICogQWNjZXR0YSBzaWEgdW4gYXJyYXkgZGkgVWlGaWVsZE9wdGlvbiBjaGUgdW4gdmFsb3JlIGdlbmVyaWNvXHJcbiAgICogKHBlciBnZXN0aXJlIGNhbXBpIG5vbiBhbmNvcmEgY29uZmlndXJhdGkpLlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIG9wdGlvbnM6IFVpRmllbGRPcHRpb25bXSB8IGFueSA9IFtdO1xyXG5cclxuICAvKiogRW1ldHRlIGwnYXJyYXkgYWdnaW9ybmF0byBkZWxsZSBvcHppb25pIGFkIG9nbmkgbW9kaWZpY2EuICovXHJcbiAgQE91dHB1dCgpIG9wdGlvbnNDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPFVpRmllbGRPcHRpb25bXT4oKTtcclxuXHJcbiAgLyoqXHJcbiAgICogTm9ybWFsaXp6YSBsJ2lucHV0IHBlciBnYXJhbnRpcmUgY2hlIHNpYSBzZW1wcmUgdW4gYXJyYXkgdmFsaWRvLlxyXG4gICAqIEdlc3Rpc2NlIGlsIGNhc28gaW4gY3VpIGxlIG9wemlvbmkgc2lhbm8gbnVsbCwgdW5kZWZpbmVkIG8gZGkgdGlwbyBpbmF0dGVzby5cclxuICAgKi9cclxuICBnZXQgbm9ybWFsaXplZE9wdGlvbnMoKTogVWlGaWVsZE9wdGlvbltdIHtcclxuICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMub3B0aW9ucykpIHtcclxuICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucztcclxuICAgIH1cclxuICAgIHJldHVybiBbXTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEFnZ2l1bmdlIHVuYSBudW92YSBvcHppb25lIHZ1b3RhIGFsbGEgbGlzdGEgZSBub3RpZmljYSBpbCBwYXJlbnQuXHJcbiAgICovXHJcbiAgYWRkT3B0aW9uKCk6IHZvaWQge1xyXG4gICAgY29uc3QgbmV3T3B0aW9uOiBVaUZpZWxkT3B0aW9uID0ge1xyXG4gICAgICB2YWx1ZTogJycsXHJcbiAgICAgIGxhYmVsOiAnJyxcclxuICAgICAgZGlzYWJsZWQ6IGZhbHNlLFxyXG4gICAgfTtcclxuICAgIGNvbnN0IHVwZGF0ZWQgPSBbLi4udGhpcy5ub3JtYWxpemVkT3B0aW9ucywgbmV3T3B0aW9uXTtcclxuICAgIHRoaXMuZW1pdENoYW5nZSh1cGRhdGVkKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEFnZ2lvcm5hIHVuYSBwcm9wcmlldGEgc3BlY2lmaWNhIGRpIHVuJ29wemlvbmUuXHJcbiAgICogQHBhcmFtIGluZGV4IC0gSW5kaWNlIGRlbGwnb3B6aW9uZSBkYSBhZ2dpb3JuYXJlLlxyXG4gICAqIEBwYXJhbSBmaWVsZCAtIE5vbWUgZGVsbGEgcHJvcHJpZXRhIGRhIG1vZGlmaWNhcmUuXHJcbiAgICogQHBhcmFtIHZhbHVlIC0gTnVvdm8gdmFsb3JlIGRlbGxhIHByb3ByaWV0YS5cclxuICAgKi9cclxuICB1cGRhdGVPcHRpb24oaW5kZXg6IG51bWJlciwgZmllbGQ6IGtleW9mIFVpRmllbGRPcHRpb24sIHZhbHVlOiBhbnkpOiB2b2lkIHtcclxuICAgIGNvbnN0IHVwZGF0ZWQgPSB0aGlzLm5vcm1hbGl6ZWRPcHRpb25zLm1hcCgob3B0LCBpKSA9PiAoaSA9PT0gaW5kZXggPyB7IC4uLm9wdCwgW2ZpZWxkXTogdmFsdWUgfSA6IG9wdCkpO1xyXG4gICAgdGhpcy5lbWl0Q2hhbmdlKHVwZGF0ZWQpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmltdW92ZSB1bidvcHppb25lIGRhbGxhIGxpc3RhLlxyXG4gICAqIEBwYXJhbSBpbmRleCAtIEluZGljZSBkZWxsJ29wemlvbmUgZGEgcmltdW92ZXJlLlxyXG4gICAqL1xyXG4gIHJlbW92ZU9wdGlvbihpbmRleDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBjb25zdCB1cGRhdGVkID0gdGhpcy5ub3JtYWxpemVkT3B0aW9ucy5maWx0ZXIoKF8sIGkpID0+IGkgIT09IGluZGV4KTtcclxuICAgIHRoaXMuZW1pdENoYW5nZSh1cGRhdGVkKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNwb3N0YSB1bidvcHppb25lIGluIGFsdG8gbyBpbiBiYXNzbyBuZWxsYSBsaXN0YS5cclxuICAgKiBAcGFyYW0gaW5kZXggLSBJbmRpY2UgY29ycmVudGUgZGVsbCdvcHppb25lLlxyXG4gICAqIEBwYXJhbSBkaXJlY3Rpb24gLSBEaXJlemlvbmUgZGVsbG8gc3Bvc3RhbWVudG86IC0xIChzdSkgbyArMSAoZ2l1KS5cclxuICAgKi9cclxuICBtb3ZlT3B0aW9uKGluZGV4OiBudW1iZXIsIGRpcmVjdGlvbjogLTEgfCAxKTogdm9pZCB7XHJcbiAgICBjb25zdCBuZXdJbmRleCA9IGluZGV4ICsgZGlyZWN0aW9uO1xyXG4gICAgaWYgKG5ld0luZGV4IDwgMCB8fCBuZXdJbmRleCA+PSB0aGlzLm5vcm1hbGl6ZWRPcHRpb25zLmxlbmd0aCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCB1cGRhdGVkID0gWy4uLnRoaXMubm9ybWFsaXplZE9wdGlvbnNdO1xyXG4gICAgY29uc3QgW21vdmVkXSA9IHVwZGF0ZWQuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgIHVwZGF0ZWQuc3BsaWNlKG5ld0luZGV4LCAwLCBtb3ZlZCk7XHJcbiAgICB0aGlzLmVtaXRDaGFuZ2UodXBkYXRlZCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBFbWV0dGUgbCdhcnJheSBhZ2dpb3JuYXRvIGRlbGxlIG9wemlvbmkuXHJcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBOdW92byBhcnJheSBkaSBvcHppb25pLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgZW1pdENoYW5nZShvcHRpb25zOiBVaUZpZWxkT3B0aW9uW10pOiB2b2lkIHtcclxuICAgIHRoaXMub3B0aW9uc0NoYW5nZS5lbWl0KG9wdGlvbnMpO1xyXG4gIH1cclxufVxyXG4iXX0=
|
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
import { Component, ChangeDetectionStrategy, ChangeDetectorRef, Input, Output, EventEmitter, ViewChild, inject, } from '@angular/core';
|
|
2
|
+
import { LucideAngularModule } from 'lucide-angular';
|
|
3
|
+
import { UiButtonComponent } from '../../../button/index';
|
|
4
|
+
import { UiFormBuilderComponent } from '../../../form-builder/form-builder.component';
|
|
5
|
+
import { UiEditorFormValuesPanelComponent } from '../form-values-panel/form-values-panel.component';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
import * as i1 from "lucide-angular";
|
|
8
|
+
/**
|
|
9
|
+
* Contenitore per l'anteprima live del form in fase di editing.
|
|
10
|
+
*
|
|
11
|
+
* Mostra una preview del form builder generato dallo schema corrente,
|
|
12
|
+
* con possibilita di aggiornamento forzato e pannello dei valori.
|
|
13
|
+
*
|
|
14
|
+
* @selector ui-editor-preview-container
|
|
15
|
+
*/
|
|
16
|
+
export class UiEditorPreviewContainerComponent {
|
|
17
|
+
constructor() {
|
|
18
|
+
/** @internal Change detector per OnPush. */
|
|
19
|
+
this.cdr = inject(ChangeDetectorRef);
|
|
20
|
+
/** Schema del form ricevuto dal parent (cambia ad ogni modifica nell'editor). */
|
|
21
|
+
this.schema = null;
|
|
22
|
+
/**
|
|
23
|
+
* Chiave per forzare la ri-creazione del form builder.
|
|
24
|
+
* Viene incrementata dal componente padre per invalidare l'anteprima.
|
|
25
|
+
*/
|
|
26
|
+
this.key = 0;
|
|
27
|
+
/** Emesso alla richiesta di aggiornamento forzato dell'anteprima. */
|
|
28
|
+
this.refresh = new EventEmitter();
|
|
29
|
+
/**
|
|
30
|
+
* Snapshot immutabile dello schema usato per il rendering.
|
|
31
|
+
* Viene aggiornato SOLO al primo caricamento, al cambio tab
|
|
32
|
+
* (quando `key` cambia) o al refresh esplicito.
|
|
33
|
+
* Questo evita che le modifiche nell'editor ricostruiscano
|
|
34
|
+
* continuamente il form, perdendo lo stato dell'utente.
|
|
35
|
+
*/
|
|
36
|
+
this.previewSchema = null;
|
|
37
|
+
/** Stato di apertura del pannello valori in basso. */
|
|
38
|
+
this.isValuesPanelOpen = false;
|
|
39
|
+
/** Valori correnti del form nell'anteprima. */
|
|
40
|
+
this.currentFormValues = {};
|
|
41
|
+
/** @internal Ultimo valore di `key` applicato allo snapshot. */
|
|
42
|
+
this.lastAppliedKey = -1;
|
|
43
|
+
}
|
|
44
|
+
ngOnChanges(changes) {
|
|
45
|
+
const keyChanged = changes['key'] && this.key !== this.lastAppliedKey;
|
|
46
|
+
const firstSchema = changes['schema']?.firstChange;
|
|
47
|
+
if (keyChanged || firstSchema) {
|
|
48
|
+
this.applySchemaSnapshot();
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Riceve i valori aggiornati dal form builder ad ogni interazione.
|
|
53
|
+
* @param values - Valori correnti del form (inclusi campi disabilitati)
|
|
54
|
+
*/
|
|
55
|
+
onFormBuilderValueChange(values) {
|
|
56
|
+
this.currentFormValues = values;
|
|
57
|
+
this.cdr.markForCheck();
|
|
58
|
+
}
|
|
59
|
+
/** Alterna la visibilita del pannello dei valori del form. */
|
|
60
|
+
toggleValuesPanel() {
|
|
61
|
+
this.isValuesPanelOpen = !this.isValuesPanelOpen;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Gestisce il cambiamento dei valori dal pannello JSON.
|
|
65
|
+
* @param values - Nuovi valori parsati dal JSON
|
|
66
|
+
*/
|
|
67
|
+
onFormValuesChange(values) {
|
|
68
|
+
this.currentFormValues = values;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Aggiorna i valori leggendo lo stato corrente dal form builder.
|
|
72
|
+
*/
|
|
73
|
+
onRefreshValues() {
|
|
74
|
+
if (this.formBuilderRef) {
|
|
75
|
+
this.currentFormValues = this.formBuilderRef.getFormValue();
|
|
76
|
+
this.cdr.markForCheck();
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* @internal
|
|
81
|
+
* Crea una copia profonda dello schema corrente come snapshot
|
|
82
|
+
* per il rendering dell'anteprima. L'id viene reso univoco
|
|
83
|
+
* per forzare il rebuild del form builder (che ricostruisce
|
|
84
|
+
* solo quando `schema.id` cambia).
|
|
85
|
+
*/
|
|
86
|
+
applySchemaSnapshot() {
|
|
87
|
+
if (this.schema) {
|
|
88
|
+
const snapshot = structuredClone(this.schema);
|
|
89
|
+
snapshot.id = `${snapshot.id}__preview_${this.key}`;
|
|
90
|
+
this.previewSchema = snapshot;
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
this.previewSchema = null;
|
|
94
|
+
}
|
|
95
|
+
this.lastAppliedKey = this.key;
|
|
96
|
+
this.currentFormValues = {};
|
|
97
|
+
}
|
|
98
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: UiEditorPreviewContainerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
99
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: UiEditorPreviewContainerComponent, isStandalone: true, selector: "ui-editor-preview-container", inputs: { schema: "schema", key: "key" }, outputs: { refresh: "refresh" }, viewQueries: [{ propertyName: "formBuilderRef", first: true, predicate: UiFormBuilderComponent, descendants: true }], usesOnChanges: true, ngImport: i0, template: `
|
|
100
|
+
<div class="preview-container">
|
|
101
|
+
<!-- Intestazione con azioni -->
|
|
102
|
+
<div class="preview-container__header">
|
|
103
|
+
<div class="preview-container__header-left">
|
|
104
|
+
<lucide-icon name="eye" [size]="18" aria-hidden="true" />
|
|
105
|
+
<span class="preview-container__title">Anteprima Form</span>
|
|
106
|
+
</div>
|
|
107
|
+
|
|
108
|
+
<div class="preview-container__header-actions">
|
|
109
|
+
<!-- Aggiorna anteprima -->
|
|
110
|
+
<ui-button
|
|
111
|
+
icon="refresh-cw"
|
|
112
|
+
variant="ghost"
|
|
113
|
+
size="sm"
|
|
114
|
+
tooltip="Aggiorna anteprima"
|
|
115
|
+
ariaLabel="Aggiorna anteprima"
|
|
116
|
+
(click)="refresh.emit()"
|
|
117
|
+
/>
|
|
118
|
+
|
|
119
|
+
<!-- Mostra/nascondi pannello valori -->
|
|
120
|
+
<ui-button
|
|
121
|
+
icon="code"
|
|
122
|
+
variant="ghost"
|
|
123
|
+
size="sm"
|
|
124
|
+
tooltip="Mostra/nascondi valori form"
|
|
125
|
+
ariaLabel="Mostra/nascondi valori form"
|
|
126
|
+
(click)="toggleValuesPanel()"
|
|
127
|
+
/>
|
|
128
|
+
</div>
|
|
129
|
+
</div>
|
|
130
|
+
|
|
131
|
+
<!-- Contenuto anteprima -->
|
|
132
|
+
<div class="preview-container__content">
|
|
133
|
+
@if (!previewSchema || !previewSchema.sections || previewSchema.sections.length === 0) {
|
|
134
|
+
<!-- Stato vuoto: nessuno schema -->
|
|
135
|
+
<div class="preview-container__empty">
|
|
136
|
+
<lucide-icon name="layout-template" [size]="40" aria-hidden="true" />
|
|
137
|
+
<p class="preview-container__empty-text">
|
|
138
|
+
Aggiungi sezioni e campi per visualizzare l'anteprima
|
|
139
|
+
</p>
|
|
140
|
+
</div>
|
|
141
|
+
} @else {
|
|
142
|
+
<!-- Rendering del form builder con snapshot dello schema -->
|
|
143
|
+
<div class="preview-container__form-wrapper">
|
|
144
|
+
<ui-form-builder
|
|
145
|
+
[schema]="previewSchema"
|
|
146
|
+
(valueChange)="onFormBuilderValueChange($event)"
|
|
147
|
+
/>
|
|
148
|
+
</div>
|
|
149
|
+
}
|
|
150
|
+
</div>
|
|
151
|
+
|
|
152
|
+
<!-- Pannello valori in basso -->
|
|
153
|
+
<ui-editor-form-values-panel
|
|
154
|
+
[formValues]="currentFormValues"
|
|
155
|
+
[isOpen]="isValuesPanelOpen"
|
|
156
|
+
(valuesChange)="onFormValuesChange($event)"
|
|
157
|
+
(refreshValues)="onRefreshValues()"
|
|
158
|
+
(toggle)="toggleValuesPanel()"
|
|
159
|
+
/>
|
|
160
|
+
</div>
|
|
161
|
+
`, isInline: true, styles: [".preview-container{display:flex;flex-direction:column;height:100%;background:var(--ui-color-bg-subtle, #fafafa);position:relative}.preview-container__header{display:flex;align-items:center;justify-content:space-between;padding:var(--ui-spacing-2, 8px) var(--ui-spacing-4, 16px);border-bottom:1px solid var(--ui-color-border, #e0e0e0);background:var(--ui-color-surface, #fff)}.preview-container__header-left{display:flex;align-items:center;gap:var(--ui-spacing-2, 8px)}.preview-container__title{font-weight:600;font-size:var(--ui-font-size-sm, .875rem);color:var(--ui-color-text, #212121)}.preview-container__header-actions{display:flex;align-items:center;gap:var(--ui-spacing-1, 4px)}.preview-container__content{flex:1;overflow-y:auto;padding:var(--ui-spacing-4, 16px)}.preview-container__empty{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--ui-spacing-3, 12px);padding:var(--ui-spacing-8, 64px) var(--ui-spacing-4, 16px);text-align:center;color:var(--ui-color-text-muted, #9e9e9e)}.preview-container__empty-text{font-size:var(--ui-font-size-sm, .875rem);margin:0}.preview-container__form-wrapper{background:var(--ui-color-surface, #fff);border-radius:var(--ui-radius-md, 8px);padding:var(--ui-spacing-4, 16px);box-shadow:var(--ui-shadow-sm, 0 1px 3px rgba(0,0,0,.1))}\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"] }, { kind: "component", type: UiButtonComponent, selector: "ui-button", inputs: ["label", "tooltip", "variant", "size", "icon", "iconPosition", "loading", "disabled", "fullWidth", "type", "ariaLabel", "customClass"] }, { kind: "component", type: UiFormBuilderComponent, selector: "ui-form-builder", inputs: ["schema", "initialData", "readonly", "disabled", "buttonsOverride", "loadingFor"], outputs: ["valueChange", "validationChange", "formSubmit", "formReset", "customEvent"] }, { kind: "component", type: UiEditorFormValuesPanelComponent, selector: "ui-editor-form-values-panel", inputs: ["formValues", "isOpen"], outputs: ["valuesChange", "refreshValues", "toggle"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
162
|
+
}
|
|
163
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: UiEditorPreviewContainerComponent, decorators: [{
|
|
164
|
+
type: Component,
|
|
165
|
+
args: [{ selector: 'ui-editor-preview-container', standalone: true, imports: [LucideAngularModule, UiButtonComponent, UiFormBuilderComponent, UiEditorFormValuesPanelComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: `
|
|
166
|
+
<div class="preview-container">
|
|
167
|
+
<!-- Intestazione con azioni -->
|
|
168
|
+
<div class="preview-container__header">
|
|
169
|
+
<div class="preview-container__header-left">
|
|
170
|
+
<lucide-icon name="eye" [size]="18" aria-hidden="true" />
|
|
171
|
+
<span class="preview-container__title">Anteprima Form</span>
|
|
172
|
+
</div>
|
|
173
|
+
|
|
174
|
+
<div class="preview-container__header-actions">
|
|
175
|
+
<!-- Aggiorna anteprima -->
|
|
176
|
+
<ui-button
|
|
177
|
+
icon="refresh-cw"
|
|
178
|
+
variant="ghost"
|
|
179
|
+
size="sm"
|
|
180
|
+
tooltip="Aggiorna anteprima"
|
|
181
|
+
ariaLabel="Aggiorna anteprima"
|
|
182
|
+
(click)="refresh.emit()"
|
|
183
|
+
/>
|
|
184
|
+
|
|
185
|
+
<!-- Mostra/nascondi pannello valori -->
|
|
186
|
+
<ui-button
|
|
187
|
+
icon="code"
|
|
188
|
+
variant="ghost"
|
|
189
|
+
size="sm"
|
|
190
|
+
tooltip="Mostra/nascondi valori form"
|
|
191
|
+
ariaLabel="Mostra/nascondi valori form"
|
|
192
|
+
(click)="toggleValuesPanel()"
|
|
193
|
+
/>
|
|
194
|
+
</div>
|
|
195
|
+
</div>
|
|
196
|
+
|
|
197
|
+
<!-- Contenuto anteprima -->
|
|
198
|
+
<div class="preview-container__content">
|
|
199
|
+
@if (!previewSchema || !previewSchema.sections || previewSchema.sections.length === 0) {
|
|
200
|
+
<!-- Stato vuoto: nessuno schema -->
|
|
201
|
+
<div class="preview-container__empty">
|
|
202
|
+
<lucide-icon name="layout-template" [size]="40" aria-hidden="true" />
|
|
203
|
+
<p class="preview-container__empty-text">
|
|
204
|
+
Aggiungi sezioni e campi per visualizzare l'anteprima
|
|
205
|
+
</p>
|
|
206
|
+
</div>
|
|
207
|
+
} @else {
|
|
208
|
+
<!-- Rendering del form builder con snapshot dello schema -->
|
|
209
|
+
<div class="preview-container__form-wrapper">
|
|
210
|
+
<ui-form-builder
|
|
211
|
+
[schema]="previewSchema"
|
|
212
|
+
(valueChange)="onFormBuilderValueChange($event)"
|
|
213
|
+
/>
|
|
214
|
+
</div>
|
|
215
|
+
}
|
|
216
|
+
</div>
|
|
217
|
+
|
|
218
|
+
<!-- Pannello valori in basso -->
|
|
219
|
+
<ui-editor-form-values-panel
|
|
220
|
+
[formValues]="currentFormValues"
|
|
221
|
+
[isOpen]="isValuesPanelOpen"
|
|
222
|
+
(valuesChange)="onFormValuesChange($event)"
|
|
223
|
+
(refreshValues)="onRefreshValues()"
|
|
224
|
+
(toggle)="toggleValuesPanel()"
|
|
225
|
+
/>
|
|
226
|
+
</div>
|
|
227
|
+
`, styles: [".preview-container{display:flex;flex-direction:column;height:100%;background:var(--ui-color-bg-subtle, #fafafa);position:relative}.preview-container__header{display:flex;align-items:center;justify-content:space-between;padding:var(--ui-spacing-2, 8px) var(--ui-spacing-4, 16px);border-bottom:1px solid var(--ui-color-border, #e0e0e0);background:var(--ui-color-surface, #fff)}.preview-container__header-left{display:flex;align-items:center;gap:var(--ui-spacing-2, 8px)}.preview-container__title{font-weight:600;font-size:var(--ui-font-size-sm, .875rem);color:var(--ui-color-text, #212121)}.preview-container__header-actions{display:flex;align-items:center;gap:var(--ui-spacing-1, 4px)}.preview-container__content{flex:1;overflow-y:auto;padding:var(--ui-spacing-4, 16px)}.preview-container__empty{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--ui-spacing-3, 12px);padding:var(--ui-spacing-8, 64px) var(--ui-spacing-4, 16px);text-align:center;color:var(--ui-color-text-muted, #9e9e9e)}.preview-container__empty-text{font-size:var(--ui-font-size-sm, .875rem);margin:0}.preview-container__form-wrapper{background:var(--ui-color-surface, #fff);border-radius:var(--ui-radius-md, 8px);padding:var(--ui-spacing-4, 16px);box-shadow:var(--ui-shadow-sm, 0 1px 3px rgba(0,0,0,.1))}\n"] }]
|
|
228
|
+
}], propDecorators: { formBuilderRef: [{
|
|
229
|
+
type: ViewChild,
|
|
230
|
+
args: [UiFormBuilderComponent]
|
|
231
|
+
}], schema: [{
|
|
232
|
+
type: Input
|
|
233
|
+
}], key: [{
|
|
234
|
+
type: Input
|
|
235
|
+
}], refresh: [{
|
|
236
|
+
type: Output
|
|
237
|
+
}] } });
|
|
238
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJldmlldy1jb250YWluZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvbmctdWktc3lzdGVtL3NyYy9saWIvY29tcG9uZW50cy9mb3JtLWJ1aWxkZXItZWRpdG9yL3N1Yi1jb21wb25lbnRzL3ByZXZpZXctY29udGFpbmVyL3ByZXZpZXctY29udGFpbmVyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsS0FBSyxFQUNMLE1BQU0sRUFDTixZQUFZLEVBR1osU0FBUyxFQUNULE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUcxRCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUN0RixPQUFPLEVBQUUsZ0NBQWdDLEVBQUUsTUFBTSxrREFBa0QsQ0FBQzs7O0FBRXBHOzs7Ozs7O0dBT0c7QUE4SUgsTUFBTSxPQUFPLGlDQUFpQztJQTdJOUM7UUE4SUUsNENBQTRDO1FBQzNCLFFBQUcsR0FBRyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUtqRCxpRkFBaUY7UUFDeEUsV0FBTSxHQUF3QixJQUFJLENBQUM7UUFFNUM7OztXQUdHO1FBQ00sUUFBRyxHQUFXLENBQUMsQ0FBQztRQUV6QixxRUFBcUU7UUFDM0QsWUFBTyxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFFN0M7Ozs7OztXQU1HO1FBQ0gsa0JBQWEsR0FBd0IsSUFBSSxDQUFDO1FBRTFDLHNEQUFzRDtRQUN0RCxzQkFBaUIsR0FBRyxLQUFLLENBQUM7UUFFMUIsK0NBQStDO1FBQy9DLHNCQUFpQixHQUFRLEVBQUUsQ0FBQztRQUU1QixnRUFBZ0U7UUFDeEQsbUJBQWMsR0FBRyxDQUFDLENBQUMsQ0FBQztLQTZEN0I7SUEzREMsV0FBVyxDQUFDLE9BQXNCO1FBQ2hDLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxLQUFLLElBQUksQ0FBQyxjQUFjLENBQUM7UUFDdEUsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFLFdBQVcsQ0FBQztRQUVuRCxJQUFJLFVBQVUsSUFBSSxXQUFXLEVBQUUsQ0FBQztZQUM5QixJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUM3QixDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7T0FHRztJQUNILHdCQUF3QixDQUFDLE1BQVc7UUFDbEMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLE1BQU0sQ0FBQztRQUNoQyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFRCw4REFBOEQ7SUFDOUQsaUJBQWlCO1FBQ2YsSUFBSSxDQUFDLGlCQUFpQixHQUFHLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDO0lBQ25ELENBQUM7SUFFRDs7O09BR0c7SUFDSCxrQkFBa0IsQ0FBQyxNQUFXO1FBQzVCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxNQUFNLENBQUM7SUFDbEMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsZUFBZTtRQUNiLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQzVELElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDMUIsQ0FBQztJQUNILENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSyxtQkFBbUI7UUFDekIsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDaEIsTUFBTSxRQUFRLEdBQUcsZUFBZSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUM5QyxRQUFRLENBQUMsRUFBRSxHQUFHLEdBQUcsUUFBUSxDQUFDLEVBQUUsYUFBYSxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDcEQsSUFBSSxDQUFDLGFBQWEsR0FBRyxRQUFRLENBQUM7UUFDaEMsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztRQUM1QixDQUFDO1FBQ0QsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDO1FBQy9CLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxFQUFFLENBQUM7SUFDOUIsQ0FBQzsrR0EvRlUsaUNBQWlDO21HQUFqQyxpQ0FBaUMsa05BS2pDLHNCQUFzQixxRUE3SXZCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQThEVCx1MkNBaEVTLG1CQUFtQixnUEFBRSxpQkFBaUIsdU1BQUUsc0JBQXNCLGdQQUFFLGdDQUFnQzs7NEZBMEkvRixpQ0FBaUM7a0JBN0k3QyxTQUFTOytCQUNFLDZCQUE2QixjQUMzQixJQUFJLFdBQ1AsQ0FBQyxtQkFBbUIsRUFBRSxpQkFBaUIsRUFBRSxzQkFBc0IsRUFBRSxnQ0FBZ0MsQ0FBQyxtQkFDMUYsdUJBQXVCLENBQUMsTUFBTSxZQUNyQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E4RFQ7OEJBK0VrQyxjQUFjO3NCQUFoRCxTQUFTO3VCQUFDLHNCQUFzQjtnQkFHeEIsTUFBTTtzQkFBZCxLQUFLO2dCQU1HLEdBQUc7c0JBQVgsS0FBSztnQkFHSSxPQUFPO3NCQUFoQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBDb21wb25lbnQsXHJcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXHJcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgSW5wdXQsXHJcbiAgT3V0cHV0LFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBPbkNoYW5nZXMsXHJcbiAgU2ltcGxlQ2hhbmdlcyxcclxuICBWaWV3Q2hpbGQsXHJcbiAgaW5qZWN0LFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBMdWNpZGVBbmd1bGFyTW9kdWxlIH0gZnJvbSAnbHVjaWRlLWFuZ3VsYXInO1xyXG5pbXBvcnQgeyBVaUJ1dHRvbkNvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL2J1dHRvbi9pbmRleCc7XHJcblxyXG5pbXBvcnQgeyBVaUZvcm1TY2hlbWEgfSBmcm9tICcuLi8uLi8uLi9mb3JtLWJ1aWxkZXIvdHlwZXMvaW5kZXgnO1xyXG5pbXBvcnQgeyBVaUZvcm1CdWlsZGVyQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vZm9ybS1idWlsZGVyL2Zvcm0tYnVpbGRlci5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBVaUVkaXRvckZvcm1WYWx1ZXNQYW5lbENvbXBvbmVudCB9IGZyb20gJy4uL2Zvcm0tdmFsdWVzLXBhbmVsL2Zvcm0tdmFsdWVzLXBhbmVsLmNvbXBvbmVudCc7XHJcblxyXG4vKipcclxuICogQ29udGVuaXRvcmUgcGVyIGwnYW50ZXByaW1hIGxpdmUgZGVsIGZvcm0gaW4gZmFzZSBkaSBlZGl0aW5nLlxyXG4gKlxyXG4gKiBNb3N0cmEgdW5hIHByZXZpZXcgZGVsIGZvcm0gYnVpbGRlciBnZW5lcmF0byBkYWxsbyBzY2hlbWEgY29ycmVudGUsXHJcbiAqIGNvbiBwb3NzaWJpbGl0YSBkaSBhZ2dpb3JuYW1lbnRvIGZvcnphdG8gZSBwYW5uZWxsbyBkZWkgdmFsb3JpLlxyXG4gKlxyXG4gKiBAc2VsZWN0b3IgdWktZWRpdG9yLXByZXZpZXctY29udGFpbmVyXHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ3VpLWVkaXRvci1wcmV2aWV3LWNvbnRhaW5lcicsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBpbXBvcnRzOiBbTHVjaWRlQW5ndWxhck1vZHVsZSwgVWlCdXR0b25Db21wb25lbnQsIFVpRm9ybUJ1aWxkZXJDb21wb25lbnQsIFVpRWRpdG9yRm9ybVZhbHVlc1BhbmVsQ29tcG9uZW50XSxcclxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcclxuICB0ZW1wbGF0ZTogYFxyXG4gICAgPGRpdiBjbGFzcz1cInByZXZpZXctY29udGFpbmVyXCI+XHJcbiAgICAgIDwhLS0gSW50ZXN0YXppb25lIGNvbiBhemlvbmkgLS0+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJwcmV2aWV3LWNvbnRhaW5lcl9faGVhZGVyXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInByZXZpZXctY29udGFpbmVyX19oZWFkZXItbGVmdFwiPlxyXG4gICAgICAgICAgPGx1Y2lkZS1pY29uIG5hbWU9XCJleWVcIiBbc2l6ZV09XCIxOFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIC8+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInByZXZpZXctY29udGFpbmVyX190aXRsZVwiPkFudGVwcmltYSBGb3JtPC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwicHJldmlldy1jb250YWluZXJfX2hlYWRlci1hY3Rpb25zXCI+XHJcbiAgICAgICAgICA8IS0tIEFnZ2lvcm5hIGFudGVwcmltYSAtLT5cclxuICAgICAgICAgIDx1aS1idXR0b25cclxuICAgICAgICAgICAgaWNvbj1cInJlZnJlc2gtY3dcIlxyXG4gICAgICAgICAgICB2YXJpYW50PVwiZ2hvc3RcIlxyXG4gICAgICAgICAgICBzaXplPVwic21cIlxyXG4gICAgICAgICAgICB0b29sdGlwPVwiQWdnaW9ybmEgYW50ZXByaW1hXCJcclxuICAgICAgICAgICAgYXJpYUxhYmVsPVwiQWdnaW9ybmEgYW50ZXByaW1hXCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cInJlZnJlc2guZW1pdCgpXCJcclxuICAgICAgICAgIC8+XHJcblxyXG4gICAgICAgICAgPCEtLSBNb3N0cmEvbmFzY29uZGkgcGFubmVsbG8gdmFsb3JpIC0tPlxyXG4gICAgICAgICAgPHVpLWJ1dHRvblxyXG4gICAgICAgICAgICBpY29uPVwiY29kZVwiXHJcbiAgICAgICAgICAgIHZhcmlhbnQ9XCJnaG9zdFwiXHJcbiAgICAgICAgICAgIHNpemU9XCJzbVwiXHJcbiAgICAgICAgICAgIHRvb2x0aXA9XCJNb3N0cmEvbmFzY29uZGkgdmFsb3JpIGZvcm1cIlxyXG4gICAgICAgICAgICBhcmlhTGFiZWw9XCJNb3N0cmEvbmFzY29uZGkgdmFsb3JpIGZvcm1cIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlVmFsdWVzUGFuZWwoKVwiXHJcbiAgICAgICAgICAvPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDwhLS0gQ29udGVudXRvIGFudGVwcmltYSAtLT5cclxuICAgICAgPGRpdiBjbGFzcz1cInByZXZpZXctY29udGFpbmVyX19jb250ZW50XCI+XHJcbiAgICAgICAgQGlmICghcHJldmlld1NjaGVtYSB8fCAhcHJldmlld1NjaGVtYS5zZWN0aW9ucyB8fCBwcmV2aWV3U2NoZW1hLnNlY3Rpb25zLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgPCEtLSBTdGF0byB2dW90bzogbmVzc3VubyBzY2hlbWEgLS0+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJldmlldy1jb250YWluZXJfX2VtcHR5XCI+XHJcbiAgICAgICAgICAgIDxsdWNpZGUtaWNvbiBuYW1lPVwibGF5b3V0LXRlbXBsYXRlXCIgW3NpemVdPVwiNDBcIiBhcmlhLWhpZGRlbj1cInRydWVcIiAvPlxyXG4gICAgICAgICAgICA8cCBjbGFzcz1cInByZXZpZXctY29udGFpbmVyX19lbXB0eS10ZXh0XCI+XHJcbiAgICAgICAgICAgICAgQWdnaXVuZ2kgc2V6aW9uaSBlIGNhbXBpIHBlciB2aXN1YWxpenphcmUgbCdhbnRlcHJpbWFcclxuICAgICAgICAgICAgPC9wPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgfSBAZWxzZSB7XHJcbiAgICAgICAgICA8IS0tIFJlbmRlcmluZyBkZWwgZm9ybSBidWlsZGVyIGNvbiBzbmFwc2hvdCBkZWxsbyBzY2hlbWEgLS0+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJldmlldy1jb250YWluZXJfX2Zvcm0td3JhcHBlclwiPlxyXG4gICAgICAgICAgICA8dWktZm9ybS1idWlsZGVyXHJcbiAgICAgICAgICAgICAgW3NjaGVtYV09XCJwcmV2aWV3U2NoZW1hXCJcclxuICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwib25Gb3JtQnVpbGRlclZhbHVlQ2hhbmdlKCRldmVudClcIlxyXG4gICAgICAgICAgICAvPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgfVxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDwhLS0gUGFubmVsbG8gdmFsb3JpIGluIGJhc3NvIC0tPlxyXG4gICAgICA8dWktZWRpdG9yLWZvcm0tdmFsdWVzLXBhbmVsXHJcbiAgICAgICAgW2Zvcm1WYWx1ZXNdPVwiY3VycmVudEZvcm1WYWx1ZXNcIlxyXG4gICAgICAgIFtpc09wZW5dPVwiaXNWYWx1ZXNQYW5lbE9wZW5cIlxyXG4gICAgICAgICh2YWx1ZXNDaGFuZ2UpPVwib25Gb3JtVmFsdWVzQ2hhbmdlKCRldmVudClcIlxyXG4gICAgICAgIChyZWZyZXNoVmFsdWVzKT1cIm9uUmVmcmVzaFZhbHVlcygpXCJcclxuICAgICAgICAodG9nZ2xlKT1cInRvZ2dsZVZhbHVlc1BhbmVsKClcIlxyXG4gICAgICAvPlxyXG4gICAgPC9kaXY+XHJcbiAgYCxcclxuICBzdHlsZXM6IFtcclxuICAgIGBcclxuICAgIC8qIENvbnRlbml0b3JlIHByaW5jaXBhbGUgZGVsbCdhbnRlcHJpbWEgKi9cclxuICAgIC5wcmV2aWV3LWNvbnRhaW5lciB7XHJcbiAgICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XHJcbiAgICAgIGhlaWdodDogMTAwJTtcclxuICAgICAgYmFja2dyb3VuZDogdmFyKC0tdWktY29sb3ItYmctc3VidGxlLCAjZmFmYWZhKTtcclxuICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qIEludGVzdGF6aW9uZSBkZWxsJ2FudGVwcmltYSAqL1xyXG4gICAgLnByZXZpZXctY29udGFpbmVyX19oZWFkZXIge1xyXG4gICAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XHJcbiAgICAgIHBhZGRpbmc6IHZhcigtLXVpLXNwYWNpbmctMiwgOHB4KSB2YXIoLS11aS1zcGFjaW5nLTQsIDE2cHgpO1xyXG4gICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tdWktY29sb3ItYm9yZGVyLCAjZTBlMGUwKTtcclxuICAgICAgYmFja2dyb3VuZDogdmFyKC0tdWktY29sb3Itc3VyZmFjZSwgI2ZmZik7XHJcbiAgICB9XHJcblxyXG4gICAgLnByZXZpZXctY29udGFpbmVyX19oZWFkZXItbGVmdCB7XHJcbiAgICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgICAgIGdhcDogdmFyKC0tdWktc3BhY2luZy0yLCA4cHgpO1xyXG4gICAgfVxyXG5cclxuICAgIC5wcmV2aWV3LWNvbnRhaW5lcl9fdGl0bGUge1xyXG4gICAgICBmb250LXdlaWdodDogNjAwO1xyXG4gICAgICBmb250LXNpemU6IHZhcigtLXVpLWZvbnQtc2l6ZS1zbSwgMC44NzVyZW0pO1xyXG4gICAgICBjb2xvcjogdmFyKC0tdWktY29sb3ItdGV4dCwgIzIxMjEyMSk7XHJcbiAgICB9XHJcblxyXG4gICAgLnByZXZpZXctY29udGFpbmVyX19oZWFkZXItYWN0aW9ucyB7XHJcbiAgICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgICAgIGdhcDogdmFyKC0tdWktc3BhY2luZy0xLCA0cHgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qIEFyZWEgZGkgY29udGVudXRvIHNjcm9sbGFiaWxlICovXHJcbiAgICAucHJldmlldy1jb250YWluZXJfX2NvbnRlbnQge1xyXG4gICAgICBmbGV4OiAxO1xyXG4gICAgICBvdmVyZmxvdy15OiBhdXRvO1xyXG4gICAgICBwYWRkaW5nOiB2YXIoLS11aS1zcGFjaW5nLTQsIDE2cHgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qIFN0YXRvIHZ1b3RvOiBuZXNzdW5vIHNjaGVtYSBkaXNwb25pYmlsZSAqL1xyXG4gICAgLnByZXZpZXctY29udGFpbmVyX19lbXB0eSB7XHJcbiAgICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XHJcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xyXG4gICAgICBnYXA6IHZhcigtLXVpLXNwYWNpbmctMywgMTJweCk7XHJcbiAgICAgIHBhZGRpbmc6IHZhcigtLXVpLXNwYWNpbmctOCwgNjRweCkgdmFyKC0tdWktc3BhY2luZy00LCAxNnB4KTtcclxuICAgICAgdGV4dC1hbGlnbjogY2VudGVyO1xyXG4gICAgICBjb2xvcjogdmFyKC0tdWktY29sb3ItdGV4dC1tdXRlZCwgIzllOWU5ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLnByZXZpZXctY29udGFpbmVyX19lbXB0eS10ZXh0IHtcclxuICAgICAgZm9udC1zaXplOiB2YXIoLS11aS1mb250LXNpemUtc20sIDAuODc1cmVtKTtcclxuICAgICAgbWFyZ2luOiAwO1xyXG4gICAgfVxyXG5cclxuICAgIC8qIFdyYXBwZXIgZGVsIGZvcm0gYnVpbGRlciByZW5kZXJpenphdG8gKi9cclxuICAgIC5wcmV2aWV3LWNvbnRhaW5lcl9fZm9ybS13cmFwcGVyIHtcclxuICAgICAgYmFja2dyb3VuZDogdmFyKC0tdWktY29sb3Itc3VyZmFjZSwgI2ZmZik7XHJcbiAgICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXVpLXJhZGl1cy1tZCwgOHB4KTtcclxuICAgICAgcGFkZGluZzogdmFyKC0tdWktc3BhY2luZy00LCAxNnB4KTtcclxuICAgICAgYm94LXNoYWRvdzogdmFyKC0tdWktc2hhZG93LXNtLCAwIDFweCAzcHggcmdiYSgwLDAsMCwwLjEpKTtcclxuICAgIH1cclxuICBgLFxyXG4gIF0sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBVaUVkaXRvclByZXZpZXdDb250YWluZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xyXG4gIC8qKiBAaW50ZXJuYWwgQ2hhbmdlIGRldGVjdG9yIHBlciBPblB1c2guICovXHJcbiAgcHJpdmF0ZSByZWFkb25seSBjZHIgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xyXG5cclxuICAvKiogUmlmZXJpbWVudG8gYWxsJ2lzdGFuemEgZGVsIGZvcm0gYnVpbGRlciBwZXIgbGVnZ2VyZSBpIHZhbG9yaS4gKi9cclxuICBAVmlld0NoaWxkKFVpRm9ybUJ1aWxkZXJDb21wb25lbnQpIGZvcm1CdWlsZGVyUmVmPzogVWlGb3JtQnVpbGRlckNvbXBvbmVudDtcclxuXHJcbiAgLyoqIFNjaGVtYSBkZWwgZm9ybSByaWNldnV0byBkYWwgcGFyZW50IChjYW1iaWEgYWQgb2duaSBtb2RpZmljYSBuZWxsJ2VkaXRvcikuICovXHJcbiAgQElucHV0KCkgc2NoZW1hOiBVaUZvcm1TY2hlbWEgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgLyoqXHJcbiAgICogQ2hpYXZlIHBlciBmb3J6YXJlIGxhIHJpLWNyZWF6aW9uZSBkZWwgZm9ybSBidWlsZGVyLlxyXG4gICAqIFZpZW5lIGluY3JlbWVudGF0YSBkYWwgY29tcG9uZW50ZSBwYWRyZSBwZXIgaW52YWxpZGFyZSBsJ2FudGVwcmltYS5cclxuICAgKi9cclxuICBASW5wdXQoKSBrZXk6IG51bWJlciA9IDA7XHJcblxyXG4gIC8qKiBFbWVzc28gYWxsYSByaWNoaWVzdGEgZGkgYWdnaW9ybmFtZW50byBmb3J6YXRvIGRlbGwnYW50ZXByaW1hLiAqL1xyXG4gIEBPdXRwdXQoKSByZWZyZXNoID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xyXG5cclxuICAvKipcclxuICAgKiBTbmFwc2hvdCBpbW11dGFiaWxlIGRlbGxvIHNjaGVtYSB1c2F0byBwZXIgaWwgcmVuZGVyaW5nLlxyXG4gICAqIFZpZW5lIGFnZ2lvcm5hdG8gU09MTyBhbCBwcmltbyBjYXJpY2FtZW50bywgYWwgY2FtYmlvIHRhYlxyXG4gICAqIChxdWFuZG8gYGtleWAgY2FtYmlhKSBvIGFsIHJlZnJlc2ggZXNwbGljaXRvLlxyXG4gICAqIFF1ZXN0byBldml0YSBjaGUgbGUgbW9kaWZpY2hlIG5lbGwnZWRpdG9yIHJpY29zdHJ1aXNjYW5vXHJcbiAgICogY29udGludWFtZW50ZSBpbCBmb3JtLCBwZXJkZW5kbyBsbyBzdGF0byBkZWxsJ3V0ZW50ZS5cclxuICAgKi9cclxuICBwcmV2aWV3U2NoZW1hOiBVaUZvcm1TY2hlbWEgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgLyoqIFN0YXRvIGRpIGFwZXJ0dXJhIGRlbCBwYW5uZWxsbyB2YWxvcmkgaW4gYmFzc28uICovXHJcbiAgaXNWYWx1ZXNQYW5lbE9wZW4gPSBmYWxzZTtcclxuXHJcbiAgLyoqIFZhbG9yaSBjb3JyZW50aSBkZWwgZm9ybSBuZWxsJ2FudGVwcmltYS4gKi9cclxuICBjdXJyZW50Rm9ybVZhbHVlczogYW55ID0ge307XHJcblxyXG4gIC8qKiBAaW50ZXJuYWwgVWx0aW1vIHZhbG9yZSBkaSBga2V5YCBhcHBsaWNhdG8gYWxsbyBzbmFwc2hvdC4gKi9cclxuICBwcml2YXRlIGxhc3RBcHBsaWVkS2V5ID0gLTE7XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuICAgIGNvbnN0IGtleUNoYW5nZWQgPSBjaGFuZ2VzWydrZXknXSAmJiB0aGlzLmtleSAhPT0gdGhpcy5sYXN0QXBwbGllZEtleTtcclxuICAgIGNvbnN0IGZpcnN0U2NoZW1hID0gY2hhbmdlc1snc2NoZW1hJ10/LmZpcnN0Q2hhbmdlO1xyXG5cclxuICAgIGlmIChrZXlDaGFuZ2VkIHx8IGZpcnN0U2NoZW1hKSB7XHJcbiAgICAgIHRoaXMuYXBwbHlTY2hlbWFTbmFwc2hvdCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmljZXZlIGkgdmFsb3JpIGFnZ2lvcm5hdGkgZGFsIGZvcm0gYnVpbGRlciBhZCBvZ25pIGludGVyYXppb25lLlxyXG4gICAqIEBwYXJhbSB2YWx1ZXMgLSBWYWxvcmkgY29ycmVudGkgZGVsIGZvcm0gKGluY2x1c2kgY2FtcGkgZGlzYWJpbGl0YXRpKVxyXG4gICAqL1xyXG4gIG9uRm9ybUJ1aWxkZXJWYWx1ZUNoYW5nZSh2YWx1ZXM6IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5jdXJyZW50Rm9ybVZhbHVlcyA9IHZhbHVlcztcclxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gIH1cclxuXHJcbiAgLyoqIEFsdGVybmEgbGEgdmlzaWJpbGl0YSBkZWwgcGFubmVsbG8gZGVpIHZhbG9yaSBkZWwgZm9ybS4gKi9cclxuICB0b2dnbGVWYWx1ZXNQYW5lbCgpOiB2b2lkIHtcclxuICAgIHRoaXMuaXNWYWx1ZXNQYW5lbE9wZW4gPSAhdGhpcy5pc1ZhbHVlc1BhbmVsT3BlbjtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdlc3Rpc2NlIGlsIGNhbWJpYW1lbnRvIGRlaSB2YWxvcmkgZGFsIHBhbm5lbGxvIEpTT04uXHJcbiAgICogQHBhcmFtIHZhbHVlcyAtIE51b3ZpIHZhbG9yaSBwYXJzYXRpIGRhbCBKU09OXHJcbiAgICovXHJcbiAgb25Gb3JtVmFsdWVzQ2hhbmdlKHZhbHVlczogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLmN1cnJlbnRGb3JtVmFsdWVzID0gdmFsdWVzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQWdnaW9ybmEgaSB2YWxvcmkgbGVnZ2VuZG8gbG8gc3RhdG8gY29ycmVudGUgZGFsIGZvcm0gYnVpbGRlci5cclxuICAgKi9cclxuICBvblJlZnJlc2hWYWx1ZXMoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5mb3JtQnVpbGRlclJlZikge1xyXG4gICAgICB0aGlzLmN1cnJlbnRGb3JtVmFsdWVzID0gdGhpcy5mb3JtQnVpbGRlclJlZi5nZXRGb3JtVmFsdWUoKTtcclxuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAaW50ZXJuYWxcclxuICAgKiBDcmVhIHVuYSBjb3BpYSBwcm9mb25kYSBkZWxsbyBzY2hlbWEgY29ycmVudGUgY29tZSBzbmFwc2hvdFxyXG4gICAqIHBlciBpbCByZW5kZXJpbmcgZGVsbCdhbnRlcHJpbWEuIEwnaWQgdmllbmUgcmVzbyB1bml2b2NvXHJcbiAgICogcGVyIGZvcnphcmUgaWwgcmVidWlsZCBkZWwgZm9ybSBidWlsZGVyIChjaGUgcmljb3N0cnVpc2NlXHJcbiAgICogc29sbyBxdWFuZG8gYHNjaGVtYS5pZGAgY2FtYmlhKS5cclxuICAgKi9cclxuICBwcml2YXRlIGFwcGx5U2NoZW1hU25hcHNob3QoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5zY2hlbWEpIHtcclxuICAgICAgY29uc3Qgc25hcHNob3QgPSBzdHJ1Y3R1cmVkQ2xvbmUodGhpcy5zY2hlbWEpO1xyXG4gICAgICBzbmFwc2hvdC5pZCA9IGAke3NuYXBzaG90LmlkfV9fcHJldmlld18ke3RoaXMua2V5fWA7XHJcbiAgICAgIHRoaXMucHJldmlld1NjaGVtYSA9IHNuYXBzaG90O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5wcmV2aWV3U2NoZW1hID0gbnVsbDtcclxuICAgIH1cclxuICAgIHRoaXMubGFzdEFwcGxpZWRLZXkgPSB0aGlzLmtleTtcclxuICAgIHRoaXMuY3VycmVudEZvcm1WYWx1ZXMgPSB7fTtcclxuICB9XHJcbn1cclxuIl19
|