@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,108 @@
|
|
|
1
|
+
import { OnInit, OnDestroy, OnChanges, SimpleChanges, ChangeDetectorRef, Injector } from '@angular/core';
|
|
2
|
+
import { ControlValueAccessor, Validator, AbstractControl, ValidationErrors, NgControl } from '@angular/forms';
|
|
3
|
+
import { MatTableDataSource } from '@angular/material/table';
|
|
4
|
+
import { UiSpecificaTerritorialeComponent } from '../specifica-territoriale/specifica-territoriale.component';
|
|
5
|
+
import { UiLocationService } from '../../services/location.service';
|
|
6
|
+
import { UiButtonDescriptor } from '../../../button/index';
|
|
7
|
+
import { UiLocationTableConfig, UiLocationRow } from '../../types/territoriale.types';
|
|
8
|
+
import * as i0 from "@angular/core";
|
|
9
|
+
/**
|
|
10
|
+
* Componente standalone per la gestione tabellare di location multiple.
|
|
11
|
+
*
|
|
12
|
+
* Permette l'inserimento, la modifica e l'eliminazione di righe
|
|
13
|
+
* territoriali (italiane o estere) tramite una tabella Material
|
|
14
|
+
* con form inline basato su `UiSpecificaTerritorialeComponent`.
|
|
15
|
+
*
|
|
16
|
+
* Implementa `ControlValueAccessor` e `Validator` per l'integrazione
|
|
17
|
+
* con Angular Reactive Forms. Il valore e un array di `UiLocationRow`.
|
|
18
|
+
*
|
|
19
|
+
* @selector ui-table-territoriale
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* ```html
|
|
23
|
+
* <ui-table-territoriale
|
|
24
|
+
* [formControl]="sedeControl"
|
|
25
|
+
* [config]="{
|
|
26
|
+
* tableLabel: 'Sedi operative',
|
|
27
|
+
* subFieldConfig: { italyByDefault: true, cap: { show: true } }
|
|
28
|
+
* }"
|
|
29
|
+
* />
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
export declare class UiTableTerritorialeComponent implements ControlValueAccessor, Validator, OnInit, OnDestroy, OnChanges {
|
|
33
|
+
private readonly cdr;
|
|
34
|
+
private readonly injector;
|
|
35
|
+
private readonly locationService;
|
|
36
|
+
/** Configurazione della tabella. */
|
|
37
|
+
config: UiLocationTableConfig;
|
|
38
|
+
/** Stato disabilitato globale. */
|
|
39
|
+
disabled: boolean;
|
|
40
|
+
/** Righe della tabella. */
|
|
41
|
+
rows: UiLocationRow[];
|
|
42
|
+
/** DataSource Material per la tabella. */
|
|
43
|
+
dataSource: MatTableDataSource<UiLocationRow, import("@angular/material/paginator").MatPaginator>;
|
|
44
|
+
/** Modalita editing attiva. */
|
|
45
|
+
editMode: boolean;
|
|
46
|
+
/** Modalita inserimento attiva. */
|
|
47
|
+
insertMode: boolean;
|
|
48
|
+
/** Riga in modifica. */
|
|
49
|
+
editingRow: UiLocationRow | null;
|
|
50
|
+
/** Indice della riga in modifica. */
|
|
51
|
+
editingIndex: number | null;
|
|
52
|
+
/** Colonne visualizzate nella tabella. */
|
|
53
|
+
displayedColumns: string[];
|
|
54
|
+
/** Configurazione delle colonne. */
|
|
55
|
+
columnConfig: Record<string, {
|
|
56
|
+
label: string;
|
|
57
|
+
show: boolean;
|
|
58
|
+
}>;
|
|
59
|
+
/** Pulsanti per il form di inserimento/modifica. */
|
|
60
|
+
formButtons: UiButtonDescriptor[];
|
|
61
|
+
/** Pulsante per aggiungere una nuova riga. */
|
|
62
|
+
addButton: UiButtonDescriptor[];
|
|
63
|
+
/** NgControl per accedere alla validazione del form parent. */
|
|
64
|
+
ngControl: NgControl | null;
|
|
65
|
+
specificaForm: UiSpecificaTerritorialeComponent;
|
|
66
|
+
private readonly destroy$;
|
|
67
|
+
private onChange;
|
|
68
|
+
private onTouched;
|
|
69
|
+
private onValidatorChange;
|
|
70
|
+
constructor(cdr: ChangeDetectorRef, injector: Injector, locationService: UiLocationService);
|
|
71
|
+
ngOnInit(): void;
|
|
72
|
+
ngOnChanges(changes: SimpleChanges): void;
|
|
73
|
+
ngOnDestroy(): void;
|
|
74
|
+
writeValue(value: UiLocationRow[] | null): void;
|
|
75
|
+
registerOnChange(fn: (value: UiLocationRow[]) => void): void;
|
|
76
|
+
registerOnTouched(fn: () => void): void;
|
|
77
|
+
setDisabledState(isDisabled: boolean): void;
|
|
78
|
+
validate(control: AbstractControl): ValidationErrors | null;
|
|
79
|
+
get isRequired(): boolean;
|
|
80
|
+
get hasValidationErrors(): boolean;
|
|
81
|
+
get validationErrors(): string[];
|
|
82
|
+
private initializeColumns;
|
|
83
|
+
/** Attiva la modalita inserimento. */
|
|
84
|
+
activateInsertMode(): void;
|
|
85
|
+
/** Attiva la modalita modifica per una riga. */
|
|
86
|
+
editRow(row: UiLocationRow, index: number): void;
|
|
87
|
+
/** Annulla l'operazione in corso (inserimento o modifica). */
|
|
88
|
+
cancelEdit(): void;
|
|
89
|
+
/** Rimuove una riga dalla tabella. */
|
|
90
|
+
removeRow(index: number): void;
|
|
91
|
+
/** Salva la riga corrente (nuova o in modifica). */
|
|
92
|
+
saveRow(): Promise<void>;
|
|
93
|
+
/** Marca il componente come touched. */
|
|
94
|
+
markAsTouched(): void;
|
|
95
|
+
/** Resetta lo stato del componente. */
|
|
96
|
+
resetComponentState(): void;
|
|
97
|
+
/** Funzione track by per la tabella. */
|
|
98
|
+
trackByFn(_index: number, item: UiLocationRow): string;
|
|
99
|
+
private mapRowToFormValue;
|
|
100
|
+
private mapFormValueToRow;
|
|
101
|
+
private propagateChange;
|
|
102
|
+
private generateUUID;
|
|
103
|
+
private calculateActions;
|
|
104
|
+
private calculateFormButtons;
|
|
105
|
+
private calculateAddButton;
|
|
106
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<UiTableTerritorialeComponent, never>;
|
|
107
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<UiTableTerritorialeComponent, "ui-table-territoriale", never, { "config": { "alias": "config"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; }, {}, never, never, true, never>;
|
|
108
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module ng-ui-system/form-builder
|
|
3
|
+
* Tipi per il sistema di condizioni (visibilita, required, disable).
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Operatori di confronto supportati dal sistema di condizioni.
|
|
7
|
+
*
|
|
8
|
+
* | Operatore | Descrizione |
|
|
9
|
+
* |------------------|--------------------------------------------|
|
|
10
|
+
* | `equals` | Uguale a `value` |
|
|
11
|
+
* | `not_equals` | Diverso da `value` |
|
|
12
|
+
* | `contains` | La stringa contiene `value` |
|
|
13
|
+
* | `not_contains` | La stringa non contiene `value` |
|
|
14
|
+
* | `greater_than` | Maggiore di `value` (numerico) |
|
|
15
|
+
* | `less_than` | Minore di `value` (numerico) |
|
|
16
|
+
* | `greater_equal` | Maggiore o uguale a `value` |
|
|
17
|
+
* | `less_equal` | Minore o uguale a `value` |
|
|
18
|
+
* | `is_empty` | Il campo e vuoto/null/undefined |
|
|
19
|
+
* | `is_not_empty` | Il campo ha un valore non vuoto |
|
|
20
|
+
* | `in_array` | Il valore e presente nell'array `value` |
|
|
21
|
+
* | `not_in_array` | Il valore non e presente nell'array `value`|
|
|
22
|
+
*/
|
|
23
|
+
export type UiConditionalOperator = 'equals' | 'not_equals' | 'contains' | 'not_contains' | 'greater_than' | 'less_than' | 'greater_equal' | 'less_equal' | 'is_empty' | 'is_not_empty' | 'in_array' | 'not_in_array';
|
|
24
|
+
/**
|
|
25
|
+
* Condizione per il rendering condizionale dei campi.
|
|
26
|
+
*
|
|
27
|
+
* Piu condizioni possono essere combinate con logica AND/OR.
|
|
28
|
+
* Default: AND (tutte le condizioni devono essere vere).
|
|
29
|
+
*
|
|
30
|
+
* @example
|
|
31
|
+
* ```typescript
|
|
32
|
+
* // Campo visibile solo se 'tipo' == 'persona-fisica'
|
|
33
|
+
* conditions: [{ field: 'tipo', operator: 'equals', value: 'persona-fisica' }]
|
|
34
|
+
*
|
|
35
|
+
* // Combinazione AND/OR
|
|
36
|
+
* conditions: [
|
|
37
|
+
* { field: 'stato', operator: 'equals', value: 'attivo', logic: 'AND' },
|
|
38
|
+
* { field: 'ruolo', operator: 'in_array', value: ['admin', 'editor'] },
|
|
39
|
+
* ]
|
|
40
|
+
* ```
|
|
41
|
+
*/
|
|
42
|
+
export interface UiFieldCondition {
|
|
43
|
+
/** Chiave del campo da valutare. Supporta dot notation (es. `'address.city'`). */
|
|
44
|
+
field: string;
|
|
45
|
+
/** Operatore di confronto. */
|
|
46
|
+
operator: UiConditionalOperator;
|
|
47
|
+
/** Valore di confronto (opzionale per `is_empty`/`is_not_empty`). */
|
|
48
|
+
value?: any;
|
|
49
|
+
/** Logica di combinazione con le altre condizioni. @default 'AND' */
|
|
50
|
+
logic?: 'AND' | 'OR';
|
|
51
|
+
}
|
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module ng-ui-system/form-builder
|
|
3
|
+
* Tipi relativi ai campi del form builder.
|
|
4
|
+
*/
|
|
5
|
+
import { Observable } from 'rxjs';
|
|
6
|
+
import { UiIconName } from '../../../core/types';
|
|
7
|
+
export { UiIconName };
|
|
8
|
+
/**
|
|
9
|
+
* Tipi di campo supportati dal form builder.
|
|
10
|
+
*
|
|
11
|
+
* | Tipo | Descrizione |
|
|
12
|
+
* |-------------------|---------------------------------------------------|
|
|
13
|
+
* | `text` | Input testuale generico |
|
|
14
|
+
* | `email` | Input email con validazione formato |
|
|
15
|
+
* | `password` | Input password con oscuramento |
|
|
16
|
+
* | `number` | Input numerico (supporta currency directive) |
|
|
17
|
+
* | `textarea` | Area di testo multi-riga |
|
|
18
|
+
* | `select` | Select singola (con autocomplete opzionale) |
|
|
19
|
+
* | `multiselect` | Select multipla con chips e autocomplete |
|
|
20
|
+
* | `freemultiselect` | Multiselect a testo libero con chips |
|
|
21
|
+
* | `checkbox` | Checkbox (puo renderizzare come switch) |
|
|
22
|
+
* | `switch` | Toggle switch (mat-slide-toggle) |
|
|
23
|
+
* | `radio` | Gruppo radio button (supporta icone) |
|
|
24
|
+
* | `date` | Date picker (supporta vista mese/anno) |
|
|
25
|
+
* | `datetime` | Date e time picker combinato |
|
|
26
|
+
* | `file` | Upload file con drag & drop e preview |
|
|
27
|
+
* | `divider` | Separatore visuale (nessun valore nel form) |
|
|
28
|
+
* | `flag` | Campo nascosto per logica interna (sempre readonly)|
|
|
29
|
+
* | `custom` | Extension point per componenti custom |
|
|
30
|
+
* | `location` | Selezione territorio (nazione/provincia/comune/CAP)|
|
|
31
|
+
* | `location-table` | Tabella CRUD di location multiple |
|
|
32
|
+
*/
|
|
33
|
+
export type UiFieldType = 'text' | 'email' | 'password' | 'number' | 'textarea' | 'select' | 'multiselect' | 'freemultiselect' | 'checkbox' | 'switch' | 'radio' | 'date' | 'datetime' | 'file' | 'divider' | 'flag' | 'custom' | 'location' | 'location-table';
|
|
34
|
+
/**
|
|
35
|
+
* Singola opzione per campi select, radio, multiselect.
|
|
36
|
+
*/
|
|
37
|
+
export interface UiFieldOption {
|
|
38
|
+
/** Valore dell'opzione (chiave logica). */
|
|
39
|
+
value: any;
|
|
40
|
+
/** Etichetta visualizzata all'utente. */
|
|
41
|
+
label: string;
|
|
42
|
+
/** Disabilita l'opzione nella lista. */
|
|
43
|
+
disabled?: boolean;
|
|
44
|
+
/** Metadati aggiuntivi associati all'opzione. */
|
|
45
|
+
metadata?: Record<string, any>;
|
|
46
|
+
/** Icona Lucide da mostrare accanto alla label. */
|
|
47
|
+
icon?: UiIconName;
|
|
48
|
+
/** Tooltip al passaggio del mouse. */
|
|
49
|
+
tooltip?: string;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Generazione dinamica di opzioni.
|
|
53
|
+
* Supporta generatori predefiniti (es. range anni) o funzioni custom.
|
|
54
|
+
*
|
|
55
|
+
* @example
|
|
56
|
+
* ```typescript
|
|
57
|
+
* // Range anni dall'anno corrente a 5 anni fa
|
|
58
|
+
* dynamicOptions: { type: 'year-range', minYear: 2020, maxYear: 2026 }
|
|
59
|
+
*
|
|
60
|
+
* // Generatore custom
|
|
61
|
+
* dynamicOptions: { type: 'custom', generator: (formData) => [...] }
|
|
62
|
+
* ```
|
|
63
|
+
*/
|
|
64
|
+
export interface UiDynamicOptionsConfig {
|
|
65
|
+
/** Tipo di generazione. */
|
|
66
|
+
type: 'year-range' | 'custom';
|
|
67
|
+
/** Anno minimo (per `year-range`). */
|
|
68
|
+
minYear?: number;
|
|
69
|
+
/** Anno massimo (per `year-range`, default: anno corrente). */
|
|
70
|
+
maxYear?: number;
|
|
71
|
+
/** Funzione custom per generare le opzioni. */
|
|
72
|
+
generator?: (formData: Record<string, any>) => UiFieldOption[];
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Filtraggio opzioni basato sul valore di un altro campo.
|
|
76
|
+
*
|
|
77
|
+
* @example
|
|
78
|
+
* ```typescript
|
|
79
|
+
* // Mostra solo anni >= dell'anno selezionato in 'anno-inizio'
|
|
80
|
+
* dependentOptions: {
|
|
81
|
+
* dependsOn: 'anno-inizio',
|
|
82
|
+
* filterType: 'greater_equal',
|
|
83
|
+
* }
|
|
84
|
+
* ```
|
|
85
|
+
*/
|
|
86
|
+
export interface UiDependentOptionsConfig {
|
|
87
|
+
/** Chiave del campo da cui dipendono le opzioni. */
|
|
88
|
+
dependsOn: string;
|
|
89
|
+
/** Tipo di filtro predefinito da applicare. */
|
|
90
|
+
filterType: 'greater_than' | 'greater_equal' | 'less_than' | 'less_equal' | 'equals' | 'not_equals' | 'custom';
|
|
91
|
+
/** Funzione custom per filtrare le opzioni. */
|
|
92
|
+
filterFn?: (option: UiFieldOption, dependentValue: any, formData: Record<string, any>) => boolean;
|
|
93
|
+
/** Messaggio mostrato se nessuna opzione disponibile dopo il filtro. */
|
|
94
|
+
noOptionsMessage?: string;
|
|
95
|
+
/** Se `true`, disabilita le opzioni filtrate invece di nasconderle. */
|
|
96
|
+
disableInsteadOfHide?: boolean;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Configurazione per tooltip con icona affiancata al campo.
|
|
100
|
+
*/
|
|
101
|
+
export interface UiIconTooltip {
|
|
102
|
+
/** Testo visualizzato nel tooltip. */
|
|
103
|
+
text: string;
|
|
104
|
+
/** Icona Lucide da mostrare. @default 'info' */
|
|
105
|
+
icon?: UiIconName;
|
|
106
|
+
/** Classe CSS aggiuntiva per il tooltip. */
|
|
107
|
+
tooltipClass?: string;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Dati di un singolo file gestito dal componente file input.
|
|
111
|
+
*/
|
|
112
|
+
export interface UiFileData {
|
|
113
|
+
/** Nome del file. */
|
|
114
|
+
filename: string;
|
|
115
|
+
/** Contenuto del file come byte array. */
|
|
116
|
+
content: Uint8Array;
|
|
117
|
+
/** Tipo MIME del file. */
|
|
118
|
+
mimeType: string;
|
|
119
|
+
/** Estensione del file (es. `pdf`, `jpg`). */
|
|
120
|
+
extension: string;
|
|
121
|
+
/** Dimensione del file in bytes. */
|
|
122
|
+
size: number;
|
|
123
|
+
/** Flag che indica se il file deve essere ancora caricato. */
|
|
124
|
+
needsUpload: boolean;
|
|
125
|
+
/** ID univoco per tracciamento interno. */
|
|
126
|
+
id?: string;
|
|
127
|
+
/** URL per l'anteprima (immagini/PDF). */
|
|
128
|
+
previewUrl?: string;
|
|
129
|
+
/** Timestamp di creazione/modifica. */
|
|
130
|
+
timestamp?: Date;
|
|
131
|
+
/** ID del file sul server (per file gia caricati). */
|
|
132
|
+
serverFileId?: number;
|
|
133
|
+
/** Path del file sul server (per file gia caricati). */
|
|
134
|
+
serverPath?: string;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Configurazione per il campo file input.
|
|
138
|
+
*/
|
|
139
|
+
export interface UiFileInputConfig {
|
|
140
|
+
/** Dimensione massima per singolo file in bytes. */
|
|
141
|
+
maxFileSize?: number;
|
|
142
|
+
/** Tipi MIME accettati (es. `['application/pdf', 'image/*']`). */
|
|
143
|
+
acceptedTypes?: string[];
|
|
144
|
+
/** Numero massimo di file caricabili. */
|
|
145
|
+
maxFiles?: number;
|
|
146
|
+
/** Abilita selezione multipla. */
|
|
147
|
+
multiple?: boolean;
|
|
148
|
+
/** Mostra anteprime per immagini e PDF. */
|
|
149
|
+
showPreview?: boolean;
|
|
150
|
+
/** Abilita drag & drop. @default true */
|
|
151
|
+
enableDragDrop?: boolean;
|
|
152
|
+
/** Testo placeholder quando nessun file e selezionato. */
|
|
153
|
+
placeholder?: string;
|
|
154
|
+
/** Testo mostrato nell'area drag & drop. */
|
|
155
|
+
dragDropText?: string;
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Configurazione per componenti custom iniettati nel form.
|
|
159
|
+
* Permette di estendere il form builder con componenti applicativi.
|
|
160
|
+
*
|
|
161
|
+
* @example
|
|
162
|
+
* ```typescript
|
|
163
|
+
* customConfig: {
|
|
164
|
+
* component: 'my-location-picker',
|
|
165
|
+
* config: { showMap: true, zoom: 12 },
|
|
166
|
+
* }
|
|
167
|
+
* ```
|
|
168
|
+
*/
|
|
169
|
+
export interface UiCustomComponentConfig {
|
|
170
|
+
/** Selettore del componente. */
|
|
171
|
+
component: string;
|
|
172
|
+
/** Input da passare al componente. */
|
|
173
|
+
inputs?: Record<string, any>;
|
|
174
|
+
/** Output da ascoltare dal componente. */
|
|
175
|
+
outputs?: Record<string, string>;
|
|
176
|
+
/** Configurazione specifica del componente. */
|
|
177
|
+
config?: Record<string, any>;
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Interfaccia che i componenti custom devono implementare
|
|
181
|
+
* per integrarsi con il form builder.
|
|
182
|
+
*/
|
|
183
|
+
export interface UiCustomFormComponent {
|
|
184
|
+
/** Valore corrente del componente. */
|
|
185
|
+
value: any;
|
|
186
|
+
/** Stato disabilitato. */
|
|
187
|
+
disabled: boolean;
|
|
188
|
+
/** Configurazione ricevuta dal descriptor. */
|
|
189
|
+
config: Record<string, any>;
|
|
190
|
+
/** Callback per notificare cambiamenti di valore. */
|
|
191
|
+
onChange: (value: any) => void;
|
|
192
|
+
/** Callback per emettere eventi custom. */
|
|
193
|
+
onEvent: (event: string, data: any) => void;
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Descrittore completo di un campo del form.
|
|
197
|
+
*
|
|
198
|
+
* Definisce tipo, label, validazione, condizioni di visibilita,
|
|
199
|
+
* opzioni per select/radio e ogni altra configurazione necessaria
|
|
200
|
+
* per il rendering e la logica del campo.
|
|
201
|
+
*
|
|
202
|
+
* @example
|
|
203
|
+
* ```typescript
|
|
204
|
+
* const field: UiFormFieldDescriptor = {
|
|
205
|
+
* key: 'email',
|
|
206
|
+
* type: 'email',
|
|
207
|
+
* label: 'Indirizzo email',
|
|
208
|
+
* placeholder: 'nome@esempio.it',
|
|
209
|
+
* required: true,
|
|
210
|
+
* validation: [
|
|
211
|
+
* { type: 'required', message: 'Campo obbligatorio' },
|
|
212
|
+
* { type: 'email', message: 'Formato email non valido' },
|
|
213
|
+
* ],
|
|
214
|
+
* };
|
|
215
|
+
* ```
|
|
216
|
+
*/
|
|
217
|
+
export interface UiFormFieldDescriptor {
|
|
218
|
+
/** Chiave univoca del campo nel FormGroup. */
|
|
219
|
+
key: string;
|
|
220
|
+
/** Tipo di campo da renderizzare. */
|
|
221
|
+
type: UiFieldType;
|
|
222
|
+
/** Etichetta visualizzata sopra/accanto al campo. */
|
|
223
|
+
label: string;
|
|
224
|
+
/** Testo placeholder. */
|
|
225
|
+
placeholder?: string;
|
|
226
|
+
/** Tooltip testuale per il campo. */
|
|
227
|
+
tooltip?: string;
|
|
228
|
+
/** Configurazione tooltip con icona. */
|
|
229
|
+
iconTooltip?: UiIconTooltip;
|
|
230
|
+
/** Valore di default. */
|
|
231
|
+
defaultValue?: any;
|
|
232
|
+
/** Se il campo e obbligatorio (shortcut per validazione `required`). */
|
|
233
|
+
required?: boolean;
|
|
234
|
+
/** Se il campo e disabilitato. */
|
|
235
|
+
disabled?: boolean;
|
|
236
|
+
/** Se il campo e in sola lettura. */
|
|
237
|
+
readonly?: boolean;
|
|
238
|
+
/** Regole di validazione. @see UiValidationRule */
|
|
239
|
+
validation?: import('./validation.types').UiValidationRule[];
|
|
240
|
+
/** Opzioni statiche o osservabili. */
|
|
241
|
+
options?: UiFieldOption[] | Observable<UiFieldOption[]>;
|
|
242
|
+
/** Nasconde l'opzione vuota iniziale nelle select. */
|
|
243
|
+
hideEmptyOption?: boolean;
|
|
244
|
+
/** Trasforma la select in autocomplete con ricerca. */
|
|
245
|
+
searchable?: boolean;
|
|
246
|
+
/** Mostra pulsante "Seleziona tutto" per multiselect. */
|
|
247
|
+
allowSelectAll?: boolean;
|
|
248
|
+
/** Callback per recupero asincrono di opzioni filtrate per query. */
|
|
249
|
+
asyncOptions?: (query: string) => Promise<UiFieldOption[]>;
|
|
250
|
+
/** Callback per recupero asincrono di opzioni per ID (prevalorizzazione). */
|
|
251
|
+
recoverAsyncValues?: (ids: any[]) => Promise<UiFieldOption[]>;
|
|
252
|
+
/** Generazione dinamica di opzioni. */
|
|
253
|
+
dynamicOptions?: UiDynamicOptionsConfig;
|
|
254
|
+
/** Filtraggio opzioni dipendente da altro campo. */
|
|
255
|
+
dependentOptions?: UiDependentOptionsConfig;
|
|
256
|
+
/** Condizioni per la visibilita del campo. */
|
|
257
|
+
conditions?: import('./condition.types').UiFieldCondition[];
|
|
258
|
+
/** Condizioni per disabilitare il campo. */
|
|
259
|
+
disableConditions?: import('./condition.types').UiFieldCondition[];
|
|
260
|
+
/** Congela il valore quando il campo viene disabilitato da `disableConditions`. */
|
|
261
|
+
freezeValueOnDisable?: boolean;
|
|
262
|
+
/** Configurazione per componenti custom. */
|
|
263
|
+
customConfig?: UiCustomComponentConfig;
|
|
264
|
+
/** Configurazione per il campo file. */
|
|
265
|
+
fileConfig?: UiFileInputConfig;
|
|
266
|
+
/** Configurazione aspetto del campo. */
|
|
267
|
+
appearance?: {
|
|
268
|
+
/** Per checkbox: 'switch' rende il campo come mat-slide-toggle. */
|
|
269
|
+
style?: 'default' | 'switch';
|
|
270
|
+
/** Colore del componente. */
|
|
271
|
+
color?: 'primary' | 'accent' | 'warn';
|
|
272
|
+
};
|
|
273
|
+
/** Classi CSS aggiuntive sul wrapper del campo. */
|
|
274
|
+
cssClasses?: string[];
|
|
275
|
+
/** Attributi HTML aggiuntivi. */
|
|
276
|
+
attributes?: Record<string, any>;
|
|
277
|
+
/** Metadati arbitrari (chips protetti, configurazioni extra, etc.). */
|
|
278
|
+
metadata?: Record<string, any>;
|
|
279
|
+
/** Configurazione layout del campo nel grid. */
|
|
280
|
+
layout?: {
|
|
281
|
+
/** Numero di colonne che il campo occupa (default: dipende dal tipo). */
|
|
282
|
+
columns?: number;
|
|
283
|
+
/** Ordine nel grid. */
|
|
284
|
+
order?: number;
|
|
285
|
+
/** Override colonne per breakpoint (`{ md: 6, lg: 4 }`). */
|
|
286
|
+
breakpoints?: Record<string, number>;
|
|
287
|
+
};
|
|
288
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { UiFieldType, UiFieldOption, UiDynamicOptionsConfig, UiDependentOptionsConfig, UiIconTooltip, UiFileData, UiFileInputConfig, UiCustomComponentConfig, UiCustomFormComponent, UiFormFieldDescriptor, } from './field.types';
|
|
2
|
+
export { UiCrossFieldOperator, UiCrossFieldConfig, UiDateKeyword, UiDateValidationConfig, UiValidationType, UiValidationRule, UiFormValidationState, UiFormErrorDetail, } from './validation.types';
|
|
3
|
+
export { UiConditionalOperator, UiFieldCondition, } from './condition.types';
|
|
4
|
+
export { UiLocationFieldConfig, UiLocationConfig, UiLocationLabels, UiLocationValue, UiLocationTableConfig, UiLocationRow, } from './territoriale.types';
|
|
5
|
+
export { UiWizardStepValidation, UiWizardValidationFn, UiWizardStepConfig, UiFormSection, UiFormBuilderConfig, UiWizardConfig, UiWizardState, UiFormSchema, UiFormData, UiFormCustomEvent, UiWizardStepChangeEvent, UiWizardStepCompleteEvent, } from './schema.types';
|
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module ng-ui-system/form-builder
|
|
3
|
+
* Tipi per lo schema del form, sezioni e configurazione.
|
|
4
|
+
*/
|
|
5
|
+
import { UiFormFieldDescriptor } from './field.types';
|
|
6
|
+
import { UiFieldCondition } from './condition.types';
|
|
7
|
+
/**
|
|
8
|
+
* Configurazione di validazione per un singolo step del wizard.
|
|
9
|
+
*/
|
|
10
|
+
export interface UiWizardStepValidation {
|
|
11
|
+
/** Se lo step richiede validazione prima di procedere. @default true */
|
|
12
|
+
required?: boolean;
|
|
13
|
+
/** Campi specifici da validare in questo step (se omesso, tutti i campi dello step). */
|
|
14
|
+
validateFields?: string[];
|
|
15
|
+
/** Se validare anche i componenti custom nello step. @default true */
|
|
16
|
+
validateCustomComponents?: boolean;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Funzione di validazione custom per uno step del wizard.
|
|
20
|
+
* Viene invocata prima della navigazione allo step successivo.
|
|
21
|
+
*
|
|
22
|
+
* @param formData - Dati correnti del form completo.
|
|
23
|
+
* @param currentStep - Indice dello step corrente (0-based).
|
|
24
|
+
* @param isValid - Risultato della validazione standard del form.
|
|
25
|
+
* @returns `true` per permettere la navigazione, `false` per bloccarla.
|
|
26
|
+
*/
|
|
27
|
+
export type UiWizardValidationFn = (formData: Record<string, any>, currentStep: number, isValid: boolean) => Promise<boolean> | boolean;
|
|
28
|
+
/**
|
|
29
|
+
* Configurazione wizard per una sezione del form.
|
|
30
|
+
*/
|
|
31
|
+
export interface UiWizardStepConfig {
|
|
32
|
+
/** Numero dello step (1-based per UI, convertito a 0-based internamente). */
|
|
33
|
+
stepNumber: number;
|
|
34
|
+
/** Titolo personalizzato per lo step. */
|
|
35
|
+
stepTitle?: string;
|
|
36
|
+
/** Descrizione dello step. */
|
|
37
|
+
stepDescription?: string;
|
|
38
|
+
/** Configurazione di validazione per questo step. */
|
|
39
|
+
validation?: UiWizardStepValidation;
|
|
40
|
+
/** Permette di saltare questo step senza validazione. */
|
|
41
|
+
allowSkip?: boolean;
|
|
42
|
+
/** Nome del metodo di validazione custom (deve essere registrato nel wizard). */
|
|
43
|
+
customValidationFn?: string;
|
|
44
|
+
/** Metadati aggiuntivi per lo step. */
|
|
45
|
+
metadata?: Record<string, any>;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Sezione del form che raggruppa campi correlati.
|
|
49
|
+
* Supporta collapsibilita (accordion), condizioni di visibilita
|
|
50
|
+
* e configurazione wizard opzionale.
|
|
51
|
+
*
|
|
52
|
+
* @example
|
|
53
|
+
* ```typescript
|
|
54
|
+
* const section: UiFormSection = {
|
|
55
|
+
* id: 'anagrafica',
|
|
56
|
+
* title: 'Dati anagrafici',
|
|
57
|
+
* description: 'Informazioni personali del candidato',
|
|
58
|
+
* collapsible: true,
|
|
59
|
+
* fields: [ ... ],
|
|
60
|
+
* };
|
|
61
|
+
* ```
|
|
62
|
+
*/
|
|
63
|
+
export interface UiFormSection {
|
|
64
|
+
/** ID univoco della sezione. */
|
|
65
|
+
id: string;
|
|
66
|
+
/** Titolo della sezione. */
|
|
67
|
+
title?: string;
|
|
68
|
+
/** Descrizione della sezione. */
|
|
69
|
+
description?: string;
|
|
70
|
+
/** Campi contenuti nella sezione. */
|
|
71
|
+
fields: UiFormFieldDescriptor[];
|
|
72
|
+
/** Condizioni per la visibilita della sezione. */
|
|
73
|
+
conditions?: UiFieldCondition[];
|
|
74
|
+
/** Se la sezione e collassabile (accordion). */
|
|
75
|
+
collapsible?: boolean;
|
|
76
|
+
/** Se la sezione e inizialmente collassata. @default false */
|
|
77
|
+
collapsed?: boolean;
|
|
78
|
+
/** Classi CSS aggiuntive per la sezione. */
|
|
79
|
+
cssClasses?: string[];
|
|
80
|
+
/** Configurazione wizard per questa sezione. */
|
|
81
|
+
wizardStep?: UiWizardStepConfig;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Configurazione globale del form builder.
|
|
85
|
+
*/
|
|
86
|
+
export interface UiFormBuilderConfig {
|
|
87
|
+
/** Layout del form. @default 'grid' */
|
|
88
|
+
layout?: 'vertical' | 'horizontal' | 'grid';
|
|
89
|
+
/** Numero di colonne nel grid. @default 12 */
|
|
90
|
+
columns?: number;
|
|
91
|
+
/** Mostra i pulsanti di azione (submit/reset). @default true */
|
|
92
|
+
showButtons?: boolean;
|
|
93
|
+
/** Nasconde l'intero footer (pulsanti + error summary). */
|
|
94
|
+
hideFooter?: boolean;
|
|
95
|
+
/** Label personalizzate per i pulsanti. */
|
|
96
|
+
buttonLabels?: {
|
|
97
|
+
submit?: string;
|
|
98
|
+
reset?: string;
|
|
99
|
+
cancel?: string;
|
|
100
|
+
};
|
|
101
|
+
/** Classi CSS globali sul container del form. */
|
|
102
|
+
cssClasses?: string[];
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Configurazione per la modalita wizard del form.
|
|
106
|
+
* Usata dal componente `UiFormWizardComponent`.
|
|
107
|
+
*
|
|
108
|
+
* @example
|
|
109
|
+
* ```typescript
|
|
110
|
+
* const wizardConfig: UiWizardConfig = {
|
|
111
|
+
* showProgress: true,
|
|
112
|
+
* progressStyle: 'steps',
|
|
113
|
+
* allowBackNavigation: true,
|
|
114
|
+
* buttonLabels: { next: 'Avanti', previous: 'Indietro', finish: 'Completa' },
|
|
115
|
+
* };
|
|
116
|
+
* ```
|
|
117
|
+
*/
|
|
118
|
+
export interface UiWizardConfig {
|
|
119
|
+
/** ID per sincronizzazione wireless tra istanze. */
|
|
120
|
+
wizardId?: string;
|
|
121
|
+
/** Nasconde l'header interno del wizard per consentire un header esterno. */
|
|
122
|
+
wirelessHeading?: boolean;
|
|
123
|
+
/** Mostra la barra di progresso. @default true */
|
|
124
|
+
showProgress?: boolean;
|
|
125
|
+
/** Stile della barra di progresso. @default 'steps' */
|
|
126
|
+
progressStyle?: 'linear' | 'steps';
|
|
127
|
+
/** Permette navigazione all'indietro. @default true */
|
|
128
|
+
allowBackNavigation?: boolean;
|
|
129
|
+
/** Permette navigazione in avanti senza validazione. @default false */
|
|
130
|
+
allowForwardNavigation?: boolean;
|
|
131
|
+
/** Salva automaticamente i dati ad ogni cambio step. */
|
|
132
|
+
autoSave?: boolean;
|
|
133
|
+
/** Callback per il salvataggio dei dati dello step. */
|
|
134
|
+
onStepSave?: (stepData: Record<string, any>, stepNumber: number) => Promise<void> | void;
|
|
135
|
+
/** Mostra pulsanti di navigazione (precedente/successivo). @default true */
|
|
136
|
+
showNavigationButtons?: boolean;
|
|
137
|
+
/** Label personalizzate per i pulsanti del wizard. */
|
|
138
|
+
buttonLabels?: {
|
|
139
|
+
previous?: string;
|
|
140
|
+
next?: string;
|
|
141
|
+
finish?: string;
|
|
142
|
+
save?: string;
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Stato corrente del wizard, esposto dal `WizardSyncService`.
|
|
147
|
+
*/
|
|
148
|
+
export interface UiWizardState {
|
|
149
|
+
/** Step corrente (0-based). */
|
|
150
|
+
currentStep: number;
|
|
151
|
+
/** Numero totale di step. */
|
|
152
|
+
totalSteps: number;
|
|
153
|
+
/** Indici degli step completati. */
|
|
154
|
+
completedSteps: Set<number>;
|
|
155
|
+
/** Indici degli step visitati. */
|
|
156
|
+
visitedSteps: Set<number>;
|
|
157
|
+
/** Se il form nello step corrente e valido. */
|
|
158
|
+
isValid: boolean;
|
|
159
|
+
/** Errori per step. */
|
|
160
|
+
stepErrors: Record<number, string[]>;
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Schema completo del form.
|
|
164
|
+
*
|
|
165
|
+
* Rappresenta la configurazione dichiarativa dell'intero form:
|
|
166
|
+
* sezioni, campi, validazioni, condizioni e impostazioni globali.
|
|
167
|
+
*
|
|
168
|
+
* @example
|
|
169
|
+
* ```typescript
|
|
170
|
+
* export const myForm: UiFormSchema = {
|
|
171
|
+
* id: 'user-registration',
|
|
172
|
+
* title: 'Registrazione utente',
|
|
173
|
+
* sections: [
|
|
174
|
+
* { id: 'personal', title: 'Dati personali', fields: [...] },
|
|
175
|
+
* { id: 'address', title: 'Indirizzo', fields: [...], collapsible: true },
|
|
176
|
+
* ],
|
|
177
|
+
* config: { columns: 12, showButtons: true },
|
|
178
|
+
* };
|
|
179
|
+
* ```
|
|
180
|
+
*/
|
|
181
|
+
export interface UiFormSchema {
|
|
182
|
+
/** ID univoco del form. */
|
|
183
|
+
id: string;
|
|
184
|
+
/** Titolo del form. */
|
|
185
|
+
title?: string;
|
|
186
|
+
/** Descrizione del form. */
|
|
187
|
+
description?: string;
|
|
188
|
+
/** Sezioni del form. */
|
|
189
|
+
sections: UiFormSection[];
|
|
190
|
+
/** Configurazione globale. */
|
|
191
|
+
config?: UiFormBuilderConfig;
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Dati del form come mappa chiave-valore.
|
|
195
|
+
*/
|
|
196
|
+
export type UiFormData = Record<string, any>;
|
|
197
|
+
/**
|
|
198
|
+
* Evento emesso dai campi custom.
|
|
199
|
+
*/
|
|
200
|
+
export interface UiFormCustomEvent {
|
|
201
|
+
/** Chiave del campo che ha emesso l'evento. */
|
|
202
|
+
field: string;
|
|
203
|
+
/** Nome dell'evento. */
|
|
204
|
+
event: string;
|
|
205
|
+
/** Dati associati all'evento. */
|
|
206
|
+
data: any;
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Evento emesso al cambio step del wizard.
|
|
210
|
+
*/
|
|
211
|
+
export interface UiWizardStepChangeEvent {
|
|
212
|
+
/** Indice dello step di partenza. */
|
|
213
|
+
from: number;
|
|
214
|
+
/** Indice dello step di destinazione. */
|
|
215
|
+
to: number;
|
|
216
|
+
/** Direzione della navigazione. */
|
|
217
|
+
direction: 'next' | 'previous';
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Evento emesso al completamento di uno step.
|
|
221
|
+
*/
|
|
222
|
+
export interface UiWizardStepCompleteEvent {
|
|
223
|
+
/** Indice dello step completato. */
|
|
224
|
+
step: number;
|
|
225
|
+
/** Dati del form al momento del completamento. */
|
|
226
|
+
data: Record<string, any>;
|
|
227
|
+
}
|