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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (141) hide show
  1. package/esm2022/gnggln-ng-ui-system.mjs +5 -0
  2. package/esm2022/lib/components/accordion/accordion.component.mjs +353 -0
  3. package/esm2022/lib/components/accordion/accordion.types.mjs +6 -0
  4. package/esm2022/lib/components/accordion/index.mjs +2 -0
  5. package/esm2022/lib/components/base-layout/base-layout.component.mjs +218 -0
  6. package/esm2022/lib/components/base-layout/base-layout.types.mjs +6 -0
  7. package/esm2022/lib/components/base-layout/index.mjs +14 -0
  8. package/esm2022/lib/components/button/button-area.component.mjs +196 -0
  9. package/esm2022/lib/components/button/button.component.mjs +164 -0
  10. package/esm2022/lib/components/button/button.types.mjs +6 -0
  11. package/esm2022/lib/components/button/index.mjs +16 -0
  12. package/esm2022/lib/components/crud-table/crud-table.component.mjs +789 -0
  13. package/esm2022/lib/components/crud-table/crud-table.types.mjs +6 -0
  14. package/esm2022/lib/components/crud-table/index.mjs +16 -0
  15. package/esm2022/lib/components/form-builder/adapters/it-date-adapter.mjs +82 -0
  16. package/esm2022/lib/components/form-builder/directives/currency-input.directive.mjs +184 -0
  17. package/esm2022/lib/components/form-builder/form-builder.component.mjs +824 -0
  18. package/esm2022/lib/components/form-builder/form-wizard.component.mjs +510 -0
  19. package/esm2022/lib/components/form-builder/index.mjs +19 -0
  20. package/esm2022/lib/components/form-builder/services/form-condition.service.mjs +132 -0
  21. package/esm2022/lib/components/form-builder/services/form-validation.service.mjs +381 -0
  22. package/esm2022/lib/components/form-builder/services/location.service.mjs +140 -0
  23. package/esm2022/lib/components/form-builder/services/wizard-sync.service.mjs +84 -0
  24. package/esm2022/lib/components/form-builder/sub-components/error-summary/form-error-summary.component.mjs +161 -0
  25. package/esm2022/lib/components/form-builder/sub-components/file-input/file-input.component.mjs +310 -0
  26. package/esm2022/lib/components/form-builder/sub-components/specifica-territoriale/specifica-territoriale.component.mjs +648 -0
  27. package/esm2022/lib/components/form-builder/sub-components/table-territoriale/table-territoriale.component.mjs +432 -0
  28. package/esm2022/lib/components/form-builder/types/condition.types.mjs +6 -0
  29. package/esm2022/lib/components/form-builder/types/field.types.mjs +6 -0
  30. package/esm2022/lib/components/form-builder/types/index.mjs +2 -0
  31. package/esm2022/lib/components/form-builder/types/schema.types.mjs +6 -0
  32. package/esm2022/lib/components/form-builder/types/territoriale.types.mjs +6 -0
  33. package/esm2022/lib/components/form-builder/types/validation.types.mjs +6 -0
  34. package/esm2022/lib/components/form-builder-editor/form-builder-editor.component.mjs +730 -0
  35. package/esm2022/lib/components/form-builder-editor/form-builder-editor.service.mjs +56 -0
  36. package/esm2022/lib/components/form-builder-editor/index.mjs +21 -0
  37. package/esm2022/lib/components/form-builder-editor/services/editor-persistence.service.mjs +190 -0
  38. package/esm2022/lib/components/form-builder-editor/services/editor-state.service.mjs +324 -0
  39. package/esm2022/lib/components/form-builder-editor/services/field-factory.service.mjs +188 -0
  40. package/esm2022/lib/components/form-builder-editor/sub-components/condition-editor/condition-editor.component.mjs +667 -0
  41. package/esm2022/lib/components/form-builder-editor/sub-components/editor-toolbar/editor-toolbar.component.mjs +317 -0
  42. package/esm2022/lib/components/form-builder-editor/sub-components/field-config-panel/field-config-panel.component.mjs +611 -0
  43. package/esm2022/lib/components/form-builder-editor/sub-components/field-palette/field-palette.component.mjs +267 -0
  44. package/esm2022/lib/components/form-builder-editor/sub-components/form-values-panel/form-values-panel.component.mjs +276 -0
  45. package/esm2022/lib/components/form-builder-editor/sub-components/options-editor/options-editor.component.mjs +323 -0
  46. package/esm2022/lib/components/form-builder-editor/sub-components/preview-container/preview-container.component.mjs +238 -0
  47. package/esm2022/lib/components/form-builder-editor/sub-components/section-editor/section-editor.component.mjs +472 -0
  48. package/esm2022/lib/components/form-builder-editor/sub-components/validation-editor/validation-editor.component.mjs +473 -0
  49. package/esm2022/lib/components/form-builder-editor/types/editor.types.mjs +6 -0
  50. package/esm2022/lib/components/layout-builder/index.mjs +18 -0
  51. package/esm2022/lib/components/layout-builder/layout-builder.component.mjs +1730 -0
  52. package/esm2022/lib/components/layout-builder/layout-builder.types.mjs +9 -0
  53. package/esm2022/lib/components/layout-builder/layout.service.mjs +239 -0
  54. package/esm2022/lib/components/modal/confirm-dialog.component.mjs +151 -0
  55. package/esm2022/lib/components/modal/index.mjs +4 -0
  56. package/esm2022/lib/components/modal/modal.component.mjs +139 -0
  57. package/esm2022/lib/components/modal/modal.service.mjs +194 -0
  58. package/esm2022/lib/components/modal/modal.types.mjs +6 -0
  59. package/esm2022/lib/components/page-header/breadcrumb.service.mjs +242 -0
  60. package/esm2022/lib/components/page-header/index.mjs +20 -0
  61. package/esm2022/lib/components/page-header/page-header.component.mjs +243 -0
  62. package/esm2022/lib/components/page-header/page-header.types.mjs +21 -0
  63. package/esm2022/lib/components/table/index.mjs +2 -0
  64. package/esm2022/lib/components/table/paginated-table.component.mjs +407 -0
  65. package/esm2022/lib/components/table/table.types.mjs +6 -0
  66. package/esm2022/lib/core/types/index.mjs +6 -0
  67. package/esm2022/lib/core/utils/index.mjs +53 -0
  68. package/esm2022/lib/sources/location-data.opt.json +8942 -0
  69. package/esm2022/lib/sources/nazioni.opt.json +215 -0
  70. package/esm2022/public-api.mjs +34 -0
  71. package/fesm2022/gnggln-ng-ui-system.mjs +55752 -0
  72. package/fesm2022/gnggln-ng-ui-system.mjs.map +1 -0
  73. package/index.d.ts +5 -0
  74. package/lib/components/accordion/accordion.component.d.ts +118 -0
  75. package/lib/components/accordion/accordion.types.d.ts +62 -0
  76. package/lib/components/accordion/index.d.ts +2 -0
  77. package/lib/components/base-layout/base-layout.component.d.ts +83 -0
  78. package/lib/components/base-layout/base-layout.types.d.ts +26 -0
  79. package/lib/components/base-layout/index.d.ts +13 -0
  80. package/lib/components/button/button-area.component.d.ts +88 -0
  81. package/lib/components/button/button.component.d.ts +55 -0
  82. package/lib/components/button/button.types.d.ts +70 -0
  83. package/lib/components/button/index.d.ts +15 -0
  84. package/lib/components/crud-table/crud-table.component.d.ts +143 -0
  85. package/lib/components/crud-table/crud-table.types.d.ts +207 -0
  86. package/lib/components/crud-table/index.d.ts +15 -0
  87. package/lib/components/form-builder/adapters/it-date-adapter.d.ts +32 -0
  88. package/lib/components/form-builder/directives/currency-input.directive.d.ts +48 -0
  89. package/lib/components/form-builder/form-builder.component.d.ts +183 -0
  90. package/lib/components/form-builder/form-wizard.component.d.ts +87 -0
  91. package/lib/components/form-builder/index.d.ts +13 -0
  92. package/lib/components/form-builder/services/form-condition.service.d.ts +46 -0
  93. package/lib/components/form-builder/services/form-validation.service.d.ts +63 -0
  94. package/lib/components/form-builder/services/location.service.d.ts +83 -0
  95. package/lib/components/form-builder/services/wizard-sync.service.d.ts +63 -0
  96. package/lib/components/form-builder/sub-components/error-summary/form-error-summary.component.d.ts +28 -0
  97. package/lib/components/form-builder/sub-components/file-input/file-input.component.d.ts +41 -0
  98. package/lib/components/form-builder/sub-components/specifica-territoriale/specifica-territoriale.component.d.ts +145 -0
  99. package/lib/components/form-builder/sub-components/table-territoriale/table-territoriale.component.d.ts +108 -0
  100. package/lib/components/form-builder/types/condition.types.d.ts +51 -0
  101. package/lib/components/form-builder/types/field.types.d.ts +288 -0
  102. package/lib/components/form-builder/types/index.d.ts +5 -0
  103. package/lib/components/form-builder/types/schema.types.d.ts +227 -0
  104. package/lib/components/form-builder/types/territoriale.types.d.ts +170 -0
  105. package/lib/components/form-builder/types/validation.types.d.ts +174 -0
  106. package/lib/components/form-builder-editor/form-builder-editor.component.d.ts +117 -0
  107. package/lib/components/form-builder-editor/form-builder-editor.service.d.ts +38 -0
  108. package/lib/components/form-builder-editor/index.d.ts +15 -0
  109. package/lib/components/form-builder-editor/services/editor-persistence.service.d.ts +42 -0
  110. package/lib/components/form-builder-editor/services/editor-state.service.d.ts +66 -0
  111. package/lib/components/form-builder-editor/services/field-factory.service.d.ts +28 -0
  112. package/lib/components/form-builder-editor/sub-components/condition-editor/condition-editor.component.d.ts +139 -0
  113. package/lib/components/form-builder-editor/sub-components/editor-toolbar/editor-toolbar.component.d.ts +43 -0
  114. package/lib/components/form-builder-editor/sub-components/field-config-panel/field-config-panel.component.d.ts +83 -0
  115. package/lib/components/form-builder-editor/sub-components/field-palette/field-palette.component.d.ts +40 -0
  116. package/lib/components/form-builder-editor/sub-components/form-values-panel/form-values-panel.component.d.ts +51 -0
  117. package/lib/components/form-builder-editor/sub-components/options-editor/options-editor.component.d.ts +63 -0
  118. package/lib/components/form-builder-editor/sub-components/preview-container/preview-container.component.d.ts +68 -0
  119. package/lib/components/form-builder-editor/sub-components/section-editor/section-editor.component.d.ts +82 -0
  120. package/lib/components/form-builder-editor/sub-components/validation-editor/validation-editor.component.d.ts +112 -0
  121. package/lib/components/form-builder-editor/types/editor.types.d.ts +124 -0
  122. package/lib/components/layout-builder/index.d.ts +16 -0
  123. package/lib/components/layout-builder/layout-builder.component.d.ts +85 -0
  124. package/lib/components/layout-builder/layout-builder.types.d.ts +436 -0
  125. package/lib/components/layout-builder/layout.service.d.ts +100 -0
  126. package/lib/components/modal/confirm-dialog.component.d.ts +46 -0
  127. package/lib/components/modal/index.d.ts +4 -0
  128. package/lib/components/modal/modal.component.d.ts +44 -0
  129. package/lib/components/modal/modal.service.d.ts +93 -0
  130. package/lib/components/modal/modal.types.d.ts +110 -0
  131. package/lib/components/page-header/breadcrumb.service.d.ts +96 -0
  132. package/lib/components/page-header/index.d.ts +16 -0
  133. package/lib/components/page-header/page-header.component.d.ts +59 -0
  134. package/lib/components/page-header/page-header.types.d.ts +96 -0
  135. package/lib/components/table/index.d.ts +2 -0
  136. package/lib/components/table/paginated-table.component.d.ts +85 -0
  137. package/lib/components/table/table.types.d.ts +81 -0
  138. package/lib/core/types/index.d.ts +57 -0
  139. package/lib/core/utils/index.d.ts +29 -0
  140. package/package.json +44 -0
  141. package/public-api.d.ts +22 -0
@@ -0,0 +1,87 @@
1
+ import { EventEmitter, OnInit, OnDestroy } from '@angular/core';
2
+ import { UiFormBuilderComponent } from './form-builder.component';
3
+ import { UiFormSchema, UiFormSection, UiFormData, UiWizardConfig, UiWizardState, UiWizardStepChangeEvent, UiWizardStepCompleteEvent, UiWizardValidationFn, UiFormCustomEvent } from './types/schema.types';
4
+ import { UiFormValidationState } from './types/validation.types';
5
+ import * as i0 from "@angular/core";
6
+ /**
7
+ * Componente wizard che wrappa `UiFormBuilderComponent`
8
+ * aggiungendo navigazione multi-step, barra di progresso,
9
+ * validazione per step e sincronizzazione wireless.
10
+ *
11
+ * @selector ui-form-wizard
12
+ *
13
+ * @example
14
+ * ```html
15
+ * <ui-form-wizard
16
+ * [schema]="wizardSchema"
17
+ * [wizardConfig]="wizardConfig"
18
+ * (wizardComplete)="onComplete($event)"
19
+ * (stepChange)="onStepChange($event)"
20
+ * />
21
+ * ```
22
+ */
23
+ export declare class UiFormWizardComponent implements OnInit, OnDestroy {
24
+ private readonly cdr;
25
+ private readonly wizardSync;
26
+ private readonly destroy$;
27
+ formBuilder?: UiFormBuilderComponent;
28
+ /** Schema completo del form (tutte le sezioni con wizardStep). */
29
+ schema: UiFormSchema;
30
+ /** Configurazione del wizard. */
31
+ wizardConfig: UiWizardConfig;
32
+ /** Metodi di validazione custom per step. */
33
+ customValidationMethods: Record<string, UiWizardValidationFn>;
34
+ /** Dati iniziali. */
35
+ initialData: UiFormData;
36
+ /** Modalita sola lettura. */
37
+ readonly: boolean;
38
+ /** Stato disabilitato. */
39
+ disabled: boolean;
40
+ /** Pulsante in caricamento. */
41
+ loadingFor: string | null;
42
+ stepChange: EventEmitter<UiWizardStepChangeEvent>;
43
+ stepComplete: EventEmitter<UiWizardStepCompleteEvent>;
44
+ stepValidationFailed: EventEmitter<{
45
+ step: number;
46
+ errors: string[];
47
+ }>;
48
+ wizardComplete: EventEmitter<UiFormData>;
49
+ valueChange: EventEmitter<UiFormData>;
50
+ validationChange: EventEmitter<UiFormValidationState>;
51
+ customEvent: EventEmitter<UiFormCustomEvent>;
52
+ state: UiWizardState;
53
+ /** Step ordinati per stepNumber. */
54
+ wizardSteps: UiFormSection[];
55
+ /** Dati accumulati del form. */
56
+ private accumulatedData;
57
+ /**
58
+ * Schema cachato per lo step corrente.
59
+ * Evita di creare un nuovo oggetto ad ogni ciclo di change detection,
60
+ * cosa che causerebbe rebuild infiniti nel form builder.
61
+ */
62
+ _cachedStepSchema: UiFormSchema | null;
63
+ private _cachedStepIndex;
64
+ get currentStepSchema(): UiFormSchema | null;
65
+ get currentStepTitle(): string;
66
+ get currentStepDescription(): string;
67
+ get isLastStep(): boolean;
68
+ get progressPercent(): number;
69
+ ngOnInit(): void;
70
+ ngOnDestroy(): void;
71
+ /** Vai allo step successivo con validazione. */
72
+ goToNextStep(): Promise<void>;
73
+ /** Torna allo step precedente. */
74
+ goToPreviousStep(): void;
75
+ /** Completa il wizard. */
76
+ finishWizard(): Promise<void>;
77
+ /** Salva lo step corrente manualmente. */
78
+ saveCurrentStep(): Promise<void>;
79
+ onValueChange(data: UiFormData): void;
80
+ onValidationChange(state: UiFormValidationState): void;
81
+ private navigateToStep;
82
+ private validateCurrentStep;
83
+ private autoSaveIfNeeded;
84
+ private syncWizardState;
85
+ static ɵfac: i0.ɵɵFactoryDeclaration<UiFormWizardComponent, never>;
86
+ static ɵcmp: i0.ɵɵComponentDeclaration<UiFormWizardComponent, "ui-form-wizard", never, { "schema": { "alias": "schema"; "required": false; }; "wizardConfig": { "alias": "wizardConfig"; "required": false; }; "customValidationMethods": { "alias": "customValidationMethods"; "required": false; }; "initialData": { "alias": "initialData"; "required": false; }; "readonly": { "alias": "readonly"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "loadingFor": { "alias": "loadingFor"; "required": false; }; }, { "stepChange": "stepChange"; "stepComplete": "stepComplete"; "stepValidationFailed": "stepValidationFailed"; "wizardComplete": "wizardComplete"; "valueChange": "valueChange"; "validationChange": "validationChange"; "customEvent": "customEvent"; }, never, never, true, never>;
87
+ }
@@ -0,0 +1,13 @@
1
+ export { UiFormBuilderComponent, UiFormErrorStateMatcher } from './form-builder.component';
2
+ export { UiFormWizardComponent } from './form-wizard.component';
3
+ export { UiFormErrorSummaryComponent } from './sub-components/error-summary/form-error-summary.component';
4
+ export { UiFileInputComponent } from './sub-components/file-input/file-input.component';
5
+ export { UiSpecificaTerritorialeComponent } from './sub-components/specifica-territoriale/specifica-territoriale.component';
6
+ export { UiTableTerritorialeComponent } from './sub-components/table-territoriale/table-territoriale.component';
7
+ export { UiFormConditionService } from './services/form-condition.service';
8
+ export { UiFormValidationService } from './services/form-validation.service';
9
+ export { UiLocationService, type UiNazione, type UiProvincia, type UiComune, } from './services/location.service';
10
+ export { UiWizardSyncService, type UiWizardSyncData, } from './services/wizard-sync.service';
11
+ export { UiCurrencyInputDirective } from './directives/currency-input.directive';
12
+ export { UiItalianDateAdapter, UI_IT_DATE_FORMATS } from './adapters/it-date-adapter';
13
+ export * from './types/index';
@@ -0,0 +1,46 @@
1
+ import { UiFieldCondition } from '../types/condition.types';
2
+ import * as i0 from "@angular/core";
3
+ /**
4
+ * Servizio per la valutazione delle condizioni di visibilita,
5
+ * required e disable dei campi del form.
6
+ *
7
+ * Supporta 12 operatori di confronto, logica AND/OR
8
+ * e accesso a valori annidati tramite dot notation.
9
+ *
10
+ * @providedIn 'root'
11
+ */
12
+ export declare class UiFormConditionService {
13
+ /**
14
+ * Valuta una singola condizione rispetto ai dati del form.
15
+ *
16
+ * @param condition - Condizione da valutare.
17
+ * @param formData - Stato corrente dei dati del form.
18
+ * @returns `true` se la condizione e soddisfatta.
19
+ */
20
+ evaluateCondition(condition: UiFieldCondition, formData: Record<string, any>): boolean;
21
+ /**
22
+ * Valuta un array di condizioni con logica AND/OR.
23
+ *
24
+ * La prima condizione stabilisce il valore iniziale.
25
+ * Le condizioni successive usano la proprieta `logic` per
26
+ * combinare il risultato (`AND` per default).
27
+ *
28
+ * @param conditions - Array di condizioni.
29
+ * @param formData - Stato corrente dei dati del form.
30
+ * @returns `true` se le condizioni combinate sono soddisfatte.
31
+ */
32
+ evaluateConditions(conditions: UiFieldCondition[], formData: Record<string, any>): boolean;
33
+ /** Accesso a valori annidati tramite dot notation (es. `'address.city'`). */
34
+ private getNestedValue;
35
+ /** Confronto stringa case-insensitive. */
36
+ private stringContains;
37
+ /** Confronto numerico generico. */
38
+ private numericCompare;
39
+ /**
40
+ * Verifica se un valore e vuoto in modo robusto.
41
+ * Gestisce null, undefined, false, stringhe vuote, array vuoti e oggetti vuoti.
42
+ */
43
+ private isEmpty;
44
+ static ɵfac: i0.ɵɵFactoryDeclaration<UiFormConditionService, never>;
45
+ static ɵprov: i0.ɵɵInjectableDeclaration<UiFormConditionService>;
46
+ }
@@ -0,0 +1,63 @@
1
+ import { AbstractControl, ValidatorFn } from '@angular/forms';
2
+ import { UiValidationRule } from '../types/validation.types';
3
+ import { UiFormConditionService } from './form-condition.service';
4
+ import * as i0 from "@angular/core";
5
+ /**
6
+ * Servizio per la creazione e gestione dei validatori Angular
7
+ * basati sulle regole dichiarative dello schema del form.
8
+ *
9
+ * Supporta validazioni standard, cross-field, date con offset,
10
+ * file e validatori condizionali.
11
+ *
12
+ * @providedIn 'root'
13
+ */
14
+ export declare class UiFormValidationService {
15
+ private conditionService;
16
+ constructor(conditionService: UiFormConditionService);
17
+ /** Crea un array di validatori Angular dalle regole di validazione. */
18
+ createValidators(rules: UiValidationRule[]): ValidatorFn[];
19
+ /**
20
+ * Crea validatori con supporto condizionale.
21
+ * Le regole con `conditions` vengono applicate solo se le condizioni sono soddisfatte.
22
+ */
23
+ createConditionalValidators(rules: UiValidationRule[], formData: Record<string, any>): ValidatorFn[];
24
+ /**
25
+ * Aggiorna i validatori di un campo in base allo stato corrente del form.
26
+ * Usato per ricalcolare validazioni condizionali quando i dati cambiano.
27
+ */
28
+ updateFieldValidators(control: AbstractControl, rules: UiValidationRule[] | undefined, formData: Record<string, any>): void;
29
+ /** Verifica se un campo dovrebbe mostrare gli errori. */
30
+ shouldShowFieldErrors(control: AbstractControl): boolean;
31
+ /** Restituisce i campi correlati da cross-field validation. */
32
+ getCrossFieldRelatedFields(fieldKey: string, allRules: Record<string, UiValidationRule[]>): string[];
33
+ /** Verifica se un campo ha validazioni cross-field che lo referenziano. */
34
+ hasCrossFieldValidations(fieldKey: string, allRules: Record<string, UiValidationRule[]>): boolean;
35
+ /** Formatta la dimensione del file in una stringa leggibile. */
36
+ formatFileSize(bytes: number): string;
37
+ private createValidator;
38
+ private createCrossFieldValidator;
39
+ /** Confronto date con date-fns. */
40
+ private validateDateComparison;
41
+ /** Confronto numerico. */
42
+ private validateNumberComparison;
43
+ private createDateMinValidator;
44
+ private createDateMaxValidator;
45
+ /**
46
+ * Parsa una data di riferimento da keyword o stringa DD/MM/YYYY
47
+ * e applica un eventuale offset temporale.
48
+ */
49
+ private parseReferenceDate;
50
+ /**
51
+ * Applica un offset temporale a una data.
52
+ *
53
+ * Formato: `numero + unita`
54
+ * - `y`/`a` = anni, `m` = mesi, `g`/`d` = giorni, `s`/`w` = settimane
55
+ */
56
+ private applyDateOffset;
57
+ private formatRefDate;
58
+ private createFileSizeValidator;
59
+ private createFileTypeValidator;
60
+ private createFileCountValidator;
61
+ static ɵfac: i0.ɵɵFactoryDeclaration<UiFormValidationService, never>;
62
+ static ɵprov: i0.ɵɵInjectableDeclaration<UiFormValidationService>;
63
+ }
@@ -0,0 +1,83 @@
1
+ import * as i0 from "@angular/core";
2
+ /** Voce nazione nel JSON ottimizzato. */
3
+ export interface MinifiedNazioneOption {
4
+ /** Codice nazione (es. `'ITA'`). */
5
+ x: string;
6
+ /** Descrizione (es. `'Italia'`). */
7
+ d: string;
8
+ }
9
+ /** Voce provincia/comune nel JSON ottimizzato. */
10
+ export interface MinifiedSelectOption {
11
+ /** Codice (provincia o comune). */
12
+ x: string;
13
+ /** Descrizione. */
14
+ d: string;
15
+ /** CAP singolo o multipli. */
16
+ c?: string | string[];
17
+ }
18
+ /** Nazione. */
19
+ export interface UiNazione {
20
+ codStatoPk: string;
21
+ codiceCatastale: string;
22
+ descrizione: string;
23
+ }
24
+ /** Provincia. */
25
+ export interface UiProvincia {
26
+ codiceProvinciaPk: string;
27
+ nomeProvincia: string;
28
+ siglaProvincia: string;
29
+ visibile: boolean;
30
+ }
31
+ /** Comune. */
32
+ export interface UiComune {
33
+ codiceCatastale: string;
34
+ codiceComunePk: string;
35
+ comuneSoppresso: boolean;
36
+ nomeComune: string;
37
+ prov: UiProvincia;
38
+ visibile: boolean;
39
+ }
40
+ /**
41
+ * Servizio per la gestione dei dati geografici italiani
42
+ * da file JSON statici ottimizzati.
43
+ *
44
+ * Elimina la necessita di chiamate backend per nazioni,
45
+ * province, comuni e CAP. I dati vengono caricati in memoria
46
+ * al primo accesso e poi serviti dalla cache.
47
+ *
48
+ * @providedIn 'root'
49
+ *
50
+ * @example
51
+ * ```typescript
52
+ * const nazioni = await this.locationService.getNazioni();
53
+ * const province = await this.locationService.getProvince();
54
+ * const comuni = await this.locationService.getComuniByProvincia('015');
55
+ * const caps = await this.locationService.getCapList('015146');
56
+ * ```
57
+ */
58
+ export declare class UiLocationService {
59
+ private readonly nazioniMap;
60
+ private readonly locationMap;
61
+ private readonly nazioniCache;
62
+ private readonly provinceCache;
63
+ private readonly comuniCache;
64
+ constructor();
65
+ /** Elenco completo delle nazioni (Italia prima). */
66
+ getNazioni(): Promise<{
67
+ data: UiNazione[];
68
+ }>;
69
+ /** Elenco completo delle province, ordinate alfabeticamente. */
70
+ getProvince(): Promise<{
71
+ content: UiProvincia[];
72
+ }>;
73
+ /** Elenco dei comuni per una specifica provincia. */
74
+ getComuniByProvincia(provinciaId: string): Promise<UiComune[]>;
75
+ /** Elenco dei CAP per un comune. */
76
+ getCapList(comuneId: string): Promise<string[]>;
77
+ /** Dati completi di una location (nazione, provincia o comune). */
78
+ getLocationFullData(type: 'nazione' | 'provincia' | 'comune', id: string, provinciaId?: string): Promise<UiNazione | UiProvincia | UiComune | null>;
79
+ private initializeCaches;
80
+ private sortNazioniItaliaFirst;
81
+ static ɵfac: i0.ɵɵFactoryDeclaration<UiLocationService, never>;
82
+ static ɵprov: i0.ɵɵInjectableDeclaration<UiLocationService>;
83
+ }
@@ -0,0 +1,63 @@
1
+ import { Observable } from 'rxjs';
2
+ import { UiWizardState, UiFormSchema } from '../types/schema.types';
3
+ import * as i0 from "@angular/core";
4
+ /**
5
+ * Dati sincronizzati tra istanze wizard.
6
+ * Usato per la funzionalita "wireless heading" che permette
7
+ * a un componente esterno di controllare la visualizzazione
8
+ * dell'header del wizard.
9
+ */
10
+ export interface UiWizardSyncData {
11
+ /** ID del wizard. */
12
+ wizardId: string;
13
+ /** Stato corrente del wizard. */
14
+ wizardState: UiWizardState;
15
+ /** Configurazioni degli step. */
16
+ wizardSteps: {
17
+ title?: string;
18
+ description?: string;
19
+ }[];
20
+ /** Se il wizard e attivo. */
21
+ isWizardMode: boolean;
22
+ /** Schema corrente del form. */
23
+ schema: UiFormSchema | null;
24
+ }
25
+ /**
26
+ * Servizio per la sincronizzazione dello stato del wizard
27
+ * tra istanze multiple (es. header esterno e form wizard).
28
+ *
29
+ * Utilizza BehaviorSubject per mantenere lo stato corrente
30
+ * e notificare i sottoscrittori in tempo reale.
31
+ *
32
+ * @providedIn 'root'
33
+ *
34
+ * @example
35
+ * ```typescript
36
+ * // Nel componente header esterno
37
+ * this.wizardSync.getWizardState$('my-wizard')
38
+ * .subscribe(data => {
39
+ * this.currentStep = data?.wizardState.currentStep;
40
+ * this.totalSteps = data?.wizardState.totalSteps;
41
+ * });
42
+ *
43
+ * // Navigazione da header esterno
44
+ * this.wizardSync.navigateToStep('my-wizard', 2);
45
+ * ```
46
+ */
47
+ export declare class UiWizardSyncService {
48
+ private readonly instances;
49
+ /** Registra un nuovo wizard o aggiorna uno esistente. */
50
+ registerWizard(wizardId: string, data: UiWizardSyncData): void;
51
+ /** Ottiene un observable per monitorare lo stato di un wizard. */
52
+ getWizardState$(wizardId: string): Observable<UiWizardSyncData | null>;
53
+ /** Ottiene lo stato corrente (snapshot). */
54
+ getCurrentWizardState(wizardId: string): UiWizardSyncData | null;
55
+ /** Rimuove un wizard dal registro (cleanup su destroy). */
56
+ unregisterWizard(wizardId: string): void;
57
+ /** Aggiorna parzialmente lo stato del wizard. */
58
+ updateWizardState(wizardId: string, partial: Partial<UiWizardState>): void;
59
+ /** Emette un evento di navigazione verso uno step specifico. */
60
+ navigateToStep(wizardId: string, stepIndex: number): void;
61
+ static ɵfac: i0.ɵɵFactoryDeclaration<UiWizardSyncService, never>;
62
+ static ɵprov: i0.ɵɵInjectableDeclaration<UiWizardSyncService>;
63
+ }
@@ -0,0 +1,28 @@
1
+ import { EventEmitter } from '@angular/core';
2
+ import { UiFormErrorDetail } from '../../types/validation.types';
3
+ import * as i0 from "@angular/core";
4
+ /**
5
+ * Componente per il riepilogo errori del form.
6
+ *
7
+ * Mostra un indicatore con il conteggio degli errori e un dropdown
8
+ * con il dettaglio per campo. Click su un errore emette `fieldClick`
9
+ * per consentire lo scroll-to-field con highlight nel form builder.
10
+ *
11
+ * @selector ui-form-error-summary
12
+ */
13
+ export declare class UiFormErrorSummaryComponent {
14
+ /** Lista di errori dettagliati per campo. */
15
+ errors: UiFormErrorDetail[];
16
+ /** Conteggio totale degli errori (somma di tutti i messaggi). */
17
+ totalErrorCount: number;
18
+ /** Emesso quando l'utente clicca su un errore per navigare al campo. */
19
+ fieldClick: EventEmitter<string>;
20
+ /** @internal Stato del dropdown. */
21
+ showDropdown: boolean;
22
+ /** Conteggio da visualizzare: usa totalErrorCount se fornito, altrimenti conta dai dettagli. */
23
+ get displayCount(): number;
24
+ /** @internal Gestione click su errore. */
25
+ onFieldClick(fieldKey: string): void;
26
+ static ɵfac: i0.ɵɵFactoryDeclaration<UiFormErrorSummaryComponent, never>;
27
+ static ɵcmp: i0.ɵɵComponentDeclaration<UiFormErrorSummaryComponent, "ui-form-error-summary", never, { "errors": { "alias": "errors"; "required": false; }; "totalErrorCount": { "alias": "totalErrorCount"; "required": false; }; }, { "fieldClick": "fieldClick"; }, never, never, true, never>;
28
+ }
@@ -0,0 +1,41 @@
1
+ import { EventEmitter } from '@angular/core';
2
+ import { ControlValueAccessor } from '@angular/forms';
3
+ import { UiFileData, UiFileInputConfig } from '../../types/field.types';
4
+ import * as i0 from "@angular/core";
5
+ /**
6
+ * Componente file input standalone con drag & drop,
7
+ * anteprima, validazione e supporto multiplo.
8
+ *
9
+ * Implementa `ControlValueAccessor` per integrazione
10
+ * diretta con Angular Reactive Forms.
11
+ *
12
+ * @selector ui-file-input
13
+ */
14
+ export declare class UiFileInputComponent implements ControlValueAccessor {
15
+ /** Configurazione del file input. */
16
+ config: UiFileInputConfig | undefined;
17
+ /** File rimosso dalla lista. */
18
+ fileRemoved: EventEmitter<UiFileData>;
19
+ /** Errore di validazione file. */
20
+ validationError: EventEmitter<string>;
21
+ readonly files: import("@angular/core").WritableSignal<UiFileData[]>;
22
+ readonly disabled: import("@angular/core").WritableSignal<boolean>;
23
+ readonly isDragOver: import("@angular/core").WritableSignal<boolean>;
24
+ private onChange;
25
+ private onTouched;
26
+ /** Stringa accept per l'input nativo. */
27
+ get acceptString(): string;
28
+ writeValue(value: UiFileData[]): void;
29
+ registerOnChange(fn: any): void;
30
+ registerOnTouched(fn: any): void;
31
+ setDisabledState(isDisabled: boolean): void;
32
+ onDragOver(event: DragEvent): void;
33
+ onDragLeave(): void;
34
+ onDrop(event: DragEvent): void;
35
+ onFileSelected(event: Event): void;
36
+ removeFile(index: number): void;
37
+ formatSize(bytes: number): string;
38
+ private processFiles;
39
+ static ɵfac: i0.ɵɵFactoryDeclaration<UiFileInputComponent, never>;
40
+ static ɵcmp: i0.ɵɵComponentDeclaration<UiFileInputComponent, "ui-file-input", never, { "config": { "alias": "config"; "required": false; }; }, { "fileRemoved": "fileRemoved"; "validationError": "validationError"; }, never, never, true, never>;
41
+ }
@@ -0,0 +1,145 @@
1
+ import { OnInit, OnDestroy, ChangeDetectorRef, Injector } from '@angular/core';
2
+ import { ControlValueAccessor, FormBuilder, FormGroup, AbstractControl, ValidationErrors, Validator, NgControl } from '@angular/forms';
3
+ import { UiLocationService, UiNazione, UiProvincia, UiComune } from '../../services/location.service';
4
+ import { UiLocationConfig, UiLocationValue } from '../../types/territoriale.types';
5
+ import * as i0 from "@angular/core";
6
+ /**
7
+ * Interfaccia interna per i CAP nel componente.
8
+ */
9
+ interface UiCapOption {
10
+ /** ID del CAP. */
11
+ id: string;
12
+ /** Codice CAP visualizzato. */
13
+ codice: string;
14
+ /** ID del comune associato. */
15
+ comuneId: string;
16
+ }
17
+ /**
18
+ * Componente standalone per la selezione di dati geografici italiani o esteri.
19
+ *
20
+ * Supporta due modalita:
21
+ * - **Italia**: selezione a cascata nazione -> provincia -> comune -> CAP
22
+ * - **Estero**: selezione nazione + campo testo libero per il comune
23
+ *
24
+ * Campi opzionali configurabili: indirizzo, mail, PEC, telefono.
25
+ *
26
+ * Implementa `ControlValueAccessor` e `Validator` per l'integrazione
27
+ * diretta con Angular Reactive Forms.
28
+ *
29
+ * Utilizza dati da JSON statici tramite `UiLocationService`
30
+ * (nessuna dipendenza al backend).
31
+ *
32
+ * @selector ui-specifica-territoriale
33
+ *
34
+ * @example
35
+ * ```html
36
+ * <ui-specifica-territoriale
37
+ * [formControl]="myControl"
38
+ * [config]="{ italyByDefault: true, cap: { show: true } }"
39
+ * />
40
+ * ```
41
+ */
42
+ export declare class UiSpecificaTerritorialeComponent implements ControlValueAccessor, Validator, OnInit, OnDestroy {
43
+ private readonly fb;
44
+ private readonly injector;
45
+ private readonly cdr;
46
+ private readonly locationService;
47
+ /** Configurazione del componente. */
48
+ config: UiLocationConfig;
49
+ /** Stato disabilitato globale. */
50
+ disabled: boolean;
51
+ private readonly EMAIL_PATTERN;
52
+ private readonly PEC_PATTERN;
53
+ private readonly PHONE_PATTERN;
54
+ form: FormGroup;
55
+ isItalian: boolean;
56
+ isForeign: boolean;
57
+ ngControl: NgControl;
58
+ /** Elenco nazioni disponibili. */
59
+ nazioni: UiNazione[];
60
+ /** Elenco province disponibili. */
61
+ province: UiProvincia[];
62
+ /** Comuni filtrati per la provincia selezionata. */
63
+ filteredComuni: UiComune[];
64
+ /** CAP filtrati per il comune selezionato. */
65
+ filteredCaps: UiCapOption[];
66
+ /** Promise di inizializzazione (utile per test e table-territoriale). */
67
+ initializationPromise: Promise<void> | null;
68
+ private readonly destroy$;
69
+ private onChange;
70
+ private onTouched;
71
+ private onValidatorChange;
72
+ private subscriptionsInitialized;
73
+ private pendingWriteValue;
74
+ private isInitializing;
75
+ private tipologicheLoaded;
76
+ constructor(fb: FormBuilder, injector: Injector, cdr: ChangeDetectorRef, locationService: UiLocationService);
77
+ ngOnInit(): void;
78
+ ngOnDestroy(): void;
79
+ writeValue(value: UiLocationValue | null): void;
80
+ registerOnChange(fn: (value: UiLocationValue) => void): void;
81
+ registerOnTouched(fn: () => void): void;
82
+ registerOnValidatorChange(fn: () => void): void;
83
+ setDisabledState(isDisabled: boolean): void;
84
+ validate(_control: AbstractControl): ValidationErrors | null;
85
+ /** Marca tutti i controlli interni come touched. */
86
+ markAsTouched(): void;
87
+ /** Verifica se mostrare gli errori per un campo interno. */
88
+ shouldShowFieldErrors(fieldKey: string): boolean;
89
+ /** Errori di un campo interno come array di messaggi. */
90
+ getFieldErrors(fieldKey: string): string[];
91
+ /** Handler blur per propagare il touched. */
92
+ onBlur(): void;
93
+ /** Resetta lo stato del componente. */
94
+ resetComponentState(): void;
95
+ /** Labels personalizzabili con valori di default. */
96
+ get labels(): {
97
+ nazione: string;
98
+ provincia: string;
99
+ comune: string;
100
+ cap: string;
101
+ indirizzo: string;
102
+ comuneEstero: string;
103
+ mail: string;
104
+ pec: string;
105
+ telefono: string;
106
+ };
107
+ get hasValidationErrors(): boolean;
108
+ get validationErrors(): string[];
109
+ get showCAP(): boolean;
110
+ get showIndirizzo(): boolean;
111
+ get showMail(): boolean;
112
+ get showPEC(): boolean;
113
+ get showTelefono(): boolean;
114
+ get capColumns(): number;
115
+ get indirizzoColumns(): number;
116
+ get mailColumns(): number;
117
+ get pecColumns(): number;
118
+ get telefonoColumns(): number;
119
+ get isItalyByDefault(): boolean;
120
+ get isCapDisabled(): boolean;
121
+ get isNazioneDisabled(): boolean;
122
+ get isRequired(): boolean;
123
+ private initializeComponent;
124
+ private initializeForm;
125
+ private setupNgControl;
126
+ private loadLocationData;
127
+ private processWriteValue;
128
+ private handleItalyByDefaultValue;
129
+ private setupFormSubscriptions;
130
+ private handleTerritorialChanges;
131
+ private updateNationalityState;
132
+ private updateTerritorialData;
133
+ private updateFilteredComuni;
134
+ private updateFilteredCaps;
135
+ private updateComponentState;
136
+ private applyFieldsDisabledState;
137
+ private updateValidators;
138
+ private applyContactValidators;
139
+ private validateContactFields;
140
+ private applyInitialConfiguration;
141
+ private notifyValidationChange;
142
+ static ɵfac: i0.ɵɵFactoryDeclaration<UiSpecificaTerritorialeComponent, never>;
143
+ static ɵcmp: i0.ɵɵComponentDeclaration<UiSpecificaTerritorialeComponent, "ui-specifica-territoriale", never, { "config": { "alias": "config"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; }, {}, never, never, true, never>;
144
+ }
145
+ export {};