@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,143 @@
1
+ import { EventEmitter, OnInit, OnDestroy } from '@angular/core';
2
+ import { UiButtonDescriptor } from '../button/button.types';
3
+ import { UiFormBuilderComponent } from '../form-builder/form-builder.component';
4
+ import { UiFormData } from '../form-builder/types/schema.types';
5
+ import { UiCrudTableColumn, UiCrudTableConfig, UiCrudMode, UiCrudEditEvent, UiCrudDeleteEvent } from './crud-table.types';
6
+ import * as i0 from "@angular/core";
7
+ /**
8
+ * Tabella CRUD standalone con form builder integrato.
9
+ *
10
+ * Gestisce il ciclo completo delle operazioni CRUD:
11
+ * inserimento, modifica, duplicazione, eliminazione e
12
+ * visualizzazione in sola lettura. Il form e generato
13
+ * automaticamente dallo schema `UiFormSchema`.
14
+ *
15
+ * Utilizza `UiModalService` per la conferma di eliminazione
16
+ * e `UiFormBuilderComponent` per la gestione del form.
17
+ *
18
+ * @selector ui-crud-table
19
+ *
20
+ * @example
21
+ * ```html
22
+ * <ui-crud-table
23
+ * [data]="items"
24
+ * [columns]="columns"
25
+ * [config]="crudConfig"
26
+ * (dataChange)="onDataChange($event)"
27
+ * (itemAdd)="onAdd($event)"
28
+ * (itemEdit)="onEdit($event)"
29
+ * (itemDelete)="onDelete($event)"
30
+ * />
31
+ * ```
32
+ */
33
+ export declare class UiCrudTableComponent<T extends Record<string, any> = Record<string, any>> implements OnInit, OnDestroy {
34
+ private readonly cdr;
35
+ private readonly modalService;
36
+ private readonly destroy$;
37
+ /** Array di dati da visualizzare nella tabella. */
38
+ data: T[];
39
+ /** Definizione delle colonne. */
40
+ columns: UiCrudTableColumn[];
41
+ /** Configurazione CRUD (schema form, permessi, label). */
42
+ config: UiCrudTableConfig;
43
+ /** Mostra l'overlay di caricamento. */
44
+ loading: boolean;
45
+ /** Disabilita tutte le azioni CRUD. */
46
+ disabled: boolean;
47
+ /**
48
+ * Funzione di mappatura applicata ai dati di un elemento
49
+ * prima di passarli come `initialData` al form builder.
50
+ * Utile per trasformare la struttura dati dell'oggetto.
51
+ */
52
+ initMapper?: (originalData: T) => Record<string, any>;
53
+ /** Emesso ogni volta che la lista dati cambia (insert/edit/duplicate). */
54
+ dataChange: EventEmitter<T[]>;
55
+ /** Emesso quando viene inserito un nuovo elemento. */
56
+ itemAdd: EventEmitter<T>;
57
+ /** Emesso quando viene modificato un elemento. */
58
+ itemEdit: EventEmitter<UiCrudEditEvent<T>>;
59
+ /** Emesso quando viene eliminato un elemento (dopo conferma). */
60
+ itemDelete: EventEmitter<UiCrudDeleteEvent<T>>;
61
+ /** Emesso quando viene duplicato un elemento. */
62
+ itemDuplicate: EventEmitter<T>;
63
+ /** Emesso quando l'utente clicca su una riga in modalita view. */
64
+ rowClick: EventEmitter<T>;
65
+ /** @internal Modalita corrente. */
66
+ currentMode: UiCrudMode;
67
+ /** @internal Elemento in fase di modifica/visualizzazione. */
68
+ editingItem: T | null;
69
+ /** @internal Indice dell'elemento in modifica. */
70
+ editingIndex: number | null;
71
+ /** @internal Dati originali dell'elemento prima della modifica. */
72
+ private lastOriginalData;
73
+ /** @internal Cache per i dati iniziali del form. */
74
+ private _formInitialData;
75
+ private _lastCacheKey;
76
+ /** @internal Riferimento al form builder. */
77
+ formBuilder: UiFormBuilderComponent;
78
+ /** @internal Pulsanti per il form. */
79
+ formButtons: UiButtonDescriptor[];
80
+ /** @internal Pulsante aggiungi. */
81
+ addButton: UiButtonDescriptor[];
82
+ ngOnInit(): void;
83
+ ngOnDestroy(): void;
84
+ /** La tabella e in modalita form (insert/edit/duplicate/readonly). */
85
+ get isFormMode(): boolean;
86
+ /** La tabella e in modalita sola lettura. */
87
+ get isReadonlyMode(): boolean;
88
+ /** Dati iniziali calcolati per il form builder. */
89
+ get formInitialData(): UiFormData;
90
+ /** Verifica se ci sono azioni disponibili (per mostrare la colonna azioni). */
91
+ hasAnyActions(): boolean;
92
+ /** Verifica se l'elemento puo essere modificato. */
93
+ canEditItem(item: any): boolean;
94
+ /** Verifica se l'elemento puo essere eliminato. */
95
+ canDeleteItem(item: any): boolean;
96
+ /** Verifica se l'elemento puo essere duplicato. */
97
+ canDuplicateItem(item: any): boolean;
98
+ /** Verifica se l'elemento puo essere visualizzato in readonly. */
99
+ canViewItem(item: any): boolean;
100
+ getEditTooltip(item: any): string;
101
+ getDeleteTooltip(item: any): string;
102
+ getDuplicateTooltip(item: any): string;
103
+ getViewTooltip(item: any): string;
104
+ getRowClasses(item: any, index: number): string;
105
+ shouldShowEllipsis(col: UiCrudTableColumn, value: any): boolean;
106
+ truncateText(col: UiCrudTableColumn, value: any): string;
107
+ getFullText(value: any): string;
108
+ /** Attiva la modalita inserimento. */
109
+ activateInsertMode(): void;
110
+ /** Attiva la modalita modifica per un elemento. */
111
+ activateEditMode(item: T, index: number): void;
112
+ /** Attiva la modalita visualizzazione readonly per un elemento. */
113
+ activateViewMode(item: T, index: number): void;
114
+ /** Attiva la modalita duplicazione per un elemento. */
115
+ activateDuplicateMode(item: T): void;
116
+ /** Annulla il form e torna alla vista tabella. */
117
+ cancelForm(): void;
118
+ /** Salva i dati del form (insert/edit/duplicate). */
119
+ saveForm(): void;
120
+ /** Elimina un elemento con conferma tramite UiModalService. */
121
+ deleteItem(item: T, index: number): void;
122
+ onRowClick(item: T): void;
123
+ /** @internal */
124
+ onViewBtnClick(event: Event, item: T, index: number): void;
125
+ /** @internal */
126
+ onEditBtnClick(event: Event, item: T, index: number): void;
127
+ /** @internal */
128
+ onDuplicateBtnClick(event: Event, item: T): void;
129
+ /** @internal */
130
+ onDeleteBtnClick(event: Event, item: T, index: number): void;
131
+ /** @internal Track function per il loop @for. */
132
+ trackByFn: (index: number, item: any) => any;
133
+ /** @internal Genera una chiave per la cache dei dati del form. */
134
+ private generateCacheKey;
135
+ /** @internal Invalida la cache dei dati del form. */
136
+ private invalidateFormCache;
137
+ /** @internal Configura i pulsanti in base alla modalita corrente. */
138
+ private setupButtons;
139
+ /** @internal Restituisce la label del pulsante salva in base alla modalita. */
140
+ private getSaveButtonLabel;
141
+ static ɵfac: i0.ɵɵFactoryDeclaration<UiCrudTableComponent<any>, never>;
142
+ static ɵcmp: i0.ɵɵComponentDeclaration<UiCrudTableComponent<any>, "ui-crud-table", never, { "data": { "alias": "data"; "required": false; }; "columns": { "alias": "columns"; "required": false; }; "config": { "alias": "config"; "required": false; }; "loading": { "alias": "loading"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "initMapper": { "alias": "initMapper"; "required": false; }; }, { "dataChange": "dataChange"; "itemAdd": "itemAdd"; "itemEdit": "itemEdit"; "itemDelete": "itemDelete"; "itemDuplicate": "itemDuplicate"; "rowClick": "rowClick"; }, never, never, true, never>;
143
+ }
@@ -0,0 +1,207 @@
1
+ /**
2
+ * @module ng-ui-system/crud-table
3
+ * Tipi e interfacce per UiCrudTable.
4
+ */
5
+ import { TemplateRef } from '@angular/core';
6
+ import { UiIconName } from '../../core/types';
7
+ import { UiFormSchema } from '../form-builder/types/schema.types';
8
+ export { UiIconName };
9
+ /**
10
+ * Modalita operative della CRUD table.
11
+ *
12
+ * | Modalita | Descrizione |
13
+ * |-------------|----------------------------------------------|
14
+ * | `view` | Visualizzazione tabella (stato iniziale) |
15
+ * | `insert` | Inserimento nuovo elemento tramite form |
16
+ * | `edit` | Modifica elemento esistente |
17
+ * | `duplicate` | Duplicazione di un elemento |
18
+ * | `readonly` | Visualizzazione dettaglio in sola lettura |
19
+ */
20
+ export type UiCrudMode = 'view' | 'insert' | 'edit' | 'duplicate' | 'readonly';
21
+ /**
22
+ * Definizione di una colonna della CRUD table.
23
+ *
24
+ * @usageNotes
25
+ * ### Colonna testuale semplice
26
+ * ```typescript
27
+ * const col: UiCrudTableColumn = {
28
+ * key: 'name',
29
+ * header: 'Nome',
30
+ * width: '200px',
31
+ * };
32
+ * ```
33
+ *
34
+ * ### Colonna con template personalizzato
35
+ * ```typescript
36
+ * const col: UiCrudTableColumn = {
37
+ * key: 'status',
38
+ * header: 'Stato',
39
+ * template: myStatusTemplate,
40
+ * };
41
+ * ```
42
+ */
43
+ export interface UiCrudTableColumn {
44
+ /** Chiave della proprieta nell'oggetto riga (usata per accedere al valore). */
45
+ key: string;
46
+ /** Testo dell'intestazione della colonna. */
47
+ header: string;
48
+ /**
49
+ * Template personalizzato per la cella.
50
+ * Il contesto fornisce: `$implicit` (riga), `column` (definizione), `index` (indice riga), `value` (valore cella).
51
+ */
52
+ template?: TemplateRef<any>;
53
+ /**
54
+ * Template personalizzato per l'intestazione.
55
+ * Il contesto fornisce: `$implicit` (colonna), `column` (definizione).
56
+ */
57
+ headerTemplate?: TemplateRef<any>;
58
+ /** Larghezza CSS della colonna (es. '120px', '20%'). */
59
+ width?: string;
60
+ /** Allineamento del testo nella colonna. @default 'left' */
61
+ align?: 'left' | 'center' | 'right';
62
+ /**
63
+ * Tronca il testo oltre maxLength caratteri con ellipsis e tooltip automatico.
64
+ * @default false
65
+ */
66
+ ellipsis?: boolean;
67
+ /**
68
+ * Numero massimo di caratteri prima del troncamento.
69
+ * Attivo solo quando `ellipsis` e `true`.
70
+ * @default 50
71
+ */
72
+ maxLength?: number;
73
+ }
74
+ /**
75
+ * Configurazione completa della CRUD table.
76
+ *
77
+ * Controlla lo schema del form, le label dei pulsanti, i permessi
78
+ * per azione (globali e per-riga) e i callback pre-apertura form.
79
+ *
80
+ * @usageNotes
81
+ * ### Configurazione base
82
+ * ```typescript
83
+ * const config: UiCrudTableConfig = {
84
+ * formSchema: myFormSchema,
85
+ * tableLabel: 'Utenti',
86
+ * emptyMessage: 'Nessun utente presente',
87
+ * };
88
+ * ```
89
+ *
90
+ * ### Tabella con permessi granulari
91
+ * ```typescript
92
+ * const config: UiCrudTableConfig = {
93
+ * formSchema: mySchema,
94
+ * allowEdit: true,
95
+ * allowDelete: true,
96
+ * allowDuplicate: true,
97
+ * canEdit: (item) => item.status !== 'locked',
98
+ * canDelete: (item) => item.role !== 'admin',
99
+ * };
100
+ * ```
101
+ */
102
+ export interface UiCrudTableConfig {
103
+ /** Schema per il form builder (inserimento/modifica). */
104
+ formSchema: UiFormSchema;
105
+ /** Etichetta della tabella (per accessibilita). */
106
+ tableLabel?: string;
107
+ /** Messaggio visualizzato quando non ci sono dati. @default 'Nessun elemento presente' */
108
+ emptyMessage?: string;
109
+ /** Label del pulsante "Aggiungi". @default 'Aggiungi' */
110
+ addButtonLabel?: string;
111
+ /** Label del pulsante "Salva" (insert). @default 'Salva' */
112
+ saveButtonLabel?: string;
113
+ /** Label del pulsante "Annulla". @default 'Annulla' */
114
+ cancelButtonLabel?: string;
115
+ /** Label del pulsante "Aggiorna" (edit). @default 'Aggiorna' */
116
+ updateButtonLabel?: string;
117
+ /** Label del pulsante "Duplica" (duplicate). @default 'Duplica' */
118
+ duplicateButtonLabel?: string;
119
+ /** Messaggio per il dialogo di conferma eliminazione. */
120
+ deleteConfirmMessage?: string;
121
+ /**
122
+ * Abilita il pulsante "Aggiungi" in modalita view.
123
+ * @default true
124
+ */
125
+ allowAdd?: boolean;
126
+ /**
127
+ * Abilita la modifica degli elementi.
128
+ * @default true
129
+ */
130
+ allowEdit?: boolean;
131
+ /**
132
+ * Abilita l'eliminazione degli elementi.
133
+ * @default true
134
+ */
135
+ allowDelete?: boolean;
136
+ /**
137
+ * Abilita la duplicazione degli elementi.
138
+ * @default false
139
+ */
140
+ allowDuplicate?: boolean;
141
+ /**
142
+ * Abilita la visualizzazione in sola lettura.
143
+ * @default false
144
+ */
145
+ allowView?: boolean;
146
+ /**
147
+ * Determina se una specifica riga puo essere modificata.
148
+ * Se non specificata, usa `allowEdit` globale.
149
+ */
150
+ canEdit?: (item: any, readonly: boolean) => boolean;
151
+ /**
152
+ * Determina se una specifica riga puo essere eliminata.
153
+ * Se non specificata, usa `allowDelete` globale.
154
+ */
155
+ canDelete?: (item: any, readonly: boolean) => boolean;
156
+ /**
157
+ * Determina se una specifica riga puo essere duplicata.
158
+ * Se non specificata, usa `allowDuplicate` globale.
159
+ */
160
+ canDuplicate?: (item: any, readonly: boolean) => boolean;
161
+ /**
162
+ * Determina se una specifica riga puo essere visualizzata in readonly.
163
+ * Se non specificata, usa `allowView` globale.
164
+ */
165
+ canView?: (item: any) => boolean;
166
+ /**
167
+ * Restituisce classi CSS aggiuntive per una specifica riga.
168
+ * Utile per evidenziare righe in base allo stato.
169
+ */
170
+ getRowClass?: (item: any, index: number) => string | string[];
171
+ /** Tooltip personalizzato per l'azione Edit. */
172
+ getEditTooltip?: (item: any) => string;
173
+ /** Tooltip personalizzato per l'azione Delete. */
174
+ getDeleteTooltip?: (item: any) => string;
175
+ /** Tooltip personalizzato per l'azione Duplicate. */
176
+ getDuplicateTooltip?: (item: any) => string;
177
+ /** Tooltip personalizzato per l'azione View. */
178
+ getViewTooltip?: (item: any) => string;
179
+ /** Proprieta usata come chiave di tracking per le righe. @default 'id' */
180
+ trackByProperty?: string;
181
+ /**
182
+ * Callback invocato prima dell'apertura del form.
183
+ * Permette al componente genitore di modificare lo schema
184
+ * (es. disabilitare opzioni gia utilizzate).
185
+ */
186
+ onBeforeFormOpen?: (mode: UiCrudMode, editingItem: any, allData: any[]) => void;
187
+ }
188
+ /**
189
+ * Evento emesso alla modifica di un elemento.
190
+ */
191
+ export interface UiCrudEditEvent<T = any> {
192
+ /** Elemento modificato. */
193
+ item: T;
194
+ /** Indice dell'elemento nella lista. */
195
+ index: number;
196
+ /** Dati originali prima della modifica. */
197
+ originalData: any;
198
+ }
199
+ /**
200
+ * Evento emesso all'eliminazione di un elemento.
201
+ */
202
+ export interface UiCrudDeleteEvent<T = any> {
203
+ /** Elemento eliminato. */
204
+ item: T;
205
+ /** Indice dell'elemento nella lista. */
206
+ index: number;
207
+ }
@@ -0,0 +1,15 @@
1
+ /**
2
+ * ng-ui-system — CRUD Table entry point.
3
+ *
4
+ * @example
5
+ * ```typescript
6
+ * import {
7
+ * UiCrudTableComponent,
8
+ * UiCrudTableColumn,
9
+ * UiCrudTableConfig,
10
+ * UiCrudMode,
11
+ * } from 'ng-ui-system';
12
+ * ```
13
+ */
14
+ export { UiCrudTableComponent } from './crud-table.component';
15
+ export { UiCrudTableColumn, UiCrudTableConfig, UiCrudMode, UiCrudEditEvent, UiCrudDeleteEvent, } from './crud-table.types';
@@ -0,0 +1,32 @@
1
+ import { NativeDateAdapter, MatDateFormats } from '@angular/material/core';
2
+ import * as i0 from "@angular/core";
3
+ /**
4
+ * Adapter personalizzato per il parsing delle date in formato italiano DD/MM/YYYY.
5
+ *
6
+ * Estende il NativeDateAdapter di Angular Material per gestire:
7
+ * - Parsing: converte stringhe DD/MM/YYYY in oggetti Date
8
+ * - Formattazione: visualizza le date nel formato italiano
9
+ * - Primo giorno della settimana: Lunedi (1)
10
+ */
11
+ export declare class UiItalianDateAdapter extends NativeDateAdapter {
12
+ /**
13
+ * Il primo giorno della settimana e Lunedi (1).
14
+ */
15
+ getFirstDayOfWeek(): number;
16
+ /**
17
+ * Parsing di una stringa di data in formato DD/MM/YYYY.
18
+ * Supporta sia il formato con separatore `/` che `-`.
19
+ */
20
+ parse(value: any): Date | null;
21
+ /**
22
+ * Formatta una data in formato DD/MM/YYYY per la visualizzazione.
23
+ */
24
+ format(date: Date, displayFormat: object): string;
25
+ static ɵfac: i0.ɵɵFactoryDeclaration<UiItalianDateAdapter, never>;
26
+ static ɵprov: i0.ɵɵInjectableDeclaration<UiItalianDateAdapter>;
27
+ }
28
+ /**
29
+ * Formati data italiani per Angular Material.
30
+ * Configura il datepicker per usare DD/MM/YYYY.
31
+ */
32
+ export declare const UI_IT_DATE_FORMATS: MatDateFormats;
@@ -0,0 +1,48 @@
1
+ import { ElementRef, OnInit, Renderer2 } from '@angular/core';
2
+ import { ControlValueAccessor } from '@angular/forms';
3
+ import * as i0 from "@angular/core";
4
+ /**
5
+ * Direttiva per formattazione input valuta.
6
+ *
7
+ * Formatta il valore numerico con separatori italiani (1.234,56)
8
+ * e simbolo valuta opzionale. In fase di focus l'utente modifica
9
+ * il valore raw, al blur viene riformattato.
10
+ *
11
+ * Implementa `ControlValueAccessor` per integrazione con Reactive Forms.
12
+ *
13
+ * @selector [uiCurrencyInput]
14
+ *
15
+ * @example
16
+ * ```html
17
+ * <input uiCurrencyInput currencySymbol="EUR" [decimalPlaces]="2" />
18
+ * ```
19
+ */
20
+ export declare class UiCurrencyInputDirective implements ControlValueAccessor, OnInit {
21
+ private el;
22
+ private renderer;
23
+ /** Simbolo valuta visualizzato. @default 'EUR' */
24
+ currencySymbol: string;
25
+ /** Numero di decimali. @default 2 */
26
+ decimalPlaces: number;
27
+ private rawValue;
28
+ private onChange;
29
+ private onTouched;
30
+ private isFocused;
31
+ constructor(el: ElementRef<HTMLInputElement>, renderer: Renderer2);
32
+ ngOnInit(): void;
33
+ writeValue(value: any): void;
34
+ registerOnChange(fn: any): void;
35
+ registerOnTouched(fn: any): void;
36
+ setDisabledState(isDisabled: boolean): void;
37
+ onFocus(): void;
38
+ onBlur(): void;
39
+ onInput(value: string): void;
40
+ onKeyDown(event: KeyboardEvent): void;
41
+ private parseInput;
42
+ /** Mostra il valore formattato con separatori italiani e simbolo. */
43
+ private displayFormatted;
44
+ /** Formattazione italiana: 1.234,56 */
45
+ private formatItalian;
46
+ static ɵfac: i0.ɵɵFactoryDeclaration<UiCurrencyInputDirective, never>;
47
+ static ɵdir: i0.ɵɵDirectiveDeclaration<UiCurrencyInputDirective, "[uiCurrencyInput]", never, { "currencySymbol": { "alias": "currencySymbol"; "required": false; }; "decimalPlaces": { "alias": "decimalPlaces"; "required": false; }; }, {}, never, never, true, never>;
48
+ }
@@ -0,0 +1,183 @@
1
+ import { EventEmitter, OnInit, OnChanges, OnDestroy, SimpleChanges, AfterViewInit } from '@angular/core';
2
+ import { FormGroup, FormControl, FormGroupDirective, NgForm } from '@angular/forms';
3
+ import { ErrorStateMatcher } from '@angular/material/core';
4
+ import { UiButtonDescriptor } from '../../components/button/index';
5
+ import { UiFormSchema, UiFormData, UiFormCustomEvent } from './types/schema.types';
6
+ import { UiFormFieldDescriptor, UiFieldOption } from './types/field.types';
7
+ import { UiFormValidationState, UiFormErrorDetail } from './types/validation.types';
8
+ import * as i0 from "@angular/core";
9
+ /**
10
+ * ErrorStateMatcher custom per il form builder.
11
+ * Mostra lo stato di errore quando il campo e invalido E (touched OPPURE dirty).
12
+ * Sostituisce il matcher di default di Angular Material.
13
+ */
14
+ export declare class UiFormErrorStateMatcher implements ErrorStateMatcher {
15
+ isErrorState(control: FormControl | null, form: FormGroupDirective | NgForm | null): boolean;
16
+ }
17
+ /**
18
+ * Form builder data-driven e schema-based.
19
+ *
20
+ * Genera un form completo a partire da uno schema dichiarativo (`UiFormSchema`).
21
+ * Supporta 16 tipi di campo, validazione condizionale, cross-field validation,
22
+ * date con offset, opzioni dipendenti/dinamiche, sezioni collapsibili,
23
+ * error summary con scroll-to-field e button override.
24
+ *
25
+ * @selector ui-form-builder
26
+ *
27
+ * @example
28
+ * ```html
29
+ * <ui-form-builder
30
+ * [schema]="formSchema"
31
+ * [initialData]="userData"
32
+ * (formSubmit)="onSubmit($event)"
33
+ * (valueChange)="onChange($event)"
34
+ * />
35
+ * ```
36
+ */
37
+ export declare class UiFormBuilderComponent implements OnInit, OnChanges, OnDestroy, AfterViewInit {
38
+ private readonly cdr;
39
+ private readonly elRef;
40
+ private readonly conditionService;
41
+ private readonly validationService;
42
+ private readonly destroy$;
43
+ private valueChangeSub?;
44
+ /** ID schema corrente -- usato per evitare rebuild superflui. */
45
+ private currentSchemaId;
46
+ /** Schema del form. */
47
+ schema: UiFormSchema;
48
+ /** Dati iniziali per la prevalorizzazione. */
49
+ initialData: UiFormData;
50
+ /** Modalita sola lettura globale. */
51
+ readonly: boolean;
52
+ /** Stato disabilitato globale. */
53
+ disabled: boolean;
54
+ /** Override dei pulsanti di default. */
55
+ buttonsOverride?: UiButtonDescriptor[];
56
+ /** Chiave del pulsante in stato di caricamento. */
57
+ loadingFor: string | null;
58
+ valueChange: EventEmitter<UiFormData>;
59
+ validationChange: EventEmitter<UiFormValidationState>;
60
+ formSubmit: EventEmitter<UiFormData>;
61
+ formReset: EventEmitter<void>;
62
+ customEvent: EventEmitter<UiFormCustomEvent>;
63
+ formGroup: FormGroup;
64
+ /** Mappa campo -> opzioni filtrate (per autocomplete e dependent). */
65
+ filteredOptions: Record<string, UiFieldOption[]>;
66
+ /** Campi prevalorizzati (mostrano errori subito). */
67
+ prevalorizedFields: Set<string>;
68
+ /** Mappa campo -> regole di validazione (per lookup rapido). */
69
+ private validationRulesMap;
70
+ /** Mappa dipendenze: campoTarget -> campi dipendenti. */
71
+ private fieldDependencies;
72
+ /** Flag per evitare emissioni durante l'inizializzazione. */
73
+ private isInitializing;
74
+ get allFields(): UiFormFieldDescriptor[];
75
+ get formErrors(): UiFormErrorDetail[];
76
+ get formButtons(): UiButtonDescriptor[];
77
+ ngOnInit(): void;
78
+ /**
79
+ * Rileva cambiamenti sugli @Input.
80
+ * Ricostruisce il form quando cambia lo schema (id diverso).
81
+ * Cruciale per il wizard che cambia schema ad ogni step.
82
+ */
83
+ ngOnChanges(changes: SimpleChanges): void;
84
+ ngAfterViewInit(): void;
85
+ ngOnDestroy(): void;
86
+ /**
87
+ * Inizializza il form dallo schema corrente.
88
+ * Estratto per poter essere richiamato sia da ngOnInit che da ngOnChanges.
89
+ */
90
+ private initFormFromSchema;
91
+ /**
92
+ * Pulisce lo stato del form prima di un rebuild.
93
+ */
94
+ private destroyForm;
95
+ private buildForm;
96
+ private applyAllValidators;
97
+ private evaluateAllConditions;
98
+ private buildDependencyMap;
99
+ private updateDependentOptions;
100
+ /** Verifica se un campo e visibile. */
101
+ isFieldVisible(fieldKey: string): boolean;
102
+ /** Verifica se un campo e obbligatorio (include validazione condizionale). */
103
+ isFieldRequired(fieldKey: string): boolean;
104
+ /** Verifica se una sezione e visibile. */
105
+ isSectionVisible(sectionId: string): boolean;
106
+ /** Verifica se mostrare errori per un campo. */
107
+ shouldShowFieldErrors(fieldKey: string): boolean;
108
+ /** Errori di un campo come array di messaggi. */
109
+ getFieldErrors(fieldKey: string): string[];
110
+ /** Valore completo del form (include campi disabilitati). */
111
+ getFormValue(): UiFormData;
112
+ /** Il form e valido. */
113
+ isFormValid(): boolean;
114
+ /** Stato di validazione completo. */
115
+ getValidationState(): UiFormValidationState;
116
+ /** Errori dettagliati per l'error summary. */
117
+ getDetailedFormErrors(): UiFormErrorDetail[];
118
+ /** Conta errori totali. */
119
+ getFormErrorsCount(): number;
120
+ /** Controlla se ci sono errori. */
121
+ hasFormErrors(): boolean;
122
+ /** Controllo per un campo. */
123
+ getFieldControl(key: string): FormControl | null;
124
+ /** Aggiorna il valore di un campo programmaticamente. */
125
+ updateFieldValue(key: string, value: any): void;
126
+ /** Forza la validazione di tutti i campi. */
127
+ validateAllFields(): void;
128
+ /** Scrolla al campo e lo evidenzia. */
129
+ scrollToField(fieldKey: string): void;
130
+ /** Submit del form. */
131
+ onSubmit(): void;
132
+ /** Reset del form. */
133
+ onReset(): void;
134
+ /** Opzioni per un campo (filtrando per autocomplete query). */
135
+ getFieldOptions(field: UiFormFieldDescriptor): UiFieldOption[];
136
+ /** Filtra opzioni per autocomplete. */
137
+ filterOptions(field: UiFormFieldDescriptor, query: string): void;
138
+ /** Display fn per autocomplete. */
139
+ displayFn(options: UiFieldOption[]): (value: any) => string;
140
+ /** Seleziona tutte le opzioni per multiselect. */
141
+ selectAll(field: UiFormFieldDescriptor): void;
142
+ /** Aggiunge un chip al freemultiselect (da token: Enter o virgola). */
143
+ addFreeChip(field: UiFormFieldDescriptor, event: any): void;
144
+ /** Aggiunge un chip al freemultiselect sull'evento blur dell'input. */
145
+ addFreeChipOnBlur(field: UiFormFieldDescriptor, event: FocusEvent): void;
146
+ /** Rimuove un chip dal freemultiselect. */
147
+ removeFreeChip(field: UiFormFieldDescriptor, chipValue: string): void;
148
+ /** Verifica se un chip e protetto dalla cancellazione. */
149
+ isChipProtected(field: UiFormFieldDescriptor, chipValue: string): boolean;
150
+ /** Rimuove chip da multiselect. */
151
+ removeMultiselectChip(field: UiFormFieldDescriptor, chipValue: any): void;
152
+ /** Trova label di un'opzione dal valore. */
153
+ getOptionLabel(field: UiFormFieldDescriptor, value: any): string;
154
+ /** Tipo di input nativo per il campo. */
155
+ getNativeInputType(field: UiFormFieldDescriptor): string;
156
+ /**
157
+ * Genera le classi CSS per il wrapper di un campo,
158
+ * combinando eventuali cssClasses dallo schema con le classi
159
+ * responsive per il sistema a griglia base-12.
160
+ *
161
+ * Mobile-first: tutti i campi sono span-12 di default (100%).
162
+ * Le classi `ui-col-{breakpoint}-{n}` attivano la larghezza
163
+ * configurata solo dal breakpoint indicato in su.
164
+ *
165
+ * Breakpoint supportati: sm (≥576px), md (≥768px), lg (≥1024px), xl (≥1280px).
166
+ */
167
+ getFieldWrapperClasses(field: UiFormFieldDescriptor): string;
168
+ /** Character count per textarea/text con maxLength. */
169
+ getCharCount(fieldKey: string): {
170
+ current: number;
171
+ max: number;
172
+ } | null;
173
+ private isObservable;
174
+ /**
175
+ * Normalizza la chiave del tipo di validazione dallo schema (camelCase)
176
+ * alla chiave di errore usata da Angular (lowercase).
177
+ * Es: "minLength" -> "minlength", "maxLength" -> "maxlength".
178
+ */
179
+ private normalizeValidationKey;
180
+ private getDefaultErrorMessage;
181
+ static ɵfac: i0.ɵɵFactoryDeclaration<UiFormBuilderComponent, never>;
182
+ static ɵcmp: i0.ɵɵComponentDeclaration<UiFormBuilderComponent, "ui-form-builder", never, { "schema": { "alias": "schema"; "required": false; }; "initialData": { "alias": "initialData"; "required": false; }; "readonly": { "alias": "readonly"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "buttonsOverride": { "alias": "buttonsOverride"; "required": false; }; "loadingFor": { "alias": "loadingFor"; "required": false; }; }, { "valueChange": "valueChange"; "validationChange": "validationChange"; "formSubmit": "formSubmit"; "formReset": "formReset"; "customEvent": "customEvent"; }, never, never, true, never>;
183
+ }